Chinaunix首页 | 论坛 | 博客
  • 博客访问: 738190
  • 博文数量: 251
  • 博客积分: 10367
  • 博客等级: 上将
  • 技术积分: 2750
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-10 14:43
文章分类

全部博文(251)

文章存档

2009年(2)

2008年(86)

2007年(163)

分类: C/C++

2008-06-10 00:12:34

至此,一个简单的编译器已经做好了,学到了不少,不过真正的编译器才刚刚开始。

有点遗撼的是:在代码生成的过程中,并没有采用回填技术,而是简单地增加标号,然后在tm“虚拟机”中重新根据标号整理顺序

if x < 9 then
    write x
end

生成如下:

* TINY Compilation to TM Code
* File: test.tm
* Standard prelude:
  0:     LD  6,0(0)     load maxaddress from location 0
  1:     ST  0,0(0)     clear location 0
  2:     LD  0,0(5)     load id value
  3:     ST  0,0(6)     op: push left
  4:    LDC  0,9(0)     load const
  5:     LD  1,0(6)     op: load left
  6:    SUB  0,1,0     op <
  7:    JLT  0,2(7)     br if true
  8:    LDC  0,0(0)     false case
  9:    LDA  7,1(7)     unconditional jmp
 10:    LDC  0,1(0)     true case
 12:     LD  0,0(5)     load id value
 13:    OUT  0,0,0     write ac
 11:    JEQ  0,3(7)     if: jmp to else
 14:    LDA  7,0(7)     jmp to end
 15:   HALT  0,0,0

在tm“虚拟机”机中会重排成如下所示:

    0:     LD  6,  0(0)
    1:     ST  0,  0(0)
    2:     LD  0,  0(5)
    3:     ST  0,  0(6)
    4:    LDC  0,  9(0)
    5:     LD  1,  0(6)
    6:    SUB  0,1,0
    7:    JLT  0,  2(7)
    8:    LDC  0,  0(0)
    9:    LDA  7,  1(7)
   10:    LDC  0,  1(0)
   11:    JEQ  0,  3(7)
   12:     LD  0,  0(5)
   13:    OUT  0,0,0
   14:    LDA  7,  0(7)
   15:   HALT  0,0,0

另外,我想说:简单的虚拟机也不过如此,只要敢想,一切都是可能的。


文件:代码生成及虚拟机tm.rar
大小:23KB
下载:下载

阅读(1044) | 评论(0) | 转发(0) |
0

上一篇:Tiny 语法及语义分析

下一篇:sed 用法介绍

给主人留下些什么吧!~~