2009-10-05 20 views
10

Tôi đang tìm cách phân tích mã C++ để lấy một số thông tin cơ bản về các lớp. Tôi không thực sự cần nhiều thông tin từ chính mã, nhưng tôi cần nó để xử lý những thứ như macro và mẫu. Tóm lại, tôi muốn trích xuất "cấu trúc" của mã, những gì bạn sẽ hiển thị trong một sơ đồ UML.Những thư viện nào có sẵn để phân tích cú pháp C++ để trích xuất thông tin loại

Đối với mỗi lớp/struct/đoàn/enum/typedef trong cơ sở mã, tất cả tôi cần (sau khi mẫu & macro đã được xử lý) là:

  • tên của họ
  • Không gian tên, trong đó họ sống
  • các lĩnh vực chứa bên trong (tên loại, tên của trường và truy cập hạn chế, chẳng hạn như tin/có thể thay đổi/etc)
  • Chức năng chứa bên trong (kiểu trả về, tên, thông số)
  • Các tuyên bố tập tin
  • Line/số cột (hoặc byte trong tập tin), nơi định nghĩa của dữ liệu này bắt đầu

Các hướng dẫn thực tế trong các mã là không thích hợp cho mục đích của tôi.

Tôi dự đoán rất nhiều người nói rằng tôi chỉ nên sử dụng regex cho điều này (hoặc thậm chí là Flex & Bison), nhưng chúng không thực sự hợp lệ vì tôi cần xử lý trước và xử lý mẫu đúng cách.

+0

Ngay cả khi bạn mở rộng bộ tiền xử lý và chỉ thị mẫu, regexp sẽ không đủ mạnh để thu thập thông tin loại này một cách chính xác. –

Trả lời

5

Có vẻ như một công việc cho gcc-xml kết hợp với thư viện C++ xml hoặc ngôn ngữ kịch bản lệnh thân thiện với xml mà bạn chọn.

+0

Từ mô tả trên trang bạn đã liên kết, điều này nghe có vẻ giống như những gì tôi cần. –

+0

Mát mẻ, faq cũng nói rằng các mẫu được tạo ra cũng được ghi lại, điều này nghe hoàn hảo (chỉ có vẻ như nó thiếu là "các cơ quan chức năng", đó là điều tôi thực sự không cần) –

+0

Rất tốt, tôi nghĩ rằng nó thuận tiện cho các trường hợp đơn giản. –

4

Chạy Doxygen trên mã sẽ cung cấp cho bạn nhiều nhất, phải không?

Ở định dạng nào bạn muốn đầu ra?

+0

Từ những gì tôi đã thấy, Doxygen thực sự chỉ có thể xuất dữ liệu thân thiện với con người, phân tích cú pháp có thể mất nhiều hơn một chút cho một chương trình, tôi chỉ cần nó ở định dạng mà tôi có thể dễ dàng truy cập thông tin đó thông qua mã. –

+0

Doxygen cũng có thể xuất XML: http://www.doxygen.nl/config.html#cfg_generate_xml –

0

Bạn có thể dễ dàng mở rộng các macro bằng cách chỉ chạy bộ xử lý trước (cpp) trên nguồn. Các mẫu không dễ dàng vì việc tạo mẫu diễn ra sau này.

+0

Đây là một tùy chọn tôi có trong tâm trí của mình, nhưng gần đây tôi đã có một số giao dịch với bộ tiền xử lý cho 2 hoàn toàn các nhà cung cấp khác nhau (một sony, MS khác) và đầu ra mà chúng cung cấp thực sự khác với những gì được sử dụng trong nội bộ (MS MIGHT chỉ là một khoảng trắng, nhưng nó gây ra các lỗi ngăn cản tệp được xử lý trước đó. Tôi vẫn cần một cái gì đó để chuyển mã số –

2

Exuberant Ctags sẽ cung cấp cho bạn hầu hết những gì bạn cần, thường được các biên tập viên sử dụng để cung cấp điều hướng mã.
May choke trên một số mẫu mặc dù ...

0

Doxygen cũng có thể tạo XML chi tiết bằng cách đặt tùy chọn trong tệp cấu hình. Nó khá kỹ lưỡng và rất dễ sử dụng. Từ Doxygen home page:

Kết quả XML bao gồm một cấu trúc "dump" của các thông tin được thu thập bởi doxygen. Mỗi hợp chất (lớp/không gian tên/tệp/...) có tệp XML riêng và cũng có một chỉ mục tệp được gọi là index.xml.

Tệp được gọi là tập lệnh XSLT kết hợp XSLT cũng được tạo và có thể được sử dụng để kết hợp tất cả các tệp XML thành một tệp duy nhất.

Doxygen cũng tạo hai lược đồ XML tệp index.xsd (cho tệp chỉ mục) và hợp chất.xsd (đối với hợp chất tệp). Tệp lược đồ này mô tả các phần tử có thể là , thuộc tính của chúng và cách chúng được cấu trúc, tức là mô tả ngữ pháp của tệp XML và có thể được sử dụng để xác thực hoặc để chỉ đạo tập lệnh XSLT.

Trong addon thư mục/doxmlparser bạn có thể tìm thấy một thư viện phân tích cú pháp cho việc đọc đầu ra XML được tạo ra bởi doxygen trong một cách gia tăng (xem addon/doxmlparser/include/doxmlintf.h cho giao diện của thư viện)

2

DMS Software Reengineering Toolkit là máy phân tích và chuyển đổi chương trình mục đích chung. C++ Front End xây dựng trên DMS để cung cấp đầy đủ tính năng phân tích cú pháp C++ cho nhiều loại phương ngữ C++ phổ biến, có thể xử lý tập hợp các lớp C++ một cách mô phỏng và xây dựng đầy đủ thông tin tên/loại/truy cập mà bạn có thể sử dụng theo bất kỳ cách nào bạn muốn. Thông tin được gắn thẻ vào tệp/dòng/cột gốc chính xác. (Nó bao gồm một bộ tiền xử lý đầy đủ).

Bạn đã đúng; regex thậm chí không thể đến gần điều này.

+0

Đúng nếu tôi sai: một giải pháp nửa nướng sẽ không hữu ích; hoặc là phân tích cú pháp nó trong các kết quả đầy đủ hoặc sai/thiếu, trong bất kỳ quy trình trích xuất nào mà tại đó một trình gửi mã, được mong đợi. – MaD70

+0

Ý nghĩa của mã khá dễ vỡ và phụ thuộc rất nhiều vào ý nghĩa của các ký hiệu người dùng. Lỗi nhỏ trong việc giải thích ý nghĩa này thường gợn vào kết quả một vài nhà khai thác hạ lưu là vô nghĩa. Nếu bạn không phân tích cú pháp C++ khá chi tiết, bạn không thể xây dựng bất kỳ trình phân tích thú vị nào cho phép các công cụ có thể thay đổi mã một cách đáng tin cậy. –

+0

Cảm ơn bạn đã chia sẻ với chúng tôi kinh nghiệm của bạn, Ira. – MaD70

4

Xem thêm Ira Baxter tại đây, nơi ông cites his own product.

Cảnh báo: nhớ bạn, chỉ Elsa "..Tôi nghe thấy một công việc khá tốt .." khi xây dựng bảng biểu tượng, theo Ira Baxter là cần thiết cho ý định ban đầu của OP (xem nhận xét cho câu trả lời này) Tôi báo anh ta vì anh ta là một chuyên gia trong lĩnh vực này).

+0

Tiếp tục bình luận, lưu ý rằng OP muốn có một cách đơn giản để trích xuất một số thông tin loại và tạo ra một số nội dung từ đó. Việc xử lý với các trình phân tích cú pháp C++ hoàn chỉnh là quá tốn thời gian và không cần thiết, đặc biệt là chi phí cho trình phân tích cú pháp -> xml -> C++ sẽ không được thanh toán khi chạy. Ngoài ra, danh sách tốt đẹp. –

+0

Bạn đánh giá thấp cách tính toán chi phí tính toán XML. Như Ira Baxter lưu ý (ông là một chuyên gia trong lĩnh vực này) "* Bạn là đúng; regex thậm chí không thể đến gần này *" và ông có nghĩa là (Ira sửa tôi nếu tôi sai) rằng một giải pháp nửa nướng không hữu ích. Phân tích cú pháp C++ nổi tiếng là khó và không phân tích cú pháp đầy đủ, tôi mong đợi kết quả sai/thiếu trong bất kỳ quá trình trích xuất nào mà bạn gửi mã. – MaD70

+1

Bạn không chỉ phải phân tích cú pháp, nhưng bạn cần phải xây dựng bảng biểu tượng. Và đây là một bitch; các quy tắc cho việc này chiếm phần lớn tài liệu tham khảo 600 trang. Các trình phân tích cú pháp C++ dựa trên ANTLR, OpenC++, Stratego, không làm điều này. Luận án của Willink khá thú vị nhưng tôi không biết ai đã sử dụng kết quả của nó trong sự tức giận. Elsa tôi nghe thấy một công việc khá tốt. Tôi nghĩ Clang nói rằng trình phân tích cú pháp C++ của họ chưa hoàn thành vào thời điểm này. GCC-XML làm một công việc tốt nếu tất cả những gì bạn muốn là nhập dữ liệu và bạn không quan tâm đến hàng tấn XML mà nó tạo ra. DMS thực hiện điều này và tạo ra thông tin về chức năng của cơ thể. –

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