您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 编译方法实验报告(中间代码生成器的设计)
编译方法实验报告姓名学号班级指导教师实验名称中间代码生成器的设计开设学期实验时间第周评定成绩评定人签字评定日期2011年10月一、实验目的熟悉算术表达式的语法分析与中间代码生成原理。二、实验内容(1)设计语法制导翻译生成表达式的四元式的算法;(2)编写代码并上机调试运行通过。输入——算术表达式;输出——语法分析结果;相应的四元式序列。(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。三、实验原理及基本步骤●算术表达式文法:G(E):EEω0T|TTTω1F|FFi|(E)●文法变换:G’(E)ET{ω0T}TF{ω1F}Fi|(E)●属性翻译文法:ET{ω0“push(SYN,w)”T“QUAT”}TF{ω1“push(SYN,w)”F“QUAT”}Fi“push(SEM,entry(w))”|(E)其中:push(SYN,w)—当前单词w入算符栈SYN;push(SEM,entry(w))—当前w在符号表中的入口值压入语义栈SEM;QUAT—生成四元式函数i.T=newtemp;ii.QT[j]=(SYN[k],SEM[s-1],SEM[s],T);j++;iii.pop(SYN,_);pop(SEM,_);pop(SEM,_);push(SEM,T);●递归下降子程序:数据结构:SYN—算符栈;SEM—语义栈;四、数据结构设计使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来while(exp[i]=='+'||exp[i]=='-'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)T();quat();}while(exp[i]=='*'||exp[i]=='/'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)F();quat();}voidquat(){strcpy(qt[j],(,,,));//QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--;//pop(SYN);i_sem--;//pop(SEM);i_sem--;//pop(SEM);sem[++i_sem]=temp;//push(SEM,temp);temp++;}五、关键代码分析(带注释)及运行结果#includeiostream#includestring.h#includestdio.husingnamespacestd;charsyn[10];//文法符号栈inti_syn;charsem[10];//运算对象栈inti_sem;charexp[50];//算术表达式区inti;charqt[30][15];//四元式区intj=0;chartemp='q';//临时变量,取值为r--zintE();intT();intF();voidquat();//生成四元式函数intmain(intargc,char*argv[]){printf(pleaseinputyourexpression:);scanf(%s,exp);//输入四元式i=0;//read(w)E();if(exp[i]=='\0')for(i=0;ij;i++)//输出四元式序列printf(%s\n,qt[i]);elseprintf(err);return0;}intE(){T();while(exp[i]=='+'||exp[i]=='-'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)T();quat();}return1;}intT(){F();while(exp[i]=='*'||exp[i]=='/'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)F();quat();}return1;}intF(){if(exp[i]=='('){i++;//read(w)E();if(exp[i]!=')'){printf(err);return0;}}elseif((exp[i]='a'&&exp[i]='p')||(exp[i]='0'&&exp[i]='9')){sem[++i_sem]=exp[i];}//push(SEM,w)else{printf(err);return0;}i++;//read(w)return1;}voidquat(){strcpy(qt[j],(,,,));//QT[j]:=(SYN[k],SEM[s-1],SEM[s],temp);qt[j][1]=syn[i_syn];qt[j][3]=sem[i_sem-1];qt[j][5]=sem[i_sem];qt[j][7]=temp;j++;i_syn--;//pop(SYN);i_sem--;//pop(SEM);i_sem--;//pop(SEM);sem[++i_sem]=temp;//push(SEM,temp);temp++;}六、总结与分析我们知道,定义一种语言除了要求定义语法外,还要求定义语义,即对语言的各种语法单位赋予具体的意义。语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式,即比源语言更加接近于目标语言的一种中间代码来进行描述这种语言。因此,中间代码就显得十分重要,它关系着整个程序语言的正确编译与否,同时也是进行下一步编译的重要先决条件。七、实验思考题(1)自顶向下法(推导法)从开始符号出发,采用推导运算,试图自顶向下构造语法树。自底向上法(归约法)从给定的符号串出发,采用归约运算,试图自底向上构造语法树。(2)递归下降子程序法:递归子程序法属于自顶向下语法分析方法。故又名递归下降法。要求文法是LL(1)文法。LL(1)分析法:LL(1)分析法是指从左到右扫描(第一个L)、最左推导(第二个L)和只查看一个当前符号(括号中的1)之意;LL(1)分析法又称预测分析法,属于自顶向下确定性语法分析方法。要求文法是LL(1)文法。(3)相同点:都要求文法是LL(1)文法;都是自顶向下的分析方法;都通过分析下个字符来判断该进入哪个状态或者调用哪个函数。不同点:LL(1)分析法先建立起预测分析表,通过对分析栈的不断操作(出栈,入栈)来进行;递归下降子程序法是通过函数间的函数调用来实现不同状态间的转换,并简化了代码。(4)语法制导翻译是在语法分析过程中,随着分析(推导或归约)的逐步进展,每识别出一个语法结构,根据文法的每个规则所对应的语义子程序进行翻译的方法;核心技术是构造属性翻译文法。(5)假定:SEM(m)--语义栈(属性传递、赋值场所);QT[q]–四元式区;G``(E):E-T|E+T{GEQ(+)}|E-T{GEQ(-)}T-F|T*F{GEQ(*)}|T/F{GEQ(/)}F-i{PUSH(i)}|(E)其中:⑴PUSH(i)–压栈函数(把当前i压入语义栈);⑵GEQ(w)–表达式四元式生成函数:生成一个四元式送QT[q]过程:①t:=NEWT;{申请临时变量函数;}②SEND(w,SEM[m-1],SEM[m],t)③POP;POP;PUSH(t)
本文标题:编译方法实验报告(中间代码生成器的设计)
链接地址:https://www.777doc.com/doc-3839855 .html