BNF 範式(巴科斯範式)簡介

轉自:https://www.cnblogs.com/huiyenashen/p/4445676.html

BNF 規定是推導規則(產生式)的集合,寫爲:

<符號> ::= <使用符號的表達式>

這裏的 <符號> 是非終結符,而表達式由一個符號序列,或用指示選擇豎槓'|' 分隔的多個符號序列構成,每個符號序列整體都是左端的符號的一種可能的替代。從未在左端出現的符號叫做終結符

基本原理

BNF類似一種數學遊戲:從一個符號開始(叫做起始標誌,實例中常用S表示),然後給出替換前面符號的規則。BNF語法定義的語言只不過是一個字符串集合,你可以按照下述規則書寫,這些規則叫做書寫規範(生產式規則),形式如下:
      symbol := alternative1 | alternative2 ...
      每條規則申明:=左側的符號必須被右側的某一個可選項代替。替換項用“|”分割(有時用“::=”替換“:=”,但意思是一樣的)。替換項通常有兩個符號和終結符構成。之所以叫做終結符是因爲沒有針對他們的書寫規範,他們是書寫過程的終止(符號通常被叫做非終止符,也有人叫非終端)。


       BNF就是巴科特·瑙爾式的縮寫, 在計算機的史前時代(1950s),曾有一位大師,他奠定了現代計算機的基礎,在他老人家的諸多成就之中,包括了對形式語言的研究,和發明了高級語言:FORTRAN。 爲了紀念他老人家,我們把他提出的一套描述語言的方法叫做BNF。它以遞歸方式描述語言中的各種成分,凡遵守其規則的程序就可保證語法上的正確性。BNF由於其簡潔、明瞭、科學而被廣泛接受,成爲描述各種程序設計語言的最常用的工具。
       其實BNF很簡單,::=表示定義     |表示或    尖括號(<>)括起來的是非終結符 
  所謂非終結符就是語言中某些抽象的概念不能直接出現在語言中的符號,終結符就是可以直接出現在語言中的符號。
  比如:C語言的聲明語句可以用BNF這樣描述: 
  <聲明語句> ::= <類型><標識符>; | <類型><標識符>[<數字>]; 
  這一句中<聲明語句>這個非終結符被定義成了兩種形式(上面用|隔開的兩部分),同時在這裏引入了三個終結符: 分號; 左方括號[,右方括號 ]。 
  <類型> ::= <簡單類型> | <指針類型> | <自定義類型> 
  <指針類型> ::= <簡單類型> * | <自定義類型> * 
  <簡單類型> ::= int|char|double|float|long|short|void 
  <自定義類型> ::= enum<標識符>|struct<標識符>|union<標識符>|<標識符>
  到這裏就基本上把<類型>定義清楚了。

  <數字> ::= 0x<十六進制數字串> | 0<八進制數字串> | <十進制數字串> 
  <十六進制數字串> ::= <十六進制數字> | <十六進制數字串><十六進制數字> 
  <八進制數字串> ::= <八進制數字> | <八進制數字串><八進制數字> 
  <十進制數字串> ::= <十進制數字> | <十進制數字串><十進制數字> 
  <十六進制數字> ::= <十進制數字> | A | B | C | D | E | F 
  <十進制數字> ::= <八進制數字> | 8 | 9 
  <八進制數字> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 
  到這裏就把<數字>定義清楚了 

  <標識符> ::= <字母> | <標識符> <字母數字串> 
  <字母數字串> ::= <字母>|<十進制數字>|<字母數字串><字母>|<字母數字串><十進制數字> 
  <字母> ::= _ | <大寫字母> | <小寫字母> 
  <小寫字母> ::= a|b|c|d|e|f|g|h|i|j ……  
  <大寫字母> ::= A|B|C|D|E|F|G|H|I|J …… 
  到此爲止整個聲明語句就定義完了(就是說已經沒有非終結符了)。

         雖然看起來很繁,但前面定義的各種非終結符都可以很容易的在別的地方重用。比如,函數聲明可以定義成下面的樣子: 
  <函數聲明語句> ::= <類型><標識符>(<形參表>); 
  <形參表> ::= <類型><標識符> | <形參表>,<形參表> 
  只用兩句就描述完了,所以BNF實際上比用自然語言要簡練得多(整個C語言只用一二百句就可以描述清楚),而且相當的精確,不會有自然語言中那種模棱兩可的表達。如果你對BNF比較敏感的話,會發現C裏面的標識符不能由數字開頭,而且在C裏面下劃線是被當做字母看待的(也就是說能用字母的地方都可以用下劃線)。
  另外,還有一種EBNF就沒有正宗的BNF這麼爽了,也有很多人在用,前面的那些遞歸的定義被寫成了{}。
   有一段時間PASCAL愛好者們喜歡用一個叫語法圖的東西,畫出來很難看,但功能和BNF差不多,現在好象已經沒多少人用了。
     近幾年流行另一種東西: 
  digit = one of 0 1 2 3 4 5 6 7 8 9 
  這裏非終結符digit用斜體表示,one of是這種方法裏定義的一個量詞(常用斜黑體)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章