參考和推薦閱讀:html
http://blog.csdn.net/sirouni2003/article/details/590661函數
http://www.cppblog.com/woaidongmao/archive/2008/09/20/62322.html 工具
上面的文章都不錯,第一個是Bison手冊的翻譯,因此就不重複了,閱讀翻譯就能很快的瞭解bison的使用了。佈局
瞭解了Lex以後,那麼yacc/bison就相對容易理解了,基本的思路等都是差很少的,須要一個輸入文件,通過bison命令產生輸出的C文件,爲一個語法解析器parser,而後用gcc編譯就獲得可執行文件,總體思路和lex的使用過程同樣。可是Bison相對於Lex困難一點,就在於涉及的概念更多。優化
1. 基本概念.net
上下文無關文法:Bison使用上下文無關文法進行描述。翻譯
參考:code
http://baike.baidu.com/view/110877.htmhtm
http://zh.wikipedia.org/wiki/%E4%B8%8A%E4%B8%8B%E6%96%87%E6%97%A0%E5%85%B3%E6%96%87%E6%B3%95 blog
幾乎全部的程序語言都是使用上下文無關文法描述的。
一般用BNF範式表達上下文無關文法,Bison的輸入就要求必須是BNF範式。
上下文無關文法有不少子集,Bison幾乎都支持,可是主要對LALR(1)文法進行了優化。
LALR(1)文法分析器具備肯定性(deterministic), 這就意味着匹配於輸入的下一個文法規則取決於以前的輸入和肯定的部分剩餘輸入(咱們稱之爲一個超前掃描記號(look-ahead). 一個上下文無關文法多是有歧義的(ambiguous),便可能可能有多種規則來匹配某些輸入. 即便非歧義性文法也可能使不肯定(non-deterministic)的, 即沒有總能足以決定下一個應用的文法規則的固定的超前掃描記號。
在正式的語言語法規則中,每一種語法單元或組合被稱之爲符號(symbol). 那些能夠經過語法規則被分解成更小的結構的符號叫作非終結符(nonterminal symbols). 那些不能被再分的符號叫作終結符(terminal symbols)或者記號類型(token types). 咱們把同終結符相對應的輸入片斷叫作記號(token), 把同單個非終結符相對應的輸入片斷叫作組(grouping).
C語言的語法組包括表達式,語句,聲明和函數定義。每個非終結符必須有一個描述如何由更簡單結構組成這個非終結符的語法規則。
在Bison中,終結符也被稱爲符號類型(token type).
Bison的輸入爲正規文法,通常來講,其中的非終結符使用小寫字母表示,好比expr,stmt,declaration等,其中的終結符采用大寫字母表示,如INTEGER,INDITIFIER,RETURN,IF等等。
2. Bison語法文件的總體佈局
Bison工具的輸入文件是以個Bison語法文件(Bison grammar file). 一般的Bison語法文件格式以下:
%{ Prologue %} Bison declarations %% Grammar rules %% Epilogue
很容易看出,結構和Lex的輸入文件徹底同樣。相信註釋什麼的也是同樣的了。這其中,%%,%{%}的做用和Lex徹底同樣。
Bison declarations聲明瞭終結符和非終結符以及操做符的優先級和各類符號語義值的各類類型.
Grammar rules定義瞭如何從每個非終結符的部分構建其總體的語法規則.
Epilogue能夠包括任何你想使用的代碼.
Bison語法輸入文件一般以`.y'結尾