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

news/2024/7/7 20:51:39

编译原理第三章习题

  • Homework 4
    • 1
    • 2
    • 3
    • 4
    • 5

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 L ′ → ϵ L'→\epsilon Lϵ

递归下降程序:

#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 s 2 s2 s2 s 3 s3 s3 a c c acc acc
2 2 2 1 1 1 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 7 7 7
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)文法。

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 ,     b A → ⋅ ϵ ,     b         I 1 : S ′ → S ⋅ ,     $         I 2 : S → a ⋅ S ,     $ S → ⋅ a S ,     $ S → ⋅ A ,     $ A → ⋅ a A b ,   b / $ A → ⋅ ϵ ,    b / $ A → a ⋅ A b ,     b   I 3 : S → A ⋅ ,     $                I 4 : S → a S ⋅ ,     $               I 5 : A → a A ⋅ b ,    b   I 6 : A → a A b ⋅ ,     b                                                                             \begin{aligned} I_0:&\\ &S'→·S,\ \ \ \$\\ &S→·aS,\ \ \ \$\\ &S→·A,\ \ \ \$\\ &A→·aAb,\ \ \ b\\ &A→·\epsilon,\ \ \ b \\\\ \end{aligned}\ \ \ \ \ \ \ \begin{aligned} I_1:&\\ &S'→S·,\ \ \ \$\\ \\\\\\\\\\ \end{aligned} \ \ \ \ \ \ \ \begin{aligned} I_2:&\\ &S→a·S,\ \ \ \$\\ &S→·aS,\ \ \ \$\\ &S→·A,\ \ \ \$\\ &A→·aAb,\ b/\$\\ &A→·\epsilon,\ \ b/\$\\ &A→a·Ab,\ \ \ 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,\ \ b\\ \\ \end{aligned}\\ \begin{aligned}\ I_6:&\\ &A→aAb·,\ \ \ b\\ \end{aligned} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ I0:SS,   $SaS,   $SA,   $AaAb,   bAϵ,   b       I1:SS⋅,   $       I2:SaS,   $SaS,   $SA,   $AaAb, b/$Aϵ,  b/$AaAb,   b I3: SA⋅,   $           I4: SaS⋅,   $          I5:AaAb,  b I6: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 5 r5 r5 1 1 1 3 3 3
1 1 1 a c c acc acc
2 2 2 s 2 s2 s2 r 5 r5 r5 r 5 r5 r5 1 1 1 3 3 3
3 3 3 r 3 r3 r3
4 4 4 r 2 r2 r2
5 5 5 s 6 s 6 s6
6 6 6 r 4 r4 r4

http://lihuaxi.xjx100.cn/news/91352.html

相关文章

第八章JRT/0197-2020金融数据安全数据安全分级指南解读

目录 第八章JRT/0197-2020金融数据安全数据安全分级指南解读 一、数据安全定级目标 二、数据安全定级原则<

基于tensorrt的车道线检测lane_detection,实现从pth模型转engine模型,在通过tensorrt加载engine全过程

基于tensorrt的车道线检测lane_detection,实现从pth模型转engine模型,在通过tensorrt加载engine全过程 问题以及解决方案如何运行代码学习参考代码实例讲解将低版本tensorrt升高到高版本,以及最终效果问题以及解决方案 问题简述: AttributeError: ‘tensorrt.tensorrt.Buil…

从零开始搭建仿抖音短视频APP-开发用户业务模块(2)

项目持续创作中&#xff1a; 仿抖音短视频APP项目专栏 目录 安装redis6.0缓存中间件 整合Redis并存储验证码 拦截器限制60s短信发送 优雅异常封装返回拦截器异常 安装redis6.0缓存中间件 需要安装到我们的linux中&#xff0c;这里我们可以通过FTP工具将我们的文件上传linux …

Transformer(李宏毅2022)

本讲内容&#xff1a; Seq2seq model&#xff0c;以Transformer模型为例&#xff08;Encoder-Decoder架构&#xff09; 应用&#xff1a; 语音辨识、语音翻译、语音合成、 聊天机器人、NLP、文法剖析、multi-label classification、object detection、摘要 2021 - Transformer …

2.ElasticSearch系列之集群权限认证

1. 在master节点上创建秘钥库 export ES_PATH_CONF"/home/elasticsearch/config" && /usr/local/elasticsearch-7.6.2/bin/elasticsearch-keystore create2. 在所有节点中开启ssl认证 2.1 生成elastic-stack-ca.p12 /usr/local/elasticsearch-7.6.2/bin…

【华为机试真题Java】乱序整数序列两数之和绝对值最小

目录 题目描述 输入描述 输出描述 参考示例 参考代码 机试介绍 写在最后

数据库mysql——分页查询

LIMIT LIMIT用来限定查询结果的起始行&#xff0c;以及总行数。 查询5行记录&#xff0c;起始行从0开始 SELECT * FROM emp LIMIT 0, 5; 注意&#xff0c;起始行从0开始&#xff0c;即第一行开始&#xff01; 查询10行记录&#xff0c;起始行从3开始 SELECT * FROM emp LIMI…

HttpServletRequest参数只能获取一次的解决方案(参数拦截器 + 拦截器的注册)

因为 HttpServletRequest的输入流只能读取一次&#xff08;在整个项目中只能读取到一次&#xff09;&#xff0c;所以&#xff0c;需要做一些处理来存储 HttpServletRequest。 1.参数拦截器 可以定义一个参数拦截器类来获取参数&#xff0c;并存储 创建我们自己的拦截器类并…