无需预测即可删除选择冲突 - JavaCC

时间:2012-12-16 13:52:08

标签: java regex compiler-construction javacc

我正在尝试在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()
| {}
}

任何想法都表示赞赏!

1 个答案:

答案 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()]