Làm thế nào tôi có thể tạo một AST từ mã java src bằng cách sử dụng ANTLR?
bất kỳ trợ giúp nào?Tạo một cây cú pháp trừu tượng cho mã nguồn java bằng cách sử dụng ANTLR
Trả lời
Các setps để tạo java src AST sử dụng antlr4 là:
- Install antlr4 bạn có thể sử dụng liên kết this để làm điều đó.
- Sau khi cài đặt tải xuống JAVA grammar from here.
Bây giờ tạo Java8Lexer và Java8Parser sử dụng lệnh:
antlr4 -visitor Java8.g4
này sẽ tạo ra một số tác phẩm như
Java8BaseListener.java
Java8BaseVisitor.java
Java8Lexer.java
Java8Lexer.tokens
Java8Listener.java
Java8Parser.java
Java8.tokens
Java8Visitor.java
Sử dụng mã này để tạo ra 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));
}
}
}
}
Sau khi mã hóa xong, bạn có thể dùng gradle để xây dựng dự án hoặc tải antlr-4.7.1-complete.jar vào thư mục dự án và bắt đầu biên dịch.
Nếu bạn muốn đầu ra trong tệp DOT để bạn có thể trực quan hóa AST, bạn có thể tham khảo this Bài đăng QnA hoặc trực tiếp tham chiếu đến repository trong đó tôi đã sử dụng gradle để xây dựng dự án.
Hy vọng điều này sẽ hữu ích. :)
OK, sau đây là các bước:
- đi đến ANTLR Site và tải phiên bản mới nhất hiện nay đó là 4,7
- Tải
Java.g
vàJavaTreeParser.g
tập tin từ here. Chạy các lệnh sau:
java -jar antlrTool Java.g java -jar antlrTool JavaTreeParser.g
5 file sẽ được tạo:
- Java.tokens
- JavaLexer.java
- JavaParser.java
- JavaTreeParser.g
- JavaTreeParser.tokens
sử dụng mã java này để tạo cú pháp trừu tượng Tree và in nó:
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);
}
}
}
Cảm ơn @Aboelnour. Nhưng trang bạn đang cố gắng không tồn tại nữa. bất kỳ giúp đỡ? –
Một câu hỏi khác, nếu JavaTreeParser.java không nằm trong số các tệp được tạo, nó xuất phát từ đâu? –
@MakanTayebi Tôi nghĩ rằng điều này sẽ giúp: https://github.com/antlr/grammars-v4 – ConductedClever
- 1. Chuyển đổi cây cú pháp trừu tượng sang mã byte
- 2. Cây cú pháp trừu tượng là gì?
- 3. Lấy biểu đồ luồng điều khiển từ Cây cú pháp trừu tượng
- 4. Cách sử dụng Reader Monad khi duyệt qua một cây cú pháp trừu tượng
- 5. Sử dụng API cú pháp trừu tượng của CDT để tạo/viết mã C?
- 6. Khi nào nên sử dụng cây cú pháp trừu tượng hoặc cụ thể?
- 7. Làm cách nào để giảm cây phân tích cú pháp của tôi thành cây cú pháp trừu tượng?
- 8. Định dạng chuẩn cho cây cú pháp cụ thể và trừu tượng
- 9. C# ANTLR ngữ pháp?
- 10. Tải động của biểu thức cú pháp trừu tượng Haskell
- 11. Phân tích cú pháp nguồn Java với Scala
- 12. Việc sử dụng tạo một hàm tạo cho một lớp trừu tượng trong Java là gì?
- 13. Làm cách nào để thiết kế các phần của cây cú pháp trừu tượng?
- 14. Clang: AST (cây cú pháp trừu tượng) trông như thế nào?
- 15. Sử dụng ANTLR để phân tích tĩnh tệp nguồn Java
- 16. Truy cập cây cú pháp trừu tượng của động cơ V8
- 17. Cách phân tích cú pháp XML thành đối tượng java bằng cách sử dụng XStream
- 18. Tạo mã cho sáng tác bằng cách sử dụng Eclipse
- 19. Tạo mã Scala từ Antlr
- 20. Ngữ pháp ANTLR cho Scala?
- 21. Tạo mã phân tích cú pháp java và đánh giá nó để thử nghiệm
- 22. cách phân tích chuỗi thành cây cú pháp bằng GADT
- 23. Tạo mã nguồn Java Maven cho Hibernate
- 24. Tạo cây cú pháp cho phép toán đơn giản
- 25. Mã nguồn cho trình biên dịch java ở đâu?
- 26. Tìm hiểu các cây trong ANTLR
- 27. Cách thực hiện khớp chuỗi Java bằng cách sử dụng Cú pháp tìm kiếm Boolean?
- 28. Trình phân tích cú pháp cây trong ANTLR là gì và tôi có bị buộc phải viết một cái không?
- 29. cách phân tích cú pháp xml thành đối tượng java?
- 30. Phương pháp trừu tượng ghi đè phương pháp trừu tượng
Cách quá rộng. Bắt đầu với hướng dẫn ANTLR hoặc tìm kiếm các ngữ pháp hiện có. – millimoose
Nhận ngữ pháp Java.Chạy nguồn Java thông qua các lớp do ANTLR tạo ra. Có thể dễ dàng hơn để sử dụng các công cụ Eclipse, mặc dù. –
bạn có thể vui lòng đăng bất kỳ liên kết hoặc hướng dẫn hữu ích nào không? Cảm ơn – Aboelnour