2012-05-05 35 views
6

Tôi đang viết lại Jack Crenshaw's "hãy xây dựng trình biên dịch" từ Turbo Pascal 4.0 đến JAVA. Đây là động cơ thúc đẩy bởi vì cuốn sách kinh điển không có được nêu ra một O-O phiên bảnMẫu thiết kế để viết lại Crenshaw là "hãy xây dựng trình biên dịch"?

Is there a more modern, OO version of "Let's Build a Compiler"?

Cuốn sách chứa 15 chương. Trình biên dịch được trình bày theo cách gia tăng: Chương I cung cấp các mã mẫu soạn sẵn cho toàn bộ trình biên dịch, sau đó mỗi chương sẽ thêm một số dòng vào các thủ tục Pascal của chương tiền lệ.

Tôi đã dịch 2 chương đầu tiên, mỗi chương thành một gói, mỗi thủ tục Pascal như một phương thức được bảo vệ tĩnh trong JAVA, các thủ tục của một chương được tập hợp trong một lớp duy nhất. .

package td1; 
public class Cradle { 
    protected final static char TAB='\t'; 
    protected static char look; 

    protected static void getChar() throws IOException { 
     look=(char) System.in.read(); 
     }  
... 
} 

package td2; 

public class Cradle extends td1.Cradle{ 

    protected static void factor() throws IOException { 
    ... 
    } 

... 
} 

Tuy nhiên, khi tôi đến TD3, tôi phải cập nhật các yếu tố() của td2.Cradle, nhưng tôi không muốn thay đổi trong td2.Cradle yếu tố(), vì đó sẽ làm cho các yếu tố() trong td2 làm nhiều hơn mức cần phải trình bày trong td2. Tôi nghĩ về "mở rộng" td2.Cradle(), tuy nhiên, có vẻ như không thể mở rộng một lớp tĩnh.

My related question here

Có lẽ tôi nên thay đổi mọi phương pháp tĩnh để một không tĩnh?

Tôi chắc chắn cần một số mẫu thiết kế ở đây, bất kỳ ai có thể trợ giúp? Tôi hy vọng tôi đã rõ ràng. Tóm lại, dự án này từng bước trình bày ngày càng nhiều hướng dẫn cho từng quy trình và tôi hy vọng sẽ ghi lại các bước trung gian bằng cách sử dụng một số cơ chế JAVA như kế thừa.

Mã Pascal là cuốn sách kinh điển ở đây LBC. Tôi cảm thấy cố gắng sử dụng thừa kế vì

  1. Mỗi chương cuộc gọi/thêm một chút đường để làm thủ tục theo quy định tại chương tiền lệ
  2. tôi hy vọng sẽ làm cho mã nguồn JAVA tôi có thể sử dụng để tất cả những ai muốn làm theo LBC từng bậc thang. Vì vậy, nó không phải là thích hợp để sử dụng một lớp duy nhất để đưa vào mã nguồn cuối cùng của trình biên dịch của tác giả. Nó là điều cần thiết để phân chia các mã theo chương và tăng dần chúng như Crenshaw đã làm.

Giải pháp thực tế của tôi là giữ nguyên các phương thức tp1.Côi là tĩnh. Các phương thức trong tp2.Cradle, tp3.Cradle, ..., cho đến tp15.Cặp sẽ không tĩnh và tất cả chúng đều nhập nhập tĩnh tp1.Cradle. *. Hơn nữa, đối với mỗi số nguyên i lớn hơn 2, tp [i] .Cố mở rộng tp [i-1] .Cradle.

Đừng ngần ngại cho tôi biết giải pháp tốt hơn.

+1

Bạn có thể thêm mã Pascal mà bạn đang cố viết lại không? Tôi hiểu rằng bạn đã sử dụng các phương thức tĩnh Java cho các thủ tục trong Pascal. Từ những câu hỏi không rõ ràng với tôi tại sao bạn muốn sử dụng thừa kế. – Seitaridis

+1

@Seitaridis LBC chính nó chứa mã pascal, chỉ cần theo các liên kết ... –

Trả lời

1

Có vẻ như bạn đang đi đúng hướng. Để có thể ghi đè các phương thức này, chúng phải là các phương thức thể hiện. Và vì vậy bạn nên di chuyển ra khỏi một mô hình dựa trên các "phương thức toàn cục" này, cho một mô hình dựa trên cá thể, nơi bạn tạo một cá thể của lớp Cradle và gọi các phương thức thích hợp trên cá thể đó.

+0

Cảm ơn câu trả lời này.Tôi cập nhật giải pháp thực tế của mình ở trên. Nó có thể không phải là một thanh lịch, nhưng nó hoạt động. – zell

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