java開發C語言編譯器:解釋執行while和do...while 循環

隨着解釋器功能不斷加強,當下咱們的解釋器已經可以對C語言的解釋執行提供了很好的支持,咱們有了循環,有了庫函數調用,隨着咱們對解釋器進一步的開發,它的功能必將也來越完善,愈來愈趨近於一個功能強大的C語言解釋器,這一節,咱們繼續錦上添花,爲當前的解釋器增長對循環while 和 do … while的解釋執行功能,完成這節後,咱們的解釋器開發將進入一個重大的里程碑,那就是,他將能解釋執行用C語言編寫的快速排序算法,進而也代表,咱們開發的解釋器已經達到了一個比較成熟的地步,完成本節代碼後,咱們的解釋器將能解釋執行下面代碼:vue

int a[3];

void main() {
int i;
i = 0;
while (i < 3) {
    a[i] = i;
    i++;
    }

i = 0;
do {
        printf("%d",a[i]);
        i++;
    } while (i < 3);

}

咱們先看看兩個循環對應的語法表達式:java

STATEMENT -> WHILE LP TEST RP STATEMENT
 STATEMENT -> DO STATEMENT WHILE LP TEST RP SEMI

其中,WHILE , DO 對應的就是while 和 do 兩個關鍵字, TEST對應while後面的循環條件。根據語法表達式,咱們能夠構造對應的語法執行樹,在codeTreeBuilder.java中,添加以下代碼:node

public ICodeNode buildCodeTree(int production, String text) {
        ICodeNode node = null;
        Symbol symbol = null;

        switch (production) {
        ....
        case CGrammarInitializer.While_LP_Test_Rp_TO_Statement:
        case CGrammarInitializer.Do_Statement_While_Test_To_Statement:
            node = ICodeFactory.createICodeNode(CTokenType.STATEMENT);
            node.addChild(codeNodeStack.pop());
            node.addChild(codeNodeStack.pop());
            break;
        ....
        }

}

while 語句 和 do..while 語句的執行樹節點構造方式是同樣的,但邏輯上有些不一樣,對於while 語句, 添加的第一個節點是TEST, 也就是跟在while 後面的條件判斷語句,第二個節點這是在大括號裏面的STATEMENT。可是對於do…while語句,第一個節點對應的是大括號裏面的STATEMENT, 第二個節點纔是用於判斷循環是否結束的條件判斷語句。算法

對兩個循環語句的解釋執行仍是落在StatementExecutor的實現中:微信

public class StatementExecutor extends BaseExecutor{
    private enum LoopType {
        FOR,
        WHILE,
        DO_WHILE
    };

     @Override 
     public Object Execute(ICodeNode root) {
         int production = (int)root.getAttribute(ICodeKey.PRODUCTION);
         ICodeNode node;

         switch (production) {
         ....
         case CGrammarInitializer.While_LP_Test_Rp_TO_Statement:
             while (isLoopContinute(root, LoopType.WHILE)) {
                 executeChild(root, 1);
             }
             break;

         case CGrammarInitializer.Do_Statement_While_Test_To_Statement:
             do {
                 executeChild(root, 0);
             } while(isLoopContinute(root, LoopType.DO_WHILE));

             break;
         ....
         }

private boolean isLoopContinute(ICodeNode root, LoopType type) {
         ICodeNode res = null;
         if (type == LoopType.FOR || type == LoopType.DO_WHILE) {
             res = executeChild(root, 1);
         }
         else if (type == LoopType.WHILE) {
             res = executeChild(root, 0);
         }

         int result = (Integer)res.getAttribute(ICodeKey.VALUE);
         return res != null && result != 0;

     }
}

對while 和 do…while 語句的執行稍微有所不一樣,執行while語句時,咱們先執行isLoopContinue,也就是先判斷循環條件是否成立,若是成立的話,再執行大括號裏面的語句集合,對應do…while, 咱們先把大括號裏面的語句集合執行一次,而後再判斷循環條件是否成立。markdown

從isLoopContinute函數的實現咱們能夠發現,do..while 和 for 循環同樣,下標爲1的節點對應的是循環條件判斷,而對於while,下標爲0的子節點纔是對應於循環條件判斷。app

有了上面代碼後,咱們解釋器就能解釋執行while 和 do…while 兩個循環語句了。至此,解釋器具有已瞭解釋執行快速排序算法的相應功能,在下一節,咱們將用C語言實現快速排序算法,而後使用咱們構建的解釋器來解釋執行。可以執行具有必定複雜度的C語言代碼,標識着咱們的解釋器已經達到了必定的專業完備性。ide

更加詳細的代碼講解和調試演示過程,請參看視頻。函數

本文分享自微信公衆號 - Coding迪斯尼(gh_c9f933e7765d)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。oop

相關文章
相關標籤/搜索