非S属性定乂的例子 D: TL in- T type, L T: intT type integer) T: reaR T type =real; L: LI in=L inLl, idaddtype(id entry, L in) L: id addtype(id entry, L in), L属性定义翻译方案不能直接用自底向上的方法实 现
非S_属性定义的例子 • 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_属性定义翻译方案不能直接用自底向上的方法实 现
自底向上的方法 在YACC中通过添加空规则来实现。比如第 个规则修改为D:=TAL,A:=空,但是问题是: 可能变成非LR(K)文法,并且,不能直接使用 上面的定义。 比如:D:=T{Lin:= T type}L,实现的方式实际 是:D:=TAL,A:=空{??2} 但是,值的传递不是那么方便
自底向上的方法 • 在YACC中通过添加空规则来实现。比如第一 个规则修改为D::=TAL,A::=空,但是问题是: 可能变成非LR(K)文法,并且,不能直接使用 上面的定义。 • 比如:D::=T{L.in:=T.type}L,实现的方式实际 是:D::=TAL,A::=空{????}。 • 但是,值的传递不是那么方便
自顶向下的实现方法 可以按照前面L属性定义的计算算法计 算的方法完成 但是,需要消除左递归。消除左递归的 时候,牵涉到语义规则的修改
自顶向下的实现方法 • 可以按照前面L_属性定义的计算算法计 算的方法完成。 • 但是,需要消除左递归。消除左递归的 时候,牵涉到语义规则的修改
自顶向下的实现方法(例子) E: =E+TE-TT T: =(enum 翻译方案如下: E: E+T E. val=El. val+Tval E: E-T RE. val=El. val-Tval) E∷=T fE. val=T valy T:=E) Tval=E valy T: = num T val=num. lexval 这个翻译方案中,所有的属性都是综合 属性
自顶向下的实现方法(例子) • E::=E+T|E-T|T T::=(E)|num • 翻译方案如下: – E::=E+T {E.val=E1.val+T.val} – E::=E-T {E.val=E1.val-T.val} – E::=T {E.val=T.val} – T::=(E) {T.val=E.val} – T::=num {T.val=num.lexval} • 这个翻译方案中,所有的属性都是综合 属性
自顶向下的实现方法(例子) 由于自顶向下的方法不能处理左递归的情况 所以必须修改相应的重写规则。而语义规则也 需要相应的修改。 E: TR iT.val REvalRs R -+TRI. R i+T.valR1RSRIS R --TRI. 1=R i-T.valR1RS=RIS R:=空{Rs=Ri} T: =ETval=E. val)) T: =num(T val=num. lexval)
自顶向下的实现方法(例子) • 由于自顶向下的方法不能处理左递归的情况, 所以必须修改相应的重写规则。而语义规则也 需要相应的修改。 • E::=T{R.i=T.val}R{E.val=R.s} • R::=+T{R1.i=R.i+T.val}R1{R.s=R1.s} • R::=-T{R1.i:=R.i-T.val}R1{R.s=R1.s} • R::=空{R.s=R.i} • T::=(E{T.val=E.val}) • T::=num{T.val=num.lexval}