0

假设我要解析这个字符串: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 个警告。

我怎样才能避免这个警告?有替代语法吗?(除了分解常见的 < A > )

4

1 回答 1

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()
   )
  )*
 }

请注意,所有这一切都会抑制警告。您必须决定如何最好地处理语法中的歧义。

于 2013-10-11T02:52:20.923 回答