编译原理6-4.1-L属性文法-翻译模式
L-属性文法和自顶向下翻译(1)

8
翻译模式示例:把带加号和减号的中缀表
达式翻译成相应的后缀表达式
E→TR
R→addop T {print(addop.lexeme)} R1 | T→num {print(num.val)}
E
例:9-5+2
T
R
9 {print(‘9’)} -
T {print(‘-’)} R
15
产生式 语义规则
S→B
B.ps :=10
翻译模式
B→B1B2
S.ht :=B.ht B1.ps :=B.ps
B2.ps :=B.ps
S → {B.ps:=10} B {S.ht:=B.ht}
B.ht := max(B1.ht, B2.ht)
B→B1 sub B2 B1.ps :=B.ps B2.ps :=shrink(B.ps)
编译原理
第六章 属性文法和语法制导翻译
1
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
2
第六章 属性文法和语法制导翻译
属性文法 基于属性文法的处理方法 S-属性文法的自下而上计算 L-属性文法和自顶向下翻译
3
3. 产生式左边非终结符的综合属性只有在它所引用 的所有属性都计算出来以后才能计算。计算这种 属性的动作通常可放在产生式右端的末尾
S → A1A2 A→a
{A1.in:=1; A2.in:=2} {print(A.in)}
12
排版软件 TeX、LaTeX
The quadratic formula is b b2 4ac 2a
编译原理6-1-属性文法

real id1, id2, id3 的带注释的语法树 综合属性 D T .type = real real
D → TL T→ int →
L.in := T.type T. type := integer
T→ real T. type := real → L→ L1, id L1.in := L.in; → addtype (id.entry,L.in ) L→ id addtype (id.entry,L.in ) →
注意
只有综合属性, 终结符 只有综合属性,它们由词法分析器提供 非终结符 既可有综合属性也可有继承属性
产生式A→ 有规则 例: 产生式 →BC有规则
继承属性 A B C
C.d := B.c+1 + A.b := A.a+B.c +
综合属性
S-属性文法
仅仅使用综合属性的属性文法称 属性文法 仅仅使用综合属性的属性文法称 S-属性文法 综合属性 在语法树中,一个结点的综合属性的值由其 在语法树中,一个结点的综合属性的值由其 综合属性 子结点的属性值确定 的属性值确定。 子结点的属性值确定。 通常使用自底向上的方法在每一个结点处使用 通常使用自底向上的方法在每一个结点处使用 自底向上 语义规则计算综合属性的值。 语义规则计算综合属性的值。
(c)
F
3+4*5
3+4 * 5
3 +4*5
345* +
345
G:
N→S.S → S →SB S →B B →0 B →1
补充例 3 给文法配备语义规则, 给文法配备语义规则 完成二进制到十进制的转换 输入- 输入- 11.01 输出- 输出- 3.25
11.01= 1*21+1*21+0*2-1+1*2-2
编译原理(4)语义_1(属性文法和语法制导翻译)

表达式左侧的非终结符语义值来自于右侧语义的计算, 因此称为综合属性
4.2 属性文法(继承属性)
再举一例说明属性文法。一简单变量类型说明的文法G[D]如 下: G[D]: D→int L | float L
L→L, id | id
其对应的属性文法为 产生式
(1) D→TL (2) T→int (3) T→float (4) L→L(1),id
s3
# (1)
E7 →E(1) + E(2)
_
_
val[TOP]= val[+T9O*P5]#+val[TOPr+42]
#E
_7
+9*5#
s4
(2) E→E(1)*E(2)
val[TOP]=val[TOP]* val[TOP+2]
# E+
_7_
9*5#
s3
(3#) EE+→9(E(1)) _7_ _val[TOP]=val[TOP*+51#]
<布尔表达式e的逆波兰式><顺序号>BF 分别表示当e为真或假时转移到顺序号处。其中,布尔表达式 e的逆波兰式和顺序号是两个特殊的运算分量。
实例:条件语句的逆波兰表示
例如,条件语句if(m<n) k=i+1;else k=i−1的逆波兰式表示为 ((1)~(18)为单词编号)
(1) mn< (4) 13BF (6) ki1+= (11) 18BR (13) ki1−= (18) {if语句的后继语句}
4.3 几种常见的中间语言 (1) 赋值语句 “<左部> = <表达式>” 的逆波兰表示为
编译原理第六章:属性文法和语法制导翻译

(1)产生式xj的左边符号x1,x2,…xj-1的属性; (2)A的继承属性 L-属性文法最大特点是产生式右部符号的继承属性不依赖于
其右部符号的任何属性。
注:S-属性文法一定是L-属性文法 • S-属性文法适合于一遍扫描的自下而上分析 • L-属性文法可用于一遍扫描的自上而下分析
3.翻译模式:给出了使用语义规则进行计算的次序,这样可 把某些实现细节表现出来,在翻译模式中,和文法符号 相关属性和语义规则(语义动作),用花括号{ }括起来, 插入到产生式右部的合适位置上。
复习题
名词术语: 属性文法、继承属性、综合属性 语法制导翻译、抽象语法树、翻译模式 S-属性文法、L-属性文法
第六章 属性文法和语法制导翻译
6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.5 自下而上计算继承属性
6.1 属性文法(属性翻译文法)
一.属性文法 1.属性文法定义
(上下文无关文法+属性/属性符号定义+属性规则定义) 即: 在上下文无关文法的基础上,为每个文法符号(终结 符或非终结符)配备若干相关的值(称为属性)。
表 6.2(P139) 带继承属性 L.in 的属性文法
产生式
语义规则
D→TL
L.in:=T.type
T→int
T.type:=integer
T→real
T.type:=real
L→L1,id
L1.in:=L.in
addtype(id.type,L.in)
语义分析和语法制导翻译-编译原理-06-(二)

是语法结构树指针 是名字的表项入口 是数值
id.entry num.val
树构造函数
mknode 建中间结点 mkleaf 建叶结点
生成语法树的属性文法
产生式 S→id:=E 语义规则 S.p:= mknode(':=', mkleaf(id, id.entry), E.p)
E→E1+E2 E.p:= mknode('+', E1.p, E2.p) E→E1*E2 E.p:= mknode('*', E1.p, E2.p) E→ -E1 E→ (E1) E→ id E→ num E.p:= mknode('-', 0, E1.p) E.p:= E1.p E.p:= mkleaf(id, id.entry) E.p:=mkleaf(num,num.val)
翻译模式的设计
D → T { L.in := T.type } L T → int { T.type := integer } T → real { T.type := real } L → { L1.in := L.in } L1 , id { addtype(id.entry, L.in) } L → id { addtype(id.entry, L.in) }
从其兄弟结点和父结点的属性值计算出来的 如:L.in
固有属性(单词属性)
属性的计算
构造语法分析树,填加响应的语义规则 综合属性
自底向上按照语义规则来计算各结点的综
合属性值
继承属性
需要探讨计算次序
例6-3:3*5+4 的
语法树与属性计算
E.val=15 T.val=15 T.val=3 F.val=3 digit.attr=3 *
语法制导翻译及属性文法-编译原理-06-(一)讲诉

5. S-属性定义(S-属性文法)
S-属性定义:仅包含综合属性的属性
文法(语法制导定义)
S-attributed S-attributed
Definition Grammar
如:算术表达式求值的属性文法
2018/11/19 25
非S-属性定义
D→T L
T→int
L.in := T.type
要解决的问题: 1. 纪录标识符的类型 2. 类型信息传递 方法:用T.type记录类 型信息,并传给L.in
14
例6-2 说明语句的属性文法
D→TL
T → int T → real L → L1,id 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 )
2018/11/19
F.val := E.val
F.val := digit.lexval lexval 是单词 digit 的属性
13
例6-2 说明语句的属性文法
说明语句的文法
D→TL T → int T → real L → L1,id L → id
2018/11/19
real operand, length, sum int add, sub, mult
是一种接近形式化的语义描述方法 长于描述静态语义、短于描述动态语义 每个语法符号有相应的属性符号 每个产生式有相应计算属性的规则
属性变量:=属性表达式
2018/11/19 8
属性文法举例
产生式 E → E1 + E2 属性(计算)规则/语义规则 E.val := E1.val + E2.val
编译原理compiler6语义分析

◆语法制导定义是对上下文无关文法的推广
◆属性
综合属性 继承属性
◆依赖图 语义规则建立了属性之间的依赖关系,这
些关系可以用图来表示,这样的图称为依赖图。
4
6.1.1 语法制导定义的形式
在一个语法制导定义中,A→P都有与之相关
联的一套语义规则,规则形式为
b:= f(c1,c2,…,ck),
f是一个函数,而且
终极符则只能有综合属性,而不能有继承属性。
非终结符既可有综合属性也可有继承属性
1
图6.1 ห้องสมุดไป่ตู้法制导翻译的概观
语
输 入
分
依
义 规
符
析
赖
则
号 串
树
图
的 计
算
一般来说,语义翻译可按图6.1 的流程处理。 实际上,编译中语义翻译的实现并不是按图6.1 的流 程处理的;而是随语法分析的进展,识别出一个语法 结构,就对它的语义进行分析和翻译。
19
6.2.2 建立表达式的语法树
建立表达式的语法树使用的函数
1. mknode(op,left,right) 建立一个运算符号结点,标 号是op,两个域left和right指向运算分量结点的指针。
2.mkleaf(id,entry) 建立一个标识符结点,由标号id标 识,一个域entry指向标识符符号表中相应的项。
val[ntop]:=val[top-2]*val[top]
val[ntop]:=val[top-1]
29
表6.5 输入串3*5+4n的语义分析过程
输入 state val
3*5+4n -
-
*5+4n 3
3
编译原理第六章属性文法和语法制导翻译

第六章 属性文法和语法制导翻译要紧内容:[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属性定义的分析树的分析方法——自底向上的在每个 节点用语义规则来计算综合属性值。
编译原理 语法制导翻译

TinyC中的语法树
typedef enum {StmtK,ExpK} NodeKind; typedef enum {IfK,RepeatK,AssignK,ReadK,WriteK} StmtKind; typedef enum {OpK,ConstK,IdK} ExpKind; typedef enum {Void,Integer,Boolean} ExpType; #define MAXCHILDREN 3 typedef struct treeNode { struct treeNode * child[MAXCHILDREN]; struct treeNode * sibling; int lineno; NodeKind nodekind; union { StmtKind stmt; ExpKind exp;} kind; union { TokenType op; int val; char * name; } attr; ExpType type; /* for type checking of exps */ } TreeNode;
作为中间表示形式——分离分析与翻译
在进行语法分析的同时进行翻译存在缺
陷:
适合分析的文法可能未反映自然的语言结构 分析顺序可能与翻译顺序不一致
利用语法制导翻译方法来构造语法树
5.2.1 语法树
(抽象)语法树,压缩形式
关键字和运算符均在内部节点
链式结构会被压缩
语法树压缩例
digit.lexval:终结符只有综合属性,由词法分 析器提供 开始符号通常没有继承属性
5.1.2 综合属性
只有综合属性: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)良定义的:若⼀个属性⽂法不存在属性之间的循环依赖关系,则称该⽂法为良定义的。
编译原理自顶向下翻译递归下降翻译(与“属性”有关文档共17张)

第2页,共17页。
算术表达式的左递归文法相应的翻译模式
E →E1+T E →E1-T E →T T →(E) T →num
{E. val := E1. val + T. val } {E. val := E1. val - T. val } {E. val := T. val } {T. val := E. val } {T. val := num. val }
第9页,共17页。删Fra bibliotek左递归后:引入非终结符R
E T { R.i := T.nptr }
R
{ E.nptr := R.s }
R +
T { R1.i := mknode(‘+’, R.i, T.nptr) }
R1
{ R.s := R1.s }
R -
T
{ R1.i := mknode(‘-’, R.i, T.nptr) }
{R.s := R.i }
{T.val := E. val } {T. val := num. val}
图6.14 消除左递归后的翻译模式
第4页,共17页。
对于自顶向下分析,我们假定动作是在处于相同位置上 的符号被展开(匹配成功)时执行的。
E
T.val=9
R.i=9
num.val=9
- T.val=5
A.a := g(g(f( X.x), Y1.y), Y2.y)
i := g(f(X.
Y1
R
{R.
R.i := g(f(X.x),Y .y) i R s
1
A.a := g(f( X.x), Y .y) Y 对每个非终结符A构造一个函数过程,1对A的每个继承属2性设置一个形式参数,函数的返回值为A的综合属性(作为记录,或指向记录的
编译原理与技术 语法制导翻译(1)

Eid
E.nptr := mkleaf(‘ID’,id.entry)
2024/8/7
《编译原理与技术》讲义
15
e.g.4 构造表达式的语法树(DAG)
E.nptr - E的语法树(根结点指针)
mknode(op, left, right)-建立一个表达式语法 树结点,它的运算符为op,左、右运算对象 是left和right所指的语法树。如果建成DAG, 则需要检查是否已存在相应内部结点op,其 左右运算对象分别是left和right。若没有则新 建一个。
2024/8/7
《编译原理与技术》讲义
12
语法树 vs. 分析树
a := b* -c + b * -c
语法树
分析树
assign
算符 E
a
+
a
*
*
b@
b@
c
c
赋值语句
assign E
E+
E
E*E E*E
b @E b @E
c
c
2024/8/7
《编译原理与技术》讲义
13
语法树 vs. DAG
DAG(去除了公共子表达式的无环有向图)
2024/8/7
《编译原理与技术》讲义
21
翻译方案中的动作
-语义动作可放在产生式右端任何位置;这也就显式 地给出了动作的执行时刻。(可认为是在深度优先 遍历中的执行时刻)
e.g. 6将含有+和-运算的中缀表达式翻译为后缀形式: ET R R addop T { print( addop.lex_val) } R | T number { print( number.lex_val) }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3 a print(A.in)
2
该属性还没有定义
可以改为 S→ {A1. in:=1} A1 { A2. in:=2 } A2
S→ {A1. in:=1} A1 { A2. in:=2 } A2
S
{A1. in:=1}
1 a
A {A2. in:=2} 3
print(A.in) a 2
A
print(A.in) 4
L-属性文法可通过一次遍历就计算出所有属性值。 诸如LL(1)这种自上而下分析方法的分析过程,从概
念上说可以看成是深度优先建立语法树的过程 我们可以在自上而下语法分析的同时实现L-属性文
法的计算。
L-属性文法
一个属性文法称为 L-属性文法 如果对于每个产生式 A→X1X2…Xn, 其每个语义规则中的每个属性或者是综合属性, 或者是Xj(1<=j<= n)的一个继承属性 , 且这个继承属 性仅依赖于: (1) 产生式Xj的左边符号X1,X2,…,Xj-l的属性 (2) A的继承属性
例: 将含有+和-运算的中缀表达式翻译为后缀形式
ET R R addop T { print( addop.lexme) } R | T num { print( num. lexme) }
如 表达式 9-5+2 后缀表示为 95 - 2 +
翻译模式给出了使用语义规则进行计算的次序,这 样就可把某些实现细节表示出来。
B {B1.ps := B.ps } B1 {B2.ps := B.ps } B2 {B.ht := max(B1.ht, B2.ht ) }
B { B1.ps :=B.ps } B1 sub { B2.ps := shrink(B.ps) } B2 {B.ht := disp (B1.ht, B2.ht ) }
建立翻译模式: T →T1* F {T. val := T1. val * F. val}
如果既有综合属性又有继承属性,在建立翻译模式时 就必须满足三个条件
(1)产生式右边的符号的继承属性必须在这个符号以前 的动作中计算出来。
(2)一个动作不能引用这个动作右边的符号的综合属性。
(3)产生式左边非终结符的综合属性只有在它所引用的 所有属性都计算出来以后才能计算。计算这种属性 的动作通常可放在产生式右端的末尾。
因为 Q.i 依赖于右部符号R的综合属性R.s
6.4.1 翻译摸式
翻译模式(Translation schemes) 一种适合语法制导翻译的另一种描述形式。
在翻译模式中,和文法符号相关的属性和语义 规则(语义动作),用花括号{}括起来,插 入到产生式右部的合适位置上。
R addop T R{ print( addop.lexme) } R
S-属性文法一定是L-属性文法
L-属性文法的例子 6.1 节 ☆表6.1 ☆表6.2
表6.7 非L-属性文法的例子
产生式 ALM
AQR
语义规则
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)
B.ht := disp (B1.ht, B2.ht ) B.ht := text.h B.ps
查表获得
非终结符B(表示盒子)代表一个公式, 产生式B→BB 代表两个盒子并置, B→B1 sub B2 代表B2的大小比B1的小,并且放在下角标的位置
S {B.ps := 10 } B {S.ht := B.ht }
B text {B.ht := text.h B.ps }
图6.12 从表6.8构造出的翻译模式
为文法 G: S ( L ) | a
补充例1
LL,S|S
写一个翻译方案,它输出每个a的嵌套深度
E T
ET R R addop T { print( addop.lexme) } R | T num { print( num. lexme) }
R
9 print(9) - T print(‘- R
1
’) 3
5 print(5) + T print(‘+’) R
2
5
2 print(2)
• 把语义动作看作是终结符号
下面的翻译模式不满足上述三个条件中的第一个条件: (1)产生式右边的符号的继承属性必须在这个符号以n:=1; A2. in:=2 } A→a { print(A. in) }
S
A
a print(A.in) 1
A
{A1. in:=1; A2. in:=2}
继承属性ps影响 公式的高度
B B1 B2
S.ht := B.ht B1.ps := B.ps;
综合属性B.ht代表 B的高度
B2.ps := B.ps;
B.ht := max(B1.ht, B2.ht )
B B1 sub B2 B1.ps:=B.ps;
使B2.ps减少30%
B text
B2.ps:= shrink(B.ps); 把盒子B2向下放置
例: 给定一个L-属性文法, 建立一个满足上述
三个条件的翻译模式。
基于数学格式语言EQN 给定输人 E sub 1 .Val
EQN把E,1和.val分别按不同的大小放在相关 的位置上,如图所示。
E .val
1
图6.11 盒子的语法制导安放
表6.8 盒子大小和高度的属性文法
产生式 SB
语义规则 B.ps := 10;
第六章 属性文法和语法制导翻译
6.1 属性文法 6.2 基于属性文法的处理方法 6.3 S-属性文法的自下而上计算 6.4 L-属性文法和自顶向下翻译 6.5 自下而上计算继承属性
6.4 L-属性文法和自顶向下翻译
6.4.1 翻译模式 6.4.2 自顶向下翻译 6.4.3 递归下降翻译器的设计
L-属性文法
4
• 按深度优先次序遍历分析树,即得到 9 5 - 2 +
图6.10 9-5+2 的说明动作的语法分析树 参考输出后缀式的属性文法☆
只需要综合属性时, 可以这样建立翻译模式: • 为每一个语义规则建立一个包含赋值的动作, • 并把这个动作放在相应的产生式右边的末尾。
例如,假设有下面的产生式和语义规则: T →T1* F T. val := T1.val * F. val