Tôi đang cố gắng sử dụng Antlr cho một số hàm văn bản giống như IDE - phân tích cụ thể một tệp để xác định các điểm để xếp mã và áp dụng tô sáng cú pháp.Tìm hiểu các cây trong ANTLR
Câu hỏi đầu tiên - là Antlr có phù hợp với yêu cầu này hay không hoặc có quá mức không? Bạn có thể đạt được bằng cách sử dụng regex và/hoặc trình phân tích cú pháp được cuộn bằng tay ... nhưng có vẻ như Antlr đang ở đó để thực hiện công việc này cho tôi.
Tôi đã xem qua ... và tài nguyên hướng dẫn tuyệt vời here.
Tôi đã quản lý để xây dựng một ngữ pháp Java (sử dụng standard grammar) và nhận mọi thứ được phân tích gọn gàng gọn gàng thành một cái cây. Tuy nhiên, tôi đã mong đợi để xem các yếu tố được lồng trong cây. Trong thực tế thực tế, mọi thứ đều là một đứa trẻ của yếu tố hàng đầu.
Ví dụ: Given:
package com.example
public class Foo {
String myString = "Hello World"
// etc
}
Tôi đã mong đợi nút cây cho Foo là con của nút cho khai báo gói. Tương tự như vậy, myString sẽ là con của Foo.
Thay vào đó, tôi thấy rằng Foo
và myString
(và mọi thứ khác cho vấn đề đó) đều là con của package
.
Dưới đây là đoạn trích có liên quan thực hiện các phân tích cú pháp:
public void init() throws Exception {
CharStream c = new ANTLRFileStream(
"src/com/inversion/parser/antlr/Test.code");
Lexer lexer = new JavaLexer(c);
CommonTokenStream tokens = new CommonTokenStream(lexer);
JavaParser parser = new JavaParser(tokens);
parser.setTreeAdaptor(adaptor);
compilationUnit_return result = parser.compilationUnit();
}
static final TreeAdaptor adaptor = new CommonTreeAdaptor() {
public Object create(Token payload) {
if (payload != null)
{
System.out.println("Create " + JavaParser.tokenNames[payload.getType()] + ": L" + payload.getLine() + ":C" + payload.getCharPositionInLine() + " " + payload.getText());
}
return new CommonTree(payload);
}
};
Kiểm tra result.getTree()
lợi nhuận một trường hợp CommonTree
, có con là kết quả của các phân tích cú pháp.
giá trị dự kiến (có lẽ không đúng cách)
package com.example (4 tokens)
|
+-- public class Foo (3 tokens)
|
+--- String myString = "Hello World" (4 tokens)
+--- Comment "// etc"
(hoặc một cái gì đó tương tự)
Giá trị thực tế (Tất cả các giá trị này là con của nút gốc của result.getTree()
)
package
com
.
example
public
class
Foo
String
myString
=
"Hello World"
Sự hiểu biết của tôi về cách thức hoạt động chính xác?
Tôi là một noob hoàn chỉnh tại Antlr cho đến nay và tôi đang tìm đường cong học tập khá dốc.
Bạn có thể hiển thị cây khi bạn tìm thấy cây và cây như bạn mong đợi không? – Svante
Nhân tiện, việc phân tích cú pháp các ngôn ngữ không thường xuyên không thể đạt được bằng các biểu thức chính quy. Bất cứ khi nào bạn thấy "cây", "đệ quy" hoặc "lồng nhau", hãy nghĩ "không có regex". – Svante
@Svante - Chắc chắn - Tôi đã mở rộng dự kiến so với thực tế trong bài đăng. Hi vọng điêu nay co ich. –