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

时间:2011-02-02 18:00:04

标签: ruby abstract-syntax-tree ruby-ripper

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 and ruby2ruby曾经这样做,但我想使用Ripper作为我的解析器。 (Ruby 1.9甚至可能附带这样的库,但我很难在Ripper本身找到文档)

1 个答案:

答案 0 :(得分:4)

请参阅“Sorcerer”。这很好但我在解析方法时发现了一个错误。如果在文件“lib / sorcerer / resource.rb”的第301行下面添加src.emit("; "),则会修复此问题。但如果你决定使用它,你可能会发现更多。祝你好运。