PL/0 语言简介、PL/0 文法

PL/0 语言简介
A. PL/0 语言是 Pascal 语言的子集
   - 数据类型只有整型
   - 标识符的有效长度是 10 ,以字母开头的字母数字串
   - 数最多 14- 过程无参,可嵌套(最多三层),可递归调用
   - 变量的作用域同 Pascal ,常量为全局的

B. 语句类型:
   - 赋值语句: if…then…, whiledo, read, write, call
   - 复合语句: begin …end
   - 说明语句: const, var…, procedure…

C. 13个保留字:
   - If/then, while/do, read/write,
   -  call, begin/end, const, var, procedure, odd
PL/0 程序设计语言是一个较简单的语言,它以赋值语句为基础,构造概念有 顺序、条件和重复(循环)三种。PL/0 有子程序概念,包括过程定义(可以嵌 套)与调用且有局部变量说明。PL/0 中唯一的数据类型是整型,可以用来说明 该类型的常量和变量。当然 PL/0 也具有通常的算术运算和关系运算。
PL/0 文法
PL/0 是一个小巧的高级语言。虽然它只有整数类型,但它是相当完全的可嵌套的分程序(block)的程序结构,分程序中可以有常量定义、变量声明和无参过程声明,过程体又是分程序。PL/0 有赋值语句、条件语句、循环语句、过程调用语句、复合语句和空语句。由于上面这些语言概念已为大家熟知,因此不再进行语义解释。下面用习题 3.7 所介绍的扩展方式来给出 PL/0 语言的文法。

Program → Block  Block → [ConstDecl] [VarDecl][ProcDecl] Stmt ConstDecl → const ConstDef , ConstDef ; ConstDef → ident = number VarDecl → var ident , ident ; ProcDecl → procedure ident ; Block ; procedure ident ; Block ; Stmt → ident := Exp | call ident | begin Stmt ; Stmt end |  if Cond then Stmt | while Cond do Stmt | ε Cond → odd Exp | Exp RelOp Exp RelOp → = | <> | < | > | <= | >= Exp → [+ | − ] Term + Term | − Term Term → Factor ∗ Factor | / Factor Factor → ident | number | ( Exp ) \begin{aligned} &\text{Program → Block }\\ &\text{Block → [ConstDecl] [VarDecl][ProcDecl] Stmt}\\ &\text{ConstDecl → const ConstDef {, ConstDef} ;}\\ &\text{ConstDef → ident = number}\\ &\text{VarDecl → var ident {, ident} ;}\\ &\text{ProcDecl → procedure ident ; Block ; {procedure ident ; Block ;}}\\ &\text{Stmt → ident := Exp | call ident | begin Stmt {; Stmt} end |}\\ &\text{ if Cond then Stmt | while Cond do Stmt | ε}\\ &\text{Cond → odd Exp | Exp RelOp Exp}\\ &\text{RelOp → = | <> | < | > | <= | >=}\\ &\text{Exp → [+ | − ] Term {+ Term | − Term}}\\ &\text{Term → Factor {∗ Factor | / Factor}}\\ &\text{Factor → ident | number | ( Exp )}\\ &\end{aligned} Program → Block Block → [ConstDecl] [VarDecl][ProcDecl] StmtConstDecl → const ConstDef , ConstDef ;ConstDef → ident = numberVarDecl → var ident , ident ;ProcDecl → procedure ident ; Block ; procedure ident ; Block ;Stmt → ident := Exp | call ident | begin Stmt ; Stmt end | if Cond then Stmt | while Cond do Stmt | εCond → odd Exp | Exp RelOp ExpRelOp → = | <> | < | > | <= | >=Exp → [+ | − ] Term + Term | − TermTerm → Factor ∗ Factor | / FactorFactor → ident | number | ( Exp )

其中的标识符 ident 是字母开头的字母数字串,number 是无符号整数,begin、call、const、do、end、if、odd、procedure、then、var、while 是保留字。用 PL/0 语言写的一个程序如下,它有 3 个过程,分别计算两个整数相乘、相除和求最大公约数。
const m=7, n=85;
var x,y,z,q,r;
procedure multiply;
	var a,b;
	begin
		a:=x; b:=y; z:=0;
		while b>0 do
			begin
				if odd b then z:=z+a;
				a:=2*a; b:=b/2;
			end
	end;
----------------------------------------------
procedure divide;
	var w;
	begin
		r:=x; q:=0; w:=y;
		while w<=r do w:=2*w;
		while w>y do
			begin
				q:=2*q; w:=w/2;
				if w<=r then
					begin
						r:=r-w;
						q:=q+1;
					end
			end
	end;
----------------------------------------------
procedure gcd;
	var f,g;
	begin
		f:=x;
		g:=y;
		while f<>g do
			begin
				if f<g then g:=g-f;
				if g<f then f:=f-g;
			end
	end;
begin
	x:=m; y:=n; call multiply;
	x:=25; y:=3; call divide;
	x:=34; y:=36; call gcd;
end.

在这里插入图片描述
在这里插入图片描述

在《算法+数据结构=程序》一书中,Niklaus Wirth 设计的 PL/0 语言编译器分成两部分,把源语言翻译成中间语言的编译器和中间语言解释器,编译器用的是递归下降的预测分析方法中间语言是一种栈机器代码,其指令集是根据 PL/0 语言的需要来设计的。编译器源码及测试程序可从。一条指令由三个域组成: (1)操作码 f:上面已经列出了所有 8 种操作码。 (2)层次差 l:这里的层次差就是 5.3.2 节介绍嵌套深度时的 n p − n a 。该域仅用于存取指令和调用指令。 (3)多用途 a:在运算指令中,a 的值用来区分不同的运算;在其他情况,a 或是一个数(lit,int),或是一个程序地址(jmp,jpc,cal),或是一个数据地址(lod,sto)。 编译器对 PL/0 源程序进行一遍扫描,并逐行输出源程序。在源程序无错的情况下,编译器每编译完一个分程序,就列出该分程序的代码,这由编译器的 listcode 过程完成。每个分程序的第一条指令是 jmp 指令,其作用是绕过该分程序声明部分产生的代码(即绕过内嵌过程的代码)。listcode 过程没有列出这条代码。 解释器是编译器中的一个过程,若源程序无错,则编译结束时调用解释过程 interpret。由于 PL/0 语言没有输出语句,解释器按执行次序,每遇到对变量赋值时就输出该值。 由于 PL/0 语言是过程嵌套语言,因此程序运行时,活动记录栈中每个活动记录需要包含控制链和访问。活动记录栈的栈顶以外的存储空间作为代码执行过程中所需要的计算栈,无需另外设立计算栈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值