编译原理习题—LL(1)文法、构造预测分析器、递归下降分析、LR(0)、SLR(1)、LR(1)分析—陈意云张昱第三版第三章

本文详细讲解了上下文无关文法、最左推导和最右推导的区别,如何判断二义文法并消除其二义性,以及左递归的概念。此外,介绍了句柄、自上而下和自下而上的分析方法,区分了LL(1)、LR(0)、LR(1)和LALR(1)文法,并给出了编译原理习题的解答,包括词法分析、DFA构建和文法分析技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章戳这里👇

  1. 什么是上下文无关文法、最左推导和最右推导
  2. 如何判断二义文法及消除文法二义性
  3. 何时需要消除左递归
  4. 什么是句柄、什么是自上而下、自下而上分析
  5. 什么是LL(1)、LR(0)、LR(1)文法、LR分析表
  6. LR(0)、SLR(1)、LR(1)、LALR(1)文法之间的关系
  7. 编译原理第三章习题
  8. 词法分析、构建DFA、上下文无关文法、LL(1)分析、提取正规式
  9. 证明LL(1)、SLR(1)、LALR(1)文法
  10. 翻译方案、属性栈代码
  11. 【运行时环境】什么是活动记录、 活动记录与汇编代码的关系

编译原理第三章习题

Homework 4

3.1 3.1 3.1文法:
S → ( L ) ∣ a L → L , S ∣ S F o l l o w ( S ) = { , , ) , $ } F o l l o w ( L ) = { , , ) } S→(L)|a\\ L→L,S|S\\ Follow(S)=\{,,),\$\}\\Follow(L)=\{,,)\} S(L)aLL,SSFollow(S)={,),$}Follow(L)={,)}

1

( 1 ) (1) (1)习题 3.8 3.8 3.8,其中 ( b ) (b) (b)给出递归下降语法分析程序。

3.8 : 3.8: 3.8:
( a ) (a) (a)消除习题 3.1 3.1 3.1文法的左递归
消除左递归得到
S → ( L ) ∣ a L → S L ′ L ′ → , S L ′ ∣ ϵ S→(L)|a\\L→SL'\\L'→,SL'|\epsilon S(L)aLSLL,SLϵ
( b ) (b) (b) ( a ) (a) (a)的文法构造预测分析器

F i r s t ( S ) = { ( , a } F i r s t ( L ) = F i r s t ( S ) = { ( , a } F i r s t ( L ′ ) = { , , ϵ } F o l l o w ( L ) = { ) } F o l l o w ( L ′ ) = F o l l o w ( L ) = { ) } F o l l o w ( S ) = F i r s t ( L ′ ) − { ϵ } + F o l l o w ( L ) + F o l l o w ( L ′ ) + { $ } = { , , ) , $ } \begin{aligned} First(S)&=\{(,a\}\\ First(L)&=First(S)=\{(,a\}\\ First(L')&=\{,,\epsilon\}\\ Follow(L)&=\{)\}\\ Follow(L')&=Follow(L)=\{)\}\\ Follow(S)&=First(L')-\{\epsilon\}+Follow(L)+Follow(L')+\{\$\}=\{,,),\$\}\\ \end{aligned} First(S)First(L)First(L)Follow(L)Follow(L)Follow(S)={(,a}=First(S)={(,a}={,ϵ}={)}=Follow(L)={)}=First(L){ϵ}+Follow(L)+Follow(L)+{$}={,),$}

( ( ( ) ) ) , , , a a a $ $
S S S S → ( L ) S→(L) S(L) S → a S→a Sa
L L L L → S L ′ L→SL' LSL L → S L ′ L→SL' LSL
L ′ L' L L ′ → ϵ L'→\epsilon Lϵ L ′ → , S L ′ L'→,SL' L,SL

递归下降程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 1e3;
char str[N];
int ind = 0;
void S();// S->(L)|a;
void L();// L->SX
void X();// X-> ,SX|ε
int main() {
    int len;
    int m;
        printf("请输入要分析的串:");
        scanf("%s", str);
        len = strlen(str);
        str[len] = '#';
        str[len + 1] = '\0';
        S();
        if (str[ind] == '#')
            printf("正确语句!\n");
        else {
            printf("分析失败!\n");
        }
    return 0;
}
void L() {// L->SX
        S();
        X();
}
void X() {// X-> ,SX|ε
    if (str[ind] == ',') {
        ind++;
        S();
        X();
    }
}
void S() {// S->(L)|a;
    if (str[ind] == 'a') {
        ind++;
    } else if (str[ind] == '(') {
        ind++;
        L();
        if (str[ind] == ')') {
            ind++;
        } else {
            printf("分析失败!\n");
            exit(0);
        }
    } else {
        printf("分析失败!\n");
        exit(0);
    }
}

在这里插入图片描述
在这里插入图片描述

2

( 2 ) (2) (2)习题 3.11 3.11 3.11,并描述该文法产生的语言。
3.11 3.11 3.11:
构造下面文法的 L L ( 1 ) LL(1) LL(1)分析表
S → a B S ∣ b A S ∣ ϵ A → b A A ∣ a B → a B B ∣ b     F i r s t ( S ) = { a , b , ϵ } F i r s t ( A ) = { a , b } F i r s t ( B ) = { a , b } F o l l o w ( S ) = { $ } F o l l o w ( A ) = { a , b , $ } F o l l o w ( B ) = { a , b , $ } S→aBS|bAS|\epsilon\\ A→bAA|a\\ B→aBB|b\\ \ \\ \ \\ \begin{aligned} First(S)&=\{a,b,\epsilon\}\\ First(A)&=\{a,b\}\\ First(B)&=\{a,b\}\\ Follow(S)&=\{\$\}\\ Follow(A)&=\{a,b,\$\}\\ Follow(B)&=\{a,b,\$\}\\ \end{aligned} SaBSbASϵAbAAaBaBBb  First(S)First(A)First(B)Follow(S)Follow(A)Follow(B)={a,b,ϵ}={a,b}={a,b}={$}={a,b,$}={a,b,$}

a a a b b b $ $
S S S S → a B S S→aBS SaBS S → b A S S→bAS SbAS S → ϵ S→\epsilon Sϵ
A A A A → a A→a Aa A → b A A A→bAA AbAA
B B B B → a B B B→aBB BaBB B → b B→b Bb

该文法产生一个空串或者 a , b a,b a,b数量相等的 a b ab ab串。

3

( 3 ) (3) (3)为习题 3.1 3.1 3.1文法构造 S L R ( 1 ) SLR(1) SLR(1)分析表。
拓广文法
S ′ → S S → ( L ) S → a L → L , S L → S \begin{aligned} &S'→S\\ &S→(L)\\ &S→a\\ &L→L,S\\ &L→S \end{aligned}\\ SSS(L)SaLL,SLS

该文法的 L R ( 0 ) LR(0) LR(0)项目集规范族:
I 0 : S ′ → ⋅ S S → ⋅ ( L ) S → ⋅ a         I 1 : S ′ → S ⋅         I 2 : S → ( ⋅ L ) L → ⋅ L , S L → ⋅ S S → ⋅ ( L ) S → ⋅ a   I 3 : S → a ⋅              I 4 : S → ( L ⋅ ) L → L ⋅ , S           I 5 : L → S ⋅          I 6 : S → ( L ) ⋅           I 7 : L → L , ⋅ S S → ⋅ ( L ) S → ⋅ a         I 8 : L → L , S ⋅                                                     \begin{aligned} I_0:&\\ &S'→·S\\ &S→·(L)\\ &S→·a\\ \\ \\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_1:&\\ &S'→S·\\ \\ \\ \\ \\ \end{aligned} \ \ \ \ \ \ \ \begin{aligned} I_2:&\\ &S→(·L)\\ &L→·L,S\\ &L→·S\\ &S→·(L)\\ &S→·a\\ \end{aligned}\\ \ \\ \begin{aligned} I_3:&\\ &S→a·\\ \\ \\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned}\ \ \ \ I_4:&\\ &S→(L·)\\ &L→L·,S\\ \ \\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_5:&\\ &L→S·\\ \\ \\ \end{aligned}\\ \begin{aligned}\ \ \ \ \ \ \ \ I_6:&\\ &S→(L)·\\ \\ \\ \end{aligned} \begin{aligned}\ \ \ \ \ \ \ \ \ I_7:&\\ &L→L,·S\\ &S→·(L)\\ &S→·a\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_8:&\\ &L→L,S·\\ \\ \\ \end{aligned}\\ \begin{aligned} \end{aligned}\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ I0:SSS(L)Sa       I1:SS       I2:S(L)LL,SLSS(L)Sa I3:Sa           I4: S(L)LL⋅,S       I5:LS        I6:S(L)         I7:LL,⋅SS(L)Sa       I8:LL,S                                                   

S L R ( 1 ) SLR(1) SLR(1)分析表:

( ( ( ) ) ) a a a , , , $ $ S S S L L L
0 0 0 s 2 s2 s2 s 3 s3 s3 1 1 1
1 1 1 a c c acc acc
2 2 2 s 2 s2 s2 s 3 s3 s3 5 5 5 4 4 4
3 3 3 r 3 r3 r3 r 3 r3 r3 r 3 r3 r3
4 4 4 s 5 s5 s5 s 6 s6 s6
5 5 5 r 5 r5 r5 r 5 r5 r5
6 6 6 r 2 r2 r2 r 2 r2 r2 r 2 r2 r2
7 7 7 s 2 s2 s2 s 3 s3 s3 8 8 8
8 8 8 r 4 r4 r4 r 4 r4 r4

4

( 4 ) (4) (4)习题 3.21 、 3.22 、 3.25 3.21、3.22、3.25 3.213.223.25
3.21 3.21 3.21:
( a ) (a) (a)证明下面文法是 L L ( 1 ) LL(1) LL(1)文法,但不是 S L R ( 1 ) SLR(1) SLR(1)文法。
S → A a A b ∣ B b B a A → ϵ B → ϵ S→AaAb|BbBa\\ A→\epsilon\\ B→\epsilon SAaAbBbBaAϵBϵ
根据 L L ( 1 ) LL(1) LL(1)文法定义, F i r s t ( A a A a ) = { a } , F i r s t ( B b B b ) = { b } First(AaAa)=\{a\},First(BbBb)=\{b\} First(AaAa)={a},First(BbBb)={b}
F i r s t ( A a A a ) ∩ F i r s t ( B b B b ) = ϕ First(AaAa)∩First(BbBb)=\phi First(AaAa)First(BbBb)=ϕ,所以该文法是 L L ( 1 ) LL(1) LL(1)文法。
根据 S L R ( 1 ) SLR(1) SLR(1)分析,存在如下状态
I : S → ⋅ A a A b S → ⋅ B b B a A → ϵ ⋅ B → ϵ ⋅ \begin{aligned} I:&\\ &S→·AaAb\\ &S→·BbBa\\ &A→\epsilon·\\ &B→\epsilon· \end{aligned} I:SAaAbSBbBaAϵBϵ
此时,由于 F o l l o w ( A ) = F o l l o w ( B ) = { a , b } Follow(A)=Follow(B)=\{a,b\} Follow(A)=Follow(B)={a,b},所以若输入符号为 a   o r   b a\ or\ b a or b则无法判断是将 ϵ \epsilon ϵ归约成 A A A还是 B B B,出现归约-归约冲突,所以不是 S L R ( 1 ) SLR(1) SLR(1)文法。

( b ) (b) (b) 证明所有 L L ( 1 ) LL(1) LL(1)文法都是 L R ( 1 ) LR(1) LR(1)文法。
证 考虑证明:若一个文法不是 L R ( 1 ) LR(1) LR(1)文法,则它一定不是 L L ( 1 ) LL(1) LL(1)文法。
若一个文法不是 L R ( 1 ) LR(1) LR(1)文法,则它存在分析动作的冲突(移进-规约和归约-归约冲突),也就是说,该文法存在二义性的最左推导,于是不满足 L L ( 1 ) LL(1) LL(1)文法的要求,所以该文法不是 L L ( 1 ) LL(1) LL(1)文法。即说明所有 L L ( 1 ) LL(1) LL(1)文法都是 L R ( 1 ) LR(1) LR(1)文法。

另外,LL(1)文法和LR(1)文法对比,两者都是从左往右看,并且只看下一个符号,再进行相
应的动作。满足LL(1)文法的语言,对它进行LL(1)分析的每一步实际上也对应着LR(1)分析的每一步。但是,LL(1)文法看到一个符号后,就提前选择对应的产生式进行推导,而LR(1)文法有了句柄的概念后,拥有了更多的信息,可以在看到一个符号时,根据搜索符进行移进或规约动作(它可以看完了句柄再选择产生式),也就是说,LR(1)文法是大于LL(1)文法的,即所有LL(1)文法都是LR(1)文法。

3.22 3.22 3.22:
证明下面文法是 L A L R ( 1 ) LALR(1) LALR(1)文法,但不是 S L R ( 1 ) SLR(1) SLR(1)文法。
S → A a ∣ b A c ∣ d c ∣ b d a A → d S→Aa|bAc|dc|bda\\ A→d\\ SAabAcdcbdaAd
该文法存在一个状态, [ S → d ⋅ c ] , [ A → d ⋅ ] [S→d·c],[A→d·] [Sdc],[Ad]出现在同一个项目集中,因为 F o l l o w ( A ) = { a , c } Follow(A)=\{a,c\} Follow(A)={a,c},所以当 输入符号为 c c c时,无法判断进行 [ S → d ⋅ c ] [S→d·c] [Sdc]移进还是 [ A → d ⋅ ] [A→d·] [Ad]规约,出现移进-归约冲突,所以不是 S L R ( 1 ) SLR(1) SLR(1)文法。

除上述冲突,同理还存在一个 [ S → b d ⋅ a ] , [ A → d ⋅ ] [S→bd·a],[A→d·] [Sbda],[Ad]的移进-归约冲突,但这两个冲突,在规范 L R ( 1 ) LR(1) LR(1)情况下不存在,因为只有输入符号为 a a a时,才进行 d d d A A A的归约操作,所以此文法是 L R ( 1 ) LR(1) LR(1)文法,且此文法的规范 L R ( 1 ) LR(1) LR(1)项目集中任意项目的搜索符只能为 $  o r   a $\ or\ a  or a,所以不存在同心的 L R ( 1 ) LR(1) LR(1)项目集,所以此文法也是 L A L R ( 1 ) LALR(1) LALR(1)文法。

3.25 3.25 3.25:
一个非 L R ( 1 ) LR(1) LR(1)的文法如下:
L → M L b ∣ a M → ϵ L→MLb|a\\ M→\epsilon\\ LMLbaMϵ
请给出所有含移进-归约冲突的规范 L R ( 1 ) LR(1) LR(1)项目集,以说明该文法确实不是 L R ( 1 ) LR(1) LR(1)的。
以下项目集存在移进-归约冲突,即输入符号为 a a a时,无法判断进行移进 a a a还是进行 ϵ \epsilon ϵ规约,所以该文法不是 L R ( 1 ) LR(1) LR(1)的。
I 0 :                ⟶ M L ′ → ⋅ L ,    $ L → ⋅ M L b ,    $ L → ⋅ a ,    $ M → ⋅ ,    a         I 2 :                ⟶ M L → M ⋅ L b ,    $ L → ⋅ M L b ,    b L → ⋅ a ,    b M → ⋅ ,    a         I 5 : L → M ⋅ L b ,    b L → ⋅ M L b ,    b L → ⋅ a , b ,    b M → ⋅ ,    a \begin{aligned} I_0:&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \stackrel{M}{\longrightarrow}\\ &L'→·L,\ \ \$\\ &L→·MLb,\ \ \$\\ &L→·a,\ \ \$\\ &M→·,\ \ a\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_2:&\ \ \ \ \ \ \ \ \ \ \ \ \ \ \stackrel{M}{\longrightarrow}\\ &L→M·Lb,\ \ \$\\ &L→·MLb,\ \ b\\ &L→·a,\ \ b\\ &M→·,\ \ a\\ \end{aligned} \ \ \ \ \ \ \ \begin{aligned} I_5:&\\ &L→M·Lb,\ \ b\\ &L→·MLb,\ \ b\\ &L→·a,b,\ \ b\\ &M→·,\ \ a\\ \end{aligned} I0:              MLL,  $LMLb,  $La,  $M⋅,  a       I2:              MLMLb,  $LMLb,  bLa,  bM⋅,  a       I5:LMLb,  bLMLb,  bLa,b,  bM⋅,  a

5

( 5 ) (5) (5)为以下文法构造 L R ( 1 ) LR(1) LR(1)分析表:
S → a S S → A A → a A b A → \begin{aligned} &S→ a S\\ &S→ A\\ &A→ a A b\\ &A→ \end{aligned} SaSSAAaAbA
拓广文法
S ′ → S S → a S S → A A → a A b A → ϵ \begin{aligned} &S'→ S\\ &S→ a S\\ &S→ A\\ &A→ a A b\\ &A→\epsilon \end{aligned} SSSaSSAAaAbAϵ
该文法的 L R ( 1 ) LR(1) LR(1)项目集规范族为

I 0 : S ′ → ⋅ S ,     $ S → ⋅ a S ,     $ S → ⋅ A ,     $ A → ⋅ a A b ,    $ A → ⋅ ϵ ,    $         I 1 : S ′ → S ⋅ ,     $         I 2 : S → a ⋅ S ,     $ A → a ⋅ A b ,    $ S → ⋅ a S ,     $ S → ⋅ A ,     $ A → ⋅ a A b ,    b / $ A → ⋅ ϵ ,    b / $   I 3 : S → A ⋅ ,     $                I 4 : S → a S ⋅ ,     $               I 5 : A → a A ⋅ b ,    $ S → A ⋅ ,     $   I 6 : S → a ⋅ S ,     $ S → ⋅ a S ,     $ S → ⋅ A ,     $ A → a ⋅ A b ,    b / $ A → ⋅ a A b ,    b / $ A → ⋅ ϵ ,    b / $        I 7 : A → a A b ⋅ ,     $          I 8 : S → A ⋅ ,     $ A → a A ⋅ b ,    b / $     I 9 : A → a A b ⋅ ,    b / $                                                                             \begin{aligned} I_0:&\\ &S'→·S,\ \ \ \$\\ &S→·aS,\ \ \ \$\\ &S→·A,\ \ \ \$\\ &A→·aAb,\ \ \$\\ &A→·\epsilon,\ \ \$ \\\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_1:&\\ &S'→S·,\ \ \ \$\\ \\\\\\\\\\ \end{aligned} \ \ \ \ \ \ \ \begin{aligned} I_2:&\\ &S→a·S,\ \ \ \$\\ &A→a·Ab,\ \ \$\\ &S→·aS,\ \ \ \$\\ &S→·A,\ \ \ \$\\ &A→·aAb,\ \ b/\$ \\ &A→·\epsilon,\ \ b/\$\\ \end{aligned}\\ \ \\ \begin{aligned} I_3:&\\ &S→A·,\ \ \ \$\\ \ \\\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned}\ \ \ \ I_4:&\\ &S→aS·,\ \ \ \$\\ \ \\\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} \ \ \ I_5:&\\ &A→aA·b,\ \ \$\\ &S→A·,\ \ \ \$\\ \\ \end{aligned}\\ \begin{aligned}\ I_6:&\\ &S→a·S,\ \ \ \$\\ &S→·aS,\ \ \ \$\\ &S→·A,\ \ \ \$\\ &A→a·Ab,\ \ b/\$ \\ &A→·aAb,\ \ b/\$ \\ &A→·\epsilon,\ \ b/\$\\ \end{aligned} \begin{aligned}\ \ \ \ \ \ I_7:&\\ &A→aAb·,\ \ \ \$\\ \\\\\\\\\\ \end{aligned} \begin{aligned}\ \ \ \ \ \ \ \ I_8:&\\ &S→A·,\ \ \ \$\\ &A→aA·b,\ \ b/\$ \\ \\\\\\\\ \end{aligned}\\ \ \ \ \begin{aligned}\\ I_9:&\\ &A→aAb·,\ \ b/\$ \\ \end{aligned} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ I0:SS,   $SaS,   $SA,   $AaAb,  $Aϵ,  $       I1:SS⋅,   $       I2:SaS,   $AaAb,  $SaS,   $SA,   $AaAb,  b/$Aϵ,  b/$ I3: SA⋅,   $           I4: SaS⋅,   $          I5:AaAb,  $SA⋅,   $ I6:SaS,   $SaS,   $SA,   $AaAb,  b/$AaAb,  b/$Aϵ,  b/$      I7:AaAb⋅,   $        I8:SA⋅,   $AaAb,  b/$   I9:AaAb⋅,  b/$                                                                           
L R ( 1 ) LR(1) LR(1)分析表为:

a a a b b b $ $ S S S A A A
0 0 0 s 2 s2 s2 r 4 r4 r4 1 1 1 3 3 3
1 1 1 a c c acc acc
2 2 2 s 6 s6 s6 r 4 r4 r4 r 4 r4 r4 4 4 4 5 5 5
3 3 3 r 2 r2 r2
4 4 4 r 1 r1 r1
5 5 5 s 7 s7 s7 r 2 r2 r2
6 6 6 r 4 r4 r4
7 7 7 s 6 s6 s6 r 4 r4 r4 r 4 r4 r4 4 4 4 8 8 8
8 8 8 s 9 s9 s9 r 2 r2 r2
9 9 9 r 3 r3 r3 r 3 r3 r3
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之墨_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值