(...)*构造中的JAVACC ERROR选择冲突

时间:2016-04-21 09:41:18

标签: compiler-errors bnf javacc

我第一次使用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)*  
}

错误出现在此行的(之前,是否有人可以帮我理解这一点?

1 个答案:

答案 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]
相关问题