如何从java src代码生成AST使用ANTLR?
有帮助吗?使用ANTLR为java源代码生成抽象语法树
回答
的setps使用antlr4生成Java SRC AST是:
- 安装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文件输出,使u能可视化的AST,那么你可以参考this QNA邮寄或直接引用这个repository在我所使用gradle这个来构建项目。
希望这会有所帮助。 :)
OK,这里的步骤:
- 去ANTLR Site现在下载最新版本是4.7
- 从here下载
Java.g
和JavaTreeParser.g
文件。 执行如下命令:
java -jar antlrTool Java.g java -jar antlrTool JavaTreeParser.g
5的文件将被生成:
- Java.tokens
- JavaLexer.java
- JavaParser.java
- JavaTreeParser.g
- JavaTreeParser.tokens
使用这个Java代码来生成抽象语法树,并打印:
String input = "public class HelloWord {"+
"public void print(String r){" +
"for(int i = 0;true;i+=2)" +
"System.out.println(r);" +
"}" +
"}";
CharStream cs = new ANTLRStringStream(input);
JavaLexer jl = new JavaLexer(cs);
CommonTokenStream tokens = new CommonTokenStream();
tokens.setTokenSource(jl);
JavaParser jp = new JavaParser(tokens);
RuleReturnScope result = jp.compilationUnit();
CommonTree t = (CommonTree) result.getTree();
CommonTreeNodeStream nodes = new CommonTreeNodeStream(t);
nodes.setTokenStream(tokens);
JavaTreeParser walker = new JavaTreeParser(nodes);
System.out.println("\nWalk tree:\n");
printTree(t,0);
System.out.println(tokens.toString());
}
public static void printTree(CommonTree t, int indent) {
if (t != null) {
StringBuffer sb = new StringBuffer(indent);
for (int i = 0; i < indent; i++)
sb = sb.append(" ");
for (int i = 0; i < t.getChildCount(); i++) {
System.out.println(sb.toString() + t.getChild(i).toString());
printTree((CommonTree)t.getChild(i), indent+1);
}
}
}
谢谢@Aboelnour。但是,你正在接受的页面不再存在。任何帮助? – 2014-08-22 06:23:15
另一个问题,如果JavaTreeParser.java不在生成的文件中,它来自哪里? – 2014-08-22 06:26:30
@MakanTayebi我认为这将有所帮助:https://github.com/antlr/grammars-v4 – ConductedClever 2017-08-07 20:23:08
- 1. antlr - 从java源代码生成语法
- 2. Antlr树语法生成Pmachine代码?
- 3. 使用ANTLR语法为if和for语句生成代码
- 4. 从定制设计的抽象语法树生成Python代码
- 5. 将Linux源代码解析为抽象语法树
- 6. 将java代码解析为抽象语法树
- 7. 使用CDT的抽象语法树API来生成/编写C代码?
- 8. 代表C#3在XML代码作为抽象语法树
- 9. Antlr 4在Java中生成分析树代码
- 10. ANTLR树语法 - >生成的java类有错误(getText)
- 11. 将抽象语法树转换为字节代码
- 12. ANTLR的树语法
- 13. 遍历抽象语法树
- 14. 开发抽象语法树
- 15. 增强抽象语法树
- 16. 打印抽象语法树
- 17. GCC抽象语法树
- 18. 抽象语法树问题
- 19. ANTLR - 如何使用生成的AST树?
- 20. Android源代码,Java跟踪,抽象类
- 21. 如何将ANTLR 4生成的AST转换为其源代码
- 22. ABNF语法到Java代码生成器?
- 23. ANTLR语法和生成的代码问题
- 24. Antlr语法生成无效的C#代码
- 25. ANTLR java测试文件无法创建树语法对象
- 26. 用ANTLR生成代码1.3/ANTLRWorks
- 27. 在antlr语法g4文件中使用Java代码
- 28. 如何将由gcc生成的抽象语法树转储为.dot文件?
- 29. 抽象语法树与对象模型
- 30. 将Antlr语法树转换为有用的对象
方式太宽泛。从ANTLR教程开始,或寻找现有的语法。 – millimoose 2012-02-05 20:17:13
获取Java语法。通过ANTLR生成的类运行Java源代码。不过,可能会更容易使用Eclipse的东西。 – 2012-02-05 20:21:51
你可以请发布任何有用的链接或教程?谢谢 – Aboelnour 2012-02-05 23:03:49