logo资料库

编译原理实验文档语法制导翻译实验报告.docx

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
《编译系统设计实践》 实验项目三:语法制导翻译与生成中间代码 学号: 姓名: 年级: 学院:数计学院 专业:计算机 本组其它成员:学号姓名 学号姓名 实验时间:2016-2017 学年第一学期 任课教师:
一、实验目的 通过语法制导或翻译模式生成中间代码。 二、实验内容 在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四 元式输出,若有错误将错误信息输出。 三、设计思路 1. 分析过程 主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的 语义规则(这里只有 if 和 while 和赋值语句),赋值语句调用表达式处理,if 语句调用条件表达式处理,while 也是调用表达式处理,然后是一个递归过程, 不断的递归调用,按序输出三地址语句。在本例程序中选用 expr 及 num 作为运 算数。 2. 主要函数 string link()//字符串和数字的连接 string element() string expression()//处理表达式 string expression_1()//处理表达式 //获取表达式中的元素对象 //处理表达式,转为三地址输出 string biaodashi() string biaodashi_1()//递归---处理表达式,转为三地址输出 string getOperator()//判断并获取运算符 void condition(int L1,int L2) //输出 if 语句的条件的三地址代码 void yuyifenxi_list() //生成并输出条件返回地址 void yuyifenxi_list_1() void yuyifenxi(int next,int &flag) void readfile()//文件读入 //递归---生成并输出条件返回地址 //判断关键字,调用相应的产生式分析 四、测试报告
1. 第一组测试: 图 1-1 输入待翻译代码 图 1-2 中间代码生成 2. 第二组测试: 图 2-1 输入待翻译代码
图 2-2 中间代码生成 3.第三组测试:错误待翻译代码 图 3-1 输入待翻译代码 图 3-2 中间代码生成
五、实验总结 实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地 址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其 以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确 有些差强人意,但毕竟还算有些收获了。另外,通过三次实验下来,对于一个简 易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习, 一定能写出属于自己的编译器。 六、附录代码 #include #include #include using namespace std; int address=100; int LID=0; int tID=0;//用于替换表达式的标识符 int ip=0; string shuru[666]; int maxsize; //设置存放数组的长度 //每条分析语句的地址 //表示过程执行到相应位置的地址符号 //存放从文件读入的字符串 string biaodashi(); /*****字符串和数字的连接*****/ string link(string a,int b) { string t=""; do { t+=b%10+'0'; b/=10; } while(b); reverse(t.begin(),t.end());
return a+t; } /*****获取表达式中的元素对象*****/ string element() { if(shuru[ip]=="expr"||shuru[ip]=="num") { ip++; return shuru[ip-1]; } else if(shuru[ip]=="(") { ip++; string result=biaodashi(); if(shuru[ip]==")")ip++; else puts("Lack)"); return result; } else puts("error"); return ""; } /*****处理表达式*****/ string expression_1(string &op) { if(shuru[ip]=="*"||shuru[ip]=="/") { op=shuru[ip]; ip++; string arg1=element(); string op_1="",result=link("t",tID++); string arg2=expression_1(op_1); if(op_1=="")op_1="="; if(arg2=="") cout<
string arg1=expression(); string op_1=""; string arg2=biaodashi_1(op_1); result=link("t",tID++); if(op_1=="") { op_1="="; } if(arg2=="") { cout<
分享到:
收藏