当前位置:文档之家› 第五章++语法制导翻译(1)

第五章++语法制导翻译(1)

编译原理 26
另一例 非L属性的语法制导定义
文法符号B的继承属性依赖于它右边文法符号C的 属性。
产生式 ABC
语义规则 A.s := B.b B.i := f(C.c, A.s)
编译原理
27
例5.10
编译原理
28
例5.10 简单类型声明的SDD
产 生 式 语 义 规 则
D TL
T int
编译原理
9
综合属性: E.val, T.val, F.val, digit.lexval 在语法制导定义中,终结符号只有综合属性,它们 的值由词法分析程序提供;digit.lexval 假设开始符号没有继承属性。
编译原理
10
5.1.2 对SDD求值
S属性定义:仅仅使用综合属性的语法制导定义称 为S属性定义。 例5.1中的S属性定义详细说明了一台计算器读入包 含数字,括号,+和*运算符的算术表达式,随后再 读入一个换行字符n,然后打印出表达式值的过程 。 分析树各结点属性的计算可以自底向上地完成。
digit.lexval = 5
编译原理
12
例5.3
产 生 式 语 义 规 则
TFT′ T′ * F T1′ T′ F digit
T′.inh = F.val T.val = T′.syn T1′.inh = T′.inh F.val T′.syn = T1′.syn T′.syn = T′.inh F.val := digit.lexval
编译原理
13
图5-4
T.val = 15
F.val = 3 digit.lexval =3 * T′.inh = 3 .syn =15 F.val = 5 digit.lexval = 5
T1′.inh = 15 .syn =15
编译原理
14
继承属性
一个结点的继承属性值由该结点的父结点和(或) 兄弟结点的属性决定。
编译原理
3
语法制导翻译的一般过程
输入符号串 分析树
依赖图
语义规则的计算顺序
一个句子的翻译过程可以与语法分析过程并行。
编译原理 4
5.1 语法制导定义
语法制导定义是对CFG的推广,每个文法符号都有 一个相关的属性集。 属性:语义信息。一个文法符号通常用一个或若干 个属性来描述它的语义信息。典型例子: 变量的数据类型 表达式的值 变量的存储位置 程序的目标代码
23
5.2.4 L属性定义
一个语法制导定义是L属性定义,如果任意一条产 生式A X1X2 ... Xn,其右部符号Xj(1 j n)的继承 属性仅依赖于 1. 产生式中Xj的左边的符号X1, X2 ,... Xj-1的属性; 2. A的继承属性。 对综合属性没有限制。显然,所有的S属性定义都 是L属性定义。
L.in := T.type
T. type := integer
T float
L L1, id L id
T. type := float
L1.in := L.in; addtype (id.entry, L.in ) addtype (id.entry, L.in )
29
id.entry : 指向符号表的id表目的指针,由词法分析得到 编译原理
id
entrya p2
num 4
to entry for c
38
to entry for a
编译原理
例5.12 L属性定义
产生式
E T E' E' + T E'1
语义规则
E.Node = E'.syn E'.inh = T.Node E'1.inh = new Node(„+‟, E'.inh . T.node) E'.syn = E'1.syn E'1.inh = new Node(„-‟, E'.inh . T.node) E'.syn = E'1.syn E'.syn = E'.inh T.Node = E.node T.Node = new Leaf (id, id.entry) 39 编译原理 T.Node = new Leaf (num, num.val)
编译原理
24
例5.8 L属性
编译原理
25
例5.9 非L属性
文法符号Q的继承属性依赖于它右边文法符号R的 属性。
产生式 A L M A Q R 语义规则 L.i := l(A.i ) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i ) Q.i := q(R.s) A.s := f(Q.s)
第五章 语法制导翻译
1
在文法中,文法符号通常都有明确的意义,文法符 号之间也有确定的语义关系。
用属性描述语义信息,用语义规则描述属性之间的 关系,将语义规则与语法规则相结合。
语法制导翻译(Syntax-Directed Translations): 在语法分析的过程中计算语义属性值。
编译原理
编译原理
6
语义规则:描述产生式中各文法符号的属性之间的 依赖关系。通常用函数或程序语句的形式表示。 依赖图:表示文法符号属性之间依赖关系的有向图。 注释分析树:每个结点都带有属性值的分析树。
编译原理
7
每个产生式A有一组形如b := f(c1, c2, …, ck )的 语义规则,其中f 是函数,并且满足下面两种情形 之一: 1. b是A的综合属性,c1, c2 , …, ck是产生式右部文 法符号的属性。 2. b是产生式右部某个文法符号的继承属性,且c1 , c2 , …, ck也是该产生式文法符号的属性。 称属性b依赖于属性c1, c2 , …, ck。
33
5.3.1 抽象语法树
语法树是分析树的压缩表示:算符和关键字作为内 部结点。 语法制导翻译可以基于分析树,也可以基于语法树。 语法树的例子:
if-then-else
B S1 S2
+
8
5
编译原理
* 2
34
构造表达式的语法树
三个对象: 1. node (op, left, right):运算符结点; 2. leaf(id, entry):标识符叶子结点; 3. leaf(num, val):数叶子结点。
编译原理
36
图5.11 a-4+c的语法树的构造
6 E node 4 E node 2 E node 1 T node
+
3 T node
5 T node
-
id
num + id num 4
编译原理
id
id to entry for
to entry for c
37
下面函数调用建立表达式a-4+c的语法树。
编译原理
8
例5.1 简单台式计算器的语法制导定义
产 生 式 LEn E E1 + T ET 语 义 规 则 print (E.val) E.val := E1 .val + T.val E.val := T.val
T T1 * F TF F (E) F digit
T.val := T1.val F.val T.val := F.val F.val := E.val F.val := digit.lexval
编译原理
20
循环依赖Circular dependency
产生式 AB 语义规则 A.s := B.i B.i := A.s + 1
A A.s
B
B.i
编译原理 21
属性计算次序
构造输入的分析树, 构造属性依赖图, 对结点进行拓扑排序, 按拓扑排序的次序计算属性。
编译原理
22
5.2.3 S属性定义
编译原理
11
8+5*2 n的注释分析树 (annotated parse tree)
L n
E.val = 18 E.val = 8
T.val = 8 F.val = 8 digit.lexval = 8 +
T.val = 10 * F.val = 2
digit.lexval = 2
T.val = 5 F.val = 5
编译原理
35
为表达式建立语法树的语法制导定义
产生式
EE1+T E E1-T ET T (E) Tid Tnum
语义规则
E.node := new Node(‘+’, E1.node, T.node) E.node := new Node(‘-’ , E1.node, T.node) E.node := T.node T.node := E.node T.node:= new Leaf(id, id.entry) T.node := new Leaf(num, num.val)
2
介绍一种形式化的语义描述方法:语法制导的翻译, 包括两种具体形式 语法制导定义(Syntax-Directed Definitions, SDD):定义翻译所必须的语义属性和语义规则, 一般不涉及计算顺序。 翻译模式(translation schemes): 给出语义规 则的计算顺序。 介绍语法制导翻译的实现方法。
如果一个SDD的每个属性都是综合属性,则它是S属性。可 以按照分析树的自底向上顺序来计算各属性值。 后序遍历 postorder (N) { for (从左边开始,对N的每个结点C) postorder (C); 计算N的属性值; } S属性定义可以在自底向上语法分析过程中实现。
编译原理
相关主题