tôi nghi ngờ bạn sẽ tìm thấy một công cụ như thế này off-the-shelf. Vì vậy, bạn cần một công cụ tùy chỉnh. Bạn không muốn thử làm điều này với một số phương pháp lấy cắp chuỗi (ví dụ: Perl) vì các chi tiết chính xác phân tích cú pháp C và C++ vượt xa những gì bạn có thể tin cậy theo cách này. Nếu bạn không nhớ chuỗi hacking làm hỏng các tập tin của bạn đôi khi, có thể bạn có thể nhận được đi với điều này.
Công ty của tôi DMS Software Reengineering Toolkit có thể được sử dụng để thực hiện điều này một cách đáng tin cậy.
DMS là công cụ chung để phân tích cú pháp, phân tích và chuyển đổi mã nguồn bằng cách sử dụng công nghệ trình biên dịch được tham số hóa bằng định nghĩa ngôn ngữ rõ ràng. DMS có định nghĩa ngôn ngữ mạnh mẽ cho nhiều ngôn ngữ, bao gồm C và C++ trong nhiều ngôn ngữ. Sử dụng kết thúc trước của DMS C hoặc C++, bạn có thể phân tích mã nguồn , xây dựng cấu trúc dữ liệu trình biên dịch được gọi là AST, thực hiện phân tích mã, chuyển đổi AST, và sau đó tạo lại mã compilable bao gồm cả nhận xét và tất cả chỉ thị prepreprocessor.
Thông báo trước phải làm với việc phân tích mã nguồn chứa các chỉ thị tiền xử lý: chúng phải được cấu trúc tốt [ví dụ: #ifdef #endif cần lồng xung quanh các câu lệnh khác giống như thường lệ nếu, v.v ... trái ngược với việc được sử dụng trên một đường biên báo cáo. Điều này xảy ra một số trong mã C; nhiều hơn ít hơn trong mã C++. Kinh nghiệm của chúng tôi là nếu bạn sẵn sàng sửa đổi mã nguồn C của bạn, bạn có thể làm cho vấn đề cụ thể này biến mất.
Đối với nhiệm vụ cụ thể của bạn, bạn làm khá nhiều là câu trả lời cho khoa học Toolworks mô tả:
- Chọn một đơn vị biên soạn, và phân tích nó bằng DMS. Bạn phải cung cấp tất cả thông tin giống nhau bạn cung cấp trình biên dịch, do đó, nó có thể định vị tệp tiêu đề, v.v.
- DMS tạo AST cho cả đơn vị biên dịch của bạn và cho tất cả các tệp tiêu đề.
- Đi bộ AST để trích xuất thứ tự khai báo trong tiêu đề và đơn vị biên dịch.
- Tái cấu trúc cây đơn vị biên soạn theo trình tự có nguồn gốc từ 3)
- prettyprint đơn vị biên soạn kết quả AST
[Một lý do để làm điều này với DMS chứ không phải là khoa học Toolworks được rằng DMS được thiết kế để phân tích cú pháp/chuyển đổi/tái tạo mã, trong khi SciTool IMHO thực sự chỉ được thiết kế để phân tích cú pháp và phân tích. DMS cung cấp quyền truy cập vào các chi tiết đẹp cần thiết để chuyển đổi mà SciTools không, ít nhất không phải là lần cuối cùng tôi nhìn].
Các biến chứng sẽ xảy ra do có điều kiện, macro, không gian tên, ... nhưng bạn sẽ quyết định chính sách để giải quyết. Ví dụ, nếu một tệp tiêu đề có một dấu #if ... #else .... #endif và các khai báo trong mệnh đề sau đó có thứ tự khác với thứ tự của chúng trong mệnh đề else, thứ tự mong muốn là gì? Điều gì xảy ra nếu định nghĩa hàm được tạo bởi macro trong tiêu đề? Nhưng, tất cả những điều này khiến cho việc xây dựng một công cụ thực sự, er, vui vẻ là .
Ý kiến cá nhân của tôi là điều này có vẻ như khá nhiều công việc cho hiệu quả bạn đang nhận được. Nếu bạn thực hiện tất cả việc này, quy trình kỹ thuật phần mềm của bạn sẽ tốt hơn bao nhiêu? Chúng tôi thường sử dụng DMS để kiểm tra lỗi mã hóa hoặc thay đổi mã theo cách mà mọi người không thể (ví dụ: chèn công cụ thời gian chạy lời khuyên tạm thời hoặc AOP), nơi rõ ràng là động cơ cơ khí đã thanh toán.
Công cụ này nên làm gì với các phần tử trong tệp '.c' không có phần tử tương ứng trong tệp' .h'? Ví dụ, các hàm tĩnh có thể liên quan đến các hàm toàn cầu và được đặt trước hoặc sau chúng. – jilles
Không có trong danh sách yêu cầu. Nếu một công cụ đáp ứng các yêu cầu trên không tồn tại, tôi chắc chắn rằng nó sẽ có thể xử lý trường hợp này. – Joe