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?
Trả lời
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
}
Cảm ơn arx! Tôi đang cố gắng tiếp cận của bạn. –
có nó hoàn toàn hoạt động. –
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ý.
- 1. làm thế nào để xem CLang AST?
- 2. Làm thế nào để làm sạch sau SIGKILL?
- 3. Làm thế nào để Jenkins không làm sạch một không gian làm việc git
- 4. Làm thế nào để làm sạch một thư mục cụ thể trước khi mỗi xây dựng bắt đầu trong jenkins?
- 5. Làm thế nào để nạp Visual Studio Clang-Format plugin với tệp định dạng clang?
- 6. Làm thế nào để làm sạch một trường nhất định trong một InlineFormSet?
- 7. Làm thế nào để liên kết libstdC++ tĩnh với clang ++
- 8. Làm thế nào để có mối quan hệ với một mối quan hệ luôn được nhúng
- 9. làm thế nào để sử dụng llvm + clang để biên dịch cho stm32
- 10. "làm sạch" kết quả trong "Không có quy tắc để làm cho mục tiêu" sạch ""
- 11. Làm thế nào để tạo tùy chỉnh sạch (sau-sạch) sự kiện trong Visual Studio 2008?
- 12. Làm thế nào để xác định macro với nhiều pragma cho Clang?
- 13. django-tastypie - Làm thế nào để làm cho manytomany qua mối quan hệ
- 14. làm thế nào để làm cho công việc mối quan hệ has_and_belongs_to_many trong mongoid
- 15. Làm thế nào để dọn dẹp cài đặt Python của tôi cho một khởi đầu mới
- 16. Làm sạch HTML bằng PHP để tạo chuỗi sạch
- 17. làm sạch một Kho lưu trữ Mercurial
- 18. Làm thế nào để bắt đầu một quá trình và làm cho nó 'độc lập'
- 19. Làm thế nào để Clojure aproach tách mối quan tâm?
- 20. Làm thế nào để ngăn chặn MSBuild _WPPCopyWebApplication mục tiêu làm sạch thư mục App_Data
- 21. Làm thế nào để làm cho một JavaFX-Widget
- 22. Làm cách nào để có được đầu ra Gradle sạch trên Travis CI?
- 23. Làm thế nào để làm cho cảnh báo gcc/clang về các khoảng ngắt trong câu lệnh chuyển đổi
- 24. Làm cách nào để biên dịch C++ bằng Clang?
- 25. Mùa xuân: Làm thế nào để làm sạch chấm dứt đậu nguyên mẫu?
- 26. Thay thế cho -pg bằng Clang?
- 27. Làm thế nào để làm sạch tất cả các phiên trong Nodejs (heroku + redis)?
- 28. Làm thế nào để làm sạch hàng đợi gửi đi MSMQ
- 29. cmake - ngăn chặn `làm sạch` khỏi làm sạch ExternalProject
- 30. Làm thế nào để làm sạch/xóa cơ sở dữ liệu greenDao
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? –
Tôi sẽ sử dụng toàn bộ clang thực thi nhưng với một back-end giả. –
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. –