flex bison 編譯器雜談

2022-04-03 10:06:25 字數 1496 閱讀 8156

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...