语法制导翻译和生成中间代码附代码Word文档格式.docx
- 文档编号:14749085
- 上传时间:2022-10-24
- 格式:DOCX
- 页数:13
- 大小:90.30KB
语法制导翻译和生成中间代码附代码Word文档格式.docx
《语法制导翻译和生成中间代码附代码Word文档格式.docx》由会员分享,可在线阅读,更多相关《语法制导翻译和生成中间代码附代码Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
一、实验目的通过语法制导或翻译模式生成中间代码。
二、实验容在自底向上语法分析基础上设计语义规则(语法制导翻译),将源程序翻译为四元式输出,若有错误将错误信息输出。
三、设计思路1.分析过程主函数,读取文件,存入字符串数组,调用语义分析,判断关键字,调用相应的语义规则(这里只有if和while和赋值语句),赋值语句调用表达式处理,if语句调用条件表达式处理,while也是调用表达式处理,然后是一个递归过程,不断的递归调用,按序输出三地址语句。
在本例程序中选用expr及num作为运算数。
2.主要函数stringlink()/字符串和数字的连接stringelement()/获取表达式中的元素对象stringexpression()/处理表达式stringexpression_1()/处理表达式stringbiaodashi()/处理表达式,转为三地址输出stringbiaodashi_1()/递归-处理表达式,转为三地址输出stringgetOperator()/判断并获取运算符voidcondition(intL1,intL2)/输出if语句的条件的三地址代码voidyuyifenxi_list()/生成并输出条件返回地址voidyuyifenxi_list_1()/递归-生成并输出条件返回地址voidyuyifenxi(intnext,int&
flag)/判断关键字,调用相应的产生式分析voidreadfile()/文件读入四、测试报告1.第一组测试:
图1-1输入待翻译代码图1-2中间代码生成2.第二组测试:
图2-1输入待翻译代码图2-2中间代码生成3.第三组测试:
错误待翻译代码图3-1输入待翻译代码图3-2中间代码生成五、实验总结实验三的重点在于判断关键字,调用相应的产生式分析及处理表达式,转为三地址输出部分,也是很费时间的难点部分,但通过查阅书本及网上资料,还是将其以多个处理函数的递归调用实现了,虽然最后实现结果对错误的分析还不够精确有些差强人意,但毕竟还算有些收获了。
另外,通过三次实验下来,对于一个简易编译器的实现已经有了一个整体的构架了,相信在通过自己以后的深入学习,一定能写出属于自己的编译器。
六、附录代码#include#include#includeusingnamespacestd;
intaddress=100;
/每条分析语句的地址intLID=0;
/表示过程执行到相应位置的地址符号inttID=0;
/用于替换表达式的标识符intip=0;
stringshuru666;
/存放从文件读入的字符串intmaxsize;
/设置存放数组的长度stringbiaodashi();
/*字符串和数字的连接*/stringlink(stringa,intb)stringt=;
dot+=b%10+0;
b/=10;
while(b);
reverse(t.begin(),t.end();
returna+t;
/*获取表达式中的元素对象*/stringelement()if(shuruip=expr|shuruip=num)ip+;
returnshuruip-1;
elseif(shuruip=()ip+;
stringresult=biaodashi();
if(shuruip=)ip+;
elseputs(Lack);
returnresult;
elseputs(error);
return;
/*处理表达式*/stringexpression_1(string&
op)if(shuruip=*|shuruip=/)op=shuruip;
ip+;
stringarg1=element();
stringop_1=,result=link(t,tID+);
stringarg2=expression_1(op_1);
if(op_1=)op_1=;
if(arg2=)coutaddress+:
result=arg1endl;
elsecoutaddress+:
result=arg1op_1arg2endl;
/*处理表达式*/stringexpression()stringop=,result=link(t,tID+);
stringarg2=expression_1(op);
if(op=)op=;
result=arg1oparg2endl;
/*递归-处理表达式,转为三地址输出*/stringbiaodashi_1(string&
op)stringresult=;
if(shuruip=+|shuruip=-)op=shuruip;
stringarg1=expression();
stringop_1=;
stringarg2=biaodashi_1(op_1);
result=link(t,tID+);
/*处理表达式,转为三地址输出*/stringbiaodashi()stringarg1=,op=;
if(shuruip=+|shuruip=-)arg1=shuruip;
arg1+=expression();
stringarg2=biaodashi_1(op);
stringresult=link(t,tID+);
/*判断并获取运算符*/stringgetOperator()if(shuruip=|shuruip=|shuruip=|shuruip=)ip+;
/*输出if语句的条件的三地址代码*/voidcondition(intL1,intL2)/L1,L2分别为if条件为true和false时候的跳转地址stringresult=link(t,tID+);
stringarg1=biaodashi();
/获得表达式的运算符的左边容stringop=getOperator();
/获得表达式的运算符stringarg2=biaodashi();
/获得表达式的运算符的右边容if(arg2=)coutresult=arg1endl;
coutaddress+:
iftrueresultgotoLL1endl;
iffalseresultgotoLL2endl;
/*判断关键字,调用相应的产生式分析*/voidyuyifenxi(intnext,int&
flag)if(shuruip=expr)ip+;
if(shuruip=)/赋值语句转化为四元式ip+;
stringarg2=;
expr=arg1shurumaxsize)maxsize+;
/*主函数*/intmain()freopen(input.txt,r,stdin);
cout语义分析如下:
endl;
readfile();
Modular();
return0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法 制导 翻译 生成 中间 代码