编译原理 第5章语法制导的翻译

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

属性和文法符号相关联 规则和产生式相关联

根据需要,将文法符号和某些属性相关联, 并通过语义规则来描述如何计算属性的值


E→E1+T E.code=E1.code || T.code || ‘+’ code表示了我们关心的表达式的逆波兰表示,规则说明 加法表达式的逆波兰表示由两个分量的逆波兰表示并置, 然后加上‘+’得到。
digitlexval=3
18
适用于自顶向下分析的SDD


前面的表达式文法存在直接左递归,因 此无法直接用自顶向下方法处理。 消除左递归之后,无法直接使用属性val 进行处理:


比如规则:T→FT’ T’→*FT’ T对应的项中,第一个因子对应于F, 而运算符在T’中。
19
相同表达式的不同文法的比较
38
例5.15 分析栈实现的例子

假设语法分析栈存放在一个被称为stack 的记录数组中,下标top指向栈顶;


stack[top]指向这个栈的栈顶;stack[top-1] 指向栈顶下一个位置; 如果不同的文法符号有不同的属性集合,我 们可以使用union来保存这些属性值。(归 约时,我们知道栈顶向下的各个符号分别是 什么)
语义翻译的流程
输 入 符 号 串 分 析 树 依 赖 图




的 计
实际上,编译中语义翻译的实现并不是 按图中的流程处理的;而是随语法分析 的进展,识别出一个语法结构,就对它 的语义进行分析和翻译。

9
5.1 语法制导定义

4.什么是语法制导定义(SDD) 上下文无关文法和属性/规则的结合;

12
5.1.1 继承属性和综合属性


不允许N的继承属性通过N的子结点上的属性来定 义,但是允许N的综合属性依赖于N本身的继承属 性。 终结符号有综合属性(由词法分析获得),但是 没有继承属性。
13
语法制导定义(SDD)的例子

目标: 计算表达式L的值 (属性val) 计算L的val值需要 E的val值 E的val值又依赖于 E和T的val值 … 终结符号digit有综 合属性lexval。
37
2 后缀SDT的语法分析栈实现

可以在LR语法分析的过程中实现



归约时执行相应的语义动作 定义可以记录各个文法符号的属性的union结构 栈中的每个文法符号(或者状态)的附带一个 这样的结构的值; 在按照产生式A→XYZ归约时,Z的属性可以在 栈顶找到,Y的属性可以在下一个位置找到,X 的属性可以在再下一个位置找到。
32

受控的副作用


受控副作用的例子

L→En


变量声明的SDD中的副作用

通过副作用打印出E的值 总是在最后执行,且不会影响其它属性的求值 addType将标识符的类型信息加入到标识符表中。 只要标识符不被重复声明,标识符的类型信息总是正确的。
print(E.val)
33
5.3 语法制导的翻译方案

D → T { L.in := T.type } L T → int { T.type := integer }
T → real { T.type := real }
L → { L1.in := L.in }L1,id{…} 语义——可以看成是相应文法符号的属性
8

适宜在进行推导时完成

S属性的SDD
27
5.2.3 S属性的SDD

每个属性都是综合属性 都是根据子构造的属性计算整个构造的属性。 在依赖图中,总是通过子结点的属性值来计 算父结点的属性值。可以和自顶向下、自底 向上的语法分析过程一起计算

自底向上:关的属性 递归子程序法中,在过程A()的最后计算A的属性
30
带有继承属性L.inh的语法制导定义 产生式 DTL T int T float L L1,id L id 语义规则 Linh:=T type T type :=integer T type :=float L1 inh :=L inh addtype(id entry,L inh) addtype(id entry,L inh)
第5章 语法制导的翻译
1
本章重点

语法制导定义

S属性定义 L属性定义 语法制导定义和翻译方案的关系

语法制导的翻译方案设计


自底向上实现L属性的SDD
2
语法制导的翻译
5.1 语法制导定义 5.2 SDD的求值顺序 5.3 语法制导的翻译方案
3
第五章 语法制导的翻译

翻译的任务

首先是语义分析和正确性检查,若正确,则翻译成 中间代码或目标代码。 语法结构具有规定的语义 根据翻译的需要设置文法符号的属性,以描述语法 结构的语义。 例如,一个变量的属性有类型,层次,存储地 址等。表达式的属性有类型,值等。

E→E1 + T T→T1 * F F →id
E.val:=E1.val+T.val T.val:=T1.val*F.val F.val:=id.val
7

适宜在完成归约的时候进行
5.1 语法制导定义
3. 典型处理方法(2) 在产生式的右部的适当位置,插入相应的语义动 作,按照分析的进程,执行遇到的语义动作
14
5.1.2 翻译方案的可视化
注释语法分析树
在分析树上求值有助于翻译方案的可视化,便 于理解。 包含了各个结点的各属性值的语法分析树
15
注释语法分析树

构造注释语法分析树步骤:


对于任意的输入串,首先构造出相应的分析树。 根据结点上的文法符号,每个结点都有相应的属 性值 按照分析树中的分支对应的文法产生式,应用相 应的语义规则计算属性值。


语法制导的翻译方案(SDT)是在产生 式体中嵌入程序片断(语义动作)的上 下文无关文法 SDT的基本实现方法:

建立语法分析树; 从左到右、深度优先地执行这些动作 基本文法是LR的,SDD是S属性的 基本文法是LL的,SDD是L属性的
34

用SDT实现两类重要的SDD

可在语法分析过程中实现的 SDT
28

自顶向下:

在分析树上计算SDD
按照后序遍历的顺序计算属性值即可 postorder(N) { for(从左边开始,对N的每个子结点C) postorder(c); 对N的各个属性求值; } 在LR分析过程中,我们实际上不需要构造 分析树的结点。

29
5.2.4 L属性的SDD

每个属性要么是
25
例5.5 依赖图的例子

3*2的注释分析树; T→FT’ {T.val = T’.syn; T’.inh = F.val;}


可能的计算顺序:

边e1、e2。
1,2,3,4,5,6,7,8.9 1,3,5,2,4,6,7,8,9
26
属性值的计算顺序




可以按照依赖图的拓扑排序计算各个属性的 值。 如果图中存在环,那么这个计算过程就无法 进行。 给定一个SDD,很难判定是否存在一棵分析 树,其对应的依赖图包含环。 但是特定类型的SDD一定不包含环,且有固 定的排序模式。
31
5.2.5具有受控副作用的语义规则

属性文法没有副作用,但是会增加描述的复 杂度


比如语法分析时如果没有副作用,符号表就必 须作为属性传递。 可以把符号表作为全局变量,然后通过副作用 函数来添加新标识符; 不会对属性求值产生约束,即可以按照任何拓 扑属性求值,不会影响最终结果。 添加部分简单的约束。
23
5.2.1 依赖图

依赖图描述了某棵特定的分析树上的各个属 性实例之间的信息流(计算顺序)

从实例a1到实例a2的有向边表示计算a2时需要 a1的值。(必须先计算a2,再计算a1)
24
5.2.1 依赖图
依赖图的构造方法 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构造一条有向边;

注意:T’的属性inh实际上是继承了相应的* 号的左运算分量。
21
例5.3 3*5的注释分析树

请观察inh属性是如何传递的。
22
5.2 SDD的求值顺序


在对SDD的求值过程中,如果结点N的属 性a依赖于结点M1的属性a1,M2的属性 a2,…。那么必须先计算出Mi的属性, 才能计算N的属性a。 显然,这些值的计算顺序应该形成一个 偏序关系。

实际实现SDT时,并不会真的构造语法分析 树,而是在分析过程中执行语义动作 判断是否可在分析过程中实现



将每个语义动作替换为一个独有的标记非终结符 号;每个标记非终结符号M的产生式为M→ε。 如果新的文法可以由某种方法进行分析,那么这 个SDT就可以在这个分析过程中实现。 注意:这个断言没有考虑变量值的传递等要求。

综合属性,要么是 继承属性,且产生式A→X1X2…Xn中计算Xi.a的 规则只能使用



特点:

A的继承属性 Xi左边的文法符号Xj的继承属性或综合属性。 Xi自身的继承或综合属性。且这些属性的依赖关系不 形成环。
依赖图的边总是从左到右,从下到上。 在扫描过程中,计算一个属性值时相关的依赖 属性都已经计算完成了。
5
5.1 语法制导定义
2. 代码结构


计算学科:对信息(数据表示)描述和变换算法 的系统研究 变换:源、目标以及源与目标的对应关系 语句的代码结构 语句分类: 说明语句——符号表的查填 可执行语句——指令代码
6
5.1 语法制导定义
3. 典型处理方法(1) 对应每一个产生式编制一个语义子程序, 当一个产生式获得匹配时,调用相应的 语义子程序实现语义检查与翻译

如果某个规则N的属性a为f(N1.b1,N2.b2,……,Nk.bk), 那么我们需要先算N1.b1,N2.b2,……,Nk.bk的值。
16
5.1.2 翻译方案的可视化


如果可以给各个属性值排出顺序,那么这个注 释分析树就可以计算得到。 S属性的SDD一定可以按照自底向上的方式求值。 但是下面的SDD不能计算
属性值的计算和产生式相联系。随着语法分析的进行, 执行属性值的计算,完成语义分析和翻译的任务。
4

基本思想


5.1 语法制导定义
1. 语义分析的任务 语义检查

例:类型、运算、维数、越界
例:变量的存储分配 例:表达式的求值 例:语句的翻译(中间代码的生成)

语义处理


总目标:生成等价的中间代码


输入串:3*4*5 请观察左边的T对应的部分,和右边的T’对应部分 计算方法:把T’之外的部分的值继承给T’。
T T T * F digit:3 * F digit:5 F * T T’ F digit: 4 * T’ T
F
digit:3
digit:4
F
T’
20
digit:5 ε
适用于自顶向下分析的SDD
10
5.1 语法制导定义
5.语法制导的翻译 在产生式体中加入语义动作,并在适当的时 候执行这些语义动作

E→E1+T
{print ‘+’;}
11
5.1.1 继承属性和综合属性


综合属性(synthesized attribute):分析树结点N上的 非终结符号A的属性值由N的产生式所关联的语义 规则来定义,又称为S-属性定义。 必然通过N的子结点或N本身的属性值来定义 继承属性(inherited attribute):分析树结点N的属性 值由N的父结点所关联的语义规则来定义。又称为 L-属性定义。 依赖于N的父结点、N本身和N的兄弟结点上的属 性值。
35
5.3.1后缀翻译方案

文法可以自底向上分析且SDD是S属性的



可以构造出SDT,且所有的动作都放在产生 式最后; 分析过程中在按照这个产生式归约时执行这 个动作; 计算得到的属性值放在栈中;

所有动作都在产生式最右端的SDT称为 后缀翻译方案
36
1 后缀翻译方案的例子

实现桌上计算机的后缀SDT

A→B
A.s=B.i;B.i=A.s+1;
17
例5.2 输入:3*5+4n的 注释语法分析树
L val=19
Eval=19 +
n
Eval=15 Tval=15
Tval=4 Fval=4
Tval=3
Fval=3
*
Fval=5 digitlexval=5
digitlexval=4
相关文档
最新文档