Java 如何使用ANTLR v4标记化代码

Java 如何使用ANTLR v4标记化代码,java,parsing,antlr,antlr4,Java,Parsing,Antlr,Antlr4,一开始我想为我的英语不好道歉。 我制作webApp,我的任务是标记Java代码。我找到了像Antlrv4这样的工具,并尝试实现它 public class Tokenizer { public void tokenizer(String code) { ANTLRInputStream in = new ANTLRInputStream(code); Java8Lexer lexer = new Java8Lexer(in); List<? extends To

一开始我想为我的英语不好道歉。 我制作webApp,我的任务是标记Java代码。我找到了像Antlrv4这样的工具,并尝试实现它

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");
    }
  }
}
公共类标记器{
公共无效标记器(字符串代码){
AntlInputStream in=新的AntlInputStream(代码);
Java8Lexer-lexer=新的Java8Lexer(in);

List该
标记
类包含几个方法,包括

int getLine();
int getCharPositionInLine();

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

令牌类包含几个方法,包括

int getLine();
int getCharPositionInLine();
将令牌与相应的源关联。

使用

token.getText()
您应该获得令牌所代表的解析文本

此外,您应该通过以下方式获取令牌的名称:

lexer.getVocabulary().getSymbolicName(token.getType())
使用

您应该获得令牌所代表的解析文本

此外,您应该通过以下方式获取令牌的名称:

lexer.getVocabulary().getSymbolicName(token.getType())

这里面临的问题是,您希望在输出中混合使用令牌和规则。例如,
VARIABLE\u DECLARATION
实际上是一个解析器规则,而
IDENTIFIER ASSIGN IDENTIFIER
由3个lexer规则组成。您可以使用令牌流打印识别的lexem,但这不会给您任何解析器规则


相反,您可以尝试打印返回的解析树,当您对输入执行真正的解析运行时(请参见
ParseTree.toString()
)会得到该树。您可以使用解析器侦听器遍历解析树,并将其与属于规则(上下文)的文本一起转换为规则描述流.

您在这里面临的问题是您希望在输出中混合使用令牌和规则。例如,
变量声明
实际上是一个解析器规则,而
标识符分配标识符
由3个词法规则组成。您可以使用令牌流打印识别的词法,但这不会给您任何解析器规则


相反,您可以尝试打印返回的解析树,当您对输入执行真正的解析运行时(请参见
ParseTree.toString()
)会得到该树。您可以使用解析器侦听器遍历解析树,并将其与属于规则(上下文)的文本一起转换为规则描述流.

您好,谢谢您的回答。代码如下:'public void tokenizer(字符串代码){antlInputStream in=new antlInputStream(代码);Java8Lexer lexer=new Java8Lexer(代码);ListI将您的代码复制到我的代码中,以使用ANTLR4 Java8语法运行。输出提供以下内容:标识符标识符SEMI INT标识符SEMI标识符ASSIGN IntegerLiteral SEMI IF LPAREN标识符GT IntegerLiteral RPAREN LBRACE标识符ASSIGN StringLiteral SEMI RBRACE ELSE LBRACE标识符ASSIGN StringLiteral SEMI R如果您想提取更多抽象知识,如示例所示,您必须解析令牌流,并通过树行者遍历解析树。解析器还有一个要查询的词汇表。您好,谢谢您的回答。代码如下:'public void tokenizer(String code){antlriputstream in=new antlriputstream(code);Java8Lexer lexer=新的Java8Lexer(in);ListI将您的代码复制到我的代码中,以使用ANTLR4 Java8语法运行。输出提供以下内容:标识符标识符SEMI INT标识符SEMI标识符ASSIGN IntegerLiteral SEMI IF LPAREN标识符GT IntegerLiteral RPAREN LBRACE标识符ASSIGN StringLiteral SEMI RBRACE ELSE LBRACE标识符ASSIGN StringLiteral SEMI R如果你想提取更多的抽象知识,如你的例子所示,你必须解析令牌流,并通过树行者遍历解析树。解析器还有一个词汇表要查询。