1.上下文無關文法定義
文法:它描述語言語法結構的一組形式規則。
上下文無關文法:它定義的語法范疇(或語法單位)是完全獨立於這種范疇可能出現的環境。例如,在程序設計語言中,當碰到一個算術表達式時,我們完全可以“就事論事”處理,而不必考慮它所處的上下文。然而,在自然語言中,隨便一個詞,甚至一個字的意思在不同的上下文中都有可能有不同的意思。幸運的是,當今的程序設計語言都是上下文無關的
。
好像有點抽象,來個例子
"→"表示箭頭左邊的由箭頭右邊的定義
把He gave me a book與上述規則進行對照,看其中的語法范疇是否處於適當的位置,如果你了解英語的話,你應該可以確認這是一個正確的句子。做科學研究都有一個過程從現象得出一般結論,再用實驗驗證這個一般性結論。有了這個語法規則我們可以造出很多這種英文句子(簡單假設,英文語法遠比這復雜)。如果我們要造一個句子表達我們自己的意思,利用這個規則,很容易。
根據上述規則,句子無需考慮上下文,就可以判斷正確性(符合<主語><謂語><間接賓語><直接賓語>的規則)。
其中,He,me等為終結符號,<主語>、<謂語>、<間接賓語>等為非終結符號。
這個文法最終要定義<句子>語法結構,所以<句子>在這里稱為開始符號;<謂語>→<動詞>這種書寫形式稱之為產生式。
歸納一下:上下文無關語法G包括四個部分:一組終結符號,一組非終結符號,一個開始符號,以及一組產生式。
說明一下:終結符號是組成語言不可再分的基本符號,在程序語言中就是保留字、標識符、常數等;非終結符號是一個給定的語法概念,是一個類(或集合)記號,而是不是某個個體記號;開始符號是一個特殊的非終結符號,是語言中我們最終想得到的字符串(在程序語言中,我們最終感興趣的是“程序”這個語法范疇,其他的語法都是構造“程序”的基石);產生式(也稱產生規則或者簡稱規則)是語法范疇的一種書寫規則。
你想嘛,gave這個單詞,拆分為一個個字母,就不再是gave了,沒有什么特別的含義;而非終結符號就是諸如gave的動詞的集合。
額,有個細節好像忽略了,產生式的形式:
A→α
箭頭左邊是一個非終結符,稱之為產生式的左部,箭頭右邊稱之為右部。
A是一個非終結符,α是由 非終結符號和終結符號的並集 的閉包 中的元素 組成的符號串
形式化的上下文無關文法定義:
一個四元數組G=(VN,VT,S,P)
VN:非空有限的非終結符集合
VT:非空有限的終結符集
S:開始符號
P:產生式集合
其中,VN∩VT=∅,S∈VN
P中產生式一般形式為A→α|β,其中A∈VN,α,β∈(VN∪VT)*
通常用大寫字母表示非終結符,小寫字母表示終結符,α、β、γ等代表由 終結符和非終結符號的並集的閉包 中的元素 組成的符號串。
例如:E→i|EAE A→+|*
是上下文無關語法,E、A是非終結符,E是開始符,而i,+和*是終結符
2.用上下文無關語法定義一個語言
一個上下文無關語法如何定義一個語言呢,主要思想是從文法的開始符號出發,反復連續使用產生式,對非終結符進行替換和展開。
例如:
算術表達式的定義可以寫為:
E→i
E→E+E
E→E*E
E→(E)
E代表算術表達式,i代表變量。這四個產生式的后三個是遞歸的。
我們可以定義如下文法G
E→E+E|E*E|(E)|i
開始符號為E,從E出發E=>(E)=>(E+E)=>(E*E+E)=>(i*E+E)=>(i*i+E)=>(i*i+i)
符號"=>"表示僅推導一步
我們定義αAβ=>αγβ為αAβ直接推導出αγβ,僅當A→γ是一個產生式,且α,β∈(VN∪VT)* 。
如果a1=>a2=>a3=>...=>an,我們稱這個序列是從a1到an的一個推導。若存在一個從a1到an的推導,則稱之為a1可推導出an。用a1=>an表示從a1出發經過零步或若干步,可推導出an。
假設G是一個文法,S是它的開始符號,如果S=>α則稱α是一個句型。僅含終結符號的句型是句子。文法G所產生的句子全體是一個語言記為L(G)。
L(G)={α|S+=>α&α∈VT*}
例如:文法G1:
S→bA
A→aA|a
從符號S出發我們可以推出,S=>bA=>ba
S=>bA=>baA=>baa
.
.
.
S=>bA=>baA=>...=>ba...a
歸納得出所有以b開頭后頭跟一個或者多個a的字符串L(G1)={ban|n>=1}