編程語言語法描述工具-巴克斯範式

語法描述;

我們採用一種稱爲巴克斯範式的註釋法書寫語法,這種方式由John Bakcus發明(他是Fortain語言的首席設計師)。Fortain語言的設計師們描述Fortain的方法是使用大量的例子和文字進行解釋,這種方式很有效,很多程序員能夠理解並猜測出正確的含義,但是與足夠精確還相距甚遠。後來在描述Algol語言的時候,這種非正式的描述方法的不夠精確的缺點逐漸凸顯,於是John Bakcus就發明了我們現在用來描述語言的這種註釋法。

巴克斯構造

巴克斯範式的目的是以一種簡單概括的方式來精確地描述語言;巴科斯範式義同BNF範式(BNF: Backus-Naur Form 的縮寫)描述計算機語言語法的符號集。

  1. BNF範式是一種用遞歸的思想來表述計算機語言符號集的定義規範
  2. 法則:
    1. ::=表示定義;
    2. “ ”雙引號裏的內容表示字符;
    3. <>尖括號裏的內容表示必選內容;
    4. | 豎線兩邊的是可選內容,相當於or;
      現在在網絡上大多數能搜出來的都是extended BNF ,允許使用循環,但正真的BNF只需要遞歸就夠了。(多看一些例子就懂了~)

非終止符;用尖括號括起來;中間是一個箭頭;然後右邊是一個可替換項;

<non-terminal>->replacement //替換項可以是任何的東西,可以是非終止符,終止符等

推導(derivative)的過程

碰到終止符就需要停止,一個推導意味着從非終止符開始,按照此類來構成,最終左側只剩下終止符,我們就用語法構成了一個句子;

編程語言,比如python必須符合編碼規範(match the grammar exactly)。我們使用自然語言交流的時候,儘管不經意間會出現一些小錯誤,也能讓別人理解我們的意思;以英文舉例子,me love you;儘管有語法錯誤,但是我想大家還是能理解這句話的意思;但是編程語言不同,它的代碼必須嚴格符合語法;

我們先來看看python語言中算數表達式的相關語法;
Python Grammer for Arithmetic Expressions

<Expressions>-><Expression><Operator><Expression>

這條規則看起來有點像循環(circular),不過因爲我們還有其他的規則,所以並不是徹底的循環(completely circular),這稱爲遞歸定義(recursive definition)
To make a good recursive defintion,we need at least two rules,we need one where we can keep going,we need one where we can stop;

< Expressions >->< Expression ><Operator>< Expression>
< Expressions >->< Number >
< Operator>->+
< Operator>->*
< Number>->0,1,... //對於數字的指定有些複雜,我們假設這些數字已知

以上的語法規則雖然很短,但是卻能表達無窮無盡的內容(express infinitely many things)
原因是兩側都有表達式,我們可以用一個衍生的表達式去替換另一個表達式,並這樣重複下去;
我們再加一條規則

<Expressions>-><Expression><Operator><Expression>
<Expressions>-><Number>
<Operator>->+
<Operator>->*
<Number>->0,1,... //對於數字的指定有些複雜,我們假設這些數字已知
<Expressions>->(<Expression>)

雖然這是一個很短的語法,但是他已經強大到足夠生成我們遇到的所有python表達式了
print 6+ //不合法
print 6+6 //合法
爲什麼”6+“不合法呢?
因爲推導不出來啊

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