假设我要解析这个字符串:ABAA和下一个语法:
public void parse_X() :
{}
{
(
LOOKAHEAD(parse_AA())
parse_AA()
|
parse_AB()
)*
}
public void parse_AA() :
{}
{ <A> <A> }
public void parse_AB() :
{}
{ <A> <B> }
很明显,没有歧义,也没有选择冲突,但是我收到一条警告声称第4行存在选择冲突。我的猜测是JavaCC不记得LOOKAHEAD(parse_AA() )失败,因此,parse_AA()无法跟随。
完整警告信息:
警告:第4行(...)*构造中的选择冲突。 扩展嵌套在构造之后的构造和扩展中 有共同的前缀,其中一个是:“A” 考虑使用2或更多的前瞻来进行嵌套扩展。解析器生成0错误和1个警告。
如何避免此警告? 有替代语法吗? (除了将公共&lt; A&gt;因子分解之外)
答案 0 :(得分:0)
尝试以下
public void parse_X() :
{}
{
((
LOOKAHEAD(parse_AA())
parse_AA()
|
parse_AB()
))*
}
如果这不起作用,问题是X后面有一些可以以<A>
开头的东西。
编辑。
由于这不起作用,请尝试以下方法:
public void parse_X() :
{}
{
( LOOKAHEAD( <A> )
(
LOOKAHEAD(parse_AA())
parse_AA()
|
parse_AB()
)
)*
}
请注意,所有这一切都将取消警告。你必须决定如何最好地处理语法中的模糊性。