最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

编译原理 第5章习题解答

来源:动视网 责编:小OO 时间:2025-09-26 01:08:55
文档

编译原理 第5章习题解答

第五章习题解答5.1设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。S→SASCS→εA→AaA→bC→DcDD→d5.2消除下列文法的左递归:①G[A]:A→BXCzWB→AbBcC→AxByCp②G[E]:E→ET+ET–TT→TF*TF/FF→(E)i③G[X]:X→YaZbcY→ZdXefZ→XeYfa④G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3设文法G[]:→:=|ifthen|ifthenelse→i→|+→|*→|′(′′)′试构造该文法的
推荐度:
导读第五章习题解答5.1设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。S→SASCS→εA→AaA→bC→DcDD→d5.2消除下列文法的左递归:①G[A]:A→BXCzWB→AbBcC→AxByCp②G[E]:E→ET+ET–TT→TF*TF/FF→(E)i③G[X]:X→YaZbcY→ZdXefZ→XeYfa④G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3设文法G[]:→:=|ifthen|ifthenelse→i→|+→|*→|′(′′)′试构造该文法的
第五章 习题解答

5.1 设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。

S→SASC

S→ε

A→Aa

A→b

C→DcD

D→d

5.2 消除下列文法的左递归:

    ①  G[A]:

        A→BXCzW

        B→AbBc

        C→AxByCp

    ②  G[E]:

        E→ET+ET–T

        T→TF*TF/F

        F→(E)i

③  G[X]:

    X→YaZbc

    Y→ ZdXef

    Z→XeYfa

④ G[A]:

    A→Ba|Aa|c

B→Bb|Ab|d

 5.3 设文法G[<语句>]:

    <语句>→<变量>: = <表达式>|if<表达式>then<语句>

|if<表达式>then<语句>else<语句>

    <变量>→i

<表达式>→<项>|<表达式>+<项>

    <项>→<因子>|<项>*<因子>

    <因子>→<变量>|′(′<表达式>′)′

试构造该文法的递归下降子程序。

 5.4 设文法G[E]:

        E→ TE

        E→ + E

        T→ FT

        T→ T

        F→ PF

        F→ *F

        P→ (E) a^

    ① 构造该文法的递归下降分析程序;

    ② 求该文法的每一个非终结符的FIRST集合和FOLLOW集合;

    ③ 构造该文法的LL(1)分析表,并判断此文法是否为LL(1)文法。

 5.5 设文法G[S]:

        S→ SbAaA

        B→ Sb

        A→ Bc

    ① 将此文法改写为LL(1)文法;

    ② 求文法的每一个非终结符的FIRST集合和FOLLOW集合;

    ③ 构造相应的LL(1)分析表。

    5.6 设文法G[S]:

        S→ aABbcd

        A→ ASd

        B→ SAheC

        C→ SfCg

        D→ aBD

    ① 求每一个非终结符的FOLLOW集合;

    ② 对每一个非终结符的产生式选择,构造FIRST集合;

③ 该文法是LL(1)文法。

 5.7 设文法G[E]:

        E→ AaBb

        A→ cAeB

        B→ bd

    试画出其自上而下分析程序框图。

第五章习题参

5.1 解:NDPDA M=(Q,∑,H,δ,q0,F,Z0)

        Q={q}

∑={a,b,c,d}

H={S,A,C,D,a,b,c,d}

q0=q

F={q}

Z0=S

δ: δ(q,,S)={(q,SASC),(q,)}

δ(q,,A)={(q,Aa),(q,b)}

δ(q,,C)={(q,DCD)}

δ(q,,D)={(q,d)}

δ(q,a,a)=(q,)

δ(q,b,b)=(q,)

δ(q,c,c)=(q,)

δ(q,d,d)=(q,)

5.2 解:

① 利用消除左递归的算法,将非终结符排序为U1=A,U2=B,U3=C,

         则i=1,j=0时,对文法无影响。

                                        i=2,j=1时,因为Ui=B→Ab,Uj=A→Bx|Cz|w

                      所以将B改写为B→Bxb|Czb|wb|Bc

                        消除产生式B的左递归:

                          B→CzbB′|wbB′

                          B′→xbB′|cB′| 

           i=3,j=1时,因为Ui=C→Ax,Uj=A→Bx|Cz|w

                      所以将C改写为C→Bxx|Czx|wx|By|Cp

              j=2时,因为Ui=C→Bxx|By,Uj=B→CzbB′|wbB′

                      所以将产生式C改写为 

                      C→CZbB′xx|CzbB′y|wbB′xx|wbB′y|Czx|wx|Cp

                      消除产生式C的左递归:

                       C→wbB′xxC′|wbB′yC′|wxC′

C′→zbB′xxC′|zbB′yC′|zxC′|pC′| 

             所以,文法消除左递归后变为

                A→Bx|Cz|w   

                B→CzbB′|wbB′

                B′→xbB′|cB′|

                C→wbB′xxC′|wbB′yC′|wxC′

                C′→zbB′xxC′|zbB′yC′|zxC′|pC′| 

② 利用消除左递归的算法,将非终结符排序为:U1=E,U2=T,U3=F

         则    i=1,j=0时,无代入。

             消除产生式E的左递归:

                  E→T{(T+|T-)}

               i=2,j=1时,无代入。

                  消除产生式T的左递归:

                  T→{F*|F/F}

               i=3,j=1时,无代入,也无产生式左递归,不改写产生式。

         所以,文法消除左递归后变为

           E→T{(T+|T-)}

           T→{F*|F/F}

           F→(E)|I

③ 利用消除左递归的算法,将非终结符排序为: U1=X,U2=Y,U3=Z

    则  i=1,j=0时,无代入

        i=2,j=1时,因为Ui=Y→Zd|Xe|f,Uj=X→Ya|Zb|c

                   所以将Y改写为 Y→Zd|Yae|Zbe|ce|f

            消除左递归,得到 Y→ZdY′|ZbeY′|ceY′|fY′

                             Y′→aeY′|

        i=3,j=1时,因为Ui=Z→Xe|Yf|a,Uj=X→Ya|Zb|c

                   所以将Z改写为Z→Yae|Zbe|ce|Yf|a

            j=2时, Ui=Z→Yae|Yf, Uj= Y→ZdY′|ZbeY′|ceY′|fY′

所以将Z改写为 

Z→ZdY′ae|ZbeY′ae|ceY′ae|fY′ae|ZdY′f|ZbeY′f|ceY′f|fY′f|Zbe|ce|a

对Z消除左递归得到:

  Z→ceY′aeZ′|fY′ae Z′|ceY′f Z′|fY′f Z′|ce Z′|a Z′

Z′→dY′ae Z′|beY′ae Z′| dY′f Z′|beY′f Z′|be Z′|

    所以,文法消除左递归以后变为:

X→Ya|Zb|c

Y→ZdY′|ZbeY′|ceY′|fY′

Y′→aeY′|

Z→ceY′aeZ′|fY′ae Z′|ceY′f Z′|fY′f Z′|ce Z′|a Z′

Z′→dY′ae Z′|beY′ae Z′| dY′f Z′|beY′f Z′|be Z′|

④ 利用消除左递归的算法,将非终结符排序为

          U1=A, U2=B

i=1, j=0时,由于产生式A→Ba|Aa|c存在直接左递归,将其修改为

          A→BaA′|cA′

          A′→aA′| 

i=2,j=1时,因为Ui=B→Ab,Uj=A→BaA′|cA′,所以将产生式B修改为

          B→Bb|BaA′b|cA′b|d

          消除产生式B的左递归,得

          B→cA′bB′|dB′

          B′→bB′|aA′bB′| 

所以文法消除左递归后变为

A→BaA′|cA′

A′→aA′| 

B→cA′bB′|dB′

B′→bB′|aA′bB′| 

5.3解:首先改写文法,使其满足递归下降分析法对文法的要求。

对产生式<语句>提取最左公共因子得

        <语句>→<变量>: = <表达式>|if<表达式>then<语句><语句′>

          <语句′>→else<语句>| 

   对产生式<表达式>、<项>消除左递归得

        <表达式>→<项><表达式′>

        <表达式′>→+<项><表达式′>| 

        <项>→<因子><项′>

        <项′>→*<因子>| 

得到等价的文法:

       <语句>→<变量>:=<表达式>|if<表达式>then<语句><语句′>

       <语句′>→else<语句>| 

       <变量>→i

       <表达式>→<项><表达式′>

       <表达式′>→+<项><表达式′>| 

       <项>→<因子><项′>

       <项′>→*<因子>| 

       <因子>→<变量>|′(′<表达式>′) ′

构造该文法的递归下降分析程序如下:

   PROCEDURE  <语句>;

   BEGIN 

     IF  SYM  IN  FIRST(<变量>)

     THEN  BEGIN

              <变量>;

               IF  SYM=′:= ′

               THEN  BEGIN

                        READAWORD;

                        <表达式>

                      END

               ELSE ERROR

            END

     ELSE  IF  SYM=′if′

            THEN  BEGIN

                     READAWORD;

                     <表达式>;

                     IF  SYM=′then′

                     THEN  BEGIN

                         READAWORD;

                         <语句>;

                         <语句′>

                      END

                ELSE  ERROR

              END

         ELSE  ERROR  

   END;

   

   PROCEDURE  <语句′>;

   BEGIN

     IF  SYM=′else′  

     THEN  BEGIN

              READAWORD;

              <语句>

            END

     ELSE  IF  NOT (SYM  IN  FOLLOW(<语句′>))

            THEN  ERROR

   END;

   PROCEDURE  <变量>;

   BEGIN 

     IF  SYM=′i′    /* i表示标识符 */

     THEN  READAWORD

     ELSE  ERROR

   END;

   PROCEDURE  <表达式>;

   BEGIN

     <项>;

     <表达式′>

   END;

   PROCEDURE  <表达式′>;

   BEGIN

     IF  SYM=′+′

     THEN  BEGIN

              READAWORD;

              <项>;

              <表达式′>

            END

     ELSE  IF  NOT (SYM  IN  FOLLOW(<表达式′>))

            THEN  ERROR

   END;

  

   PROCEDURE  <项>;

   BEGIN

     <因子>;

     <项′>

   END;

   PROCEDURE  <项′>;

   BEGIN  

     IF  SYM=′*′

     THEN  BEGIN

              READAWORD;

              <因子>

            END

     ELSE  IF  NOT (SYM  IN  FOLLOW(<项′>))

            THEN  ERROR

   END;

   PROCEDURE  <因子>;

   BEGIN

     IF  SYM=′(′

     THEN  BEGIN

              READAWORD;

              <表达式>;

              IF  (SYM=′)′)

            THEN  READAWORD

           ELSE  ERROR

         END

     ELSE  IF  SYM  IN  FIRST(<变量>)

         THEN  <变量>

         ELSE  ERROR

   END;

5.4 解:

(1)步骤和方法与5.3中类似,略。

    (2)根据FIRST、FOLLOW集合的求法可以得到:

        FIRST(E)={(,a, ^};             FIRST(E′)={+,}

        FIRST(T)={(,a, ^};             FIRST(T′)={(,a, ^,}

FIRST(F)={(,a, ^};            FIRST(F′)={*,}

FIRST(P)={(,a, ^}.

FOLLOW(E)={),$};             FOLLOW(E′)={),$};

FOLLOW(T)={+,),$};             FOLLOW(T′)={+,),$};

FOLLOW(F)={(,a,^,+,),$};     FOLLOW(F′)={(,a,^,+,),$};

FOLLOW(P)={(,a,^,+,),$,*};  

(3)根据求得的FIRST、FOLLOW集合可以得到SELECT集合,进而构造出LL(1)分析表如下:

+*()a^$
EE→TE′

E→TE′

E→TE′

E′

E′→+E

E′→

E′→

E′→

TT→FT′

T→FT′

T→FT′

T′

T′→

T′→

T′→T

T′→

T′→T

T′→T

T′→

FF→PF′

F→PF′

F→PF′

F→PF′

F′

F′→

F′→

F′→*F

F′→

F′→

F′→

F′→

F′→

PP→(E)

P→a

P→^

空白处为ERROR。表中每一元素的表达式都是唯一的,因此该文法是LL(1)文法。

5.5 解:

(1) 改写文法为LL(1)文法。

因为S→SbA|aA有左递归,故将其改写为

         S→aA{bA}

文法变为

         S→aA{bA}

       B→Sb

       A→Bc

这样的文法满足LL(1)文法的条件。

(2) 文法每一个非终结符号的FIRST集合为

        FIRST(S)={a}

        FIRST(A)={a}

        FIRST(B)={a}

文法每一个非终结符号的FOLLOW集合为

因为S为开始符号,且有产生式  S→aA{bA}  和  B→Sb

所以        FOLLOW(S)={#}∪FIRST(b)={#,b}

因为    S→aA{bA}

所以        FOLLOW(A)= FOLLOW{S}∪FIRST(bA)={#,b}

因为    A→Bc

所以        FOLLOW(B)=FIRST{c}={c}

(3) 构造相应的LL(1)分析表

因为    FIRST(aA{bA})={a}

所以        M[S,a]= “ S→aA{bA}”

因为    FIRST(A)={a}   

所以        M[A,a]= “ A→Bc ”

因为    FIRST(B)={a}

所以        M[B,a]= “B→Sb ”

文法G[S]的分析表如下表所示(空白处是ERROR)。

abc#
SS→aA{bA}

AA→Bc

BB→Sb

文法G[S]的分析表

5.6 解:首先将文法压缩,得到

        S→aABbcd| 

        A→ASd| 

        B→SAh|eC| 

        C→Sf|Cg| 

(1) 求每一个非终结符号的FOLLOW集合:

因为S为开始符号,且有产生式  A→ASd,B→SAh,C→Sf

所以FOLLOW(S)={#}∪FIRST(d)∪FIRST(Ah)∪FIRST(f)={#,d,a,h,f}

因为S→aABbcd,A→ASd,B→SAh

所以FOLLOW(A)=FIRST{Bbcd}∪FIRST{Sd}∪FIRST{h}={b,a,d,h,e}

因为S→aABbcd  

所以FOLLOW(B)=FIRST{bcd}={b}

因为B→eC,C→Cg

所以FOLLOW(C)=FOLLOW(B)∪FIRST(g)={b,g}

(2) 对每一个非终结符号的产生式选择,构造FIRST集合

对S:FIRST(aABbcd)={a}   FIRST()={}

对A:FIRST(ASd)={a,d}   FIRST()={}

对B:FIRST(SAh)={a,d,h}   FIRST(eC)={e}   FIRST()={}

对C:FIRST(Sf)={a,f}   FIRST(Cg)={a,f,g}   FIRST()={}

(3) 由于存在产生式C→Sf|Cg| 

      FIRST(Sf)∩FIRST(Cg)={a,f}∩{a,f,g}≠

所以该文法不是LL(1)文法。

            

5.7 解:因为该文法无左递归,且对每一个非终结符号,其右部各候选式的首终结符号集合两两互不相交,所以可以采用自上而下分析方法而不出现回溯和无限循环。假设用READ(CH)代表读下一个单词,得到文法的自上而下分析程序框图,如下图所示。

    

               (1)                          (2)                        (3)

文法的自上而下分析程序框图

文档

编译原理 第5章习题解答

第五章习题解答5.1设一NDPDA识别由下述CFG定义的语言,试给出这个NDPDA的完整形式描述。S→SASCS→εA→AaA→bC→DcDD→d5.2消除下列文法的左递归:①G[A]:A→BXCzWB→AbBcC→AxByCp②G[E]:E→ET+ET–TT→TF*TF/FF→(E)i③G[X]:X→YaZbcY→ZdXefZ→XeYfa④G[A]:A→Ba|Aa|cB→Bb|Ab|d5.3设文法G[]:→:=|ifthen|ifthenelse→i→|+→|*→|′(′′)′试构造该文法的
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top