(一) 字母表(Alphabet)
定義:字母表∑是一個有窮符號集合
符號:字 母、數符號:字 母、數、標點符號、 標點符號、 …
說明:為保證排版兼容問題,未使用 MD,HTML 等語法,本文中上標使用 ^ 下標使用 _ 例如:2^3 , X_n
(1) 字母表上的運算
下面的幾種運算,可以先看例子,再回過頭看上面的定義,就其實很簡單了
A:字母表 ∑1 和 ∑2 的乘積 ( product)
∑1∑2={ ab | a∈ ∑1, b∈ ∑2}
例: { 0, 1} {a, b} = {0a, 0b, 1a, 1b}
B:字母表 ∑ 的n次冪 ( power)
∑0 ={ ε }
∑n =∑n-1 ∑ , n ≥ 1
例子:{0,1}^3 = {0,1}{0,1}{0,1} = {000,001,010,011,100,101,110,111}
通過舉例看到字母表(數字)的3次方,最后的結果,就是一些長度為3的數字串的集合
結論:字母表的n次冪:長度為n的符號串構成的集合
C:字母表 ∑ 的正閉包(positive closure)
∑+ = ∑ ∪ ∑2 ∪ ∑3 ∪ …
例:{a, b, c, d }+ = {a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, …..., aaa, aab, aac, aad, aba, abb, abc, …...}
結論:字母表的正閉包:長度正數的符號串構成的集合
D:字母表 ∑ 的克林閉包(Kleene closure)
∑ = ∑0 ∪ ∑+ = ∑0 ∪ ∑ ∪ ∑2 ∪ ∑3 ∪ …*
例:{a, b, c, d }* = {ε, a, b, c, d, aa, ab, ac, ad, ba, bb, bc, bd, ...…, aaa, aab, aac, aad, aba, abb, abc, …...}
注:∑0 ={ ε }
總結:字母表的克林閉包:任意符號串(長度可以為零)構成的集合
(2) 串
設∑是一個字母表,任意x∈∑*,x稱為是 ∑上的一個串
- 串是字母表中符號的一個有窮序列
串s的長度,通常記作|s|,是指s中符號的個數
- 例:|aab| = 3
空串是長度為0的串,用 ε (spsilon) 表示
- |ε| = 0
A:串上的運算-連接
如果 x 和 y 是串,那么 x 和 y 的連接是把 y 附加到 x 后面形成的串,記作 xy
例: x = dog ,y = house ,xy = doghouse
空串是連接運算的單位元( identity),即,對於任何串 s 都有,εs = sε = s
設x,y,z,是三個字符串,如果x = yz,則稱y是x的前綴,z是x的后綴
B:串上的運算-冪
s0= ε
sn = s^(n-1)s, n ≥1
s1 = s0 s = εs = s,s2 = ss,s3 = sss,…
例:如果 s =ba,那么s1= ba,s2=baba, s3=bababa,…
結論:串s的n次冪:將n個s連接起來
(二) 文法
(1) 文法的形式化定義
G = (V_T , V_N , P , S )
A:V_T:終結符集合
終結符(terminal symbol)是文法所定義的語言的基本符號,有時也稱為token
例: V_T = { apple, boy, eat, little }
B:V_N:非終結符集合
非終結符(nonterminal) 是用來表示語法成分的符號,有時也稱為“ 語法變量”
➢例:V_N = { <句子>, <名詞短語>, <動詞短語>, <名 詞>, … }
C:P :產生式集合
產生式( production)描述了將終結符和非終結符組合成串的方法
產生式的一般形式:α→β 讀作:α 定義為 β
α∈(V_T∪V_N)+:且α中至少包含V_N中的一個元素:稱為產生式的頭 (head )或左部(left side)
β∈(V_T∪V_N)* :稱為產生式的體(body)或右部(right side)
D:S :開始符號
S∈VN
開始符號(start symbol)表示的是該文法中最大的語法成分
E:例子
例:G =( { id, +, *, (, ) }, {E}, P, E )
P ={
E → E + E ,
E → E * E ,
E → ( E ) ,
E → id }
約定:不引起歧義的前提下,可以只寫產生式
G : E → E + E E → E * E E → ( E ) E → id
F:產生式的簡寫
對一組有相同左部的α產生式
α→β1, α→β2, … , α→βn
可以簡記為:
α→β1| β2| … | βn
讀作:α定義為β1,或者β2,…,或者βn 。 β1,β2,…,βn稱為α的候選式(Candidate)
把上面的例子,再簡寫一下
E → E + E E → E * E E → ( E ) E → id
E → E + E | E * E | ( E ) | id
(2) 符號約定
A:終結符
① 字母表中排在前面的小寫字母,如a,b,c
② 運算符,如 +、*等
③ 標點符號,如括號,逗號等
④ 數字0,1、…、9
⑤ 粗體字符串,如id,if等
B:非終結符
① 字母表中排在前面的大寫字母,如A、B、C
② 字母S,通常表示開始符號
③ 小寫、斜體的名字、如expr、stmt等
④ 代表程序構造的大寫字母。如E(表達式)、T(項)、F(因子)
C:文法符號
① 字母表中排在后面的大寫字母(如X、Y、Z)
D:終結符號串
① 字母表中排在后面的小寫字母(u、v、…、z) (包括空串)
E:文法符號串
小寫希臘字母,如α、β、γ (包括空串)
第一個產生式的左部就是開始符號
(三) 語言
(1) 推導和規約
給定文法G=(VT , VN , P , S ),如果 α→β ∈ P,那么可以將符號串γαδ中的α替換為β,也就是說,將γαδ,重寫(rewrite)為γβδ,記作 γαδ ==> γβδ
此時,稱文法中的符號串 γαδ 直接推導(directly derive)出 γβδ
簡而言之,就是用產生式的右部替換產生式的左部
(2) 句型和句子
一個開始符號 S 通過若干步,可以推導出 α,則稱 α 是G的一個句型
- α 是一個文法符號串
如果 α 中的每一個 都是終結符,經過若干部可以推導出一個終結符號串 w,稱 w 是 G 的一個句子
(3) 語言的形式化定義
例如下面的例子: D 可以是0或1或2... 說明其定義為數字,同理L為字母
而T的定義,可以是 L(字母)、D(數字)、TL、TD,通過右側的推導(一直替代T)可得,最后的形式是一個字母數字串
而 S 可推出,是一個字母開頭的字母數字串
(4) 文法的分類
A:0型文法
α --> β
- 無限制文法
- ∀ α --> β ∈ P,α中至少包含一個非終結符
- 0型語言
- 由0型文法G生成的語言L(G)
B:1型文法
上下文有關文法
- ∀ α --> β ∈ P,|α|≤|β|
- 產生式的一般形式:α1 A α2 --> α1 β α2
- 上下文有關語言
- 由上下文有關文法G構成的語言L(G)
- 不包含 ε-產生式
C:2型文法
上下文無關文法
-
∀α → β ∈P,α ∈ 非終結符
-
產生式的一般形式:A --> β
-
上下文無關語言
-
由上下文無關文法G構成的語言L
D:3型文法
正則文法
- 右線性文法:A --> wB 或 A --> w
- 左線性文法:A --> Bw 或 A --> w
(5) 四種文法的關系
(四) CFG 的分析樹
- 根節點的標號為文法開始符號
- 內部節點表示對一個產生式 A–> β 的應用,該節點的標號是此產生式左部A。該節點的子節點的標號從左到右構成了產生式的右部 β
- 葉節點的標號既可以是非終結符,也可以是終結符。從左到右排列葉節點得到的符號串稱為這棵樹的產出或邊緣
(1) 分析樹是推導的圖形化表示
(2) (句型的)短語
給定一個句型,其分析樹中的每一棵子樹的邊緣稱為該句型的一個短語
- 如果子樹只有父子兩代結點,那么這棵子樹的邊緣稱為該句型的一個直接短語
舉個例子:
(3) 二義性文法
如果一個文法可以為某個句子生成多棵分析樹,則稱這個文法是二義性的
(4) 二義性文法的判定
(五) 例題
1、文法G[S]:S→xSx|y所描述的語言是()(n≥0)正確答案(D)
- A.(xux)n
- B.xyxn
- C.xynx
- D.xnyxn
2、給定文法A→bA|ca,為該文法句子的是( ) 正確答案(C)
- A. bba
- B. cab
- C. bca
- D. cba
3、設有文法G[S]:S®S1|S0|Sa|Sc|a|b|c,下列符號串中是該文法的句子有( ) 正確答案(D)
- A. ab0
- B. a0b01
- C. a0b0a
- D. bc10
4、文法G產生的( )的全體是該文法描述的語言 正確答案(D)
- A. 句型
- B. 終結符集
- C. 非終結符集
- D. 句子
5、若文法G定義的語言是無限集,則文法必然是( ) 正確答案(A)
- A. 遞歸的
- B. 上下文無關的
- C. 二義性的
- D. 無二義性的
6、喬姆斯基(Chomsky)把文法分為四種類型,即0型、1型、2型、3型。其中3型文法是( ) 正確答案(B)
- A. 非限制文法
- B. 正則文法
- C. 上下文有關文法
- D. 上下文無關文法
7、一個上下文無關文法G包括四個組成部分,它們是一組非終結符號,一組終結符號,一個開始符號,以及一組( ) 正確答案(B)
- A. 句子
- B. 產生式
- C. 單詞
- D. 句型
8、若一個文法是遞歸的,則它所產生的語言的句子( ) 正確答案(A)
- A. 是無窮多個
- B. 是有窮多個
- C. 是可枚舉的
- D. 個數是常量
9、給定文法A→bA|cc,則符號串①cc ②bcbc ③bcbcc ④bccbcc ⑤bbbcc中,是該文法句子的是( ) 正確答案(D)
- A. ①
- B. ③④⑤
- C. ②④
- D. ①⑤
10、文法E→E+E|EE|i的句子ii+i*i有( )棵不同的語法樹 正確答案(C)
- A. 1
- B. 3
- C. 5
- D. 7
11、文法 S→aaS|abc 定義的語言是( ) 正確答案(C)
-
A. {a^(2k)bc|k>0}
-
B. {a^(k)bc|k>0}
-
C . {a^(2k-1)bc|k>0}
-
D . {a(k)a(k)bc|k>0}
12、文法G:S→xSx| xS|y所識別的語言是() 正確答案(A)
- A.
- B.
- C.
- D.
13、由文法的開始符號出發經過若干步(包括0步)推導產生的文法符號序列稱為( ) 正確答案(B)
- A. 語言
- B. 句型
- C. 句子
- D. 句柄
14、下列符號串不可以由符號集S={a,b}上的正閉包運算產生的是( ) 正確答案(A)
- A. ε
- B. a
- C. aa
- D. ab
15、文法G:S → x xS | y 所識別的語言是( ) 正確答案(D)
-
A.
-
B.
-
C.
-
D.
16、文法G:S → xS | y 所識別的語言是( ) 正確答案(D)
-
A.
-
B.
-
C.
-
D.
(十) 結尾
如果文章中有什么不足,歡迎大家留言交流,感謝朋友們的支持!
如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公眾號
在這里的我們素不相識,卻都在為了自己的夢而努力 ❤
一個堅持推送原創開發技術文章的公眾號:理想二旬不止