我正在尝试在JavaCC中制作以下生产规则但是我遇到了选择冲突错误。我知道如何使用预先修复它,但我认为我们不允许将它用于我们的任务。
void statement() #void:{}
{
<ID> (<ASSIGN>(expression() | <STRING> ))| <LEFTBRACKET>argument_list()<RIGHTBRACKET>
| <NOT>expression()
| <QUESTIONMARK><ID>
| <LEFTBRACE>(statement()<SEMICOLON>)*<RIGHTBRACE>
| <IF>condition()<THEN>statement() <-- Conflict, parser will always pick this one
| <IF>condition()<THEN>statement()<ELSE>statement() <--
| <WHILE>condition()<DO>statement()
| {}
}
任何想法都表示赞赏!
答案 0 :(得分:3)
这是JavaCC lookahead tutorial中经典的“悬空”问题。您应该使用具有可选if
的单个if-then-else
作品替换这两个else
作品;您还应该在LOOKAHEAD(1)
前添加else
,如下所示:
| <IF>condition()<THEN>statement()
| <IF>condition()<THEN>statement()<ELSE>statement()
变为
| <IF>condition()<THEN>statement() [LOOKAHEAD(1) <ELSE>statement()]