将令牌类型整数映射到ANTLR4中的字符串

时间:2018-08-26 16:04:36

标签: java token antlr4

我是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) 我很喜欢这个post,但是它使用了Vocabulary类。

还有其他方法吗,就像getSymbolType(int type) ?

1 个答案:

答案 0 :(得分:0)

Vocabularyy.getSymbolicName采用令牌类型作为整数,并以字符串形式返回相关词法分析器规则的名称。因此,换句话说,它可以为您提供所需的确切信息。

要了解词法分析器的词汇表,可以在词法分析器对象上调用getVocabulary或在词法分析器类上使用静态变量VOCABULARY。所以:

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