gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:58:11 24 4
gpt4 key购买 nike

我的解析器生成器(使用 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 但不明白他的用途是什么

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

最佳答案

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

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

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

关于java - 如何修复解析错误(使用 LOOKAHEAD),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55834583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com