flex與bison是編譯器設計工具。這裡的編譯器為廣義,其中包括一般的編譯器、指令碼解析器等,需要進行語言結構解析來得出意義的程式。
當我們需要用乙個語言來設計一款編譯器時,需要考慮太多設計重心外的東西,如記憶體管理、模組設計、字元識別等,flex與bison就很好地為我們處理了這些事情,將設計重心放在詞法與語法分析上。
flex提供詞法分析,採用的是正規表示式匹配字元。
bison提供語法分析,採用a : b | c ;的方式進行語法設計。
具體的規則《flex 與 bison》有很詳細的描述。
首先,對於語言的解析,是以流(stream)的方式進行的。
假定我們詞法與語法都已經設定好
if a > b then c = 0;
對於以上句子大概會進行如此解析:
1. if 詞法分析判定為 if,返回標記
2. 語法分析接到標記,存放到棧內,發現找不到適合的語法來進行歸約,返回進行詞法分析
3. a 詞法分析判定為name,返回標記
4. 語法分析接到標記,存放到棧內發現name能被歸約成exp,name出棧,exp入棧
5. 現在棧內有if exp,語法分析發現找不到適合的語法來進行歸約,返回進行詞法分析
6. > 詞法分析判定為cmp,返回標記
7. 語法分析接到標記,存放到棧內,發現找不到適合的語法來進行歸約,返回進行詞法分析
8. b 詞法分析判定為name,返回標記
9. 語法分析接到標記,存放到棧內發現name能被歸約成exp,name出棧,exp入棧
10.語法分析接到標記,存放到棧內,發現棧內有exp cmp exp,可以規約為exp,於是進行歸約,exp放回棧內,然後發現有if exp,無法歸約,返回詞法分析
*分析方法採用的是lrlr(1),這也是bison的一般做法,上面分析為了方便省去向前檢視的步驟。
上述例子可以看出只要過一遍字元流,通過詞法分析與語法分析的交替進行,就可以最終歸約句子。
為了方便維護,語法分析時都會進行語法樹構建,如上述例子:
當name被歸約成exp時,建立節點,節點需要儲存name所在符號表的位置,
當exp cmp exp被歸約成exp時,建立節點,節點需要儲存作exp節點的指標為左子樹,保持右exp節點的指標為右子樹,儲存cmp型別
一般的編譯器都能夠自定義變數,如上述例子的a、b、c,這些符號會在詞法分析時被判別為自定義變數。
自定義變數需要進行維護,可以用雜湊表儲存自定義變數。
自定義變數的名稱在詞法分析時,就可以加到雜湊表內。
另外自定義變數包含比較多的資訊,如型別、變數值等,如果是函式,那麼還會包含函式體指標,這些在詞法分析時是無法得到的。而在詞法分析時,只是構建語法樹,並不適於進行資訊填充。但是在計算時就會用到雜湊表內的變數。
假設句子是一行一行執行的,那麼在碰到'\n'符合時就會執行計算,
如上例:c = 0;
計算時會把c在雜湊表內的變數值填充為0;
Linux 編譯flex bison總結
end這個做了很久了,一直沒總結,今天以ubuntu18.04為例,總結一下步驟,沒有太多原理性的東西,希望能幫到編譯flex bison程式時出錯的小夥伴們。先解釋下,lex與yacc是兩個在unix下的分別作詞法分析和語法分析的工具,linux對應flex與bison。step1 安裝bison...
編譯方舟編譯器
環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...
方舟編譯器編譯
目錄環境變數 安裝 ninja 和 gn 編譯成功 總結2019.9.1 編譯華為方舟編譯器原始碼 這篇文章僅僅是關於如何搭建環境並進行編譯。本機環境 ubuntu 16 server.一定要好好看參考文件!建議使用root賬戶操作 先 clone 原始碼華為開源平台 對應的參考文件openarkc...