初识JavaCC(一)

来源:互联网 发布:证券时报数据宝下载. 编辑:程序博客网 时间:2024/05/16 10:21

公司有个IDE产品(基于eclipse的插件开发),可以支持写一些简单的脚本(赋值,比较,流程控制之类的)来控制业务逻辑。之前一直很好奇是怎么实现的,这几天抽空瞄了一下,才知道是用JavaCC实现的,特记录在此。

1、什么是JavaCC?
JavaCC(Java Compiler Compiler)是一个用JAVA开发的最受欢迎的是一个词法分析器和语法分析器的生成器。通俗一点就是:可以读取上下文无关且有着特殊意义的语法(jj文件)并把它转换成可以识别且匹配该语法的JAVA程序的生成器。
据说类似的比较流行的工具还有lex和yacc,C语言版本的。

2、如何使用呢?
至于JavaCC有神马特点的,我就不说了,网上一搜一大坨,我自己都不愿意看!直奔主题吧:
1)下载:https://java.net/projects/javacc/downloads 下载distribution版本的吧,有文档(看不懂)有例子。
2)解压出来一看除了doc和examples就一个javacc-6.1.2.jar文件,怎么用呢?打开该jar文件是这样的:
文件结构
最外层有3个class文件:javacc,jjtree,jjdoc是对应3个功能
- jjtree 用来处理jjt文件,生成树节点代码和jj文件;
- javacc 用来处理jj文件,生成解析代码;
- jjdoc 根据jj文件,生成文本本件(Html)

别他妈瞎哔哔了,怎么用,快,。。。呃,好吧。。。
3)windows下,在上面那个jar文件的目录下新建一个jjtree.bat文件,内容如下:

@echo off java -classpath "%~f0\..\javacc-6.1.2.jar" jjtree %1 %2 %3 %4 %5 %6 %7 %8 %9

其实就是运行jar里的jjtree.class,另外再新建两个javacc.bat,jjdoc.bat,内容和上面差不多,改jjtree为对应的命令即可;然后再把bat的目录加入到path里去,打开cmd,运行jjtree,不提示没有该命令即可。
4)环境已经配置好了,最后就是该怎么使用javacc了:用户只需要编写jjt文件,运行jjtree xx.jjt,会生产一些java文件和jj文件,再javacc xx.jj 则会生成另外一些java文件,再编译这些java文件,运行main函数类即可。

3、千言万语不如一个HelloWorld,还等什么?
1)咱们就看examples里的例子吧,首先打开SimpleExample/Simple1.jj文件,文件内容大概分为3块:options区,PARSER_BEGIN/PARSER_END区,节点定义区;
options:
- BUILD_NODE_FILES (default: true) 为SimpleNode以及语法中使用的其它节点创建样本实现。
- MULTI(default: false) 创建多模式解析树。此选项默认为False,生成一个单一模式解析树。
……
还有很多,懒得复制粘贴了,参考一下
http://blog.csdn.net/zyb243380456/article/details/7240225
比较重要的是一个static属性,用来定义解析生产的java程序的方法是否为静态方法。
2)PARSER_BEGIN / PARSER_END区是用来定义java程序主函数类及main函数。
3)节点定义区,即用于生成真正java程序的代码,在例子Simple1.jj中,用于生产类Simple1的真正实现代码:
通过调用parser.Input();来判断输入是否满足规定语法,什么语法呢,MatchedBraces() + 若干个换行回车符,MatchedBraces()定义了用户可以输入若干个嵌套的{},如{}、{{}}……

void Input() :{}{  MatchedBraces() ("\n"|"\r")* <EOF>}/** Brace matching production. */void MatchedBraces() :{}{  "{" [ MatchedBraces() ] "}"}

4)运行一下:命令行javacc Simple1.jj,javac *.java,java Simple1
输入任意字符回车,发现只有满足上面说的那种格式才不会报错。

先不说了,一上午没干活了,要扣工资了,明天继续。。。

0 0
原创粉丝点击