编译原理龙书第四章部分习题(编译原理作业三)

编译原理作业3

所有题目均为自己所写,觉得有用可以点个赞哟:-)
答案仅供参考,若有问题欢迎评论区讨论~

4.2.1

考虑上下文无关文法:S ->SS+|SS*|a,以及串aa + a*

(1)给出这个串的一个最左推导。

(2)给出这个串的一个最右推导。

(3)给出这个串的一棵语法分析树。


(1)最左推导:

S->SS*

->SS+S*

->aS+S*

->aa+S*

->aa+a*

(2)最右推导:

S->SS*

->Sa*

->SS+a*

->Sa+a*

->aa+a*

(3)语法分析树

4.2.2

对下列的每一对文法和串重复练习4.2.1

  • S->0S1 | 01和串000111。

  • S->+SS | *SS |a和串+*aaa。

  • S->S(S)S | ε 和串(()())

  • S->(L) | a以及L->L,S | S和串((a, a), a, (a))。


  • 1. S->0S1 | 01和串000111

(1)最左推导:

S->0S1

->00S11

->000111

(2)最右推导:

S->0S1

->00S11

->000111

(3)语法分析树

  • S->+SS | *SS |a和串+*aaa

(1)最左推导:

S->+SS

->+*SSS

->+*aSS

->+*aaS

->+*aaa

(2)最右推导:

S->+SS

->+Sa

->+*SSa

->+*Saa

->+*aaa

(3)语法分析树

  • S->S(S)S | ε 和串(()())

(1)最左推导:

S->S(S)S

->(S)S

->(S(S)S)S

->((S)S)S

->(()S)S

->(()S(S)S)S

->(()(S)S)S

->(()()S)S

->(()())S

->(()())

(2)最右推导:

S->S(S)S

->S(S)

->S(S(S)S)

->S(S(S))

->S(S())

->S(S(S)S())

->S(S(S)())

->S(S()())

->S(()())

->(()())

(3)语法分析树:

  • S->(L) | a以及L->L,S | S和串((a, a), a, (a))

(1)最左推导:

S->(L)

->(L,S)

->(L,S,S)

->(S,S,S)

->((L),S,S)

->((L,S),S,S)

->((S,S),S,S)

->((a,S),S,S)

->((a,a),S,S)

->((a,a),a,S)

->((a,a),a,(L))

->((a,a),a,(s))

->((a,a),a,(a))

(2)最右推导:

S->(L)

->(L,S)

->(L,(L))

->(L,(S))

->(L,(a))

->(L,S,(a))

->(L,a,(a))

->(S,a,(a))

->((L),a,(a))

->((L,S),a,(a))

->((L,a),a,(a))

->((S,a),a,(a))

->((a,a),a,(a))

(3)语法分析树

4.2.3

为下面的语言设计文法

(1)所有由0和1组成的并且每个0之后都至少跟着一个1的串的集合。

(2)所有由0和1组成的回文的集合,也就是从前面和从后面读结果都相同的串的集合。


(1)

很容易想到正则表达式为:(0?1)*

但文法应该是:

S->ST

T->01

|1

这个串可以为空,或者是若干个T相连,每个T是01或者1,刚好符合题意。

(2)

s-> 0s0

| 1s1

| 0

| 1

| ε

4.2.5

使用练习4.2.4中描述的括号表示法来简化如下的关于语句块和条件语句的文法。

stmt-> if expr then stmt else stmt

​ | if expr then stmt

​ | begin stmtList end

stmtList-> stmt ; stmtList | stmt


stmt-> if expr then stmt [else stmt]

​ | begin stmtList end

stmtList-> stmt[; stmtList]

stmtList->stmt{;stmt}

4.4.1

为下面的每一个文法设计一个预测分析器,并给出预测分析表。你可能先要对文法进行提取左公因子或消除左递归的操作。

1. 练习4.2.2(1)中的文法。

2. 练习4.2.2(2)中的文法。

3. 练习4.2.2(3)中的文法。

4. 练习4.2.2(5)中的文法。


  • S->0S1 | 01

提取左公因子:

S->0S’

S’->S1

| 1

FIRST/FOLLOW/NULLABLE集:

FIRSTFOLLOWNULLABLE
S{0}{1}FALSE
S’{0,1}{1}FALSE

预测分析表:

01
SS->0S’
S’S’->S1S’->1
  • S->+SS | *SS |a

FIRST/FOLLOW/NULLABLE集:

FIRSTFOLLOWNULLABLE
S{+,*,a}{+,*,a}FALSE

预测分析表:

+*a
SS->+SSS->*SSS->a
  • S->S(S)S | ε

消除左递归:

S->S’

S’->(S)SS’

| ε

FIRST/FOLLOW/NULLABLE集:

FIRSTFOLLOWNULLABLE
S{(,),$,ε}{(,),$,ε}TRUE
S’{(,),$,ε}{(,),$,ε}TRUE

预测分析表:

()$
SS->S’S->S’S->S’
S’S’->(S)SS’
S’->ε
S’->εS’->ε
  • S->(L) | a以及L->L,S | S

消除左递归:

S->(L)

|a

L->SL’

L’->,SL’

FIRST/FOLLOW/NULLABLE集:

FIRSTFOLLOWNULLABLE
S{(,a}{,,),ε}(第一个是逗号)FALSE
L{(,a}{)}FALSE
L’{,,),ε}{)}TRUE

预测分析表:

(),a
SS->(L)S->a
LL->SL’L->SL’
L’L’->εL’->,SL’

4.4.4

计算练习4.2.2中各个文法的FIRST和FOLLOW集合。


  • S->0S1 | 01
FIRSTFOLLOW
S{0}{1,$}
  • S->+SS | *SS |a
FIRSTFOLLOW
S{+,*,a}{+,*,a,$}
  • S->S(S)S | ε
FIRSTFOLLOW
S{(,ε}{(,),$}
  • S->(L) | a以及L->L,S | S
FIRSTFOLLOW
S{(,a}{,,),$}(第一个是逗号)
L{(,a}{,,)}(第一个是逗号)

4.6.5

说明下面的文法

S->AaAb | BbBa

A->ε

B->ε

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


(1)该文法是LL(1)的

文法G⇔LL(1),当且仅当G中的任意两条产生式A->α|β满足下列条件

  • 当α与β不能都推导出ε,则FIRST(α)与FIRST(β)不相交
  • 当α或β能推导出ε
  • 当α能推导出ε,则FIRST(β)与FOLLOW(A)不相交
  • 当β能推导出ε,则FIRST(α)与FOLLOW(A)不相交

AaAb与BbBa不能都推导出ε,FIRST(AaAb) = {a},FIRST(BbBa) = {b},不相交,所以该文法是LL(1)的。

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

S_0状态:

S-> · AaAb

S-> · BbBa

A-> · ε

B-> · ε

接受一个ε,可以直接到达S_1:

A->ε·

B->ε·

此时就会发生规约冲突,所以该文法不是SLR(1)的。

4.6.6

说明下面的文法

S->SA | A

A->a

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


(1)该文法是SLR(1)的

构造增广文法:

0: S’->S$

1: S->SA

2: | A

3: A->a

S_0状态:

S’->·S$

S->·SA

S->·A

A->·a

S_0状态吃入S到达S_1状态:

S’->S·$

S->S·A

A->·a

S_0状态吃入A到达S_2状态:

S->A·

S_0状态吃入a到达S_3状态:

A->a·

S_1状态吃入A到达S_4状态:

S->SA·

S_1状态吃入a到达S_3状态:

A->a·

FOLLOW(S) = {a,$},FOLLOW(A) = {$}。

该文法的SLR分析表如下:

动作动作转移转移
状态/符号a$SA
S_0s3g1g2
S_1s3Acceptg4
S_2r2r2
S_3r3
S_4r1r1

该文法的SLR分析表没有冲突,所以该文法是SLR(1)的

(2)该文法不是LL(1)的

文法G是LL(1)的条件已经在4.6.5中给出。

对于产生式S->SA|A,SA与A不能都推导出ε,FIRST(SA) = {a},FIRST(A) = {a},相交,所以该文法不是LL(1)的。

4.7.2

为练习4.2.2(5)的文法

S->(L)

|a

L->L,S

|S

构造 1)规范LR项集族;2)LALR项集族。


构造增广文法:

S’->S$

S->(L)

|a

L->L,S

|S

(1)规范LR项集族

(2)LALR项集族

LALR即对LR(1)进行合并同心项。先看一下LR(1)中可以合并的产生式集(已经用相同的颜色标出):

2-6,3-7,4-10,8-12可合并。

合并之后得LALR项集族:

4.7.5

说明下面的文法

S->Aa | bAc | Bc | bBa

A->d

B->d

是LR(1)的,但不是LALR(1)的。


构造增广文法:

S’->S$

S->Aa

|bAc

|Bc

|bBa

A->d

B->d

(1)LR(1)项集族如图:

没有冲突,故该文法是LR(1)的。

(2)合并前:

LALR(1)项集族如图:

可以看出,在状态5下,会产生规约-规约冲突,故该文法不是LALR(1)的。

笔记:

  • 自底向上的语法分析都不用进行消除左递归/提取左公因子的处理。

  • 语义分析要注意构造增广文法(S’->S$)

PS:(所有题目均为自己所做,图和表均为自己所画,为了美观草稿纸就不往上贴了~)

目 录 译者序 前言 第1章 概论 1 1.1 为什么要用编译器 2 1.2 与编译器相关的程序 3 1.3 翻译步骤 5 1.4 编译器中的主要数据结构 8 1.5 编译器结构中的其他问题 10 1.6 自举与移植 12 1.7 TINY样本语言与编译器 14 1.7.1 TINY语言 15 1.7.2 TINY编译器 15 1.7.3 TM机 17 1.8 C-Minus:编译器项目的一种语言 18 练习 19 注意与参考 20 第2章 词法分析 21 2.1 扫描处理 21 2.2 正则表达式 23 2.2.1 正则表达式的定义 23 2.2.2 正则表达式的扩展 27 2.2.3 程序设计语言记号的正则表达式 29 2.3 有穷自动机 32 2.3.1 确定性有穷自动机的定义 32 2.3.2 先行、回溯和非确定性自动机 36 2.3.3 用代码实现有穷自动机 41 2.4 从正则表达式到DFA 45 2.4.1 从正则表达式到NFA 45 2.4.2 从NFA到DFA 48 2.4.3 利用子集构造模拟NFA 50 2.4.4 将DFA中的状态数最小化 51 2.5 TINY扫描程序的实现 52 2.5.1 为样本语言TINY实现一个扫描 程序 53 2.5.2 保留字与标识符 56 2.5.3 为标识符分配空间 57 2.6 利用Lex 自动生成扫描程序 57 2.6.1 正则表达式的Lex 约定 58 2.6.2 Lex输入文件的格式 59 2.6.3 使用Lex的TINY扫描程序 64 练习 65 编程练习 67 注意与参考 67 第3章 上下文无关文法及分析 69 3.1 分析过程 69 3.2 上下文无关文法 70 3.2.1 与正则表达式比较 70 3.2.2 上下文无关文法规则的说明 71 3.2.3 推导及由文法定义的语言 72 3.3 分析树与抽象语法树 77 3.3.1 分析树 77 3.3.2 抽象语法树 79 3.4 二义性 83 3.4.1 二义性文法 83 3.4.2 优先权和结合性 85 3.4.3 悬挂else问题 87 3.4.4 无关紧要的二义性 89 3.5 扩展的表示法:EBNF和语法图 89 3.5.1 EBNF表示法 89 3.5.2 语法图 91 3.6 上下文无关语言的形式特性 93 3.6.1 上下文无关语言的形式定义 93 3.6.2 文法规则和等式 94 3.6.3 乔姆斯基层次和作为上下文无关 规则的语法局限 95 3.7 TINY语言的语法 97 3.7.1 TINY的上下文无关文法 97 3.7.2 TINY编译器的语法树结构 98 练习 101 注意与参考 104 第4章 自顶向下的分析 105 4.1 使用递归下降分析算法进行自顶向下 的分析 105 4.1.1 递归下降分析的基本方法 105 4.1.2 重复和选择:使用EBNF 107 4.1.3 其他决定问题 112 4.2 LL(1)分析 113 4.2.1 LL(1)分析的基本方法 113 4.2.2 LL(1)分析与算法 114 4.2.3 消除左递归和提取左因子 117 4.2.4 在LL(1)分析中构造语法树 124 4.3 First集合和Follow集合 125 4.3.1 First 集合 125 4.3.2 Follow 集合 130 4.3.3 构造LL(1)分析表 134 4.3.4 再向前:LL(k)分析程序 135 4.4 TINY语言的递归下降分析程序 136 4.5 自顶向下分析程序中的错误校正 137 4.5.1 在递归下降分析程序中的错误 校正 138 4.5.2 在LL(1)分析程序中的错误校正 140 4.5.3 在TINY分析程序中的错误校正 141 练习 143 编程练习 146 注意与参考 148 第5章 自底向上的分析 150 5.1 自底向上分析概览 151 5.2 LR(0)项的有穷自动机与LR(0)分析 153 5.2.1 LR(0)项 153 5.2.2 项目的有穷自动机 154 5.2.3 LR(0)分析算法 157 5.3 SLR(1)分析 160 5.3.1 SLR(1)分析算法 160 5.3.2 用于分析冲突的消除二义性 规则 163 5.3.3 SLR(1)分析能力的局限性 164 5.3.4 SLR(k)文法 165 5.4 一般的LR(1)和LALR(1)分析 166 5.4.1 LR(1)项的有穷自动机 166
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值