【问题标题】:How to fix parsing error (Using LOOKAHEAD)如何修复解析错误(使用 LOOKAHEAD)
【发布时间】:2019-04-24 16:22:04
【问题描述】:

我的解析器生成器有问题(使用 javaCC)

我有这个错误:

Warning: Choice conflict involving two expansions at
     line 119, column 3 and line 119, column 43 respectively.
     A common prefix is: <CONSTANT>
     Consider using a lookahead of 2 for earlier expansion.
Warning: Choice conflict involving two expansions at
         line 119, column 3 and line 119, column 43 respectively.
         A common prefix is: <CONSTANT>
         Consider using a lookahead of 2 for earlier expansion.

因为我的这部分代码:

TOKEN : /* OPERATORS */
{
  < POINT : "." >
| < VIRGULE : "," >
}

TOKEN :
{
  < CONSTANT : (< DIGIT >)+ >
| < STRING : ( ["A"-"Z","a"-"z"] )+ >
| < #DIGIT : [ "0"-"9" ] >
}

void number() :
{
}
{
  (< CONSTANT > < POINT > < CONSTANT >) | (< CONSTANT >)
}

也许是因为我的表达式“|”两边都有 2 CONSTANT

我已经看到我可以使用 LOOKAHEAD 但不明白他的实用性是什么

感谢您的帮助,因为我不明白:(

【问题讨论】:

    标签: java compiler-construction javacc


    【解决方案1】:

    自上而下的解析器,例如 JavaCC 构建的解析器,需要根据下一个标记或接下来的几个标记提前知道要采取的选择。检查以做出此决定的令牌是“前瞻令牌”。

    理想情况下,可以使用紧随其后的令牌做出决定;如果没有,解析器需要缓冲以下标记,并且还需要有一个更大的决策表。没有算法可以预测需要多少前瞻令牌,因此 JavaCC 要求您告诉它。这就是那些错误消息要求您执行的操作。

    如果两个适用的选项以相同的标记开头,那么该标记无法帮助解析器决定采取哪个选项,因此它需要至少再查看一个标记。很明显,除了POINT 之外的任何其他数字都表明NUMBER 必须与第二个选项匹配。假设number后面不能跟POINT,那么在初始数字后面的POINT表示NUMBER。在这种情况下,前瞻 2 就足够了。然而,如果number 可以跟在POINT 之后,那么解析器将不得不进一步向前看才能做出决定。

    【讨论】:

      猜你喜欢
      • 2016-11-13
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2021-06-02
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      相关资源
      最近更新 更多