梁利锋 发表于 2013-1-27 05:36:38

D Parser 之前(三):Z 语言编译器

  终于把 Z 语言的编译器做完了。意外的在四则运算上耽误了很多时间,发现 Grammatica 的四则运算的例子其实是右结合的,费了很大劲才解决了。现在觉得 Grammatica 的完整度好像不是很高,比如没有帮助建立抽象语法树的工具之类。也许 ANTLR 会好一点儿吧。
 
  重新整理了目录,把生成的程序放到了 bin 目录下,建立了一个 build.bat 的批处理,用来把 z 编译成机器码,再打开虚拟机,加载此机器码。
 
  虚拟机指令增加了一些,比如现在也支持减、乘、除运算,增加直接设置 esp 和把 esp 和 ebx 转移,以及中断指令(在 z 里通过 pause 语句生成中断指令)等等。
 
  Z 的编译器使用的是最保守的方式生成指令,也就是说,为了保证正确性,加入了很多垃圾代码。http://www.agoit.com/bbs/../../images/smiles/icon_biggrin.gif
 
  有一个小问题,就是如果遇到“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 );  
 
  下面是可执行文件、源代码和运行截图:
 
 
页: [1]
查看完整版本: D Parser 之前(三):Z 语言编译器