2013-01-09 29 views
5

Có tiện ích miễn phí khác nào có thể so sánh hai tệp C++ sử dụng AST của chúng thay vì văn bản không?Tiện ích Diff có nghĩa là C++

Những gì tôi đã nghĩ đến việc là một cái gì đó như: - chuyển đổi tất cả các tập tin để AST - Render AST trở lại như C++ (điều này canonicalizes thụt đầu dòng) - Do diff bình thường giữa hai - Cũng cố gắng để phát hiện tái cấu trúc đơn giản mà đã được thực hiện (thêm/xóa/đổi tên thành viên chẳng hạn)

+5

Điều đó sẽ chậm và tôi không thể tưởng tượng tại sao một người nào đó lại muốn một thứ như vậy. –

+3

Tôi tưởng tượng điều này là để bắt gian lận giữa các sinh viên. – chrisaycock

+1

điều này là để có thể xem lại các thay đổi mã trên mã của tôi bởi một người prorgammer khác ghét kiểu mã hóa của tôi. Vì nhóm của chúng tôi không có quy tắc chính thức về tạo kiểu, loại công cụ này sẽ rất hữu ích. – tohava

Trả lời

1

Bạn có thể chuyển mã thông qua AStyle để chuẩn hóa thụt đầu dòng/khoảng cách/định dạng trước khi thực hiện tìm khác biệt. Điều này sẽ không làm bất cứ điều gì cho refactorings, nhưng một cách trung thực bạn sẽ cần một tiền xử lý đầy đủ/biên dịch vượt qua để làm điều này đúng AFAICS.

http://astyle.sourceforge.net/

+2

Công cụ này không ép buộc biểu mẫu CANONICAL. Lấy ví dụ "int main() \ n {\ n}" so với "int main \ n() \ n {\ n}". Chúng không mang lại kết quả tương tự. Một công cụ thực sự biên dịch mã thành một AST sẽ hữu ích trong trường hợp này. – tohava

+0

Tôi không nghĩ rằng bạn hiểu những gì bạn đang yêu cầu. Một vượt qua AST đầy đủ sẽ yêu cầu (tối thiểu!) Một tiền xử lý đầy đủ, có nghĩa là mọi #include sẽ được mở rộng ra, mỗi #define sẽ được mở rộng ra, vv Trong nhiều trường hợp, mã của bạn sẽ không giống với những gì bạn bắt đầu với. Điều này thậm chí không tính đến phần "phát hiện tái cấu trúc", mà dường như giống như một giấc mơ ống dẫn. – StilesCrisis

+0

Hãy bỏ qua việc phát hiện cấu trúc lại. #includes có thể dễ dàng được cuộn lại trong khi in đẹp (chúng tôi có chỉ thị #line hoặc một cái gì đó tương tự cho việc này). Macro là phức tạp hơn, tôi nghĩ rằng họ vẫn có thể được xử lý nếu tiền xử lý được sửa đổi để tạo ra một cái gì đó giống như bản đồ dòng javascript mà máy in đẹp sau đó có thể sử dụng để cuộn macro trở lại. Am i thiếu cái gì ở đây? – tohava

2

tôi có thể nghĩ ra hai giải pháp thay thế cho vấn đề của bạn:

  1. Thảo luận về một phong cách mã hóa sẽ được sử dụng như một nhóm và dính vào nó. Bạn có thể phải tìm sự thỏa hiệp giữa các kiểu mã hóa cá nhân khác nhau của các thành viên trong nhóm.

  2. Nếu bạn đang sử dụng kiểm soát nguồn, hãy thêm móc loại bỏ tất cả định dạng trên cam kết và tùy chỉnh định dạng mã khi thanh toán. Điều này có một số công trình nhưng cho phép các thành viên trong nhóm sử dụng kiểu định dạng của riêng họ. Tất nhiên, điều này không giải quyết các ý kiến ​​khác nhau trong việc đặt tên biến và các phần tử kiểu mã không định dạng khác.

3

[Khi được hỏi bởi một trong những người trả lời khác để gửi tên của một công cụ thương mại.] SmartDifferencer cụ

Semantic Designs' sẽ phân tích C++, và tính toán sự khác biệt dựa trên ASTs; định dạng bố cục đơn giản là không quan trọng. Trình phân tích cú pháp là trình phân tích cú pháp C++ 11 đầy đủ. Nó có thể phân tích hầu hết các tệp nguồn mà không cần mở rộng hầu hết các chỉ thị tiền xử lý miễn là chúng được "cấu trúc"; Sử dụng tiền xử lý C++ thường không lạm dụng vì nó ở trong C.

Có các phiên bản của SmartDifferencer cho các ngôn ngữ khác.

[Tiết lộ: Tôi CTO tại Designs Semantic]

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