资源描述:
《中南大学《编译原理》上机实习课程实验报告》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、编译原理课程实验上机实习中南大学计算机0706班方文一、目的加强学生对编译过程的整体认识,而不是个别阶段的实习。二、实习要求扩充语句部分:for语句、repeat语句、case语句;三、PL语言及其编译程序1.词法分析2.语法分析3.语义分析及中间代码生成4.汇编代码生成四、扩充1.扩充repeat语句Ø扩充文法<循环语句>::=”repeat”<语句>”until”<表达式>Ø扩充函数:详见文件夹AssignmentØ运行示例:示例代码:programpp;varn,p:integer;procedurep2(n:integer);begin
2、repeatbegincallwrite(n);n:=n-1enduntiln=0end;begincallp2(5)end.生成中间代码:0JMP0,15------>无条件跳转1JMP0,2------>无条件跳转2ENTP2,4------>进入过程3LOD2,3------>装入变量值4WRITE0,0------>写指令5LODA2,3------>装入变量地址6LOD2,3------>装入变量值7LIT0,1------>装入常量8SUB0,0------>减9STO0,0------>将栈顶值存入栈顶次值所指单元10LOD2,3
3、------>装入变量值11LIT0,0------>装入常量12EQ0,0------>==13JPC0,3------>栈顶值为0时跳转14RETP0,0------>过程返回15ENTP1,4------>进入过程16OPAC0,0------>打开活动记录17LIT0,5------>装入常量18CALL1,2------>转子19ENDP0,0------>程序结束解释运行结果:YourOutput:5YourOutput:4YourOutput:3YourOutput:2YourOutput:11.扩充for语句Ø扩充文法<循环语句
4、>::=“for”“(”<赋值语句>“;”<表达式>“;”<语句>“)”Ø扩充函数详见文件夹AssignmentØ运行示例示例代码:programpp;varn,p:integer;procedurep1(n:integer;varp:integer);beginfor(p:=1;p<=5;p:=p+1)begincallwrite(p);endend;begincallread(n);callp1(n,p);callread(n);end.生成中间代码:0JMP0,19------>无条件跳转1JMP0,2------>无条件跳转2ENTP2
5、,5------>进入过程3LOD2,4------>装入变量值4LIT0,1------>装入常量5STO0,0------>将栈顶值存入栈顶次值所指单元6ILOD2,4------>间接装入7LIT0,5------>装入常量8LEQ0,0------><=9JPC0,18------>栈顶值为0时跳转10LOD2,4------>装入变量值11ILOD2,4------>间接装入12LIT0,1------>装入常量13ADD0,0------>加14STO0,0------>将栈顶值存入栈顶次值所指单元15ILOD2,4------>间
6、接装入16WRITE0,0------>写指令17JMP0,6------>无条件跳转18RETP0,0------>过程返回19ENTP1,5------>进入过程20LODA1,3------>装入变量地址21READ0,0------>读指令22OPAC0,0------>打开活动记录23LOD1,3------>装入变量值24LODA1,4------>装入变量地址25CALL1,2------>转子26LODA1,3------>装入变量地址27READ0,0------>读指令28ENDP0,0------>程序结束解释运行结果:2
7、9翻译开始YourOutput:2YourOutput:3YourOutput:4YourOutput:5YourOutput:6翻译结束。1.扩充case语句Ø文法扩充<判断语句>::=“case”<表达式>“of”<表达式>“:”<语句>“;”{<表达式>”:”<语句>”;”}“end”caseEofC1:;C2:;C3:S3;......Cn:SnendØ代码结构T:=E;L1:ifT!=C1gotoL2S1的代码gotonextL2:ifE!=C2gotoL3S2的代码gotonext......Ln:Sn的代码next:Ø运行示例示例
8、代码:programpp;varn,p:integer;procedurep1(n:integer;varp:integer);begincallre