java實現C編譯器 for 迴圈語句的解析和執行

2021-07-25 11:39:18 字數 2343 閱讀 4035

int a = 0;

我們當前的解析器是解析不了的,必須把上面的語句轉換為:

int a;

a = 0;

要想使當前的直譯器能夠解析並執行變數宣告同時付初值的功能,實現起來較為複雜,所以我決定先把這個功能放一放,把精力先使用在更為重要的實現上。

本節我們要為直譯器增加的功能是對for迴圈進行解析和執行,for迴圈的語法表示式如下:

statement -> for lp opt_expr  test semi end_opt_expr rp statement(84)
其對應的執行樹結構如下:

對於乙個具體的迴圈語句:

for (i= 0; i

< 3; i++)

i = 0 對應於節點optexpr, i < 3 對應節點test, i++ 對應節點endoptexpr, a = a+ 1; 對應最後乙個statement節點。

直譯器在執行for 語句時,先執行optexpr節點,然後執行test節點,如果test節點執行後返回的值大於0,則執行最下面的statement節點,然後再執行endoptexpr節點,也就是for 迴圈後面的i++語句。

整個流程執行完畢後,解釋著再次執行test節點,如果執行後返回值不等於0,則繼續執行最下面的statement節點和endpotexpr節點,如果返回值等於0,則執行結束。

public icodenode buildcodetree(int production, string text) 

break

; case cgrammarinitializer.expr_to_endopt:

node = icodefactory.createicodenode(ctokentype.end_opt_expr);

node.addchild(codenodestack.pop());

break

; ...

}

增加的**就是用來構造前面所說的關於for迴圈執行樹的幾個節點。在statementexecutor的實現中,我們增加了對for迴圈的這裡寫**片實現:

public

class

statementexecutor

extends

baseexecutor;

@override

public object execute(icodenode root)

break;

default:

executechildren(root);

break;

}return root;

}private

boolean

isloopcontinute(icodenode root, looptype type)

return

false;}}

executechild(root, 0); 對應於執行樹中的optexpr節點,也就是執行for語句中的變數初始化語句,也就是i = 0; isloopcontinute 執行的是執行樹中第二個節點,也就是test節點,對應的是for 語句中的 i < 3語句,如果返回的結果不等於0,也就是迴圈條件滿足,那麼執行迴圈體內部的語句**,也就是通過呼叫

executechild(root, 3);, 從而執行執最下面的statement節點,對應於例子中,就是 a = a + 1; 最後通過呼叫executechild(root, 2); 執行endoptexpr節點,對應於for迴圈,就是語句i++;

我們需要新增新的**,以便直譯器能正確執行i++語句,該語句對應的語法表示式是:

unary -> unary incop

所以我們需要在unarynodeexecutor中,新增相應的實現**,具體改動如下:

public

class

unarynodeexecutor

extends

baseexecutor catch (exception e)

break;}}

}

我們先拿到變數i所對應的symbol物件,通過該物件的valuesetter介面,使得變數的值自加1.

通過上面的**改進,我們的直譯器對c語言的執行能力可以得到進一步加強,可以正確解析和執行下面的c語言**:

void f() 

}

編譯器實現(六)

語義分析可以分為兩類。第1類是程式的分析,要求根據程式語言的規則建立其正確性,並保證其正確執行。對於不同的語言來說,語言定義所要求的這一類分析的總量變化很大。在lisp和smalltalk這類動態制導的語言中,可能完全沒有靜態語義分析 而在a d a這類語言中就有很強的需求,程式必須提交執行。其他的...

c 編譯器編譯過程

編譯過程 編譯過程分為四步 預處理 編譯 彙編 連線 1.預處理 預處理主要處理原始檔中的 include define 等預處理等命令 預處理主要完成的工作有 參考 程式設計師的自我修養 1 刪除 define,展開巨集 2 處理條件編譯指令。預處理程式先判斷條件,再根據條件修改源 3 刪除注釋 ...

C 編譯器大全

dev c 優點 功能簡潔 noip官方編譯器 缺點 功能並不完善 不適合商業開發 面向人群 c 初學者 dev c 現在已經更名為smart c 但noip不使用該編譯器 visual c 或visual mingw 優點 1.與windows緊密結合 2.強大的類庫支援和類改造能力 3.擁有高效...