考虑到在CSDN,没有搜索到很多关于javacc的东西,绝对干货。
javacc概述
javacc概述
JavaCC 是一个词法分析生成器和语法分析生成器。 词法分析和语法分析是处理输入字符序列的软件构件, 编译器和解释器协同词法分析和语法分析来“解密” 程序文件。
javacc的获取:https://java.net/projects/javacc/downloads从此处下载了javacc 5.0 然后解压并在path环境变量中添加 解压后的bin目录即可。
词法分析器可以将字符串解析为一个一
个的标识符(Token), 并且可以把这些标识符归类。 看一段 C 语言代码:
int main() {
return 0 ;
}
经过C语言的词法分析会将代码分为如下的一些标识符
“int” , “ ” , “main” , “(” , “ )” ,“ ” , “{
” , “ \n” ,“ \t” ,
“return” “ ” , “0” , “ ” , “;” , “ \n” ,“ }” , “ \n” , “ ”
还会进行分类,C语言的词法分析器会将其分为如下:
KWINT, SPACE, ID, OPAR, CPAR,
SPACE, OBRACE, SPACE, SPACE, KWRETURN,
SPACE, OCTALCONST, SPACE, SEMICOLON, SPACE,
CBRACE, SPACE, EOF。
EOF代表文件的结束。经过词法分析,将这些标识符传给语法分析器。在C语言中 SPACE(空格) 是不需要的。
语法分析器将生成语法树:
javacc的特性
javacc有几个重要的特性需要记住的:
使用递归下降语法解析,LL(k)。其中,第一个L表示从左到右扫描输入;第二个L表示每次都进行最左推导(在推导语法树的过程中每次都替换句型中最左的非终结符为终结符。类似还有最右推导);k表示的是每次向前探索(lookahead)k个终结符
词法规则,语法规则定义在同一文件中,就是.jj文件。
jjTree可以帮助更好的语法分析(因为好像没用过,不好说啊)
可定制生成的行为,如对字母的大小写是否敏感。不如设计数据库sql语句的时候应该使用关键字大小写不敏感。
更向前一步解决移进规约。当文法本身存在二义性的时候有时候通过设置lookahead为k能解决问题,带来的问题就是增加编译时间,所以最好的方法是修改二义性文法为无二义性文法。