Ruby 4.1 リファレンスマニュアル

instance method RubyVM::InstructionSequence#syntax_tree

syntax_tree -> Prism::Node | RubyVM::AbstractSyntaxTree::Node | nilRuby 4.1 から[permalink][rdoc][edit]

self のコンパイル元になった抽象構文木(AST)のノードを、コンパイルに使ったのと同じパーサでソースを再度パースし直すことで返します。

デフォルトの prism でコンパイルされていれば Prism::Node を、parse.y でコンパイルされていれば RubyVM::AbstractSyntaxTree::Node を返します。

以下のように、ノードを確実に取得できない場合は nil を返します。

  • ソースを利用できない場合(文字列からコンパイルした場合や、RubyVM.keep_script_lines を有効にせずに eval したコードなど)
  • コンパイルしたあとにソースファイルが変更されている場合

デフォルトの prism gem 以外の prism gem が読み込まれていると、$VERBOSE が真のときに警告が出力されます。この場合、読み込まれている prism がコンパイル時に使われたパーサと異なる解釈をする可能性があるため、返されるノードが実際に実行されたコードと対応しないことがあります。

このメソッドは実験的なもので、予告なく変更される可能性があります。

# /tmp/hello.rb
puts "hello, world"

iseq = RubyVM::InstructionSequence.compile_file("/tmp/hello.rb")
p iseq.syntax_tree.type # => :program_node

# 文字列からコンパイルした場合はソースを再度読み込めないので nil
p RubyVM::InstructionSequence.compile("1 + 2").syntax_tree # => nil

[SEE_ALSO] RubyVM::InstructionSequence#node_id, RubyVM::InstructionSequence#source_hash, Proc#syntax_tree