如何解决解析错误(使用LOOKAHEAD)

时间:2019-04-24 16:22:05

标签: java compiler-construction javacc

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

我遇到此错误:

GraphRequest

因为我的代码的这一部分:

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.

也许是因为我在表达式“ |”的两边都有2个常数

我已经知道我可以使用LOOKAHEAD,但是请不要误解他的用途是什么

感谢您的帮助,因为我并不了解:(

1 个答案:

答案 0 :(得分:1)

自上而下的解析器(例如JavaCC构建的解析器)需要基于下一个令牌或接下来的几个令牌预先知道要采取哪种选择。为做出此决定而检查的令牌是“超前令牌”。

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

如果两个适用的选择均以相同的令牌开头,则该令牌无法帮助解析器决定采用哪种选择,因此它需要在前面至少再查找一个令牌。显然,除起始数字后面的POINT以外,其他任何内容都表明NUMBER必须与第二个选择匹配。假设number后不能跟POINT,则后面跟着起始数字的POINT表示NUMBER。在这种情况下,前瞻2就足够了。但是,如果number 后面是POINT,则解析器将不得不向前看才能做出决定。