2011-07-22 214 views
2

當我編譯下面ANTLR語法文件,ANTLR曖昧參考

conditional_expression 
    : (logical_or_expression -> logical_or_expression) ('?' expression ':' rhs=conditional_expression -> ^('?' $conditional_expression expression $rhs))? 
    ; 

我收到以下錯誤消息。

錯誤(132):nesC.g:769:109:參考$ conditional_expression是 曖昧;規則條件表達式包含在生產中引用的規則和 (包含規則)

有人可以告訴我解決方案嗎?謝謝。 :-)

回答

2

ANTLR無法決定您的意思是$conditional_expression:規則本身,還是您標記爲$rhs的那個。

conditional_expression // <--- this one? 
    : (logical_or_expression -> logical_or_expression) 
    ('?' expression ':' rhs=conditional_expression -> ^('?' $conditional_expression expression $rhs))? 
          // ^
          //  | 
          //  +--- or this one? 
    ; 

得到它的工作,你現在嘗試,你需要移動rhs=conditional_expression到它自己的規則,在這種情況下,沒有模棱兩可的命名:

conditional_expression 
    : (logical_or_expression -> logical_or_expression) 
    ('?' expression ':' rhs -> ^('?' $conditional_expression expression rhs))? 
    ; 

rhs 
    : conditional_expression 
    ; 

,但不會這也做的伎倆爲您提供:

conditional_expression 
    : (e=logical_or_expression      -> logical_or_expression) 
    ('?' if_true=expression ':' if_false=expression -> ^('?' $e $if_true $if_false))? 
    ; 

或:

conditional_expression 
    : (e=logical_or_expression            -> logical_or_expression) 
    ('?' if_true=conditional_expression ':' if_false=conditional_expression -> ^('?' $e $if_true $if_false))? 
    ;