资源描述:
《广工2014编译原理实验报告.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实验报告课程名称编译原理题目名称PL/0编译器的扩充学生学院计算机学院专业班级计算机科学与技术12(4)学号3112005901学生姓名柏石先指导教师李杨程序功能完成情况测试用例全面程度学生对所编程序熟悉程度报告格式是否与要求相符报告内容是否准确、全面2014年12月20日一、实验目的与要求对PL/0作以下修改扩充:(1)增加单词:保留字ELSE,FOR,STEP,UNTIL,DO,RETURN运算符*=,/=,&,
2、
3、,!(2)修改单词:不等号#改为<>(3)增加条件语句的ELSE子句,要求:写出相关文法,语法描述图
4、,语义描述图。二、实验环境与工具1、源语言:PL/0语言,PL/0语言是PASCAL语言的子集,它的编译程序是一个编译解析执行系统,后缀名为.PL0;2、目标语言:生成文件后缀为*.COD的目标代码3、实现平台:BorlandC++Builder64、运行平台:Windows8.1三、结构流程1、结构设计说明(1)PL/0语言编译器PL/0语言可看成是PASCAL语言的子集,它的编译程序是一个编译解释执行系统。PL/0的目标程序为假想栈式计算机的汇编语言,与具体计算机无关。出错处理函数表格管理函数PL/0源程序目标代码
5、生成程序程序目标代码生成程序程序目标代码生成程序程序目标代码生成程序程序目标代码生成程序程序1、词法分析程序的设计一、开发过程(一)增加单词:保留字ELSE,FOR,STEP,UNTIL,DO,RETURN运算符*=,/=,&,
6、
7、,!新增6个保留字和5个运算符,合计11个单词。其中保留字ELSE,FOR,STEP,UNTIL,DO,RETURN分别对应ELSESYM,FORSYM,STEPSYM,UNTILSYM,DOSYM,RETURNSYM;运算符*=,/=,&,
8、
9、,!分别对应TIMESBECOMES,SLAS
10、HBECOMES,ANDSYM,ORSYM,NOTSYM。注:要求只做词法分析部分,不做语义分析处理,实验的结果只是识别新增的保留字和运算符,并且将其打印显示出来。运算符*=/=&
11、
12、!SYM表示TIMESBECOMESSLASHBECOMESANDSYMORSYMNOTSYM1.首先考虑需要增加保留字的个数,以及如何命名,再将新增的保留字添加对应的保留字的集合中。具体实现的语句如下所示:typedefenum{NUL,IDENT,NUMBER,PLUS,MINUS,TIMES,SLASH,ODDSYM,EQL,NEQ
13、,LSS,LEQ,GTR,GEQ,LPAREN,RPAREN,COMMA,SEMICOLON,PERIOD,BECOMES,BEGINSYM,ENDSYM,IFSYM,THENSYM,WHILESYM,WRITESYM,READSYM,DOSYM,CALLSYM,CONSTSYM,VARSYM,PROCSYM,PROGSYM,ELSESYM,FORSYM,STEPSYM,STEPSYM,RETURNSYM,TIMESBECOMES,SLASHBECOMES,ANDSYM,ORSYM,NOTSYM}SYMBOL;1.这里
14、需要注意,一定要参照已有的保留字,进行相应的命名和添加规范。具体实现的语句如下所示:char*SYMOUT[]={"NUL","IDENT","NUMBER","PLUS","MINUS","TIMES","SLASH","ODDSYM","EQL","NEQ","LSS","LEQ","GTR","GEQ","LPAREN","RPAREN","COMMA","SEMICOLON","PERIOD","BECOMES","BEGINSYM","ENDSYM","IFSYM","THENSYM","WHILESYM",
15、"WRITESYM","READSYM","DOSYM","CALLSYM","CONSTSYM","VARSYM","PROCSYM","PROGSYM","ELSESYM","FORSYM","STEPSYM","STEPSYM","RETURNSYM","TIMESBECOMES","SLASHBECOMES","ANDSYM","ORSYM","NOTSYM"};2.将新增的保留字按照字母表升序的方式添加,运算符参照已有的运算符来进行添加,注意好符号与SYM的对应。具体实现的语句如下所示:特别注意点:此处一定要
16、考虑到PLO编译器采用了折半查找算法来进行操作,如果新增的保留字没有按照既定的升序规则来插入,会造成在编译过程中,编译器无法识别某些保留字。strcpy(KWORD[1],"BEGIN");strcpy(KWORD[2],"CALL");strcpy(KWORD[3],"CONST");strcpy(KWORD[4],"DO");