(优选)程序设计语言常用语法与翻译

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

E→op E
(op 为单目操作符)
E→D|id
(D为数字,id为标识符号)
这是一个无法直接使用的二义性文法,必须使
用前述两种消除二义性文法的ห้องสมุดไป่ตู้略将文法中的 二义性表达加以限制或改写。
对这种表达式保留文法的二义性也有好 处。不过在作语法分析时要规定算符间 的优先关系和结合顺序,这样才能确定 语句的最终意义。这就是常用于表达式 语法分析的算符优先分析法。
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 EaddopT |T |E
F H F|H
addop |
H (E)|i
mulop *|/
无论采用哪一种文法形式,只要最终语 句的意义是确定、不含糊的,并且是统 一的,那么同一个语句所对应的抽象语 法树就是相同的。
4.3.2 赋值语句
赋值语句的文法最简单,定义为:

S id=E
其中,是一个名字,它表示各种类型的变
量,包括下标变量(数组)。“=”是赋
值号,E是表达式,赋值语句的语义是把
赋值号右边表达式的值放到赋值号左边
名字所指的地址中去。
对赋值语句文法定义的句子而言,相应 的抽象语法树如图所示。

4.3.3 if语句
if语句是控制语句的一种,它的文法被定 义为:
(2)若高级语言中的表达式为E1 op E2,其中, op是一个二元算符,E1、E2也是表达式,则逆 波兰式表示为E1 'E2' op,其中,E1'是E1的逆波 兰式,E2'是E2的逆波兰式。
(3)若高级语言中的表达式为(E),则逆波 兰表示式为去掉括号的E',E'为E的逆波兰表示
式。
4.2 三地址代码
if…else语句。它是无二义的,只是有些累赘, 也不太容易理解。实际上,并不是所有的语句 文法一定会存在悬挂,有些语言的设计就避免 了这个问题。如果所有的语句都有结尾,或其 他类似符号结尾,就不存在这个问题了。
语句又称分支语句。在C中,它的语义是
根据表达式的值决定是否执行语句S或执 行两个语句S中的某一个。仔细分析一下
S if (E)S | if (E)S else S
这个语法有两个候选式,这两个候选式 的前半部分是一样的,即:。也就是说, 在一个符号串之后可能紧跟一个或跟其 他的符号串。由于可选的影响,这个文 法有二义性的,即所谓“悬挂问题”。
考虑以下符号串:
if (E) if (E2)S1 else S 2
(优选)程序设计语 言常用语法与翻译
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。
T1:=y*z
T2:=x+T1
三地址代码的语句形式可分为两类: 一类是带有各种运算操作的赋值语句 第二类是转移语句
三地址码语句可看成是一种中间代码的 抽象形成,在编译程序中,三地址代码 的具体实现常以记录的形式表示,通常 有3种表示方法:四元式、三元式、间接 三元式
4.3 程序设计语言常用语法
4.3.7 程序语句序列文法
程序是由语句序列组成的,语句序列的 文法可表示为: Q S; Q|S
这是用分号分隔开的语句序列。由于语 句间的并列意义,故仍以链表表示为最 好,对应的结构如下图所示。

其中,三角形表示潜在的子树。
由前文可知,各种各样的语句经语法分析 后都有与之对应的语法树。
语句的符号串,真正有可执行意义的符
号只有E和S两个非终结符,其他终结符
只是标记符号串的结构形式。因此,在
建立抽象语法树的时候,我们可以摆脱 那些没有意义的符号。
上图所示是语句抽象语法树的结构。 这是一棵有三棵子树的抽象语法树, 最左边的子树是表达式,
这里一般都是关系表达式和逻辑表达 式, 但是有些C语言里也用算术表达式。 最右边的子树是可选句子, 所以用虚线连接。
4.3.4 循环语句
循环语句也有各种不同的情况,但实质 是一样的,其一般的语法形式也很简单, 如下:
S while (E)S
对应的抽象语法树如图所示。

说明语句用以定义各种名字的数据类型。与 表达式和控制语句不同的是,说明语句不会 被翻译成可执行代码,因此也不会被翻译成 中间代码。说明语句实质是为名字确定存储 空间或过程、函数的起始地址。说明语句也 可以生成语法树,通过语法树来确定各个名 字的类型。由于说明语句没有嵌套,所以没 有层次。因此它的抽象语法树蜕化成一个链 表。所谓类型,其实质就是存储控制。
其中,符号E1、E2、S1、S2都是由终结
符组成的符号串。
这个串有两个分析树
该语法树把看 作与其最近的
同属一层
该语法树把 看作与整句 之首的同属
一层
→ →→
改写的文法如下:
S M|N
M if(E) M else M
N if (E)S|if (E)M elseN
这个文法用非终结符M单独定义可嵌套的
→→→
4.1.5 说明语句
名字本身则与存储地址或过程函数入口 地址关联,说明语句的语法为:
D TL T int|float L id, L|id
这里,D可理解为说明语句。T是类型标识集 合,L是变量表,是变量名。说明语句常与符
号表配合使用,所谓符号表就是名字登记表, 那里保存着与名字相关的信息。
三地址代码是由下面一般形式的语句构成的序列。
x:=y op z
其中x、y、z是变量名或编译时产生的临时变量名; y、z还可以是常数;op代表某种操作符。这种中间
语言的特点有两个。
(1)非常接近汇编语言形式,包括汇编语言中最基 本的操作。
(2)每个语句中赋值号的右边只有一个操作符,使 得句子意义最小且不可分。例如,源语言表达式 x+y*z可被翻译成如下的句子序列:
相关文档
最新文档