JavaCC集成文件

JavaCC集成文件,javacc,Javacc,我正在使用JavaCC构建一个lexer和一个解析器,我有以下代码: TOKEN: { < #DIGIT : [ "0"-"9" ] > |< INTEGER_LITERAL : (<DIGIT>)+ > } SimpleNode IntegerLiteral() : { Token t; } { (t=<INTEGER_LITERAL>) { Integer n = new Integer(t.image); j

我正在使用JavaCC构建一个lexer和一个解析器,我有以下代码:

TOKEN:
{
   < #DIGIT : [ "0"-"9" ] >
  |< INTEGER_LITERAL : (<DIGIT>)+ >
}


SimpleNode IntegerLiteral() :
{
  Token t;
}
{
(t=<INTEGER_LITERAL>)
{
    Integer n = new Integer(t.image);
    jjtThis.jjtSetValue( n );
    return jjtThis;
}
}
令牌:
{
<#数字:[“0”-“9”]>
|
}
SimpleNode IntegerLiteral():
{
令牌t;
}
{
(t=)
{
整数n=新整数(t.image);
jjtThis.jjtSetValue(n);
将此返回jjt;
}
}

因此,它应该只接受整数,但也接受4。或4%%%等。

尝试在解析器规范文件中启用调试,如:

OPTIONS {
  DEBUG_TOKEN_MANAGER=true
}
这将创建TokenManager在解析时正在执行的操作的打印输出。

“4.”和“4%%%”实际上不被接受,因为解析器读取的内容始终是“4” 如果将DEBUG_PARSER设置为true;在选项部分,您将看到当前读取的令牌。 我认为,如果您像这样更改语法,您可以看到它在读取未处理的字符时抛出一个错误

    SimpleNode IntegerLiteral() :
    {
      Token t;
    }
    {
    (
        t=<DIGIT>
    {
        Integer n = new Integer(t.image);
        jjtThis.jjtSetValue( n );
        return jjtThis;
    })+
    }
SimpleNode IntegerLiteral():
{
令牌t;
}
{
(
t=
{
整数n=新整数(t.image);
jjtThis.jjtSetValue(n);
将此返回jjt;
})+
}

如果
IntegerLiteral
是解析器的开始符号,则需要在
t=之后添加
,当我添加时,它表示预期EOF,不接受其他输入。我认为您需要更清楚地说明希望解析器识别的语言。到目前为止,我们知道“4”在语言中,但“4”和“4%%”不是。此外,该语言包含的内容不限于
()+
。没什么大不了的,你什么意思?整数本身应该是有效的,但我的意思是你的问题不清楚,因为你还没有明确说明需要接受哪一组字符串。请重写问题,使其更清楚地说明什么应该和不应该被接受。