Antlr 添加语法谓词

Antlr 添加语法谓词,antlr,Antlr,对于以下规则: switchBlockLabels : ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*) ; 我遇到了一个错误:“由于可以从alts 1,2访问递归规则调用,所以rule switchBlockLabels具有非LL描述”。我尝试添加语法谓词来解决这个问题。我读了《确定的ANTLR参考》一书。现在我很困惑,因为rule switchBlockLabels中没有

对于以下规则:

 switchBlockLabels

:   ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*)
;
我遇到了一个错误:“由于可以从alts 1,2访问递归规则调用,所以rule switchBlockLabels具有非LL描述”。我尝试添加语法谓词来解决这个问题。我读了《确定的ANTLR参考》一书。现在我很困惑,因为rule switchBlockLabels中没有替代品,那么就不需要决定选择哪一个了。
有人能帮我吗?

每当树解析器偶然发现2
switchCaseLabel
s(中间没有
switchDefaultLabel
),它都不知道这些
switchCaseLabel
属于哪个。解析器可以从以下三种可能性中进行选择:

  • 2
    switchCaseLabel
    s与第一个
    switchCaseLabel*
    匹配
  • 2
    switchCaseLabel
    s与第二个
    switchCaseLabel*
    匹配
  • 1
    switchCaseLabel
    与第一个
    switchCaseLabel*
    匹配,一个与第二个
    switchCaseLabel*
    匹配
由于解析器不喜欢为您选择,因此它会发出一个错误

您需要这样做:

switchBlockLabels
 : ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* (switchDefaultLabel switchCaseLabel*)?)
 ;
这样,当只有
switchCaseLabel
s而没有
switchDefaultLabel
时,这些
switchCaseLabel
s将始终与第一个
switchCaseLabel*
匹配:不再存在歧义