Tôi hiện đang triển khai một trình đánh giá biểu thức (biểu thức dòng đơn, như công thức) dựa trên các điều sau đây:
- biểu thức đã nhập được mã hóa để phân tách booleans theo nghĩa đen, số nguyên, số thập phân, chuỗi, hàm, định danh (biến)
- Tôi đã triển khai thuật toán Shunting-yard (được sửa đổi nhẹ để xử lý các hàm với số lượng đối số thay đổi) để loại bỏ dấu ngoặc đơn và ra lệnh cho các toán tử có mức độ ưu tiên theo thứ tự hậu tố
- sân shunting của tôi chỉ đơn giản tạo ra một hàng mã thông báo (mô phỏng) (bằng một mảng, ngôn ngữ Powerbuilder Classic của tôi có thể định nghĩa các đối tượng, nhưng chỉ có mảng động là lưu trữ gốc - không phải danh sách thật, không có từ điển) mà tôi đánh giá tuần tự với máy xếp đơn giản
Người đánh giá của tôi đang làm việc tốt, nhưng tôi vẫn còn thiếu if()
và tôi đang tự hỏi làm thế nào để tiến hành.
Với đánh giá dựa trên tiền tố và ngăn xếp shunting-yard của tôi, nếu tôi thêm if()
dưới dạng một hàm khác với các phần đúng và sai, một đơn if(true, msgbox("ok"), msgbox("not ok"))
sẽ hiển thị cả hai thông báo trong khi tôi chỉ muốn hiển thị một thông báo. Điều này là do khi tôi cần đánh giá một hàm, tất cả các đối số của nó đã được đánh giá và đặt vào ngăn xếp.
Bạn có thể cho tôi một số cách để thực hiện if()
một cách lười biếng?
Tôi mặc dù về việc xử lý chúng như là một loại vĩ mô, nhưng tại thời điểm đầu tôi chưa đánh giá điều kiện. Có lẽ tôi cần sử dụng một loại cấu trúc khác ngoài hàng đợi để tách riêng điều kiện và biểu thức đúng / sai? Bây giờ biểu thức được phân tích cú pháp trước khi đánh giá, nhưng tôi cũng có kế hoạch lưu trữ biểu diễn trung gian dưới dạng biểu thức được biên dịch trước để đánh giá trong tương lai.
Chỉnh sửa : sau một số vấn đề, tôi nghĩ rằng tôi có thể xây dựng một biểu diễn cây biểu hiện của tôi (AST thay vì luồng mã thông báo tuyến tính), từ đó tôi có thể dễ dàng bỏ qua một hoặc một nhánh khác của tôi if()
.