Настройки для генерации AST Java SRC с использованием antlr4:
- Установите antlr4, вы можете использовать эту ссылку для этого.
- После установки загрузите грамматику JAVA отсюда .
Теперь сгенерируйте 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, вы можете обратиться к этой заметке QnA или напрямую обратиться к репозиторию , в котором у меня есть использовал gradle для создания проекта.
Надеюсь, это поможет. :)