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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理 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
id2 2 entry
编译原理
30
float id1, id2, id3的分析树的依赖图
D T 4 type float in 7 in 5 L 8
L 6
, id2 2 entry id3 3 entry
in 9
L 10
,
id1 1 entry
编译原理 31
float id1, id2, id3的注释分析树
(1) p1 := new Leaf(id, entrya); (2) p2 := new Leaf(num, 4); (3) p3 := new Node(„-‟, p1, p2); (4) p4 := new Leaf(id, entryc); (5) p5 := new Node(„+‟, p3,p4); p5 p3 p1 + p4 id entryc p1, p2, ..., p5是指向结点 的指针,entrya和entryc 分别是指向符号表中标 识符a和c的指针。
编译原理
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)
编译原理
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):数叶子结点。
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表目的指针,由词法分析得到 编译原理
编译原理
15
5.2 SDD的求值顺序
编译原理
16
5.2.1 属性依赖图
依赖图主要用于 确定属性的计算顺序; 设计语义规则。
编译原理
17
例5.4
产生式 E E1+E2 E
E1 val + val E2
语义规则 E.val := E1.val + E2.val
val
E.val是从E1.val和E2.val综合得出
D T.type = real L.in = float L.in = float , id2 id3
float
L.in = float
id1
,
编译原理
32
5.3 语法制导定义的应用
应用 语法制导定义来构造语法树 数组类型的定义 S属性定义——自底向上
L属性定义——自顶向下
编译原理
编译原理
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
第五章 语法制导翻译
1
在文法中,文法符号通常都有明确的意义,文法符 号之间也有确定的语义关系。
用属性描述语义信息,用语义规则描述属性之间的 关系,将语义规则与语法规则相结合。
语法制导翻译(Syntax-Directed Translations): 在语法分析的过程中计算语义属性值。
编译原理
如果一个SDD的每个属性都是综合属性,则它是S属性。可 以按照分析树的自底向上顺序来计算各属性值。 后序遍历 postorder (N) { for (从左边开始,对N的每个结点C) postorder (C); 计算N的属性值; } S属性定义可以在自底向上语法分析过程中实现。
编译原理
编译原理
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
编译原理
3
语法制导翻译的一般过程
输入符号串 分析树
依赖图
语义规则的计算顺序
一个句子的翻译过程可以与语法分析过程并行。
编译原理 4
5.1 语法制导定义
语法制导定义是对CFG的推广,每个文法符号都有 一个相关的属性集。 属性:语义信息。一个文法符号通常用一个或若干 个属性来描述它的语义信息。典型例子: 变量的数据类型 表达式的值 变量的存储位置 程序的目标代码
编译原理 18
图5-7
T val 9
F val 3 digit lexval 1
*
inh 5 T′
syn 8 inh 6 T1′ syn 7
F val 4 digit lexval 2

编译原理
19
5.2.2 属性求值的顺序
拓扑排序:结点的一种排序,若mimj是从mi到mj 的边,那么在此排序中mi先于mj。 有向图变成线形排序 例:图5-7的一个拓扑排序 1,2,3,4,5,6,7,8,9 或1,3,5,2,4,6,7,8,9
2
介绍一种形式化的语义描述方法:语法制导的翻译, 包括两种具体形式 语法制导定义(Syntax-Directed Definitions, SDD):定义翻译所必须的语义属性和语义规则, 一般不涉及计算顺序。 翻译模式(translation schemes): 给出语义规 则的计算顺序。 介绍语法制导翻译的实现方法。
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
图5-9 float id1, id2, id3的分析树的依赖图
D T 4 type float in 5 L 6 , in 7 L 8 , in 9 L 10 id1 1 entry id3 L.attr:=addtype(L.in, id.entry) 结点6、8、 10是为 addtype过程 3 entry 引入的虚属 性
编译原理
9
综合属性: E.val, T.val, F.val, digit.lexval 在语法制导定义中,终结符号只有综合属性,它们 的值由词法分析程序提供;digit.lexval 假设开始符号没有继承属性。
编译原理
10
5.1.2 对SDD求值
S属性定义:仅仅使用综合属性的语法制导定义称 为S属性定义。 例5.1中的S属性定义详细说明了一台计算器读入包 含数字,括号,+和*运算符的算术表达式,随后再 读入一个换行字符n,然后打印出表达式值的过程 。 分析树各结点属性的计算可以自底向上地完成。
23
5.2.4 L属性定义
一个语法制导定义是L属性定义,如果任意一条产 生式A X1X2 ... Xn,其右部符号Xj(1 j n)的继承 属性仅依赖于 1. 产生式中Xj的左边的符号X1, X2 ,... Xj-1的属性; 2. A的继承属性。 对综合属性没有限制。显然,所有的S属性定义都 是L属性定义。
编译原理
5
5.1.1综合属性和继承属性
综合属性:在分析树结点N上的非终结符A的综合 属性是由N上的产生式所关联的语义规则来定义的。 A是产生式的头。结点N上的综合属性只能通过N的 子结点的属性值或结点N本身的属性值计算得到。 继承属性:在分析树结点N上的非终结符B的继承 属性是由N的父结点上的产生式所关联的语义规则 来定义的。 B出现在产生式的体中。结点N上的继 承属性只能通过N的父结点的属性值、结点N本身 的属性值或N的兄弟结点的属性值计算得到。
编译原理
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属性定义
编译原理
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)
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)
编译原理
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
继承属性
一个结点的继承属性值由该结点的父结点和(或) 兄弟结点的属性决定。
编译原理
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的语法树。
相关文档
最新文档