project

project - PL/0 1.1 PL/0 PL/0 Pascal Pascal Niklaus Wirth...

Info iconThis preview shows pages 1–4. Sign up to view the full content.

View Full Document Right Arrow Icon
1 附录 附录一 PL/0 语言及其实现 1.1 PL/0 语言简介 PL/0 语言是 Pascal 语言的一个子集,是 Pascal 语言的设计者 Niklaus Wirth 在其专著 Algorithms + Data Structures = Programs 一书(译著书名:算法+数据结构=程序)中给出的。 PL/0 是一个小巧的高级语言。虽然它只有整数类型,但它是相当完全的可嵌套的分程 序( block )的程序结构,分程序中可以有常量定义、变量声明和无参过程声明,过程体又 是分程序。 PL/0 有赋值语句、条件语句、循环语句、过程调用语句、复合语句和空语句。 由于上面这些语言概念已为大家熟知,因此不再进行语义解释。下面用习题 3.7 所介绍 的扩展方式来给出 PL/0 语言的文法。 Program Block . B l o c k [ConstDecl] [VarDecl][ProcDecl] Stmt ConstDecl const ConstDef {, ConstDef} ; ConstDef ident = number VarDecl var ident {, ident } ; ProcDecl procedure ident ; Block ; { procedure ident ; Block ;} S t m t ident := Exp | call ident | begin Stmt {; Stmt} end | if Cond then Stmt | while Cond do Stmt | ε Cond odd Exp | Exp RelOp Exp R e l O p = | <> | < | > | <= | >= E x p [+ | ] Term {+ Term | Term} T e r m Factor { Factor | / Factor} Factor 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;
Background image of page 1

Info iconThis preview has intentionally blurred sections. Sign up to view the full version.

View Full DocumentRight Arrow Icon
2 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. 1.2 PL/0 语言编译器 在《算法+数据结构=程序》一书中, Niklaus Wirth 设计的 PL/0 语言编译器分成两部 分,把源语言翻译成中间语言的编译器和中间语言解释器,编译器用的是递归下降的预测分 析方法,并且用 3.3.6 节介绍的紧急方式的错误恢复方法。 中间语言是一种栈机器代码,其指令集是根据 PL/0 语言的需要来设计的。它包括下列 指令: 1 lit :将常数装入栈顶的指令; 2 lod :将变量的值装入栈顶的指令; 3 sto :对应于赋值语句的存储指令; 4 cal :对应于过程调用的指令; 5 int :增加栈顶寄存器的值,完成对局部变量的存储分配的指令;
Background image of page 2
3 6 jmp jpc :对应条件语句和循环语句的无条件转移和条件转移的控制转移指令;
Background image of page 3

Info iconThis preview has intentionally blurred sections. Sign up to view the full version.

View Full DocumentRight Arrow Icon
Image of page 4
This is the end of the preview. Sign up to access the rest of the document.

This note was uploaded on 06/16/2011 for the course CS 2435 taught by Professor Chenyiyun during the Spring '10 term at USTC.

Page1 / 23

project - PL/0 1.1 PL/0 PL/0 Pascal Pascal Niklaus Wirth...

This preview shows document pages 1 - 4. Sign up to view the full document.

View Full Document Right Arrow Icon
Ask a homework question - tutors are online