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