编译原理:第六章 属性文法和语法制导翻译
属性文法与语法制导翻译
这里,f是一个函数,而且或者 (1)b是A的一个综合属性并且c1,c2…ck是产生式 右边文法符号的属性;或者 (2)b是产生式右边某个文法符号的一个继承属 性并且c1,c2…ck是A或产生式右边任何文法符号的 属性。
2020/7/8
中南大学软件学院 陈志刚
20
第六章 属性文法和语法制导翻译
定义: 一个语法制导的翻译模式是一个五元组
T=(N,,,R,S),其中 (1) N是非终结符的有限集。 (2) 是有限的输入字母表。 (3) 是有限的输出字母表。 (4) R是形如A,的规则的有限集,其中
∈(N∪ )*,∈(N∪ )*且中那组非终结符 是中那组非终结符的置换。
例6.3: 下列翻译模式,它定义翻译,即对每个输入x, 其输出y是x的逆转。定义此翻译的规则是
产生式
(1)s0s (2)s1s (3)s ε
翻译规则
(1)s=s0 (2)s=s1 (3)s=ε
2020/7/8
中南大学软件学院 陈志刚
17
第六章 属性文法和语法制导翻译
输入输出对可由(,)表示,其中是输入句子形式 而是输出句子形式。
T b
{ T.type := bool}
2020/7/8
中南大学软件学院 陈志刚
4
第六章 属性文法和语法制导翻译
操作语义
描述一段程序的含义是通过执行该段程序所改
变的计算机(虚拟计算机)状态来反映。这个计算机的 状态与程序执行时的状态相对应:包括变量的所有值, 可执行程序本身,各种系统定义的内部数据结构。计算 机里所有的寄存器的值和存储单元的值作为计算机的状 态,用一组形式定义的操作来说明执行一条指令相应的 状态怎样变化。
编译原理课件06属性文法和语法制导翻译
属性文法和语法制导翻译是编译原理领域的两个核心概念。本课程将深入探 讨这两个主题,让大家全面了解编译原理的精髓。
属性文法:理论基础
属性文法定义
与上下文无关文法的区别
属性文法定义了语法结构的属性, 包括终结符和非终结符上的属性 和符号间的依赖。
上下文无关文法的语法结构是确 定的,而属性文法的语法结构中 包含了属性的信息。
产生式规则
属性文法的产生式规则由形式化 的产生式和附加的语义规则组成。
语法制导翻译:应用实例
1 基本概念
语法制导翻译将属性值与语法树相结合,用 于将源语言转换为目标语言。
2 方法
语法制导翻译可以通过S属性翻译计算自底向 上地求解,或手动注入Semantic动作。
3 过程
语法制导翻译的过程包括生成属性语法树, 计算语法树的属性,以及将属性与具体操作 相结合。
4 应用实例
语法制导翻译可用于编译器和解释器中,例 如C语言和Java编译器。
语法制导翻译:方法与实践
1
构建属性语法树
将上下文无关文法转化为属性文法,并构建出属性语法树。下而上或自上而下的语法属性计算。
3
执行动作
根据语法属性的计算结果,执行对应的语义动作。
属性文法和语法制导翻译的应用举例
创造思维
转型准备
编译原理培养了我们的创造思维, 让我们能够从编译器底层的实现 中提升自己的能力。
编译原理培养了我们的技术能力 和团队协作精神,为我们的未来 职业道路打下了基础。
编译器
编译器使用语法制导翻译将高级语言转换为机 器代码。
代码生成
属性文法可以用于指令选择与寄存器分配,优 化生成的目标代码。
第六章 属性文法和语法制导翻译
6.2 基于属性文法的处理方法
属性计算
构造输入的分析树,构造属性依赖图,对结点进行 拓扑排序,按拓扑排序的次序计算属性。 也可以多次扫描分析树,如果属性文法不存在循环 依赖,每次至少会计算出一个属性值。 编译更感兴趣的是一遍扫描的处理方法。
6.2 基于属性文法的处理方法
6.2.4 抽象语法树
• 语法分析与语义处理阶段分离 • 语法分析树不适合语义处理的因素:提取公共左因 子,消除左递归等引入新的产生式和符号,标点等 语法要素不含任何语义信息 • 抽象语法树是语法分析和后续阶段的接口。 if-then-else 8
6.1 属性文法
注释分析树:结点的属性值都标注出来的分析树
L E.val = 18 E.val = 8 T.val = 8 F.val = 8 digit.lexval = 8 + T.val = 5 F.val = 5 digit.lexval = 5 n T.val = 10 * F.val = 2 digit.lexval = 2
B S1 S2 5 + * 2
6.2 基于属性文法的处理方法
6.2.4 抽象语法树
产 生 式 E E1 + T ET T T1*F TF F (E) F id F num 语 义 规 则 E.nptr := mknode( ‘+’, E1.nptr, T.nptr) E.nptr := T.nptr T.nptr := mknode( ‘*’, T1.nptr, F.nptr) T.nptr := F.nptr F.nptr := E.nptr F.nptr := mkleaf (id, id.entry) F.nptr := mkleaf (num, num.val)
第六章 属性文法和语法制导的翻译(精)
语义分析任务
• ②控制流检查。通过检查控制流语句,以确保控制语 句有合法的转向点。例如,c语言中break语句的作 用是使程序跳离包括该语句的最小的switch、while 或for语句,如果不存在这样的语句,则应报错。 • ③一致性检查。很多情况下要求对象只能被定义一次。 例如,c语言中规定一个标识符在同一作用域中只能 被说明一次,同一switch语句的case语句标号不能相 同,枚举类型的元素不能重复出现等。 • ④相关名字检查。有的语言中有时规定,同一名字必 须出现两次或多次。例如,Ada语言中,循环或程序 块可以有两个名字,它出现在这些结构的开头和结尾, 如同语句括号一般,编译程序必须检查它们的配对情 况。
编译原理---第6章
——
1
《编译原理》
第6章 语法制导翻译 与属性文法
语法制导翻译概述 属性文法
综合属性与继承属性 S_属性文法 L_属性文法
翻译模式
国家精品课程
——
2
《编译原理》
6.1 语法制导翻译概述
语法制导翻译的概念描述
在进行语法分析的同时,完成相应的语义处理 E→E1 + E2 E.val:=E1.val+E2.val
T → int
T → real
L → L1,id
L → id
1. 纪录标识符的类型 2. 类型信息传递
方法:用T.type记录类
型信息,并传给L.in
国家精品课程
——
15
《编译原理》
例6-2 说明语句的属性文法
D→TL
T → int T → real L → L1,id L → id
digit.lexval=4
例6-4:real id1,id2,id3 的分析树和属性计算
D T .type=real L .in=real D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real }
这种属性叫做继承(Inherited)属性
国家精品课程
——
21
《编译原理》
3. 属性分类——固有属性
语言中的标识符、常数(数值的、符号的) 、常量,它们的属性是用户给定的、固有不 变的
T → int T.type := „integer‟
固有(Inherent)属性(单词属性) 归类于综合属性
编译原理第六章属性文法和语法制导翻译
第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。
大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。
教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。
讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。
例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。
二、动态语义处置。
若是静态语义正确,语义处置那么要执行真正的翻译。
例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。
3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。
比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。
对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。
二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。
它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。
这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。
属性与变量一样,能够进行计算和传递。
属性加工的进程即是语义处置的进程。
关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。
语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。
3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。
Part6编译原理-属性文法和语法制导翻译(天津大学)
L y 8
,
id3 entry 3
9 in
L y 10
,
id2 entry 2
id1 entry 1
计算语义规则的方法
分析树法:
在编译时,这种方法从分析树所构成的依赖图的拓扑排序中得 到语义规则的计算顺序。
如果分析树的依赖图中有环路,这种方法将失败
抽象语法树的例子
产生式 E→E1 + T
语义规则 E.nptr := mknode(‘+’ , E1.nptr, T.nptr)
E→E1 – T
E→T T→(E) T→id T→num
E.nptr := mknode(‘-’ , E1.nptr, T.nptr)
综合属性值:通过分析树中其子节点的属性值计算出来的 继承属性值:由该节点的兄弟节点及父节点的属性值计算出来 的
依赖图
语义规则建立了属性间的依赖关系,这种关系用图来表示就是 依赖图 依赖图表示了语义规则的计算顺序
注释分析数
每个节点都有属性值的分析树叫做注释分析树 计算节点属性的过程称为注释或者装饰分析树
如果语法树有n个结点(因此最多有O(n)个属性),最 坏的情况整个遍历需要O(n2)时间。
树遍历的举例
产生式 语义规则
S→XYZ
Z.h := S.a
X.c := Z.g S.b := X.d – 2 Y.e := S.b
S a=0 X x Y y
初始状态
S a=0 Z z X x Y y
第一遍扫描
S-属性文法
S-属性文法
在语法树中,一个结点的综合属性的值由其子结点的 属性值决定。 仅使用综合属性的属性文法称为S-属性定义 S属性定义的分析树的分析方法——自底向上的在每个 节点用语义规则来计算综合属性值。
编译原理-属性文法和语法制导翻译
编译原理-属性⽂法和语法制导翻译1.属性⽂法:在上下⽂⽆关⽂法的基础上,为每个⽂法符号引进⼀组属性,且让该⽂法中的重写规则附加上语义规则时,称该上下⽂⽆关⽂法为属性⽂法。
(属性⽂法往往以语法制导定义和翻译模式两种形式出现。
具体说明问度娘)注意:(1)属性与变量⼀样,可以进⾏计算和传递。
(2)属性加⼯的过程即是语义处理的过程。
(3)属性分为综合属性(⽤于“⾃下⽽上”传递信息)和继承属性(⽤于“⾃上⽽下”传递信息)。
(1. 语义规则的形式:产⽣式A—>α的语义规则的形式为b:=f(c1,c2,…,ck)。
就是属性b依赖于属性c1,c2,…,ck。
其中:f是⼀个函数;b—A的综合属性,且c1,c2,…,ck是α中⽂法符号的属性;b—α中某个⽂法符号的继承属性, 且c1,c2,…,ck是A或α中任何⽂法符号的属性.(2.VT—VN的属性(1) VT — 只有综合属性,由词法分析器提供.(2) VN — 既可有综合属性也可有继承属性; 开始符号S的所有继承属性作为属性计算前的初始值.(3.属性的计算/获得(1)由该产⽣式提供的计算规则计算获得:产⽣式右边的继承属性,产⽣式左边的综合属性。
(2)由其它产⽣式的属性规则计算或由属性计算器的参数提供:产⽣式左边的继承属性,产⽣式右边的综合属性2.综合属性:通常使⽤⾃底向上的⽅法(由⼦确⽗),S—属性⽂法:仅使⽤综合属性的属性⽂法.3.继承属性:⽤继承属性来表⽰程序设计语⾔结构中的上下⽂依赖关系很⽅便.(由⽗兄却该结点继承属性)4.基于属性⽂法的处理⽅法:(1.依赖图:继承属性和综合属性之间的相互依赖关系的有向图。
构造过程:为每个包含过程调⽤的语义引⼊⼀个虚综合属性b,改写为b=f(c1,c2,…,ck)的形式-->为每个属性设置⼀个结点--->若属性b依赖于属性c,则从属性c的结点有⼀条有向边连到属性b的结点。
(2. 属性的计算次序:(1)良定义的:若⼀个属性⽂法不存在属性之间的循环依赖关系,则称该⽂法为良定义的。
编译原理:第六章 属性文法和语法制导翻译
id2 2
entry
• 如果一属性文法不存在属性之间的循环依赖关系,那么称该文法为 良定义的
属性的计算次序
• 一个依赖图的任何拓扑排序都给出一个语法树中结 点的语义规则计算的有效顺序 • 属性文法说明的翻译是很精确的
• 基础文法用于建立输入符号串的语法分析树 • 根据语义规则建立依赖图 • 从依赖图的拓扑排序中,我们可以得到计算语义规
• 综合属性
• 在语法树中,一个结点的综合属性的值由其子结点的属性值确定。 • 使用自底向上的方法在每一个结点处使用语义规则计算综合属性的值
• 仅仅使用综合属性的属性文法称S-属性文法
产生式பைடு நூலகம்L→En E→E1+T E→T T→T1*F T→F F→ (E) F→digit
语义规则 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
E→E1+E2
E.val:=E1.val+E2.val
val E
E1
+
val
E2 val
句子real id1,id2,id3的带注 释的语法树的依赖图
D
产生式 语义规则 D→TL L.in := T.type T→int T.type := integer T→real T.type := real L→L1, id L1.in :=L.in
4
属性文法的说明(2)
③ 与产生式 A X1X2…Xn 相关联的属性计算规 则只能是 A. 综合属性和Xi . 继承属性的计算。不 能有A的继承属性和Xi 的综合属性的计算规则。
第六章语法制导翻译与属文法
9典型处理方法一源自语法制导定义通过将属性与文法符号关联、将语义规则与产生 式关联来描述语言结构的翻译方案
对应每一个产生式编写一个语义子程序,当一个 产生式获得匹配时,就调用相应的语义子程序来 实现语义检查与翻译
E→E1 + T {E.val:=E1.val+T.val} T→T1 * F {T.val:=T1.val*F.val} F →digit {F.val:=digit.lexval}
2020/8/16
6
6.1 语法制导翻译概述
语义子程序的功能
指明相应产生式中各个文法符号的具体含义,并 规定了使用该产生式进行分析时所应采取的语义 动作(如传送或处理语义信息、查填符号表、计算 值、生成中间代码等)。
语义信息的获取和加工是和语法分析同时进行的, 而且这些语义信息是通过文法符号来携带和传递 的。
2020/8/16
13
语法制导定义的形式
在一个语法制导定义中,A→P都有与之相关联的
一套语义规则,规则形式为
b:= f(c1,c2,…,ck), f是一个函数,而且或者
1.b是A的一个综合属性并且c1,c2,…,ck
是中的符号的属性,或者
2.b是中某个符号的一个继承属性并且c1, c2,…,ck是A或中的任何文法符号的属性。
12
概念术语
综合属性:节点的属性值是通过分析树中该 节点或其子节点的属性值计算出来的
继承属性:节点的属性值是由该节点、该节 点的兄弟节点或父节点的属性值计算出来的
固有属性:通过词法分析直接得到的属性 依赖图:描述属性之间依赖关系的图,根据
语义规则来构造 注释分析树:节点带有属性值的分析树
属性是与文法符号相关联的语义信息
第6章 属性文法及语法制导翻译 (编译原理 陈火旺)讲诉
(1) 终结符只有综合属性,它由词法分析器提供
属性文法的说明(1)
P136
例如 digit.lexval 表示单词符号“数”的词法值 id.entry 表示单词符号“标识符”的符号表入口
(2) 非终结符既可以有综合属性也可以有继承 属性,在属性文法的语义规则中计算 (3) 关于属性计算的规定
A
A X1X2…Xn b:=f(c1,c2,…,ck)
A.b
带注释的 语法树
14
X1 X2 … Xn
X1.c1 X2 .c2 … Xn . ck
两种属性:继承属性
• 继承属性用于“自上而下”传递信息。 • 继承属性:在语法树中,一个结点的继承属 性由此结点的父结点和(或)兄结点的某些属 性确定。 • 可以用继承属性来表示程序语言结构中的上 下文依赖关系。 • 继承属性的计算可以结合自上而下的语法分 析进行。 A. c
A X1 … X … Xn
A X1X2…Xn b:=f(c1,c2,…,ck)
k
X1.c1 … X.b
… Xn
17
6.2 基于属性文法的处理方法 • 属性文法: 产生式 语义规则 .
A α b:=f(c1,c2,…,ck) • 语义规则的计算可以执行任何翻译动作。对输入串 的翻译也就是根据语义规则进行计算得出结果。 • 属性文法是比较抽象的翻译说明,隐藏了一些实现 细节, 主要是无须指明翻译时语义规则的计算次序。 • 本节讨论语义规则的计算方法,指明属性文法中语 义规则的计算次序,从而把语义规则改造为计算属 性的语义程序,把静态的语义规则改写为可动态执 行的语义动作 --- 语法制导翻译方法。
4
6.1 属性文法
• 属性文法, 也称属性翻译文法或语法制导定义, 是Knuth在1968年首先提出来的。 • 属性:在上下文无关文法的基础上为每个文法 符号X(终结符或非终结符)配备若干个相关的 “值”---这些“值”就称为文法符号X的属性。 • 属性值的设置和语法结构的语义以及翻译程序 的需要有关。 • 属性代表与文法符号相关语义信息,如类型、 值、代码序列、符号表内容等
第06章_属性文法和语法制导翻译
6.1 属性文法
语义规则所描述的工作可以包括属性计算 、 语义规则 所描述的工作可以包括属性计算、 所描述的工作可以包括属性计算 静态语义检查、 符号表操作、 静态语义检查 、 符号表操作 、 代码生成等 等。 考虑非终结符A, 和 , 其中, 有 例 , 考虑非终结符 , B和 C, 其中 , A有 一个继承属性a和一个综合属性 和一个综合属性b, 有综 一个继承属性 和一个综合属性 , B有综 合属性c, 有继承属性 有继承属性d。 产生式A→BC 合属性 , C有继承属性 。 产生式 可能有规则 C.d:=B.c+1 A.b:=A.a+B.c 而属性A.a和B.c在其它地方计算 而属性 和 在其它地方计算
产生式 L E E T T F F E E1+T T T1 * F F (E) digit
语 义 规 则 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
属性文法的例子:简单算术表达式求值的语义描述。 属性文法的例子:简单算术表达式求值的语义描述。
非终结符E、 及 都有一个综合属性val, 都有一个综合属性 非终结符 、T及F都有一个综合属性 , 符号digit有一个综合属性 有一个综合属性lexval,它的值由词法分析器提供。 符号 有一个综合属性 ,它的值由词法分析器提供。 与产生式L→E对应的语义规则仅仅是打印由 产生的算术表达 对应的语义规则仅仅是打印由E产生的算术表达 与产生式 对应的语义规则仅仅是打印由 式的值的一个过程,我们可认为这条规则定义了L的一个虚属性。 式的值的一个过程,我们可认为这条规则定义了 的一个虚属性。 的一个虚属性 某些非终结符加下标 非终结符加下标是为了区分一个产生式中同一非终结符多 某些非终结符加下标是为了区分一个产生式中同一非终结符多 次出现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥工业大学 计算机与信息学院软件所
6.2 基于属性文法的的处理方法
输入串 语法树 依赖图 语义规则计算次序
由源程序的语法结构所驱动的处理办法就是 语法制导翻译法 语义规则的计算
产生代码 在符号表中存放信息 给出错误信息 执行任何其它动作
对输入符号串的翻译也就是根据语义规则进 行计算的结果。
real
, 8 addtype
id3
3 entry
9 in
L id1
10 addtype ,
1 entry
id2
2 entry
合肥工业大学 计算机与信息学院软件所
如果一属性文法不存在属性之间的循环依赖 关系,那么称该文法为良定义的
合肥工业大学 计算机与信息学院软件所
属性的计算次序
一个依赖图的任何拓扑排序都给出一个语法树中 结点的语义规则计算的有效顺序 属性文法说明的翻译是很精确的
a4:=real; a5:=a4 addtype (id3.entry,a5); a7:=a5; addtype (id2.entry,a7); id3 3 a9:=a7 entry addtype (id1.entry,a9);
2 entry
9 L 10 , in id1 1 entry
id2
合肥工业大学 计算机与信息学院软件所
合肥工业大学 计算机与信息学院软件所
6.2 基于属性文法的的处理方法
依赖图 树遍历 一遍扫描
合肥工业大学 计算机与信息学院软件所
6.2.3 一遍扫描的处理方法
合肥工业大学 计算机与信息学院软件所
for 语法树中每一结点n do for 结点n的文法符号的每一个属性a do 为a在依赖图中建立一个结点; for语法树中每一个结点n do for 结点n所用产生式对应的每一个语义规则 b:=f(c1,c2,…,ck ) do for i:=1 to k do 从ci结点到b结点构造一条有向边;
合肥工业大学 计算机与信息学院软件所
例 考虑属性的文法G。其中,S有继承属性a,综合属性 b;X有继承属性c、综合属性d;Y有继承属性e、综合 属性f;Z有继承属性h、综合属性g
产 生 式 S→XYZ
X→x Y→y Z→z
语 义 规 则 Z.h := S.a X.c := Z.g S.b := X.d -2 Y.e := S.b X.d :=2*X.c Y.f := Y.e*3 Z.g :=Z.h+1
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)
5 in 7 in L
L 6 - addtype(id.entry, L.in)
合肥工业大学 计算机与信息学院软件所
属性
在一个属性文法中,对应于每个产生式A→都有 一套与之相关联的语义规则,每条规则的形式为: b:=f(c1,c2,…,ck) 这里,f是一个函数,而且或者 1. b是A的一个综合属性并且c1,c2,…,ck是产生式右边 文法符号的属性,或者 2. b是产生式右边某个文法符号的一个继承属性并且 c1,c2,…,ck 是A或产生式右边任何文法符号的属性。
合肥工业大学 计算机与信息学院软件所
句子real id1,id2,id3的带注释的语法树
D
T T.type=real
real L.in=real L L.in=real L , id1
L.in=real L
, id2
产生式 D→TL T→int T→real L→L1, id L→id
id3
语义规则 L.in := T.type T.type := integer T.type := real L1.in :=L.in addtype(id.entry, L.in) addtype(id.entry, L.in)
6.2 基于属性文法的的处理方法
依赖图 树遍历 一遍扫描
合肥工业大学 计算机与信息学院软件所
6.2.2 树遍历的属性计算方法
通过树遍历的方法计算属性的值
假设语法树已建立,且树中已带有开始符号 的继承属性和终结符的综合属性 以某种次序遍历语法树,直至计算出所有属 性
深度优先,从左到右的遍历
产生式 L→En E→E1+T E→T T→T1*F T→F F→ (E) F→digit
语 义 规 则 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
基础文法用于建立输入符号串的语法分析树 根据语义规则建立依赖图 从依赖图的拓扑排序中,我们可以得到计算语义 规则的顺序
输入串
语法树
依赖图
语义规则计算次序
合肥工业大学 计算机与信息学院软件所
句子real id1,id2,id3的带注释的语法树的依 赖图
D T 4 type real 7 L in 5 L 6 in 8 ,
合肥工业大学 计算机与信息学院软件所
综合属性
在语法树中,一个结点的综合属性的值由其 子结点的属性值确定。 使用自底向上的方法在每一个结点处使用语 义规则计算综合属性的值
仅仅使用综合属性的属性文法称S-属性文 法
合肥工业大学 计算机与信息学院软件所
产生式 L→En E→E1+T E→T T→T1*F T→F F→ (E) F→digit
6
合肥工业大学 计算机与信息学院软件所
例,考虑非终结符 A,B 和 C,其中, A 有 一个继承属性 a 和一个综合属性 b,B 有综 合属性 c,C 有继承属性 d。产生式 A→BC 可能有规则 C.d:=B.c+1 A.b:=A.a+B.c 而属性A.a和B.c在其它地方计算
合肥工业大学 计算机与信息学院软件所
综合属性:“自下而上”传递信息 继承属性:“自上而下”传递信息
属性b依赖于属性c1,c2,…,ck。
合肥工业大学 计算机与信息学院软件所
属性文法的说明(1)
(1) 终结符只有综合属性,它由词法分析器提供
例如 digit.lexval 表示单词符号“数”的词法值 id.entry 表示单词符号“标识符”的符号表入口
合肥工业大学 计算机与信息学院软件所
6.2 基于属性文法的的处理方法
依赖图 树遍历 一遍扫描
合肥工业大学 计算机与信息学院软件所
6.2.1 依赖图
在一棵语法树中的结点的继承属性和综合属性之间 的相互依赖关系可以由称作依赖图的一个有向图来 描述 为每一个包含过程调用的语义规则引入一个虚综合 属性b,这样把每一个语义规则都写成 b:=f(c1,c2,…,ck) 的形式 依赖图中为每一个属性设置一个结点,如果属性 b 依赖于属性c,则从属性c的结点有一条有向边连到 属性b的结点。
合肥工业大学 计算机与信息学院软件所
While 还有未被计算的属性 do VisitNode(S) /*S是开始符号*/
procedure VisitNode (N:Node) ; begin if N是一个非终结符 then /*假设它的产生式为N→X1…Xm*/ for i :=1 to m do if XiVN then /*即Xi是非终结符*/ begin 计算Xi的所有能够计算的继承属性; VisitNode (Xi) end; 计算N的所有能够计算的综合属性 end
合肥工业大学 计算机与信息学院软件所
E→E1+E2
E
E.val:=E1.val+E2.val
val
E1
val
+
E2
val
合肥工业大学 计算机与信息学院软件所
句子real id1,id2,id3的 带注释的语法树的依赖图
产生式 D→TL T→int T→real L→L1, id
D T
4 type
语 义 规 则 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
合肥工业大学 计算机与信息学院软件所
产生式 语 义 规 则 L→En 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 T→F T.val :=F.val F→ (E) F.val :=E.val F→digit F.val :=digit.lexval
3*5+4n的带注释的语法树
L E.val=19 E.val=15 T.val=15 + n T.val=4 F.val=4 F.val=5 digit.lexval=5 digit.lexval=4
T.val=3 F.val=3
*
digit.lexval=3
合肥工业大学 计算机与信息学院软件所
继承属性
(2) 非终结符既可以有综合属性也可以有继承 属性,在属性文法的语义规则中计算 (3) 关于属性计算的规定
① 文法的开始符号的所有继承属性作为属性计算 前的初始值。 ② 一般来讲,对出现在产生式 A X1X2…Xn左边 的非终结符A的综合属性和出现在产生式右部的符 号Xi的继承属性都必须提供一个计算规则。