第八语法制导翻译和中间代码生成演示文稿
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
生 产式
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)
第14页,共75页。
Real id1,id2,id3
for i :=1 to k do
从ci结点到b结点构造一条有向边
第17页,共75页。
依赖图
➢ 例2:根据以下说明语句属性文法,构造句子Real id1,id2,id3的依赖图。
生 产式 D TL T int T real
L L1,id
L id
语义规则 L.in:=T.type
T.type:=integer
第20页,共75页。
8.2.2 S属性文法和自下而上翻译
S属性文法:只含综合属性的属性文法。
• 综合属性可以在分析输入符号串的同时自下而上的来计算。分析器 可以保存与栈中文法符号有关的综合属性值,每当进行归约时,新 的属性值就由栈中正在归约的产生式右边符号的属性值来计算。
• S属性文法的翻译器通常可借助于LR分析器实现。在S属性文法的
例题:表达式 2+3*5 利用LR分析器的计值过程分析
状态
ACTION(动作)
digit + * ( )
GOTO(转换) #E TF
0 s5
s4
1 23
1
s6
acc
2
r2 s7
r2 r2
3
r4 r4
r4 r4
4 s5
s4
8 23
5
r6 r6
r6 r6
6 s5
s4
93
文法G : (0) LE {Print(E.val} (1) E E1+T {E.val:=E1.val+T.val} (2) E T {E.val:=T.val} (3) T T1*F {T.val:=T1.val
2+3*5# +3*5# +3*5# +3*5# +3*5#
3*5# *5# *5# *5# 5#
# # # #
第24页,共75页。
8.2.3 L属性文法在自上而下分析中的实现
➢ L属性文法定义:一个属性文法称为L属性文法,如果对于每个 产生式A→X1X2…Xn,其每个语义规则中的每个属性或者是综合属性, 或者是Xj(1≤j≤n)的一个继承属性且这个继承属性仅依赖于
break语句使控制跳离包括该语句的最小while、for或switch语句。
如果不存在包括它的此类语句就报错。
第3页,共75页。
8.0 语义处理概述
Ø 静态语义检查(续)
③ 一致性检查。在很多场合要求对象只能被定义一次。例如
Pascal语言规定同一标识符在一个分程序中只能被说明一次,同
一case语句的标号不能相同等。
输入符号串
分析树 属性依赖图 语义规则的计算顺序
第16页,共75页。
依赖图
依赖图是一个有向图,用于描述分析树中的属性和属 性间的相互依赖关系。
依赖图的构造算法:
for 分析树中每一个结点n do for 结点的文法符号的每一个属性a do 为a在依赖图中建立一个结点;
for 分析树中每一个结点n do for 结点n所用产生式对应的每一个语义规则 b:=f(c1,c2,…ck) do
2+3*5 的分析和计值过程
状态栈
语义栈 符号栈 留余输入串
0
-
05
--
03
-2
02
-2
01
-2
016
-2-
0165
-2--
0163
-2-3
0169
-2-3
01697
-2-3-
016975
-2-3--
01697(10) -2-3-5
0169
-2-(15)
01
(17)
# #2 #F #T #E #E+ #E+3 #E+F #E+T #E+T* #E+T*5 #E+T*F #E+T #E
第八语法制导翻译和中间代码 生成演示文稿
第1页,共75页。
优选第八语法制导翻译和中间 代码生成
第2页,共75页。
8.0 语义处理概述 语义处理的任务:
➢ 动态语义处理
• 生成中间/目标代码,对表达式的求值等。
➢ 静态语义检查
① 类型检查:验证程序中执行的每个操作是否遵守语言的类型系统。 ② 控制流检查:控制流语句必须使控制转移到合法的地方。例如C中
T→false {T.t:=bool}
•与非终结符E的产生式相联的断言指明:两个T的属性必须相同
第8页,共75页。
8.1 属性文法
属性分为综合属性和继承属性。综合属性用于“自下而上”传 递信息,而继承属性用于“自上而下”传递信息。
➢ 属性文法中,对应于每个产生式A都有一套与之相关联的语 义规则,每条规则的形式为b:=f(c1,c2…ck),其中f是一个函数,b 和c1,c2…ck是该产生式文法符号的属性。则综合(继承)属性的
T
E+T
2 E - T {print’-’} 2 {print’2’}
T
5 {print’5’}
9 {print’9’}
9-5+2 的说明语义动作的语法树
第27页,共75页。
Ø方法二:采用自上而下语法分析的LL(1)法进行分析
• LL(1)这种自上而下分析文法的分析过程,从概念上说可以看 成是深度优先建立语法树的过程,因此可以在自上而下语法分
第10页,共75页。
8.1 属性文法
小结:
1) 非终结符既可有综合属性也可有继承属性,但文法开始符号没有 继承属性。
2) 终结符只有综合属性,它们由词法程序提供。 3) 语义规则所描述的工作包括:属性计算、静态语义检查、
符号表操作、代码(中间)生成等。
第11页,共75页。
例.1: 简单算术表达式求值的语义描述(综合属性的例子)
非终结符E,T及F都有一个综合属性val,终结符号digit有一个综合属性。与产生式 L→E对应的语义规则仅是打印由E产生的算术表达式的值,可认为这条规则定义了L 的一个虚属性。
产生式
LE E E1+T ET T T1 * F TF 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
第12页,共75页。
设表达式为 3*5+4 ,则语义动作打印数值19
T.val=3 F.val=3
E.val=15 T.val=15
*
L
E.val=19
+
F.val=5
T.val=4 F.val=4 digit.lexval=4
digit.lexval=5
digit.lexval=3
3*5+4的带注释的分析树
第13页,共75页。
继承属性
• 一个结点的继承属性值是由此结点的父结点和/或兄弟
结点的某些属性来决定的。
例2: 说明语句的属性文法 (继承属性L.in)
F.val}
7 s5
s4
10 (4) T F
8
r6
s11
{T.val:=F.val}
9
r1 s7
r1 r1
(5) F(E)
10
r3 r3
r3 r3
{F.val:=E.val}
11
r5 r5
r5 r5
(6) F digit
{F.val:=digit.lexval}
第23页,共75页。
步骤 归约动作
1 2 3 r6 4 r4 5 r2 6 7 8 r6 9 r4 10 11 12 r6 13 r3 14 r1 15 接受
每个L结点都带有继承属性的语法树
D
T.type=real
L.in= real
real
,
L.in= real
id3
,.
L.in= real
id2
id1
第15页,共75页。
8.2 语法制导翻译概论
➢ 基于属性文法的处理过程(语法制导翻译)是:对单词符号串
进行语法分析,构造语法分析树,然后根据需要构造属性依赖 图,遍历语法树并在语法树的各结点处按语义规则进行计算
方法一:采用LR分析法,可在语法树上增加语意结点, 形成一个含
语意动作的树,从而可在分析过程中很方便的写出输出结果: 952+
方法二:采用自上而下语法分析的LL(1)法进行分析。
第26页,共75页。
➢ 采用LR分析法对表达式 9-5+2 的分析过程
E
E+
E-T
T
5
9
9-5+2 的语法树
E {print’+’}
④ 名字的作用域分析
第4页,共75页。
8.0 语义处理概述
语义处理的实现:
➢ 属性文法:包含了一系列语义规则的上下文无关文法。
➢ 语法制导翻译:在语法分析的同时,执行语义规 则描述的动作:
• 检查静态语义 • 执行动态语义定义的动作
第5页,共75页。
8.1 属性文法
属性文法是实际应用中比较流行的语义描述方法。
终结符相联的属性。
第7页,共75页。
8.1 属性文法
Ø 属性文法在上下文无关文法的基础上,为每个文法符号(终结符 或非终结符)配备若干相关的"值"(称为属性)。
例:已知文法G E→T1 + T2|T1 or T2 T→num|true|false 则完成文法G类型检查的
属性文法为:
E→T1+T2 {T1.t=int AND T2.t=int} E→T1orT2 {T1.t=bool AND T2.t=bool} T→num {T.t:=int} T→true {T.t:=bool}
基础上,LR分析器可以改造为一个翻译器,在对输入串进行语法分析 的同时对属性进行计算。
第21页,共75页。
LR 翻译器模型
栈
Input #
S1 Xm VVmm
… ……
S1 X1 VV11
SS00 # --
状态 符号 语义
总控程序
output
ACTION GOTO
产
生
LR分析表
式
表
第22页,共75性; (2)A的继承属性。 ➢ S属性文法一定是L属性文法,因为(1),(2)限制只用于继承属性。
L属性文法允许一次遍历就计算出所有属性值。
第25页,共75页。
8.2.3 L属性文法在自上而下分析中的实现
例8.3: 中缀表达式翻译成相应的后缀表达式的属性文法为 E→E addop T print(addop. Lexeme) | T T→num print(num.val) 采用不同的分析方法对表达式 9-5+2 进行分析。
1 属性文法概念 2 基于属性文法的处理方法 3 S-属性文法的自下而上计算 4 L-属性文法及其翻译实现
第6页,共75页。
8.1 属性文法
属性文法(形式化定义):它是一个三元组: A=(G,V,F),其中
G: 是一个上下文无关文法。 V: 有穷的属性集,与每个文法符号相联,代表该文法符号的类
型、值、代码序列、符号表内容等相关信息。属性与变量一 样,可以进行计算和传递。属性加工的过程就是语义处理的 过程。 F: 关于属性的断言或一组属性的计算规则 (语义规则) 。 断言或语义 规则与一个产生式相联,引用该产生式左端或右端的终结符或非
析的同时实现L属性文法的计算。
• 利用LL(1)进行分析时,首先要消去左递归
原文法:
E→E addop T | T
T→num
消去左递归后文法:
E→TR R→addop T R|ε T→num
第28页,共75页。
消除左递归后9-5+2的语法树
E
T
R
9
-
TR
5 +T R 2
第29页,共75页。
说明语义动作的语法树
概念可定义为:
第9页,共75页。
8.1 属性文法
(1)如果b是A的一个属性,c1,c2…ck是产生式右部文法符号的属 性或A的其它属性,则称b是A的综合属性
(2)如果b是产生式右部某个文法符号X的一个属性,并且c1,c2…ck 是A或产生式右边任何文法符号的属性,则称b是X 的继承 属性
以上两种情况都称属性b依赖于属性c1,c2…ck
entry
id1
1
6
id3
3 entry
第19页,共75页。
属性的计算顺序
➢ 一个依赖图的任何拓扑排序都给出一个分析树中 结点的语义规则计算的有效顺序。
• 树遍历的属性计算方法
设语法树已经建立起了,即可以某种次序(如深度优先)遍历语 法树,直至计算出所有属性。
• 一遍扫描的处理方法
在语法分析的同时计算属性值,无需构造实际的语法树。
T.type:=real
L1.in:=L.in
addtype(id.entry,L.in)
addtype(id.entry,L.in)
第18页,共75页。
例2 Real id1,id2,id3分析树的依赖图
D
T
4 type
Real
in 7 L
,
in 9 L 10
in 5
L
,
8
2 entry id2
E
输出结果: 95-2 +
T
R
9 print’9’
- T Print’-’ R
5 print’5’ +
R Print’+’ T
2 print’2’