David Johns
David Johns

Reputation: 1231

ANTLR ambiguous reference

When I compile the following ANTLR grammar file,

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

I get the following error message.

error(132): nesC.g:769:109: reference $conditional_expression is ambiguous; rule conditional_expression is enclosing rule and referenced in the production (assu ming enclosing rule)

Can anybody tell me the solution to this? Thanks. :-)

Upvotes: 2

Views: 420

Answers (1)

Bart Kiers
Bart Kiers

Reputation: 170158

ANTLR cannot decide what you mean by $conditional_expression: the rule itself, or the one you labeled $rhs.

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

To get it working as you now tried, you'll need to move rhs=conditional_expression to a rule of its own, in which case there is no ambiguous naming:

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

rhs
  :  conditional_expression
  ;

But wouldn't this also do the trick for you:

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

or:

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

?

Upvotes: 2

Related Questions