第二章
6
文法 G 6 G_6 G6为
N → D ∣ N D N\rightarrow D|ND N→D∣ND
d → 0 ∣ 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ∣ 6 ∣ 7 ∣ 8 ∣ 9 d\rightarrow 0|1|2|3|4|5|6|7|8|9 d→0∣1∣2∣3∣4∣5∣6∣7∣8∣9
6.1
首先 L ( G ) L(G) L(G)表示文法G产生的全部句子的集合 —— 语言
不难发现,由递归的定义
L ( G 6 ) = { D , D D , D D D , D D D D . . . } L(G_6) = \{D, DD, DDD, DDDD ...\} L(G6)={
D,DD,DDD,DDDD...}
将上述的D全部换成数字字符
得到的便是数字字符串全体
6.2
给出句子012、 34、 568最左推导和最右推导
先明确定义:
- 最左推导:任何一步 α ⇒ β \alpha \Rightarrow \beta α⇒β都是对 α \alpha α中的最左非终结符进行替换。
N ⇒ N D ⇒ N D D ⇒ N D D D ⇒ D D D D ⇒ 0 D D D ⇒ 01 D D ⇒ 012 D ⇒ 0127 N \Rightarrow ND \Rightarrow NDD \Rightarrow NDDD \Rightarrow DDDD \\ \Rightarrow 0DDD \Rightarrow 01DD \Rightarrow 012D \Rightarrow 0127 N⇒ND⇒NDD⇒NDDD⇒DDDD⇒0DDD⇒01DD⇒012D⇒0127
N ⇒ N D ⇒ D D ⇒ 3 D ⇒ 34 N \Rightarrow ND \Rightarrow DD \Rightarrow 3D \Rightarrow 34 N⇒ND⇒DD⇒3D⇒34
N ⇒ N D ⇒ N D D ⇒ D D D ⇒ 5 D D ⇒ 56 D ⇒ 568 N \Rightarrow ND \Rightarrow NDD \Rightarrow DDD \Rightarrow 5DD \Rightarrow 56D \Rightarrow 568 N⇒ND⇒NDD⇒DDD⇒5DD⇒56D⇒568
- 最右推导:任何一步任何一步 α ⇒ β \alpha \Rightarrow \beta α⇒β都是对 α \alpha α中的最右非终结符进行替换。也称规范推导(canonical derivations)。
N ⇒ N D ⇒ N 7 ⇒ N D 7 ⇒ N 27 ⇒ N D 27 ⇒ N 127 ⇒ D 127 ⇒ 0127 N \Rightarrow ND \Rightarrow N7 \Rightarrow ND7 \Rightarrow N27 \\\Rightarrow ND27 \Rightarrow N127 \Rightarrow D127 \Rightarrow 0127 N⇒ND⇒N7⇒ND7⇒N27⇒ND27⇒N127⇒D127⇒0127
N ⇒ N D ⇒ N 4 ⇒ D 4 ⇒ 34 N \Rightarrow ND \Rightarrow N4 \Rightarrow D4 \Rightarrow 34 N⇒ND⇒N4⇒D4⇒34
N ⇒ N D ⇒ N 8 ⇒ N D 8 ⇒ N 68 ⇒ D 68 ⇒ 568 N \Rightarrow ND \Rightarrow N8 \Rightarrow ND8 \Rightarrow N68 \Rightarrow D68 \Rightarrow 568 N⇒ND⇒N8⇒ND8⇒N68⇒D68⇒568
7
写一个文法让他的语言为十进制表示的正奇数集,不以0开头
S → O ∣ N O N → N P ∣ 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ∣ 6 ∣ 7 ∣ 8 ∣ 9 P → 0 ∣ 1 ∣ 2 ∣ 3 ∣ 4 ∣ 5 ∣ 6 ∣ 7 ∣ 8 ∣ 9 O → 1 ∣ 3 ∣ 5 ∣ 7 ∣ 9 S\rightarrow O |NO\\ N\rightarrow NP |1|2|3|4|5|6|7|8|9\\ P\rightarrow 0|1|2|3|4|5|6|7|8|9\\ O\rightarrow1|3|5|7|9 S→O∣NON→NP∣1∣2∣3∣4∣5∣6∣7∣8∣9P→0∣1∣2∣3∣4∣5∣6∣7∣8∣9O→1∣3∣5∣7∣9
8
文法为
E → T ∣ E + T ∣ E − T T → F ∣ T ∗ F ∣ T / F F → ( E ) ∣ i E\rightarrow T | E + T| E-T\\ T\rightarrow F|T*F|T/F\\ F\rightarrow (E)|i E→T∣E+T∣E−TT→F∣T∗F∣T/FF→(E)∣i
8.1
给出 i+i*i
和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 \Rightarrow E + T\Rightarrow T + T \Rightarrow F + T \Rightarrow i + T \\\Rightarrow i + T * F \Rightarrow i + F * F \Rightarrow i + i * F \Rightarrow 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 ⇒ 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 \Rightarrow T \Rightarrow T * F \Rightarrow F * F \Rightarrow i * F \Rightarrow i * (E) \Rightarrow i * (E + T) \\\Rightarrow i * (T + T) \Rightarrow i * (F + T) \Rightarrow i * (i + T) \Rightarrow i * (i + F) \Rightarrow 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 ⇒ E + T ⇒ E + T ∗ F ⇒ E + T ∗ i ⇒ E + F ∗ i ⇒ E + i ∗ i ⇒ T + i ∗ i ⇒ F + i ∗ i ⇒ i + i ∗ i E \Rightarrow E + T \Rightarrow E + T * F \Rightarrow E + T * i \Rightarrow E + F * i \Rightarrow E + i * i \\\Rightarrow T + i * i \Rightarrow F + i * i \Rightarrow 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
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 ) E \Rightarrow T \Rightarrow T * F \Rightarrow T * (E) \Rightarrow T * (E + T) \Rightarrow T * (E + F) \Rightarrow T * (E + i)\\ \Rightarrow T * (T + i) \Rightarrow T * (F + i) \Rightarrow T * (i + i)\Rightarrow F * (i + i) \Rightarrow 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)
8.1
给出 i+i+i
、i+i*i
、i-i-i
的语法树
以最左推导生成
9
证明文法二义
S → i S e S ∣ i S ∣ i S\rightarrow iSeS|iS|i S→iSeS∣iS∣i
- 如果一个文法存在某个句子对应两颗不同的语法树,则说这个文法是二义的
于是我们可以从最左推导
和最右推导
出相同的句子
最左
S ⇒ i S e S ⇒ i i S e S ⇒ i i i e S ⇒ i i i e i S\Rightarrow iSeS \Rightarrow iiSeS \Rightarrow iiieS \Rightarrow iiiei S⇒iSeS⇒iiSeS⇒iiieS⇒iiiei
最右推导
S ⇒ i S ⇒ i i S e S ⇒ i i S e i ⇒ i i i e i S\Rightarrow iS \Rightarrow iiSeS \Rightarrow iiSei \Rightarrow iiiei S⇒iS⇒iiSeS⇒iiSei⇒iiiei
对应的语法树完全不一样
所以具有二义性
10
文法改写为无二义的
S → S S ∣ ( S ) ∣ ( ) S\rightarrow SS|(S)|() S→SS∣(S)∣()
表示有效括号的所有生成
这里由于S在右侧出现了两次,导致最右推导和最左推导生成的语法树可能会不一致,所以应把SS拆分
S → A S ∣ A A → ( S ) ∣ ( ) S\rightarrow AS|A\\ A\rightarrow (S)|() S→AS∣AA→(S)∣()
将括号内部的生成完全隔离
还可以写成如下形式
S → S A ∣ A A → ( S ) ∣ ( ) S\rightarrow SA|A\\ A\rightarrow (S)|() S→SA∣AA→(S)∣()
11
给出语言的相应文法
L 1 = { a n b n c i ∣ n ≥ 1 , i ≥ 0 } L 2 = { a i b n c n ∣ n ≥ 1 , i ≥ 0 } L 3 = { a n b n a m b m ∣ n , m ≥ 0 } L 4 = { 1 n 0 m 1 m 0 n ∣ n , m ≥ 0 } L_1 = \{a^nb^nc^i|n\ge 1, i\ge 0\}\\ L_2 = \{a^ib^nc^n|n\ge 1, i\ge 0\}\\ L_3 = \{a^nb^n a^mb^m|n,m\ge 0\}\\ L_4 = \{1^n0^m 1^m0^n|n,m\ge 0\} L1={ anbnci∣n≥1,i≥0}L2={ aibncn∣n≥1,i≥0}L3={ anbnambm∣n,m≥0}L4={ 1n0m1m0n∣n,m≥0}
L1
或者
S → B C B → A b A → a B ∣ a C → C C ∣ c ∣ ϵ S\rightarrow BC\\ B\rightarrow Ab \\ A\rightarrow aB|a\\ C \rightarrow CC|c|\epsilon S→BCB→AbA→aB∣aC→CC∣c∣ϵ
可以稍微精简一下
S → B C B → a b ∣ a B b C → C c ∣ ϵ S\rightarrow BC\\ B\rightarrow ab|aBb \\ C \rightarrow Cc|\epsilon S→BCB→ab∣aBbC→Cc∣ϵ
L2
S → A C C → B c B → b ∣ b C A → A a ∣ ϵ S\rightarrow AC\\ C\rightarrow Bc \\ B\rightarrow b|bC\\ A \rightarrow Aa|\epsilon S→ACC→BcB→b∣bCA→Aa∣ϵ
也可以把B和C精简成
C → b c ∣ b C c C\rightarrow bc|bCc C→bc∣bCc
L3
S → L R L → a L b ∣ ϵ R → a R b ∣ ϵ S\rightarrow LR\\ L\rightarrow aLb| \epsilon\\ R\rightarrow aRb| \epsilon S→LRL→aLb∣ϵR→aRb∣ϵ
L4
S → ϵ ∣ B B → 1 B 0 ∣ D D → 0 D 1 ∣ ϵ S\rightarrow \epsilon | B\\ B\rightarrow 1B0|D\\ D \rightarrow 0D1|\epsilon S→ϵ∣BB→1B0∣DD→0D1∣ϵ
检查发现貌似第一步 S → ϵ S\rightarrow \epsilon S→ϵ可以省略掉
S → B B → 1 B 0 ∣ D D → 0 D 1 ∣ ϵ S\rightarrow B\\ B\rightarrow 1B0|D\\ D \rightarrow 0D1|\epsilon S→BB→1B0∣DD→0D1∣ϵ
感觉可以直接把S和B看作同一个东西,继续化简
S → 1 S 0 ∣ D D → 0 D 1 ∣ ϵ S\rightarrow 1S0|D\\ D \rightarrow 0D1|\epsilon S→1S0∣DD→0D1∣ϵ