2011-07-22 163 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))? 
    ;