Tập 73: Lexer và parser viết bằng DUY

Sprint 127 là trận đánh đầu tiên của quá trình viết compiler bằng chính nó: hiện thực hóa Lexer và Parser native.

Chúng tôi viết tools/lex_core.duy (482 dòng) và tools/parse_core.duy (331 dòng) bằng chính mã nguồn DUY M7 hợp lệ. Nhiệm vụ là chúng phải dịch được toàn bộ các file trong regression corpus mà không sinh ra bất kỳ sự sai lệch AST nào so với JS oracle.

source.duy -> [ parse_core.duy ] -> AST digest \  Must match
           -> [ duyc.js parser ] -> AST digest /  exactly!

Tôi đã dành trọn ba đêm để debug Parser native. Ban đầu, parser native bị treo (infinite loop) khi parse các biểu thức toán tử có độ ưu tiên phức tạp (như x + y * z). Thủ phạm là do thuật toán Pratt parser viết bằng DUY bị lệch chỉ số token lookahead ở ranh giới của các câu lệnh rẽ nhánh. Khi parser đọc token tiếp theo, nó không tăng con trỏ đọc đúng cách, dẫn đến việc đọc đi đọc lại cùng một token dấu nhân * không ngừng.

Nhìn terminal bị đóng băng và CPU quạt rú lên điên cuồng, tôi phải dùng cơ chế ghi log thô ra cổng serial để theo dõi từng bước nhảy của con trỏ token. Sau nhiều giờ debug căng thẳng, sửa đổi thuật toán lấy token và gỡ bỏ hoàn toàn các đoạn code thừa, compiler mới đã đạt tới trạng thái khớp 100% digest. lex-compare xanh trên 10 file corpus, parse-compare xanh trên 11 file corpus, 0 mismatch. Trình biên dịch native đã có mắt và tai để tự đọc hiểu cú pháp của chính mình.


Bình luận (0)

Đang tải bình luận...