如何使用ANTLR v4对代码进行标记化

时间:2017-05-16 07:42:54

标签: java parsing antlr antlr4

一开始我想为我糟糕的英语道歉。 我制作webApp和我的任务我需要做的是标记化Java代码。我找到了像ANTLR v4这样的工具,我试图实现它。

public class Tokenizer {
  public void tokenizer(String code) {
    ANTLRInputStream in = new ANTLRInputStream(code);
    Java8Lexer lexer = new Java8Lexer(in);
    List<? extends Token> tokenList = new ArrayList<>();
    tokenList = lexer.getAllTokens();
    for(Token token : tokenList){
      System.out.println("Next token :" + token.getType() + "\n");
    }
  }
}

此代码在具有令牌类型数量的int的屏幕列表上打印。 我需要这样的东西:

enter image description here

代码中包含类似“注释”的代码。 我怎样才能得到这个结果? 我有这个语法:https://github.com/antlr/grammars-v4/tree/master/java8

3 个答案:

答案 0 :(得分:0)

Token类包含多种方法,包括

int getLine();
int getCharPositionInLine();

将令牌与相应的源相关联。

答案 1 :(得分:0)

使用

token.getText()

你应该得到令牌代表的解析文本。

此外,您应该通过

获取令牌的名称
lexer.getVocabulary().getSymbolicName(token.getType())

答案 2 :(得分:0)

您在这里遇到的问题是您希望在输出中混合使用令牌和规则。例如,VARIABLE_DECLARATION实际上是解析器规则,而IDENTIFIER ASSIGN IDENTIFIER由3个词法分析器规则组成。您可以使用令牌流来打印已识别的词汇,但这不会为您提供任何解析器规则。

你可以尝试的是打印返回解析树,当你对输入进行真正的解析运行时就会得到它(参见ParseTree.toString())。您可以使用解析器侦听器来遍历解析树,并将其转换为规则描述流以及属于规则(上下文)的文本。