要約
Ruby のコードをパースして得られる抽象構文木を扱うモジュールです。
抽象構文木はRubyVM::AbstractSyntaxTree::Nodeクラスのインスタンスとして表されます。
このモジュールはMRIの抽象構文木の実装の詳細を表します。
このモジュールは実験的であり、安定したAPIではないため、予告なしに変更される可能性があります。例えば、子要素の順序は保証されておらず、子要素の数は変更される可能性があります。また子要素に名前でアクセスする方法は提供されていません。
もし安定したAPIやMRI以外の実装で抽象構文木を扱いたい場合、 parser gem (https://github.com/whitequark/parser)や Ripperの使用を検討してください。もし RubyVM::AbstractSyntaxTree のAPIを安定にしたい場合、[feature#14844] での議論に参加してください。
目次
- 特異メソッド
特異メソッド
of(proc) -> RubyVM::AbstractSyntaxTree::Node
[permalink][rdoc][edit]of(proc, keep_script_lines: false, error_tolerant: false, keep_tokens: false) -> RubyVM::AbstractSyntaxTree::Node
-
引数 proc に渡したProcやメソッドオブジェクトの抽象構文木を返します。
このメソッドはProcやメソッドが定義されたファイルを読み込む必要があるため、 irbのようなファイルを介さない対話的環境では動作しません。
- [PARAM] proc:
- Procもしくはメソッドオブジェクトを指定します。
- [PARAM] keep_script_lines:
- true を指定すると、 Node#script_lines でノードと関連づけられたソースコードのテキストを取得できます。
- [PARAM] keep_tokens:
- true を指定すると、 Node#token が利用できます。
- [PARAM] error_tolerant:
- true を指定すると、構文エラーが発生した際にエラー箇所を type が :ERROR であるようなノードに置き換えてツリーを生成します。
pp RubyVM::AbstractSyntaxTree.of(proc {1 + 2}) # => (SCOPE@2:38-2:45 # tbl: [] # args: nil # body: # (OPCALL@2:39-2:44 (LIT@2:39-2:40 1) :+ # (LIST@2:43-2:44 (LIT@2:43-2:44 2) nil))) def hello puts "hello, world" end pp RubyVM::AbstractSyntaxTree.of(method(:hello)) # => (SCOPE@5:0-7:3 # tbl: [] # args: # (ARGS@5:9-5:9 # pre_num: 0 # pre_init: nil # opt: nil # first_post: nil # post_num: 0 # post_init: nil # rest: nil # kw: nil # kwrest: nil # block: nil) # body: # (FCALL@6:2-6:21 :puts (LIST@6:7-6:21 (STR@6:7-6:21 "hello, world") nil)))
parse(string) -> RubyVM::AbstractSyntaxTree::Node
[permalink][rdoc][edit]parse(string, keep_script_lines: false, error_tolerant: false, keep_tokens: false) -> RubyVM::AbstractSyntaxTree::Node
-
文字列を抽象構文木にパースし、その木の根ノードを返します。
- [PARAM] string:
- パースする対象の Ruby のコードを文字列で指定します。
- [PARAM] keep_script_lines:
- true を指定すると、 Node#script_lines でノードと関連づけられたソースコードのテキストを取得できます。
- [PARAM] keep_tokens:
- true を指定すると、 Node#token が利用できます。
- [PARAM] error_tolerant:
- true を指定すると、構文エラーが発生した際にエラー箇所を type が :ERROR であるようなノードに置き換えてツリーを生成します。
- [EXCEPTION] SyntaxError:
- string が Ruby のコードとして正しくない場合に発生します。
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) :+ (LIST@1:8-1:9 (LIT@1:8-1:9 2) nil)))) pp RubyVM::AbstractSyntaxTree.parse("x = 1; p(x; y=2", error_tolerant: true) # => (SCOPE@1:0-1:15 # tbl: [:x, :y] # args: nil # body: (BLOCK@1:0-1:15 (LASGN@1:0-1:5 :x (LIT@1:4-1:5 1)) (ERROR@1:7-1:11) (LASGN@1:12-1:15 :y (LIT@1:14-1:15 2))))
parse_file(pathname) -> RubyVM::AbstractSyntaxTree::Node
[permalink][rdoc][edit]parse_file(pathname, keep_script_lines: false, error_tolerant: false, keep_tokens: false) -> RubyVM::AbstractSyntaxTree::Node
-
pathname のファイルを読み込み、その内容を抽象構文木にパースし、その木の根ノードを返します。
- [PARAM] pathname:
- パースする対象のファイルパスを指定します
- [PARAM] keep_script_lines:
- true を指定すると、 Node#script_lines でノードと関連づけられたソースコードのテキストを取得できます。
- [PARAM] keep_tokens:
- true を指定すると、 Node#token が利用できます。
- [PARAM] error_tolerant:
- true を指定すると、構文エラーが発生した際にエラー箇所を type が :ERROR であるようなノードに置き換えてツリーを生成します。
- [EXCEPTION] SyntaxError:
- pathname から取得された文字列が Ruby のコードとして正しくない場合に発生します。
pp RubyVM::AbstractSyntaxTree.parse_file(__FILE__) # => (SCOPE@1:0-1:50 # tbl: [] # args: nil # body: # (FCALL@1:0-1:50 :pp # (LIST@1:3-1:50 # (CALL@1:3-1:50 # (COLON2@1:3-1:29 (CONST@1:3-1:9 :RubyVM) :AbstractSyntaxTree) # :parse_file (LIST@1:41-1:49 (STR@1:41-1:49 "") nil)) nil)))