(...)* 构造中的 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> )*  
}