antlr添加句法谓词

时间:2011-10-29 07:00:31

标签: antlr

对于以下规则:

 switchBlockLabels

:   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*)
;

我收到一个错误:“规则switchBlockLabels有非LL决策,因为递归规则调用可以从alts 1,2”到达。我尝试添加语法谓词来解决这个问题。我读了一本书“The Definitive ANTLR Reference” “。现在我很困惑,因为规则switchBlockLabels中没有替代品,所以不需要决定选择哪一个。 有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

每当树解析器偶然发现时,例如2 switchCaseLabel s(中间没有switchDefaultLabel),它就不知道这些switchCaseLabel属于哪个。解析器可以选择3种可能性:

  • 2 switchCaseLabel匹配1 st switchCaseLabel*;
  • 2 switchCaseLabel匹配2 nd switchCaseLabel*;
  • 1 switchCaseLabel由1 st switchCaseLabel*匹配,1由 nd switchCaseLabel*匹配。

由于解析器不喜欢为您选择,因此会发出错误。

你需要做这样的事情:

switchBlockLabels
 : ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* (switchDefaultLabel switchCaseLabel*)?)
 ;

这样,当只有switchCaseLabel s而没有switchDefaultLabel时,这些switchCaseLabel将始终与第一个switchCaseLabel*匹配:不再有歧义