最近在做编译大作业需要将语法翻译好的抽象语法树(Abstract Syntax Tree)显示出来,教材使用了ANDREW W. APPEL的Modern Compiler Implementation in Java一书。
看过的人都知道其中要求将他定义的一种叫做tiger的语言先翻译成一棵抽象书,我们的大作业就到此为止,至于将这颗树显示可以采用作者提供的print.java以文本展现出来,也就是这样:
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溢出异常。