如何修复解析错误(使用 LOOKAHEAD)
How to fix parsing error (Using LOOKAHEAD)
我的解析器生成器(使用 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 构建的解析器,需要根据下一个标记或接下来的几个标记提前知道选择哪个。为做出此决定而检查的令牌是 "lookahead tokens"。
理想情况下,可以使用紧随其后的令牌做出决定;如果不是,解析器需要缓冲后面的标记,它还需要有一个更大的决定 table。没有算法可以预测需要多少先行标记,因此 JavaCC 要求您告诉它。这就是那些错误消息要求您执行的操作。
如果两个适用的选择以相同的标记开头,那么该标记无法帮助解析器决定采用哪个选择,因此它需要至少再看一个标记。显然,除了 POINT
之外的任何跟在初始数字后面的数字都表示 NUMBER
必须与第二个选择相匹配。假设 number
后面不能跟 POINT
,那么在初始数字后面的 POINT
表示 NUMBER
。在这种情况下,前瞻 2 就足够了。但是,如果 number
可以 后跟 POINT
,那么解析器将不得不向前看才能做出决定。
我的解析器生成器(使用 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 构建的解析器,需要根据下一个标记或接下来的几个标记提前知道选择哪个。为做出此决定而检查的令牌是 "lookahead tokens"。
理想情况下,可以使用紧随其后的令牌做出决定;如果不是,解析器需要缓冲后面的标记,它还需要有一个更大的决定 table。没有算法可以预测需要多少先行标记,因此 JavaCC 要求您告诉它。这就是那些错误消息要求您执行的操作。
如果两个适用的选择以相同的标记开头,那么该标记无法帮助解析器决定采用哪个选择,因此它需要至少再看一个标记。显然,除了 POINT
之外的任何跟在初始数字后面的数字都表示 NUMBER
必须与第二个选择相匹配。假设 number
后面不能跟 POINT
,那么在初始数字后面的 POINT
表示 NUMBER
。在这种情况下,前瞻 2 就足够了。但是,如果 number
可以 后跟 POINT
,那么解析器将不得不向前看才能做出决定。