JavaCC:遇到......期待......错误之一

时间:2013-11-28 17:07:26

标签: runtime-error javacc

尝试在样本(语法上有效)的文件上运行用JavaCC编写的解析器时出现此错误:

Exception in thread "main" ParseException: Encountered "8;" at line 13, column 17.
Was expecting one of:                                                        
<INT_CONST> ...
"<" ...at jimpleParser.generateParseException(jimpleParser.java:2421)
at jimpleParser.jj_consume_token(jimpleParser.java:2292)
at jimpleParser.expr(jimpleParser.java:1038)

(缩写为简洁)

我无法弄清楚它为什么会抛出错误。 “8”应该是有效的令牌。这是有问题的功能:

 String expr():
{
Token t1 = null, t2 = null;
String f1 = null, f2 = null, f3 = null;
}

{
(LOOKAHEAD(3)
f1 = imm() {System.out.println(f1);}    
| f1 = new_expr()                       
| t1 = <LBR> f2 = nonvoid_type() t2 = <RBR> f3 = imm()            
{f1 = t1.image.concat(f2.concat(t2.image.concat(f3)));}
| LOOKAHEAD(2)
f2 = imm() t1 = <INSTANCEOF> f3 = nonvoid_type()
{f1 = f2.concat(t1.image.concat(f3));}
| f1 = invoke_expr()                        
| LOOKAHEAD(2)
f1 = reference()
| LOOKAHEAD(2)
f1 = binop_expr()
| f1 = unop_expr())
{return f1;}
}

应该反过来调用此处显示的imm:

String imm():
{
String f1 = null;
}

{
(f1 = constant()
| f1 = local_name())
{return f1;}
}

应该依次调用此处显示的常量:

String constant():
{
Token t1 = null, t2 = null;
String f1 = null;
}

{
(t1 = <INT_CONST> {f1 = t1.image; System.out.println(f1);}
| t1 = <FLOAT_CONST> {f1 = t1.image;}
| t1 = <MIN_INT_CONST> {f1 = t1.image;}
| t1 = <MIN_FLOAT_CONST> {f1 = t1.image;}
| t1 = <STRING_CONST> {f1 = t1.image;}
| t1 = <CLASS> t2 = <STRING_CONST> {f1 = t1.image.concat(t2.image);}
| t1 = <NULL> {f1 = t1.image;})
{return f1;}
}

8应该是INT_CONST。相关令牌规范如下所示:

<INT_CONST: ((<OCT_CONST> | <DEC_CONST> | <HEX_CONST>) ("L")?)>
<DEC_CONST: (<DEC_DIGIT>)+>
<DEC_DIGIT: ["0"-"9"]>

非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

请注意,导致问题的不是“8”,而是“8;”。虽然“8”是INT_CONST,“8;”不是。因此,最长匹配规则正在进行,其他一些令牌生产与“8”相匹配赢了。请参阅常见问题http://www.engr.mun.ca/~theo/JavaCC-FAQ/问题3.3。在没有看到你所有的.jj文件的情况下,我无法告诉你它是哪个标记,但如果你在构造错误信息的代码上设置了一个断点,你可以很容易地看到意外标记的.kind字段是什么。

答案 1 :(得分:0)

在您的令牌部分尝试此操作,它肯定会解决您的问题:

TOKEN:
{
    <DEC_DIGIT: (["0"-"9"])>
    |
    <INT_CONST: ((<OCT_CONST> | <DEC_CONST> | <HEX_CONST>) ("L")?)>
    |
    <DEC_CONST: (<DEC_DIGIT>)+>
    // The rest of your tokens....
}