2011-10-28 39 views
10

Xin chào Tôi là người mới trong việc phát triển Compiler, và tôi tự hỏi AST trông như thế nào. Tôi có một đoạn mã nhỏ, và tôi sử dụng Clang để tạo ra AST. Tôi không nhận được nhiều thông tin từ nó. Từ giao diện của nó, cây Cú pháp chính xác giống như nguồn, ngoại trừ một cấu trúc được thêm vào hầu như bất kỳ mẫu nào mà tôi thử nghiệm.Clang: AST (cây cú pháp trừu tượng) trông như thế nào?

Nguồn:

class A { 
public: 
    int *a, *b, *c; 
    int i; 
    void sum() { 
    a = new int[5]; 
    b = new int[5]; 
    c = new int[5]; 
    for (i = 0; i < 5; i++) { 
     a[i] = i; 
     b[i] = i; 
    } 
    for (i = 0; i < 5; i++) { 
     c[i] = a[i] + b[i]; 
    } 
    delete[] a; delete[] b; delete[] c; 
    } 
}; 

class B : public A { 
}; 

int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

Command để tạo AST:

clang++ -cc1 -ast-print ~/sum.cpp 

sản lượng AST:

struct __va_list_tag { 
    unsigned int gp_offset; 
    unsigned int fp_offset; 
    void *overflow_arg_area; 
    void *reg_save_area; 
}; 
typedef struct __va_list_tag __va_list_tag; 
class A { 
public: 
    int *a; 
    int *b; 
    int *c; 
    int i; 
    void sum()  { 
     this->a = new int [5]; 
     this->b = new int [5]; 
     this->c = new int [5]; 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->a[this->i] = this->i; 
      this->b[this->i] = this->i; 
     } 
     for (this->i = 0; this->i < 5; this->i++) { 
      this->c[this->i] = this->a[this->i] + this->b[this->i]; 
     } 
     delete [] this->a; 
     delete [] this->b; 
     delete [] this->c; 
    } 


}; 
class B : public A { 
}; 
int main() { 
    B bclass; 
    bclass.sum(); 
    return 0; 
} 

Cảm ơn

+6

Chỉ cần lưu ý: bạn có thể muốn thử -ast-dump thay vì in-in; đại diện đó có thể gần hơn với những gì bạn đang tìm kiếm. – servn

+2

Nếu câu hỏi là AST trông như thế nào, và không phải AST của Clang trông như thế nào, bạn có thể thấy câu trả lời này hữu ích: http://stackoverflow.com/questions/6376662/how-a-ast-for-an-object định hướng-lập trình-ngôn ngữ-trông giống như/6378997 # 6378997 –

Trả lời

16

Có một sự nhầm lẫn nhỏ giữa các tùy chọn khác nhau có sẵn:

  • -ast-print sẽ khá-in AST hiện tại, có nghĩa là, nó sẽ làm cho mã nó hiểu càng nhiều càng tốt với những gì nó phân tích cú pháp (nhưng làm cho một số điều rõ ràng, giống như linh hồn của các this)
  • -ast-dump sẽ tạo ra một đại diện lisp giống như của AST hiện

máy in khá có thể hữu ích để ch eck rằng AST là lossless (tức là, bảo quản const -ness của biểu hiện như vậy, vv ...) nhưng không thực sự về phát triển.

Nếu bạn muốn hack trên trình biên dịch, bạn cần -ast-dump, sẽ tạo ra đầu ra ánh xạ trực tiếp biểu diễn trong bộ nhớ của mã được phân tích cú pháp.

5

Các AST là một cấu trúc liên kết trong bộ nhớ (" cây "không làm cho justi ce đến sự phức tạp của sự vật, nhưng đó là tên mà mọi người sử dụng). Những gì -ast-print sản xuất là một đại diện văn bản của AST. Vì con người thiết lập tùy chọn đã quen thuộc với cú pháp C/C++, nó được in trong một biểu diễn theo cú pháp đó. Đây là một sự lựa chọn thiết kế, không phải là một sự trùng hợp hạnh phúc.

Nếu bạn muốn xem AST trông như thế nào khi nó không được in theo mục đích trong một cú pháp quen thuộc, bạn có thể xem ví dụ GIMPLE, biểu diễn bên trong của GCC.

+0

Cảm ơn Pascal. Lý do tại sao tôi đã cố gắng để in AST là để hiểu những gì clang đang làm.Tôi nghĩ rằng nó sẽ là một điểm khởi đầu cho bước qua việc tạo ra AST cho sự hiểu biết tốt hơn, và cuối cùng để thêm các loại/chức năng mới hơn trong Clang. Tôi nghĩ tôi sẽ phải tìm một giải pháp thay thế cho điều đó. –

+3

Cảnh báo: GIMPLE khó hiểu và phức tạp để thao tác. –

3

Và nếu bạn muốn chơi với GIMPLE, bạn thậm chí có thể sử dụng GCC MELT cho mục đích đó. MELT là một ngôn ngữ cụ thể ở cấp cao để đối phó với GIMPLE!

Và bên trong trình biên dịch, biểu diễn bên trong thường không phải là cây, mà bằng cách nào đó cấu trúc hình tròn. Trong GCC, một khối cơ bản biết nó gimple-s, nhưng gimple-s có thể biết các khối cơ bản của chúng .... (nó phức tạp hơn một chút, nhưng bạn đã có ý tưởng).

Các vấn đề liên quan