333 继承属性的模拟计算(在分析栈上模拟继承属性)-文档资料

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

(1) (2) (3) (4) (5) (6) (7)
S→ L B {$$=$2;} <3> 继承属性的LR增量分析(续) L→ε {$$=10;} B→ B M B {$$=max($1,$3);} | B sub N B {$$=disp($1,$4);} | text {$$=$1*$0;} M→ε {$$=$-1;} N→ε {$$=shrink($-2);} 重新考虑输入序列E sub 1 .val,仍然令text.h=2,shrink=0.7:
<1> 利用M的属性传递位置不确定的属性(续1)
引入M→ε并理论上为M设计继承 属性i和综合属性s。将M.s传递给C.i:
S→aAC | bABMC C→c M→ε (1) (2) S (3)(G3.3') (4) B A.s B M.i C.i .s 由C.i:=A.s、M.i:=A.s、C.i:=M.s、M.s:=M.i 知C.i、A.s、M.i、M.s均等价 (b) M→ ε 属 性 传 递 实 例 设计翻译方案: S→aAC | bABMC C→c $$:=g($0); M→ε $$:=$-1; (1) (2) (3) (4) (G3.3')
$$,$1→
$$,$1→ 1 B
14 7 20 10
语 义 栈
$$,$1→ E B 20 $0→ L 10 分析栈 语义栈
N sub $-1→ B $-2→ L
$0→ 分 析 栈
7 20 10
语 义 栈
$0→
N sub B L
B N sub B $$,$1→ B $0→ L
分 析 栈
分 析 栈
语 义 栈
$$,$1 → $0 → $-1 → $-2 →
C.i:=A.s; M.i:=A.s; C.i:=M.s; C.s:=g(C.i); M.s:=M.i;
c C .i ← $$,$1 M .i .s ← $0 B .s A b
分析栈 语义栈 (c) 栈 顶 句 柄 是 b ABMC
<2> 利用M的属性传递由一般函数计算所得的属性 考察语法制导定义:
a
分析栈 语义栈
<3> 继承属性的LR增量分析
例3.11 将数学排版问题改造为LR的增量分析。 (1) S→{B.ps:=10;} B {S.ht:=B.ht;} (2) B→{B1.ps:=B.ps;} B1 {B2.ps:=B.ps;} B2 {B.ht:=max(B1.ht, B2.ht);} (3) | {B1.ps:=B.ps;} B1 sub {B2.ps:=shrink(B.ps);} B2 {B.ht:=disp(B1.ht, B2.ht);} (4) | text {B.ht:=text.h*B.ps;} 对于嵌入语义规则,若具有实质意义,则为其引入一个标 记非终结符;若可以由其它属性代替,则可删除。 设计翻译方案: (1) S→ L B {$$=$2;} (2) L→ε {$$=10;} (3) B→ B M B {$$=max($1,$3);} (4) | B sub N B {$$=disp($1,$4);} (5) | text {$$=$1*$0;} (6) M→ε {$$=$-1;} (7) N→ε {$$=shrink($-2);}
3.3.3 继承属性的模拟计算(在分析栈上模拟继承属性) 利用栈中已有的属性需要两个前提: 1. 属性计算仅由复写规则得到,即 可以利用属性之间的等价性质; 2. 所需属性在分析栈中的位置,与 分析过程中任何时刻想使用它的 文法符号的位置关系均是确定的。 但更一般的情况是: 1. 想要利用的属性是通过函数计算得到的; 2. 该属性的位置并不是任何想利用它的时刻均是确定的。 解决的思路: 引入M→ε,用M的属性进行中间传递,它既可传递由复 写规则所得到的属性,也可以传递由函数计算所得的属性。
3.3.3
继承属性的模拟计算(续1)
传递的基本思想: 1. 用M的继承属性来继承其左边文法符号的属性; 2. 归约M→ε时,将M的继承属性转换成综合属性,并传递 给其右边的文法符号。
M.i .s
(a) M → ε 属 性 传 递
<1> 利用M的属性传递位置不确定的属性 考察下述语法制导定义: S→aAC C.i:=A.s; (1) | bABC C.i:=A.s; (2) (G3.3) C→c C.s:=g(C.i); (3) • C的i属性是通过复写A的s属性得到的; • 但是翻译方案中不能简单的用A.s取代C.i; • 因为C和A的相对位置在S产生式的候选项中不确定。
$$,$1→ c C $0→ B $-1→ A
.i .s
$$,$1→ c C $0→ A
.i .s
$-1→ a 分析栈 语义栈 (a)栈 顶 句 柄 是 aAC
$-2→ b 分析栈 语义栈 (b) 栈 顶 句 柄 是 bABC
因此在栈顶按产生式C→c归约时不能用C.s:=g(A.s)代替 C.s:=g(C.i) 。
S→aAC C.i:=f(A.s); (1) (G3.4) C→c C.s:=g(C.i); (2)
能否将C.s:=g(C.i)改写为C.s:=g(f(A.s))? 这取决于函数计算是否产生副作用。 更一般的方法:引入M→ε并利用M的属性隔离函数f与g的计算。
S→aAMC M→ε C→c M.i:=A.s; C.i:=M.s; M.s:=f(M.i); C.s:=g(C.i); (1) (2) (3)
Fra Baidu bibliotek
20 10
$$,$1→ M 10 $0→ B 20 $-1→ L 10 分析栈 语义栈
$$,$1 → .val B $0 → M
B L
分析栈
20 10 20 10
(G3.4')
因为有M.i:=A.s和C.i:=M.s,C.s:=g(C.i)中C.i可用M.s代 替,而M.s:=f(M.i)中的M.i又可以由A.s代替。
得设计翻译方案:
S→aAMC (1) M→ε $$:=f($0); (2) (G3.4') C→c $$:=g($0); (3)
$$,$1→ c C .i .s=g($0) $0→ M .i .s=f($0) ←$$,$1 A .s ←$0
相关文档
最新文档