资源描述:
《编译原理实践报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、课程实践报告书编译原理课程实践报告书学员姓名:学号:专业:年级:年月日20课程实践报告书1、课程实践目的本次是实践的目的旨在加强学生对编译过程的整体认识,通过扩充PL语言编译器,加深对词法分析、语法分析和中间代码生成的原理的理解。2、任务概述本次实践的任务包括源程序的分析,扩充repeat、for、case等语言成分。3、实现方法3.1、准备工作:1、在词法库中添加repeat、until、for、to、case等;2、添加repeat、for、case等语句的分析函数;3、修改初始化工作(修改voidINITIAL()函数
2、);4、增加相应常量的定义。3.2、repeat语句的扩充方法:PL语言中的repeat语句语法如下:repeatS1untilE;其中E为布尔表达式。实现函数如下:voidREPEATMENT(SYMLIST*list)//repeat语句的分析{TYPEITEMtypeItem;intjumpback;20课程实践报告书JUMADRTAB[JX]=CX;JX++;jumpback=CX;//纪录repeat循环执行时需要往前返回的地址getASymbol();while(CurSymbol->type!=UNTILSYM
3、){STATEMENT(list);//分析语句if(CurSymbol->type==SEMICOLON)getASymbol();}if(CurSymbol->type==UNTILSYM)getASymbol();/////////////////////////////////////////////////////////////////SYMLIST*tempList=newSYMLIST;COPYLIST(tempList,listAddSym(list,UNTILSYM));EXPRESSION(tempLi
4、st,typeItem);deletetempList;/////////////////////////////////////////////////////////////////if(typeItem.typ!=BOOLS)error(32);20课程实践报告书//if或while或until后面的表达式类型应该是布尔类型GEN(JPC,0,jumpback);}词法分析器识别repeat后,调用REPEATMENT()函数,进行语法分析。REPEATMENT()函数首先翻译repeat语句的循环体S1,识别unti
5、l后翻译条件表达式E。E的false出口为语句S1,true的出口为下一语句。3..3、for语句的扩充方法:PL语言中的for语句语法如下:forQ1toVdoS1其中Q1为赋值语句,V为整型表达式。实现函数如下:voidFORMENT(SYMLIST*list)//for语句的分析{TYPEITEMtypeItem;intjumpback,fillBackFalse;inta_level,a_address;//记录循环变量的层次和地址getASymbol();intx;x=GETPOSITION(CurSymbol->
6、value.lpValue);//查表if(x!=0){a_level=NAMETAB[x].level;20课程实践报告书a_address=NAMETAB[x].unite.address;}STATEMENT(list);//分析语句JUMADRTAB[JX]=CX;JX++;jumpback=CX;//纪录for循环执行时需要往前返回的地址if(CurSymbol->type==TOSYM)getASymbol();elseerror(44);//应该是'to'GEN(LOD,a_level,a_address);/
7、/取a/////////////////////////////////////////////////////////////////SYMLIST*tempList=newSYMLIST;COPYLIST(tempList,listAddSym(list,DOSYM));EXPRESSION(tempList,typeItem);deletetempList;/////////////////////////////////////////////////////////////////if(typeItem.typ!=
8、INTS)error(45);//to后面的表达式类型应该是整型GEN(LE,0,0);//比较a<=b20课程实践报告书fillBackFalse=CX;//条件测试失败后从哪里往循环“外”跳GEN(JPC,0,0);if(CurSymbol->type==DOSYM)getASymbo