DMS Software Reengineering Toolkit có thể thực hiện việc này bằng cách áp dụng biến đổi chương trình.
Một chuyển đổi DMS cụ thể để phù hợp với ví dụ cụ thể của bạn:
domain C.
rule ifthenelseize_conditional_expression(a:lvalue,A:condition,B:term,C:term):
stmt -> stmt
= " \a = \A ? \B : \C; "
-> " if (\A) \a = \B; else \a=\C ; ".
Bạn sẽ cần một quy tắc để xử lý trường hợp khác của bạn, nhưng nó cũng không kém phần dễ dàng để bày tỏ.
Các phép biến đổi hoạt động trên cấu trúc mã nguồn thay vì văn bản, do đó bố cục và nhận xét sẽ không ảnh hưởng đến nhận dạng hoặc ứng dụng. Dấu ngoặc kép trong quy tắc không phải là trích dẫn chuỗi truyền thống, mà đúng hơn là các dấu ngoặc kép về ngôn ngữ học, tách biệt ngôn ngữ cú pháp quy tắc khỏi độ tuổi mẫu được sử dụng để chỉ định cú pháp cụ thể được thay đổi.
Có một số vấn đề với chỉ thị tiền xử lý nếu bạn định giữ lại chúng. Vì bạn đã sẵn sàng làm việc với mã mở rộng tiền xử lý, bạn có thể yêu cầu DMS thực hiện tiền xử lý như là một phần của bước chuyển đổi; nó có đầy đủ các bộ tiền xử lý tương thích với GCC4 và GCC4 được xây dựng ngay.
Như những người khác đã quan sát, đây là một trường hợp khá dễ dàng vì bạn đã chỉ định nó hoạt động ở cấp một câu lệnh đầy đủ. Nếu bạn muốn loại bỏ mã của bất kỳ phép gán nào tương tự như câu lệnh này, với các nhiệm vụ được nhúng trong các ngữ cảnh khác nhau (khởi tạo, v.v.), bạn có thể cần một bộ biến đổi lớn hơn để xử lý các nhóm trường hợp đặc biệt khác nhau. cần phải sản xuất các cấu trúc mã khác (ví dụ, các biến tạm thời của loại thích hợp). Điều tốt về một công cụ như DMS là nó có thể tính toán một cách rõ ràng một loại biểu tượng cho một biểu thức tùy ý (do đó khai báo kiểu của bất kỳ temps cần thiết) và bạn có thể viết một tập lớn hơn khá đơn giản và áp dụng tất cả chúng.
Tất cả những gì đã nói, tôi không chắc chắn về giá trị thực của việc thực hiện thao tác loại bỏ biểu thức bậc ba điều kiện của bạn. Khi trình biên dịch được giữ kết quả, bạn có thể nhận được mã đối tượng tương tự như thể bạn đã không thực hiện các phép biến đổi chút nào. Xét cho cùng, trình biên dịch cũng có thể áp dụng các phép biến đổi bảo toàn tương đương.
Rõ ràng là có giá trị trong việc thực hiện các thay đổi thông thường nói chung.
(DMS có thể áp dụng các biến đổi chương trình nguồn thành nguồn cho nhiều langauges, bao gồm C, C++, Java, C# và PHP).
Điều này kêu la "macro tuyệt vời, sơ sài!" với tôi. –
Chỉ có một tệp? Nếu có thể bạn có thể làm điều đó với một biểu thức chính quy phức tạp và chức năng tìm kiếm thay thế của một trình soạn thảo có thể làm điều này. –
Tại sao? Bạn nên xem xét có những tình huống mà không có tương đương ngữ nghĩa. Không có gì sai với toán tử ternary. – GManNickG