Tôi phải đánh giá một số lượng lớn các biểu thức có chứa các biến và tôi đang nghĩ đến việc viết một trình thông dịch nhỏ để biên dịch nhanh và nhỏ. Tuy nhiên tôi không có kinh nghiệm với chủ đề này và có một vài câu hỏi.Trình thông dịch tùy chỉnh cho các biểu thức toán học
Giả sử chúng tôi có tệp có biểu thức toán học và tập hợp các đối tượng có giới hạn. Các tập tin có thể trông giống như:
expr[x,y,z] = 2*x*y + x^2 + 28/14*z*(x*y^2 + 15*z) + ...
Tôi muốn phân tích này bằng cách nào đó để tôi có thể đánh giá các biểu thức về số trong ứng dụng của tôi bằng cách đơn giản gọi một hàm expr(float x, float y, float z)
. Không được sửa số tham số (EDIT: mỗi biểu thức sẽ có định nghĩa riêng với số tham số thích hợp hoặc sẽ chấp nhận một mảng) và lồng vào dấu ngoặc đơn sẽ được phép giữ các tệp đầu vào hợp lý nhỏ.
Vì biểu thức là tất cả các loại đa thức, tôi có thể nghĩ cấu trúc dữ liệu trông như thế nào, nhưng việc phân tích cú pháp có vẻ khó khăn. Tôi đã tìm thấy một số câu trả lời cho một số câu hỏi tương tự ở đây trên SO, ví dụ bằng cách sử dụng Lua.
Câu hỏi lớn nhất, tuy nhiên, là hình phạt hiệu suất sẽ là khi tạo và gọi các đối tượng đó so với việc biên dịch trực tiếp các biểu thức này từ mã C được tạo tự động.
Cảm ơn trước!
CHỈNH SỬA: Vui lòng xem xét ví dụ về expr()
ở trên chỉ như vậy. Tôi đoán cách tốt nhất là để có các đối tượng của một lớp templated giữ hệ số và quyền hạn của các biến trong mảng thưa thớt.
"kêu gọi một hàm expr (float x, float y, nổi z) Số lượng các thông số không nên cố định." - bạn đã có một chút của một vấn đề ở đó, sau đó, vì số lượng tham số trong C hoặc gọi hàm C++ * là * cố định. Ngay cả với varargs, nơi callee có thể đối phó với các số khác nhau, người gọi phải sửa số ở thời gian biên dịch. Bạn có lẽ sẽ cần phải vượt qua một mảng thay thế. –
@Steve Jessop: Đã sửa lỗi, tôi biết điều này. – bbtrb
Tại sao bạn không viết biểu thức hàm của bạn dưới dạng hàm C và biên dịch/chạy nó? –