ParseTree 是一个用来访问 Ruby 代码解析树的程序库,这个 Ruby 代码可以是源代码,也可以是已经加载到解释器的代码(即实时访问)。
ParseTree 的开发者之一,Ryan Davis,在最近的一篇博客中宣布了 ParseTree 的去留:
ParseTree 在 ruby 1.9 上已经玩完了,我们也没打算让它在 ruby 1.9 上再运行起来。 主要原因在于 ruby 1.9 内部实现的改变,我们也试图获取一些钩子或者能让 ParseTree 工作的其它方法,但迟迟没有得到回复。
如果你想用 ParseTree 来获取一个运行时方法 / 块 / 过程的抽象语法树,那么我们只好说抱歉了。如果你只是想用 ParseTree 来做静态分析,那么你可以在一分钟内切换到 ruby_parser,它是 ParseTree 的一个最佳替代者。
所以我们看到,ParseTree 在 Ruby 1.8.x 上能很好地工作,但它不再提供对 Ruby 1.9.1 的支持。尽管我们也能通过一些办法,让 ParseTree 的部分功能工作起来。幸运的是,Ruby 1.9.x 带来了 Ripper ,一个用来解析 Ruby 代码和分析语法树的工具。
ruby_parser 是 Ryan Davis 编写的另一个 Ruby 语法分析器,它是纯 Ruby 实现的,并且在输出上和 ParseTree 保持一致。如果只是对源代码进行静态分析,那么最好的选择就是切换到ruby_parser,因为你不需要更改任何代码。Ruby_parser 还能提供抽象语法树节点的源码位置,这是Ruby 代码分析或者代码转换工具的必需信息。使用ruby_parser 可以让这些工具得以在大多数Ruby 实现上工作,而ParseTree 只能在MRI 上工作(虽然在一个接近完成版本的JRuby 上也可以,但还是缺少一些运行时特性)。
但跟ruby_parser 相比,ParseTree有一个重要特性,就是能实时访问解析树。有些库利用这个特性来对运行时Ruby 代码进行分析。比如Merb 的action arguments,一个用来分析方法形参的工具。这个功能已经被移植到JRuby 上(无需ParseTree),往Ruby 1.9.1 上的移植也已经通过methopara 项目完成。Methopara 是YARV 创建者Sasada Koichi 和 asakusa.rb (一个东京的 Ruby 用户组)的成员们共同完成的。 Methopara 项目给 Ruby 1.9.1 带来了新的 API :
这个 gem 只提供给 Ruby-1.9.1。因为 Ruby18x 已经拥有 merb-action-args,而 Ruby-1.9.2 和它的后续者将会内置 Method#parameters。
那么,你是否在使用 ParseTree 呢?如果是,你可以用 ruby_parser 来做替代么?如果不行,ParseTree 在 Ruby-1.9.x 上的不可再用是否给你带来了很大的困扰呢?
查看英文原文: The Future of ParseTree
评论