xt05答案.docx

上传人:b****7 文档编号:23348844 上传时间:2023-05-16 格式:DOCX 页数:21 大小:80.18KB
下载 相关 举报
xt05答案.docx_第1页
第1页 / 共21页
xt05答案.docx_第2页
第2页 / 共21页
xt05答案.docx_第3页
第3页 / 共21页
xt05答案.docx_第4页
第4页 / 共21页
xt05答案.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

xt05答案.docx

《xt05答案.docx》由会员分享,可在线阅读,更多相关《xt05答案.docx(21页珍藏版)》请在冰豆网上搜索。

xt05答案.docx

xt05答案

练习5.1

解答:

输入(4*7+1)*2n,带注释的分析树如下:

练习5.2

解答:

   (a)根据表5.3中的语法制导定义建立表达式((a)+(b))的分析树和语法树

             (b)根据图5.17的翻译模式构造((a)+(b))的分析树和语法树

练习5.3

解答:

设置下面的函数和属性:

expr1||expr2:

把表达式expr2拼写在表达式expr1后面。

deletp(expr):

去掉表达式expr左端的‘(’和右端的‘)’。

E.expr,T.expr,F.expr:

属性变量,分别表示E,T,F的表达式。

E.add,T.add,F.add,属性变量,若为true,则表示其表达式中外层有‘+’号,否则无‘+’号。

E.pmark,T.pmark,F.pmark,属性变量,若为true,表示E,T,F的表达式中左端为‘(’,右端是‘)’。

语法制导定义如下:

产生式

语义规则

E->E1+T

if(T.pmark==true)

  THENE.expr=E1.expr||'+'||deletep(T.expr)

  ELSEE.expr:

=E1.expr||'+'||T.expr;

E.add:

=true;

E.pmark:

=false;

E->T

if(T.pmark==true)

  THENE.expr:

=deletep(T.expr)

  ELSEE.expr:

=T.expr;

E.add:

=T.add;

E.pmark:

=false;

T->T1*F

T.expr:

=T1.expr||'*'||F.expr;

T.add:

=false;

T.pmark:

=false;

T->F

T.expr:

=F.expr;

T.add:

=F.add;

T.pmark:

=F.pmark;

F->(E)

if(E.add==false)

  THENBEGIN

       F.expr:

=E.expr;

       F.add:

=false;

       F.pmark:

=false;

       END

  ELSEBEGIN

       F.expr:

='('||E.expr||')';

       F.add:

=true;

       F.pmark:

=true;

       END;

F->id

F.expr:

=id.lexval;

F.add:

=false;

F.pmark:

=false;

练习5.4

解答:

(a)语法制导定义如下:

产生式

语义规则

E->E1+T

if(E1.type==int)AND(T.type==int)

  THENE.type:

=int

  ELSEE.type:

=real;

      E->T

E.type:

=T.type;

      T->num

T.type:

=int;

     T->num.num

T.type:

=real;

     (b)语法制导定义如下:

产生式

语义规则

E->E1+T

if(E1.type==int)AND(T.type==int)

  THENE.type:

=int

  ELSEBEGIN

      E.type:

=real;

      if(E1.type==int)AND(T.type==real)

        THENE1.pf:

='inttoreal'||E1.pf

        ELSEif(E1.type==real)AND(T.type==int)

               THENT.pf:

='inttoreal'||T.pf

      END;

E.pf:

='+'||E1.pf||T.pf;

       E->T

E.type:

=T.type;E.pf:

=T.pf;

       T->num

T.type:

=int;   T.pf:

=int.lexval;

       T->num.num

T.type:

=real;  T.pf:

=real.lexval;

练习5.5

解答:

(a)用综合属性决定s.val的语法制导定义:

产生式

语义规则

         S->L

S.val:

=L.val;

         S->L1.L2

S.val:

=L1.val+L2.val*L2.p;

         L->B

L.val:

=B.val;   L.p:

=2-1;

         L->L1B

L.val:

=L1.val*2+B.val;

L.p:

=L.p*2-1;

         B->0

B.val:

=0;

         B->1

B.val:

=1;

        注:

L.p表示恢复L.val的因子。

     (b)分析:

设B.c是B的综合属性,是B产生的位对最终值的贡献。

要求出B.c,必须求出B产生位的

      权,设B.i。

B.i的求法请参看下面的图示:

      另外,设L.fi为继承因子,L.fs为综合因子,语法制导定义如下:

产生式

语义规则

         S->L

L.i:

=1;L.fi:

=2;L.fs:

=1;S.val:

=L.val;

         S->L1.L2

L1.i=1;L1.fi=2;L1.fs:

=1;

L2.i=2-1;L2.fi=1;L2.fs:

=2-1;

S.val:

=L1.val+L2.val;

         L->B

L.s:

=L.i;B.i:

=L.s;L.val:

=B.c;

         L->L1B

L1.i:

=L.i*L1.fi;

L.s:

=L1.s*L1.fs;

B.i:

=L.s;

L.val:

=L1.val+B.c;

         B->0

B.c:

=0;

         B->1

B.c:

=B.i;

    若把文法改写成如下形式,则语法制导定义会更清楚:

                        S->L.R|L

                        L->LB|B

                        R->Rb|B

                        B->0|1

产生式

语义规则

         S->L

L.i:

=1; S.val:

=L.val;

         S->L.R

L.i=1;  R.i=2-1;

S.val:

=L.val+R.val;

         L->L1B

B.i:

=L.i; L1.i:

=L.i*2;

L.val:

=L1.val+B.c;

         L->B

B.i:

=L.i;  L.val:

=B.c;

         R->R1B

R1.i:

=R.i; R.s:

=R1.s*2-1;

B.i:

=R.s;

         R->B

R.s:

=R.i; B.i:

=R.s;

R.val:

=B.c;

         B->0

B.c:

=0;

         B->1

B.c:

=B.i;

练习5.6

解答:

 

产生式

语义规则

         D->D1,id

D.type:

=D1.type;

addtype(id.entry,D1.type);

         D->Tid

D.type:

=T.type;

addtype(id.entry,T.type);

         T->int

T.type:

=int;

         T->real

T.type:

=real;

     

练习5.7

解答:

 

           (a)

产生式

语义规则

         E->TR

R.i:

=T.type; E.type:

=R.s;

         R->+TR1

if(R.i==int)AND(T.type==int)

  THENR1.i:

=int

  ELSER1.i:

=real;

R.s:

=R1.s;

         R->ε

R.s:

=R.i;

         T->num.num

T.type:

=real;

         T->num

T.type:

=int;

           (b)

产生式

语义规则

         E->TR

R.itype:

=T.type; R.ipf:

=T.pf;

E.pf:

=R.spf; E.type:

=R.stype;

         R->+TR1

if(R.itype==int)AND(T.type==int)

  THENR1.itype:

=int

  ELSEBEGIN

      R1.itype:

=real;

      if(R.itype==real)AND(T.type==int)

        THENT.pf:

='inttoreal'||T.pf

        ELSEif(R.itype==int)AND(T.type==real)

              THENR.ipf:

='inttoreal'||R.if

       END;

R1.ipf:

='+'||R.ipf||T.pf;

R.stype:

=R1.stype; R.spf:

=R1.spf;

         R->ε

R.stype:

=R.itype; R.spf:

=R.ipf;

         T->num

T.type:

=int; T.pf:

=int.lexval;

       T->num.num

T.type:

=real; T.pf:

=real.lexval;

               注:

R.ipf是R的继承属性,是它的前缀表示。

                    R.spf是R的综合属性,是它的前缀表示。

 

练习5.8

解答:

设计两个函数lookup(name)和enter(name,type),lookup(name)查找符号表,若查到,则返回name在符号表中的地址;否则返回NULL。

enter(name,type)在符号表中建立name的符号表项,并填写上name的类型type。

翻译模式如下:

         D->T{L.in:

=T.type}L

         L->{L1.in:

=L.in}

               L1,id{if(lookup(id.name))

                        thenerror

                        elseenter(id.name,L.in)}

         L->id{if(lookup(id.name))

                     thenerror

                     elseenter(id.name,L.in)}

         T->int{T.type:

=int}

         T->real{T.type:

=real}

练习5.9

解答:

(a)翻译模式如下:

           D->idL{addtype(id.entry,L.type)}

           L->,idL1{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;

             VARL.type:

(integer,real);

                 id.entry:

^id-entry;

             BEGIN

               id.entry:

=id.lexval;

               match(id);

               L.type:

=L;

               addtype(id.entry,L.type)

             END;

 

           FUNCTIONL:

(integer,real);

             VARL.type,L1.type:

(integer,real);

                 id.entry:

^id-entry;

             BEGIN

               if(lookahead==',')

                 THENBEGIN

                          match(',');

                          match(id);

                          id.entry:

=id.lexval;

                          L1.type:

=L;

                          L.type:

=L1.type;

                          addtype(id.entry,L.type);

                       END

                 ELSEBEGIN

                           match(':

');

                           L.type:

=T;

                        END;

               return(L.type);

             END;  

 

     FUNCTIONT:

(integer,real);

      VART.type:

(integer,real);

      BEGIN

        if(lookahead=='integer')

        THENBEGIN

               match(integer);

               T.type:

=id.lexval

             END

        ELSE 

        if(lookahead=='real')

        THENBEGIN

               match(real);

               T.type:

=id.lexval;

             END;

        ELSEERROR;

        return(T.type);

      END;  

 

 

    

       

 

练习5.10

解答:

 

(a)对于F1subF2subF3,其最左推导和分析树如下:

       S=>L

         =>B

         =>BsubF3

         =>BsubF2subF3

         =>F1subF2SubF3

   显然,F3.ps:

=shrink(F2.ps);

         F2.ps:

=shrink(F1.ps);  

   为此,为B设一个综合属性B.pt,其值等于其下标F的继承属性F.ps。

语法制导定义如下:

 

产生式

语义规则

         S->L

L.ps:

=10; S.ht:

=L.ht;

         L->B

B.ps:

=L.ps; L.ht:

=B.ht;

         L->L1B

L1.ps:

=L.ps; B.ps:

=L.ps;

L.ht:

=max(L1.ht,B.ht);

         B->B1subF

B1.ps:

=B.ps; F.ps:

=shrink(B1.pt);

B.ht:

=disp(B1.ht,F.ht);

B.pt:

=F.ps;

         B->F

F.ps:

=B.ps;B.ht:

=F.ht;

B.pt:

=B.ps;

         F->{L}

L.ps:

=F.ps;F.ht:

=L.ht;

         F->text

F.ht:

=text.h*F.ps

(b)翻译模式如下:

                   S->{L.ps:

=10}

                        L{S.ht:

=L.ht}

                   L->{B.ps:

=L.ps}

                        B{L.ht:

=B.ht}

                   L->{L1.ps:

=L.ps}

                        L1{B.ps:

=L.ps}

                        B {L.ht:

=max(L1.ht,B.ht)}

                   B->{B1.ps:

=B.ps}

                        B1

                        sub{F.ps:

=shrink(B1.pt)}

                        F{B.ht:

=disp(B1.ht,F.ht);

                           B.pt:

=F.ps}

                   B->{F.ps:

=B.ps}

                        F{B.ht:

=F.ht;B.pt:

=B.ps}

                   F->   {L.ps:

=F.ps}

                        {L}{F.ht:

=L.ht}

                   F->text{F.ht:

=text.h*F.ps}                

 

练习5.11

解答:

(a)假设基础文法含左递归的翻译模式如下:

            A->{A1.i:

=A.i}

                 A1{Y.i:

=A.i}

                 Y{A.a:

=g(A1.a,Y.y)}

            A->{X.i:

=A.i}

                 X{A.a:

=f(X.x)}

   消除基础文法左递归后的翻译模式如下:

 

            A->{X.i:

=A.i}

                 X{R.i:

=f(X.x);R.yi:

=A.i}

                 R{A.a:

=R.s}

            R->{Y.i:

=R.yi}

                 Y{R1.i:

=g(R.i,Y.y);R1.yi:

=R.yi}

                 R1{R.s:

=R1.s}

            R->ε{R.s:

=R.i}

   属性R.yi用于传递A.i给Y。

(b)设基础文法含左递归的翻译模式如下:

           A->{A1.i:

=h1(A.i)}

                A1{y.i:

=h2(A.i)}

                Y{A.a:

=g(A1.a,Y.y)}

           A->{X.i:

=h3(A.i)}

                X{A.a:

=f(X.x)}

   考虑XY1Y2Y1,其继承属性的计算如下:

   消除基础文法中的左递归后,基础文法为:

           A->XR

           R->YR|ε

   继承属性的计算如下图所示:

    

 当识别出X后,并不能计算出X的继承属性,因而,也就无法计算有关X的其他属性。

只好把X的源表示或中间表示作为继承传给R,继续沿R传下去,然后再作为综合属性传回来。

直到能计算出X.i,再对X的成分进行翻译。

Y1,Y2,Y3的翻译思想和X类似,具体的翻译模式省略。

         

练习5.12

解答:

                   S->{L.ps:

=10;L.iht:

=0}

                        L{S.ht:

=L.ht}

                   L->{B.ps:

=L.ps}

                        B{L.ht:

=max(L.iht,B.ht)}

                   L->{B.ps:

=L.ps}

                        B{L1.iht:

=max(L.iht,B.ht);L1.ps:

=L.ps}

                        L1{L.ht:

=L1.ht}

                   B->{F.ps:

=B.ps}

                        F

                        sub{B1.ps:

=shrink(B.ps)}

                        B1{B.ht:

=disp(F.ht,B1.ht)}

    

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1