从Ruby块中提取AST

ano*_*ard 7 ruby reflection abstract-syntax-tree ruby-1.9.2

是否有可能从Ruby本身获取块的AST?

我已经看过ParseTree和ruby_parser,但他们似乎都对Ruby 1.9.2有粗略的支持(从我读过的内容).我需要一些适合1.9.2的东西.

whi*_*ark 7

开膛器包含在MRI 1.9开箱即用中.

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]]]] 
Run Code Online (Sandbox Code Playgroud)

在1.8中,Ruby通过遍历AST来执行代码,因此可以获得给定方法/块的AST.在1.9中并非如此; 首先解析代码,然后转换为YARV字节码,然后执行.翻译步骤后不保留源,也不保留AST,后者不可逆; 因此你无法在1.9中获得块的AST.

  • @charlie你可以使用sourcify gem从块中获取源代码 (3认同)