Ruby2.6アドベントカレンダーの17日目の記事です。
RubyVM::AbstractSyntaxTree
Ruby スクリプトを解析して抽象構文木を作成するクラスが追加されました。
RubyVM::AbstractSyntaxTree.parse
は引数の文字列をパースします。
pp RubyVM::AbstractSyntaxTree.parse('x = 1 + 2') #=> (SCOPE@1:0-1:9 # tbl: [:x] # args: nil # body: # (LASGN@1:0-1:9 :x # (OPCALL@1:4-1:9 (LIT@1:4-1:5 1) :+ (ARRAY@1:8-1:9 (LIT@1:8-1:9 2) nil))))
RubyVM::AbstractSyntaxTree.parse_file
は引数にファイル名を指定し、そのファイルを読み込みパースします。
RubyVM::AbstractSyntaxTree.of
は Method や Proc オブジェクトから構文木を生成します。
proc = ->(a){ a + 123 } pp RubyVM::AbstractSyntaxTree.of(proc) #=> (SCOPE@1:9-1:23 # tbl: [:a] # args: # (ARGS@1:10-1:11 # pre_num: 1 # pre_init: nil # opt: nil # first_post: nil # post_num: 0 # post_init: nil # rest: nil # kw: nil # kwrest: nil # block: nil) # body: # (OPCALL@1:14-1:21 (DVAR@1:14-1:15 :a) :+ # (ARRAY@1:18-1:21 (LIT@1:18-1:21 123) nil)))