Lesson 09 — Tree-Walking Interpreter

Một interpreter thật cho ngôn ngữ đồ chơi — lexer + parser + eval(node, env) viết bằng JavaScript ngay trong trang này. Nhập chương trình → nó CHẠY, in ra kết quả và bảng biến. Ba module: REPL chạy được, eval stepper từng node, và demo lỗi runtime.

Cú pháp ngôn ngữ đồ chơi: gán x = biểu_thức · in print biểu_thức · rẽ nhánh if cond { ... } else { ... } · lặp while cond { ... }. Biểu thức: số, biến, + - * /, so sánh < > <= >= == !=, ngoặc ( ). Mỗi câu lệnh cách nhau bởi ; hoặc xuống dòng.

1. Live Interpreter (REPL) — chạy chương trình

Nhập một chương trình rồi bấm ▶ Chạy. Interpreter sẽ lexer → parser → eval, hiển thị output trên màn hình giả lập và bảng env (giá trị biến) lúc kết thúc.

Mẫu:
📺 Output
(chưa chạy)
🗂 env cuối cùng
(rỗng)

2. Eval Stepper — chạy từng node một

Cùng một interpreter nhưng dừng ở mỗi node. Node đang eval được tô cam; node đã xong tô xanh. Theo dõi giá trị trả về và env cập nhật từng bước.

Mẫu:
Bấm ⟳ Nạp chương trình để bắt đầu, rồi bấm Tiến → đi qua từng node.
🌳 AST (node đang eval được tô màu)
(chưa nạp)
🗂 env tại bước này
(rỗng)
📺 Output tích lũy

3. Runtime Error Demo — lỗi chỉ lộ lúc chạy

Các chương trình dưới đây compile sạch (cú pháp + kiểu đều ổn) nhưng vẫn lỗi khi chạy — vì lỗi phụ thuộc giá trị thật lúc eval. Bấm ▶ Chạy từng cái để thấy interpreter bắt lỗi mà không tự sập.

(a) Chia cho 0
x = 6
y = x - 6
print 10 / y
(b) Biến chưa gán
x = 5
print z

Đối chứng: chương trình hợp lệ ở dưới chạy bình thường — cùng interpreter, khác ở giá trị.

(c) Hợp lệ — chạy được
a = 2
b = a * a
print b

Bạn cũng có thể tự gây lỗi trong REPL ở Module 1, ví dụ: print 1/0 hay print abc. Interpreter báo lỗi rồi dừng — không phá cả trang.