从 Ruby 代码块中提取 AST

7

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

我已经查看了ParseTree和ruby_parser,但它们似乎都对Ruby 1.9.2支持不完全(根据我所读的)。我需要与1.9.2良好配合的东西。

1个回答

6

Ripper已经默认包含在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]]]] 

在1.8版本中,Ruby通过遍历AST来执行代码,因此可以获取给定方法/块的AST。但在1.9版本中不是这样的;代码首先被解析,然后转换为YARV字节码,最后执行。在翻译步骤之后,源代码和AST都不会被保留,而后者也不可逆转;因此你无法在1.9中获取块的AST。

我该如何使用Ripper从一个块中获取AST?我猜我得以某种方式获取该块的源代码。 - user47322
3
你可以使用Sourcify gem从块中获取源代码。 - Surya
在 Ruby 1.9+ 中无法获取块的源代码是不正确的,虽然 Ruby 本身无法实现,但例如 Sourcify 可以很好地解决这个问题。 - Rune FS
@RuneFS,不行;Sourcify使用了一种根本上不完美的方法,无法处理所有代码。 - whitequark
@RuneFS,你可以轻松地解析源代码,但是除非Ruby报告足够分辨位于同一行的lambda表达式的源位置,否则这样做没有意义。而MRI的解析器很不可能报告列号。 - whitequark
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接