編譯原理 如何編寫BNF?

2021-10-21 07:16:00 字數 1350 閱讀 1835

理解了bnf,就能實現**解析了嗎?還有點早,因為理解了bnf,還要會寫bnf。實際上,bnf實現有固定的模式,也有現成的工具,比如可以使用yacc、bison等工具自動化進行。所以把實現先放一放,看一看bnf是怎麼寫的。

是否所有的bnf都可以這麼來寫呢?下面我們嘗試對其他語法的bnf進行編寫。

如c語言中列舉型別的定義:

enum enumname

;

列舉型別的定義語法,用語言描述出來是:

以乙個enum開頭,後面可以跟乙個識別符號,也可以省略不寫。

接著是乙個左大括號;

接著是列舉值列表,列舉值列表可以為空,不為空時,列舉值之間用逗號隔開。

列舉值可以只寫出識別符號名稱,也可以給它賦值,如a和a=1都是正確的;

接著是乙個右大括號和乙個分號。

其bnf可以嘗試寫出來:

enum_decl=『enum』 + option_identifier + 『;』

option_identifier=identifier | 『』

value_list=』』 | value_list + 『,』 + indentifier | value_list + 『,』 + indentifier + 『=』 + num

寫到最後的value_list會發現,不管怎麼寫都會多出乙個逗號。

因為bnf裡面的控制命令太少了,想要表達出我們想要表達的規則,我們得求助於ebnf。

下面是ebnf的介紹:

ebnf,e即extended,ebnf即擴充套件bnf正規化。

它最初由尼古拉斯·沃斯開發,最常用的 ebnf 變體由標準,特別是iso-14977所定義。 ——來自維基百科

更詳細的介紹可以參考維基百科: 擴充套件巴科斯正規化(可能需要翻牆)

iso-14977標準文件獲取方法,參考文章:去哪查閱iso國際標準?

下圖列舉了ebnf包含的符號:

可見ebnf中包含了更多的控制命令。相對於bnf來說,它的描述能力更為強大。

我們現在使用ebnf重寫上面的列舉宣告語法。

enum_decl =

'enum'

[id]

''}'

;

可見上面用乙個ebnf語句即描述bnf很多條語句才能描述的內容。

以此類推,可以自己嘗試編寫。

歡迎專注【編譯原理】專欄!

如何學習編譯原理

對於沒有電腦科學基礎知識的程式設計師或初學者來說 一上來就看龍書 虎書是行不通的 全是理論知識 看得想睡覺 我還試過看網易雲大學計算機專業的編譯原理課程 也是看得一頭霧水 看到80多講就看不下去了 另外 sicp 電腦程式的構造和解釋 這本很多人推薦的書其實並不適合初學者 前3章和後面幾章難度差別有...

如何看待編譯原理

2.學習編譯原理有什麼好處呢?網上的給出了我們幾點我認為對我們未來學習都十分有用的建議,1 可以更加容易的理解在乙個語言種哪些寫法是等價的,哪些是有差異的 2 可以更加客觀的比較不同語言的差異 3 更不容易被某個特定語言的宣揚者忽悠 4 學習新的語言是效率也會更高 5 其實從語言a轉換到語言b是乙個...

BNF正規化 如何用C 實現自動推導

bnf 正規化 attack attack name attack name 字串 signatures signaturesignatures signature ip signature dir get signature opt sigature exp signature proto pro...