资源描述:
《编译原理实验报告6逆波兰式的翻译和计算》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验6逆波兰式的翻译和计算一、实验目的通过实验加深对语法指导翻译原理的理解,掌握算符优先分析的方法,将语法分析所识别的表达式变换成中间代码的翻译方法。二、实验内容设计一个表示能把普通表达式(屮缀式)翻译成后缀式,并计算出结果的程序。三、实验要求1、给出文法如下:G[E]E->T
2、E+T;T->F
3、T*F;F・>i(E);对应的转化为逆波兰式的语义动作如下:E->E(1)opE⑵{E.CODE:二E⑴.CODE
4、
5、E⑵.CODE]
6、op}E-〉(E⑴){E.CODE:=E⑴.CODE}E->id{E.CODE:=id}2、利用实验5屮的算符优先分析算法,结
7、合上面给出的语义动作实现逆波兰式的构造;3、利用栈,计算生成的逆波兰式,步骤如下:1)中缀表达式,从文本文件读入,每一•行存放一个表达式,为了降低难度,表达式采用常数表达式;2)利用结合语法制导翻译的算符优先分析,构造逆波兰式;3)利用栈计算出后缀式的结果,并输出;U!实验环境PC微机DOS操作系统或Windows操作系统TurboC程序集成环境或VisualC++程序集成环境五、实验步骤1、了解语法制导翻译的方法,学习后缀式构造的语义动作;2、结合实验5的算符优先程序,设计程序构造后缀式;3、利用栈,编程实现后缀式的计算;4、测试程序运行效果:从文本文
8、件中读表达式,在屏幕上输出,检查输出结果。六、测试数据输入数据:编辑一个文本文文件expression.txt,在文件屮输入如卜•内容:1+2;(1+2)*3;(10+20)*30+(50+60*70);正确结果:(1)1+2;输出:1,2,+3(2)(1+2)*3;输出:1,2,+,3,*9(3)(10+20)*30+(50+60*70)输出:10,20,+30,*50,60,70,*,+,+5150七、实验报告要求实验报告应包括以下儿个部分:1、构造逆波兰式的语义动作;2、结合算符优先分析构造逆波兰式的算法和过程;3、语法制导翻译的运行方法;4、程序
9、的测试结果和问题;5、实验总结。八、实验内容源代码:#include#include#inc1udcusingnamespacestd;#definemax100charexfmax];intn;charGetBC(FILE*fp){//读取文件的字符直至ch不是空口charch;do{ch=fgetc(fp);}while(ch=1*
10、
11、ch='f
12、
13、ch=='');returnch;voidacquirc(FILE*fp){charstrfmax];charstack[max];charch
14、;intsum,ij,t,top=0;i=0;/*读取一行表达式*/GctBC(fp);if(feof(fp))return;else{fseek(tp,-IL,1);printf(n(%d)n,n);n++;}do{i++;str[i]=GctBC(fp);}while(str[i]!=&&i!=max);sum=i;t=1;i=l;ch=str[i];while(ch!=;){switch(ch){casef:top++;stac町top]=ch;break;casey:while(stack[top]!='(*){ex[t]=stack[top
15、];top-;t++;}top-;break;casecasewhile(top!=0&&stackftop]!='('){ex[t]=stack[top];top-;t++;}top++;stack[top]=ch;break;casecase7f:while(stack[top]=嗦
16、
17、stack[top]=7'){ex[t]=stack[top];top-;t++;top++;stac町top]=ch;break;case°f:break;default:while(ch>=O&&chv=9){cx[t]=ch;t++;/*ex[]中存放逆波兰式*
18、/ch=str[i];i++;中存放小缀表达式*/ex[t]=7;t++;break;}ch=str[i];汁+;/*当中缀表达式扫描完毕,检查(0栈是否为空,若不空则一一退栈*/while(top!=0){ex[t]=stack[top];t++;top-;}cx[t]=V;for0=l;j19、;ch=ex[t];t++;while(ch!=';){switch(ch){c