6 属性文法和语法制导翻译

合集下载

属性文法与语法制导翻译

属性文法与语法制导翻译
在一个属性文法中,对应于每个产生式A都有一 套与之相关联的语义规则,每条规则的形式为 b:=f(c1,c2…ck)
这里,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
第六章 属性文法和语法制导翻译
操作语义
描述一段程序的含义是通过执行该段程序所改
变的计算机(虚拟计算机)状态来反映。这个计算机的 状态与程序执行时的状态相对应:包括变量的所有值, 可执行程序本身,各种系统定义的内部数据结构。计算 机里所有的寄存器的值和存储单元的值作为计算机的状 态,用一组形式定义的操作来说明执行一条指令相应的 状态怎样变化。

2019年六章语法制导翻译与属文法.ppt

2019年六章语法制导翻译与属文法.ppt
2019/4/24 16
继承属性


当分析树的结构同源代码的抽象语法不“匹 配”时,继承属性将非常有用。下面的例子 可以说明怎样用继承属性来解决这种不匹配 问题,产生这种不匹配的原因是因为文法通 常是为语法分析而不是为翻译设计的。 例6.2


考虑如何在自顶向下的分析过程中计算3*5和 4*8*9这样的表达式项 消除左递归之后的算数表达式文法的一个子集: T→FT ' T '→*FT1' T '→ε F→digit

概念术语





综合属性:节点的属性值是通过分析树中该 节点或其子节点的属性值计算出来的 继承属性:节点的属性值是由该节点、该节 点的兄弟节点或父节点的属性值计算出来的 固有属性:通过词法分析直接得到的属性 依赖图:描述属性之间依赖关系的图,根据 语义规则来构造 注释分析树:节点带有属性值的分析树
2019/4/24
7
6.1 语法制导翻译概述

一个文法符号X所携带的语义信息称为X的语 义属性,简称为属性,它是根据翻译的需要设 置的(对应分析树结点的数据结构),主要用于 描述语法结构的语义。

一个变量的属性有类型、层次、存储地址等 表达式的属性有类型、值等。
2019/4/24
8
6.1 语法制导翻译概述
2019/4/24 22
依赖图的构造方法
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的有向边;

第六章 属性文法与语法制导翻译-0

第六章 属性文法与语法制导翻译-0
第六章 属性文法和语法制导翻译
本章的主要内容: • 属性文法和语法制导的翻译的概念 • 综合属性和继承属性的概念、特点 • S-属性文法与L-属性文法的概念及分析方法 • 翻译模式 • 递归下降翻译器的设计
语法制导翻译
记号流
语法分析器
抽象语法树 或者汇编代码
syntax + translation rules (typically hardcoded in the parser)
基于属性文法的处理办法
语法制导翻译 基于属性文法的处理过程通常是: 对单词符号串进行语法分析,构造语法分 析树,然后根据需要遍历语法树,并在语 法树的各结点处按语义规则进行计算。
输入串
分析树
依赖图 图6.1 语法制导翻译的概观
语义规则的计算
在具体实现时,一般都是随语法分析的进展, 识别出一个语法结构,就对它的语义进行分析和 翻译。也就是语义分析是伴随语法分析的过程进 行。
语义规则
E → E1 + T E.loc=newtemp(), E.code = E1.code || T.code || add E1.loc,T.loc,E.loc E→T E.loc = T.loc, E.code=T.code T → T1 * F T.loc=newtemp(), T.code = T1.code || F.code || mult T1.loc,F.loc,T.loc T→F T.loc = F.loc, T.code=F.code F → ( E ) F.loc = E.loc, F.code=E.code F → id F.loc = , F.code=“”
(2)属性(Attribute)是编程语言结构的任意 特性。属性在其包含的信息和复杂性等方面变化 很大。属性的典型例子有: • 变量的数据类型。 • 表达式的值。 • 存储器中变量的位置。 • 程序的目标代码。 • 数的有效位数。

最新六章语法制导翻译与属文法

最新六章语法制导翻译与属文法

2021/1/11
10
典型处理方法二
翻译模式
通过将属性与文法符号关联,并将语义规则插入到产生式 的右部来描述语言结构的翻译方案
在产生式的右部的适当位置,插入相应的语义动 作,按照分析的进程,执行遇到的语义动作
D → T { L.inh := T.type } L
T → int { T.type := integer }
这两种情况下,都说属性b依赖于属性c1,c2,…,ck
2021/1/11
14
例6.1 台式计算器的语法制导定义
产生式 LEn E E1+T E T T T1*F T F F (E) F digit
语义规则 print(Eval)(可看作是L的虚属性) Eval := E1val+Tval Eval := Tval Tval := T1val+Fval Tval := Fval Fval := Eval Fval := digitlexval
E→E1 + E2
E.val:=E1.val+E2.val
语法结构具有规定的语义
问题:如何根据被识别出的语法成分进行 语义处理?
亦即怎样将属性值的计算及翻译工作同产生式 相关联?
2021/1/11
9
典型处理方法一
语法制导定义
通过将属性与文法符号关联、将语义规则与产生 式关联来描述语言结构的翻译方案
2021/1/11
16
继承属性
当分析树的结构同源代码的抽象语法不“匹 配”时,继承属性将非常有用。下面的例子 可以说明怎样用继承属性来解决这种不匹配 问题,产生这种不匹配的原因是因为文法通 常是为语法分析而不是为翻译设计的。
例6.2

编译原理第六章属性文法和语法制导翻译

编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[1] 法制导翻译的大体思想; [2] 属性文法的大体概念; [3] 基于属性文法的处置方式;[4] 在自上而下分析和自下而上分析中的属性计算。

大体要求:[1] 明白得语法制导翻译和属性文法的大体思想和方式, [2] 把握属性的计算方式。

教学要点:本章中,咱们将第一介绍属性文法的大体概念,然后介绍基于属性文法的处置方式,讨论如安在自上而下分析和自下而上分析中实现属性的计算。

讲义摘要:6.1 属性文法一、语义分析的任务一、静态语义分析或静态审查。

例如,类型检查、操纵流检查(操纵流语句必需使操纵转移到合法的地址 )、维数检查、越界检查、名字的作用域分析 等。

二、动态语义处置。

若是静态语义正确,语义处置那么要执行真正的翻译。

例如,变量的存储分派;表达式的求值;语句的翻译(中间代码的生成)。

3、总目标:生成等价的中间代码二、属性文法 一、属性所谓属性,其涉及的概念比较普遍,经常使用以描述事物或人的特点、性质,品质等等。

比如,谈到一个 物体,能够用“颜色”描述它,谈起某人,能够利用“有幽默感“来形容他。

对编译程序利用的语法树的结点,能够用"类型"、"值"或"存储位置"来描述它。

二、属性文法(也称属性翻译文法)属性文法是Knuth 在1968年第一提出的。

它是在上下文无关文法的基础上,为每一个文法符号(终结符或非终结符)配备假设干相关的“值”(称为属性)。

这些属性代表与文法符号相关信息,例如它的类型、值、代码序列、符号表内容等等。

属性与变量一样,能够进行计算和传递。

属性加工的进程即是语义处置的进程。

关于文法的每一个产生式都配备了一组属性的计算规那么,称为语义规那么。

语义规那么所描述的工作能够包括属性计算、静态语义检查、符号表操作、代码生成等等。

3、属性文法的形式化概念形式上讲,一个属性文法是一个三元组:A=(G,V,F),其中 G:是一个上下文无关文法。

第6章 属性文法和语法制导翻译 (编译原理 陈火旺).

第6章  属性文法和语法制导翻译 (编译原理 陈火旺).

3
CH.6 属性文法和语法制导翻译
• 在分析-综合模式的编译器中,语义分析是分 析过程的最后一个步骤,只有在这一步才真 正开始考虑程序语言的意义,并着手把它们 翻译成某种中间代码。这一过程通常采用的 方法是属性文法和语法制导翻译方法。 • 语法制导翻译方法的基本思想是,根据翻译 的需要设置文法符号的属性,用属性描述语 法结构的语义,用属性的计算完成翻译。 • 属性文法使文法符号属性值的计算和产生式 相联系。随着语法分析的进行,执行属性值 的计算,从而完成语义分析和翻译的任务。
37
抽象语法树:简例
• 例,为下面文法的句子 a-4+c 建立抽象语法树。 E E+T | E-T | T T (E) T id | num • 为每个运算量或运算符号都建立一个结点。 E • 可以根据表达式的运算顺序自下而上的构造 --+ 语法树 E + T 手工构造。 抽象语法树

9
属性文法、语义规则(2)
• 属性文法的形式: 产生式 语义规则 . 综合属性 A b:=f(c1,c2,…,ck) – 例如 P137.表6.1的属性文法: 继承属性 • EE1+ T E.val := E1.val+ T.val 综合属 – 例如 P139.表6.2的属性文法: 性 DTL L.in := T.type LL1 , id L .in := L.in 1 继承属性 继承属性
10
• 例, P137.
假设:
产生式 ABC
语义规则 A.b:=A.a+B.c C.d:=B.c+1 A有综合属性b和继承属性a B有综合属性c C有继承属性d
继承属性A.a和综合属性B.c在其他适当的地方计算。

第6章 属性文法和语法制导翻译

第6章 属性文法和语法制导翻译
D
T T.type=real real L L.in=real L.in=real , L L.in=real , L id1 id2
产生式 D→TL T→int T→real 语义规则 L.in:=T.type T.type:=integer T.type:=real addtype(id.entry,L.in) addtype(id.entry,L.in)
产生式 N→S1.S S→S1B S→B B→0 B→1 语义规则 {N.v=S1.v+S.v*2-S.L} {S.v=S1.v*2+B.v,S.L=S1.L+1 } {S.v=B.v,S.L=1} {B.v=0} {B.v=1}
S
S B
.
S
S
B
B
1
1
B
0
1
23
1 属性文法
举例3:文法G(N):N→S.S S→SB S→B 1. 方案1:计算综合属性S.L N→S1.S N {N.v=S1.v+S.v*2-S.L} S→S1B S2 . {S.v=S1.v*2+B.v, S.L=S1.L+1} S1 B S→B {S.v=B.v, S.L=1} B 1 B→0{B.v=0} B→1{B.v=1} 1 B→0 B→1
产生式 N→S1.S S→S1B S→B B→0 B→1 语义规则 {N.v=S1.v+S.v,S1.f=1,S.f=2-S.L} {S.L=S1.L+1,S1.f=S.f*2,B.f=S.f,S.v=S1.v+B.v} {S.L=1,B.f=S.f,S.v=B.v} {B.v=0} {B.v=B.f}
第6 章 属性文法和语法制导翻译
语义分析 静态语义分析 类型检查、控制流检查、一致性检查 名字的作用域分析 动态语义分析 栈溢出 数组越界

第六章语法制导翻译与属文法

第六章语法制导翻译与属文法

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章 属性文法及语法制导翻译 (编译原理 陈火旺)讲诉

第6章  属性文法及语法制导翻译 (编译原理 陈火旺)讲诉
7

(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章_属性文法和语法制导翻译

第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的一个虚属性。 式的值的一个过程,我们可认为这条规则定义了 的一个虚属性。 的一个虚属性 某些非终结符加下标 非终结符加下标是为了区分一个产生式中同一非终结符多 某些非终结符加下标是为了区分一个产生式中同一非终结符多 次出现

第六、七章 属性文法、语法制导翻译与中间代码

第六、七章 属性文法、语法制导翻译与中间代码

最简单的翻译程序---有限变换器
a1
a2

an
只读输入磁带
有限控制器
b1 b2 b3
只写输出磁带
• 定义: 一个有限变换器M是一个六元组(Q,Σ,∆, δ,q0 ,F),其中 (1) Q是状态的有限集. (2) Σ是有限的输入字母表. (3) ∆是有限的输出字母表. (4) δ是从Q×(Σ ∪{ε})到Q× ∆* 的一些有限子集 * 的映射。 (5) q ∈Q是初始状态。 0 (6) F⊆Q是终态集。
• 类型相容性 变量先声明后引用 名称相关要求 • 解释执行动态语义(计算)生成代码...
如 i f B t h e n S 1 e l s e S2
B Y S1
N
S2
B 的代码 条 件 假转 S1 的 代• • • • 文法模型---- 属性文法 命令式或操作式模型 ----- 操作语义学 应用式模型-----指称语义学 公理式模型-----公理语义学 规格说明模型-----代数数据类型
+/e
+/e q2 a/a +/e

q0
-/e
-/e
a/+a q1 a/-a
-/e
-/e
a/-a q4 -/e q3
+/e
+/e
• M的一个组态为三元组 的一个组态为三元组(q,x,y),其中 的一个组态为三元组 , (1)q∈Q是有限控制器的当前状态 ∈ 是有限控制器的当前状态 * (2)x∈Σ 是输入磁带上尚存的输入符号串,且x ∈ 是输入磁带上尚存的输入符号串, 的最左边那个符号在输入头底下。 的最左边那个符号在输入头底下。 * (3)y∈∆* 是到此时为止已发出的输出符号串。 ∈ 是到此时为止已发出的输出符号串。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实际上,编译中语义翻译的实现并不是按 上图的流程处理的;而是随语法分析的进展, 识别出一个语法结构,就对它的语义进行分析 和翻译。
1.依赖图
语义规则建立了属性之间的依赖关系,这些 关系可以用图来表示,这样的图称为依赖图。
2.树遍历的属性计算方法
假设语法树已经建立了,并且树中已 带有开始符号的继承属性和终结符的综合 属性。然后用深度优先,从左到右的遍历 方法遍历语法树,直至计算处所有属性。 如果需要,可进行多次遍历(遍)。
第六章属性文法和语法制导翻译
要对语法正确的源程序进行翻译:首先要进 行语义检查(详见龙书第六章及补充材料) ,若正 确,则翻译成中间代码或目标代码。 语义分析和中间代码生成使用的大多是语法 制导翻译方法。其思想是,根据翻译的需要为每 个文法符号设置属性,以表示文法符号的信息。 例如,一个变量的属性有类型、值、存储地址等; 表达式的属性有类型、值等。 属性值的计算和产生式相联系。随着语法分 析的进行,属性值也同时进行计算和传递,完成 语义分析和翻译的任务(语法制导)。
通常: 对出现在产生式右边的继承属性和出现在产 生式左边的综合属性都必须提供一个计算规则。 且属性计算规则中只能用相应产生式中的文法符 号的属性(利于封装)。 出现在产生式左边的继承属性和出现在产生 式右边的综合属性不由所给产生式的属性计算规 则进行计算,而由其它产生式的属性规则或由属 性计算器的参数提供。 例:ABC A.a (A继) A.b (A综) B.c (B综) C.d (C继) 可能有 C.d:=B.c+1 A.b:=A.a+B.c 而A.a和B.c在其它地方计算。
属性依赖图
A的继承属性
A.b
A的继承属性
A
X1.c1
X2.c2 …

X1.c1
X2.c2 Xk.b …
综合属性A.b的计算
继承属性Xk.b的计算
特别强调:
(1)终结符只有综合属性,它们由词法分 析器提供。 (2)非终结符既可以有综合属性,也可以 有继承属性,文法开始符号的所有继承属 性作为属性计算前的初始值。
T.type :=real
L L1,id
L id
L1.in :=L.in
addtype(id.entry, L .in) addtype(id.entry, L .in)
D
T real 4 type in 5 L , 6
in 7 in 9 L 10
L ,
8
id3 3 entry
id2 2 entry 每个L结点都带有继承属性
产生式s→if B then S1 else S2的抽象语法树 if-then-else / | \ B S1 S2
赋值语句的抽象语法树 assignment / \ variable expression 在抽象语法树中,运算符号和关键字都不 在叶结点,而是在内部结点中出现。
例:建立表达式的抽象语法树 (类似后缀形式)
3 继承属性
继承属性值是由此结点的父结点和/或兄 弟结点的某些属性值来决定的。 例6.2 利用继承属性解决变量说明中的类 性定义: int a,b,c
表6.2 带有继承属性L.in的语法制导定义 产生式
DTL
语义规则
L.in:=T.type
T int
T real
T.type :=integer
关于语法和语义: 语法是指语言的结构;语义是指附着于语言结构上 的实际含意 ,即语言的“意义”。 •语义不能离开语法独立存在; •语义远比语法复杂; •同一语言结构可包含多种含意,不同语言结构表示相 同含意; •语法与语义之间没有明确的界线。 语义分析的两个作用: 检查是否结构正确的句子所表示的意思也合法; 执行规定的语义动作,如:表达式求值 符号表填写 中间代码生成等 语义分析的方法: 语法制导翻译
每个非终结符都有一个综合属性val,表示它 的整数值。产生式左边的属性值由右边计算。
属性依赖图:
3+4×5
E. val = 23
E. val = 3
+
E. val = 4
E. val = 20
number. lex_val = 3
×
E. val = 5
number. lex_val = 4
number. lex_val = 5
AXYZ A.a:=f(X .x, Y .y,Z .z) A .a X .x Y .y Z .z
top
ntop
state ... X Y Z
val ... X.x Y.y Z.z
top
state ... A
val ... A .a
定义式 A .a:=f(X.x, Y.y, Z.z)(抽象)变成 val[ntop]:=f(val[top-2],val[top-1],val[top])(具 体可执行代码)。 在执行代码段之前执行:
建立结点使用的函数: 1. mknode(op,left,right) 建立一个运算符号结点, 标号是op,两个域left和right指向运算分量结点 的指针。 2.mkleaf(id,entry) 建立一个标识符结点,由标号 id标识,一个域entry指向标识符符号表中相应 的项。 3. mkleaf(num,val) 建立一个数结点,标号为num, 域val用于存放数的值。 函数返回新建立结点的指针。
L E.val:=19 E.val:=15 T.val:=15 + n T.val:=4
F.val:=4
F.val:=5
T.val:=3
F.val:=3
*
digit.lexval:=4
digit.lexval:=5
digit.lexval:=3
综合属性值的计算方法:
对于S-属性定义,通常使用自底向上的分 析方法,在建立每一个结点处使用语义规则来 计算综合属性值,即在 用哪个产生式进行归约 后,就执行那个产生式的S-属性定义计算属性 的值,从叶结点到根结点进行计算。
ntop:=top-r+1
r是句柄的长度
执行代码段后执行: top:=ntop;
表6.5用LR分析器实现台式计算器(对比slide 10)
产生式 代码段
LEn
E E+T
printf(val[ntop])
val[ntop]:=val[top-2]+val[top] val[ntop]:=val[top-2]*val[top] val[ntop]:=val[top-1]
语法制导翻译的具体方法:
1. 将文法符号所代表的语言结构的意思,用 附着于该文法符号的属性表示; 2. 用语义规则规定产生式所代表的语言结构 之间的关系(即属性之间的关系),即用 语义规则实现属性计算。 3. 语义规则的执行:在语法分析的适当时刻 (如推导或归约)执行附着在对应产生式 上的语义规则,以实现 对语言结构语义的 处理,如计算、查填符号表、生成中间代 码、发布出错信息等。
id1 1 entry
6.2 基于属性文法的处理方法


符 号 串
分 析 树
依 赖

语 义 规 则 的 计 算
析,构造语 法分析树,然后根 据需要遍历语法树 并在语法树的各结 点处按语义规则进 行计算。 这种由源程序 的语法结构所驱动 的处理方法就是语 法制导翻译。
下图为一个带有综合属性值域的分析栈: state val ... ... X X.x Y Y.y top Z Z.z ... ...
若有产生式A
b:=f(c1,c2,…,ck)
b是A的综合属性,ci(1 ik)是中符号的属 性。综合属性的值在自底向上的分析过程中, 每步归约时,计算相应的属性值。
3. 一次扫描的处理方法
在语法分析的同时计算属性值,而不是在 语法分析构造语法树之后进行属性计算。无需 构造语法树。 一遍扫描的处理方法与语法分析器交互工 作,它与所采用的语法分析方法和属性的计算 次序密切相关。
L属性文法可用于一遍扫描的自上而下分析, 而S属性文法适用于一遍扫描的自下而上的分析。
表6.1 简单台式计算器的属性文法
产生式 LEn 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
自底向上地构造a-4+c 的抽象语法树
(1)p1:=mkleaf(id,entrya) (2)p2:=mkleaf(num,4) (3)p3:=mknode(‘-’,p1,p2)
+
(4)p4:=mkleaf(id,entrye) (5)p5:=mknode(‘+’,p3,p4)
– id num 4
属性值的设置与语法结构的语义以及翻译程 序的需要有关。
例如,把表6.1中的类型扩充到 int和real,就 出现了表6.2(Slide 11)中的类型属性 。
2 综合属性
S-属性文法:只使用综合属性的文法。 结点属性值的计算正好和自底向上分析建立 分析树结点同步进行。 例6 .1 用表6.1中的属性文法对表达式进行计 算。 设输入的表达式为:3*5+4n n是换行符。
4.抽象语法树
抽象语法树(Abstract syntax tree): 去掉了在语法分析树中对语义无关紧要的成分, 是分析树的抽象形式。 抽象语法树是常用的一种中间表示形式。 语法分析过程中完成翻译有许多优点,但也有一 些不足: 1.适于语法分析的文法可能不完全反映语言成分 的自然层次结构; 2. 语法分析方法限制,对分析树结点的访问序和 翻译需要的访问序不一致。
相关文档
最新文档