D Parser 之前(三):Z 語言編譯器

  終於把 Z 語言的編譯器做完了。意外的在四則運算上耽誤了很多時間,發現 Grammatica 的四則運算的例子其實是右結合的,費了很大勁才解決了。現在覺得 Grammatica 的完整度好像不是很高,比如沒有幫助建立抽象語法樹的工具之類。也許 ANTLR 會好一點兒吧。

 

  重新整理了目錄,把生成的程序放到了 bin 目錄下,建立了一個 build.bat 的批處理,用來把 z 編譯成機器碼,再打開虛擬機,加載此機器碼。

 

  虛擬機指令增加了一些,比如現在也支持減、乘、除運算,增加直接設置 esp 和把 esp 和 ebx 轉移,以及中斷指令(在 z 裏通過 pause 語句生成中斷指令)等等。

 

  Z 的編譯器使用的是最保守的方式生成指令,也就是說,爲了保證正確性,加入了很多垃圾代碼。biggrin

 

  有一個小問題,就是如果遇到“5-3”這樣的表達式,分辨不出是減號還是負號,會編譯通不過,解決方法也很簡單,加入空格就可以了“5 - 3”。

 

  現在,我們可以編譯下面的 1 到 100 和的程序:

 

int n = 0;
int i = 1;
next:
if(i <= 100)
{
    n = n + i;
    i = i + 1;
    goto next;
}
write(n);

  


  也可以把 fibonacci 序列的程序編譯:

 

int i=0;
int a=1;
write(a);
int b=1;
write(b);
int t;
next:
t = a + b;
write(t);
a = b;
b = t;
i = i + 1;
if(i<10) goto next;

 

  其中,if 語句也可以處理 else:

 

int n = 1;
int m = 8 * 9;
if( n < 5 && (m == 73 || !(n != 1)) )
{
    write(1);
    if ( n == 1 )
        if ( n == 2 )
            write(11);
        else
            write(12);
}
else
{
    write(2);
}
write(3);

  


  或者執行復雜運算如下:

write( 2 + 8 * 1 / 8 - 1 - (2 - 3) * 5 * 2 );

  

 

  下面是可執行文件、源代碼和運行截圖:

 

 

發佈了0 篇原創文章 · 獲贊 0 · 訪問量 1310
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章