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

合集下载

第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)

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

第08章语法制导翻译和中间代码生成
• 如:说明语句的属性文法
17
翻译模式
◆定义
翻译模式是语法制导定义的一种便于翻译的书写 形式。其中属性与文法符号相对应,语义规则或 语义动作用花括号{ }括起来,可被插入到产生 式右部的任何合适的位置上。
这是一种语法分析和语义动作交错的表示法,他 表达在按深度优先遍历分析树的过程中何时执行 语义动作。
–将值 val 作为表达式 E、项 T 和因子 F 的属性
• 用语义规则描述表达式的求值
7
属性文法(语法制导定义)
•L → E
print( E.val )
• E → E1 + T E.val := E1.val + T.val
•E → T
E.val := T.val
• T → T1 * F T.val := T1.val * F.val
33
四元式(三地址代码)
一般形式 x := y op z
–其中 x, y, z 为变量名、常数或编译 产生的临时变量
–四元式(op, x, y, z)
种类:x := y op z
双目运算
x := op y
单目运算
x := y
赋值
if x relop y goto
条件转移
34
a∶=b*c+b*d的四元式表示
a Print(A.in) a Print(A.in)
24
如果计算A1.in和A2.in的值的动作分别被嵌入在产
生式SA1A2 的右部A1和A2之前,而不是后面,
那么A.in在执行Print(A.in)时已有定义。
S {A1in:=1 }A1{A2 in:=2} A2
A a
{ print(A in) }

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

语法制导翻译和中间代码生成
6
例3:变量的类型说明
规则
D TL T int Treal L L1,id
语义规则
L.in:=T.type T //将L.in属性值设置为T.type T.type=integer T.type:=real int L1.in:=L.in addtype(id.entry, L. in)
(后缀)逆波兰: ab*cd+ef-/-
-/* + Nhomakorabeaa b c d e -
f
14
(二)逆波兰表示
1、赋值语句的逆波兰表示 赋值语句 <变量>:=<表达式> 逆波兰表达式 <变量><表达式的逆波兰式>:= 例1: y:=(a+b)*c; yab+c*:= 2、转向语句的逆波兰表示 转向语句:goto <标号> 逆波兰式:<标号> LJ 例2:100:write(’晚上好’); …... goto 100; 逆波兰表示:100LJ
(1)若b是产生式左部A的一个属性,c1, c2, …, ck 是产生式右部符号或A的属性,则b是A的综合属 性。在分析树中,一个结点的综合属性值是从其 子结点的属性值计算出来的。 (2)若b是产生式右部符号X的一个属性, c1, c2, …, ck是A或右部符号的属性,则b 是X的继承属性。在分析树中,一个结点的 继承属性值是由该结点兄弟结点和父结点的 属性值计算出来的
D in 5 L 6 entry 3 , id3 real in 7 L 8 entry , in 9 L 10 id2 2 entry id1 1
9
4 T type
2、简单算术表达式求值: 用一个产生式进行归约时就执行相应的语义动作,在分 析一个句子时,句子的值同时产生。(自下而上分析)

编译原理课后题答案【清华大学出版社】ch8

编译原理课后题答案【清华大学出版社】ch8

如果题目是 S::=L.L | L L::=LB | B B::=0 | 1 则写成: S`::=S {print(S.val);} S::=L1.L2 { S.val:=L1.val+L2.val/2L2.length ;} S::= L { S.val:=L.val; } L::=L1B { L.val:=L1.val*2+B.val; L.length:=L1.length+1; } L::=B { L.val:=B.val; L.length:=1;} B::=0 { B.val:=0; } B::=1 { B.val:=1;}
如采用 LR 分析方法,给出表达式(5*4+8)*2 的语法树并在各结点注明语义值 VAL。
答案:
计算机咨询网()陪着您
5
缄默TH浩的小屋
《编译原理》课后习题答案第八章
采用语法制导翻译思想,表达式 E 的“值”的描述如下:
产生式
语义动作
(0) S′→E
{print E.VAL}
四元式:
100 (+, a, b, t1) 101 (+, c, d, t2) 102 (*, t1, t2, t3) 103 (-, t3, /, t4) 104 (+, a, b, t5) 105 (+, t5, c, t6) 106 (-, t4, t6, t7)
树形:
计算机咨询网()陪着您
计算机咨询网()陪着您
6
缄默TH浩的小屋
《编译原理》课后习题答案第八章
第5题
令 S.val 为下面的文法由 S 生成的二进制数的值(如,对于输入 101.101,S.val=5.625); SÆL.L | L LÆLB | B BÆ0 | 1

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

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

EE1+E2 {E.val := E1.val +E2.val} E(E1) {E.val := E1.val } En {E.val := n.lex} 属性文法的主要思想有两点: 首先对于每个文法符号引进相关的属性符号; 其次对于每个产生式写出属性值计算的规则。
2、属性分类
综合属性:一个结点的属性值是从其子结点的属性值计算 出来的。 继承属性:一个结点的属性值是由该结点兄弟结点和父结 点的属性值计算出来的。
val[top] := val[top]*val[top+2]; val[top] := val[top+1]; val[top] := lexval;
8.3
中间代码的形式
中间代码:源程序的一种内部表示,不依赖目标 机的结构,易于机械生成目标代码的中间表示。
意义:逻辑结构清楚;利于不同目标机上实现同一种语 言;利于进行与机器无关的优化。
例1:定义表达式的文法如下: EE+E E(E) En 给出定义表达式值的属性文法。
为文法符号E引进属性符号val,用E.val表示E的值,属性 计算规则以赋值语句的形式给出,附在每个产生式后,并用大 括号括起来。为了明确E的不同出现位置,用上角标区别。终 结符n的值是词法分析程序提供的,这里用n.lex表示。下面给 出属性文法:
L
Eval:=19 Eval:=15
Tval:=15 +
Tval:=4
Fval:=4
Tval:=3 Fval:=3 digitlexval:=3
*
Fval:=5 digitlexval:=5
例 5 .2
digitlexval:=4
输入:3*5+4
例2:说明语句语法制导定义(属性文法)

第8章语法制导翻译与中间代码生成-PPT精选

第8章语法制导翻译与中间代码生成-PPT精选

3*5+4的带注释的分析树
只使用综合属性.
T.val=3 F.val=3
E.val=15 T.val=15
*
L
E.val=19
+
F.val=5
T.val=4 F.val=4 digit.lexval=4
digit.lexval=5
digit.lexval=3
3*5+4的带注释的分析树
继承属性
一个结点的继承属性值是由此结点的父结点和/或兄弟结 点的某些属性来决定的。
(Intermediate representation)
(Intermediate language)
是源程序的一种内部表示 复杂性介于源语言和目标机语言之间
中间代码的作用:
使编译程序的逻辑结构更加简单明确 利于进行与目标机无关的优化 利于在不同目标机上实现同一种语言
中间代码的形式:
逆波兰式、四元式、三元式、间接三元式、树
属性分为两种:继承属性和综合属性. inherited and synthesized(derived)attribute 继承属性的计算规则由顶向下, 综合属性的计算规则由底向上.
例如定义表达式值的属性文法, E.val是一个综合属性 的例子:
EE1+E2 {E.val := E1.val +E2.val} E(E1) {E.val := E1.val }
8.2.2 S-属性文法和自下而上翻译 一般的属性文法的翻译器很难建立,然 而L-属性文法的翻译器很容易建立。
L-属性文法的一个特例叫S-属性文法。 S-属性文法是只含有综合属性的属性文法。
8.2.3 L-属性文法在自下而上分析中实现 L-属性文法允许一次遍历就计算出所以的 属性值。

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

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

非终结符 有一个综合属性type,其值有 非终结符T有一个综合属性 有一个综合属性 其值有 关键字决定(int或real). 关键字决定 或 L.in=T.type, L.in是继承属性 它将沿着 是继承属性,它将沿着 是继承属性 语法树传递到下边的结点. 语法树传递到下边的结点 与L相联的语义规则中有一个过程调 相联的语义规则中有一个过程调 用—addtype把标识符的类型信息登录 把标识符的类型信息登录 在符号表中. 在符号表中 一个结点的继承属性值是由此结点的 父结点和/或兄弟结点的某些属性来决 父结点和 或兄弟结点的某些属性来决 定的. 定的
2+3*5的分析和计值过程 语义栈(值栈 值栈) 步骤 动作 状态栈 语义栈 值栈 符号栈 余留输入串
1) 2) 3) r6 4) r4 5) r2 6) 7) 8) r6 9)r4 10) 10) 11) 11) 12) 12)r6 13) 13)r3 14) 14)r1 15) 15)接受 0 - 05 -- 03 -2 02 -2 01 -2 016 -2- 0165 -2-- 0163 -2-3 0169 -2-3 01697 -2-3- 016975 -2-3-- 01697(10) -2-3-5 0169 -(15 15) -2-(15) 01 17) - (17) # 2+3*5# 5 #2 +3 *5# 5 #F +3*5# 5 #T +3*5# 5 #E +3*5# 5 #E+ 3*5# 5 #E+3 *5# #E+3 5 #E+F *5# #E+F 5 #E+T *5# #E+T 5 #E+T* 5# #E+T #E+T*5 #E+T 5 # #E+T*F # #E+T F #E+T # #E #
属性有两种— 属性有两种 继承属性和综合属性 综合属性用于“自下而上”传递 综合属性用于“自下而上” 信息. 信息 继承属性用于“自上而下”传递 继承属性用于“自上而下” 信息. 信息
  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
相关文档
最新文档