2012-12-26 33 views
10

Làm cách nào để mở rộng Clang bằng trình phân tích cú pháp bổ sung cho các tệp có đuôi tệp đặc biệt, tức là tôi có thể phát triển một số FrontendAction có nội dung "Hey! Tôi sẽ xử lý tất cả các tệp có tệp kết thúc '.lorem' và trả về một tệp trừu tượng cây cú pháp (clang::ASTContext?) "?Làm cách nào để mở rộng Clang bằng trình phân tích cú pháp bổ sung?

Tôi đã đọc về clang::FrontendAction, clang::Parserclang::driver::Driver nhưng tôi đã không thể tìm ra ở đâu và làm thế nào tôi nên mở rộng Clang để có thể mở rộng biên dịch với một cú pháp bổ sung (không mở rộng phân tích cú pháp hiện hành).

+1

Ngôn ngữ mở rộng của bạn có tương tự như C/C++/Objective-C không? Clang là lối vào cho các loại ngôn ngữ này. Nếu chúng ta muốn sử dụng lại backend (tối ưu hóa, vv), chúng ta chỉ cần LLVM. –

+0

Ngôn ngữ sẽ tương tự như Objective-C++ (ngữ nghĩa, chứ không phải cú pháp). Bộ tiền xử lý giống nhau. – finnsson

+0

Tôi không biết nhiều về Clang. Nhưng làm thế nào về transcompiling để ObjC sau đó? –

Trả lời

1

Dưới đây là một số gợi ý:

trong tools/clang/lib/Driver/Types.cpp bạn có lookupTypeForExtension, mà quyết định "loại" của mã biên soạn dựa trên các phần mở rộng. Ví dụ: đối với tiện ích mở rộng .m, nó trả về TY_ObjC. Bạn cũng có thuộc tính isObjC xác định xem loại đã cho thuộc về Mục tiêu C.

Đối với cách trình phân tích cú pháp biết ngôn ngữ nào phân tích cú pháp ... Nó biết thông qua Preprocessor, có thành viên LangOptions. Sau này có nhiều tùy chọn được xác định trong include/clang/Basic/LangOptions.def. Ví dụ: ObjC1ObjC2. Đây là những thiết lập trong CompilerInvocation::setLangDefaults, mà cuối cùng được gọi từ CompilerInvocation::CreateFromArgs.

Hãy nhớ rằng trình điều khiển clang sẽ gọi giao diện người dùng là một "tiến trình con", chuyển cho nó các đối số dòng lệnh bổ sung. Trình điều khiển tương thích với gcc và giao diện người dùng có thể được xem là chính bản thân.

Ngoài ra, IMHO sẽ là vô số rắc rối khi thêm trình phân tích cú pháp bổ sung để vuốt. Trong khi tất cả mọi thứ là mô-đun, rất nhiều công việc cần phải được thực hiện để tạo và buộc tất cả mọi thứ lại với nhau. Nếu ngôn ngữ của bạn mở rộng ObjC, chỉ cần sử dụng trình phân tích cú pháp hiện tại. Nếu ngôn ngữ của bạn là một cái gì đó hoàn toàn khác nhau, thì tiếng kêu có thể không phải là một lựa chọn tốt cho bạn.

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