Tôi nghĩ sẽ vui nếu nghỉ ngơi từ content thực tế, hữu ích để show cho bạn một trò Ruby party trick.
Trước khi Ruby chạy chương trình của bạn, nó phải parse nó. Parser là một loại state machine. Và có một flag command line ít người biết cho phép Ruby log mọi thứ state machine làm.
Hãy lấy ví dụ sau:
a = 1 + 2
Nếu tôi chạy này dùng flag -y, tôi nhận output sau:
$ ruby -y sample.rb Starting parse Entering state 0 Reducing stack by rule 1 (line 903): -> $$ = nterm $@1 () Stack now 0 Entering state 2 Reading a token: Next token is token tIDENTIFIER () Shifting token tIDENTIFIER () Entering state 35 Reading a token: Next token is token '=' () Reducing stack by rule 509 (line 4417): $1 = token tIDENTIFIER () -> $$ = nterm user_variable () Stack now 0 2 Entering state 113 Next token is token '=' () Reducing stack by rule 100 (line 1764): $1 = nterm user_variable () -> $$ = nterm lhs () Stack now 0 2 ... 140 more lines
Điều chúng ta thấy ở đây là Ruby parser vòng qua từng token trong file và thực hiện các operation sau:
- Thêm token vào stack
- So sánh stack với danh sách rules
- Nếu token khớp rule, làm state transition
- Nếu không khớp, thêm token khác vào stack và thử lại.
Tất cả states và rules được định nghĩa trong parse.y, file được xử lý bởi bison parser generator để generate parser thực tế bằng C.