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.擁有高效...