对于以下规则:
switchBlockLabels
: ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* switchDefaultLabel? switchCaseLabel*)
;
我收到一个错误:“规则switchBlockLabels有非LL决策,因为递归规则调用可以从alts 1,2”到达。我尝试添加语法谓词来解决这个问题。我读了一本书“The Definitive ANTLR Reference” “。现在我很困惑,因为规则switchBlockLabels中没有替代品,所以不需要决定选择哪一个。 有人可以帮助我吗?
答案 0 :(得分:0)
每当树解析器偶然发现时,例如2 switchCaseLabel
s(中间没有switchDefaultLabel
),它就不知道这些switchCaseLabel
属于哪个。解析器可以选择3种可能性:
switchCaseLabel
匹配1 st switchCaseLabel*
; switchCaseLabel
匹配2 nd switchCaseLabel*
; switchCaseLabel
由1 st switchCaseLabel*
匹配,1由 nd switchCaseLabel*
匹配。由于解析器不喜欢为您选择,因此会发出错误。
你需要做这样的事情:
switchBlockLabels
: ^(SWITCH_BLOCK_LABEL_LIST switchCaseLabel* (switchDefaultLabel switchCaseLabel*)?)
;
这样,当只有switchCaseLabel
s而没有switchDefaultLabel
时,这些switchCaseLabel
将始终与第一个switchCaseLabel*
匹配:不再有歧义