`
梁利锋
  • 浏览: 81905 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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 );

  

 

  下面是可执行文件、源代码和运行截图:

 

 

  • ZLan3.zip (314.8 KB)
  • 描述: 可执行文件、源代码及例子。执行需要 .Net 2.0。
  • 下载次数: 29
  • 描述: 运行截图
  • 大小: 35.9 KB
4
0
分享到:
评论
3 楼 梁利锋 2008-01-18  
优先级问题在新版中已经在新版中解决,另外增加了一些新的特性:
http://llf.iteye.com/blog/157507
2 楼 梁利锋 2008-01-16  
今天写 D 的语法文件的时候,发现,我在这里做的 Bool 表达式的优先级是错的。比如在 C/C++/D 里“&&”的优先级比"||"高,而在 Z 里实现的它们的优先级相同。

不过,话说回来,没觉得“&&”有优先级比“||”高的理由,反正,写 Bool 表达式的时候,还是加括号比较保险。
1 楼 DavidL 2008-01-12  
非常不错!!

相关推荐

    D Parser 之前:写一个简单的虚拟机

    【标题】"D Parser 之前:写一个简单的虚拟机"主要涉及的是计算机科学与软件工程领域中的虚拟机设计和实现。虚拟机是一种软件实现的计算环境,它模拟真实计算机的硬件系统,允许运行特定的程序或语言。在这个项目中...

    0513《编译原理》答案 设计并实现TINYC语言的扫描程序.doc

    其中,【TINYC语言的扫描程序】是编译器设计的一个重要组成部分,它属于编译器前端,负责识别和处理源代码的词法规则。 **实验目的** 1. 理解并掌握编译器的基本构造,特别是词法分析器(Scanner 或 Lexer)的作用...

    snl语言的词法语法分析器python实现

    r'[a-zA-Z_][a-zA-Z0-9_]*' return t # 其他词汇规则... lexer = lex.lex() ``` 2. **语法分析**:在语法分析阶段,我们需要定义文法规则,描述SNL语言的结构。`ply.yacc`提供了一个类似的过程,我们定义每个非...

    编译原理复习题.doc

    - 可以产生语言L={anbbn|n≥1}的文法是Z→AbB,A→aA|a,B→bB|b。 - 与(a|b)*(c|d)等价的正规表达式是(a*|b*)*(c|d),选择B。 - 算符优先分析法和简单优先分析法都基于短语对归约,但前者使用最左素短语,后者...

    HowTo:VS2012“ C”项目/ w Flex&Bison

    2. 运行`bison -d parser.y`,这将生成`parser.c`和`parser.h`文件。 将生成的源文件添加到VS2012项目中: 1. 右键单击解决方案资源管理器中的项目,选择“添加”&gt;“现有项”。 2. 导入`lexer.c`, `parser.c`, `...

Global site tag (gtag.js) - Google Analytics