Как мне перекомпилировать AST Ripper обратно в код Ruby?

Ripper — это библиотека синтаксического анализа, которая поставляется с Ruby 1.9. Он преобразует код Ruby в AST, например:

pp Ripper.sexp("def foo; yield :a; return 1 end")

#=>

[:program,
 [[:def,
   [:@ident, "foo", [1, 4]],
   [:params, nil, nil, nil, nil, nil],
   [:bodystmt,
    [[:yield,
      [:args_add_block,
       [[:symbol_literal, [:symbol, [:@ident, "a", [1, 16]]]]],
       false]],
     [:return, [:args_add_block, [[:@int, "1", [1, 26]]], false]]],
    nil,
    nil,
    nil]]]]

Есть ли библиотека для преобразования этого AST обратно в код Ruby?

ruby_parser и ruby2ruby раньше делали это, но я хотел бы использовать Ripper в качестве анализатора. (Ruby 1.9 может даже поставляться с такой библиотекой, но я изо всех сил пытаюсь найти документацию даже по самому Ripper)


person Jon Smock    schedule 02.02.2011    source источник
comment
Я играл с github.com/svenfuchs/ripper2ruby с учетом artweb-design.de/2009/7/5/ , но он умер с NoMethodError: неопределенный метод `to_ruby' для #‹Ruby::Node::Composite::Array:0x9aa7540›. Не знаю, куда идти оттуда.   -  person Seamus Abshere    schedule 02.02.2011
comment
Я нашел это в какой-то момент, но это просто не казалось надежным. Спасибо, что поделились своим опытом.   -  person Jon Smock    schedule 02.02.2011


Ответы (1)


См. "Sorcerer". Это работает хорошо, но я обнаружил ошибку при разборе методов. Если вы добавите src.emit("; ") под строкой 301 файла "lib/sorcerer/resource.rb", это будет исправлено. Но вы можете найти больше, если решите использовать это. Удачи.

person Guilherme Bernal    schedule 02.02.2011
comment
Спасибо - похоже, это лучшее, что есть на данный момент! - person Jon Smock; 05.02.2011
comment
актуальная версия находится здесь github.com/rspec-given/sorcerer - person stefkin; 01.05.2020