为了账号安全,请及时绑定邮箱和手机立即绑定

如何修复解析错误(使用 LOOKAHEAD)

如何修复解析错误(使用 LOOKAHEAD)

胡说叔叔 2022-10-20 15:13:27
我的解析器生成器有问题(使用 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 但不明白他的用途是什么感谢您的帮助,因为我不明白:(
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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

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

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


查看完整回答
反对 回复 2022-10-20
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号