javaccjjtree使用教程

javaccjjtree使用教程


2024年1月24日发(作者:)

JavaCC+jjtree使用教程

前提条件:

从教学网教学内容区上下载、这两个文件,然后将解压。

1、 修改的内容

在的第一项options中,添加两行代码:

MULTI = true;

VISITOR = true;

添加后的代码如下:

修改后保存,并将改名为

2、 使用jjtree:以为输入,调用

为方便起见,把放到javacc目录下的bin文件夹里。在命令行中进入javacc目录下的bin文件夹,执行命令jjtree ,执行结果如图1所示。可以看到生成了一些java文件和一个文件。

图 1 jjtree执行结果

3、 使用javacc:以为输入,调用

继续在刚才的命令行窗口中输入:javacc 。执行结果如图2所示。这时候可以看到bin目录下生成了很多文件:原来的,生成的以及生成的54个java文件。

图 2 javacc执行结果

4、 在eclipse中新建一个项目,然后把生成的这些java文件放到你的源码文件夹下。

5、 如何使用这些文件?

 生成的代码都能够做什么?

附件中给了几个示例代码: , , ,演示了怎么把生成的文件用起来。下面我们就具体来看一下。

首先,通过一个简单的例子来看一下。这个类里有个main函数,这个main函数所做的事就是对一个输入的minijava源文件进行词法分析、语法分析、建立抽象语法树,然后把所建立的抽象语法树输出出来。你可以把一个minijava的源文件传给这个程序,看一下结果。重点看一下这几行代码:

File file = new File(args[0]);

FileInputStream fs= new FileInputStream(file);

MiniJavaParser parser = new MiniJavaParser(fs);

//进行词法分析、语法分析,并构建抽象语法树

();

//获得AST的根节点

SimpleNode root = (SimpleNode)de();

//输出抽象语法树

(">");

其中,“词法分析、语法分析、建立抽象语法树”这些都是通过调用()来实现的。如果你的输入文件没有词法或语法错误,这个函数执行的过程中并不输出任何信息。但如果你的源文件有词法或语法错误,它就会抛出异常。执行它之后,你可以通过de()来获得所生成的抽象语法树的根节点,调用dump函数,你可以看看生成的抽象语法树是什么样的。

通过这个简单的例子,就可以看出javacc+jjtree已经为我们做了什么,下面我们来看看需要我们做的是什么。

 我们需要做什么?

在这些文件的基础上,你所需要做的就是写若干个实现这个接口的具体的类,在这些类里实现visit方法,来完成你要进行的建立符号表、类型检查等分析工作。

下面我们来举一个例子,我们写一个简单的visitor,这个visitor的作用就是遍历抽象语法树上的各个节点,然后输出每个节点的类型。(里只补充了几个visit方法作为示例,并没有补充完整)请看里的代码,比如这段:

public Object visit(ASTGoal node, Object data) {

n("ASTGoal");

enAccept(new TraversalVisitor(), data);

return data;

}

这段就是当调用ASTGoal这个类型的visit方法时,会输出“ASTGoal”,然后会继续遍历它的孩子节点。

在Main函数里,添加以下两句代码(见中的代码):就会从根节点开始依次对每个节点进行visit。

TraversalVisitor tVisitor = new TraversalVisitor();

ept(tVisitor, null);

通过上面的例子可以看到,你所需要做的就是写若干个实现这个接口的具体的类,在这些类里实现visit方法,来完成你要进行的建立符号表、类型检查等分析工作。比如,写一个和一个,分别实现MiniJavaParserVisitor这个接口,其中SymbolTableVisitor中的visit方法负责完成建立符号表的工作,中的visit方法负责完成类型检查的工作。实现这些visit方法之后,再写一个Main来组织你的整个分析流程。


发布者:admin,转转请注明出处:http://www.yc00.com/news/1706109676a1441102.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信