官网:
https://javacc.github.io/javacc/
https://github.com/javacc/javacc#getting-started
Usage:
javacc option-settings inputfile
"option-settings" is a sequence of settings separated by spaces.
Each option setting must be of one of the following forms:
-optionname=value (e.g., -STATIC=false)
-optionname:value (e.g., -STATIC:false)
-optionname (equivalent to -optionname=true. e.g., -STATIC)
-NOoptionname (equivalent to -optionname=false. e.g., -NOSTATIC)
Option settings are not case-sensitive, so one can say "-nOsTaTiC" instead
of "-NOSTATIC". Option values must be appropriate for the corresponding
option, and must be either an integer, a boolean, or a string value.
The integer valued options are:
LOOKAHEAD (default 1)
CHOICE_AMBIGUITY_CHECK (default 2)
OTHER_AMBIGUITY_CHECK (default 1)
The boolean valued options are:
STATIC (default true)
SUPPORT_CLASS_VISIBILITY_PUBLIC (default true)
DEBUG_PARSER (default false)
DEBUG_LOOKAHEAD (default false)
DEBUG_TOKEN_MANAGER (default false)
ERROR_REPORTING (default true)
JAVA_UNICODE_ESCAPE (default false)
UNICODE_INPUT (default false)
IGNORE_CASE (default false)
COMMON_TOKEN_ACTION (default false)
USER_TOKEN_MANAGER (default false)
USER_CHAR_STREAM (default false)
BUILD_PARSER (default true)
BUILD_TOKEN_MANAGER (default true)
TOKEN_MANAGER_USES_PARSER (default false)
SANITY_CHECK (default true)
FORCE_LA_CHECK (default false)
CACHE_TOKENS (default false)
KEEP_LINE_COLUMN (default true)
The string valued options are:
OUTPUT_DIRECTORY (default Current Directory)
TOKEN_EXTENDS (java.lang.Object)
TOKEN_FACTORY (java.lang.Object)
JDK_VERSION (1.5)
GRAMMAR_ENCODING (default file.encoding)
EXAMPLE:
javacc -STATIC=false -LOOKAHEAD:2 -debug_parser mygrammar.jj
ABOUT JavaCC:
JavaCC is a parser generator for the Java programming language.
下载解压

执行:
mvn package
将 javacc-7.0.10.jar 重命名为 javacc.jar
并将目录下的scripts文件夹加入到环境变量中。
执行javacc命令验证是否成功。
官网例子,解析大括号
合法:
{}, }}} // … etc
非法:
{}{}, }{}}, { }, {x} // … etc
新建文件 Parser.jj:
PARSER_BEGIN(Example)
/** Simple brace matcher. */
public class Example {
/** Main entry point. */
public static void main(String args[]) throws ParseException {
Example parser = new Example(System.in);
parser.Input();
}
}
PARSER_END(Example)
/** Root production. */
void Input() :
{}
{
MatchedBraces() ("\n"|"\r")*
}
/** Brace matching production. */
void MatchedBraces() :
{}
{
"{" [ MatchedBraces() ] "}"
}
执行命令:


javac Example.java
java Example
生成扫描器的程序称为扫描器生成器(scanner generator),生成解析器的程序称为解析器生成器(parser generator)。只需指定需要解析的语法,扫描器生成器和解析器生成器就能生成解析相应语法的代码。
扫描器生成器都大体类似,解析器生成器则有若干个种类。现在具有代表性的解析器生成器可分为LL解析器生成器和LALR解析器生成器两类。
1.词法分析
在编程语言处理系统中,我们将“一个单词(的字面)”和“它的种类”“语义值”统称为token。通过使用token这个词,词法分析器的作用就可以说是解析代码(字符行)并生成token序列。
词法分析(lexical analyze)就是将代码分割为一个个的单词,也可以称为扫描(scan)。举例来说,词法分析就是将x = 1 + 2这样的程序分割为“x”“=”“1”“+”“2”这样5个单词。并且在该过程中,会将空白符和注释这种对程序没有实际意义的部分剔除。正因为预先有了词法分析,语法分析器才可以只处理有意义的单词,进而实现简化处理。
负责词法分析的模块称为词法分析器(lexical analyzer),又称扫描器(scanner)。
JavaCC采用正则表达式(regular express)的语法来描述需要解析的单词的规则,并由此来表现扫描器。

2.语法分析
语法规则通常会用一个扩展名为“.jj”的文件来描述,该文件称为语法描述文件。
options {
JavaCC的选项
}
PARSER_BEGIN(解析器类名)
package包名;
import库名;
public class解析器类名 {
任意的Java代码
}
PARSER_END(解析器类名)
扫描器的描述
解析器的描述
语法描述文件的开头是描述JavaCC选项的options块,这部分可以省略。
JavaCC和Java一样将解析器的内容定义在单个类中,因此会在PARSER_BEGIN和PARSER_END之间描述这个类的相关内容。
这部分可以描述package声明、import声明以及任意的方法。
PARSER_BEGIN(Adder)到PARSER_END(Adder)是解析器类的定义。
SKIP和TOKEN部分定义了扫描器。SKIP表示要跳过空格、制表符(tab)和换行符。TOKEN表示扫描整数字符并生成token。
例:
options {
STATIC = false;
}
PARSER_BEGIN(Adder)
import java.io.*;
class Adder {
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 Adder(reader).expr( );
}
}
PARSER_END(Adder)
SKIP: { <[" ", "\t", "\r", "\n"]> }
TOKEN: {
}
long expr( ):
{
Token x, y;
}
{
x= "+" y=
{
return Long.parseLong(x.image)+ Long.parseLong(y.image);
}
}
