网上关于JAVACC的例子太过一致,而我在实际使用中遇到的问题往往在网上搜不到,还是把这些总结出来,以后再次遇到,也方便自己查^-^
1 不能动态调用.
这个问题是由于在写JJ文件的时候,并没有设置生成的JAVA类为非静态的,那么在JAVACC生成类的时候会默认生成静态类.如果是静态类的话,在调用的时候就只能用静态方法调用.
静态调用,我一直都没有调用成功,最后无奈之下,还是修改了JJ文件,重新生成.
在JJ文件的开头,加上option,设置其生成非静态类,如下:
options {
FORCE_LA_CHECK=true;
DEBUG_PARSER = true;//以debug形式生成,便于调试.
STATIC=false; //生成非静态类.
LOOKAHEAD=3; //向前看三个字母,消除歧义用的
}
FORCE_LA_CHECK=true;
DEBUG_PARSER = true;//以debug形式生成,便于调试.
STATIC=false; //生成非静态类.
LOOKAHEAD=3; //向前看三个字母,消除歧义用的
}
2 Lexical error
出现这个问题是由于在解析的句子中遇到了JAVACC中保留字,例如单引号' ,双引号"
如果要解析此类字符,在定义TOKEN时得表明,例如:
<Quote:"/"">//双引号,即用/转义
3 Encountered "not ( employee" at line 3, column 43.Was expecting one of:
<EOF>
<rpath> ...
"not" "(" ...
"not" "(" <rpath> ...
<EOF>
<rpath> ...
"not" "(" ...
"not" "(" <rpath> ...
这种错误,不知道应该用什么名称来表述,但绝对是JAVACC中出现最多的问题,也是让人最郁闷的问题.
明明输入的内容就是按语法要求来的,但是就是不能被正确解析.遇到这个问题,可能是以下几种情况
(1) TOKEN定义导致的,例如:
<string:(["A"-"Z","a"-"z","0"-"9"])+>
<not:"not">
看上去,刚才那个句子遇到not应该解析成TOKEN not,其实不然,它会被解析TOKEN string.因为字符串not是符合TOKEN string的定义的,并且在顺序上TOKEN string在前,所以先被匹配成TOKEN string.如果将两者的顺序更换一下,就能正确的解析成TOKEN not了.
(2) 自定义的变量导致的,例如:
void test(): {int not=0;}
{
<not><leftb>key=<rpath><rightb>
{
not=1;
{
not=1;
}
}
在这里,有一个自定义的变量名和TOKEN not名称一样.将JJ文件生成JAVA类之后,你会发现,对于TOKEN not
显示的颜色,会跟其它的TOKEN不一样.这就是由于在JAVA类中,这个变量not和TOKEN not二者冲突了.
如果将这个变量名改为no或者其它的,TOKEN not就能被正常解析了.