- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12 0169 13 01 14 15
注意
句柄归约在先,语义动作调用在后 归约时,栈内句柄各符号的语义信息与句 柄及同时出栈,整个句柄所表示的语义信 息则赋给相应产生式左部非终结符号的语 义变量,并让该非终结符号及语义信息同 时入栈
中间代码
中间代码是介于源程序和目标程序之间,用 来表述源程序并与之等效的一种编码方式. 生成中间代码的作用 (1)中间代码与具体机器无关,便于语法分 析和语义加工,便于编译程序移植. (2)易于对中间语言进行优化,有利于提高 中间代码的质量. (3)有利于编译程序的设计与实现,使编译 各阶段的开发复杂性降低. 常用的中间代码形式:逆波兰式、三元式、 四元式、树代码等
一般形式: (编号)〈运算符〉〈运算对象1〉〈运算对象2〉 i op arg1 arg2 出现的次序是对应语法成分的计算次序 无需引进临时工作变量,用三元式的编号代替之, 节省了存贮空间 其中的编号代表某个三元式的位置编号和代表某 个三元式的值 之间的联系靠编号进行,因此,三元式的移动较 困难,不便于优化
属性翻译文法的应用
综合属性与自下而上定值 每个非终结符的属性值都是根据位于其下 面那些符号的属性值来确定的,即按一种 自下而上的方式来确定的。 继承属性和自上而下定值 非终结符的属性值或者根据其上层非终结 符的属性来确定或者根据产生式右部其它 符号的属性来确定。这种属性值是根据自 上而下方式确定的。
引入语义变量,语义过程和语义函数 (1)E.place:表示存放E值的变量名或在符 号表中的入口地址; (2)函数newtemp():申请一个临时单元,存 放中间结果; (3)过程emit(T=arg1 op arg2):产生一条四 元式,并添入四元式表中; (4) lookup():审查是否出现 在符号表中,在:返回地址,不在:返回NULL; (5)函数entry(i):回送标识符i在符号表中 的入口地址.
表达式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))
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 )
翻译步骤
首先,为文法的每条规则设计相应的语义 子程序; 增加一个语义信息栈; 在语法分析的同时做语义处理:即在用某 一个产生式进行规约的同时,调用相应的 语义子程序完成所用规则的语义动作,并 将每次动作后的值保存在语义栈中
计算表达式2+3*5
状态
ACTION i S5 S6 r2 r4 S5 S7 r4 S4 r2 r4 + * ( S4 acc r2 r4 8 ) $ E 1
翻译步骤: (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(表达式的结果赋给赋 值语句的左变量)
属性文法
属性文法主要用来描述和说明程序设计语 言语义的。 属性:一般用来描述客观存在的事物或人 的特征,编译技术中用属性来描述计算机 要处理的对象的特征。 属性文法:每个上下文无关文法的产生式, 配以相关联的属性,属性的处理过程也就 是语义的处理过程,为文法的每条规则配 以相应的语义规则构成的文法称为属性文 法。
语法制导翻译的基本思想
对文法中的每个产生式都附加一个语义动 作或语义子程序,在执行语法分析的过程中, 每当使用一条产生式进行推导或规约时, 就执行相应产生式的语义动作。 这些动作不仅指明了该产生式所生成的符 号串的意义,而且还根据这种意义规定了对 应的加工动作.(如查填各类表格、改变编 译程序的某些变量之值、打印各种错误信 息以及生成中间代码等)从而完成预定的 工作。
第八章 语法制导翻译法
语法制导翻译概述
语法制导翻译是继词法分析和语法分析后, 对编译程序进行语义分析和翻译(产生中间 代码)。 在语法分析过程中,随着分析的步步进展, 根据每个产生式所对应的语义子程序(或语 义规则描述的语义动作)进行翻译的办法称 为语法制导翻译。
本章学习的主要内容
本章我们将主要讨论语法制导翻译的 基本思想及其在在中间代码生成中的 应用。主要包括:属性文法、各种常 见中间语言形式、赋值语句的翻译, 布尔表达式的翻译,控制语句的翻译、 说明语句的翻译等。通过本章的学习, 要求掌握语法制导翻译的基本思想和 翻译方案。
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))}
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〉〈结果〉 (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
布尔表达式作为控制语句中的条件式
作用是用于选择下一个执行点 while E do S1 E的作用是选择S1执行,还是跳过S1语句,执 行S1后面的语句 E有两个出口: 真:S1语句 假:S1后面的语句
While语句的目标结构
W.head whille
E的代码 假 真
do
逆波兰表示法(后缀式)
特点:运算符直接写在其运算对象之后。 不再有括号 运算对象出现的次序未变 求值过程简单,宜于用栈实现 例: 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 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 定义: AG: AG=(G,V,E) G:上下文无关文法; V:属性的有穷集合;每一个属性与某一个文 法符号相关联;用文法符号.属性表示 E:表示属性的断言或谓词的有穷集合(语义 规则);每一个断言与文法的某个产生式相 关联) 属性:综合属性(自下而上)、继承属性(自 上
算术表达式求值
语法分析分析的语法成分是简单算术 表达式,所完成的语义的处理不是将 它翻译成中间代码或目标代码,而是 计算表达式的值。
算术表达式的属性文法
简单算术表达式求值的语义描述。 产生式 语义规则 (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)
表达式的语义动作设计
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)}