CSK.Blog--个人原创Weblog

« [分享]Introductory Econometrics - A Modern Approach列一下今后要看的书,备忘 »

[开源]抽象语法树图形化显示程序

最近在做编译大作业需要将语法翻译好的抽象语法树(Abstract Syntax Tree)显示出来,教材使用了ANDREW W. APPEL的Modern Compiler Implementation in Java一书。

看过的人都知道其中要求将他定义的一种叫做tiger的语言先翻译成一棵抽象书,我们的大作业就到此为止,至于将这颗树显示可以采用作者提供的print.java以文本展现出来,也就是这样:

LetExp(
DecList(
TypeDec(myint,
NameTy(int),TypeDec(arrtype,
ArrayTy(myint))),
DecList(
VarDec(arr1,
arrtype,
ArrayExp(arrtype,
IntExp(10),
IntExp(0)),
true),
DecList())),
SeqExp(
ExpList(
varExp(
SimpleVar(arr1)))))finished

不过这样难免和我们直观的语法树理解差太远了,于是我就写了个程序,效果是这样的:

自认为还不赖,程序和原有的print.java类似,直接接受抽象树根节点,你再指定给他保存到的图片文件名和保存的格式就可以了。

我将源代码公布在下面,如果大家需要也可以用来玩玩^_^

下载地址:

公网:http://www.csksoft.net/data/legacyftp/Products/code_and_lib/PrettyTree_BY_CSK.rar

教育网:ftp://great_csk:public@public.sjtu.edu.cn/public-files/PrettyTree_BY_CSK.rar

说明:

作者保留源代码的著作权利,可以在不修改删除作者信息的前提下任意使用和分发。作者不对由于本代码产生的问题负责

代码采用SWT库开发,请将swt.jar以及相关的系统相关库文件复制到程序的根目录

使用例子:

package XTiger.parsersys;
import XTiger.parsersys.Absyn.Print;
import net.csksoft.PrettyTree.*;
public class Main {

public static void main(String argv[]) {
String filename = argv[0];
Parse myXParse = new Parse(filename);
if (myXParse.absyn !=null)
{
System.out.println("parse succeed");
System.out.println("Dump Trees");
System.out.println("Please Wait...it takes time :-)");
TreeMaker myTree=new TreeMaker();
myTree.renderToFile(myXParse.absyn,"dumpedTree.bmp",0);
System.out.println("finished");
myTree.dispose();
}
}

}

由于采用了SWT库,所以必须显式调用TreeMaker.dispose释放资源,否则将可能导致系统崩溃。

函数:renderToFile(absyn.Exp e,String destFile,int Type);

Type = 0/bmp 1/jpg 2/png

已知问题:在编译较大程序,比如queen.tig时候,由于产生的语法树图片过大会产生heap溢出异常。

  • quote 1.信叶晗笑
  • 你好,我对你分享的源代码有些不明白,能不能请教你几个问题
  • 10/10/2012 2:19:03 AM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)