《编译原理》4.6参考答案

4.6 节的练习

4.6.1

描述下列文法的所有可行前缀

  1. 练习4.2.2-1的文法 S->0S1|01
  2. ! 练习4.2.1的文法 S->SS+|SS*|a
  3. ! 练习4.2.2-3的文法 S->S(S)S|ε
解答

以下提取左公因子和消除左递归后的文法均由练习 4.3.2 得到

  1. 提取左公因子和消除左递归后的增广文法

     0) S' -> S
     1) S -> 0 A
     2) A -> 0 A 1
     3) A -> 1

    LR(0) 自动机

    4 6 1-1

    可行前缀为 0+A?1?

  2. 提取左公因子和消除左递归后的增广文法

     0) S' -> S
     1) S -> a B
     2) B -> a B A B
     3) B -> ε
     4) A -> +
     5) A -> *

    LR(0) 自动机

    4 6 1-2

    可行前缀为 aB?|a{2,∞}(BAa+)*(B|B+|B*|BA|BAB)?

  3. 提取左公因子和消除左递归后的增广文法

     0) S' -> S
     1) S -> A
     2) A -> (S) S A
     3) A -> ε

    LR(0) 自动机

    4 6 1-3

    箭头太复杂,懒得归纳了

4.6.2

为练习4.2.1中的(增广)文法构造SLR项集。计算这些项集的GOTO函数。给出这个函数的语法分析表。这个文法是SLR文法吗?

解答

该文法的项集和 GOTO 函数见 4.6.1-2

FOLLOW 函数如下:

FOLLOW(S) = [$]
FOLLOW(A) = [a, $]
FOLLOW(B) = [+, * ,$]

语法分析表如下:

状态ACTIONGOTO
a+*$SAB
0s2s1
1acc
2s4r3r3r3s3
3r1
4s4r3r3r3s5
5s7s8s6
6s4r3r3r3s9
7r4r4
8r5r5
9r2r2r2

无冲突,这显然是一个 SLR 文法

4.6.3

利用练习4.6.2得到的语法分析表,给出处理输入aa*a+时的各个动作。

解答
符号输入动作
1)0aa*a+$移入
2)02aa*a+$移入
3)024aa*a+$根据 B -> ε 规约
4)0245aaB*a+$移入
5)02458aaB*a+$根据 A -> * 规约
6)02456aaBAa+$移入
7)024564aaBAa+$根据 B -> ε 规约
8)0245645aaBAaB+$移入
9)02456457aaBAaB+$根据 A -> + 规约
9)02456456aaBAaBA$根据 B -> ε 规约
10)024564569aaBAaBAB$根据 B -> aBAB 规约
11)024569aaBAB$根据 B -> aBAB 规约
12)023aB$根据 S -> aB 规约
13)01S$接受

4.6.4

对于练习4.2.2-1~4.2.2-7中的各个(增广)文法:

  1. 构造SLR项集和他们的GOTO函数
  2. 指出你的项集中的所有动作冲突
  3. 如果存在SLR语法分析表,构造出这个语法分析表

4.6.5

说明下面的文法

S->AaAb|BbBa
A->ε
B->ε

是LL(1)的,但不是SLR(1)的。

解答
  1. 该文法是 LL(1) 的

    见 4.4.3 节,p142 的判定标准

  2. 该文法不是 SLR(1) 的

     I_0
    
     S' -> .S
     S -> .AaAb
     S -> .BbBa
     A -> .
     B -> .

    由于 FOLLOW(A) = FOLLOW(B) = [a, b],所以当 I_0 后输入为 a 或 b 时,就会发生规约冲突。

4.6.6

说明下面的文法

S->SA|A
A->a

是SLR(1)的,但不是LL(1)的

解答
  1. 该文法不是 LL(1) 的

    S -> SAS -> A 均能推导出以 a 开头的串,所以不是 LL(1) 的

  2. 该文法是 SLR(1) 的

    该文法生成的语法分析表是没有冲突的

4.6.7!!

考虑按照下面的方式定义的文法族 G_n:

S -> A_i b_i         其中1<=i<=n
A_i-> a_j A_j | a_j    其中1<=i,j<=n 且i<>n

说明:

  1. G_n有 2n^2-n 个产生式
  2. G_n有 2^n+n^2+n 个 LR(0) 项集
  3. G_n是 SLR(1) 的

关于LR语法分析器的大小,这个分析结果说明了什么?

4.6.8!

我们说单个项可以看做一个 NFA 的状态,而有效项的集合就是一个 DFA 的状态。对于练习4.2.1的文法 S->SS+|SS*|a

  1. 根据“将项看作一个NFA的状态”部分中的规则,画出这个文法的有效的转换图(NFA)
  2. 将子集构造算法(算法3.20)应用于在(1)部分构造得到的NFA。得到的DFA和这个文法的LR(0)项集比有什么关系
  3. !! 说明在任何情况下,将子集构造算法应用于一个文法的有效项的NFA所得到的就是该文法的 LR(0) 项集

4.6.9!

下面是一个二义性的文法

S->AS|b
A->SA|a

构造出这个文法的规范LR(0)项集族。如果我们试图为这个文法构造出一个LR语法分析表,必然会存在某些冲突动作。都有哪些冲突动作?假设我们使用这个语法分析表,并且在出现冲突时不确定地选择一个动作。给出输入abab时所有可能的动作序列

转载于:https://www.cnblogs.com/hereis00/p/6109141.html

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值