上下文無關文法

1.上下文無關文法定義數組

  文法:它描述語言語法結構的一組形式規則。閉包

   上下文無關文法:它定義的語法範疇(或語法單位)是徹底獨立於這種範疇可能出現的環境。例如,在程序設計語言中,當碰到一個算術表達式時,咱們徹底能夠「就事論事」處理,而沒必要考慮它所處的上下文。然而,在天然語言中,隨便一個詞,甚至一個字的意思在不一樣的上下文中都有可能有不一樣的意思。幸運的是,當今的程序設計語言都是上下文無關的spa

  設計

  好像有點抽象,來個例子blog

  

  "→"表示箭頭左邊的由箭頭右邊的定義遞歸

  把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}

相關文章
相關標籤/搜索