(...)* 构造中的 JAVACC 错误选择冲突
JAVACC ERROR choice conflict in (...)* construct
我是第一次使用javacc。
我不断收到此错误:
Warning: Choice conflict in (...)* construct at line 35, column 43.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <SPACE>
Consider using a lookahead of 2 or more for nested expansion.
我已经调查过了,发现这是由于解析器不知道哪个是最合适的选择。
void l_zero() : {} {
TOKEN1 ( TOKEN2 TOKEN1)*
}
错误出现在这一行的 (
之前,请问有人能帮我正确理解吗?
你有(我认为)
void l_zero() : {} {
<TOKEN1> ( <SPACE> <TOKEN1> )*
}
问题是 <SPACE>
可以跟在 l_zero
之后。例如,某处可能有这样的作品
void someNonterminal() : {} {
l_zero() <SPACE> <YETANOTHERTOKEN>
}
假设l_zero
开始时剩余的输入是
<SOMETOKEN> <SPACE> ...
在使用完 <SOMETOKEN>
之后,解析器需要决定是进入循环还是从 l_zero
进入 return。它不能根据下一个令牌来决定。这就是错误消息告诉您的内容。
怎么办?
是不是跟在l_zero
后面的任何space都不能跟着<TOKEN1>
?如果是这样,解析器可以根据接下来的两个标记来决定是否进入循环。您可以使用以下任一方法解决冲突:
void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(2) <SPACE> <TOKEN1> )*
}
或
void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1> )*
}
我是第一次使用javacc。
我不断收到此错误:
Warning: Choice conflict in (...)* construct at line 35, column 43.
Expansion nested within construct and expansion following construct
have common prefixes, one of which is: <SPACE>
Consider using a lookahead of 2 or more for nested expansion.
我已经调查过了,发现这是由于解析器不知道哪个是最合适的选择。
void l_zero() : {} {
TOKEN1 ( TOKEN2 TOKEN1)*
}
错误出现在这一行的 (
之前,请问有人能帮我正确理解吗?
你有(我认为)
void l_zero() : {} {
<TOKEN1> ( <SPACE> <TOKEN1> )*
}
问题是 <SPACE>
可以跟在 l_zero
之后。例如,某处可能有这样的作品
void someNonterminal() : {} {
l_zero() <SPACE> <YETANOTHERTOKEN>
}
假设l_zero
开始时剩余的输入是
<SOMETOKEN> <SPACE> ...
在使用完 <SOMETOKEN>
之后,解析器需要决定是进入循环还是从 l_zero
进入 return。它不能根据下一个令牌来决定。这就是错误消息告诉您的内容。
怎么办?
是不是跟在l_zero
后面的任何space都不能跟着<TOKEN1>
?如果是这样,解析器可以根据接下来的两个标记来决定是否进入循环。您可以使用以下任一方法解决冲突:
void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(2) <SPACE> <TOKEN1> )*
}
或
void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1> )*
}