编译原理实验报告PL0

上传人:宝路 文档编号:22287890 上传时间:2017-11-26 格式:DOC 页数:9 大小:96.64KB
返回 下载 相关 举报
编译原理实验报告PL0_第1页
第1页 / 共9页
编译原理实验报告PL0_第2页
第2页 / 共9页
编译原理实验报告PL0_第3页
第3页 / 共9页
编译原理实验报告PL0_第4页
第4页 / 共9页
编译原理实验报告PL0_第5页
第5页 / 共9页
点击查看更多>>
资源描述

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

1、PL/0 语言编译器分析实验报告学院:计算机学院学号:1112057195姓名:夏建鑫课程名称:编译原理一、实验目的 通过阅读与解析一个实际编译器(PL/0 语言编译器)的源代码, 加深对编译阶段(包括词法分析、语法分析、语义分析、中间代 码生成等)和编译系统软件结构的理解,并达到提高学生学习兴趣的目的。 二、实验要求 (1)要求掌握基本的程序设计技巧(C 语言)和阅读较大规模程序 源代码的能力; (2)理解并掌握编译过程的逻辑阶段及各逻辑阶段的功能; (3)要求能把握整个系统(PL/0 语言编译器)的体系结构,各功能 模块的功能,各模块之间的接口; (4)要求能总结出实现编译过程各逻辑阶段功

2、能采用的具体算法与技术。 三、实验步骤 (1) 根据 PL/0 语言的语法图,理解 PL/0 语言各级语法单位的结构,掌握PL/0 语言合法程序的结构; (2)从总体上分析整个系统的体系结构、各功能模块的功能、各模块之间的调用关系、各模块之间的接口; (3)详细分析各子程序和函数的代码结构、程序流程、采用的主要算法及实现的功能; (4)撰写分析报告,主要内容包括系统结构框图、模块接口、主要算法、各模块程序流程图等。四、报告内容PL/0 语言语法的 BNF 表示-1,对语法描述图的解析 . 变量说明部分 const ,; = var ,; | ; procedure ; | := begin e

3、nd ; | odd +|- |() +|- *|/ =|= if then call while do a|b|.|x|y|z 0|1|2|.|8|9编译程序总体流程图Pl/0 词法分析程序 Getsym识别的单词: (类别,值) 启 动置 初 值调 用 GETSYM取 单 词调 用 BLOCK过 程当 前 单 词是 否 为 源 程 序 结 束 符.? 出 错源 程 序 中是 否 有 错 误 ?调 用 解 释 过 程 INTERPRET解 释 执 行 目 标 程 序 打 印 错 误结 束NYYN保留字:如:BEGIN 、 END、 IF、 THEN 等 运算符: 如:+、-、*、/、:=、#

4、、=、 ident then beginif sym : := const , ;: := =: := if sym = constsym thenbegingetsym; (* 获取下一个 token,正常应为用作常量名的标识符 *)repeat (* 反复进行常量声明 *)constdeclaration; (* 声明以当前 token 为标识符的常量 *)while sym = comma do (* 如果遇到了逗号则反复声明下一常量*)begingetsym; (* 获取下一个 token,这里正好应该是标识符 *)constdeclaration (* 声明以当前 token 为标识

5、符的常量 *)end;if sym = semicolon then (* 如果常量声明结束,应遇到分号 *)getsym (* 获取下一个 token,为下一轮循环做好准备 *)elseerror(5) (*提示 5 号错误 *)until sym : := var , ; if sym=varsym thenbegingetsym;repeatvardeclaration;(*变量说明处理*) while sym=comma dobegingetsym;vardeclarationend;if sym=semicolon thengetsymelse error(5)until symid

6、ent;end;变量说明处理 procedure ardeclaration;beginif sym=ident thenbeginenter(variable);getsymendelse error(4)end(*vardeclaration*);过程定义语句的处理程序: while sym = procsym do (* 循环声明各子过程 *)begingetsym; (* 获取下一个 token,此处正常应为作为过程名的标识符 *) if sym = ident then (* 如果 token 确为标识符 *)beginenter(procedur); (* 把这个过程登录到名字表中

7、 *)getsym (* 获取下一个 token,正常情况应为分号 *)endelseerror(4); (* 否则提示 4 号错误 *)if sym = semicolon then (* 如果当前 token 为分号 *)getsym (* 获取下一个 token,准备进行语法分析的递归调用 *)elseerror(5); (* 否则提示 5 号错误 *)解释执行的流程图interpret三个寄存器赋初值 t:=0;b:=1;p:=0;主程序的 SL,DL,RA 赋初值s1:=0; s2=0; s3=0;i:=codep;p:=p+1;执行指令 iP=0?返回PL/0 源程序的扩充扩充FO

8、R 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

9、tUnion(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),LEV,TX);/表达式GEN(OPR,0,11);/判断运算CX2=CX;GEN(JPC,0,0);/如果栈顶非真跳转GEN(LOD,LEV-T

10、ABLEi.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(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;

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

当前位置:首页 > 办公文档 > 其它办公文档

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