Отобразить целочисленный тип токена в строку в ANTLR4 - PullRequest
0 голосов
/ 26 августа 2018

Я новичок в ANTLR4.Я пытаюсь обработать игрушечный язык с именем Mo и распечатать текст токена и его тип.

Ниже приведен мой файл Mo.java:

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
import static org.antlr.v4.runtime.CharStreams.fromFileName;

public class Mo {

  public static void main (String [] args) {

    CharStream cs = null;

    try {
        cs = fromFileName(args[0]);  //load the file

    } catch (Exception e) {
            System.err.println("No input file: " + e.getMessage());
            return;
    } 


        MoLexer lexer = new MoLexer(cs);  //instantiate a lexer
        CommonTokenStream tokens = new CommonTokenStream(lexer); //scan stream for tokens
        MoParser parser = new MoParser(tokens);  //parse the tokens

        ParseTree tree = parser.molang(); // parse the content and get the tree

        MoWalker listener = new MoWalker();


        ParseTreeWalker walker = new ParseTreeWalker();
        walker.walk(listener,tree);
  }
}

, а это мой файл MoWalker.java:

public class MoWalker extends MoBaseListener {

public void enterMicrolang(MoParser.MolangContext ctx ) {

    for (int i = 0; i<ctx.children.size()-1; i++){

        Token representedToken = ((TerminalNodeImpl) ctx.getChild(i)).getSymbol();
        System.out.print("Token: "+representedToken.getText());
        int typee = representedToken.getType();
        System.out.println(" --- "+typee);
    }
}

public void exitMicrolang(MicroParser.MicrolangContext ctx ) {
        System.out.println( "Exiting R" );
  }
}

Моя проблема : Вместо того, чтобы печатать тип токена в виде целого числа, я хочу напечатать его имя.(то есть, если type INTLITERAL (== 4) вместо печати 4, я хочу напечатать INTLITERAL) I так что это post , но он использует класс Vocabulary.

Есть ли другой способ, например, что-то вроде getSymbolType(int type) ?

1 Ответ

0 голосов
/ 26 августа 2018

Vocabularyy.getSymbolicName принимает тип токена как целое число и возвращает имя связанного правила лексера в виде строки.Другими словами, он дает вам именно то, что вы хотите.

Чтобы получить словарный запас для вашего лексера, вы можете вызвать getVocabulary для вашего объекта лексера или использовать статическую переменную VOCABULARY для вашего класса лексера.,Итак:

int typee = representedToken.getType();
String typeName = MoLexer.VOCABULARY.getSymbolicName(typee);
System.out.println(" --- " + typeName);
...