我的解析器生成器(使用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,但是请不要误解他的用途是什么
感谢您的帮助,因为我并不了解:(
答案 0 :(得分:1)
自上而下的解析器(例如JavaCC构建的解析器)需要基于下一个令牌或接下来的几个令牌预先知道要采取哪种选择。为做出此决定而检查的令牌是“超前令牌”。
理想情况下,可以使用紧随其后的令牌做出决定;如果不是,则解析器需要缓冲后面的令牌,并且还需要具有更大的决策表。没有算法可以预测需要多少前瞻性令牌,因此JavaCC要求您告诉它。这就是这些错误消息要您执行的操作。
如果两个适用的选择均以相同的令牌开头,则该令牌无法帮助解析器决定采用哪种选择,因此它需要在前面至少再查找一个令牌。显然,除起始数字后面的POINT
以外,其他任何内容都表明NUMBER
必须与第二个选择匹配。假设number
后不能跟POINT
,则后面跟着起始数字的POINT
表示NUMBER
。在这种情况下,前瞻2就足够了。但是,如果number
后面是POINT
,则解析器将不得不向前看才能做出决定。