理解了bnf,就能實現**解析了嗎?還有點早,因為理解了bnf,還要會寫bnf。實際上,bnf實現有固定的模式,也有現成的工具,比如可以使用yacc、bison等工具自動化進行。所以把實現先放一放,看一看bnf是怎麼寫的。
是否所有的bnf都可以這麼來寫呢?下面我們嘗試對其他語法的bnf進行編寫。
如c語言中列舉型別的定義:
enum enumname
;
列舉型別的定義語法,用語言描述出來是:
以乙個enum開頭,後面可以跟乙個識別符號,也可以省略不寫。其bnf可以嘗試寫出來:接著是乙個左大括號;
接著是列舉值列表,列舉值列表可以為空,不為空時,列舉值之間用逗號隔開。
列舉值可以只寫出識別符號名稱,也可以給它賦值,如a和a=1都是正確的;
接著是乙個右大括號和乙個分號。
enum_decl=『enum』 + option_identifier + 『;』寫到最後的value_list會發現,不管怎麼寫都會多出乙個逗號。option_identifier=identifier | 『』
value_list=』』 | value_list + 『,』 + indentifier | value_list + 『,』 + indentifier + 『=』 + num
因為bnf裡面的控制命令太少了,想要表達出我們想要表達的規則,我們得求助於ebnf。
下面是ebnf的介紹:
ebnf,e即extended,ebnf即擴充套件bnf正規化。下圖列舉了ebnf包含的符號:它最初由尼古拉斯·沃斯開發,最常用的 ebnf 變體由標準,特別是iso-14977所定義。 ——來自維基百科
更詳細的介紹可以參考維基百科: 擴充套件巴科斯正規化(可能需要翻牆)
iso-14977標準文件獲取方法,參考文章:去哪查閱iso國際標準?
可見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...