第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编译程序的总体设计
词法分析程序和代码生成程序都作为一个过 程,当语法分析需要读单词时就调用词法分 析程序,而当语法、语义分析正确,需要生 成相应的目标代码时,则调用代码生成程序
表格管理程序实现变量,常量和过程标识符 的信息的登录与查找。
出错处理程序,对词法和语法、语义分析遇 到的错误给出在源程序中出错的位置和与错 误 性质有关的编号,并进行错误恢复。
read(b);
end
end.
2.1.2 PL/0语言文法的EBNF表示
BNF(BACKUS-NAUR FORM)是根据美国 的John W.Backus与丹麦的Peter Naur来 命名的,它从语法上描述程序设计语言的元 语言(metalanguage)。
采用BNF就可说明哪些符号序列是对于某给 定语言在语法上有效的程序。
自顶向下的语法分析<程序>
<分程序>
.
VAR A; BEGIN READ(A) END.
<变量说明部分> <语句>
VAR <标识符> ; <复合语句> BEGIN <语句> END
A <读语句>
READ ( <标识符> )
A
递归子程序法
递归子程序法:对应每个非终结符语法单元,
编一个独立的处理过程(或子程序)。 语法分析从读入第一个单词开始由非终结符
非终结符(non-terminal symbol)—在描述 过程中定义的,代表某一类语法单位的集合 的,需要继续定义的符号。
终结符(terminal symbol)—最终定义的不能 用更小的语法单位替换的符号。

第2章 PL0编译程序的实现

第2章 PL0编译程序的实现
第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)范式表示
< > 用左右尖括号括起来的中文字表示待描述的语法 成分<语法单位>,为非终结符

第二章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程序--递规调用

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语言编译程序文本时,应从整体 结构开始逐步细化,弄清楚每个过程的功能和实现 方法及过程之间的相互关系。

第2章__PL0编译程序的实现

第2章__PL0编译程序的实现

词法分析程序
语法分析程序
表 格 管 理 程 序 语义分析程序 中间代码生成程序 出 错 处 理 程 序
代码优化程序
目标代码生成程序
注意
上述编译过程的阶段划分只是一种典型的分法, 事实上并不是所有的编译程序都分成这样几个 阶段的。 有些编译程序对优化没有什么要求,优化阶段 就可省去。在某些情况下,为了加快编译速度, 中间代码产生阶段也可以去掉。有些最简单的 编译程序是在语法分析的同时产生目标代码。 但是,多数实用编译程序的工作过程大致都像 上面所说的那六个阶段。
其它
编译程序的另外两个重要的工作是表格管理和 出错处理。 编译过程中源程序的各种信息被保留在种种不 同的表格里,编译各阶段的工作都涉及到构造、 查找或更新有关的表格,因此需要有表格管理 的工作;如果编译过程中发现源程序有错误, 编译程序应报告错误的性质和错误发生的地点, 并且将错误所造成的影响限制在尽可能小的范 围内,使得源程序的其余部分能继续被编译下 去,有些编译程序还能自动校正错误,这些工 作称之为出错处理。
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.
〈标识符〉∷=〈字母〉{〈字母〉|〈数字〉}
<过程说明部分>::=<过程首部><分程序>{; <过程说明部分>} <过程首部>::=PROCEDURE<标识符>;

编译原理

编译原理

条件 condition
expression
term
factor
编 译 程 序 总 体 流 程 图
启动 置初值
调用GETSYM取单词 调用GETSYM取单词 GETSYM 调用BLOCK过程 调用BLOCK过程 BLOCK
当前单词 是否为源程序结束符 '.'? Y 源程序 是否 错 ? N 过程 NTE ET 程序 Y
1 《编译原理》 台州学院 应建健
何为PL/0语言? 何为PL/0语言? PL/0语言
PL/0语言:PASCAL语言的子集,功能简单, PL/0语言:PASCAL语言的子集,功能简单, 语言 语言的子集 结构清晰,可读性强, 结构清晰,可读性强,具备了一般高级语 言的必备部分
2
《编译原理》 台州学院 应建健
N
出错

调用
结束 21
说明部分的分析 对每个过程说明的对象(变量, 对每个过程说明的对象(变量,常量和过 程)造名字表
–填写所在层次,标识符的属性和分配的相对位 填写所在层次, 填写所在层次 标识符的属性不同时, 置。标识符的属性不同时,所需填入的信息也 不同。登录信息由ENTER过程完成。 ENTER过程完成 不同。登录信息由ENTER过程完成。
12
《编译原理》 台州学院 应建健
PL/0编译程序的结构 PL/0编译程序的结构
其编译过程采用一趟扫描方式 其编译过程采用一趟扫描 一趟扫描方式 语法分析程序为核心 以语法分析程序为核心 词法分析程序和代码生成程序都作为一 程序和代码生成 词法分析程序和代码生成程序都作为一 个独立的过程, 个独立的过程,当语法分析需要读单词 时就调用词法分析程序, 时就调用词法分析程序,而当语法分析 正确需要生成相应的目标代码时, 正确需要生成相应的目标代码时,则调 用代码生成程序。 用代码生成程序。

第2章 PL-0编译程序的实现

第2章  PL-0编译程序的实现

3、PL/0编译程序是用PASCAL语言编写, 可在任何配有PASCAL编译系统的计算机 上运行。
PL/0 Compiler 源文本
PASCAL Compiler
PL/0 Compiler 目标文本
PL/0 Compiler 目标文本
PL/0 目标程序
PL/0 源程序
2.2 PL/0编译程序的结构
第 2章 PL/0编译程序的实现
2.1 2.2 2.3 2.4 2.5
PL/0语言描述 PL/0编译程序的结构 PL/0编译程序的语法语义分析 PL/0编译程序的错误处理 类pcode代码解释器
本章目的:以PL/0为实例,学习编译 程序实现的基本步骤和相关技术
PL/0语言简介 PL/0是一个非常小的程序设计语言, 它是由Pascal的发明人Niklaus Wirth所定 义的。它是Pascal的一个子集,有嵌套的 过程,但过程不能有参数,没有函数,没 有分支语句,没有for 循环,条件语句不支 持else,只有一个整数数据类型。
程序
分程序
.
内的文字表示非终结符 或 内的文字或符号表示终结符
2.1.1 PL/0语言的语法描述图
语法描述图 下页
分程序
Const , ;
ident
=
number
Var
, ; ;
procedure
ident
ident
;
分程序
语句
语句
ident call begin
:=
表达式
ident
.
语句 语句
0 l l l 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
a a a a a a a 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

PL0编译程序的实现

PL0编译程序的实现
【学习目标】 本章目的:以PL/0语言编译程序为实例,学习编
译程序实现的基本步骤和相关技术,对编译程序的 构造和实现得到一些感性认识和建立起整体概念, 为后面的原理学习打下基础。
◇ 了解并掌握用语法图和扩充的巴科斯-瑙尔 范式(EBNF)对计算机语言的形式描述。
【难 重 点】 重点: ◇ 弄清源语言(PL/0)目标语言(类 pcode)实现
2. V集n合是N一on个-te非rm空in有als穷,集且合V,t称Vn作= 非。终结符号 3. S Vn ,称作开始符号Start Symbol 。 4. P是一个非空有穷集合,称为产生式集合
Production Rules ,每条产生式形为A,其22 中AV ,(V V )*。
例2.1 简单的算术表达式
17
Bakus-Naur范式(BNF)
18
Examples of BNF
19
Syntax Graph
20
2.2 语法定义
❖ 语法描述程序设计语言的层次结构,如C语言 的条件语句为
if_stmt if (expr) stmt else stmt if_stmt if (expr) stmt
string
string + string
string - string 2
9
5
string
string - string
9 string + string
5
2
对某个文法,如一个句子有两棵以上的分析树,称为
二义(歧义)文法。
29
2.2.3 Associativity of Operators
❖ 可以用括号来表明计算顺序,如 9-5+2 = (9-5)+2

PL000编译程序

PL000编译程序

第二章 编译程序的实现
26
2、PL/0语法规则的BNF表示
<写语句>::= WRITE(<表达式>{, <表达式>}) <写语句>举例: WRITE( a+b,b*c);
第二章 编译程序的实现
27
2、PL/0语法规则的BNF表示
<过程调用语句>::=CALL <标识符>; <过程调用语句>举例:
第二章 编译程序的实现
30
2、PL/0语法规则的BNF表示
<因子>::=
<标识符>|<常量>|(<表达式>)
PROCEDURE FACTOR P294~P295
第二章 编译程序的实现
31
2、PL/0语法规则的BNF表示
<项>::=
<因子>|<项> <乘法运算符><因子>
<乘法运算符>::=*|/
第二章 编译程序的实现 38
符号表的内容
标识符名:NAME
类型:KIND ①CONSTANT(常量)
②VARIABLE(变量) ③PROCEDURE(过程) 值或层次:VAL或LEVEL 地址:ADR 大小:SIZE
第二章 编译程序的实现 39
地址:ADR
地址:ADR 简单变量或常量:该量在数据区所占单元 的绝对地址或相对地址;
(PROGRAM PROGSYM),(mysource IDENT) , (CONST CONSTSYM) , (a IDENT) , (= EQL) , (10 NUMBER) , (; SEMICOLON) , (VAR VARSYM) , (b IDENT) , (, COMMA) , (c IDENT) , (; SEMICOLON) , (PROCEDURE PROCSYM) , …… (g IDENT) , (:= BECOMES) , (a IDENT) , (+ PLUS) , (e IDENT) , (; SEMICOLON) This is a assign Statement;(赋值语句) (f IDENT) , (:= BECOMES) , (g IDENT) , (; SEMICOLON) This is a assign Statement; (赋值语句) (WRITE WRITESYM) , (( LPAREN) , (g IDENT) , ( ) RPAREN) , (; SEMICOLON) This is a write Statement;(写语句) ……

第2章PL0编译程序的实现

第2章PL0编译程序的实现

第2章 PL/0编译程序的实现第1题PL/0语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管理。

答案:PL/0语言允许过程嵌套定义和递归调用,它的编译程序在运行时采用了栈式动态存储管理。

(数组CODE存放的只读目标程序,它在运行时不改变。

)运行时的数据区S是由解释程序定义的一维整型数组,解释执行时对数据空间S的管理遵循后进先出规则,当每个过程(包括主程序)被调用时,才分配数据空间,退出过程时,则所分配的数据空间被释放。

应用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题。

第2题若PL/0编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方式分别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句b∶=10时运行栈的布局示意图。

var x,y;procedure p;var a;procedure q;var b;begin (q)b∶=10;end (q);procedure s;var c,d;procedure r;var e,f;begin (r)call q;end (r);begin (s)call r;end (s);begin (p)call s;end (p);begin (main)call p;end (main).答案:程序执行到赋值语句b∶=10时运行栈的布局示意图为:第3题写出题2中当程序编译到r的过程体时的名字表table的内容。

size name kind level/val adr答案:题2中当程序编译到r的过程体时的名字表table的内容为:name kind level/val adr sizex variable 0 dxy variable 0 dx+1p procedure 0 过程p的入口(待填) 5a variable 1 dxq procedure 1 过程q的入口 4 s procedure 1 过程s的入口(待填) 5c variable 2 dxd variable 2 dxr procedure 2 过程r的入口 5e variable 3 dxf variable 3 dx+1注意:q和s是并列的过程,所以q定义的变量b被覆盖。

语法语义分析

语法语义分析
❖用表格管理程序建立变量、常量和过程标识符的说明与 引用之间的信息联系
ቤተ መጻሕፍቲ ባይዱ
❖用出错处理程序对词法和语法语义分析遇到的错误给出 在源程序中出错的位置和错误性质
❖当源程序编译正确时,PL/O编译程序自动调用解释执行 程序,对目标代码进行解释执行,并按用户程序要求输 入数据和输出运行结果
❖PL/O编译程序的结构图: 图 2.2(a) PL/0编译程序的结构图
算机无关
❖它的编译程序和目标程序的解释执行程序可用Pascal,C或 其它语言书写,因此PL/0语言可在配备相应书写语言的任 何机器上实现
❖用语法图描述语法规则的优点是直观、易读 ❖在图2.1的语法图中用椭圆和圆圈中的英文字或字符表示
终结符,用长方形内的中文字表示非终结符 ❖终结符:构成语言文法的单词,是语法成分的最小单位 ❖通常称第一个非终结符为文法的开始符号
知 识 结 构
第二章 PL/0编译程序的实现
§2.1 PL/0语言描述
一.PL/0语言的语法描述图 ❖它由世界著名计算机科学家N.Wirth编写 ❖它是PASCAL语言的子集,功能简单,结构清晰,可读性
强,具备了一般高级语言的必备部分 ❖它充分体现一个高级语言编译程序实现的基本方法和技术 ❖它的目标程序为假想栈式计算机的汇编语言,与具体计
图2.1(a) 程序语法描述图
图2.1(b) 分程序语法描述图
图2.1(c) 语句语法描述图
图2.1(d) 条件语法描述图
图2.1(e) 表达式语法描述图
图2.1(f) 项语法描述图
图2.1(g) 因子语法描述图
➢画语法图时要注意箭头方向和弧度,语法图中应该无直角,如 图 2.1给出的PL/0语法描述图。沿语法图分析时不能走尖弧线

第2章 PL0编译程序

第2章 PL0编译程序

n. <表达式>::=[十|一]<项> {<加法运算符><项>} o. <项>::=<因子>{<乘法运算符><因子>} p.<因子>::=<标识符>|<无符号整数>|<表达式> q. <加法运算符>::=十|一
2007年9月12日星期二5时12分32秒
共147页, Page19
q. <加法运算符>::=十|一 r.<乘法运算符>::=*|/ s.<关系运算符>::==|#|<|<=|>|>= t.<条件语句}::=IF<条件>THEN<语句> u.<过程调用语句>::=call<标识符>
共147页, Page28
启动 置初值 PLO编译程序总体流程 Call getsym取单词
Call block
当前单词是否 为源程序结束符‘.’?
N
出错 打印错误
Y
源程序是否有错误‘.’?
Y
N Call Interpret 解译执行目标程序
结束
2007年9月12日星期二5时12分32秒 共147页, Page29
2007年9月12日星期二5时12分32秒 共147页, Page22
PL/0编译程序的结构
PL/0源程序 表 格 管 理 程 序 词法分析程序 语法分析程序 代码程序 出 错 处 理 程 序
共147页, Page23
目标程序
2007年9月12日星期二5时12分32秒
PL/0编译程序的子程序
PI/0编程序是用PASCAL语言书写,整个编译程序 (包括主程序) 是由18个嵌套及并列的过程或函数 组成.下面分别简要给出这些函数功能及它们的层 次结构。

第2章 PL0编译程序的实现(4学时)

第2章 PL0编译程序的实现(4学时)
13 13
表格管理举例
CONST A=35,B=49; VAR C,D,E; PROCEDURE P; VAR G
名字
TX0 NAME:A
类型
层次/值
地址
存储空间
NAME:B NAME:C NAME:D NAME:E NAME:P TX1 NAME:G ……
KIND:CONSTANT KIND:CONSTANT KIND:VARIABLE KIND:VARIABLE KIND:VARIABLE KIND:PROCEDUR KIND:VARIABLE ……
何为PL/0语言?
PL/0语言: PASCAL语言的子集,功 能简单,结构清晰,可 读性强,具备了一般高 级语言的必备部分。
PL/0程序示例: CONST A=10; VAR B,C; PROCEDURE P; VAR D; PROCEDURE Q; VAR X; BEGIN READ(X); D:=X; WHILE X#0 DO CALL P; END; BEGIN WRITE(D); CALL Q; END; BEGIN CALL P; END.
存储空间
SIZE:4
ADR:DX SIZE:4 SIZE:5 ADR:DX ADR:DX ADR:DX+1 SIZE:5 ADR:DX ADR:DX+1
15 15
2.5 PL/0编译程序的目标代码结构和代码生成
• 目标代码pcode是一种假想栈式计算机的汇编语言。
• 指令格式 功能码
f l
a
层次差 通常为“位移量” 根据不同的指令 有所不同
18
Const a=10; var b,c; procedure p; begin c:=b+a; end; begin read(b); call p; write(c); end.

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

第二章 PL0编译程序的实现 (下)
JMP:无条件转移指令
f
l
a
JPC:条件转移指令
OPR:关系运算和算术运算指令
PL/0源程序与目标程序例:
2.6
语法错误处理:
PL/0编译程序对语法错误的处理采用两种方法: 1.对于有些易于校正的错误如丢了逗号、分号等, 则指出出错位置,并加以校正。校正的方式就是补上 逗号或分号。 2.有些错误编译程序难于确定校正的措施。为了 使当前的错误不致影响整个程序的崩溃,把错误尽量 局限在一个局部的语法单位中。这样就需要跳过一些 后面输入的单词符号,直到读入一个能使编译程序恢 复正常语法分析工作的单词为止。
2.4 PL/0语言的语法语义分析 语法分析的任务,是识别由词法分析给出的单词符 号序列在结构上是否符合给定的文法规则。 语法分析从读入第一个单词由非终极符“程序”即 开始符出发,沿语法描述图箭头所指出的方向进行 分析。 如果一个PL/0语言的单词系列在整个语法分析中, 每个单词都能逐个得到匹配,直到程序结束符“.”, 这时就说所输入的程序是正确的,对于正确的语法分 析做相应的语义翻译,最终得出目标程序。 程序 →分 程 序 →
P:程序地址寄存器,指向下一条要执行的目标程序 的地址
T:栈顶寄存器,每个过程被运行时,给它分配的数 据区空间分为静态和动态两个部分,栈顶寄存器指出了 当前栈中最新分配的单元
B:基址寄存器,也称基地址。过程被调用时指出在 数据区S中给它分配的数据段起始地址
小结
本章以PL/0语言为例,对编译程序的构造 作了概括的分析。尤其建议阅读教材附
·
表2.2 TABLE表中信息
2.5 PL/0 编译程序目标代码结构和代码生成
代码指令有8条:
LIT:将常量值取到运行栈顶 LOD:将变量放到栈顶 STO:将栈顶内容送入变量单元 CAL:调用过程的指令
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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.

2 编写一个PL0语言的程序,要求:
a) 包含一个过程procedure 过程名字为GetSum, 功能是计算累 加和 b) 在主程序中编写一个循环语句,循环中增加循环变量数值, 调用过程SetSum, 计算累加循环变量数值结果
12
回家作业
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中
‘ { }’ 表示花括号内的语法成分可以重复。在不加 上下界时可重复0到任意次数,有上下界时为可重复次 数的限制 ‘[ ]’ 表示方括号内的成分为任选项 ‘( )’ 表示圆括号内的成分优先
7
由语法描述图转化到BNF范式
程序
分程序
.
<程序>::=<分程序>.
8
由语法描述图转化到BNF范式
分程序
常量说明部分 变量说明部分 过程说明部分 语句
表达式


a+2(x+10)是不是表达式?
6
BNF范式
BNF(Backus Normal Form)范式表示
<> 用左右尖括号括起来的中文字表示待描述的语 法成分<语法单位>,为非终结符 ‘::=’ 符号的左部由右部定义,即‘定义为’ ‘|’ 表示‘或’ ,即左部可由多个右部定义
EBNF (Extended Backus Normal Form)范式表示
14
b) 在主程序中编写一个循环语句, 循环中增加循环变量数值,调用 过程SetSum, 计算累加循环变量数值结果
const c1=2,c2=10; var num1,count,sum; begin
num1:=c1;
if num1>0 then sum:=0;
if num1<=0 then
sum:=num1-1; count:=1;
while countห้องสมุดไป่ตู้=c2 do
sum:=sum+count; end.
13
第2章 PL/0编译程序的实现
1
2. 1 PL/0语言描述


终结符和非终结符 终结符是最小的语法单位,例如构成文法的单词。 非终结符是一个语法单位,它可以由其他一些语法单位组 成,即可以由其他一些终结符和非终结符串、或终结符串 组成。 PL/0语言的语法描述图 用圆圈表示终结符 用长方形表示非终结符
相关文档
最新文档