编译原理6-4.1-L属性文法-翻译模式

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

样就可把某些实现细节表示出来。
E T 9 print(9)
1
ET R R addop T { print( addop.lexme) } R | T num { print( num. lexme) } R - 5 T print(‘- ’) 3 R
print(5)
2
+
2
T
print(‘+’) R

例如,假设有下面的产生式和语义规则:
T →T1* F
建立翻译模式:
T. val := T1.val * F. val
T →T1* F {T. val := T1. val * F. val}
如果既有综合属性又有继承属性,在建立翻译模式时 就必须满足三个条件 (1)产生式右边的符号的继承属性必须在这个符号以前 的动作中计算出来。 (2)一个动作不能引用这个动作右边的符号的综合属性。 (3)产生式左边非终结符的综合属性只有在它所引用的 所有属性都计算出来以后才能计算。计算这种属性 的动作通常可放在产生式右端的末尾。
三个条件的翻译模式。

基于数学格式语言EQN 给定输人 E sub 1 .Val EQN把E,1和.val分别按不同的大小放在相关 的位置上,如图所示。
E
1
wenku.baidu.com
.val
图6.11 盒子的语法制导安放
表6.8 盒子大小和高度的属性文法
产 生 式 SB B B1 B2
B B1 sub B2
B text
5
print(2)

4 • 把语义动作看作是终结符号 • 按深度优先次序遍历分析树,即得到 9 5 - 2 +
图6.10 9-5+2 的说明动作的语法分析树 参考输出后缀式的属性文法☆
只需要综合属性时, 可以这样建立翻译模式: • 为每一个语义规则建立一个包含赋值的动作, • 并把这个动作放在相应的产生式右边的末尾。
例: 将含有+和-运算的中缀表达式翻译为后缀形式
ET R R addop T { print( addop.lexme) } R | T num { print( num. lexme) } 如 表达式 9-5+2 后缀表示为 95 - 2 +
翻译模式给出了使用语义规则进行计算的次序,这
L-属性文法的例子 6.1 节 ☆表6.1 ☆表6.2
表6.7 非L-属性文法的例子
产生式 ALM 语义规则 L.i := l(A.i) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.s)
AQR
因为 Q.i 依赖于右部符号R的综合属性R.s
该属性还没有定义
可以改为
S→ {A1. in:=1} A1 { A2. in:=2 } A2
S→ {A1. in:=1} A1 { A2. in:=2 } A2
S
{A1. in:=1}
1 a
A
{A2. in:=2} 3 print(A.in) a
2
A
print(A.in) 4
例: 给定一个L-属性文法, 建立一个满足上述
6.4.1 翻译摸式

翻译模式(Translation schemes) 一种适合语法制导翻译的另一种描述形式。 在翻译模式中,和文法符号相关的属性和语义 规则(语义动作),用花括号{}括起来,插 入到产生式右部的合适位置上。

{ print( addop.lexme) } R R addop T R
非终结符B(表示盒子)代表一个公式, 产生式B→BB 代表两个盒子并置, B→B1 sub B2 代表B2的大小比B1的小,并且放在下角标的位置
S {B.ps := 10 } B {S.ht := B.ht } B {B1.ps := B.ps } B1 {B2.ps := B.ps } B2 {B.ht := max(B1.ht, B2.ht ) } B { B1.ps :=B.ps } B1 sub { B2.ps := shrink(B.ps) } B2 {B.ht := disp (B1.ht, B2.ht ) } B text {B.ht := text.h B.ps }
继承属性ps影响 语 义 规 则 公式的高度 B.ps := 10; 综合属性B.ht代表 S.ht := B.ht B的高度 B1.ps := B.ps; B2.ps := B.ps; B.ht := max(B1.ht, B2.ht ) 使B2.ps减少30% B1.ps:=B.ps; B2.ps:= shrink(B.ps); 把盒子B2向下放置 B.ht := disp (B1.ht, B2.ht ) 查表获得 B.ht := text.h B.ps
下面的翻译模式不满足上述三个条件中的第一个条件: (1)产生式右边的符号的继承属性必须在这个符号以前 的动作中计算出来。 S→A1 A2 { A1. in:=1; A2. in:=2 } A→a { print(A. in) }
S A a print(A.in) 1 a A {A1. in:=1; A2. in:=2} 3 print(A.in) 2
6.4 L-属性文法和自顶向下翻译
6.4.1 翻译模式 6.4.2 自顶向下翻译 6.4.3 递归下降翻译器的设计
L-属性文法


L-属性文法可通过一次遍历就计算出所有属性值。 诸如LL(1)这种自上而下分析方法的分析过程,从概 念上说可以看成是深度优先建立语法树的过程 我们可以在自上而下语法分析的同时实现L-属性文 法的计算。
L-属性文法

一个属性文法称为 L-属性文法
如果对于每个产生式 A→X1X2…Xn,
其每个语义规则中的每个属性或者是综合属性, 或者是Xj(1<=j<= n)的一个继承属性 , 且这个继承属 性仅依赖于: (1) 产生式Xj的左边符号X1,X2,…,Xj-l的属性
(2) A的继承属性

S-属性文法一定是L-属性文法
图6.12 从表6.8构造出的翻译模式
补充例1 为文法 G: S ( L ) | a LL,S|S 写一个翻译方案,它输出每个a的嵌套深度 例如:对于( a , ( a , a) ) ,输出的结果是 1 2 2
相关文档
最新文档