语法制导翻译与生成中间代码_第1页
语法制导翻译与生成中间代码_第2页
语法制导翻译与生成中间代码_第3页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、编译系统设计实践实验项目三:语法制导翻译与生成中间代码学号:姓名:年级:学院:数计学院专业: 计算机本组其它成员:学号 姓名学号姓名实验时间:2016 2017学年第一学期任课教师:一、实验目的通过语法制导或翻译模式生成中间代码。二、实验内容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。三、设计思路1. 分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用 相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处 理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递 归过程,不

2、断的递归调用,按序输出三地址语句。在本例程序中选用expr及num作为运算数。2. 主要函数stri ng lin k()stri ng eleme nt()stri ng expressi on()stri ng expressi on _1()stri ng biaodashi()stri ng biaodashi_1()stri ng getOperator()void condition(int L1,int L2)void yuyife nxi_l ist()void yuyife nxi_l ist_1()void yuyifen xi (int n ext,i nt &f

3、lag)void readfile()/字符串和数字的连接获取表达式中的元素对象处理表达式/处理表达式处理表达式,转为三地址输出递归-处理表达式,转为三地址输出/判断并获取运算符输出if语句的条件的三地址代码/生成并输出条件返回地址/递归-生成并输出条件返回地址判断关键字,调用相应的产生式分析/文件读入四、测试报告1.第一组测试:越input -记事本文件邑 蘇旦式空 査看竺 稻助里)if ( expr > num ) expr 二 expr + eiprelse expr -* expr + expr ;图1-1输入待翻译代码IB ;£ :有天学习售译宜分祈.ecu语义分析如

4、T =10i':L1 -expi*1U1:t2 =tl1UK:x3 =num102:t4 =t3Ih4:“=t2 > t4luE:If灶ue tO goto L龙luu:i£ faIse lO 吕dtu L3L2:1U?:t5 =exprluu:t6 二exprIII®:±7 =110:七2二tR 亠 t7111:expr=teL3:112:tiu =1 expr115:t9 二enpr * tlO114:±11 =L expr*115:12 二:til116:tl3 =x9 + t12117;expr=113|P丁cuprs Rxi -|

5、-.ed af + er 0. 3122 secnruds wi t h re t.inrn v11 ip 门 请按任琶撻维绩*图1-2中间代码生成2.第二组测试:J input -文1牛CB扁辑CE楷式苣看凹誓劝ca expr = expr 十 expr ;expr = expr * expr 十 expr ,图2-1输入待翻译代码和E:有关学刁停執吾义分靳心亡语对析如F:100: to 二eicpr101: tl 二expr102; t2 -tl103:=to +t2104: expr=t3105: t5 -expr106: 14 二expr+访107: t6 =eicpr103: t7

6、二t6109: t8 =14 +t7110: expr=t3Process exited 请按任意键继续.after 0- 6506 seconds wi th return value 0图2-2中间代码生成3. 第三组测试:错误待翻译代码input -记事本划车迥歸CD 檢式9】童看也曙助QDexpr = expr + | ,cipr = erpr 水 expr + expr ;图3-1输入待翻译代码 E;谪关学习菊睾储义分析小亡監分析如下:tO - exprerror101:tl =102:t2 = tl13 = 10 + t2104:105:X> - expr106:tQ - e

7、xpr * tF107:t6 - expr10S;t7 二 t&1Q9:t3 = t4 + i7110:espr = 1.3Process edited after 0. 735 seconds vfith ret'jrn value 0洋姑.曰* J仕愿遥區壬屋坯图3-2中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够 精确有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一 个简易

8、编译器的实现已经有了一个整体的构架了, 相信在通过自己以后的深入学 习,一定能写出属于自己的编译器。六、附录代码#in elude <iostream>#i nclude <algorithm>#in clude<c oni o.h> using n amespace std;int address=100;每条分析语句的地址int LID=0;/表示过程执行到相应位置的地址符号int tID=0;/用于替换表达式的标识符int ip=0;string shuru666;/存放从文件读入的字符串int maxsize;stri ng biaodashi();

9、/设置存放数组的长度/* 字符串和数字的连接 */string link(string a,int b)stri ng t=""dot+=b%1O+'O: b/=10;while(b);reverse(t.begi n( ),t.e nd();return a+t;/*获取表达式中的元素对象*/stri ng eleme nt()if(shuruip="expr"|shuruip=" num") ip+;retur n shuruip-1;else if(shuruip="(")ip+;stri ng re

10、sult=biaodashi(); if(shuruip=")")ip+;else puts("Lack)");return result;else puts("error");return ""/*处理表达式*/string expression_1(string &op) if(shuruip="*"|shuruip="/")op=shuruip;ip+;stri ng arg1=eleme nt();string op_ 1= "",resu

11、lt=link("t",tlD+);stri ng arg2=expressi on _1(op_1);if(op_ 仁="")0卩_ 仁"="if(arg2="") cout<<address+<<":"<<" "<<result<<" = "<<arg1<<e ndl;else cout<<address+<<":"<&

12、lt;" "<<result<<" = "<<arg1<<" "<<op_1<<" "<<arg2<<e ndl;return result;return ""/*处理表达式*/stri ng expressi on()stri ng op="",result=li nk("t",tID+);stri ng arg1=eleme nt();stri ng arg

13、2=expressi on _1(op);if(op="")op="="if(arg2="")cout<<address+<<":"<<" "<<result<<" = "<<arg1<<e ndl;elsecout<<address+<<":"<<" "<<result<<" = &

14、quot;<<arg1<<" "<<op<<" "<<arg2<<e ndl;return result;/*递归-处理表达式,转为三地址输出*/string biaodashi_1(string &op)stri ng result=""if(shuruip="+"|shuruip="-")op=shuruip;ip+;stri ng arg仁expressi on();stri ng op_1="&qu

15、ot;stri ng arg2=biaodashi_1(op_1);result=li nk("t",tlD+);if(op_ 仁="")op_仁"="if(arg2="")cout<<address+<<":"<<" "<<result<<" = "<<arg1<<e ndl;else cout<<address+<<":"&l

16、t;<" "<<result<<" ="<<arg1<<""<<op_1<<""<<arg2<<e ndl;return result;/*处理表达式,转为三地址输出*/stri ng biaodashi()stri ng arg1="",op=""if(shuruip="+"|shuruip="-")arg 1= shuruip;ip

17、+;arg1+=expressi on();stri ng arg2=biaodashi_1(op);stri ng result=li nk("t",tlD+);if(op="")op="="if(arg2="")cout<<address+<<":"<<" "<<result<<" = "<<arg1<<e ndl;elsecout<<address+<

18、;<":"<<" "<<result<<" = "<<arg1<<" "<<op<<" "<<arg2<<e ndl;return result;/*判断并获取运算符 *stri ng getOperator()if(shuruip="="|shuruip="<>"|shuruip="<"|shuruip=

19、">"|shuruip="<="|shuruip=">=")ip+;retur n shuruip-1; elseputs("error");return ""/*输出if语句的条件的三地址代码*/void condition(int L1,int L2)L1,L2分别为if条件为true和false时候的跳转地址string result=link("t",tlD+);stri ng arg仁biaodashi();/获得表达式的运算符的左边内容stri

20、ng op=getOperator();/获得表达式的运算符stri ng arg2=biaodashi();/获得表达式的运算符的右边内容if(arg2="")cout<<" "<<result<<" = "<<arg1<<e ndl;elsecout<<address+<<":"<<" "<<result<<" = "<<arg1<&l

21、t;" "<<op<<" "<<arg2<<e ndl;cout<<address+<<":"<<" if true "<<result<<" goto "<<"L"<<L1<<e ndl;cout<<address+<<":"<<" if false "&l

22、t;<result<<" goto "<<"L"<<L2<<e ndl;/*判断关键字,调用相应的产生式分析*/void yuyifen xi (int n ext,i nt &flag) if(shuruip="expr")ip+;if(shuruip="=")赋值语句转化为四元式ip+;stri ng arg仁biaodashi();stri ng arg2=""if(arg2 = "") cout<&l

23、t;address+<<":"<<" expr = "<<arg1<<e ndl;else puts("error");else if(shuruip="if")/if 的语义子程序ip+;int L仁 LID+;int L2=LID+;if(shuruip="(")ip+;con ditio n(L1,L2);elseputs("Lack(");return;if(shuruip=")") ip+;else

24、 puts("Lack)");return;prin tf("L%d:n",L1);yuyifenxi(n ext,flag);ip+;if(shuruip="else")prin tf("L%d:n" ,L2);ip+;yuyifenxi(n ext,flag);/while的语义子程序else if(shuruip="while")ip+;int L仁 LID+;int L2=LID+;if(shuruip="(")ip+;prin tf("L%d:n" ,L1);con diti on(L2,n ext);elseputs("Lack(");return;if(shuruip="

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论