编译原理实验报告(pl0语言功能扩充)

上传人:自*** 文档编号:79613739 上传时间:2019-02-17 格式:DOC 页数:13 大小:136KB
返回 下载 相关 举报
编译原理实验报告(pl0语言功能扩充)_第1页
第1页 / 共13页
编译原理实验报告(pl0语言功能扩充)_第2页
第2页 / 共13页
编译原理实验报告(pl0语言功能扩充)_第3页
第3页 / 共13页
编译原理实验报告(pl0语言功能扩充)_第4页
第4页 / 共13页
编译原理实验报告(pl0语言功能扩充)_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《编译原理实验报告(pl0语言功能扩充)》由会员分享,可在线阅读,更多相关《编译原理实验报告(pl0语言功能扩充)(13页珍藏版)》请在金锄头文库上搜索。

1、编译原理课程实验报告题目 PL/0编译程序的C语言扩充专业 化学工程与工艺班级 学号姓名 任课教师 华东理工大学信息学院一实验题目PL/0编译程序的C语言扩充二实验目的在分析理解PL/0编译程序的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。三实验内容在PL/0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT语句、支持带参数的过程和增加注释等,如下所示:(1) 整型一维数组,数组的定义格式为:VAR(:)其中上界和下界可以是整数或者常量标识名。访问数组元素的时候,数组下表是整型的表达式,包括整数、常量或者变量和他们的组合。(2

2、) 扩充条件语句,格式为::=EFTHEN ELSE(3)增加REPEAT语句,格式为::=REPEATUNTL四实验过程(1)PL/0编译程序的C语言源代码输入(2)运行PL/0编译程序的C语言源代码,调试运行PL/0编译程序(3)对PL/0编译程序进行功能扩充(4)PL/0编译程序功能扩充部分的分析与设计(5)对PL/0编译程序进行功能扩充,即编写代码(6)进行PL/0编译程序功能扩充部分的运行调试(7)完成实验报告总结五PL/0编译程序的功能扩充程序说明(1)扩充赋值运算:+=,-=.此功能扩充只需在语句分析里面进行增加如下程序: if(SYM=BECOMES|SYM=PLUSBECOM

3、ES|SYM=MINUSBECOMES) if (SYM=BECOMES) GetSym(); EXPRESSION(FSYS,LEV,TX); else if(SYM=PLUSBECOMES|SYM=MINUSBECOMES) GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); if(SYM=PLUSBECOMES) GetSym(); FACTOR(FSYS,LEV,TX); GEN(OPR,0,2); else if(SYM=MINUSBECOMES) GetSym(); FACTOR(FSYS,LEV,TX); GEN(OPR,0,3); if (i

4、!=0) GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); (2)扩充FOR TO和FOR DOWNTO语句,此功能的关键是如何判断条件是否成立,并如何进行程序跳转.在这里用到了几条指令,和地址回填技术.扩充程序如下: case FORSYM: GetSym(); if(SYM!=IDENT)Error(31); /FOR后面要标识符 i=POSITION(ID,TX);if (i=0) Error(11);else if (TABLEi.KIND!=VARIABLE) /*ASSIGNMENT TO NON-VARIABLE*/ Error(12); /

5、变量 GetSym(); if(SYM!=BECOMES) Error(13); GetSym(); EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM,DOSYM),FSYS),LEV,TX);/表达式 if(SYM=DOWNTOSYM) CX1=CX; GetSym(); GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/保存结果至变量单元 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/重新调入栈顶 EXPRESSION(SymSetAdd(DOSYM,FSYS),

6、LEV,TX);/表达式 GEN(OPR,0,11);/判断运算 CX2=CX; GEN(JPC,0,0);/如果栈顶非真跳转 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);/重新调入栈顶 GEN(LIT,0,1) ;/送1到栈顶 GEN(OPR,0,3); /减运算 if(SYM=DOSYM) GetSym(); STATEMENT(FSYS,LEV,TX); GEN(JMP,0,CX1); CODECX2.A=CX; else if(SYM=TOSYM) CX1=CX;GetSym(); GEN(STO,LEV-TABLEi.vp.LEVEL,TAB

7、LEi.vp.ADR); /保存结果至变量单元 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); /重新调入栈顶 EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);/表达式分析 GEN(OPR,0,13);/判断运算 CX2=CX; GEN(JPC,0,0);/如果栈顶非真跳转 GEN(LOD,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR); GEN(LIT,0,1); GEN(OPR,0,2); if(SYM=DOSYM) GetSym(); STATEMENT(FSYS,LEV,TX); GEN(J

8、MP,0,CX1); CODECX2.A=CX;/回填地址 else Error(35); break;(3) 增加条件语句的ELSE子ELSE语句的语法语义分析程序:case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if (SYM=THENSYM) GetSym(); else Error(16);CX1=CX; GEN(JPC,0,0);STATEMENT(FSYS,LEV,TX); CX2=CX; GEN(JMP,0,CX+1); CODECX1.A=CX; if (SYM=SEMICOLON) GetSym(); if(SYM=ELSESYM) GetSym(); STATEMENT(FSYS,LEV,TX); CODECX2.A=CX; /add the statement of ELSE else STATEMENT(FSYS,LEV,TX);break;(4)修改单词:不等号# 改为 if (CH=) SYM=NEQ; GetCh();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号