Linux Bison更好的語義類型
盡管使用Flex和Linux Bison生成程序非常簡單,但是要讓這些程序產生用戶友好的語法和語義錯誤消息卻很困難。本文將介紹Flex和Linux Bison的錯誤處理特性,并展示如何使用它們,然后詳細介紹它們的一些缺陷。
簡介
正如UNIX®開發人員所了解的那樣,Flex和Linux Bison的功能非常強大,非常適合開發詞法和語法解析器,尤其是語言編譯器和解釋器。如果我們不熟悉它們所實現的工具——分別是Lex和Yacc——可以參考一下本文參考資料一節中有關Flex和Bison文檔的鏈接,以及其他介紹這兩個程序的文章。
本文介紹了更高級的一些主題:用來在編譯器和解釋器中更好地實現錯誤處理能力的特性和技術。為了展示這些技術,我使用了一個示例程序ccalc,它基于Bison手冊中的計算機實現了一個增強的計算器。我們可以從本文后面下載一節下載ccalc和相關文件。
增強包括使用了很多變量。在ccalc中,變量是通過在初始化中***使用時定義的,例如a=3。如果變量是在初始化之前使用的,那就會產生語義錯誤,使用值為0來創建這個變量,并打印一條消息。
示例源文件
示例源代碼中包括7個文件:
ccalc.c:主程序,以及一些進行輸入、輸出和錯誤處理的函數ccalc.h:包括了對所有模塊的定義cmath.c:數學函數parse.y:Bison使用的輸入文法lex.l:Flex的輸入makefile:簡單的makefiledefs.txt:示例輸入文件這個程序接收兩個參數:
-debug:產生調試輸出filename:輸入文件名;默認值為defs.txtBison使用的設置為了處理變量名和實際值,Bison的語義類型必須進行增強:
清單1.更好的Linux Bison語義類型
- /*generateinclude-filewithsymbolsandtypes*/
- %defines
- /*amoreadvancedsemantictype*/
- %union{
- doublevalue;
- char*string;
- }
有些文法規則可以產生特定的語義類型,這需要像清單2中一樣對Bison進行聲明。要獲得一個可移植性更好的Bison文法版本,我們需要重新定義+-*/()符號。下面這個例子沒有使用左括號(,而是使用了結束符符號LBRACE,這是由詞法分析提供的。另外,操作符的優先順序也必須進行聲明。
對于Flex來說,所生成的代碼通常都依賴于平臺所使用的代碼頁(codepage)。盡管我們可以使用其他代碼頁,但是必須要對輸入進行轉換。因此與Bison代碼不同,Flex代碼尚不能進行移植。
【編輯推薦】





















