到底什麼是上下文無關文法?

2022-04-11 05:41:24 字數 1274 閱讀 2456

在龍書compilers - principles, techniques, & tools英文版第2版42頁中,提到上下文無關文法有以下的特點:

乙個終結符的有限集(a set of terminal symbols),構成文法的最基本的字元就是這個文法的終結符,例如乙個能夠產生個位數的文法規則digit --> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9,則數字0~9就是這個文法的終結符,乙個能夠產生變數名的文法規則variable --> ('a'-'z' | 'a'-'z') *(('a'-'z' | 'a'-'z' | '0'-'9'),則所有的英文本母和數字就是文法的終結符。

乙個非終結符的有限集(a set of nonterminals),例如上面的digit、variable就是非終結符。

乙個產生式的有限集,例如上面的「digit --> ...」和「variable --> ...」兩個規則可以構成乙個產生式集

乙個非終結符作為開始符號,在非終結符集中,必須指定其中乙個作為開始符號。

雖然這4個特點已經規定了上下文無關文法的特徵,但我們仍然好奇,為什麼是「上下文無關」而不是「上下文有關」呢?這是因為在利用乙個上下文無關文法生成語言的時候,我們可以隨意將文法規則左邊的非終結符派生(更換)為右邊的終結符或非終結符。舉個例子,如果有下面的文法:

number --> 0 / 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9

alpha --> 'a'-'z' / 'a'-'z'

alphanum --> alpha / number

variable --> alpha *alphanum

假設variable是這個文法的開始符號,我們要根據這個文法生成乙個語言例項。先應用規則4,variable派生為alpha alphanum(星號表示後面的符號可以出現0到若干次,這裡我們選擇出現1次)。然後對alpha應用規則2,派生為'a',因此整個variable就派生為'a' alphanum。現在來考慮alphanum如何派生,有沒有限制這個alphanum可以派生為alpha還是number呢?它是否會受到前面的alpha的影響而不同?我們說,在乙個上下文無關文法中,這個派生是不受上下文影響的,也就是說,我們可以隨意的讓其派生為alpha或者number,而不必考慮前後文的情況。有關解釋可以參考

因此,「文法」是用來產生語言(字串)而不是用來識別語言的(參見對於語言的創造者而言,「文法」是用來描述所要創造的語言的。對於語言的閱讀者來說,可以將「文法」轉換為有限狀態機,這個狀態機可以用於識別這個文法所生成的語言。

其他參考:

上下文無關文法

1 上下文無關文法又稱cfg。許多cfg由幾個較簡單的cfg合併起來。可以先構造每個部分的cfg,比如 s1,s2,s3.sk。然後加入新的規則s s1 s2 sk 2 例如 構造語言 的cfg,1 構造 s1 0 s1 1 2 s2 1 s2 0 3 整合 s s1 s2 3 如果語言是正則的,可...

上下文無關文法

上下文無關文法 context free gammar 指文法的前後 上下 沒有關係,如文法 statement name is name s friend.是上下文無關文法,因為文中出現的兩個 name 可以不同 也可以相同,假設自己可以是自己的朋友 而文法 statement name like...

上下文無關文法

1 上下文無關文法又稱cfg。許多cfg由幾個較簡單的cfg合併起來。可以先構造每個部分的cfg,比如 s1,s2,s3.sk。然後加入新的規則s s1 s2 sk 2 例如 構造語言 的cfg,1 構造 s1 0 s1 1 2 s2 1 s2 0 3 整合 s s1 s2 3 如果語言是正則的,可...