是否可以从 Ruby 本身获取块的 AST?
我已经查看了 ParseTree 和 ruby_parser,但它们似乎都对 Ruby 1.9.2 有粗略的支持(从我读过的内容来看)。我需要一些适用于 1.9.2 的东西。
是否可以从 Ruby 本身获取块的 AST?
我已经查看了 ParseTree 和 ruby_parser,但它们似乎都对 Ruby 1.9.2 有粗略的支持(从我读过的内容来看)。我需要一些适用于 1.9.2 的东西。
开箱即用的 MRI 1.9 中包含 Ripper。
ruby-1.9.2-p180 :004 > require 'ripper'
=> true
ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end")
=> [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]]
在 1.8 中,Ruby 通过遍历 AST 来执行代码,因此可以获取给定方法/块的 AST。在 1.9 中并非如此;代码首先被解析,然后转换为 YARV 字节码,然后执行。不是源,也不是 AST 在翻译步骤之后保留,后者是不可逆的;因此,您无法在 1.9 中获得块的 AST。