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)
这个错误就(在这一行之前产生,任何人都可以帮我理解这一点吗?
你有(我认为)
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)
| 归档时间: |
|
| 查看次数: |
1301 次 |
| 最近记录: |