JavaCC 中的选择冲突。考虑使用 3 个或更多的 Lookahead
Choice Conflict In JavaCC. Consider Using Lookahead of 3 or more
我目前正在尝试为一种简单的编程语言构建一个解析器。解析器生成正常,但显示此警告:
Warning: Choice conflict involving two expansions at
line 238, column 7 and line 239, column 7 respectively.
A common prefix is: "(" "("
Consider using a lookahead of 3 or more for earlier expansion.
发生错误的代码如下:
void condition(): {}
{
<NOT> condition() condition_prime()
| <LPAREN> condition() <RPAREN> condition_prime()
| expression() compare_ops() expression() condition_prime()
}
void condition_prime(): {}
{
logical_ops() condition() condition_prime() | {}
}
我这样做是为了消除左递归,但现在出现了警告。有什么方法可以避免此警告?
构建expression()
非终端的代码如下:
void expression(): {}
{
fragment() expression_prime()
}
void expression_prime(): {}
{
binary_arith_op() fragment() expression_prime() | {}
}
void fragment(): {}
{
<ID> (<LPAREN> args_list() <RPAREN>)?
| <MINUS> <ID>
| <NUM>
| <DIGIT>
| <TRUE>
| <FALSE>
| <LPAREN> expression() <RPAREN>
}
选择冲突的原因是在非终结符condition
的定义中有3个选择,第二个和第三个都可以以<LPAREN>
开头。这是因为 expression
可以以 <LPAREN>
.
开头
错误消息建议使用 3 或更多的前瞻。但是,将前瞻量更改为任何有限数量是不够的。例如,如果将它更改为 17,如果 condition
以左括号开头,后跟一个长度为 16 个或更多的表达式,那将是不够的。
你可以通过语法前瞻来解决这个问题。
我目前正在尝试为一种简单的编程语言构建一个解析器。解析器生成正常,但显示此警告:
Warning: Choice conflict involving two expansions at
line 238, column 7 and line 239, column 7 respectively.
A common prefix is: "(" "("
Consider using a lookahead of 3 or more for earlier expansion.
发生错误的代码如下:
void condition(): {}
{
<NOT> condition() condition_prime()
| <LPAREN> condition() <RPAREN> condition_prime()
| expression() compare_ops() expression() condition_prime()
}
void condition_prime(): {}
{
logical_ops() condition() condition_prime() | {}
}
我这样做是为了消除左递归,但现在出现了警告。有什么方法可以避免此警告?
构建expression()
非终端的代码如下:
void expression(): {}
{
fragment() expression_prime()
}
void expression_prime(): {}
{
binary_arith_op() fragment() expression_prime() | {}
}
void fragment(): {}
{
<ID> (<LPAREN> args_list() <RPAREN>)?
| <MINUS> <ID>
| <NUM>
| <DIGIT>
| <TRUE>
| <FALSE>
| <LPAREN> expression() <RPAREN>
}
选择冲突的原因是在非终结符condition
的定义中有3个选择,第二个和第三个都可以以<LPAREN>
开头。这是因为 expression
可以以 <LPAREN>
.
错误消息建议使用 3 或更多的前瞻。但是,将前瞻量更改为任何有限数量是不够的。例如,如果将它更改为 17,如果 condition
以左括号开头,后跟一个长度为 16 个或更多的表达式,那将是不够的。
你可以通过语法前瞻来解决这个问题。