当前位置:文档之家› 程序设计语言常用语法与翻译

程序设计语言常用语法与翻译

信息学院软件工程教研室
4.2 三地址代码



三地址代码是由下面一般形式的语句构成的序列。 x:=y op z 其中x、y、z是变量名或编译时产生的临时变量名; y、z还可以是常数;op代表某种操作符。这种中间 语言的特点有两个。 (1)非常接近汇编语言形式,包括汇编语言中最基 本的操作。 (2)每个语句中赋值号的右边只有一个操作符,使 得句子意义最小且不可分。例如,源语言表达式 x+y*z可被翻译成如下的句子序列: T1:=y*z T2:=x+T1
S
N

→ →→
M |N
if ( E) M else M
M
if ( E)S |if ( E)M elseN
这个文法用非终结符M单独定义可嵌套的 if…else语句。它是无二义的,只是有些累赘, 也不太容易理解。实际上,并不是所有的语句 文法一定会存在悬挂,有些语言的设计就避免 了这个问题。如果所有的语句都有结尾,或其 他类似符号结尾,就不存在这个问题了。
信息学院软件工程教研室

无二义的表达式文法一般定义为:
E EaddopT |T |E addop |
F
H
H F |H


mulop *| /
无论采用哪一种文法形式,只要最终语 句的意义是确定、不含糊的,并且是统 一的,那么同一个语句所对应的抽象语 法树就是相同的。


信息学院软件工程教研室


( E)|i
4.3.2 赋值语句

赋值语句的文法最简单,定义为:
S
id =E
其中,是一个名字,它表示各种类型的变 量,包括下标变量(数组)。“=”是赋 值号,E是表达式,赋值语句的语义是把 赋值号右边表达式的值放到赋值号左边 名字所指的地址中去。
信息学院软件工程教研室
信息学院软件工程教研室
上图所示是语句抽象语法树的结构。 这是一棵有三棵子树的抽象语法树, 最左边的子树是表达式, 这里一般都是关系表达式和逻辑表达 式, 但是有些C语言里也用算术表达式。 最右边的子树是可选句子, 所以用虚线连接。 信息学院软件工程教研室
4.3.4 循环语句

循环语句也有各种不同的情况,但实质 是一样的,其一般的语法形式也很简单, 如下:



(1)若E是高级语言中的一个变量或常数,则E 的逆波兰表示式仍是E。 (2)若高级语言中的表达式为E1 op E2,其中, op是一个二元算符,E1、E2也是表达式,则逆 波兰式表示为E1 'E2' op,其中,E1'是E1的逆波 兰式,E2'是E2的逆波兰式。 (3)若高级语言中的表达式为(E),则逆波 兰表示式为去掉括号的E',E'为E的逆波兰表示 式。



4.3.1 表达式语法(算术) 4.3.2 赋值语句 4.3.3 if语句 4.3.4 循环语句 4.3.5 说明语句 4.3.6 函数的定义与调用 4.3.7 程序语句序列文法
信息学院软件工程教研室
4.3.1 表达式语法(算术)


根据算术表达式的定义,一般算术表达式记为 E,其文法被定义为: E→E op E (op 为双目操作符) E→op E (op 为单目操作符) E→D|id (D为数字,id为标识符号)
S while ( E)S

对应的抽象语法树如图所示。

信息学院软件工程教研室

说明语句用以定义各种名字的数据类型。与 表达式和控制语句不同的是,说明语句不会 被翻译成可执行代码,因此也不会被翻译成 中间代码。说明语句实质是为名字确定存储 空间或过程、函数的起始地址。说明语句也 可以生成语法树,通过语法树来确定各个名 字的类型。由于说明语句没有嵌套,所以没 有层次。因此它的抽象语法树蜕化成一个链 表。所谓类型,其实质就是存储控制。
第四章 程序设计语言常用的 语法与翻译方法
信息学院软件工程教研室
4.1 逆波兰表示法


逆波兰表示表达式 ab* ab*c+ abcd/+* ab*cd*+
高级语言表示表达式 a* b a*b+c a*(b+院软件工程教研室

高级语言表达式E的逆波兰表示法可这样定义:
信息学院软件工程教研室

三地址代码的语句形式可分为两类: 一类是带有各种运算操作的赋值语句 第二类是转移语句

三地址码语句可看成是一种中间代码的 抽象形成,在编译程序中,三地址代码 的具体实现常以记录的形式表示,通常 有3种表示方法:四元式、三元式、间接 三元式
信息学院软件工程教研室
4.3 程序设计语言常用语法

信息学院软件工程教研室

考虑以下符号串:
其中,符号E1、E2、S1、S2都是由终结 符组成的符号串。 这个串有两个分析树
该语法树把看 作与其最近的 同属一层 该语法树把 看作与整句 之首的同属 一层
if ( E) if ( E 2)S 1 else S 2


信息学院软件工程教研室

改写的文法如下:


对赋值语句文法定义的句子而言,相应 的抽象语法树如图所示。
信息学院软件工程教研室
4.3.3 if语句

if语句是控制语句的一种,它的文法被定 义为:
S if ( E)S | if ( E)S else S

这个语法有两个候选式,这两个候选式 的前半部分是一样的,即:。也就是说, 在一个符号串之后可能紧跟一个或跟其 他的符号串。由于可选的影响,这个文 法有二义性的,即所谓“悬挂问题”。

这是一个无法直接使用的二义性文法,必须使 用前述两种消除二义性文法的策略将文法中的 二义性表达加以限制或改写。
信息学院软件工程教研室

对这种表达式保留文法的二义性也有好 处。不过在作语法分析时要规定算符间 的优先关系和结合顺序,这样才能确定 语句的最终意义。这就是常用于表达式 语法分析的算符优先分析法。
信息学院软件工程教研室

语句又称分支语句。在C中,它的语义是 根据表达式的值决定是否执行语句S或执 行两个语句S中的某一个。仔细分析一下 语句的符号串,真正有可执行意义的符 号只有E和S两个非终结符,其他终结符 只是标记符号串的结构形式。因此,在 建立抽象语法树的时候,我们可以摆脱 那些没有意义的符号。
相关主题