Reputation: 1231
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
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