标签: ruby-ripper

我如何将Ripper的AST重新编译回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]]]]
Run Code Online (Sandbox Code Playgroud)

是否有一个库可以使用这个AST并将其转换回Ruby代码?

ruby_parser和ruby2ruby曾经这样做,但我想使用Ripper作为我的解析器.(Ruby 1.9甚至可能附带这样的库,但是我甚至在Ripper本身也很难找到文档)

ruby abstract-syntax-tree ruby-ripper

6
推荐指数
1
解决办法
1143
查看次数

Ruby的AST中'send'关键字的含义是什么?

我正在尝试学习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表达式表示法中发送关键字的定义?

ruby parsing abstract-syntax-tree s-expression ruby-ripper

5
推荐指数
1
解决办法
182
查看次数