iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

C again系列 第 20

用 Ripper 看 tokens, AST (2)

  • 分享至 

  • xImage
  •  

Ripper.sexp 看 AST 內容

require 'ripper'
require 'pp'
pp Ripper.sexp <<~RUBY
  1+2*3
  puts "123"
RUBY
[:program,
 [[:binary,
   [:@int, "1", [1, 0]],
   :+,
   [:binary, [:@int, "2", [1, 2]], :*, [:@int, "3", [1, 4]]]],
  [:command,
   [:@ident, "puts", [2, 0]],
   [:args_add_block,
    [[:string_literal, [:string_content, [:@tstring_content, "123", [2, 6]]]]],
    false]]]]

找不到文件說明,從 parse.c comment 可以看到一些說明

  • program: $@1 top_compstmt,簡單地說是 Ruby 程式 AST 的 root
  • command: fcall command_args,是 function call + arg 組合

但沒找到 binary 的 grammar

試著從比較單純的 command: fcall command_args 理解。parse.c 與 ripper.c 的內容不一樣,後者應該是為了 Ripper 有修改。要知道實際 YARV 的操作要看 parse.c,從它的程式碼再回推 parser 相關 struct 裡欄位的用途

			(yyvsp[-1].node)->nd_args = (yyvsp[0].node);
			nd_set_last_loc((yyvsp[-1].node), (yylsp[0]).end_pos);
			(yyval.node) = (yyvsp[-1].node);

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

尚未有邦友留言

立即登入留言