3

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

任何想法表示赞赏!

4

1 回答 1

3

这是JavaCC 前瞻教程中的经典“悬空其他”问题。您应该将两个产品替换为具有可选if的单个产品;您还应该在 前面添加,如下所示:if-then-elseelseLOOKAHEAD(1)else

| <IF>condition()<THEN>statement()
| <IF>condition()<THEN>statement()<ELSE>statement() 

变成

| <IF>condition()<THEN>statement() [LOOKAHEAD(1) <ELSE>statement()] 
于 2012-12-16T13:57:19.587 回答