如何避免JavaCC中的错误选择冲突警告?

时间:2013-10-10 20:16:21

标签: javacc

假设我要解析这个字符串: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;因子分解之外)

1 个答案:

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

请注意,所有这一切都将取消警告。你必须决定如何最好地处理语法中的模糊性。