logo资料库

赋值语句实验报告.doc

第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
资料共10页,剩余部分请下载后查看
学生学号 0120810680104 实验课成绩 武汉理工大学 学 生 实 验 报 告 书 实验课程名称 编译原理 开 课 学 院 计算机科学与技术学院 指导老师姓名 学 生 姓 名 饶文碧 李杰绪 学生专业班级 软 件 0801 班 2010 — 2011 学年 第 二 学期
实验课程名称: 编译原理 实验项目名称 赋值语句的翻译 实验成绩 实验者 同组者 李杰绪 专业班级 软件 0801 组别 实验日期 2011 年 4 月 第一部分:实验分析与设计(可加页) 一、实验内容描述(问题域描述) 1.问题描述:对于常用高级语言(如 Pascal、C 语言)的赋值语句用所学过 的语法分析方法和语义分析方法进行语法分析、语义分析,并把其翻译成为中间代 码形式。 2.实验内容: 对于常用高级语言(如 Pascal、C 语言)的源程序从左到右进行扫描,把其中 赋值语句用所学过的语法分析方法进行语法分析,采用最有代表性的语义分析方法 将其转换为中间代码形式表示输出。 3.实验要求 (1)选择最有代表性的语法分析方法,如算符优先法(或简单优先法)、递归 下降分析法、LL 分析法和 LR 分析法之一进行语法分析。 (2)选择对各种常见程序语言都通用的语法结构,如赋值语句(尤指表达式) 作为分析对象,并且与所选语法分析方法要比较贴切。 (3)选择最有代表性的语义分析方法,如语法制导翻译方法进行语义翻译工 作。 (4)实习时间为 4~6 小时。 二、实验基本原理与设计(包括实验方案设计,实验手段的确定,试验步骤等,用硬件逻辑者 算法描述)
算法思想: #include #include #include using namespace std; -1 INFEASIBLE #define OVERFLOW #define -2 STACK_INIT_SIZE #define #define STACKINCREMENT char typedef typedef char struct STACK { 100 10 SElemType; ElemType; SElemType SElemType int stacksize; * base; * top; }; int InitStack(STACK &S); char GetTop(STACK &S); int Push (STACK &S,SElemType e);//插入 e 为新的栈顶元素 int Pop (STACK &S,STACK &H,int m);//若栈不空,则删除 S 的栈顶元素 int EmptyStack(STACK &S);//判断栈 S 是否为空 int cmp(char a,char b);//判断运算符 a 的优先级是否高于运 b void cmp(char a,char b,STACK &f,STACK &h);//判断运算符 a 和 b 的优先级 int main() { STACK h1; InitStack(h1);//定义并初始化逆序的逆波兰式栈 h1 STACK h2; InitStack(h2);//定义并初始化正序的逆波兰式栈 h2 STACK fh; InitStack(fh);//定义并初始化符号栈 fh Push(fh,'#');//将#压入符合栈 string z; int a; kind1: cout<<"***************************************"<>z; for(int i=0;i
Push(h1,z[i]);//将当前字符压入逆序的逆波兰式栈 h1 else if(z[i]=='(')//如果当前字符是"(" Push(fh,'(');//将当前字符压入符号栈 fh else if(z[i]==')')//如果当前字符是")" { while(GetTop(fh)!='(')//一直删除符号栈 fh 的栈顶元素只至"(" Pop(fh,h1,1); Pop(fh,fh,3); //并将其压入逆序的逆波兰式栈 h1 //删除符号栈 fh 的栈顶元素,即"(" } else if(z[i]=='#')//如果当前字符是"#" { while(GetTop(fh)!='#')//一直删除符号栈 fh 的栈顶元素只至"#" Pop(fh,h1,1); //并将其压入逆序的逆波兰式栈 h1 } else //否则就判断当前字符和符号栈的栈顶元素的优先级 cmp(z[i],GetTop(fh),fh,h1);//并执行相应的操作 } while(!EmptyStack(h1))//如果逆序的逆波兰式栈 h1 非空就删除其栈顶元素 Pop(h1,h2,1);//并将其压入正序的逆波兰式栈 h2 cout<<"***************************************"<>a; if(a==1) goto kind1; return 1; } int InitStack(STACK&S)//构造空栈 S { S.base=(SElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!S.base) exit (OVERFLOW); S.top=S.base; S.stacksize =STACK_INIT_SIZE ; return 1; } char GetTop(STACK &S)//若栈不空,返回 S 的栈顶元素,否则返回 ERROR; { if(S.top==S.base) return 0; ElemType e=*(S.top-1); return e; }
int Push (STACK &S,SElemType e)//插入 e 为新的栈顶元素 { if(S.top-S.base>=S.stacksize) { S.base =(ElemType *) realloc (S.base , (S.stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!S.base )exit (OVERFLOW); S.top=S.base +S.stacksize; S.stacksize +=STACKINCREMENT; } *S.top++=e; return 1; } int Pop (STACK &S,STACK &H,int m)//若栈不空,则删除 S 的栈顶元素, //并返回 OK,否则返回 ERROR { if(S.top==S.base ) return 0; ElemType e=*--S.top ;//删除栈顶元素并用 e 返回其值 switch(m) { case 1://m==1 时把栈顶元素压入 H 栈 Push(H,e); break; case 2://m==2 时输出栈顶元素 cout<
case '(': case '=': case '#': return 1; break; case '*': case '/': return 0; break; } } while(a=='+'||a=='-')//运算符+和-的优先级高于运算符(,=,# { //但低于等于运算符*,/,+,- switch(b) { case '(': case '=': case '#': return 1; break; case '*': case '/': case '+': case '-': return 0; break; } } while(a=='(')//运算符(的优先级高于运算符=,# { //但低于等于运算符*,/,+,-,( switch(b) { case '=': case '#': return 1; break; case '*': case '/': case '+': case '-': case '(': return 0; break; } }
while(a=='=')//运算符=的优先级高于运算符# { //但低于等于运算符*,/,+,-,(,= switch(b) { case '#': return 1; break; case '*': case '/': case '+': case '-': case '(': case '=': return 0; break; } } while(a=='#')//运算符#的优先级低于所有其他运算符 { //但等于运算符# switch(b) { case '*': case '/': case '+': case '-': case '(': case '=': case '#': return 0; break; } } return 1; } void cmp(char a,char b,STACK &f,STACK &h)//判断运算符 a 和 b 的优先级 { if(cmp(a,b))//如果运算符 a 的优先级高于运算符 b Push(f,a);//就把 a 压入栈 f else//如果运算符 a 的优先级低于等于运算符 b { Pop(f,h,1);//删除栈 f 的栈顶元素并将其压入栈 h cmp(a,GetTop(f),f,h);//继续判断运算符 a 和栈 f 的栈顶元素的优先级 } } 三、主要仪器设备及 装有 VC++6.0 的计算机
第二部分:实验调试与结果分析(可加页) 实验小结、建议及体会 通过此次试验我对赋值语句翻译成逆波兰式有了进一步的认识,加深了我对书本知识的学 习,同时也锻炼了自己的编程能力。
分享到:
收藏