资源描述:
《编译方法实验报告(中间代码生成器)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译方法实验报告姓名学号班级指导教师实验名称中间代码生成器的设计开设学期实验时间第周评定成绩评定人签字评定日期2011年10月一、实验目的熟悉算术表达式的语法分析与中间代码生成原理。二、实验内容(1)设计语法制导翻译生成表达式的四元式的算法;(2)编写代码并上机调试运行通过。输入——算术表达式;输出——语法分析结果;相应的四元式序列。(3)设计LL(1)分析法或LR(0)分析法的属性翻译文法,并根据这些属性翻译文法,使用扩展的语法分析器实现语法制导翻译。三、实验原理及基本步骤●算术表达式文法:G(E):EàEω0T
2、TTàTω1F
3、FFài
4、(E)●文法变换:G’(E)EàT{ω0T}TàF
5、{ω1F}Fài
6、(E)●属性翻译文法:EàT{ω0“push(SYN,w)”T“QUAT”}TàF{ω1“push(SYN,w)”F“QUAT”}Fài“push(SEM,entry(w))”
7、(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
8、—算符栈;SEM—语义栈;一、数据结构设计使用递归的结构进行四元式的设计,同时,运用堆栈结构将四元式的输出序列打印出来while(exp[i]=='+'
9、
10、exp[i]=='-'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)T();quat();}while(exp[i]=='*'
11、
12、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],S
13、EM[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++;}一、关键代码分析(带注释)及运行结果#include#include"string.h"#include"stdio.h"usingnamespacestd;charsyn[10];//文法符号
14、栈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]==' ')for(i=0;i15、输出四元式序列printf("%s",qt[i]);elseprintf("err");return0;}intE(){T();while(exp[i]=='+'
16、
17、exp[i]=='-'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)T();quat();}return1;}intT(){F();while(exp[i]=='*'
18、
19、exp[i]=='/'){syn[++i_syn]=exp[i];//push(SYN,w)i++;//read(w)F();quat();}return1;}intF(){if(exp[i]=='('){i
20、++;//read(w)E();if(exp[i]!=')'){printf("err");return0;}}elseif((exp[i]>='a'&&exp[i]<='p')
21、
22、(exp[i]>='0'&&exp[i]<='9')){sem[++i_sem]=exp[i];}//push(SEM,w)else{printf("err");return0;}i++;//read(w)return1;}voi