Tôi đang tạo một trình biên dịch với Lex và YACC (thực sự là Flex và Bison). Ngôn ngữ cho phép tham chiếu chuyển tiếp không giới hạn tới bất kỳ biểu tượng nào (như C#). Vấn đề là không thể phân tích ngôn ngữ mà không biết mã định danh là gì.Làm cách nào để triển khai các tham chiếu chuyển tiếp trong trình biên dịch?
Giải pháp duy nhất tôi biết là lex toàn bộ nguồn và sau đó thực hiện phân tích "đầu tiên", vì vậy các cấp cao hơn như khai báo lớp và khai báo hàm được phân tích cú pháp trước các hàm sử dụng chúng. Tuy nhiên, điều này sẽ mất một lượng lớn bộ nhớ cho các tệp lớn và sẽ khó xử lý với YACC (tôi sẽ phải tạo các ngữ pháp riêng cho từng loại khai báo/thân). Tôi cũng sẽ phải viết tay lexer (đó không phải là một vấn đề lớn).
Tôi không quan tâm nhiều về hiệu quả (mặc dù nó vẫn quan trọng), bởi vì tôi sẽ tự viết lại trình biên dịch khi tôi hoàn thành nó, nhưng tôi muốn phiên bản đó nhanh (vì vậy nếu có là bất kỳ kỹ thuật chung nhanh nào không thể thực hiện được trong Lex/YACC nhưng có thể được thực hiện bằng tay, hãy đề nghị chúng cũng được). Vì vậy, ngay bây giờ, dễ phát triển là yếu tố quan trọng nhất.
Có giải pháp nào tốt cho vấn đề này không? Điều này thường được thực hiện như thế nào trong các trình biên dịch cho các ngôn ngữ như C# hoặc Java?
Nó không có gì để làm với các từ khóa. Nó giống như thế này: là ABC (gói AB). (Lớp C), (gói A) (lớp B). (Trường C), hoặc (fieled A). (Trường B). (Trường C), v.v. – Zifre
Sau đó, đoạn thứ hai của câu trả lời của tôi sẽ được áp dụng. Bạn không cần phải biết rằng để phân tích cú pháp. Đãi '.' như một toán tử trong ngữ pháp của bạn. Trong AST của bạn, bạn có thể kiểm tra chúng trên bảng biểu tượng. – U62
Vâng, tôi đoán tôi sẽ phải tạo ra một cây phân tích chứ không phải là một AST. Như bạn nói chúng khác nhau. Nếu không ai khác đưa ra một câu trả lời tốt hơn, tôi sẽ chấp nhận điều này, nhưng tôi thực sự không muốn làm theo cách này ... – Zifre