2009-11-24 27 views
6

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 FoomyString (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.

+0

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

+3

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

+0

@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. –

Trả lời

6

Java-6 ngữ pháp ở đầu phần chia sẻ file trên antlr.org không bao gồm xây dựng cây. Bạn sẽ cần phải làm hai việc.Đầu tiên, hãy nói với ANTLR bạn muốn xây dựng một AST:

options { 
    output=AST; 
} 

Thứ hai, bạn cần phải nói với nó những gì mà cây sẽ trông như thế bằng cách hoặc khai thác cây hoặc bằng cách sử dụng các quy tắc viết lại. Xem số documentation on tree construction. Tôi thường kết thúc làm một sự kết hợp của cả hai.

1

Để xây dựng cây, bạn nên đặt đầu ra = AST. (Tóm tắt cây cú pháp)

Theo như tôi biết, trong mã thông báo ANTLR chỉ 1 có thể là gốc của cây, vì vậy bạn không thể có được chính xác những gì bạn đang tìm kiếm, nhưng bạn có thể đến gần.

Check-out: http://www.antlr.org/wiki/display/ANTLR3/Tree+construction