第2章 PL0编译程序的实现

合集下载

第二章PLO编译程序的实现

第二章PLO编译程序的实现

W.Backus与丹麦的Peter Naur来命名的,它从语法上描 述程序设计语言的元语言。采用BNF就可说明哪些符号 序列是对于某给定语言在语法上有效的程序
12
BNF引入的符号:
< > 用左右尖括号括起来的中文字表示语法构造成分,
或称语法单位,为非终结符
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
图 2.2(b) PL/0的解释执行结构
24
PL/O编译程序(包括主程序)是由18个嵌套及并列的过程 或函数组成:
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
25
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
26
PL/O编译程序的过程与函数定义层次结构图
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
界符:
如‘,’、‘.’ 、‘;’ 、‘(’ 、‘)’等
33
词法分析程序GETSYM所要完成的任务:
滤空格、识别保留字 识别标识符、拼数
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
拼复合词、输出源程序
34
取字符过程GETCH:
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
43
(2)过程体的处理: 程序的主体是由语句构成的
盛 威 网 : 专 业 的 计 算 机 学 习 网 站
处理完过程的说明后就处理由语句组成的过程体,从语法 上对语句逐句分析 当语法正确时就生成相应语句功能的目标代码
图 2.6 取字符过程GETCH
35
§2.4 PL/O编译程序的语法语义分析
语法分析的任务:识别单词符号序列是否符合给定的语法
盛 威 网 : 专 业 的 计 算 机 学 习 网 站

第二章 PL0编译程序的实现 (上)

第二章 PL0编译程序的实现 (上)

2.1
PL/0 语言描述
2.1.1 PL/0语言的语法描述图 下面借用语法图来描述语法规则。其中: 英文表示终结符,中文表示非终结符。 终结符:构成语言文法的单词,是语法成分 的最小单位。 非终结符:是个语法成分,还没有进行分析。 程 序
分 程 序
语 句
条ቤተ መጻሕፍቲ ባይዱ:
表 达 式

因子:
2.12 PL/0 语言文法的EBNF表示
单词的种类有五种:
1. 基本字:也称保留字,如END、IF等
2. 运算符:如+、—、*、/、> =、# 等等
3. 标识符:用户定义的变量名、常数名、 过程名 4. 常数:如100等整数
5. 界符:如‘,’、‘.’、‘(’‘;’ 等
词法分析程序完成下列任务: 1.滤空格:语法分析时没用 2.识别保留字:对应的类别放在SYM中,若查不到, 认为是用户定义的标识符 3.识别标识符:对用户定义的标识符放在SMY中, 标识符本身的值放在ID中 4.拼数:所取单词是数字时,将数的类别放在SYM 中,数值本身的值存放在NUM中 5.拼复合词:对两个字符组成的算符进行识别(<=) 6.输出源程序:边读入字符边输出
源程序
表 格 管 理 程 序
词法分析程序 语法分析程序
代码生成程序
出 错 处 理 程 序
目标程序
PL/0编译程序的过程或 函数的功能表见表2.1
过程或函数的嵌套定 义层次结构如图2.3 所示
语法分析程序
图2.4 PL/0编译程序总体流程图
2.3 PL/0编译程序的词法分析
词法分析程序是为语法分析提供单词用 的,是语法分析的基础。它把输入的字 符串形式的源程序分割成一个个单词符 号。编译器为此设置了3个全程量的公用 单元为: SYM:存放每个单词的类别 ID:存放用户所定义的标识符的值 NUM:存放用户定义的数

第二章PL0编译程序的实现

第二章PL0编译程序的实现

PL/0程序示例
CONST A=10; (* 常量说明部分 *) VAR B,C; (* 变量说明部分 *) PROCEDURE P; (* 过程说明部分 *) VAR D;(* P的局部变量说明部分 *) PROCEDURE Q; (* P的局部过程说明部分 *) VAR X; BEGIN 说明部分 READ(X); D:=X; Q过程体 WHILE X#0 DO CALL P; END; BEGIN WRITE(D); p过程体 CALL Q; END; BEGIN CALL P; 主程序体 END.
程序
分程序
.
内的文字表示语法成分(非终结符) 或 内的文字表示单词符号 (终结符)
非终结符:可由其它文法符号定义。 终结符:语法成分的最小单位,不能由其 它文法符号定义。
PL/0语言的EBNF(巴科斯-瑙尔范式)表示
● 构成EBNF的元素:非终结符,终结符,开始符,规 则。 EBNF 的表示符号说明: < >:用左右尖括号括起来的内容为非终结符 ∷= :读做‘定义为’ ,∷=的左部由右部定义 → :读做‘定义为’ , → 的左部由右部定义 | :读做‘或’ ,表示右部候选内容 { } :表示花括号内的内容可重复任意次或限定 次数 [ ] :表示方括号内的内容为任选项 ( ) :表示圆括号内的内容优先
说明部分
PL/0程序示例
CONST A=10; (* 常量说明部分 *) VAR B,C; (* 变量说明部分 *) BEGIN READ(B); C:=B; WHILE B#0 DO BEGIN 程序体 C:=C+B; B:=B-1; END; WRITE(C); END. 说明部分
PL/0程序示例
pl/0程序--递规调用

第2章 PL0编译程序的实现

第2章 PL0编译程序的实现

2
PL/0语言的语法描述图
程序 分程序
分程序
.
常量说明部分
变量说明部分 过程说明部分 语句
3
PL/0语言的语法描述图
分程序
常量说明部分 变量说明部分 过程说明部分 语句
4
5
例子

因子

a 10 a b*10 a a+10 a+b*10 -a+2*(x+10)-10*(b-10)





<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
9
由语法描述图转化到BNF范式
常量定义
<常量说明部分>::=CONST<常量定义>{,<常量定义>}; <常量定义>::=<标识符>=<无符号整数> <无符号整数>::=<数字>{<数字>}
10
回家作业

1 编写一个PL0语言的程序,要求:
a) 声明2个常数,c1为2,c2为10 b) 声明3个变量,num1、count和sum c) 第一条语句是赋值语句,将c1赋给num1 d) 第二条语句是条件语句,如果num1>0,则执行第三条语句, 否则将num1减1 e) 第三条语句是赋值语句,将0赋给sum e) 第四条语句是循环语句,循环变量count从1到c2,每次将 count值加到sum中
回家作业
2 编写一个PL0语言的程序,要求: a) 包含一个过程procedure 过程名 字为GetSum, 功能是计算累加和 const c1=0,c2=10; var count,sum; procedure GetSum; begin sum:=sum+count end begin sum:=0; count=c1; while count<=c2 do begin count:=count+1; call GetSum; end; end.

PL0编译程序的实现(精)

PL0编译程序的实现(精)

( 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;

第二章PL编译程序的实现

第二章PL编译程序的实现

BNF与EBNF表示的符号说明 BNF引入的符号: <> 用左右尖括号括起来的语法成分为非 终结符 ∷= 该符号的左部由右部定义 | ‘或’ EBNF引入的符号: { } 表示花括号内的语法成分可重复 [ ] 表示方括号内的语法成分为任选项 ( ) 表示圆括号内的成分优先
Hale Waihona Puke 例子:用EBNF描述: 整数: <整数>∷=[+|-]<数字>{<数字>} <数字>∷=0|1|2|3|4|5|6|7|8|9 不允许以0开头的整数 <整数>∷=[+|-]<非零数字>{<数字>}|0 <非零数字>∷=1|2|3|4|5|6|7|8|9 <数字>∷=0|1|2|3|4|5|6|7|8|9
ADR: DX ADR: DX+1 ADR: DX+2 ADR:
SIZE:4
NAME:G Kind :VARIBALE … …
LEVEL:LEV+1 …
ADR: DX …
过程体的语义分析
当遇到标识符的引用时,就查符号表,看 是否有过正确定义,若已有,则从表中 取相应的属性,供代码生成使用,若无 则报错,当语义正确时,就生成相应的 目标代码
INT 0 a 在运行栈中为调用的过程开辟a个单元的数 据区 JMP 0 a 无条件跳转至a地址 JPC 0 a 条件跳转,当栈顶布尔值为非真则跳转至a 地址,否则顺序执行
OPR 0 0 OPR 0 1 OPR 0 2 OPR 0 3 OPR 0 4 OPR 0 5 OPR 0 6 OPR 0 7 OPR 0 8 OPR 0 9
PL/0语言文法的EBNF表示为: <程序 > ::= <分程序 >.

第二章PL0编译程序PPT课件

第二章PL0编译程序PPT课件

PL/0的语法描述图
内的文字表示非终结符

内的文字或符号表示终结符
程序
分程序
.
PL/0的语法描述图
分程序
const
标识符
var
标识符
number
procedure 语句
标识符
分程序
PL/0的语法描述图
语句
标识符
:=
表达式
begin
语句
end
语句
read
(
标识符
)
,
PL/0语言文法的EBNF表示
目标代码类pcode是一种假想栈式计算机的汇编语言。 指令格式:
f la
f 功能码 l 层次差 (标识符引用层减去定义层) a 根据不同的指令有所区别
类pcode指令功能表
LIT 0 a LOD l a STO l a CAL l a INT 0 a JMP 0 a JPC 0 a
OPR 0 0 OPR 0 1 OPR 0 2 OPR 0 3 OPR 0 4 OPR 0 5 OPR 0 6 OPR 0 7 OPR 0 8 OPR 0 9 OPR 0 10 OPR 0 11 OPR 0 12 OPR 0 13 OPR 0 14 OPR 0 15 OPR 0 16
PROCEDURE P; (* 过程说明部分 *)
VAR D;
PROCEDURE Q; VAR X; BEGIN READ(X);
D:=X;
Q的过程体
WHILE X#0
DO CALL P; END;
BEGIN WRITE(D); CALL Q;
END; BEGIN
p的过程体
CALL P; END.
主程序体

第二章 PL0编译程序的实现

第二章 PL0编译程序的实现

编译原理
◇ 建议用一个PL/0源程序的例子为导引作为 阅读PL/0语言编译程序文本的入门,然后再逐步 全面读懂。 ◇ 通过对PL/0语言编译程序某些指定功能的 扩充,加深对编译程序构造步骤和实现技术的理 解,并能在实践中应用。 【教学方式】 以学生自学为主。
编译原理
【难 重 点】 重点: ◇ 弄清源语言(PL/0)目标语言(类 pcode)实现 语言(pascal) 这3个语言之间的关系和作用。 ◇ 掌握用语法图和扩充的巴科斯-瑙尔范式 (EBNF)对一个高级程序设计语言的形式描述。 ◇ 了解PL/0语言编译程序的语法分析技术采用 的是自顶向下递归子程序法。 ◇ 掌握PL/0语言编译程序的整体结构和实现步 骤,并弄清词法分析、语法分析、语义分析、代码 生成及符号表管理每个过程的功能和相互联系。
编译原理
第2章 PL/0编译程序的实现
【学习目标】 本章目的:以PL/0语言编译程序为实例,学习编 译程序实现的基本步骤和相关技术,对编译程序的构 造和实现得到一些感性认识和建立起整体概念,为后 面的原理学习打下基础。 ◇ 了解用语法图和扩充的巴科斯-瑙尔范式 (EBNF)对 PL/0语言的形式描述。 ◇ 了解PL/0语言编译程序构造和实现的基本技 术和步骤。 ◇ 了解PL/0语言编译程序的目标程序在运行时 数据空间的组织管理。
返回目录
Байду номын сангаас
编译原理
【学习指南】 ◇ 要求读者阅读PL/0语言编译程序文本,了 解一个编译程序构造的必要步骤和实现技术。一个 编译程序的实现比较复杂,读懂一个典型的程序从 设计思想到实现技术也有一定难度,特别是入门开 始需要耐心。一但读懂,不仅了解编译程序的实现 方法和技术,还可学到许多编程技巧和好的编程风 格。 ◇ 阅读PL/0语言编译程序文本时,应从整体 结构开始逐步细化,弄清楚每个过程的功能和实现 方法及过程之间的相互关系。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第2章 PL/0编译程序的实现
1
2. 1 PL/0语言描述
终结符和非终结符 ➢ 终结符是最小的语法单位,例如构成文法的单词。 ➢ 非终结符是一个语法单位,它可以由其他一些语法单位组 成,即可以由其他一些终结符和非终结符串、或终结符串 组成。
PL/0语言的语法描述图 ➢ 用圆圈表示终结符 ➢ 用长方形表示非终结符
10
回家作业
1 编写一个PL0语言的程序,要求:
a) 声明2个常数,c1为2,c2为10 b) 声明3个变量,num1、count和sum c) 第一条语句是赋值语句,将c1赋给num1 d) 第二条语句是条件语句,如果num1>0,则执行第三条语句,
否则将num1减1 e) 第三条语句是赋值语句,将0赋给sum e) 第四条语句是循环语句,循环变量count从1到c2,每次将
常量说明部分
变量说明部分 过程说明部分
语句
<分程序>::=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句>
9
由语法描述图转化到BNF范式
常量定义
<常量说明部分>::=CONST<常量定义>{,<常量定义>}; <常量定义>::=<标识符>=<无符号整数> <无符号整数>::=<数字>{<数字>}
a+2(x+10)是不是表达式?
6
BNF范式
BNF(Backus Normal Form)范式表示
< > 用左右尖括号括起来的中文字表示待描述的语法 成分<语法单位>,为非终结符
‘::=’ 符号的左部由右部定义,即‘定义为’ ‘ | ’ 表示‘或’ ,即左部可由多个右部定义
EBNF (Extended Backus Normal Form)范式表示
a) 包含一个过程procedure 过程名 字为GetSum, 功能是计算累加和
b) 在主程序中编写一个循环语句, 循环中增加循环变量数值,调用 过程SetSum,
计算累加循环变量数值结果
const c1=0,c2=10; var count,sum; procedure GetSum; begin
2
PL/0语言的语法描述图
程序
分程序
.
分程序
常量说明部分
变量说明部分 过程说明部分
语句
3
分程序
PL/0语言的语法描述图
常量说明部分 变量说明部分 过程说明部分 语句
4
5
例子
因子
➢a ➢ 10

➢a ➢ b*10
表达式
➢a ➢ a+10 ➢ a+b*10 ➢ -a+2*(x+10)-10*(b-10)
count值加到sum中
2 编写一个PL0语言的程序,要求:
a) 包含一个过程procedure 过程名字为GetSum, 功能是计算累 加和
b) 在主程序中编写一个循环语句,循环中增加循环变量数值, 调用过程SetSum, 计算累加循环变量数值结果
12
回家作业
1 编写一个PL0语言的程序,要求: const c1=2,c2=10;
a) 声明2个常数,c1为2,c2为10
var num1,count,sum;
b) 声明3个变量,num1、count和 sum
c) 第一条语句是赋值语句,将c1赋
begin num1:=c1;
给num1
if num1>0 then
d) 第二条语句是条件语句,如果
sum:=0;
num1>0,则执行第三条语句,否 则将num1减1 e) 第三条语句是赋值语句,将0赋
‘{ }’ 表示花括号内的语法成分可以重复。在不加上 下界时可重复0到任意次数,有上下界时为可重复次数 的限制
‘ [ ] ’ 表示方括号内的成分为任选项 ‘ ( ) ’ 表示圆括号内的成分优先
7
由语法描述图转化到BNF范式
程序
分程序
.
<程序>::=<分程序>.
8
由语法描述图转化到BNF范式
分程序
if num1<=0 then sum:=num1-1;

给sum
count:=1;
e) 第四条语句是循环语句,循环变 while count<=c2 do
量count从1到c2,每次将count值 加到sum中
sum:=sum+count; end.
13
回家作业
2 编写一个PL0语言的程序,要求:
sum:=sum+count end begin sum:=0; count=c1; while count<=c2 do
begin count:=count+1; call GetSum;
end; end.
14
相关文档
最新文档