编译原理课程设计报告-pl0编译器的扩充

编译原理课程设计报告-pl0编译器的扩充

ID:31686569

大小:83.14 KB

页数:19页

时间:2019-01-17

编译原理课程设计报告-pl0编译器的扩充_第1页
编译原理课程设计报告-pl0编译器的扩充_第2页
编译原理课程设计报告-pl0编译器的扩充_第3页
编译原理课程设计报告-pl0编译器的扩充_第4页
编译原理课程设计报告-pl0编译器的扩充_第5页
资源描述:

《编译原理课程设计报告-pl0编译器的扩充》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、课程设计课程名称一编译原理题目名称_PL/O编译器的扩充_学生学院计算机学院专业班级「计算机科学与技术13(9)学号学生姓名指导教师2016年1月2日1.已完成的内容:1.扩充赋值运算:性和扫2.扩充语句(Pascal的FOR语句)FOR变量〉:*表达式>STEPv表达式>UNTIL<表达式>Dov语句〉3.增加类型:①字符类型;②实数类型。4.增加注释;多行注释由厂和*/包含,单行注释为〃5.实验环境与工具(1)计算机及操作系统:PC机,Windows7(2)程序设计语言:C++(3)使用软件BorlandC++BuiIder6.0(4)教学型编译程序:P

2、L/06.具体实现:1.扩充赋值运算:-和/二1.语法树3227705290830001475105271780003582670143510表达式00表达式1924050112395*=(/=/-=,+=)00*=(/二严,+=)981075121285变量00变量2.修改GetSym()方法(写出修改的代码)elseif(CH='*'){GetChO;if(CH=‘二'){SYM二TIMESBECOMES;GetChO;}elseSYM二TIMES;}elseif(CH二二'/'){GetChO;if(CH=‘='){SYM=SLASHBECOMES;G

3、etCh();}3.修改STATEMENT()方法(写出修改的代码)caseIDENT:i二POSITIONED,TX);if(i=0)Error(11);elseif(TABLE[i].KIND==VARIABLE

4、〔TABLE[i].KIND二二FLOATTYPE){/^ASSIGNMENTTONON-VARIABLE^/GetSymO;if(SYM二二BECOMES

5、

6、SYM二二TIMESBECOMES

7、

8、SYM==SLASHBECOMES

9、SYM=PLUSBECOMES

10、SYM=MINUSBECOMES){RELOP二SYM;if(SYM!二BECO

11、MES){//若为除等于(或其他类似符号)则先把符号左边的变量值放入栈中GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i]・vp.ADR);}GetSymO;}elseError(13);EXPRESSION(FSYS,LEV,TX);if(RELOP==TIMESBECOMES){GEN(OPR,0,4);}elseif(RELOP==SLASHBECOMES){GEN(OPR,0,5);}elseif(RELOP二二PLUSBECOMES){GEN(OPR,0,2);}elseif(RELOP二二MINUSBECOMES){GE

12、N(OPR,0,3);GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);4.运行测试(测试的PLO源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAMEXO1;VARA,B,C,D;BEGINA:=16;A/二2;WRITE(A);//结果为8B:二4;B*二2;WRITE(B);//结果为8C:=6;C+二2;WRITE(C);//结果为8D:二10;D-二2;WRITE(D);//结果为8END.5.运行结果:开始时在实现/二和*二操作时,*二的实现很顺利,而/二却一直没有得到理想的结果,通过与同学的

13、讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。解决:在调用EXPRESSION函数解析/二右边表达式前,先将其左边变量的值放入栈中。7.扩充语句(Pascal的FOR语句)FOR变量〉:二v表达式〉STEPv表达式>UNTIL<表达式>Dov语句〉1.600075704215语法图2.修改GetSym()方法(写出修改的代码)此处无修改,FOR、STEP、UNTTL及DO等关键字已放置关键字数组中,通过该数组便可识别。3.修改S

14、TATEMENT()方法(写出修改的代码)caseFORSYM:GetSym();STATEMENT(SymSetUnion(SymSetNew(STEPSYM),FSYS),LEV,TX);//处理for后面的赋值语句CX3二CX;GEN(JMP,0,0);〃用于第一次执行for语句时跳过step语句CX1二CX;//记录step后语句的代码位置if(SYM==STEPSYM){GetSym();STATEMENT(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX);〃处理step后面的表达式}eIseError(8

15、);if(SYM二二UNTILSYM){CODE[C

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。