JavaCC+jjtree使用教程
前提条件:
从教学网教学内容区上下载javacc-4.0.zip、minijava.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执行结果
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)Node();
//输出抽象语法树
root.dump(">");
其中,“词法分析、语法分析、建立抽象语法树”这些都是通过调用parser.Goal()来实现的。如果你的输入文件没有词法或语法错误,这个函数执行的过程中并不输出任何信息。
但如果你的源文件有词法或语法错误,它就会抛出异常。执行它之后,你可以通过Node()来获得所生成的抽象语法树的根节点,调用dump 函数,你可以看看生成的抽象语法树是什么样的。
eclipse怎么打开已有的java文件
通过这个简单的例子,就可以看出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小时内删除。