第二章 课后作业参考答案#
2. 令文法 G(N) 为:#
ND→D∣ND→0∣1∣2∣3∣4∣5∣6∣7∣8∣9
(1) G(N) 的语言 L(G(N)) 是什么?
(2) 给出句子 0731 和 863 的最左推导和最右推导。
解答:
(1) L(G(N)) 的语言含义:
L(G(N)) 是由非空数字符号串组成的集合,即允许包含前导零的无符号整数集合。
(2) 最左推导与最右推导:
- 对于句子
0731:
- 最左推导:
N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒07DD⇒073D⇒0731
- 最右推导:
N⇒ND⇒N1⇒ND1⇒N31⇒ND31⇒N731⇒D731⇒0731
- 对于句子
863:
- 最左推导:
N⇒ND⇒NDD⇒DDD⇒8DD⇒86D⇒863
- 最右推导:
N⇒ND⇒N3⇒ND3⇒N63⇒D63⇒863
4. 写一个文法,使其语言是偶数集,且每个偶数不以 0 开头。#
解答:
偶数包含一位偶数(如 0,2,4,6,8)与多位偶数。题目规定每个偶数不能以 0 开头,因此除了单零 0 之外,其他偶数均不能有前导零。其末位必须是 0,2,4,6,8 中的一个。
构造文法 G[S] 如下:
SMDevenDeven_nonzeroDheadD→0∣DheadMDeven∣Deven_nonzero→DM∣ε→0∣2∣4∣6∣8→2∣4∣6∣8→1∣2∣3∣4∣5∣6∣7∣8∣9→0∣Dhead
设计说明:
- S→0 产生单一的偶数 0。
- S→Deven_nonzero 产生一位非零偶数 2,4,6,8。
- S→DheadMDeven 产生两位以上的偶数,首位限制为非零数字 Dhead,末位限制为偶数 Deven,中间 M 可以为包含 0 在内的任意数字串。
5. 给出下面语言的相应文法。#
- L1={anbnci∣n≥1,i≥0}
- L2={aibncn∣n≥1,i≥0}
- L3={anbnambm∣n,m≥0}
- L4={1n0m1m0n∣n,m≥0}
解答:
(1) L1={anbnci∣n≥1,i≥0}#
由前后两个独立部分串接而成,前部为 {anbn∣n≥1},后部为 {ci∣i≥0}。
文法为:
SXY→XY→aXb∣ab→cY∣ε
(2) L2={aibncn∣n≥1,i≥0}#
由前部 {ai∣i≥0} 和后部 {bncn∣n≥1} 串接而成。
文法为:
SXY→XY→aX∣ε→bYc∣bc
(3) L3={anbnambm∣n,m≥0}#
可看作是两个形如 {akbk∣k≥0} 的结构直接连接。
文法为:
SX→XX→aXb∣ε
(4) L4={1n0m1m0n∣n,m≥0}#
采用从外向内嵌套剥离的规则定义。
文法为:
SX→1S0∣X→0X1∣ε
7. 令文法 G(E) 为:#
ETF→T∣E+T∣E−T→F∣T∗F∣T/F→(E)∣i
(1) 给出 i+i∗i、i∗(i+i) 的最左推导和最右推导。
(2) 给出 i+i+i、i+i∗i 和 i−i−i 的语法树。
解答:
(1) 最左与最右推导#
- 对于句子 i+i∗i:
- 最左推导:
E⇒E+T⇒T+T⇒F+T⇒i+T⇒i+T∗F⇒i+F∗F⇒i+i∗F⇒i+i∗i
- 最右推导:
E⇒E+T⇒E+T∗F⇒E+T∗i⇒E+F∗i⇒E+i∗i⇒T+i∗i⇒F+i∗i⇒i+i∗i
- 对于句子 i∗(i+i):
- 最左推导:
E⇒T⇒T∗F⇒F∗F⇒i∗F⇒i∗(E)⇒i∗(E+T)⇒i∗(T+T)⇒i∗(F+T)⇒i∗(i+T)⇒i∗(i+F)⇒i∗(i+i)
- 最右推导:
E⇒T⇒T∗F⇒T∗(E)⇒T∗(E+T)⇒T∗(E+F)⇒T∗(E+i)⇒T∗(T+i)⇒T∗(F+i)⇒T∗(i+i)⇒F∗(i+i)⇒i∗(i+i)
(2) 语法树#
E
/|\
E + T
/|\ \
E + T F
| | |
T F i
| |
F i
|
i
E
/|\
E + T
| /|\
T T * F
| | |
F F i
| |
i i
E
/|\
E - T
/|\ \
E - T F
| | |
T F i
| |
F i
|
i
10. 证明下面的文法是二义的:#
S→iSeS∣iS∣i
证明:
要证明一个文法是二义的,只需证明该文法存在某个句子对应两棵不同的语法分析树(或存在两个不同的最左推导)。
对于句子 i i e i(或者 i i i e i),我们证明它存在两棵不同的语法树:
S
/ / \ \
i S e S
/ \ |
i S i
|
i
S
/ \
i S
/ / \ \
i S e S
| |
i i
由于对于句子 i i i e i 该文法能构造出两棵不同结构的语法分析树(这对应着经典的“悬空 else”问题,即 e 归属于内层还是外层 i),因此该文法是二义文法。