Извлечь АСТ из блока Ruby - PullRequest
7 голосов
/ 01 августа 2011

Возможно ли получить AST блока из самого Ruby?

Я посмотрел как ParseTree, так и ruby_parser, но они оба, похоже, имеют отрывочную поддержку (из того, что я читал) для Ruby 1.9.2.Мне нужно что-то, что хорошо работает с 1.9.2.

1 Ответ

7 голосов
/ 01 августа 2011

Потрошитель включен в МРТ 1.9 из коробки.

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]]]] 

В версии 1.8 Ruby выполняет код путем обхода AST, поэтому можно получить AST для данного метода / блока. В 1.9 это не так; код сначала анализируется, затем преобразуется в байт-код YARV, а затем выполняется. Ни источник, ни AST не сохраняются после этапа перевода, и последний не является обратимым; следовательно, вы не можете получить AST для блока в 1.9.

...