电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

编译原理实验报告(PL

12页
  • 卖家[上传人]:枫**
  • 文档编号:495709578
  • 上传时间:2023-12-30
  • 文档格式:DOCX
  • 文档大小:37.69KB
  • / 12 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、编译原理课程实验报告题目PL/0编译程序的C语言扩充 专业化学工程与工艺班级学号姓名 任课教师华东理工大学信息学院.实验题目PL/0 编译程序的 C 语言扩充二实验目的在分析理解 PL/0 编译程序的基础上,对其词法分析程序、语法分析程序和语义处理程序进行 部分修改扩充。三实验内容在 PL/0 语言的基础上增加对整型一维数组的支持、扩充 IF-THEN-ELSE 条件语句、增加 REPEAT 语句、支持带参数的过程和增加注释等,如下所示:(1) 整型一维数组,数组的定义格式为:VAR数组标识名(下界 : 上界) 其中上界和下界可以是整数或者常量标识名。 访问数组元素的时候,数组下表是整型的表达式,包括整数、常量或者变量和他们的组合。(2) 扩充条件语句,格式为:条件语句:二EF条件THEN语句ELSE语句(3) 增加 REPEAT 语句,格式为:复合语句:二REPEAT语句UNTL条件 四实验过程(1) PL/0编译程序的C语言源代码输入(2) 运行PL/0编译程序的C语言源代码,调试运行PL/0编译程序 ( 3)对 PL/0 编译程序进行功能扩充(4) PL/0 编译程序功能扩充部分

      2、的分析与设计( 5)对 PL/0 编译程序进行功能扩充,即编写代码(6)进行 PL/0 编译程序功能扩充部分的运行调试( 7 )完成实验报告总结 五.PL/0编译程序的功能扩充程序说明(1)扩充赋值运算:+=,-=.此功能扩充只需在语句分析里面进行增加如下程序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)GetSym();FACTOR(FSYS,LEV,TX); GEN(OPR,0,3); if (i!=0)GEN(STO,LEV-TABLEi.vp.LEVEL,TABLEi.vp.ADR);(2)扩充FOR

      3、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) /*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);/重新调 入栈顶

      4、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,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

      5、(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(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.A=CX;if (SYM=SEMICOLON) GetSym();if(SYM=ELSESYM)GetSym();STATEMENT(FSYS,LEV,TX);CODECX2.A=CX; /add th

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

      7、中获得。 Getch 过程通过反复调用 Getch 子过程从源 程序过获取字符,并把它们拼成单词。 GETCH 过程中使用了行缓冲区技术以提高程 序运 行效 率。词法 分析 器的 分析过 程: 调用 GETSYM 时,它 通过 GETCH 过程从源 程序中获 得 一个字符。如果这个字符是字母,则继续获取字符或数字,最终可以拼成一个单词, 查保留字表,如果查到为保留字,则把 SYM 变量赋成相应的保留字类型值;如果 没 有查到,则这个单词应是一个用户自定义的标识符(可能是变量名、常量 名或是过 程的名字),把SYM置为IDENT,把这个单词存入ID变量。查保 留字表时使用了二 分法查找以提高效率。如果 Getch 获得的字符是数字, 则继续用 Getch 获取数字, 并把它们拼成一个整数或实数,然后把SYM置为INTEGER或REAL,并把拼成的数 值放入 NUM 变量。如果识别出其它合法的符号(比 如:赋值 号、大于号、小于等于 号等),则把 SYM 则成相应的类型。如果遇到不合法的字符, 把 SYM 置成 NUL。语法 分析 子程 序分 析 :语法分析子程序采用了自顶向下的递归子程序

      8、法,语法分析同时也根据程序的 语义生成相应三元代码,并提供了出错处理的机制。语法 分析主要由分程序分析过 程 ( BLOCK )、 参 数 变 量 分 析 过 程 ( ParaDeclaration )、 参 数 变 量 处 理 过 程 ( ParaGetSub )、 数 组 处 理 过 程 ( ParaGetSub )、 常 量 定 义 分 析 过 程 ( ConstDeclaration )、 变 量 定 义 分 析 过 程 ( Vardeclaration )、 语 句 分 析 过 程 ( Statement )、表达式处理过程( Expression )、项处理过程( Term )、因子处理过 程 ( Factor ) 和 条 件 处 理 过 程 ( Condition ) 构 成 。 这 些 过 程 在 结 构 上 构 成 一 个 嵌 套的层次结构。除此之外,还有出错报告过程( Error )、代码生成过程( Gen )、测 试单词合法性及出错恢复过程(Test )、登录名字表过程(Enter )、查询名字表函 数 ( Position ) 以 及 列 出 类 PCODE 代

      9、 码 过 程 ( Listcode ) 作 过 语 法 分 析 的 辅 助 过 程。由 PL/0 的语法图可知:一个完整的 PL/0 程序是由分程序和句号构成的。因此, 本编译程序在运行的时候,通过主程序中调用分程序处理过程 block 来分析分程序 部分 (分程序 分析 过程中 还可能会 递归 调用 block 过程),然后, 判断最后 读入 的 符号是否为句号。如果是句号且分程序分析中未出 错,则是一个合法的 PL/0 程序, 可以运行生成的代码,否则就说明源 PL/0 程序是不合法的,输出出错提示即可。下面按各语法单元分析 PL/0 编译程序的运行机制。 分程序处理过程:语法分析开始后,首先调用分程序处理过程(Block)处理分程序。过程入口 参数置为:0层、符号表位置 0、出错恢复单词集合为句号、声明符或语句开始符。 进入 Block 过程后,首先 把局部数据段分配指针设为 3,准备分配 3个单元供运行 期存放静态链 SL、 动态链 DL 和返回地址 RA。 然后用 Tx0 记录下当前符号表位置 并产生一条 Jmp 指令,准备跳转到主程序的开始位置,由于当前还没有知到主程序 究竟在何处开始,所以 Jmp 的目标暂时填为

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

      点击阅读更多内容
    最新标签
    监控施工 信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.