编译原理-第八章

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
依赖关系; ❖ ③ 如果q是某个产生式中文法符号V的继承属性,
那么,属性q的值仅依赖于该产生式右部位于V左边 的符号的属性。
8.6 中间代码形式
中间代码形式是指用来表述源程序并与之等效的一 种编码方式,可根据具体情况将它设计成各种形 式。 8.6.1 逆波兰表示法 特点:运算符直接写在其运算对象之后。 ❖ 不再有括号 ❖ 运算对象出现的次序未变,同一层中运算符则按 其优先级出现 ❖ 求值过程简单
❖ 除了最右边的w之外,(输出)终结符不可能出现 在翻译成分之中,那么,称这个SDTS为简单后缀 的(Simple Post Fix)。
❖ 定理8.2 对其基础源文法为LR(k)的每一简单后缀 的SDTS,存在一确定的LR(k) PDT, ①它接收从该 基础源文法可推导出的每一句子;②它将这种句 子的翻译作为输出。
对应的抽象代码形成
8.7 属性翻译文法的应用
由以上分析可将原文法改造成:
ST else S2, Sub1
①生成 S2 的中间代码 ②设置位置标号 12
TI then S1, Sub2
① 生成 S1 的中间代码 ② 生成无条件转 12 的代码 ③ 设置位置标号 11
① 生成计算 E 的中间代码 Iif E, Sub3 ② 生成若 E 之值为 false, 则转 11 的中间代码
8.7 属性翻译文法的应用
8.7.4 条件语句的翻译 基本思路: ❖ ① 先对定义它的文法进行改造,以便能在相应处添
加上语义子程序; ❖ ② 根据它的语义,设计出相应语义子程序的动作。
8.7 属性翻译文法的应用
计算 E
true
false
执行 S1
执行 S2
后继语句
条件语句的语义
① 计算E ② 若E之值为false,则转⑤ ③ 执行S1 ④ goto ⑥ ⑤ 执行S2 ⑥ (后继语句)
8.6 中间代码形式
8.6.2 逆波兰表示法的推广 只要遵循将算符直接写在运算对象之后的原则,则可推 广之。
8.6.3 四元式 一般形式:〈运算符〉〈运算量1〉〈运算量2〉〈结果〉 ❖ 出现的次序是对应语法成分的计算次序 ❖ 可以随时引进临时工作变量,之间的联系通过临时变量
进行的 ❖ 调整四元式的位置比较容易 ❖ 过多引进临时变量,导致存贮空间的浪费
❖ 通常规定:每个文法符号的继承属性和综合属性之 交集为空。
8.5 属性文法
8.5.1 L属性文法 L属性文法也称为自上而下的属性翻译文法,适合 于用来指导自上而下的分析过程。其定义如下:
❖ ① 产生式右部任一文法符号V的继承属性仅依赖于 下述两种属性值中的一种:
i) 产生式左部的继承属性; ii) 产生式右部但位于V左边的符号的任何属性。
Case e of 3: S1; 5: S2; 9:S3
end
3
标号
S2
Case 语句
5
标号
S3
nil
9
CASE语句的AST
8.5 属性文法
❖ 属性文法(Attribute Grammar)也称为属性翻译文 法。属性文法以上下文无关文法为基础,只不过为 每个文法符号配备了一些属性。属性分为两种,一 种称为继承属性(Inherited Attribute),另一种称 为综合属性(Synthesized Attribute)。
如果SDTS的基础源文法是二义性的,那么就不存在 确定的PDT。若SDTS的基础源文法是LL(1),那么, 它的PDT是确定的,而且对每一个可接收的输入串 恰好存在一个翻译。
8.3 简单后缀SDTS和自下而上翻译器
❖ 如果一个SDTS是简单的,而且它的每个翻译规则 都有下述形式:Aa0B1a1B2a2…Bkak,B1B2…Bkw
SC S(1)
{Backpatch (S(n1e)xt , Cguad);Snext := Cfalse;
GEN (goto Cguad)}
8.7 属性翻译文法的应用
for i := 1 step 1 until n do A[i]:= 0 对应的四元式序列为 :
(100) :=
1 @INDEX
(101) :=
❖ ① 从中剪掉终结符号结点; ❖ ② 根据适当的翻译规则,重排每个中间结点的孩子; ❖ ③ 添加对应于输出符号集中的终结符结点。
8.2 简单SDTS和自上而下翻译器
❖ 如果每一规则的翻译成分中,非终结符出现的次序 与它们在源成分出现的次序相同,则称一个SDTS是 简单的(simple)。
❖ 定理8.1 如果T=(VN, VT, , R, S)是其基础源文法为 LL(k)的简单SDTS,那么,存在一个自上而下的确 定的下推翻译器PDT(Push–Down Translater),它接 收T的输入语言中的任何符号串并产生对应的输出 串。
此 外 , 若 Ag, g 是 R 中 的 一 条 规 则 , 那 么 (agb, agb)也是一个翻译模式。规则中g和g的非终结符 之间的相关性也必须带进这种翻译模式之中。
8.1 一般原理和树变换
8.1.2 树变换 语法制导的翻译过程可用语法树来说明,可看做从 一棵树到另一棵树的变换,其变换过程如下:
❖ AST也可作为一个多遍编译程序的中间语言结构。采 用AST表示法有助于代码的产生和优化。
8.4 抽象语法树的构造
将语法树简化成一个AST的方式: ❖ 去掉与单非产生式相关的子树,并上提相关分支
上的终结符结点。如果第一棵语法子树也对应于 某个单非产生式,则去掉根结点及其连线。 ❖ 对于直接包含运算符的多个子树,上提运算符并 让它取代其父结点。 ❖ 去掉括号,并上提运算符,让它取代其结点。最 后得到的语法树便是一个AST。
8.7 属性翻译文法的应用
8.7.5 迭代语句的翻译
❖ 形式:Swhile E do S
❖ 用于翻译这类循环的属性翻译文法是
Wwhile {Wguad := Nextguad; }
CW E do {Cguad :=Wguad; Backpatch (Etrue, Nextguad); Cfalse:=Efalse}
8.3 简单后缀SDTS和自下而上翻译器
8.3.1 后缀翻译 8.3.2 IF–THEN–ELSE控制语句 ❖ 将原来的单一产生式拆成三个产生式 ❖ 引进含“then”和“else”关键字的产生式 ❖ 使用空产生式来实现 8.3.3 函数调用
8.4 抽象语法树的构造
❖ 抽象语法树AST(Abstract-Syntax Tree)是某个语言 结构的一种简洁的树形表示形式,它只需包含该结 构尚须转换或归约的信息。任何语法结构(例如表 达式、控制结构和说明)都可以用AST表示。
8.4 抽象语法树的构造
8.4.1 自下而上构造AST 8.4.2 AST的拓广 AST也可表示数组元素、 过程调用、控制结构和 说明等
ARRAY 访问
x
e1
e2
en
x(e1, e2, …, en)
数组访问(或过程调用)的AST
8.4 抽象语法树的构造
CASE
e
Case 语句
标号
S1
Case 语句
1
X1
(102) :=
n
X2
(103) >@INDEX
X2 T1
(104) jumpf (106) T1
(105) jump –
(106) “语句A[i]:= 0的代码”…
+ @INDEX X1 T2 := T2 @INDEX jump (103)
The end.
(q, a, Y)包含(r, g, z)
8.2 简单SDTS和自上而下翻译器
如果P满足下述两个条件,则称P是确定的:
❖ ① 对所有的状态q,输入串a和栈符号Z, (q, a, Z)至 多只包含一个元素。
❖ ② 若(q, , Z)非空,则不存在符号a(a)使得(q, a, Z)非空,即对于某个状态和栈符号,在空移动和非 空移动之间不应存在冲突。
8.7 属性翻译文法的应用
8.7.3 布尔表达式到四元式的翻译 ❖ 作用:用做控制条件;计算逻辑值。 ❖ 文法:BBBBBB(B)idB rop B
其中,、、为布尔(逻辑)运算符;rop为关系 运算符(>,≥,,≤,=,≠);id为布尔(逻辑) 变量或布尔(逻辑)常数;B rop B为关系表达式。 ❖ 布尔表达式的求值方法: ① 通过逐步计算出各部分的值来计算整个表达式。 ② 利用布尔运算符的性质计算其值
第八章 语法制导翻译法
❖ 语法制导翻译法,就是在语法分析的过程中, 依随分析的过程,根据每个产生式添加的语义动 作进行翻译的方法。
❖ 本章介绍语法制导翻译法的基本原理及其在中 间代码生成中的应用。
8.1 一般原理和树变换
8.1.1 一般原理 ❖ 语法制导翻译法(SDTS)由一个源语言、一个目标
语言和一组翻译规则组成,这组规则可将任何源语 言符号串翻译成对应的目标语言串。SDTS的翻译规 则是文法中的产生式再添加上语义动作。
难,不便于优化
8.7 属性翻译文法的应用
8.7.1 综合属性与自下而上定值 每个非终结符的属性值都是根据位于其下面那些符 号的属性值来确定的,即按一种自下而上的方式来 确定的。
8.7.2 继承属性和自上而下定值 非终结符〈V list〉的属性值或者根据其上层非终结 符的属性来确定或者根据产生式右部其它符号的属 性来确定。这种属性值是根据自上而下方式确定的。
❖ 什么叫SDTS?——为每个产生式配一个语义子程 序,在语义分析过程中,在选用某个产生式的同时, 调用配备的语义子程序来完成相应的翻译工作的一 种方法。
8.1 一般原理和树变换
SDTS的形式定义为: ❖ SDTS是一个五元组T=(VT, VN, , R, S),
其中,VT是一个有穷的输入字母表 ,包含源语言中的符号; VN是一个有穷的非终结符号集合; 是一个有穷的输出字母表,包含出现在翻译串或输出串
❖ ② 产生式左部符号的综合属性仅依赖于下面的属性 值中的一种:
i) 产生式左部符号的继承属性; ii) 产生式右部符号(除自身外)的任意属性。
8.5 属性文法
8.5.2 S属性文法 S属性文法也称为自下而上的属性翻译文法,它适 用于指导自下而上的分析过程,其定义如下:
❖ ① 全部非终结符的属性是综合属性; ❖ ② 同一产生式中相同符号的各综合属性之间无相互
8.6 中间代码形式
8.6.4 三元式 一般形式:〈运算符〉〈运算量1〉〈运算量2〉 ❖ 出现的次序是对应语法成分的计算次序 ❖ 无需引进临时工作变量,用三元式的编号代替之,
节省了存贮空间 ❖ 其中的编号代表某个三元式的位置编号和代表某个
三元式的值 ❖ 之间的联系靠编号进行,因此,三元式的移动较困
中的那些符号; R是形如Aw, y的规则的有穷集合,w是由终结符和(或)
非终结符组成的串,y是由VN和(或)中的符号组成的串; S号。VN是一个开始符号,其含义和用法如同翻译模式的定义如下: ❖ ① (S, S)是一个翻译模式,且这两个S是相关的(S
是SDTS的开始符号)。 ❖ ② (aAb, aAb)是一个翻译模式,且两个A是相关的;
8.2 简单SDTS和自上而下翻译器
PDT P的定义如下: ❖ P的一个构形是一个四元组(q, x, y, z),其中,q是
它的有穷控制器的状态,x是尚待扫描的输入串,y 是下推栈,z是此时被打印出的输出符号串。于是, 在某次移动中,便有
(q, ax, Yy, z)├ (r, x, gy, zz) 其中,存在一条翻译器规则
相关文档
最新文档