编译原理与技术
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/10/10
《编译原理与技术》讲义
9
语义规则的计算方法
分析树方法
- 为输入串建立分析树 - 由语义规则建立属性依赖图(没有属性循环依赖的) - 对依赖图进行拓扑排序,得到属性计算次序 - 依次计算属性,得到“翻译”结果
基于规则的方法
- 构造编译器时,事先对产生式的语义规则进行分析,得到 属性计算次序
编译原理与技术
语法制导翻译
2020/10/10
《编译原理与技术》讲义
1
语法制导翻译
属性文法
S-属性定义 L-属性定义 语法制导定义与翻译方案
自底向上翻译
S-属性定义自底向上计算 自底向上计算继承属性
自顶向下翻译
2020/10/10
《编译原理与技术》讲义
2
属性文法
属性文法(Attributed Grammar) 上下文无关文法+属性+属性计算规则
- 固有属性:终结符仅有的属性。如 number.lex_val。通常由词法程序提供。
2020/10/10
《编译原理与技术》讲义
7
A的继承属性
属性依赖图
A.b
A的ຫໍສະໝຸດ Baidu承属性 A
X1.c1 X2.c2 …
Xn.cn
综合属性A.b的计算
X1.c1 X2.c2 Xk.b … Xn.cn 继承属性Xk.b的计算
E.nptr := mknode(‘+’,E1.nptr, E2.nptr) E.nptr := mknode(‘-’,E1.nptr, E2.nptr) E.nptr := mknode(‘*’,E1.nptr, E2.nptr) E.nptr := mknode(‘/’,E1.nptr, E2.nptr) E.nptr := E1.nptr E.nptr := mknode(‘@’,E1.nptr, -) E.nptr := mkleaf(‘NUM’,number.lex_val)
2020/10/10
《编译原理与技术》讲义
8
e.g. 2 属性依赖图: 3+4×5
E. val = 23
E. val = 3 +
E. val = 20
number. lex_val = 3 E. val = 4 ×
E. val = 5
number. lex_val = 4 number. lex_val = 5
产生式
EE1 ‘+’ E2 EE1 ‘*’ E2 E’(‘ E1 ‘)’ Enumber
语法制导定义
E.val := E1.val + E2.val E.val := E1.val * E2.val E.val := E1.val E.val := number.lex_val
2020/10/10
《编译原理与技术》讲义
7
+
E. val = 20
4
E. val = 4 ×
6
E. val = 5
2020/10/10
3
5
number. lex_val = 4 number. lex_val = 5
《编译原理与技术》讲义
11
S-属性定义
-语义规则仅包含综合属性计算(可以有固有 属性出现)。
-适合自底向上计算
e.g. 语法树 -语法树与分析树
2020/10/10
《编译原理与技术》讲义
3
属性文法
语法制导定义(文法+属性+语义规则)
语义规则仅表明属性间“抽象”关系,不涉及具体 翻译实现细节,如计算次序等。 翻译方案(文法+属性+语义动作) 语义规则-即语义动作,可体现若干实现的细节。
2020/10/10
《编译原理与技术》讲义
4
e.g.1算术表达式的计算器
忽略规则的方法
- 属性计算次序仅由分析方法限定。如S-属性定义可以在自 下而上分析时,在归约前计算。如YACC中的语义动作。
2020/10/10
《编译原理与技术》讲义
10
e.g. 3 属性计算次序: 3+4×5
2
E. val = 3
1
number. lex_val = 3
8
E. val = 23
assign
a := b* -c + b * -c
assign
a
+
a
+
* b@
* b@
* b@
c
c
语法树
c DAG
2020/10/10
《编译原理与技术》讲义
15
e.g.4 构造表达式的语法树(DAG)
产生式
语义规则
EE1 + E2 EE1 - E2 EE1 * E2 EE1 / E2 E( E1 ) E - E1 Enumber
2020/10/10
《编译原理与技术》讲义
6
属性文法
属性的分类
若产生式AX1X2…Xn,与之相关的属性计算规则 b := f ( c1, c2, … )
-如果属性b是产生式左部符号A的属性则称其为A
的综合属性; -X如i的果继属承性属b是性产;生式右部符号Xi的属性则称其为 -性c1或, cA2,的…继一承般属是性产;生式右部其它符号的(综合)属
属性-用来描述文法符号的语义特征,如 常量的“值”、变量的类型和存储位置等。
e.g. 二义性表达式文法G,非终结符E有属性E.val (表达式的值)
EE ‘+’ E | E ‘*’ E | ‘(‘ E ‘)’ | number 属性计算规则(语义规则)
与产生式相关联的反映文法符号属性之间关系的 “规则”
2020/10/10
《编译原理与技术》讲义
13
语法树 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
2020/10/10
《编译原理与技术》讲义
14
语法树 vs. DAG
DAG(去除了公共子表达式的无环有向图)
5
e.g.1算术表达式的计算器
产生式
翻译方案
EE1 ‘+’ E2 EE1 ‘*’ E2 E’(‘ E1 ‘)’ Enumber
{ E.val := E1 .val + E2.val } { E.val := E1.val * E2.val } { E.val := E1.val } { E.val := number.lex_val }
语法树可看作分析树的浓缩。也称抽象语法 树。而分析树可看成具体语法树。
2020/10/10
《编译原理与技术》讲义
12
语法树 vs. 分析树
S if B-expr then S1 else S2
语法树
if-then-else
分析树
S
B-expr S1 S2 if B-expr then S1 else S2