4最新版编译原理精品课件.3 L属性定义的自上而下计算

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

E E1 + T ET T T1*F TF F (E) F id F num
4.3 L属性定义的自上而下计算
ET R + {R.i := T.nptr} R {E.nptr := R.s} T+T+T+…
R
R R
R T F
W* W
T {R1.i := mknode ( ‘+’, R.i, T.nptr)} R1 {R.s := R1.s} + {R.s := R.i } {W.i := F.nptr} W {T.nptr := W.s} ?
id
R. s R. R i + T T.nptr
+
R. s R i R.

id
id
To entry for c
id
num
4
To entry for a
4.3 L属性定义的自上而下计算
4.3.3 预测翻译器的设计
把预测分析器的构造方法推广到翻译方案的实现
产生式R +TR | 的分析过程 procedure R; begin if lookahead = ‘+’ then begin match ( ‘+’ ); T; R; end else begin /* 什么也不做 */ end end
4.3 L属性定义的自上而下计算
例 左递归的消除引起继承属性
产 生 式 语 义 规 则 E.nptr := mknode( ‘+’, E1.nptr, T.nptr) E.nptr := T.nptr T.nptr := mknode( ‘*’, T1.nptr, F.nptr) T.nptr := F.nptr F.nptr := E.nptr F.nptr := mkleaf (id, id.entry) F.nptr := mkleaf (num, num.val)
T.nptr
F {W1.i := mknode ( ‘*’, W.i, F.nptr)} W1 {W.s := W1.s} {W.s := W.i }
消除左递归后文法
4.3 L属性定义的自上而下计算
T F.nptr id iW F.nptr num
略去了E TR T 部分
i W
F.nptr id
4.3 L属性定义的自上而下计算
4.3.4 (通过改写文法)用综合属性代替继承属性 Pascal的声明,如m, n : integer DL:T T integer | char L L, id | id D L L id , : id T integer
4.3 L属性定义的自上而下计算
4.3 L属性定义的自上而下计算
产生式R +TR | 的翻译方案过程
R + T {R1.i := mknode ( ‘+’, R.i, T.nptr)} R1 {R.s := R1.s}
function R (i :syntax_tree_node ) :syntax_tree_node; var nptr , i1, s1, s : syntax_tree_node; addoplexeme : char; begin if lookahead = ‘+’ then begin /* 产生式 R +T R */ addoplexeme := lexval; match( ‘+’ ); nptr := T(); i1 := mknode(addoplexme, i , nptr) ; s1 := R (i1 ); s : = s1 end else s := i; /* 产生式 R */ return s end;
4.3.4 用综合属性代替继承属性 Pascal的声明,如m, n : integer DL:T T integer | char L L, id | id 改变文法及语义执行的时机 D id L L , id L | : T T integer | char
4.3 L属性定义的自上而下计算
4.3.4 用综合属性代替继承属性 Pascal的声明,如m, n : integer DL:T T integer | char D L L, id | id 改变文法及语义执行的时机 id D id L , L , id L | : T T integer | char
L
id
10/37
L T integer
4.4 L属性的自下而上计算
• 在自下而上语法分析的框架中实现L属性定义的方法, 可以做到: –实现任何基于LL(1)文法的L属性定义。 –实现许多(但不是所有的)基于LR(1) 的L属性 定义。
4.4 Fra Baidu bibliotek属性的自下而上计算
i Ws
id num 5
id
指向符号表中b的入口
指向符号表中a的入口
使用继承属性构造 a-4+c的抽象语法树 E E.nptr T T.nptr
R. R R. i T T.nptr
num
-
s
E → T {R.i:=T.nptr} R {E.nptr:=R.s} R → + T {R1.i:=mknode(‘+’,R.i,T.nptr)} R1 {R.s:=R1.s} R → - T {R1.i:=mknode(‘-’,R.i,T.nptr)} R1 {R.s:=R.s} R → {R.s:=R.i} T → ( E ) {T.nptr:=E.nptr} T → id {T.nptr:=mkleaf(id,id.entry)} T → num {T.nptr:=mkleaf(num,num.val)}
:
L
T integer
4.3 L属性定义的自上而下计算
D id L { addtype (id. entry, L. type)} L , id L1 {L. type := L1. Type; addtype (id. entry, L1. type)} L:T {L. type := T. type} T integer {T. type := integer} T real {T. type := real} D id , L id :
相关文档
最新文档