当前位置:文档之家› 编译原理第八章

编译原理第八章


s6 r2 r4 s4 r6
s6 r1 r3 r5 s4 s4
r2 r4
acc r2 r4
1
2
3
s5 r6
s5 s5
8
2 9
3 3 10
r6 s11 r1 r3 r5
r6
s7 r3 r5
r1 r3 r5
24
表达式2 + 3 ∗ 5的求值
25
L-属性文法的语义处理
采用自上而下的方式可以较方便地进行
在两种情况下,属性b依赖于属性c1,c2…ck
5
AX1 X2 …Xn A的综合属性S(A)计算公式 S(A):=f(I(X1),…,I(Xn)) Xj的继承属性T(Xj)计算公式 T(Xj):=f(I(A),... I(Xn))
出现在产生式左边的继承属性和出现在产生式右边的 综合属性不由所给定的产生式的属性计算规则进行计算, 它们由其它产生式的属性规则计算或者由属性计算器的参 数提供。 1)非终结符既可有综合属性也可有继承属性,例外:文法 开始符号没有继承属性. 2)终结符只有综合属性,它们由词法程序提供.
11
3*5+4的带注释的分析树
继承属性

一个结点的继承属性值是由此结点的父结点和(或) 兄弟结点的某些属性来决定的。
生 产 式 D TL T int T real L L1,id L id 语 义 规 则 L.in:=T.type T.type=integer T.type:=real
(可以只是f(c1,c2,…ck) ,此时b结点为一个虚结点)
for i :=1 to k do
从ci结点到b结点构造一条有向边
17
在某些情况下可用一遍扫描实现属性文法的语 义规则计算-------在语法分析的同时完成语义规则的 计算,无须明显地构造语法树或构造属性之间的依 赖图。
单遍实现对于编译效率非常重要
23
文法G’ [S] 的LR 分析表
(0)SE (1)E E+T (2) E T (3)T TF (4) T F (5)F (E) (6)F d
状态 0 1 2 3 4 5 6 7 8 9 10 11
ACTION
d + ( ) # E
GOTO
T F
s5 s7 r4
s4
F:关于属性的属性断言或谓词集.每个断言与一个产生式
相联.而此断言只引用该产生式左端或右端的终结符或非 终结符相联的属性(语义子程序)
4
属性通常分为两类:综合属性和继承属性。 “自下而上”传递信息 “自上而下”传递信息
属性文法中,对应于每个产生式A都有一套与之相关联的 语义规则,每条规则的形式为b:=f(c1,c2…ck) f是一个函数, b和c1,c2…ck是该产生式文法符号的属性. (1)如果b是A的一个属性,c1,c2…ck是产生式右部文法符号的 属性或A的其他属性,则称b是A的综合属性 ( 2 )如果 b 是产生式右部某个文法符号 X 的一个属性 , 并且 c1,c2…ck是A或产生式右边任何文法符号的属性 ,则 称b是文 法符号X 的继承属性
a2
a3
L.in= real

.
语句real a1,a2,a3的 分析树,采用自上而 下的分析方法
13
a1
8.2 语法制导翻译概论

在语法分析过程中,随着分析的步步进展,根据每个产 生式所对应的语义子程序(或语义规则描述的语义动作) 进行翻译的办法称作语法制导翻译。
说明: 语法制导翻译是在语法分析过程中同时进行的; 一旦用到某个产生式推导/归约时,调用相应的语义子 程序进行翻译。 目的:用语法制导翻译的方法来说明程序设计语言 的结构怎样被翻译成中间形式
integer T.type:=real
L1.in:=L.in addtype(id.entry,L.in) addtype(id.entry,L.in)
L id
L.in= real
T.type=real
real
L.in= real
. ,
L
E.val=19 E.val=15
+
T.val=4 F.val=4 F.val=5 digit.lexval=4 digit.lexval=5
T.val=15 T.val=3 F.val=3 digit.lexval=3
*
如果一个语法制 导定义仅仅使用 综合属性,则称 这种语法制导定 义为S属性定义。 通常采用自底向 上的方法对其分 析树加注释,即 从树叶到树根, 按照语义规则计 算每个节点的属 性值。
L E E T T F F
E E1+T T T1 * F F (E) digit
T.val:=T1.val F.val T.val:=F.val F.val:=E.val F.val:=digit.lexval
以3*5+4为例说明
10
综合属性val
在语法制导定义中,一条语义规则完成一个计算属性 值的动作。digit是终结符,只使用综合属性,且其属 性值由词法分析器提供,通常不要计算属性值。
8
表达式文法 E→T+T| T or T T → n | true|false
E → T1 + T2 { T1.type = int T2.type= T1.type E.type :=int T1.type = bool T2.type= T1.type E.type :=bool T.type := int
7
属性文法举例
识别语言 L = { anbncn n 1} ?
产生式 S ABC A A1a A a B B1b Bb C C1c Cc 语义动作/限定条件 {(A.num=B.num) and (B.num=C.num) } { A.num := A1.num + 1 } { A.num := 1 } { B.num := B1.num + 1 } { B.num := 1 } { C.num := C1.num + 1 } { C.num := 1 }
16
构造算法
for 分析树中每一个结点n do for 结点n所用产生式的每个语义规则中涉及的每一个属性a do
为a在依赖图中建立一个结点;
for 结点n所用产生式中每个形如f(c1,c2,…ck)的语义规则 do
为该规则在依赖图中也建立一个结点(称为虚结点);
for 分析树中每一个结点n do for 结点n所用产生式对应的每个语义规则 b:=f(c1,c2,…ck) do
语义分析工具:常用属性文法来说明程序设计语言语义
3
8.1 属性文法
属性文法(attribute grammar)是一个三元 组:A=(G,V,F)
G:是一个上下文无关文法(形式化) V:有穷的属性集,每个属性与文法的一个终结符或非终结符
相连,这些属性代表与文法符号相关信息,如它的类型、值、 代码序列、符号表内容等等 . 属性可以进行计算和传递。属性加工的过程即是语义处理 的过程(并非每个文法符号都有属性,属性与具体产生式 的语义相关)
6
非终结符A,B和C,其中A有一个继承属性a和一个综合 属性b,B有综合属性c,C有继承属性d, 对ABC可能有语义规则 C.d:=B.c+1 A.b:=A.a+B.c 而属性A.a和 B.c是在其他地方计算的。 语义规则所描述的工作可以包括属性计算、静态语 义检查、符号表操作、代码(中间)生成等等。有 些语义规则可能产生副作用(如产生代码),也可 能是个函数,通常把这样的语义规则写成过程调用 或过程段。
21
采用LR分析技术进行S-属性文法的语义处理
语义动作中的综合属性可以通过存在于当前语义栈
栈顶部分的属性进行计算 例如,假设有相应于产生式 AXYZ 的语义规则 A.a := f(X.x, Y.y, Z.z)
在 XYZ 归约为 A 之前,Z.x, Y.y, 和 X.z 分别存放 于语义栈的 top,top-1 和 top-2 的相应域中,因 此 A.a 可以顺利求出
E → T1 or T2
T→n T → true
{
{
} } } }
{ T.type := bool
T → false
{ T.type := bool
类型检查的属性文法
}
9
综合属性
在分析树中,如果一个结点的某一个属性由其子结点的属性 确定,该属性为该结点的综合属性。 产 生 式 语 义 规 则 Print(E.val) E.val:=E1.val+T.val E.val:=T.val 过程Print 打印E表达 式 的值。
第八章 语法制导 翻译和中间代码 生成
主要内容:

属性文法与语法制导翻译 中间代码:逆波兰式、三元式、四元式、抽象语 法树的表示 常见语句的翻译( 布尔表达式,控制语句,循 环,数组 )
2
语义分析
语义分析的任务:在词法分析和语法分析基础上,分析 源程序含义,在理解含义的基础上为生成相应的目标 代码作好准备或直接生成目标代码。 1)静态语义检查 类型检查、运算、维数、越界 2)语义翻译(具体的动作) 语句的翻译(中间代码或目标代码生成) 语义分析方法:大多编译器采用语法制导翻译方法
19
S-属性文法的语义处理

通常采用自下而上的方式进行
若采用LR分析技术,可以通过扩充分析栈中的域, 形成语义栈来存放综合属性的值,计算相应产生式 左部文法符号的综合属性值刚好发生在每一步归约 之前的时刻
20
采用LR分析技术进行S-属性文法的语义处理
扩充分析栈中的域形成语义栈存放综合属性的值
具体的实现希望在单遍扫描中完成翻译
一个一般的属性文法的翻译器可能是很难建立 的,然而有一大类属性文法的翻译器很容易建立
相关主题