资源描述:
《编译原理课程设计报告-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