ANTLR含糊不清的参考文献

时间:2011-07-22 06:59:09

标签: 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是   暧昧;规则conditional_expression是封闭规则和   在生产中引用(保证附上规则)

有人可以告诉我解决方法吗?谢谢。 : - )

1 个答案:

答案 0 :(得分: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))?
  ;