第八章语法制导翻译
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
属性翻译文法的应用
综合属性与自下而上定值 每个非终结符的属性值都是根据位于其下 面那些符号的属性值来确定的,即按一种 自下而上的方式来确定的。 继承属性和自上而下定值 非终结符的属性值或者根据其上层非终结 符的属性来确定或者根据产生式右部其它 符号的属性来确定。这种属性值是根据自 上而下方式确定的。
布尔表达式作为控制语句中的条件式
作用是用于选择下一个执行点 while E do S1 E的作用是选择S1执行,还是跳过S1语句,执 行S1后面的语句 E有两个出口: 真:S1语句 假:S1后面的语句
While语句的目标结构
W.head whille
E的代码 假 真
do
GOTO T 2 F 3
G[E]:
E→E+T
E→T T→T*F T→F F→(E)
0 1 2 3 4
2 9
3 3 10
5
6 7 8 S5 S5
ห้องสมุดไป่ตู้
r6
r6
S4 S4
r6
r6
F→i
S6
S11
9
i+i*i 10 11
r1
r3 r5
S7
r3 r5
r1
r3 r5
r1
r3 r5
表达式2+3*5的归约过程
步骤 状态 语义栈 栈 0 0 _
自底向上的语法制导翻译
自底向上的语法制导翻译方法是在自底向 上的语法分析过程中逐步实现语义规则的 翻译方法。在实现时注意以下几点: (1)自底向上的翻译的特点,栈的操作,对 产生式的要求等 (2)各种程序语句的目标结构 (3)从源结构到目标结构的变换方法(包括 对产生式的改造等)
算术表达式和赋值语句的翻译
表达式a+(-b)*c的三元式
(1) (@,b,_);单目运算,运算对象2为空 (2) (*,(1),c) (3) (+,a,(2))
三元式
X=a+b*c Y=d-b*c 三元式表 (1)(*,b,c) (2)(+,a,(1)) (3)(=,x,(2)) (4)(_,d,(1)) (5)(=,y,(4))
算术表达式求值
语法分析分析的语法成分是简单算术 表达式,所完成的语义的处理不是将 它翻译成中间代码或目标代码,而是 计算表达式的值。
算术表达式的属性文法
简单算术表达式求值的语义描述。 产生式 语义规则 (0) L→ E 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 * F.val (4)T→ F T.val=F.val (5)F→ (E) F.val=E.val (6)F→digit F.val=digit.lexval(0~9)
翻译步骤
首先,为文法的每条规则设计相应的语义 子程序; 增加一个语义信息栈; 在语法分析的同时做语义处理:即在用某 一个产生式进行规约的同时,调用相应的 语义子程序完成所用规则的语义动作,并 将每次动作后的值保存在语义栈中
计算表达式2+3*5
状态
ACTION i S5 S6 r2 r4 S5 S7 r4 S4 r2 r4 + * ( S4 acc r2 r4 8 ) $ E 1
属性文法
属性文法主要用来描述和说明程序设计语 言语义的。 属性:一般用来描述客观存在的事物或人 的特征,编译技术中用属性来描述计算机 要处理的对象的特征。 属性文法:每个上下文无关文法的产生式, 配以相关联的属性,属性的处理过程也就 是语义的处理过程,为文法的每条规则配 以相应的语义规则构成的文法称为属性文 法。
语义处理程序的两个功能
第一,审查每个语法结构的静态语义,即检 查语法结构合法的程序是否真正有意义。 也称静态语义分析。(类型检查、控制流 的检查、一致性检查、相关名字的检查) 第二,如果静态语义正确,语义处理则要执 行真正的翻译,要么生成中间代码,要么 生成实际的目标代码。(说明性语句:填 符号表;可执行性语句:生成中间代码)
S1的代码
JMP W.head
布尔初等量(布尔变量和关系表达式) 的目标结构
由两个转移四元式构成,一个表示真出口Li,另一 个表示假出口Lj,设E是一布尔变量, 它的目标结构 为: (1) if E goto Li (jumpt , E,_, Li ) (jnz,A,_, Li) (2) if E1 rop E2 goto Li (jumpθ ,E1 ,E2 ,Li) (jrop,E1,E2, Li) 例:(j<,a,b,p) (3) goto Lj (jump Lj ) (j,_,_, Lj )
表达式的语义动作设计
1. A→i:=E{emit(entry(i)=E.place} 2. E →E1+T{E.place=newtemp(), emit(E.place)=E1.place+T.place} 3.E →T {E.place=newtemp(), emit(E.place=T.place)} 4. T →T1*F{T.place=newtemp(), emit(T.place)=T1.place*F.place} 5. T →F {T.place=newtemp(), emit(T.place=F.place)}
引入语义变量,语义过程和语义函数 (1)E.place:表示存放E值的变量名或在符 号表中的入口地址; (2)函数newtemp():申请一个临时单元,存 放中间结果; (3)过程emit(T=arg1 op arg2):产生一条四 元式,并添入四元式表中; (4) lookup(i.name):审查i.name是否出现 在符号表中,在:返回地址,不在:返回NULL; (5)函数entry(i):回送标识符i在符号表中 的入口地址.
6.F →_P {F.place=newtemp(), emit(F.place)=@P.place} 7.P →(E) {P.place=newtemp(), emit(P.place=E.place)} 8.P →i{P.place=newtemp(), emit(P.place=Entry(i))}
布尔表达式到四元式的翻译
文法:EEEEEE(E)idE rop E 其中,(and)、(or)、(not)为布尔(逻辑) 运算符;rop为关系运算符(>,≥,,≤,=, ≠);id为布尔(逻辑)变量或布尔(逻辑)常 数;E rop E为关系表达式。 布尔表达式的求值方法: ① 通过逐步计算出各部分的值来计算整个表 达式。 ② 利用布尔运算符的性质计算其值
一般形式: (编号)〈运算符〉〈运算对象1〉〈运算对象2〉 i op arg1 arg2 出现的次序是对应语法成分的计算次序 无需引进临时工作变量,用三元式的编号代替之, 节省了存贮空间 其中的编号代表某个三元式的位置编号和代表某 个三元式的值 之间的联系靠编号进行,因此,三元式的移动较 困难,不便于优化
语义栈 _2_3 _2_3 _2_3_
符号栈 $E+F $E+T $E+T* $E+T*5 $E+T*F $E+T $E
输入 动作 串 *5$ r4 *5 $ S7 5 $ S5 $ r6 $ r3 $ r1 $ acc
10 016975 _ 2 _ 3 _ _ 11
01697(10)
_2_3_5 _ 2 _ 15 _ 17
翻译步骤: (1)分析文法的特点; (2)设计一系列的语义变量、定义语义过 程、语义函数; (3)设计每一条规则的语义子程序; (4)增加一个语义信息栈,构造LR分析表; (5)语法分析同时语义处理.
例: 有文法G[A]: 1. A→i:=E 2. E →E+T∣T 3. T →T*F∣F 4.F →-P 5.P →i ∣(E) 简单算术表达式的计值顺序与四元式出现的 顺序相同,因此目标代码的顺序(结构)为: (1)先生成E的代码(一系列顺序执行的四元式) (2)把E的值赋给变量i(表达式的结果赋给赋 值语句的左变量)
例如:表达式X:=a+b*(c-d)的翻译
K+1: T1:=c-d K+2: T2=b*T1 K+3: T3:=a+T2 K+4: X:=T3 (-,c,d,T1) (*,b,T1,T2) (+,a,T2,T3) (:=,T3,_,X)
布尔表达式的翻译
布尔表达式 是由布尔运算符(and,or,not)作用于布 尔变量(或常数)或关系表达式而形成的。 布尔表达式的作用: 用作控制语句中的条件:if-then、 while、 repeat等 逻辑赋值句中的逻辑运算
逆波兰表示法(后缀式)
特点:运算符直接写在其运算对象之后。 不再有括号 运算对象出现的次序未变 求值过程简单,宜于用栈实现 例: a+b ab+ a*b+c ab*c+ a*(b+c/d) abcd/+* a*b+c*d ab*cd*+ a:=b*c+d*e abc*de*+:=
三元式
语法制导翻译的基本思想
对文法中的每个产生式都附加一个语义动 作或语义子程序,在执行语法分析的过程中, 每当使用一条产生式进行推导或规约时, 就执行相应产生式的语义动作。 这些动作不仅指明了该产生式所生成的符 号串的意义,而且还根据这种意义规定了对 应的加工动作.(如查填各类表格、改变编 译程序的某些变量之值、打印各种错误信 息以及生成中间代码等)从而完成预定的 工作。
第八章 语法制导翻译法
语法制导翻译概述
语法制导翻译是继词法分析和语法分析后, 对编译程序进行语义分析和翻译(产生中间 代码)。 在语法分析过程中,随着分析的步步进展, 根据每个产生式所对应的语义子程序(或语 义规则描述的语义动作)进行翻译的办法称 为语法制导翻译。
本章学习的主要内容
本章我们将主要讨论语法制导翻译的 基本思想及其在在中间代码生成中的 应用。主要包括:属性文法、各种常 见中间语言形式、赋值语句的翻译, 布尔表达式的翻译,控制语句的翻译、 说明语句的翻译等。通过本章的学习, 要求掌握语法制导翻译的基本思想和 翻译方案。
四元式 (三地址代码)
一般形式:
〈运算符〉〈运算对象1〉〈运算对象2〉〈结果〉 (op , arg1, arg2 , result) 例: X=a*b+c*d的四元式序列 三地址代码 (1)(* ,a,b,T1) (1)T1=a*b (2)(*, c,d,T2) (2)T2=c*d (3)(+,T1,T2,T3) (3)T3=T1+T2 (4)(=,T3,_,X) (4)X=T3
1 2 3 4 5 6 05 03 02 01 016 __ _2 _2 _2 _2_
符号栈 输入串
$ $2 $F $T $E $E+ $E+3 2+3*5$ +3*5$ +3*5$ +3*5$ +3*5$ 3*5$ *5$
动作
S5 r6 r4 r2 S6 S5 r6
0165 _ 2 _ _
步 状态栈 骤 7 0163 8 9 0169 01697
属性文法
属性文法的形式定义: AG: AG=(G,V,E) G:上下文无关文法; V:属性的有穷集合;每一个属性与某一个文 法符号相关联;用文法符号.属性表示 E:表示属性的断言或谓词的有穷集合(语义 规则);每一个断言与文法的某个产生式相 关联) 属性:综合属性(自下而上)、继承属性(自 上
12 0169 13 01 14 15
注意
句柄归约在先,语义动作调用在后 归约时,栈内句柄各符号的语义信息与句 柄及同时出栈,整个句柄所表示的语义信 息则赋给相应产生式左部非终结符号的语 义变量,并让该非终结符号及语义信息同 时入栈
中间代码
中间代码是介于源程序和目标程序之间,用 来表述源程序并与之等效的一种编码方式. 生成中间代码的作用 (1)中间代码与具体机器无关,便于语法分 析和语义加工,便于编译程序移植. (2)易于对中间语言进行优化,有利于提高 中间代码的质量. (3)有利于编译程序的设计与实现,使编译 各阶段的开发复杂性降低. 常用的中间代码形式:逆波兰式、三元式、 四元式、树代码等