編譯原理-程序設計語言及其文法【筆記】


(一) 字母表(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. img
  • B. img
  • C. img
  • D. img

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. img

  • B. img

  • C. img

  • D. img

16、文法G:S → xS | y 所識別的語言是( ) 正確答案(D)

  • A. img

  • B. img

  • C. img

  • D. img

(十) 結尾

如果文章中有什么不足,歡迎大家留言交流,感謝朋友們的支持!

如果能幫到你的話,那就來關注我吧!如果您更喜歡微信文章的閱讀方式,可以關注我的公眾號

在這里的我們素不相識,卻都在為了自己的夢而努力 ❤

一個堅持推送原創開發技術文章的公眾號:理想二旬不止


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM