iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

C again系列 第 21

用 Ripper 看 tokens, AST (3)

  • 分享至 

  • xImage
  •  

前面的例子雖然只用了 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:

  1. Ruby program 先被 tokenize 成 tokens
  2. tokens 比對 grammar 變成 AST,這裡就跳的有點快了。比對 grammar 是用 LALR 演算法拿 token 一個一個比對來決定結果,所以 AST root 的 program 以 tree 來講應該是第一個生成的 node, 但是從 LALR 的過程會是最後才知道是 program
  3. 上述 AST node 生成的順序先放一邊,node 的 type 和內容是在 yyparse 裡的 switch case,裡面一堆 yy 開頭的變數和 goto label 不知道該怎麼看才好。可能要先看 bison 瞭解其術語
  4. AST node 還要生成對應的 YARV instruction

上一篇
用 Ripper 看 tokens, AST (2)
下一篇
Bison
系列文
C again30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言