2011-08-01 21 views
7

ブロックのASTをRuby自体から取得することは可能ですか?RubyブロックからASTを抽出する

私はParseTreeとruby_parserの両方を見てきましたが、両方ともRuby 1.9.2のスケッチのサポート(私が読んだところのもの)を持っているようです。 1.9.2でうまくいくものが必要です。

答えて

7

リッパーは、MRI 1.9に同梱されています。 1.8で

ruby-1.9.2-p180 :004 > require 'ripper' 
=> true 
ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end") 
=> [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]] 

、RubyはASTをトラバースすることによってコードを実行するので、指定されたメソッド/ブロックに対してASTを取得することが可能です。 1.9ではそうではありません。コードは最初に解析され、YARVバイトコードに変換されて実行されます。変換ステップ後にソースもASTも保持されず、後者は可逆的ではありません。したがって、1.9でブロックのASTを取得することはできません。

+0

リッパーを使用してブロックからASTを取得するにはどうすればよいですか?私は何とかブロックのソースコードを取得しなければならないと仮定しています。 –

+0

情報ありがとう!それが働くためには '必要なリッパー 'をする必要があるようです。 –

+0

ああ。申し訳ありませんが、あなたの投稿をもっと慎重に読んでいたはずです。私は答えを更新しました。 – whitequark

関連する問題