antlr java_使用ANTLR为java源代码生成抽象语法树

使用antlr4生成java src AST的setps是:

>安装antlr4你可以使用this链接来做到这一点.

>安装后下载JAVA grammar from here.

>现在使用以下命令生成Java8Lexer和Java8Parser:

antlr4 -visitor Java8.g4

>这将生成几个文件,如Java8BaseListener.java Java8BaseVisitor.java Java8Lexer.java Java8Lexer.tokens Java8Listener.java Java8Parser.java Java8.tokens Java8Visitor.java

使用此代码生成AST:

import java.io.File;

import java.io.IOException;

import java.nio.charset.Charset;

import java.nio.file.Files;

import org.antlr.v4.runtime.ANTLRInputStream;

import org.antlr.v4.runtime.CommonTokenStream;

import org.antlr.v4.runtime.ParserRuleContext;

import org.antlr.v4.runtime.RuleContext;

import org.antlr.v4.runtime.tree.ParseTree;

public class ASTGenerator {

public static String readFile() throws IOException {

File file = new File("path/to/the/test/file.java");

byte[] encoded = Files.readAllBytes(file.toPath());

return new String(encoded, Charset.forName("UTF-8"));

}

public static void main(String args[]) throws IOException {

String inputString = readFile();

ANTLRInputStream input = new ANTLRInputStream(inputString);

Java8Lexer lexer = new Java8Lexer(input);

CommonTokenStream tokens = new CommonTokenStream(lexer);

Java8Parser parser = new Java8Parser(tokens);

ParserRuleContext ctx = parser.classDeclaration();

printAST(ctx, false, 0);

}

private static void printAST(RuleContext ctx, boolean verbose, int indentation) {

boolean toBeIgnored = !verbose && ctx.getChildCount() == 1 && ctx.getChild(0) instanceof ParserRuleContext;

if (!toBeIgnored) {

String ruleName = Java8Parser.ruleNames[ctx.getRuleIndex()];

for (int i = 0; i < indentation; i++) {

System.out.print(" ");

}

System.out.println(ruleName + " -> " + ctx.getText());

}

for (int i = 0; i < ctx.getChildCount(); i++) {

ParseTree element = ctx.getChild(i);

if (element instanceof RuleContext) {

printAST((RuleContext) element, verbose, indentation + (toBeIgnored ? 0 : 1));

}

}

}

}

完成编码后,您可以使用gradle构建项目,也可以在项目目录中下载antlr-4.7.1-complete.jar并开始编译.

如果你想要一个DOT文件中的输出,以便你可以看到AST然后你可以参考this QnA帖子或直接参考我使用gradle来构建项目的repository.

希望这可以帮助. ?


版权声明:本文为weixin_32306683原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。