javacc问题及解决

 网上关于JAVACC的例子太过一致,而我在实际使用中遇到的问题往往在网上搜不到,还是把这些总结出来,以后再次遇到,也方便自己查^-^
1  不能动态调用.
   这个问题是由于在写JJ文件的时候,并没有设置生成的JAVA类为非静态的,那么在JAVACC生成类的时候会默认生成静态类.如果是静态类的话,在调用的时候就只能用静态方法调用.
   静态调用,我一直都没有调用成功,最后无奈之下,还是修改了JJ文件,重新生成.
  在JJ文件的开头,加上option,设置其生成非静态类,如下:
  options {
       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> ...
  这种错误,不知道应该用什么名称来表述,但绝对是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; 
    }
  }
  在这里,有一个自定义的变量名和TOKEN not名称一样.将JJ文件生成JAVA类之后,你会发现,对于TOKEN not
显示的颜色,会跟其它的TOKEN不一样.这就是由于在JAVA类中,这个变量not和TOKEN not二者冲突了.
  如果将这个变量名改为no或者其它的,TOKEN not就能被正常解析了.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值