2015广工编译原理课程设计报告.doc

2015广工编译原理课程设计报告.doc

ID:58639684

大小:68.00 KB

页数:10页

时间:2020-10-17

2015广工编译原理课程设计报告.doc_第1页
2015广工编译原理课程设计报告.doc_第2页
2015广工编译原理课程设计报告.doc_第3页
2015广工编译原理课程设计报告.doc_第4页
2015广工编译原理课程设计报告.doc_第5页
资源描述:

《2015广工编译原理课程设计报告.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、课程设计课程名称___编译原理__________题目名称___PL/0编译器的扩充__学生学院___计算机学院_________专业班级_计算机科学与技术13(9)学号学生姓名指导教师___林志毅________________2016年1月2日一、已完成的内容:(1)扩充赋值运算:*=和/=(2)扩充语句(Pascal的FOR语句)FOR<变量>:=<表达式>STEP<表达式>UNTIL<表达式>Do<语句>(3)增加类型:①字符类型;②实数类型。(4)增加注释;多行注释由/*和*/包含,单行注释为//二、实验环境与工具

2、(1)计算机及操作系统:PC机,Windows7(2)程序设计语言:C++(3)使用软件BorlandC++Builder6.0(4)教学型编译程序:PL/0三、具体实现:1.扩充赋值运算:*=和/=(1)语法树表达式*=(/=,-=,+=)变量(2)修改GetSym()方法(写出修改的代码)elseif(CH=='*'){GetCh();if(CH=='='){SYM=TIMESBECOMES;GetCh();}elseSYM=TIMES;}elseif(CH=='/'){GetCh();if(CH=='='){SYM=S

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

4、

5、TABLE[i].KIND==FLOATTYPE){/*ASSIGNMENTTONON-VARIABLE*/GetSym();if(SYM==BECOMES

6、

7、SYM==TIMESBECOMES

8、

9、SYM==SLASHBECOMES

10、

11、SYM==PLUSBECOMES

12、

13、SYM

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

15、LUSBECOMES){GEN(OPR,0,2);}elseif(RELOP==MINUSBECOMES){GEN(OPR,0,3);}GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(1)运行测试(测试的PL0源码扩充单词的测试并贴运行结果截图)PL0源码:PROGRAMEX01;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

16、-=2;WRITE(D);//结果为8END.(1)运行结果:(2)出现的问题及解决开始时在实现/=和*=操作时,*=的实现很顺利,而/=却一直没有得到理想的结果,通过与同学的讨论得知代码中除号指令的解析中,其实为除余操作,于是将%改为/,但是结果还是错误,经过调试发现是两个相除的数在栈中的位置相反了,正确的状态应该是除数位于次栈顶,而被除数位于栈顶。解决:在调用EXPRESSION函数解析/=右边表达式前,先将其左边变量的值放入栈中。1.扩充语句(Pascal的FOR语句)FOR<变量>:=<表达式>STEP<表达式>UN

17、TIL<表达式>Do<语句>(1)语法图(2)修改GetSym()方法(写出修改的代码)此处无修改,FOR、STEP、UNTIL及DO等关键字已放置关键字数组中,通过该数组便可识别。(3)修改STATEMENT()方法(写出修改的代码)caseFORSYM:GetSym();STATEMENT(SymSetUnion(SymSetNew(STEPSYM),FSYS),LEV,TX);//处理for后面的赋值语句CX3=CX;GEN(JMP,0,0);//用于第一次执行for语句时跳过step语句CX1=CX;//记录step

18、后语句的代码位置if(SYM==STEPSYM){GetSym();STATEMENT(SymSetUnion(SymSetNew(UNTILSYM),FSYS),LEV,TX);//处理step后面的表达式}elseError(8);if(SYM==UNTILSYM){CODE[CX3]

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

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

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