正在加载图片...
值或存在于次栈顶(top-1),或存在于次次栈顶(top-2),不能确定用哪一个。 种可行的做法是引入新的非终结符M,将以上翻译模式改造为 S→>aA{Ci=A.s}C S>bABIM.: =AS)MC. i: MS)C {C.s=g(C.)} yac这样处理 S→aAMC S→ bab m o C→c{C.s=g(C.i)} M→>E{C.i=A.s} 这样在使用C→c进行归约时Ci的值就一定可以通过访问次栈页top-1) 得到。想一想,为什么? 另一个例子,考虑如下翻译模式 S→>aA{C.i=f(A.s)}C 这里,继承属性Ci不是通过复写规则来求值,而是通过普通函数f(A.s)调 用来计算。在计算Ci时,As在语义栈上,但f(A.s)并未不存在于语义栈。同样, 种做法是引入新的非终结符M,将以上翻译模式改造为: SaAM.i =AS) Ci: =Ms)C M→E{Ms:=f(Mi)} yacc这样处理 S→aAMC M→e{Ci:=f(A.s)} 这样就解决了上述问题。想一想,为什么? I1.课堂讲稿中倒数第2页中的Yac程序片断。值或存在于次栈顶(top-1),或存在于次次栈顶(top-2),不能确定用哪一个。 一种可行的做法是引入新的非终结符 M,将以上翻译模式改造为: S → a A {C.i := A.s} C S → b A B {M.i := A.s} M {C.i := M.s} C C → c {C.s := g(C.i)} M → ε {M.s := M.i } yacc 这样处理 S → a A M C S → b A B M C C → c {C.s := g(C.i)} M → ε {C.i := A.s} 这样,在使用 C → c 进行归约时,C.i 的值就一定可以通过访问次栈顶(top-1) 得到。想一想,为什么? 另一个例子,考虑如下翻译模式: S → a A {C.i := f(A.s)} C 这里,继承属性 C.i 不是通过复写规则来求值,而是通过普通函数 f(A.s) 调 用来计算。在计算 C.i 时,A.s 在语义栈上,但 f(A.s)并未不存在于语义栈。同样, 一种做法是引入新的非终结符 M,将以上翻译模式改造为: S → a A {M.i := A.s} M {C.i := M.s} C M → ε {M.s := f(M.i)} yacc 这样处理 S → a A M C M → ε {C.i := f(A.s)} 这样就解决了上述问题。想一想,为什么? 11.课堂讲稿中倒数第 2 页中的 Yacc 程序片断
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有