- 29
- 0
- 约1.2万字
- 约 69页
- 2018-04-13 发布于湖北
- 举报
编译原理_第6章
2.特点: 为每一个语义规则建立一个包含赋值的动作,并 把这个动作放在相应的产生式右边的末尾. 3.转换左递归翻译模式的一般方法: A→A1Y { A.a=g(A1.a ,Y.y } A→X { A.a= f (X.x) } 递归下降分析器的构造 p156 举例 AST:Abstract Syntax Tree 6.5 自下而上的计算继承属性 L-属性文法的自上而下分析翻译方法,适用于所有LL(1)文法和基于LR(1)文法的L-属性文法,是S -属性文法自下而上翻译技术的一般化。 (1)从翻译模式中去掉嵌入在产生式中间的动作 (2)分析栈中的继承属性 (3)模拟继承属性的计算 (4)用综合属性代替继承属性 S -属性文法翻译自下而上规约时进行,翻译模式允许翻译动作嵌入产生式,如何保证嵌入的动作在产生式的末尾? 标记非终结符 M →ε 标记非终结符代替嵌入在产生式中间的语义动作,并将这个动作放在产生式M →ε的末尾。 例: E→TR {A.a=f(X.x)} E→TR {A.a=f(X.x)} R→+T {Pr(‘+’)} R | ε R→+T M R | ε M→ε {Pr(‘+’)} T→num {Pr(num.val)} T→num {Pr(num.val)} A→XY 综合属性 X.s 继承属性 Y.i 复写: Y.i := X.s 文法与属性位置 唯一确定 —— 计算属性的确定性 不确定到确定的转换 引入标记非终结符M,通过M的继承属性,传递属性计算的复写内容。 例 S→aAC{C.i=A.s} S→aAC{C.i=A.s} S→bABC{C.i=A.s} S→bABMC{M.i=A.s};{C.i=M.s} M→ε {M.s=M.i} S→aAC{C.s=g(C.i)} S→aAC{C.s=g(C.i)} S→aAC{C.i=A.s} S→aAC{C.i=A.s} S→bABC{C.i=A.s} S→bABMC{M.i=A.s};{C.i=M.s} M→ε {M.s=M.i} S→aAC{C.s=g(C.i)} S→aAC{C.s=g(C.i)} 改变文法,用综合属性代替继承属性 例: D→L:T D→id L T→integer|real L→,id L|:T L→L,id|id T→integer|real 课程学习方法 各个击破,分而治之; 前后联系,融会贯通; 联系实际,学以致用; 强调原理,不拘细节。 D →T{L.in:=T.type}L T →int{T.type:=integer} T →real{T.type:=real} L → {L1.in:=L.in} L1, id {addtype(id_entry,L.in} L → id {addtype(id_entry,L.in} L → L,id TL D → TL D TL,r TL, r L → L,id TL ,r TL,q ,r TL, q,r L → id TL ,q,r Tp ,q,r T → int T p,q,r int p,q,r - int p,q,r 产生式 转态 输入串 输入串: real id1,id2,id3 D T L real L L , id2 id3 , id1 L.in := T.type T.type := integer Val[ntop]:= integer T.type := real Val[ntop]:= real L1.in := L.in addtype(id.type,L.in) Val[top], Val[top-3] addtype(id.type,L.in) Val[top], Val[top-1] D→TL T→int T→real L→L1,id L→id 代码段 产生式 1 9 10 4 5 6 7 8 2 3 S b A B C S b A B M C s i s i s i D L T : L y , L x
原创力文档

文档评论(0)