Những gì bạn có vẻ cần là một trình phân tích cú pháp cho ngôn ngữ của bạn (Java) và một trình phân giải tên và loại. ("Trình tạo bảng biểu tượng").
Sau khi phân tích văn bản nguồn, trình biên dịch thường có trình phân giải tên, cố gắng ghi lại định nghĩa tên và loại tương ứng của chúng và trình kiểm tra loại, xác minh rằng mỗi biểu thức có loại hợp lệ.
Thông thường trình phân giải tên/loại than phiền khi không tìm thấy định nghĩa. Những gì bạn muốn nó làm là để tìm "không xác định" điều đó gây ra vấn đề, và suy ra một loại cho nó.
Đối
IPerson p = new Person();
tên resolver biết rằng "Người" và "IPerson" không được định nghĩa. Nếu đó là
Foo p = new Bar();
sẽ không có đầu mối nào bạn muốn có giao diện, chỉ Foo là một loại phụ huynh trừu tượng của Bar (ví dụ: một lớp hoặc giao diện). Vì vậy, quyết định đó là nó phải được biết đến với công cụ ("bất cứ khi nào bạn tìm thấy một cấu trúc như vậy, giả sử Foo là một giao diện ..."). Bạn có thể sử dụng một heuristic: IFoo và Foo có nghĩa là IFoo nên là một giao diện, và một nơi nào đó ai đó đã xác định Foo là một lớp thực hiện giao diện đó. Khi công cụ đã đưa ra quyết định này, nó sẽ cần phải cập nhật bảng biểu tượng của nó để nó có thể chuyển sang câu khác:
Đối
p.Name = "Sklivvz";
cho rằng p phải là một giao diện (bởi suy luận trước), sau đó Tên phải là một thành viên của trường, và nó xuất hiện loại của nó là Chuỗi từ nhiệm vụ.
Cùng với đó, báo cáo kết quả:
Assert.AreEqual("Sklivvz", p.Name);
tên và các loại giải quyết mà không vấn đề nữa.
Nội dung của các thực thể IFoo và Foo tùy thuộc vào bạn; bạn không cần phải sử dụng và thiết lập nhưng đó là sở thích cá nhân.
này sẽ không làm việc rất tốt khi bạn có nhiều thực thể trong báo cáo kết quả giống nhau:
x = p.a + p.b ;
Chúng ta biết a và b là khả năng lĩnh vực, nhưng bạn không thể đoán những gì loại số nếu thực sự họ số, hoặc nếu chúng là các chuỗi (điều này là hợp pháp đối với các chuỗi trong Java, dunno về C#). Đối với C++ bạn thậm chí không biết "+" có nghĩa là gì; nó có thể là một toán tử trên lớp Bar. Vì vậy, những gì bạn phải làm là thu thập các ràng buộc , ví dụ: "a là một số hoặc chuỗi không xác định", v.v và khi công cụ thu thập bằng chứng, nó thu hẹp tập hợp các ràng buộc có thể xảy ra. (Điều này hoạt động giống như những vấn đề từ đó: "Joe có bảy người con trai. Jeff cao hơn Sam. Harry không thể giấu đằng sau Sam. ... là người sinh đôi của Jeff?", Nơi bạn phải thu thập bằng chứng và loại bỏ những điều không công bằng). Bạn cũng phải lo lắng về trường hợp bạn kết thúc với một mâu thuẫn.
Bạn có thể loại trừ trường hợp p.a + p.b, nhưng sau đó bạn không thể viết các bài kiểm tra đơn vị của bạn với khả năng miễn dịch. Có những giải pháp hạn chế tiêu chuẩn ra khỏi đó nếu bạn muốn có khả năng miễn dịch. (Thật là một khái niệm).
OK, chúng tôi có ý tưởng, bây giờ, điều này có thể được thực hiện một cách thiết thực không?
Phần đầu tiên của điều này yêu cầu trình phân tích cú pháp và trình phân giải tên và loại có thể uốn cong. Bạn cần một trình giải quyết ràng buộc hoặc ít nhất là một "giá trị được xác định lưu lượng đến giá trị không xác định" hoạt động (giải quyết ràng buộc tầm thường).
DMS Software Reengineering Toolkit của chúng tôi với số Java Front End có thể có thể làm điều này. DMS là công cụ của trình xây dựng công cụ, dành cho những người muốn xây dựng các công cụ xử lý langauges máy tính theo những cách tùy ý. (Hãy suy nghĩ về "tính toán với các mảnh chương trình hơn là số").
DMS cung cấp máy phân tích mục đích chung và có thể tạo một cây cho bất kỳ giao diện người dùng nào được cung cấp (ví dụ: Java và có giao diện người dùng C#). Lý do tôi chọn Java là đầu cuối Java của chúng tôi có tất cả tên và loại máy móc phân giải, và nó được cung cấp ở dạng mã nguồn để nó có thể được uốn cong. Nếu bạn bị mắc kẹt với trình giải quyết hạn chế tầm thường, bạn có thể bẻ cong trình phân giải tên Java để tìm ra các loại. DMS sẽ cho phép bạn lắp ráp các cây tương ứng với các đoạn mã và kết hợp chúng lại thành các đoạn mã lớn hơn; khi công cụ của bạn thu thập sự kiện cho bảng biểu tượng, nó có thể xây dựng những cây nguyên thủy.
Một nơi nào đó, bạn phải quyết định bạn đã hoàn tất. Có bao nhiêu đơn vị kiểm tra công cụ phải xem trước khi nó biết toàn bộ giao diện? (Tôi đoán nó ăn tất cả những cái bạn cung cấp?). Sau khi hoàn thành, nó tập hợp các mảnh cho các thành viên khác nhau và xây dựng một AST cho một giao diện; DMS có thể sử dụng trình soạn thảo của nó để chuyển đổi AST trở lại thành mã nguồn như bạn đã hiển thị.
Tôi đề xuất Java ở đây vì giao diện người dùng Java của chúng tôi có độ phân giải tên và loại. Mặt trước C# của chúng tôi không có. Đây là một vấn đề "chỉ" của tham vọng; ai đó phải viết một, nhưng đó là khá nhiều công việc (ít nhất là cho Java và tôi không thể tưởng tượng C# là thực sự khác nhau).
Nhưng ý tưởng hoạt động tốt về nguyên tắc khi sử dụng DMS.
Bạn có thể thực hiện việc này với một số cơ sở hạ tầng khác đã cung cấp cho bạn quyền truy cập vào trình phân tích cú pháp và một trình phân giải tên và loại có thể uốn cong. Điều đó có thể không dễ dàng như vậy đối với C#; Tôi nghi ngờ MS có thể cung cấp cho bạn một trình phân tích cú pháp và truy cập vào độ phân giải tên và loại, nhưng không phải cách nào để thay đổi điều đó. Có lẽ Mono là câu trả lời?
Bạn vẫn cần một mã để tạo các đoạn mã và lắp ráp chúng. Bạn có thể cố gắng thực hiện điều này bằng cách lấy cắp chuỗi; kinh nghiệm của tôi (dài) với các bit chương trình dán với nhau là nếu bạn làm điều đó với các chuỗi bạn cuối cùng làm cho một mớ hỗn độn của nó. Bạn thực sự muốn các phần biểu diễn các đoạn mã của kiểu đã biết, chỉ có thể được kết hợp theo những cách mà ngữ pháp cho phép; DMS làm như vậy không có lộn xộn.
Bạn có thể làm điều đó với [mẫu T4.] (Http://msdn.microsoft.com/en-us/library/bb126445.aspx) Tôi không có mẫu tiện dụng, nhưng tôi có thể thử viết một, nếu bạn quan tâm. Tôi có thể thấy điều này có thể thực sự hữu ích trong việc phát triển Test-First (TDD); lừa là lấy mã của bạn để biên dịch trong khi bạn đang viết các bài kiểm tra cho các phương thức chưa tồn tại. Tất nhiên, vấn đề khác là Mẫu T4 có thể cần thông minh hơn những gì bạn đã mô tả, và tôi nghi ngờ bạn đã cung cấp một đặc điểm kỹ thuật đầy đủ trong ví dụ của bạn. –
@RobertHarvey, tôi đã thảo luận điều này với một đồng nghiệp, và anh ấy ấn tượng rằng có thể có quá nhiều suy luận để thực hiện. Tôi sẽ chỉ hạnh phúc với một cái gì đó mà làm việc một cách thông minh hơn đáng kể so với hiện tại "nhấp chuột phải" điên rồ :-) – Sklivvz