第八章 语法制导翻译和中间代码生成

合集下载

第8章语法制导翻译与中间代码生成ppt课件

第8章语法制导翻译与中间代码生成ppt课件
E.val=2 + E.val=4 n.lex=2 ( E.val=4 )
E.val=3 + E.val=1 n.lex=3 n.lex=1
例8.1 一个简单台式计算器的定义 综合属性val
产生 式
LE
E E1+T
ET T T1 * F TF
F (E) F digit
语 义 规 那么 Print(E.val)
r1 = [fp - 4] r2 = [r1 + 2] r3 = [fp - 8] r4 = r3 * 20 r5 = r4 + r2 r6 = 4 * r5 r7 = fp – 216 f1 = [r7 + r6]
8.3.1 逆波兰式
运算符跟在一切运算对象的后面的表 示法写出的式子称为后缀法或逆波兰 法。
#
.
a.
(b+c/d)#
* #
.
a.
b+c/d)#
( * #
.
ab.
+c/d)#
( * #
.
ab.
c/d)#
+ ( * #
.
abc.
/d)#
+ ( * #
.
abc.
d)#
/ + ( * / + ( * #
.
abcd/.
)#
+ ( * #
.
abcd/+.
)#
( * #
〔3〕一致性检查。在很多场所要求对象只能被 定义一次。例如Pascal言语规定同一标识符在一 个分程序中只能被阐明一次,同一case语句的标 号不能一样,枚举类型的元素不能反复出现等等。
〔4〕上下文相关性检查。比如,变量名字必 需先声明后援用;

语法制导翻译和中间代码生成

语法制导翻译和中间代码生成

A ∨ B→if A then true else B A ∧B→if A then B else false ┐ A →if A then false else true
这种翻译法涉及到如何翻译if-thenelse的问题,将在下面具体讨论。
33
控制语ห้องสมุดไป่ตู้中布尔表达式的翻译
if E then S1 else S2,其中E为布尔式
第8章 语法制导翻译和中间代码生成
经过词法分析、语法分析后,源程序 在静态结构上的正确性得到了保证,编译 程序接着要对源程序进行静态语义检查和 翻译。 语义检查:类型检查、控制流检查、 一致性检查等。 翻译:源程序→中间代码
1
本章主要内容
1. 属性文法 2. 语法制导翻译概念 3. 中间代码的几种形式 4. 几个语句的翻译:如赋值语句、条件语 句等。
26
翻译 a:= -b+c*d

t1:=uminus b t2:=c*d t3:=t1+t2
a
:=
E1

+ E2 E 21 c *
a:=t3

E 11 b
E 22 d
27
类型转换
如:X := Y + I * J,X,Y为实型,I,J为整型, 则相应的四元式序列应为: – (*i , I , J , T1 ) – ( itr , T1 , _ , T2 ) – ( +r , Y , T2 , T3 ) – ( := , T3 , _ , X )
23
四元式
1. 四元式对中间结果的引用必须通过 给定的名字,而三元式是通过产生中间结 果的三元式编号。四元式之间的联系是通 过临时变量实现的。 2. 四元式出现顺序与原表达式计算顺 序一致。(同三元式)

编译原理-语法制导翻译和中间代码生成

编译原理-语法制导翻译和中间代码生成

例:类型、运算、维数、越界
–语义处理:
执行真正的翻译,生成程序的中间代码目标代码。
–例:变量的存储分配
–例:表达式的求值
–例:语句的翻译(中间代码的生成)
3
8.1 属性文法
• 语义分析的描述 –描述语法规则的同时,编写相应的语义 动作和计算顺序
• 语义的形式化描述 –操作语义学、公理语义学、指称语义学
例8-3 3*5+4 的 语法树与属性计算
T.val=3 F.val=3 digit.lexval=3
E.val=15 T.val=15

L Print(19)
E.val=19 +
T.val=4
F.val=4
F.val=5
digit.lexval=4
dgit.lexval=5
19
T.type=real
• 继承属性 – 从其兄弟结点和父结点的属性值计算出来的 – 如:L.in
• 固有属性(单词属性)
17
属性的计算
• 语法制导翻译:作语法分析,构造语法树,然 后在树的每个结点上添加相应的语义规则
• 综合属性 – 自底向上按照语义规则来计算各结点的综合 属性值
• 继承属性 –需要探讨计算次序
18
文法
E→ -E1 E.p:= mknode('-', 0, E1.p)
E→ (E1) E.p:= E1.p E→ id E.p:= mkleaf(id, id.entry) E→ num E.p:=mkleaf(num,num.val)
37
生成后缀式的属性文法
产生式
语义规则
S→id:=E Print( || E.code || “:=”)

讲稿第8章 语法制导翻译和中间代码生成

讲稿第8章 语法制导翻译和中间代码生成

第8章语法制导翻译和中间代码生成(3学时,15分钟)编译程序的任务是把源程序翻译成目标程序,这个目标程序必须和源程序的语义等同,也就是说,它们的语法结构可以不同,但表达的结果应完全相同。

通常,在语法分析过程中,每当一个产生式获得匹配(自上而下分析)或用于归约(自下而上分析)时,就执行相应于该产生式的语义子程序进行语义处理,这个过程就是语法制导翻译。

编译中的语义处理是指两个功能:第一,审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义,也称为静态语义检查或静态审查。

动态语义检查需要生成相应的目标代码,在运行时进行。

静态语义检查主要涉及以下几个方面:(1)类型检查,如参与运算的操作数及类型应相容。

(2)控制流检查,用以保证控制语句有合法的转向点。

如C语言中不允许goto转入case语句流;break语句需要寻找包含它的最小switch、while或for语句方可找到转向点,否则出错。

(3)一致性检查,如在相同作用域中标识符只能说明一次、case 语句的标号不能相同等。

第二,如果静态语义正确,语义处理的工作是要执行真正的翻译,即生成程序的一种中间表示形式(中间代码),或者直接生成实际的目标代码。

虽然源程序可以直接翻译为目标语言代码,但是通常编译程序还是采用了独立于机器的、复杂性介于源语言与机器语言之间的中间语言。

这样做的好处是:(1)便于进行与机器无关的代码优化;(2)使编译程序改变目标机更容易;(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。

静态语义检查和中间代码产生在编译程序中的位置如图所示:需要指出的是:从单词符号序列的源程序到某种形式的中间代码,不像词法分析和语法分析那样有一套形式化的理论和算法(如自动机等),尽管已经有了一些形式语义系统,但大都没有得到公认。

这就是说,语义的形式化描述要远比语法的形式化困难得多。

目前较为常见的是用属性文法作为描述程序语言语义的工具,并采用语法制导翻译的方法完成对语法成分的翻译工作。

第八章语法制导翻译和中间代码生成

第八章语法制导翻译和中间代码生成
但文法开始符号没有继承属性。 终结符只有综合属性。
继承的和综合的属性
属性文法中,对应每一个产生式 A 都有 一套与之相关联的语义规则,每条规则的形 式为:b:=f(c1,c2,……,ck) 其中:f是一个函数,b和c1,c2,……,ck是该 产生式文法符号的属性。
(1)如果b是A的一个属性, c1,c2,……,ck是产 生式右部文法符号的属性或A的其它属性, 则称b是A的综合属性。
To relate each applied occurrence of an identifier in the source program to the corresponding declaration.
语义学
语义形式化、语义建模 文法模型—属性文法 命令式或操作式模型—操作语义学 公理式模型—公理语义学 应用式模型—指称语义学 目前在实际应用中比较流行的语义描述和语
语义规则
D TL T int T real L L1,id
L.in:=T.type T.type=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in)
L id
addtype(id.entry,L.in)
继承属性
一个结点的继承
Real id1,id2,id3
属性文法
使用 N.t 的形式表示与非终结符N相连的属 性t。
T.t的值为int或bool。 与非终结符E的产生式相连的断言表明:两
个T的属性必须相同。
继承的和综合的属性
属性通常分为两类:综合属性和继承属性 综合属性用于“自下而上”传递信息, 继承属性用于“自上而下”传递信息。 非终结符既可有综合属性也可有继承属性,
语义规则 Print(E.val) E.val:=E1.val+T.val E.val:=T.val T.val:=T1.val F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval

ch8-语法制导翻译和中间代码生成(1)

ch8-语法制导翻译和中间代码生成(1)
常用属性文法描述程序语言语义;采用语法制导翻译方 法对语法成分进行翻译。 语法制导翻译法就是为每个产生式配上一个语义子程 序,在语法分析过程中,在选用某个产生式的同时,执行
该产生式所对应的语义子程序来进行翻译的一种办法。
6
8.1 属性文法
1、文法的属性
属性是常用于描述事物或人的特征、性质或品质等。 在上下文无关文法中,为每个文法符号(终结符或非终结符) 例如:物体可以用颜色属性描述。 引入若干“值”(称为属性)。属性代表与文法符号相关 的信息,属性可以是类型、值、代码序列、符号表内容 (入口)等。属性可计算或传递。属性的加工过程即是语 义处理的过程。 对于文法的每个产生式都加入了一组属性的计算规则-语 义规则。
25
依赖图举例
假设A.a=f(X.x,Y.y)是对应于产生式A->XY的一个语 义规则,它确定了依赖于属性X.x和Y.y的综合属性A.a。 若在语法树中应用这个产生式,则在依赖图中会有三个结 点A.a、 X.x和Y.y。由于A.a依赖于X.x,所以有一条有向 边从X.x连到A.a;由于A.a依赖于Y.y ,所以有一条有向 边从Y.y连到A.a。 若 与 产 生 式 A - >XY 对 应 的 语 义 规 则 还 有 X.i=g(A.a,Y.y),则图中还有两条有向边,一条从A.a连到 X.i,另一条从Y.y连到X.i。
2
静态语义分析包括的主要内容-2
3)一致性检查。在很多场合要求对象只能被定义一次。例 如 Pascal语言规定同一标识符在一个分程序中只能被说 明一次,同一case语句的标号不能相同,枚举类型的元素 不能重复出现等等。 4)相关名字检查。有时,同一名字必须出现两次或多次。 例如,在Ada 语言程序中,循环或程序块可以有一个名字 出现在这些结构的开头和结尾,编译程序必须检查这两个 位臵用的名字是否相同。 5)名字的作用域分析

课件:第8章语法制导翻译和中间代码生成

课件:第8章语法制导翻译和中间代码生成
都从下标1开始
确定标识符类型的语义描述
(1)P→D;E
(2)D→D;D
(3)D→id:T {addtype (id. Entry, T. type)}
(4)T→char {T. Type:= char}
(5)T→integer {T. Type:= integer}
(6)T→↑T1
{T. Type:= pointer (T1. type)}
}

expr3; goto loop out: ...
公理语义
公理语义概念是随着程序正确性的证明而发展的。当
正确性证明能构造时表明程序执行它的规格说前之后都有一个逻辑 表达式对程序的变量进行约束,以此说明这个语句的含义。
一般的记号 {P} S {Q}
程序正确性的证明 什麽是它的规格说明S 明S,开发实现此规格说明的程序P 功能吗
静态语义审查
(1)类型检查。根据类型相容性要求,验证程序中执行的每个操 作是否遵守语言的类型系统的过程,编译程序必须报告不符合类 型系统的信息。
(2)控制流检查。控制流语句必须使控制转移到合法的地方。例 如,在C语言中break语句使控制跳离包括该语句的最小while、for 或switch语句。如果不存在包括它的这样的语句,则就报错。
(7)T→array [num]of T1
{T. Type: = array (num.Val, T1.type)}
类型检查的语义描述
S→id:=E { if id.Type = E.Type
Then S.Type := void
else S.Type := type_ error}
S→if E then S1
属性文法
表达式文法 E—>T+T| T or T T—>n | b

第八章_3语法制导翻译和中间代码生成-中间代码生成

第八章_3语法制导翻译和中间代码生成-中间代码生成

8.5
控制语句中布尔表达式的翻译
1
控制语句 S→ if E then S E 的代码 E.true: S 1 的代码 goto out S 2 的代码 out:
else S 2 E.true E.false
E.false:
. 把条件转移的布尔表达式翻译成仅含 把条件转移的布尔表达式翻译成仅含 和无条件转 条件真转 (jrop,B,C,L) 和无条件 转 (jump,_,_,L)的四元式 E =a rop b ⇒ if a rop b goto E.true goto E.false 如 :a<b or c<d and e<f 翻译成如下四元式: 可 翻译成如下四元式: (1) if a<b goto E.true (2) goto (3) (3) if c<d goto (5) (4) goto E.false (5) if e<f goto E.true (6) goto E.false
• 高级:最接近高级语言,保留了大部分源语言 的结构。 • 中级:介于二者之间,与源语言和机器语言都 有一定差异。 • 低级:最接近机器语言,能够反映目标机的系 统结构,因而经常依赖于目标机。
不同层次的中间代码
源语言 高级语言) (高级语言)
float a[10][20]; a[i][j+2];
中间代码 高级) (高级)
逆波兰 : 四元式 : ABCD-*+ECD–N^/+ (1) ( C D T1 D N T5 T1 ) T2) T4) T5) T6) T7)
(2) ( * B (3) ( + A (4) ( (6) ( / C E (5) ( ^ T4
T2 T3)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

5
2015-11-14
9-5+2的带语义动作的分析树 例 一个简单的翻译模式 E→TR R→addop T{print(addop.lexeme)}R1|ε T→num{print(num.val)} 输入9-5+2,其分析树如下页图,当按深度优 先遍历它,执行遍历中访问的语义动作,将 输出结果是什么? 它输出结果是:9 5 - 2 + 它是输出表达式9-5+2的后缀式。
只要遵守运算对象后直接紧跟它们的运算符的规 则即可。 比如把转语句GOTO L写为“L jump ", 运算对象L为语句标号,运算符jump表示转到某个标号 L 。 再比如条件语句if E then S1 else S2 可表示为:E S1 S2 ¥,把if then else看成三目运 算符,用¥来表示。
1
2015-11-14
属性文法
附加了一组属性和运算(语义)规则的文法 语义信息
属性文法的定义:
一个属性文法是一个三元组: A=(G,V,F), G: 是一个上下文无关文法 V: 有穷的属性集,每个属性与文法的一终结符 或非终结符相连。 F: 关于属性的属性断言或谓词集.每个断言与 一个产生式相联。一个断言就是一个语义 规则, 描述各属性的关系。 用法: 针对语义:为每个符号设置一个属性,终结符号用单 词属性。 为每个产生式设置语义规则——描述各属性的关系。
只使用综合属性.
L E E T T F i 3
3*5+4的分析树
产生式
L E
语 义 规 则 print(E.val) E.val=E1.val+T.val E.val=T.val T.val=T1.val F.val T.val=F.val F.val=E.val F.val=i.lexval
L E E E1+T
ET T T 义 规 则 print(E.val) E.val=E1.val+T.val E.val=T.val T.val=T1.val F.val T.val=F.val F.val=E.val F.val=i.lexval
D T int L id1
L , id2
8.3 语法制导翻译
几点说明:
1、文法非终结符既可有综合属性,也可有继承属性; 2、开始符号没有继承属性; 3、终结符只有综合属性,由词法分析器提供。
语法制导翻译:将语义规则与语法规则相结合,在 语法分析的过程中通过执行语义动作,计算语义属 性值,从而完成预定的翻译工作。
语法制导翻译分为两种处理方法:
(1)自底向上的翻译:(只有综合属性)
对每个产生式编制一个语义子程序,在进行语法分析的过 程中,当一个产生式获得匹配时,就调用相应的语义子程 序实现语义检查与翻译。这种实现方案隐藏了其中语义规 则的计算次序等实现细节。
综合属性
继承属性
(2)自顶向下翻译(含有继承属性):
+ F i 4
T F i 5
*
通常使用自底向上的分析方法 在每个结点处使用语义规则来计算综合属性 值 当一个产生式获得匹配时,就调用相应的语 义子程序从叶结点到根结点进行计算
E E1+T ET T T1 * F TF F (E) Fi
2
2015-11-14
句子 int id1,id2 的语法树,使用 情况。
1. 属性的表示
文法符号X的属性t常用X.t来表示
语义之间的关系
2.语义规则的表示
语义规则用花括号{ }括起来,可被插入到 产生式右部的任何合适的位置上。 不同的产生式对应不同的语义规则 不同的分析目标也对应不同的语义规则
属性分为两种
例 综合属性
继承属性和综合属性
产生式
综合属性:在语法树中,一个结点的综合属性由 该结点的子结点的属性值确定。它的计算规则由 底向上. 继承属性:在语法树中,一个结点的继承属性由 该结点的 父结点/兄弟结点的属性确定。
逆波兰记号
逆波兰记号是最简单的一种中间代码表示 形式。 这种表示法将运算对象写在前面,把运 算符号写在后面,比如把a+b写成ab+, 把a*b写成ab*,用这种表示法表示的表 达式也称做后缀式。
常见的中间代码形式: 后缀式 三地址代码(四元式、三元式和间接三元式 ) 图形(抽象语法树等)
中缀表示 后缀表示 a+b ab+ a+b*c abc*+ (a+b)*c ab+c* a:=b*c+b*d abc*bd*+:= 特点 1、运算对象出现的顺序和原有顺序(从左到右)相同 2、运算符按实际计算顺序(从左到右)出现 3、运算符紧跟在运算对象的后面出现,且没有括号 优点:简明、便于计值
后缀表示法表示表达式,其最大的优点是易于计算机处理 表达式。 常用的算法是使用一个栈,自左至右扫描算术表达式(后 缀表示),每扫描到运算对象,就把它推进栈;扫描到运 算符,若该运算符是二目的,则对栈顶部的两个运算对象 实施该运算,并将运算结果代替这两个运算对象而进栈; 若是一目运算符,则对栈顶元素执行该运算,并以运算结 果代替该元素进栈,最后的结果留在栈顶。
在产生式右部的适当位置,插入相应的语义动作,即语义 规则或语义动作用花括号{ }括起来,可被插入到产生式 右部的任何合适的位置上。 自底向上 传递信息 自顶向下(自左 向右)传递信息
3
2015-11-14
print(E.val)打印由E产生的算术表达式的值, 可认为这条规则定义了L的一个虚属性。
一般的属性文法的翻译器是很难建立的,然 而有一大类属性文法的翻译器是很容易建立 的,那就是L-属性文法。 首先介绍L-属性文法的特例S-属性文法。 S-属性文法是:仅包含综合属性的属性文法。 如:算术表达式求值的属性文法 S-属性文法的翻译器可以借助LR分析器实现。
2+3*4的注释分析树
非L-属性的文法制导定义 产生式 语义规则 L.i:=l(A.i) ALM M.i:=m(L.s) A.s:=f(M.s) R.i:=r(A.i) A QR Q.i:=q(R.s) A.s:=f(Q.s) 表中的语法制导定义不是L-属性定义 文法符号Q的继承属性依赖于它右边文法符 号R的属性
例 综合属性
产生式 L E E T T F F E E1+T T T1 * F F (E) i 语 义 规 则 print(E.val) E.val=E1.val+T.val E.val=T.val T.val=T1.val F.val T.val=F.val F.val=E.val F.val=i.lexval
8.2 属性文法
属性文法: 属性: 所谓属性,用以描述事物或人的特征、性 质,品质等等。比如,谈到一个物体,可 以用“颜色”描述它,谈起某人,可以使 用“有幽默感“来形容他。 对一个文法,文法中的每个符号都有属性, 可以用"类型"、"值"或"存储位置"来描述 它。
实际应用中比较流行的语义分析方法: 基于属性文法的语法制导翻译方法
2015-11-14
第8章
语法制导翻译和中间代码生成
编译中的语义处理是指两个功能
§8.1概述
一、语义处理的任务: 根据语义规则对识别出的各种语法成分析其 含义,进行初步翻译,生成相应的中间代码 或直接生成目标代码。 语法分析 后的源程序 语义处理 中间代码 或目标代 码
第一
第二
静态语义分析或静态审查。
6
2015-11-14
逆波兰表示很容易扩充到表达式以外的范围。
例如 B@CD*+(它的中缀表示为-B+C*D,使用 @表示一目减)的计值过程为: 1. B进栈; 2. 对栈顶元素施行一目减运算,并将结果代替 栈顶,即-B置于栈顶; 3. C进栈; 4. D进栈; 5. 栈顶两元素相乘,两元素退栈,相乘结果置栈 顶; 6. 栈顶两元素相加,两元素退栈,相加结果进 栈,现在栈顶存放的是整个表达式的值。
可以看出,按深度优先遍历输入串aa的语法树,当要打印 属性A.in时,该属性还没有定义。也就是说,从S开始按 深度优先遍历A1和A2子树之前,A1.in和A2.in的值还 未赋值。 S A1 A2 A1.in:=1;A2.in:=2 Print(A.in)
a Print(A.in) a
a Print(A.in) a
其属性可用深度优先的顺序从左至右计算
E T 9
Pt(´9´)
E→TR R→addop T{print(addop.lexeme)}R1|ε T→num{print(num.val)}
R R
Pt(´-´)
T 5
输出: 95-2+
R + T
Pt(´+´)
Pt(´5´)

2
Pt(´2´)
中间代码
中间代码:一种介于源语言和目标语言之间的中间语言形式
L-属性文法的例子 产生式 D TL T int T real L L1,id L id 语 义 规 则 L.in:=T.type T.type=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in )
表示属性的传递
与L产生式相联的语义规则中有一个过程调用 addtype,过程addtype的功能是把每个标识 符的类型信息登录在符号表的相关项中。
产生式 D TL T int T real L L1,id L id
语 义 规 则 L.in:=T.type T.type=integer T.type:=real L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in )
D T int L id1
相关文档
最新文档