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]]]]
Run Code Online (Sandbox Code Playgroud)
是否有一个库可以使用这个AST并将其转换回Ruby代码?
ruby_parser和ruby2ruby曾经这样做,但我想使用Ripper作为我的解析器.(Ruby 1.9甚至可能附带这样的库,但是我甚至在Ripper本身也很难找到文档)
我正在尝试学习Ruby词法分析器和解析器(whitequark解析器)以了解有关从Ruby脚本进一步生成机器代码的过程的更多信息.
在解析以下Ruby代码字符串时.
def add(a, b)
return a + b
end
puts add 1, 2
Run Code Online (Sandbox Code Playgroud)
它导致以下S表达式表示法.
s(:begin,
s(:def, :add,
s(:args,
s(:arg, :a),
s(:arg, :b)),
s(:return,
s(:send,
s(:lvar, :a), :+,
s(:lvar, :b)))),
s(:send, nil, :puts,
s(:send, nil, :add,
s(:int, 1),
s(:int, 3))))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下:在结果S表达式表示法中发送关键字的定义?