官网连接:JavaCCjava
JavaCC是Java的解析器生成器兼扫描器生成器。为JavaCC描述好语法的规则,JavaCC就可以生成能够解析该语法的扫描器和解析器(的代码)了。多线程
JavaCC是LL解析器生成器,所以比起LR解析器生成器和LALR解析器生成器,它有着可处理语法的范围相对狭哉的缺点。函数
可是,JavaCC生成的解析器有易于理解,易于使用的优点。且支持无限长的token超前扫描特性,因此速度很是的快。lua
我为何要把坑写在前面?由于这真的是太坑了!线程
一开始我下载的是官网的javacc-6.0
,配置好环境变量后仍是一只报错:code
找不到或者没法加载主类 javaccblog
没错,官网的6.0版本有问题!因而使用javacc-5.0
就行了。token
具体参考:getting-started-with-javaccget
语法描述文件一般会使用.jj
的后缀文件it
options { JavaCC 的选项 } PARSER_BEGIN(解析器类名) package 包名; import 库名; public class 解析器类名 { 任意的Java代码 } PARSER_END (解析器类名) 扫描器的描述 解析器的描述
Person.jj(文件名称能够任意命名)
options { STATIC = false; } PARSER_BEGIN(Person) import java.io.*; class Person { static public void main (String[] args) { for (String arg : args) { try { System.out.println(evaluate(arg)); } catch (ParseException ex) { System.err.println(ex.getMessage); } } } static public long evaluate (String src) throws ParseException { Reader reader = new StringReader(src); return new Person(reader).expr(); } } PARSER_END(Person) SKIP: { < [" ","\t","\r","\n"] > } TOKEN: { <INTEGER: (["0"-"9"])+> } long expr(): { Token x,y; } { x=<INTEGER> "+" y=<INTEGER> <EOF> { return Long.parseLong(x.image) + Long.parseLong(y.image); } }
具体分析:
options
块中,将STATIC选项设置为false的意思是解析器能够在多线程环境下使用。设置为true亦反。PARSER_BEGIN
到PARSER_END
是解析器类的定义。解析器类中须要定义的成员和方法也写在这。为了实现及时只有Person类也可以运行,这里定义类main函数。命令以下:
javacc Person
若是描述文件有问题,处理的时候会报错:
➜ java javacc Person.jj Java Compiler Compiler Version 5.0 (Parser Generator) (type "javacc" with no arguments for help) Reading from file Person.jj . . . org.javacc.parser.ParseException: Encountered " ";" "; "" at line 33, column 12. Was expecting one of: "throws" ... ":" ...
处理成功后相似:
➜ java javacc Person.jj Java Compiler Compiler Version 5.0 (Parser Generator) (type "javacc" with no arguments for help) Reading from file Person.jj . . . File "TokenMgrError.java" does not exist. Will create one. File "ParseException.java" does not exist. Will create one. File "Token.java" does not exist. Will create one. File "SimpleCharStream.java" does not exist. Will create one. Parser generated successfully.
除了生成Person.java
文件之外,还会生成其余的辅助类,如ParseException
等
这应该就很熟悉了
javac Person.java
生成.class
文件。大功告成!
命令以下
➜ java java Person '111 + 222' 333
计算结果没毛病!
因此咱们编写的语法规则,如今已经能够正常的计算了。
是否是体会到JavaCC的魅力了?😊