用 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 的 rootcommand: 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);