Tôi đang tìm cách thực hiện trình đọc S-biểu thức (được sử dụng sau này với cả trình thông dịch Scheme và trình biên dịch), nhưng tôi đã tự hỏi làm cách nào (nếu có) tôi nên viết một AST cho nó.Cách chính xác để phân tích biểu thức S trong OOP
Tôi đã đọc SICP và điều này khá đơn giản từ bên trong Đề án, nhưng tôi đang tìm cách triển khai trình biên dịch và trình biên dịch trong C++, theo kiểu OO. Vui lòng ghi nhớ rằng tôi đang làm điều này chỉ vì mục đích học tập, vì vậy tôi không thực sự tìm cách dễ nhất hoặc nhanh nhất để làm việc này, mà đúng hơn là cách sử dụng lại chính xác và có thể sử dụng lại được.
Tôi đã nhìn thấy trong một số triển khai Đề án mà mọi người phân tích s-biểu thức và các tế bào khuyết điểm dễ dàng đầu ra, một cái gì đó như thế này:
struct Sexpr
{
};
struct Cons : public Sexpr
{
Sexpr* left;
Sexpr* right;
};
struct IntAtom : Sexpr
{
int value;
};
Và một lớp con của Sexpr cho từng loại Scheme Atom
, hoặc cái gì đó dọc những dòng đó.
Tôi không chắc chắn, nhưng điều này có vẻ như một hack với tôi ... Công việc này không nên được thực hiện bởi một thông dịch viên hơn là người đọc?
Điều tôi muốn biết là nếu điều này được coi là cách tốt nhất (hoặc chính xác) của việc đọc biểu thức S, hay đây là công việc của người thông dịch nhiều hơn trình phân tích cú pháp? Nếu trình phân tích cú pháp có AST riêng của nó thay vì dựa vào các ô chống lại?
Nếu tôi đọc quyền này, câu hỏi không liên quan gì đến việc phân tích cú pháp. Thay vào đó, tôi nghĩ rằng bạn đang yêu cầu: đại diện thích hợp nhất cho kiểu dữ liệu biểu thức s là gì. Bạn có đồng ý không? – dyoo
@dyoo Có và không. Có, bạn nói đúng, tôi đang tìm đại diện thích hợp nhất cho biểu thức s. Và không, bạn sai, câu hỏi này rõ ràng không liên quan đến phân tích cú pháp. Nếu tôi chỉ tìm kiếm đại diện thích hợp nhất cho sexpr, sẽ không có nghi ngờ rằng nó sẽ là tế bào khuyết điểm. Tuy nhiên, tôi đang tìm đại diện thích hợp nhất của sexpr cụ thể ** để phân tích cú pháp **. – ivanmp
. Làm rõ. Sau đó: một điều có thể phân biệt nhiệm vụ phân tích cú pháp là sự cần thiết cho thông tin vị trí nguồn. Các ô khuyết điểm đơn giản không nhớ chúng xuất phát từ nguồn gốc ở đâu. Trong khi phân tích cú pháp, bạn có thể muốn hỗ trợ thông báo lỗi có thể trỏ đến nguồn. Chúng ta có thể cần những thứ gì khác để phân tích cú pháp? – dyoo