如何将Ripper的AST重新编译为Ruby代码?

9

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本身的文档)


我尝试使用 https://github.com/svenfuchs/ripper2ruby 和 http://www.artweb-design.de/2009/7/5/ripper2ruby-modify-and-recompile-your-ruby-code 进行实验,但是它报错 NoMethodError: undefined method `to_ruby' for #Ruby::Node::Composite::Array:0x9aa7540。不确定下一步该怎么做。 - Seamus Abshere
我发现在某些时候它似乎不太可靠。感谢您提供的经验。 - Jon Smock
1个回答

6

请查看 "Sorcerer"。这个工具很好用,但是我在解析方法时发现了一个bug。如果你在文件“lib/sorcerer/resource.rb”的第301行下面添加src.emit("; "),问题就会得到解决。但如果你决定使用它,可能会发现更多问题。祝你好运。


谢谢 - 这看起来是目前最好的东西! - Jon Smock
1
最新版本在这里 https://github.com/rspec-given/sorcerer - stefkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接