Antlr4 - получить имя токена - PullRequest
1 голос
/ 05 августа 2020

У меня следующая (сокращенная) грамматика:

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;

И следующая программа:

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());
        }
    }
}

Чтобы различать complexType и builtinType, я могу посмотреть, что не -ноль. Но если я хочу различать guish между bool и u8, как я могу это сделать? Этот вопрос ответил бы на мой вопрос, но он для Antlr3.

1 Ответ

1 голос
/ 05 августа 2020

Используйте альтернативные метки :

builtinType
 : 'bool' #builtinTypeBool
 | 'u8'   #builtinTypeU8
 ;

и / или определите эти токены в лексере:

builtinType
 : BOOL
 | U8
 ;

BOOL : 'bool';
U8   : 'u8';

, чтобы вам было легче проверить тип токена в посетителе / ​​слушателе:

YourParser.BuiltinTypeContext ctx = ...
        
if (ctx.start.getType() == YourLexer.BOOL) {
  // it's a BOOL token
}
...