PL0编译程序的实现(精)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

( 0) ( 1) ( 2) ( 3) ( 4) ( 5) ( 6) ( 7) ( 8) ( 9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24)
jmp jmp int lod lit opr sto opr int opr sto lod lit opr jpc cal lit lod opr opr opr opr sto jmp opr
PL/0编译程序功能的框架 PL/0源程序 PL/0编译程序
类 pcode代码
类 pcode解释程序 输入 输出
第2 章
PL/0编译程序的实现
步骤1. 源语言PL/0与目标代码类pcode 之间的映射 步骤2. PL/0编译程序的总体设计 步骤3. PL/0编译程序词法分析的设计与实现 步骤4. PL/0编译程序语法语义分析的设计与实现 步骤5. PL/0编译程序代码生成的实现 *步骤6. PL/0编译程序错误处理的实现 步骤7. 类pcode代码解释器的设计与实现
步骤1 PL/0程序到类pcode代码的映射
目标代码类pcode是一种假想栈式计算机的汇编 语言。 指令格式 f l a
f
l a
功能码
层次差 (标识符的引用层减去它的定义层) 根据不同的指令有所区别
假想栈式计算机的运行栈 T是栈顶指针 B是基地址:分配给一个过程数据空间的开始位置 T
B
2 1 0
步骤3
PL/0编译程序词法分析的 设计与实现
词法分析如何把单词传递给语法分析 单词定义(见教材288页) type symbol=(nul,ident,number,plus,…, varsym,procsym); ( 定义纯量/枚举类型,类似C的enum) sym:symbol; id:alfa; (type alfa=packed array[1..al] of char) al=10; num:integer;
步骤3
PL/0编译程序词法分析的 设计与实现
查到时找到关键字相应的内部表示 wsym[1]:=beginsym; wsym[2]:=callsym; … wsym[13]:=writesym; 字符对应的单词表: ssym[‘+’]:=plus; ssym[‘-’]:=minus; … ssym[‘;’]:=semicolon;
步骤2
PL/0编译程序的总体设计
PL/0源程序 词法分析程 序 语法语义分析程序
表格管理程序
出错处理程序
代码生成程序
目标程序
步骤2
PL/0编译程序的总体设计
其编译过程采用一趟扫描方式 以语法、语义分析程序为核心 词法分析程序和代码生成程序都作为一个独立 的过程,当语法分析需要读单词时就调用词法 分析程序,而当语法、语义分析正确,需要生 成相应的目标代码时,则调用代码生成程序。
第2 章
PL/0编译程序的实现
本章目的:以PL/0语言的编译程序为实例,学习 一个编译程序实现的基本步骤和相关技术
“PL/0语言的编译程序”是世界著名计算机科 学家N.Wirth先生编写的。由于PL/0语言功能简单 、 结构清晰、可读性强,又具备了一般高级语言 的必须部分,因而PL/0语言的编译程序能充分体 现一个高级语言编译程序实现的基本技术和步骤 ,是一个非常合适的编译程序教学模型。
步骤3
PL/0编译程序词法分析的 设计与实现
通过三个全程量 SYM 、ID和NUM 将识别出的单 词信息传递给语法分析程序。
SYM:存放单词的类别 如:begin

beginsym, initial

ident,
60 → number ID: 存放用户所定义的标识符的值 如: initial (在SYM中放ident,在ID中放initial) NUM:存放用户定义的数 如:60 (在SYM中放number,在NUM中放60)
RA DL SL
每个过程被调用时 分配一段数据空间, 变量的位置从3开 始(每个变量占用 一个单元)。运行结 束释放该数据空间
步骤1 PL/0程序到类pcode代码的映射
下面给出 PL/0程序到类pcode代码的映射。 (编译过程是按源程序顺序进行分析的) (常量、变量的说明部分不产生目标代码)
const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); while b#0 do begin call p; write(2*c); read(b); end end.
步骤2
PL/0编译程序的总体设计
表格管理程序:建立变量,常量和过程标识符的 说明与引用之间的信息联系。 出错处理程序:对词法和语法、语义分析遇到的 错误给出在源程序中出错的位置和错误性质。 下面将介绍某些部分实现的关键技术。
步骤3
PL/0编译程:GETSYM框图(见教材15页图2.5) 程序文本(见教材290-292页) 当识别到标识符时先查关键字表(关键字表是按 第1个字母的大小顺序排列的,用二分法查找) 关键字表:(见教材304页主程序) word[1]:=‘begin ‘;word[2]:=‘call ‘; ... word[13]:=‘write ‘;
0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
8 2 3 3 10 2 4 0 5 16 3 3 0 9 24 2 2 4 4 14 15 16 3 11 0
转向主程序入口 转向过程p入口 过程p入口,为过程p开辟空间 取变量b的值到栈顶 取常数10到栈顶 次栈顶值与栈顶值相加 栈顶值送变量c中 退栈并返回调用点(16) 主程序入口开辟5个栈空间 从命令行读入输入值置于栈顶 将栈顶值存入变量b中 将变量b的值取至栈顶 将常数值0取至栈顶 次栈顶值与栈顶值是否不等 等时转(24)(条件不满足转) 调用过程p 常数值2取至栈顶 将变量c的值取至栈顶 次栈顶值与栈顶值相乘(2*c) 栈顶值输出至屏幕 换行 从命令行读取输入值到栈顶 栈顶值送变量b中 无条件转到循环入口(11) 结束退栈
相关文档
最新文档