当前位置:
文档之家› (优选)程序设计语言常用语法与翻译
(优选)程序设计语言常用语法与翻译
if…else语句。它是无二义的,只是有些累赘, 也不太容易理解。实际上,并不是所有的语句 文法一定会存在悬挂,有些语言的设计就避免 了这个问题。如果所有的语句都有结尾,或其 他类似符号结尾,就不存在这个问题了。
语句又称分支语句。在C中,它的语义是
根据表达式的值决定是否执行语句S或执 行两个语句S中的某一个。仔细分析一下
→S id=E源自其中,是一个名字,它表示各种类型的变
量,包括下标变量(数组)。“=”是赋
值号,E是表达式,赋值语句的语义是把
赋值号右边表达式的值放到赋值号左边
名字所指的地址中去。
对赋值语句文法定义的句子而言,相应 的抽象语法树如图所示。
→
4.3.3 if语句
if语句是控制语句的一种,它的文法被定 义为:
语句的符号串,真正有可执行意义的符
号只有E和S两个非终结符,其他终结符
只是标记符号串的结构形式。因此,在
建立抽象语法树的时候,我们可以摆脱 那些没有意义的符号。
上图所示是语句抽象语法树的结构。 这是一棵有三棵子树的抽象语法树, 最左边的子树是表达式,
这里一般都是关系表达式和逻辑表达 式, 但是有些C语言里也用算术表达式。 最右边的子树是可选句子, 所以用虚线连接。
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 为双目操作符)
4.3.7 程序语句序列文法
程序是由语句序列组成的,语句序列的 文法可表示为: Q S; Q|S
这是用分号分隔开的语句序列。由于语 句间的并列意义,故仍以链表表示为最 好,对应的结构如下图所示。
→
其中,三角形表示潜在的子树。
由前文可知,各种各样的语句经语法分析 后都有与之对应的语法树。
其中,符号E1、E2、S1、S2都是由终结
符组成的符号串。
这个串有两个分析树
该语法树把看 作与其最近的
同属一层
该语法树把 看作与整句 之首的同属
一层
→ →→
改写的文法如下:
S M|N
M if(E) M else M
N if (E)S|if (E)M elseN
这个文法用非终结符M单独定义可嵌套的
4.3.4 循环语句
循环语句也有各种不同的情况,但实质 是一样的,其一般的语法形式也很简单, 如下:
S while (E)S
对应的抽象语法树如图所示。
→
说明语句用以定义各种名字的数据类型。与 表达式和控制语句不同的是,说明语句不会 被翻译成可执行代码,因此也不会被翻译成 中间代码。说明语句实质是为名字确定存储 空间或过程、函数的起始地址。说明语句也 可以生成语法树,通过语法树来确定各个名 字的类型。由于说明语句没有嵌套,所以没 有层次。因此它的抽象语法树蜕化成一个链 表。所谓类型,其实质就是存储控制。
(2)若高级语言中的表达式为E1 op E2,其中, op是一个二元算符,E1、E2也是表达式,则逆 波兰式表示为E1 'E2' op,其中,E1'是E1的逆波 兰式,E2'是E2的逆波兰式。
(3)若高级语言中的表达式为(E),则逆波 兰表示式为去掉括号的E',E'为E的逆波兰表示
式。
4.2 三地址代码
→→→
4.1.5 说明语句
名字本身则与存储地址或过程函数入口 地址关联,说明语句的语法为:
D TL T int|float L id, L|id
这里,D可理解为说明语句。T是类型标识集 合,L是变量表,是变量名。说明语句常与符
号表配合使用,所谓符号表就是名字登记表, 那里保存着与名字相关的信息。
T1:=y*z
T2:=x+T1
三地址代码的语句形式可分为两类: 一类是带有各种运算操作的赋值语句 第二类是转移语句
三地址码语句可看成是一种中间代码的 抽象形成,在编译程序中,三地址代码 的具体实现常以记录的形式表示,通常 有3种表示方法:四元式、三元式、间接 三元式
4.3 程序设计语言常用语法
(优选)程序设计语 言常用语法与翻译
4.1 逆波兰表示法
逆波兰表示表达式
ab* ab*c+ abcd/+* ab*cd*+
高级语言表示表达式
a*b a*b+c
a*(b+c/d) a*b+c*d
高级语言表达式E的逆波兰表示法可这样定义:
(1)若E是高级语言中的一个变量或常数,则E 的逆波兰表示式仍是E。
三地址代码是由下面一般形式的语句构成的序列。
x:=y op z
其中x、y、z是变量名或编译时产生的临时变量名; y、z还可以是常数;op代表某种操作符。这种中间
语言的特点有两个。
(1)非常接近汇编语言形式,包括汇编语言中最基 本的操作。
(2)每个语句中赋值号的右边只有一个操作符,使 得句子意义最小且不可分。例如,源语言表达式 x+y*z可被翻译成如下的句子序列:
→ →→
→→
无二义的表达式文法一般定义为:
E EaddopT |T |E
F H F|H
addop |
H (E)|i
mulop *|/
无论采用哪一种文法形式,只要最终语 句的意义是确定、不含糊的,并且是统 一的,那么同一个语句所对应的抽象语 法树就是相同的。
4.3.2 赋值语句
赋值语句的文法最简单,定义为:
S if (E)S | if (E)S else S
这个语法有两个候选式,这两个候选式 的前半部分是一样的,即:。也就是说, 在一个符号串之后可能紧跟一个或跟其 他的符号串。由于可选的影响,这个文 法有二义性的,即所谓“悬挂问题”。
考虑以下符号串:
if (E) if (E2)S1 else S 2
E→op E
(op 为单目操作符)
E→D|id
(D为数字,id为标识符号)
这是一个无法直接使用的二义性文法,必须使
用前述两种消除二义性文法的策略将文法中的 二义性表达加以限制或改写。
对这种表达式保留文法的二义性也有好 处。不过在作语法分析时要规定算符间 的优先关系和结合顺序,这样才能确定 语句的最终意义。这就是常用于表达式 语法分析的算符优先分析法。