2011-11-09 18 views
21

Tôi đang làm việc trên một dự án phân tích nguồn C++ và có vẻ như clang là ứng cử viên tốt cho công việc phân tích cú pháp. Vấn đề là clang phụ thuộc rất nhiều vào dự án cơ sở hạ tầng "llvm", Làm thế nào để cấu hình nó để có được một front-end sạch mà không có bất kỳ máy tính định hướng backend? Giống như LCC, chúng cung cấp một chương trình phụ trợ "null" cho những người tập trung vào các phần phân tích cú pháp. Bất kỳ đề xuất nào được đánh giá cao.Làm thế nào để làm cho một đầu mối clang sạch?

+1

Ngoài một vài thư viện Hỗ trợ (cung cấp một số lớp tiện ích và mã độc lập hệ điều hành), bạn không cần phải có đầy đủ LLVM. Bạn đang sử dụng thư viện nào của Clang? –

+0

Tôi sẽ sử dụng toàn bộ clang thực thi nhưng với một back-end giả. –

+12

Bạn có biết về 'libclang'? Đó là một thư viện C (với một giao diện ổn định được bảo đảm) có thể phơi bày AST của Clang. Nó nhẹ hơn nhiều. Nếu không, bạn có thể chỉ cần sử dụng các thư viện C++ (hãy cẩn thận rằng giao diện là * không * ổn định), việc thực thi nhúng những thứ không thực sự hữu ích cho bạn, tôi nghĩ vậy. –

Trả lời

8

Gần đây tôi đã thực hiện việc này trên Windows.

Tải xuống nguồn clang và llvm từ here.

Cài đặt cmake và Python (trái với tài liệu, bạn cần Python chỉ để xây dựng clang; ít nhất, cmake từ bỏ nếu nó không thể tìm thấy thời gian chạy Python).

Bạn cũng cần VS2008 hoặc VS2010.

Một điều đó là không hoàn toàn rõ ràng là cấu trúc thư mục cần thiết:

projectRoot 
    build <- intermediate build files and DLLs, etc. will go here 
    llvm <- contents of llvm-3.0.src from llvm-3.0.tar go here 
     tools 
      clang <- contents of clang-3.0.src from clang-3.0.tar go here 

Và làm theo windows build instructions từ bước 4 trở đi. Đừng cố sử dụng giao diện đồ họa cmake, nó thật kinh dị; chỉ cần sử dụng các lệnh được đưa ra trong hướng dẫn xây dựng.

Khi xây dựng xong (mà phải mất một lúc), bạn sẽ có:

projectRoot 
    build 
     bin 
      Release <- libclang.dll will be here 
     lib 
      Release <- libclang.lib will be here 
    llvm 
     tools 
      clang 
       include 
        clang-c <- Index.h is here 

Index.h định nghĩa các API để truy cập thông tin về mã nguồn của bạn; nó chứa khá nhiều tài liệu về các API.

Để bắt đầu sử dụng kêu vang bạn cần một cái gì đó như:

CXIndex index = clang_createIndex(1, 1); 

// Support Microsoft extensions 
char *args[] = {"-fms-extensions"}; 

CXTranslationUnit tu = clang_parseTranslationUnit(index, "mySource.c", args, ARRAY_SIZE(args), 0, 0, 0); 

if (tu) 
{ 
    CXCursor cursor = clang_getTranslationUnitCursor(tu); 

    // Use the cursor functions to navigate through the AST 
} 
+0

Cảm ơn arx! Tôi đang cố gắng tiếp cận của bạn. –

+0

có nó hoàn toàn hoạt động. –

1

Thật không may, bạn không thể nhận được "tinh khiết" front-end không có chi tiết cụ thể của máy. C/C++ vốn là ngôn ngữ gắn máy. Hãy nghĩ về tiền xử lý và các định nghĩa tích hợp sẵn, kích thước của các loại nội trang, vv Một số có thể được trừu tượng hóa, nhưng không, ví dụ: tiền xử lý.

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