I have following (reduced) grammar:
grammar Test;
IDENTIFIER: [a-z]+ [a-zA-Z0-9]*;
WS: [ \t\n] -> skip;
compilationUnit:
field* EOF;
field:
type IDENTIFIER;
type:
(builtinType|complexType) ('[' ']')*;
builtinType:
'bool' | 'u8';
complexType:
IDENTIFIER;
And following program:
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
public class Main{
public static void main(String[] args){
TestLexer tl=new TestLexer(CharStreams.fromString("u8 foo bool bar complex baz complex[][] baz2"));
TestParser tp=new TestParser(new CommonTokenStream(tl));
TestParser.CompilationUnitContext cuc=tp.compilationUnit();
System.out.println("CompilationUnit:"+cuc);
for(var field:cuc.field()){
System.out.println("Field: "+field);
System.out.println("Field.type: "+ field.type());
System.out.println("Field.type.builtinType: "+field.type().builtinType());
System.out.println("Field.type.complexType: "+field.type().complexType());
if(field.type().complexType()!=null)
System.out.println("Field.type.complexType.IDENTIFIER: "+field.type().complexType().IDENTIFIER());
}
}
}
To differentiate complexType
and builtinType
, I can look, which is not-null.
But, if I want to distinguish between bool
and u8
, how can I do that?
This question would answer my question, but it is for Antlr3.