This typing problem also seems to apply to any left-associative operator. For example when I define a rule :

ImpliesCondition: LogicalOr ({BinaryOp.left=current} =>op=('implies' | '\\implies') right=LogicalOr )*;

The resulting class "BinaryOp" has both left and right with type "LogicalOr" which means it cannot be recursive and have an ImpliesCondition on the left.

For the binary operators I think I can workaround it by using rules like:

ImpliesCondition: LogicalOr ({BinaryOp.left=current} =>op=('implies' | '\\implies') right=ImpliesCondition)?;

But I'm still pondering how to do that for my "Factor" rule above, and I'm not sure these rules should really be right-associative.