上下文無關文法


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}


免責聲明!

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



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