pl-0 编译系统.pdf下载分享
- 电子书
- 7天前
- 6热度
- 0评论
资料简介
本文详细介绍了PL/0编译系统的组成及其工作原理,包括PL/0编译程序、类P-code虚拟机等内容。通过具体的PL/0程序示例,如计算最大公约数和阶乘求和,以及对应的类P-code目标代码,帮助读者理解PL/0编译程序的词法分析、语法分析、语义分析、错误处理及目标代码生成等关键环节。适合计算机科学与技术专业的学生和编程爱好者阅读学习。
文件名称:pl-0 编译系统.pdf
文件类型:PDF文档
文件标签:PL/0编译系统、编译原理、P-code虚拟机

内容预览
第二讲 PL/0 编译系统
PL/0 编译系统组成
PL/0 编译程序
类 P-code 虚拟机
输入数据
输出数据
PL/0 程序
类P-code程序
PL/0 编译程序
类 P-code
解释程序
类P-code 虚拟机
PL/0编译系统
PL/0 编译程序总体结构
PL/0 语言描述
PL/0 编译程序的词法分析
类 P-code 虚拟机
PL/0编译系统
PL/0 编译程序的语法分析
PL/0 编译程序的语义分析和符号表
PL/0 编译程序的错误处理
PL/0 编译程序的目标代码生成
PL/0 程序示例
CONST A=1 0; /*主程序常量说明部分*/
VAR B,C; /*主程序变量说明部分*/
PROCEDURE P; /*主程序过程说明部分*/
VAR D; /*过程P的局部变量说明部分*/
PROCEDURE Q; /*过程P的局部过程说明部分*/
VAR X; /*过程Q的局部变量说明部分*/
BEGIN
READ(X);
D:=X;
WHILE X#0
DO CALL P;
END;
BEGIN
WRITE(D);
CALL Q;
END
BEGIN
CALL P;
END.
P 的过程体
Q 的过程体
主程序的过程体
PL/0 程序示例
var m, n, r, q;
{ 计算m和n的最大公约数 }
procedure gcd;
begin
while r#0 do
begin
q := m / n;
r := m - q * n;
m := n;
n := r;
end
end;
begin
read(m);
read(n);
{ 为了方便,规定m >= n }
if m < n then
begin
r := m;
m := n;
n := r;
end;
begin
r:=1 ;
call gcd;
write(m);
end;
end.
计算最大公约数
PL/0 程序示例
var n, m, fact, sum;
{ 递归计算 fact = m! }
procedure factorial;
begin
if m > 0 then
begin
fact := fact * m;
m := m - 1 ;
call factorial;
end;
end;
begin
{读入n }
read(n);
sum := 0;
while n > 0 do
begin
m := n;
fact := 1 ;
call factorial;
sum := sum + fact;
n := n - 1 ;
end;
{输出n! }
write(sum);
end.
计算
sum = 1 ! + 2 ! + ... + n!,
(n从控制台读入)
类P-code
类 P-code 语言
一种栈式机的语言
此类栈式机没有累加器和通用寄存器,有一
个栈式存储器,有四个控制寄存器(指令寄
存器 I,指令地址寄存器 P,栈顶寄存器 T
和基址寄存器 B),算逻运算都在栈顶进行
指令格式
f l a
f :
操作码
l : 层次差 (标识符引用层减去定义层)
a : 不同的指令含义不同
PL/0 程序和目标代码示例
const a=1 0;
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.
( 0) jmp 0 8 转向主程序入口
( 1 ) jmp 0 2 转向过程p入口
( 2) int 0 3 过程p入口,为过程p开辟空间
( 3) lod 1 3 取变量b的值到栈顶
( 4) lit 0 1 0 取常数1 0到栈顶
( 5) opr 0 2 次栈顶与栈顶相加
( 6) sto 1 4 栈顶值送变量c中
( 7) opr 0 0 退栈并返回调用点(1 6)
( 8) int 0 5 主程序入口开辟5个栈空间
( 9) opr 0 1 6 从命令行读入值置于栈顶
(1 0) sto 0 3 将栈顶值存入变量b中
(11 ) lod 0 3 将变量b的值取至栈顶
(1 2) lit 0 0 将常数值0进栈
(1 3) opr 0 9 次栈顶与栈顶是否不等
(1 4) jpc 0 24 相等时转(24)(条件不满足转)
(1 5) cal 0 2 调用过程p
(1 6) lit 0 2 常数值2进栈
(1 7) lod 0 4 将变量c的值取至栈顶
(1 8) opr 0 4 次栈顶与栈顶相乘(2*c)
(1 9) opr 0 1 4 栈顶值输出至屏幕
(20) opr 0 1 5 换行
(21 ) opr 0 1 6 从命令行读取值到栈顶
(22...