JavaCC+jjtree使用教程
前提条件:
从教学网教学内容区上下载javacc-4.0.zipminijava.jj这两个文件,然后将javacc-4.0.zip解压。
1、 修改minijava.jj的内容
在minijava.jj的第一项options中,添加两行代码:
MULTI = true;
VISITOR = true;
添加后的代码如下:
修改后保存,并将minijava.jj改名为minijava.jjt
2、 使用jjtree:以minijava.jjt为输入,调用jjtree.bat
为方便起见,把minijava.jjt放到javacc目录下的bin文件夹里。在命令行中进入javacc目录下的bin文件夹,执行命令jjtree minijava.jjt,执行结果如图1所示。可以看到生成了一些java文件和一个minijava.jj文件。
图 1 jjtree执行结果
3、 使用javacc:以minijava.jj为输入,调用javacc.bat
继续在刚才的命令行窗口中输入:javacc minijava.jj。执行结果如图2所示。这时候可以看到bin目录下生成了很多文件:原来的minijava.jjt,生成的minijava.jj以及生成的54个java文件。
图 2 javacc执行结果
javaparser野外4、 eclipse中新建一个项目,然后把生成的这些java文件放到你的源码文件夹下。
5、 如何使用这些文件?
生成的代码都能够做什么?
附件中给了几个示例代码: MainSimple.java, Main.java, TraversalVisitor.java,演示了怎么把生成的文件用起来。下面我们就具体来看一下。
首先,通过一个简单的例子MainSimple.java来看一下。这个类里有个main函数,这个main函数所做的事就是对一个输入的minijava源文件进行词法分析、语法分析、建立抽象语法树,然后把所建立的抽象语法树输出出来。你可以把一个minijava的源文件传给这个程序,看一下结果。重点看一下这几行代码:
File file = new File(args[0]);
            FileInputStream fs= new FileInputStream(file);
            MiniJavaParser parser = new MiniJavaParser(fs);
            //进行词法分析、语法分析,并构建抽象语法树
            parser.Goal();
            //获得AST的根节点
        SimpleNode root = (SimpleNode)parser.jjtree.rootNode();
            //输出抽象语法树
            root.dump(">");       
其中,“词法分析、语法分析、建立抽象语法树”这些都是通过调用parser.Goal()来实现的。如果你的输入文件没有词法或语法错误,这个函数执行的过程中并不输出任何信息。但如果你的源文件有词法或语法错误,它就会抛出异常。执行它之后,你可以通过parser.jjtree.rootNode()来获得所生成的抽象语法树的根节点,调用dump函数,你可以看看生成的抽象语法树是什么样的。
通过这个简单的例子,就可以看出javacc+jjtree已经为我们做了什么,下面我们来看看需要我们做的是什么。
我们需要做什么?
在这些文件的基础上,你所需要做的就是写若干个实现MiniJavaParserVisitor.java这个接口的具体的类,在这些类里实现visit方法,来完成你要进行的建立符号表、类型检查等分析工作。
下面我们来举一个例子,我们写一个简单的visitor,这个visitor的作用就是遍历抽象语法树上的各个节点,然后输出每个节点的类型。(TraversalVisitor.java里只补充了几个visit方法作为示例,并没有补充完整)请看TraversalVisitor.java里的代码,比如这段:
public Object visit(ASTGoal node, Object data) {
        System.out.println("ASTGoal");
        node.childrenAccept(new TraversalVisitor(), data);
        return data;
    }
这段就是当调用ASTGoal这个类型的visit方法时,会输出“ASTGoal”,然后会继续遍历它的孩子节点。
在Main函数里,添加以下两句代码(见Main.java中的代码):就会从根节点开始依次对每个节点进行visit。
TraversalVisitor tVisitor = new TraversalVisitor();
    root.jjtAccept(tVisitor, null);
通过上面的例子可以看到,你所需要做的就是写若干个实现MiniJavaParserVisitor.java这个接口的具体的类,在这些类里实现visit方法,来完成你要进行的建立符号表、类型检查等分析工作。比如,写一个SymbolTableVisitor.java和一个TypecheckingVisitor.java,分别实现MiniJavaParserVisitor这个接口,其中SymbolTableVisitor中的visit方法负责完成建立符
号表的工作,TypecheckingVisitor.java中的visit方法负责完成类型检查的工作。实现这些visit方法之后,再写一个Main来组织你的整个分析流程。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。