班级: 姓名:
学号: 2024年 12 月 17 日。
目录。一. pl语言及其编译器 2
1. pl语言介绍 2
参考流程图 2
1) 编译程序的结构图 2
2) pl/0编译程序总体流程图 3
二 pl语言编译器 3
1 编译器的词法分析 3
2 语法分析 4
3 语义分析 6
4 **生成 6
5**执行 7
6各功能模块作用分析 8
1) 作用表 8
2) 符号名字表结构: 8
3) 保留关键字枚举结构: 9
4) 名字表中标识符枚举类型: 9
5)虚拟机 9
7 错误诊断处理 10
三扩充内容的设计 11
+--运算符的扩充 11
对于++和--运算符,扩充时要注意存在++,有两个情况: 11
3 扩充部分语法描述图: 16
4 运行时存储组织和管理 17
5扩充语句测试及结果 18
5.1 扩充赋值运算:++和— 18
5.2 结果截图 18
四实验总结 19
由于pl程序设计语言是一个较简单的语言,结构清晰,可读性强而又具备了一般高级程序设计语言的必须部分,因而它语言的编译程序能充分体现一个高级语言编译程序实现的基本方法可技术。它以赋值语句为基础,构造概念有顺序、条件和重复(循环)三种。pl有子程序概念,包括过程定义(可以嵌套)与调用且有局部变量说明。
pl中唯一的数据类型是整型,可以用来说明该类型的常量和变量。当然pl也具有通常的算术运算和关系运算。具体的pl语法图如下。
pl的语言的词法分析器将要完成以下工作:
1) 跳过分隔符(如空格,回车,制表符);
2) 识别诸如begin,end,if,while等保留字;
3) 识别非保留字的一般标识符,此标识符值(字符序列)赋给全局量id,而全局量sym赋值为sym_identifier。
4) 识别数字序列,当前值赋给全局量num,sym则置为sym_number;
5) 识别:=,之类的特殊符号,全局量sym则分别被赋值为sym_becomes,sym_leq,sym_geq等。
相关过程(函数)有getsym(),getch(),其中getch()为获取单个字符的过程,除此之外,它还完成:
1) 识别且跳过行结束符;
2) 将输入源文件复写到输出文件;
3) 产生一份程序列表,输出相应行号或指令计数器的值。
1 我们采用递归下降的方法来设计pl编译器。以下我们给出该语言的first和follow集合。
注:表中r代表六个关系运算符。
不难证明,pl语言属于ll(1)文法。(证明从略。)
2 以下是我们给出如何结合语法图编写(递归下降)语法分析程序的一般方法。假定图s所对应的程序段为t(s),则:
1) 用合适的替换将语法约化成尽可能少的单个图;
2) 将每一个图按下面的规则(3)-(7)翻译成一个过程说明;
3) 顺序图对应复合语句:
对应:begin t(s1); t(s2); t(sn) end
4)选择:对应:case语句或者条件语句:
case ch ofif ch in l1 then t(s1) else
l1: t(s1if ch in l2 then t(s2) else
l2: t(s2); 或。
if ch in ln then t(sn) else
ln: t(snerror
其中li∈first(si),ch为当前输入符号。(下同)
5) 循环。
对应:while ch in l do t(s)
6) 表示另一个图a的图:
对应:过程调用a。
7) 表示终结符的单元图:
对应:if ch ==x then read(ch) else error
3相关过程有:
block(),constdeclaration(),vardeclaration(),statement(),condition(),expression(),term(),factor()等。
pl的语义分析主要进行以下检查:
1) 是否存在标识符先引用未声明的情况;
2) 是否存在己声明的标识符的错误引用;
3) 是否存在一般标识符的多重声明。
pl编译程序不仅完成通常的词法分析、语法分析,而且还产生中间**和“目标”**。最终我们要“运行”该目标码。为了使我们的编译程序保持适当简单的水平,不致陷入与本课程无关的实际机器的特有性质的考虑中去,我们假想有台适合pl程序运行的计算机,我们称之为pl处理机。
pl处理机顺序解释生成的目标**,我们称之为解释程序。注意:这里的假设与我们的编译概念并不矛盾,在本课程中我们写的只是一个示范性的编译程序,它的后端无法完整地实现,因而只能在一个解释性的环境下予以模拟。
从另一个角度上讲,把解释程序就看成是pl机硬件,把解释执行看成是pl的硬件执行,那么我们所做的工作:由pl源语言程序到pl机器指令的变换,就是一个完整的编译程序。
pl处理机有两类存贮,目标**放在一个固定的存贮数组code中,而所需数据组织成一个栈形式存放。
pl处理机的指令集根据pl语言的要求而设计,它包括以下的指令:
(1)lit将常数置于栈顶 */
(2)lod将变量值置于栈顶 */
(3)sto将栈顶的值赋与某变量 */
(4)cal用于过程调用的指令 */
(5)int在数据栈中分配存贮空间 */
(6)jmp, jpc /*用于if, while语句的条件或无条件控制转移指令 */
(7)opr一组算术或逻辑运算指令 */
上述指令的格式由三部分组成:
其中,f, l, a的含义见下表:
上表中,层次差为变量名或过程名引用和声明之间的静态层次差别,程序地址为目标数组code的下标,数据地址为变量在局部存贮中的相对地址。
pl的编译程序为每一条pl源程序的可执行语句生成后缀式目标**。这种**生成方式对于表达式、赋值语句、过程调用等的翻译较简单。
如赋值语句x :=y op z(op为某个运算符),将被翻译成下面的目标**序列:(设指令计数从第100号开始)
而对if和while语句稍繁琐一点,因为此时要生成一些跳转指令,而跳转的目标地址大都是未知的。为解决这一问题,我们在pl编译程序中采用了回填技术,即产生跳转目标地址不明确的指令时,先保留这些指令的地址(code数组的下标),等到目标地址明确后再回过来将该跳转指令的目标地址补上,使其成为完整的指令。下表是if、while语句目标**生成的模式。
(l1,l2是**地址)
课程设计报告格式 课程设计
洛阳理工学院。课程设计说明书。课程名称。设计课题。专业。班级。学号。姓名。完成日期2014年12月26日。问题描述 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的内容要求。基本要求 小四宋体,行间距单倍行距,每段缩进两个字符。叙述一下设计的基本要求。测试数据 小四宋体,行间距单倍行距,每...
课程设计总结,课程设计报告
课程设计总结,课程设计报告。3.尝试应用项目管理软件进行项目进程的规划管理 绘制甘特图,不作硬性要求 二 选题说明。人事管理是企业信息管理的重要部分,面对大量的人事工资信息,财务部门采用人力处理将浪费大量的时间 人力和物力,且数据的准确性低。因此,开发一个界面友好,易于操作的人事工资管理软件进行自动...
课程设计 课程设计报告格式
学校名。课程设计报告。课程名称 c语言程序设计 系别 专业班级 学号。姓名。课程题目 企业人事管理系统 完成日期 指导老师 年月日。附件。课程设计的内容。企业人事管理系统 本项目的目标是开发一个功能实用,操作简便,简单明了的人事管理系统。能够录入人事的基本资料,在操作上能够完成诸如添加 修改 删除 ...