Question

Assume there is a rule about 'type'. It is either a predefined type (referred by IDENTIFIER) or a typeDescriptor.

type
:   IDENTIFIER
|   typeDescriptor
;

In my program, I have got an instance of typeContext 'ctx'. How do I know if the path IDENTIFIER is chosen, or typeDescriptor is chosen.

I recognise one way which is to test ctx.IDENTIFIER() == null and ctx.typeDescriptor() == null. But it seems not working very well when there are a lot more alternatives. Is there a way to return an index to indicate which rule is chosen? Thanks.

Was it helpful?

Solution

No, you can either use the method you described (checking if an item is non-null), or you can label the outer alternatives of the rule using the # operator.

type
  : IDENTIFIER     # someType
  | typeDescriptor # someOtherType
  ;

When you label the outer alternatives, it will produce ParserRuleContext classes for each of the labels. In the example above, you'll either get a SomeTypeContext or a SomeOtherTypeContext, which applies equally to the generated listener and visitor interfaces.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top