【问题标题】:JavaCC IntegerLiteralJavaCC 整数文字
【发布时间】:2014-05-01 13:25:31
【问题描述】:

我正在使用 JavaCC 构建词法分析器和解析器,并且我有以下代码:

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;
}
}

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

【问题讨论】:

  • 如果IntegerLiteral是你的解析器的开始符号,你需要在t=&lt;INTEGER_LITERAL之后添加&lt;EOF&gt;
  • 当我添加 时,它显示预期的 EOF 并且不接受其他输入
  • 我认为您需要更清楚地说明您希望解析器识别哪种语言。到目前为止,我们知道“4”在语言中,但“4”。而“4%%%”则不是。此外,该语言包括超过(&lt;DIGIT&gt;)+。这没什么好继续的。
  • 什么意思?整数本身应该可以工作
  • 我的意思是你的问题不清楚,因为你没有明确说明需要接受哪些字符串。请改写问题,以更清楚应该接受和不应该接受的内容。

标签: javacc


【解决方案1】:

尝试在解析器规范文件中打开调试,例如:

OPTIONS {
  DEBUG_TOKEN_MANAGER=true
}

这将创建 TokenManager 在解析时所做的打印输出。

【讨论】:

    【解决方案2】:

    “4.”和 "4%%%%" 并没有真正被接受,因为你的解析器读取的总是 "4" 如果您在 OPTION 部分设置 DEBUG_PARSER = true;,您将看到当前读取的令牌。 我想如果你像这样改变你的语法,你可以看到它在读取未处理的字符时会抛出一个 TokenMgrError

        SimpleNode IntegerLiteral() :
        {
          Token t;
        }
        {
        (
            t=<DIGIT>
        {
            Integer n = new Integer(t.image);
            jjtThis.jjtSetValue( n );
            return jjtThis;
        })+
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2015-05-04
      • 1970-01-01
      • 2022-11-10
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多