前面的例子雖然只用了 puts
但覺得還是複雜。
用更簡單的,什麼都沒有的情況,仍然會看到 Ruby program 的 root program
,另多出一個 void_stmt
:
pp Ripper.sexp <<~RUBY
RUBY
[:program, [[:void_stmt]]]
這次多加一個數字,
pp Ripper.sexp <<~RUBY
42
RUBY
[:program, [[:@int, "42", [1, 0]]]]
雖然用 Ripper 可以看到產生的 AST,但我想知道的是更具體 Ruby program 在 YARV 一步步怎麼被處理的。再一次整理大概的流程,再想辦法找 code:
program
以 tree 來講應該是第一個生成的 node, 但是從 LALR 的過程會是最後才知道是 program
?yyparse
裡的 switch case,裡面一堆 yy 開頭的變數和 goto label 不知道該怎麼看才好。可能要先看 bison 瞭解其術語