1. 直接推導
令 g 是一文法,我們從 xay 直接推出xαy ,即 xay⇒xαy ,僅a → α 是 g 的乙個規則且x , y ∈ ( v n ∪ v t )* 。也就是說,從符號串 xay 直接推導出xαy僅使用一次規則。
例如,設有文法 g [ s ](符號 g [ s ]表示 s 為文法 g 的開始符號):
g [ s ] = (,, p , s )
其中,p 為s →01|0 s 1
有如下直接推導:
s ⇒01 使用規則 s →01 , 此時 x = ε , y = ε
s ⇒0 s 1使用規則 s →0 s 1 , 此時 x = ε ,y = ε
0 s 1⇒0011 使用規則 s →01 , 此時 x =0 , y =1
00 s 11⇒000 s 111 使用規則 s →0 s 1 , 此時 x =00 , y =11
000 s 111⇒00001111 使用規則 s →01 , 此時 x =000 ,y =111
注意推導和規則的區別:一是形式上的區別,推導用「 ⇒ 」表示,規則用「 → 」表示;二是對文法 g 中任何規則 a → α ,有 a ⇒ α ,即推導的依據是規則。
2. 推導
**如果存在乙個直接推導序列:
α 0 ⇒ α 1 ⇒ α 2 ⇒ … ⇒ α n
則稱這個序列是乙個從 α0 至 α n 的長度為 n 的推導,記為α 0 ⇒+ αn
。即α 0 ⇒+ αn
表示從 α 0 出發,經一步或若干步或使用若干次規則可推導出 αn。
例如,設有文法 g [ e ]:
g [ e ] = (,, p , e )
其中,p 為
e → e + t | t
t → t * f | f
f → ( e ) | 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 ⇒+ i +i * i
3. 廣義推導
α 0 ⇒* α
n 表示從 α 0 出發,經 0 步或若干步,可推導出 α n。也就是說, α 0 ⇒* αn 意味著, α 0 = α n ,或者 α0 ⇒+ αn 。
對上例,有
e ⇒* e
e ⇒* i +i * i
顯然,直接推導的長度為 1 ,推導的長度大於等於 1 ,而廣義推導的長度大於等於 0。
4. 句型和句子
設有文法 g [ s ]( s 是文法 g 的開始符號),如果 s ⇒ x* ,
x ∈ ( v n ∪ v t )* ,則稱符號串 x 為文法 g [ s ]的句型。 s ⇒ x ,x ∈ v t* *,則稱 x 是文法 g [ s ]的句子。
【例 2.5 】
設有文法 g [ s ]:
s →01|0 s 1
有
s ⇒* 01
s ⇒* 0s1
s ⇒* 00s 11
s ⇒* 000111
顯然,符號串 01 ,0 s 1 , 00 s 11 和 000111 都是文法 g [ s ]的句型,而 01 和 000111 又是文法g [ s ]的句子。
【例 2.6 】設有文法g [ e ]:e → e + e | e * e | ( e ) | i
試證明符號串(i * i + i )是文法 g [ e ]的乙個句子。
分析 只要證明符號串(i * i + i )對文法 g 存在乙個推導,就可證明符號串( i * i + i )是文法 g [ e ]的乙個句子。因為有
e ⇒ ( e ) ⇒ ( e + e ) ⇒ ( e * e + e ) ⇒ ( i * e + e ) ⇒ ( i * i + e ) ⇒ ( i * i + i )
即有 e ⇒*(i * i + i ),所以符號串( i * i + i )是文法 g [ e ]的乙個句子。
5. 語言
文法 g [ s ]產生的所有句子的集合稱為文法 g 所定義的語言,記為l ( g [ s ]):l ( g [ s ]) =
注意,這裡用 s ⇒+ x ,而不是用 s ⇒ * x。因為 s 是文法的開始符號,s ∈ v n ,若用 s ⇒* x ,那麼有可能有 s = x ,這與 x ∈ v t * 相矛盾。此時的 x 不可能是句子。此處,如果用 s ⇒
s →01|0 s 1
求該文法所描述的語言。
分析 問題歸結為由識別符號 s 出發,將推出一些什麼樣的句子,也就是說, l ( g [ s ])是由一些什麼樣的符號串所組成的集合,找出其中的規律,用式子或自然語言描述出來。
此處應用第二個規則 n -1 次,然後再應用第乙個規則 1 次,有
s ⇒0 s 1⇒00 s 11⇒000 s 111 … ⇒0(n -1)s 1(n -1) ⇒0n1n
即 s ⇒+ 0n1n ,可見,此文法定義的語言為
l ( g [ s ]) =
【例 2.8 】
設有文法 g [ s ]:
s →0 s |1 s | ε
求該文法所定義的語言。
由該文法所確定的語言為
l ( g [ s ]) = = * }
【例 2.9 】
設有文法
g [ a ]:a →yb, b → xb | x
求該文法所定義的語言。
分析 從文法開始符號 a 出發可推導出以 y 開頭後面跟乙個或多個 x 結尾的符號串,所以該文法定義的語言為l ( g [ a ]) =
。
由此可見,從已知文法確定語言的中心思想是:從文法的開始符號出發,反覆連續地使用規則,對非終結符施行替換和展開,找出句子的規律,用式子或自然語言描述出來。
形式語言理論可以證明如下兩點:
(1 )給定乙個文法,就能從結構上唯一地確定其語言,即 g → l ( g )。
(2 )給定一種語言,能確定其文法,但這種文法不是唯一的,即 l→ g 1 或 g 2 或 … 或 g n。
對此我們不予證明,但已通過前面的舉例說明了這兩點。
C語言定義陣列的幾種形式
陣列時常都可以用到,以前用在c語言裡用,後來在c 裡也用,現在回過頭來學習c語言,總結一下c語言定義陣列的幾種形式 以一維陣列為例 int arr 10 int arr int arr 10 int arr new int 10 前面三種常常都可以用到,但使用第四種時需要注意。在.c檔案裡使用這種形...
C語言定義陣列的幾種形式
陣列時常都可以用到,以前用在c語言裡用,後來在c 裡也用,現在回過頭來學習c語言,總結一下c語言定義陣列的幾種形式 以一維陣列為例 int arr 10 int arr int arr 10 int arr new int 10 前面三種常常都可以用到,但使用第四種時需要注意。在.c檔案裡使用這種形...
程式語言的形式
採用最常用的兩種程式語言,一是梯形圖,二是助記符語言表。採用梯形圖程式設計,因為它直觀易懂,但需要一台個人計算機及相應的程式設計軟體 採用助記符形式便於實驗,因為它只需要一台簡易程式設計器,而不必用昂貴的圖形程式設計器或計算機來程式設計。雖然一些高檔的plc還具有與計算機相容的c語言 basic語言...