PL/0语言编译程序整理实现:(1)、语法描述EBNF

unit uGrammar_EBNF;

interface
(*
  语法描述EBNF


<程序> ::= <分程序>.

<分程序> ::=  [<常量声明部分>]  [<变量声明部分>]  [<过程声明部分>]  <语句>

<常量声明部分> ::= CONST <常量定义序列> ;{<常量定义序列> ;}
<常量定义序列> ::= <常量定义> {,<常量定义>}
<常量定义> ::= <标识符>  = <无符号整数>
<无符号整数>  ::= <数字> {<数字>}

<变量声明部分> ::= VAR <变量定义序列>;{<变量定义序列>;}
<变量定义序列> ::= <标识符> |<数组> {,<标识符> |<数组>}
<数组> ::= <标识符>'[' <无符号整数> ']'
<标识符> ::= <字母>{<字母> |<数字>}

<过程声明部分> ::= <过程首部> <分程序> { ; <过程声明部分>};
<过程首部> ::= PROCEDURE <标识符>;

<语句> ::=< 赋值语句> | <条件语句> | <当型循环语句> | <REPEAT循环语句> | <过程调用语句> | <读语句>  | <写语句> | <复合语句> | <空>
<赌值语句> ::= <标识符> | <数组>  := <表达式>
<条件语句> ::= IF <条件> THEN <语句> [ ELSE <语句> ]
<当型循环语句> ::= WHILE <条件>  DO <语句>
<REPEAT循环语句> ::= REPEAT <语句> {;<语句>} UNTIL <条件>
<过程调用语句> ::= CALL <标识符>
<读语句> ::= READ  '(' <标识符> | <数组> {,<标识符> | <数组> } ')'
<写语句> ::= WRITE  '('  <表达式> {,<表达式>}  ')'
<复合语句> ::=  BEGIN <语句>{;<语句>} END

<条件>  ::=  <表达式><关系运算符><表达式>  | ODD <表达式>

<表达式> ::= <+|-> <项>{<加法运算符><项>}
<项> ::= <因子> {<乘法运算符><因子>}
<因子> ::= <标识符> | <数组> | <无符号整数> |  '(' <表达式> ')'

<加法运算符> ::= + | -
<乘法运算符> ::= * | /
<关系运算符> ::=  = | # | < | <= | > | >=

<字母> ::= a | b | …… | X | Y | Z
<数字> ::= 0 | l | 2 | …… | 8 | 9

*)

implementation

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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值