5.1:对于输入的表达式(4*7+1)2,根据表5.1的语法制导定义建立一棵带注释的分析树。 L E.val=58 n T.val=58 T.val-29 E.val-2 E.val=29 digit.lexval=2 E.val=28+ Tval=l F.val= Eval=7 digit.lexval=1 digit lexval=4 5.4:下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结 果为整数,否则为实数。 E→E+TT T>numnumnum a)给出语法制导定义确定每个子表达式的类型 b:扩充a)中的语法制导定义把表达式翻译成前袋形式,并且决定类型。试用一元运算 符inttoreal把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类至 的。 解:a) 产生式 语义规则 E→E1+T E.type:=real .type:=T.typ T>num nu四 Ttyne=integer
5.1:对于输入的表达式(4*7+1)*2,根据表 5.1 的语法制导定义建立一棵带注释的分析树。 解: L E.val=58 n T.val=58 T.val=29 * F.val=2 ( E.val=29 ) digit.lexval=2 E.val=28 + T.val=1 T.val=28 F.val=1 T.val=4 * F.val=7 digit.lexval=1 F.val=4 digit.lexval=7 digit.lexval=4 5.4:下面文法产生的表达式是对整型和实型常数应用算符+形成的。当两个整数相加时,结 果为整数,否则为实数。 E→E+T | T T→num.num | num a):给出语法制导定义确定每个子表达式的类型 b):扩充 a)中的语法制导定义把表达式翻译成前缀形式,并且决定类型。试用一元运算 符 inttoreal 把整型值转换为相等的实型值,以使得前缀表达式中两个运算对象是同类型 的。 解:a) 产生式 语义规则 E→E1+T IF (E1.type=integer) and (T.type=integer) THEN E.type:=integer ELSE E.type:=real E→T E.type:=T.type T→num.num T.type:=real T→num T.type:=integer
b:) 产生式 语义规则 E→E1+T IF (E1.type=integer)and (T.type=integer)THEN BEGIN End int('+,El.val.T.val) END E今T Eval-Tvae T今num.num I.type:=real T>num -num.num.lexval T.val:=num lexval 5.5令综合属性val给出在下面的文法中的S产生的二进制数的值(如,对于输入101.101, sva=5625. L→LBIB B)011 a):试用各有关综合属性决定S.val 解: 语义现则 S→L1.2 S.val =L1.val+12.val2 .va L.length:=L1.length+1 Lval-B.val B0 B vat=0 B1 B.val:=1 5.6:重写例5.3中语法制导定义的基础文法,使类型信息只需通过综合属性传递。 解:改写文法 D→L,id L→Tid T→intreal 语法制导定义
b:) 产生式 语义规则 E→E1+T IF (E1.type=integer) and (T.type=integer) THEN BEGIN E.type:=integer Print(‘+’,E1.val,T.val) END ELSE BEGIN E.type:=real IF E1.type=integer THEN Begin E1.type:=real E1.val:=inttoreal(E1.val) End IF T.type:=integer THEN Begin T.type:=real T.val:=inttoreal(T.val) End Print(‘+’,E1.val,T.val) END E→T E.type:=T.type E.val:=T.val T→num.num T.type:=real T.val:=num.num.lexval T→num T.type:=integer T.val:=num.lexval 5.5 令综合属性 val 给出在下面的文法中的 S 产生的二进制数的值(如,对于输入 101.101, S.val=5.625); S→L.L | L L→LB | B B→0 | 1 a): 试用各有关综合属性决定 S.val 解: 产生式 语义规则 S→L1.L2 L2.length S.val := L1.val + L2.val/2 S→L S.val:=L.val L→L1B L.val:=L1.val*2+B.val L.length:=L1.length+1 L→B L.val:=B.val L.length:=1 B→0 B.val:=0 B→1 B.val:=1 5.6:重写例 5.3 中语法制导定义的基础文法,使类型信息只需通过综合属性传递。 解:改写文法: D→L,id | L L→T id T→int | real 语法制导定义
[产生式 语义规则 DLid D.type:=L.type yperid.entry.L.type) D>I L→Tid L.type:=Ltvpe Addtvpe(id.entry.T.tvpe) T>int type.-nege 5.7: 试从练习54和b中的语法制导定义中清除左递归。 解:a) R+ N :IF(R ELSE R Re R s=R il T今num.num T今num 产生式 语义规则 RTtype R>+T F()( integer)THEN int(+RiTval) eal IF Ri-intger THEN Ri=real Enintora(j) IF T.type=integer THEN Begin prealct val) l) END (Rs-RI.s) R.S:=R.I T今um.num Tval:-num.num lexval T今num type:=integer) 31, 中属性s和i用于传递属性p,属性t和j用于传递属性val
产生式 语义规则 D→L,id D.type:=L.type Addtype(id.entry,L.type) D→L D.type:=L.type L→T id L.type:=T.type Addtype(id.entry,T.type) T→int T.type:=integer T→real T.type:=real 5.7:试从练习 5.4(a)和(b)中的语法制导定义中消除左递归。 解:a) 产生式 语义规则 E→T R {R.i:=T.type} {E.Type:=R.s} R→+ T R1 {IF (R.i=integer) and (T.type=integer) THEN R1.i:=integer ELSE R1.i :=real} {R.s:=R1.s} R→ {R.s:=R.i} T→num.num T.type:=real T→num T.type:=integer b) 产生式 语义规则 E→T R {R.i:=T.type} {R.j:=T.val} {E.Type:=R.s} {E.val:=R.t} R→+T R1 {IF (R.i=integer) and (T.type=integer) THEN BEGIN R1.i:=integer Print(‘+’,R.j,T.val) R1.j:=R.j+T.val END ELSE BEGIN R1.i :=real IF R.i=integer THEN Begin R.i:=real R.j:=inttoreal(R.j) End IF T.type=integer THEN Begin T.type:=real T.val:=inttoreal(T.val) End Print(‘+’,R.j,T.val) R1.j :=R.j+T.val END} {R.s:=R1.s} {R.t:=R1.t} R→ {R.s:=R.i} {R.t:=R.j} T→num.num {T.type:=real} {T.val:=num.num.lexval} T→num {T.type:=integer} {T.val:=num.lexval} 其中属性 s 和 i 用于传递属性 type,属性 t 和 j 用于传递属性 val
5.9:假设说明是由下列文法生成的: D→iaL L>,idLI:T Tinteger real )建立一个翻译模式,把每一个标志符的类型加在符号表中 b)从a)的翻译模式构造一个预翻译程序 解: 翻译模式 D→id L D) L→,id 1 L Type:=LI.Type Procedure D; begin Iflookahead=id then Begin Match(id); D.type-L: addtype(id.entry.D.type) end else error end Function L:Data Type Begin Iflookahead=','then Begin Match(): Iflookahead=id then begir match(id) L'Type=L; addtype(id.entry.L type): return(Ltype) Else error End Else if lookahead=''then Begin
5.9:假设说明是由下列文法生成的: D→id L L→,id L | :T T→integer | real a) 建立一个翻译模式,把每一个标志符的类型加在符号表中 b) 从 a)的翻译模式构造一个预翻译程序 解:a) 产生式 翻译模式 D→id L {D.Type:=L.Type} {addtype(id.entry, D.type)} L→,id L1 {L.Type:=L1.Type} {addtype(id.entry, L.type)} L→:T {L.type:=T.type} T→integer {T.type:=integer} T→real {T.type:=real} b) Procedure D; begin If lookahead=id then Begin Match(id); D.type=L; addtype(id.entry,D.type) end else error end Function L: DataType; Begin If lookahead=’,’ then Begin Match(‘,’); If lookahead=id then begin match(id); L.Type=L; addtype(id.entry,L.type); return(L.type) end Else error End Else if lookahead=’:’ then Begin
Match:'方 return(LType) end else error End Function T:DataType; Begin If lookahead=integer then Begin Match(integer) return(integer end else Iflookahead=real then Begin Match(real). return(real) end else error end 5.10:下面的文法是表5,7中基础文法的无二义形式,其中的花括号{}只用于将盒子分组 并将在翻译过程中被消除。 S→L L→LBIB B>B subEIE a用上面的文法修改表5.7的语法制导定义 b):把a)中的语法制导定义转化为翻译模式 解a: 产生式 语义规则 S→L L→L1B Bpe-Lps L.ht:=max(LI.ht.B.ht) →B B→Bl subF Bl.ps:=B.ps BF F ns=l B.ht=F.h FL L.ps=F.ps
Match(‘:’); L.Type=T; return(L.Type) end else error End Function T: DataType; Begin If lookahead=integer then Begin Match(integer); return(integer) end else If lookahead=real then Begin Match(real); return(real) end else error end 5.10:下面的文法是表 5.7 中基础文法的无二义形式,其中的花括号{ }只用于将盒子分组, 并将在翻译过程中被消除。 S→L L→LB | B B→B sub F | F F→{L} | text a):用上面的文法修改表 5.7 的语法制导定义 b):把 a)中的语法制导定义转化为翻译模式 解 a): 产生式 语义规则 S→L L.ps:=10 S.ht:=L.ht L→L1B L1.ps:=L.ps B.ps:=L.ps L.ht:=max(L1.ht,B.ht) L→B B.ps:=L.ps L.ht:=B.ht B→B1 sub F B1.ps:=B.ps F.ps=:shrink(B.ps) B.ht=disp(B1.ht,F.ht) B→F F.ps=B.ps B.ht=F.ht F→{L} L.ps=F.ps
F→text F.ht=L.ht F.ht=text.h*F.ps b): 产生式 翻译模式 {ps0 L1.ps:=Lps (B.ps:=Lps) B ht=max( 1.ht.B.ht)] B Lht=B.ht B→ B1.ps:=B.ps 31 ub F {F.ps:=shrink(B.ps)) (B.ht:-disp(B1.ht.F.ht) B- F) L.ps:=F.ps Eht=I ht F→text E.ht:=text.h F.ps
F.ht=L.ht F →text F.ht=text.h * F.ps b) : 产生式 翻译模式 S→ L {L.ps:=10} {S.ht:=L.ht} L → L1 B {L1.ps:=L.ps} {B.ps:=L.ps} {L.ht=max(L1.ht,B.ht)} L → B {B.ps:=L.ps} {L.ht:= B.ht} B → B1 sub F {B1.ps:=B.ps} {F.ps:=shrink(B.ps)} {B.ht:=disp(B1.ht,F.ht)} B → F {F.ps:=B.ps} {B.ht:=F.ht} F → { L} L.ps:=F.ps F.ht:=L.ht F →text F.ht:=text.h * F.ps