ParseTree 前路茫茫

  • Werner Schuster
  • 胡振波

2009 年 4 月 26 日

话题:Ruby语言 & 开发架构文化 & 方法

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

Ruby语言 & 开发架构文化 & 方法