编译原理实验报告(PL

上传人:m**** 文档编号:423336428 上传时间:2023-11-15 格式:DOCX 页数:12 大小:37.02KB
返回 下载 相关 举报
编译原理实验报告(PL_第1页
第1页 / 共12页
编译原理实验报告(PL_第2页
第2页 / 共12页
编译原理实验报告(PL_第3页
第3页 / 共12页
编译原理实验报告(PL_第4页
第4页 / 共12页
编译原理实验报告(PL_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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

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

2、,包括整数、常量或者变量和他们的组合。(2)扩充条件语句,格式为:条件语句:二EF条件THEN语句ELSE语句(3)增加 REPEAT 语句,格式为:复合语句:二REPEAT语句UNTL条件 四实验过程(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) 扩充赋值运算

3、:+=,-=.此功能扩充只需在语句分析里面进行增加如下程序if(SYM=BECOMES|SYM=PLUSBECOMES|SYM=MINUSBECOMES)if (SYM=BECOMES)GetSym();EXPRESSION(FSYS,LEV,TX);elseif(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);elseif(SYM=MINUSBECOMES)GetSy

4、m();FACTOR(FSYS,LEV,TX); GEN(OPR,0,3); if (i!=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);elseif (TABLEi.KIND!=VARIABLE) /*

5、ASSIGNMENT TO NON-VARIABLE*/ Error(12);/变量GetSym();if(SYM!=BECOMES)Error(13);GetSym();EXPRESSION(SymSe tUnion(SymSe tNew(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);/重新调 入栈

6、顶EXPRESSION(SymSe tAdd(DOSYM,FSYS),LEV,TX);/表达式GEN(OPR,0,11);/判断运算CX2=CX;GEN(JPC,O,O);/如果栈顶非真跳转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,

7、LEV-TABLEi.vp.LEVEL,TABLEi.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(F

8、SYS,LEV,TX);GEN(JMP,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.

9、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(); else SYM=LSS;六实验设计思想1设计说明PL/0 语言是 Pascal 语言的一 个子集, 这里分析的 PL/0 的编译程 序包 括了对 PL/0 语言源程序进行分析处理、编译 生成类PCOD

10、E代码,并在虚拟机上解释运行生成的 类 PCODE 代码的功 能。PL/0 语言编译程序采用以语法分析为核心、 一遍扫描的编译方法。词法分析 和代码生成作为独立的子程序供语法分析程序调用。语法 分析的同时,提供了出错 报告和出错恢复的功能。在源程序没有错误编译通过的情况下,调用类PCODE解释 程序 解释 执行 生成 的 类 PCODE 代码 。2各功能模块描述词法 分析 子程 序分 析 :词法分析子程序名为GETSYM,功能是从源程序中读出一个单词符号(TOTAKEN), 把它的信息放入全局变量SYM、ID和NUM中,字符变量放入CH中,语法分析器需 要单词时,直接从这三个变量中获得。Get

11、 ch过程通过反复调用Get ch子过程从源 程序过获取字符,并把它们拼成单词。 GETCH 过程中使用了行缓冲区技术以提高程 序运 行效 率。词法分析器的分析过程:调用 GETSYM 时,它通过 GETCH 过程从源程序中获得 一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词, 查保留字表,如果查到为保留字,则把SYM变量赋成相应的保留字类型值;如果 没 有查到,则 这个单词应是一个用户自定义的标识符(可能是变量名、常量 名或是过 程的名字),把SYM置为IDENT,把这个单词存入ID变量。查保 留字表时使用了二 分法查找以提高效率。如果Get ch获得的字符是数字,

12、则继续用Get ch获取数字, 并把它们拼成一个整数或实数,然后把SYM置为INTEGER或REAL,并把拼成的数 值放入NUM变量。如果识别出其它合法的符号(比女如赋值号、大于号、小于等于 号等),则把SYM则成相应的类型。如果遇到不合法的字符,把SYM置成NUL。语法 分析 子程 序分 析:语法分析子程序采用了自顶向下的递归子程序法,语法分析同时也根据程序的 语义生成相应三元代码,并提供了出错处理的机制。语法分析主要由分程序分析过 程( BLOCK )、 参数变量分析过程( ParaDeclaration )、 参数变量处理过程 ( ParaGetSub )、 数 组 处 理 过 程 (

13、ParaGetSub )、 常 量 定 义 分 析 过 程 ( ConstDeclaration )、 变 量 定 义 分 析 过 程 ( Vardeclaration )、 语 句 分 析 过 程 ( Statement )、表达式处理过程( Expression )、项处理过程( Term )、因子处理过 程 ( Factor ) 和 条 件 处 理 过 程 ( Condition ) 构 成 。 这 些 过 程 在 结 构 上 构 成 一 个 嵌 套的层次结构。除此之外,还有出错报告过程( Error )、代码生成过程( Gen )、测 试单词合法性及出错恢复过程(Test )、登录名字

14、表过程(Enter )、查询名字表函 数 ( Position ) 以 及 列 出 类 PCODE 代 码 过 程 ( Listcode ) 作 过 语 法 分 析 的 辅 助 过 程。由 PL/0 的语法图可知:一个完整的 PL/0 程序是由分程序和句号构成的。因此, 本编译程序在运行的时候,通过主程序中调用分程序处理过程block来分析分程序 部分 (分 程序 分析 过程中 还可能会 递归 调用 block 过程),然后, 判断最后 读入 的 符号是否为句号。如果是句号且分程序分析中未出错,则是一个合法的 PL/0 程序, 可以运行生成的代码,否则就说明源PL/0程序是不合法的,输出出错提

15、示即可。下面按各语法单元分析PL/0编译程序的运行机制。 分程 序处 理过 程:语法分析开始后,首先调用分程序处理过程(Block)处理分程序。过程入口 参数置为:0层、符号表位置 0、出错恢复单词集合为句号、声明符或语句开始符。 进入 Block 过程后,首先把局部数据段分配指针设为3,准备分配 3个单元供运行 期存放静态链 SL、 动态链 DL 和返回地址 RA。 然后用 Tx0 记录下当前符号表位置 并产生一条Jmp指令,准备跳转到主程序的开始位置,由于当前还没有知到主程序 究竟在何处开始,所以Jmp的目标暂时填为0,稍后再改。同时在符号表的当前位 置记录下这个Jmp指令在代码段中的位置。在判断了嵌套层数没有超过

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

当前位置:首页 > 建筑/环境 > 建筑资料

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