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

Joh*_*ohn 1 compiler-errors javacc bnf

我是第一次使用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.
Run Code Online (Sandbox Code Playgroud)

我已经调查了这一点,发现它是由于解析器不知道哪个是最合适的选择.

void l_zero() : {} {
 TOKEN1 ( TOKEN2 TOKEN1)*  
}
Run Code Online (Sandbox Code Playgroud)

这个错误就(在这一行之前产生,任何人都可以帮我理解这一点吗?

The*_*ell 5

你有(我认为)

void l_zero() : {} {
    <TOKEN1> ( <SPACE> <TOKEN1> )*  
}
Run Code Online (Sandbox Code Playgroud)

问题是a <SPACE>可以遵循l_zero.例如,某个地方可能会有这样的制作

void someNonterminal() : {} {
    l_zero() <SPACE> <YETANOTHERTOKEN>
}
Run Code Online (Sandbox Code Playgroud)

假设l_zero启动时的剩余输入是

<SOMETOKEN> <SPACE> ...
Run Code Online (Sandbox Code Playgroud)

消费后<SOMETOKEN>,解析器需要决定是进入循环还是返回l_zero.它不能根据下一个令牌来决定.这是错误消息告诉您的内容.


该怎么办?

是不是跟随a的任何空间l_zero都不能跟着<TOKEN1>?如果是这样,解析器可以根据接下来的两个令牌决定是否进入循环.您可以使用以下任一方法解决冲突:

void l_zero() : {} {
    <TOKEN1> ( LOOKAHEAD(2) <SPACE> <TOKEN1> )*  
}
Run Code Online (Sandbox Code Playgroud)

要么

void l_zero() : {} {
    <TOKEN1> ( LOOKAHEAD(<SPACE> <TOKEN1>) <SPACE> <TOKEN1> )*  
}
Run Code Online (Sandbox Code Playgroud)