资源描述:
《编译原理课程设计报告pl0语言编译程序扩展》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、1.设计任务1•给PL/O语言增加带else子句的条件语句和exit语句。exit语句作为while语句的非正常出口语句。若处于多层while语句中,则它只作为最内层while语句的非正常出口。若它没有处于任何while语句中,则是一个错误。(实现)2•给PL/O语言增加实数类型。(思路,代码上暂未实现)2.设计思想和实现方法PL/O语言以赋值语句为基础,有顺序、条件和循环三种结构。PL/O有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。PL/O中唯一的数据类型是整型,可以用来说明该类型的常量和变量。同时,PL/O也具
2、有算术运算和关系运算。增加else语句功能:PL/O语言只有if・(hen结构,这里我们要增加if-then-else形式的语言结构。在对PL/O语言进行分析时,每当遇到if-then结构,就继续进行下一步判断,识別then语句结束后是否还有else语句,最后根据if条件的结果来处理程序的执行路径。故在then语句后加入相应代码进行相关判断。具体实现为在then语句判断结束吋暂吋不进行跳转,然后通过关键字识别,若有else存在则转入else的处理函数进行处理,若不存在则正常跳转结束。增加exit语句功能:在这里我们要实现exit语句
3、的出口功能。每当我们遇到exit时,由需求可知首先判断exit是否处于while循环中,也就是是否合法的问题。而题目屮要求还能实现多层循环中仅执行最里层出口操作,我采用设置一个计数器的方式实现,每当进入一个while循环中的时候计数器加1,每退出一个while循环时计数器减1,这样通过检测计数器是否为0就能判断exit语句的合法与否,且多层循环也能实现在最里层跳出而不影响外层循环。增加实数类型(思路):首先增加一个枚举类型如type,然后设置两种枚举元素如realNo和integerN0来表示实数和整数类型。这里实数主要用来实现的是
4、小数的加入,因为整数原本PL0语言就已经能够识别。然后在符号表中增加一个枚举类型type的成员,增加之后再加入相应的符号类似于realsym用來处理那个识别出來带小数的数字类型,同时扩大norw的宏定义至合理值。然后再main函数初始化中加入相应的保留字和保留字符号,按二分查找的规则进行添加,以方便查找。最后在词法分析的时候,如果读入字符是一个数字的话,我们先假设是整数类型,继续读取下一个字符,假如遇到'•',那么就设置为实数类型,并再次读入字符添加到原来的字符串后边,所后进行相应的判断处理另外在语句处理中,当我们遇到realNo类
5、型要转换为integerNo的时候,做出错误处理,integerNo转换为realNo的时候我们默认做出转换不改变原先值,只进行小数点添加和精确度扩大。3.程序说明给PL/0增加带else的子条件语句(主要代码)elseif(sym==ifsyiTi)getsym();condition(fsys
6、thensym
7、dosym);if(sym==thensym)〃遇到then语句进入{getsym();//读収下一个字符}else{error(16);}cxl=cx;gen(jpc,O,O);〃记录代码的分段位置,转移地址暂定为0st
8、atement(fsys
9、semicolon
10、endsym
11、elsesym);〃调用处理then语句后边的语句code[cxl].a=cx+l;〃将jpc转移地址改为当前位置+1cx2=cx;gen(jmp,0,0);〃记录代码分段位置if(sym==semicolon)getsym();if(sym==elsesym)〃进入else语句处理{getsym();statement(fsys
12、semicolon
13、endsym);code[cx2].a=cx;〃将jmp的转移位置改变为当前代码的位置Ielsestatement(fsys
14、);}给PL/O增加带exit语句(主要代码)elseif(sym==whilesym){circleNo++;〃设置计数器计算while循环的层数cxl=cx;getsym();condilion(fsys
15、dosym);cx2=cx;gen(jpc,O,O);if(sym==dosym){getsym();}else{error(18);statement(fsys);gen(jmp,O,cxl);code[cx2].a=cx;if(pos_exit!=0){code[pos_exit].a=cx;pos_exit=0;}cir
16、cleNo—;}elseif(sym==exitsym){if(circleNo==0){error(26);)else{pos_exit=cx;gen(jmp,0,0);)getsym();}test(fsys,0,19);1.程序