我第一次使用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)*
}
错误出现在此行的(
之前,是否有人可以帮我理解这一点?
答案 0 :(得分:5)
你有(我认为)
void l_zero() : {} {
<TOKEN1> ( <SPACE> <TOKEN1> )*
}
问题是<SPACE>
可以跟随l_zero
。例如,某处可能有这样的制作
void someNonterminal() : {} {
l_zero() <SPACE> <YETANOTHERTOKEN>
}
假设l_zero
启动时的剩余输入是
<SOMETOKEN> <SPACE> ...
在使用<SOMETOKEN>
之后,解析器需要决定是进入循环还是从l_zero
返回。它不能根据下一个令牌来决定。这是错误消息告诉您的内容。
怎么办?
l_zero
之后的<TOKEN1>
后面的任何空格都不能跟着void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(2) <SPACE> <TOKEN1> )*
}
吗?如果是这样,解析器可以根据接下来的两个令牌决定是否进入循环。您可以使用以下任一方法解决冲突:
void l_zero() : {} {
<TOKEN1> ( LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1> )*
}
或
[1]
[2]
[3]