1

当向 Ruby 的 ripper 库提供格式错误的输入时,有没有人想出如何检测错误?

ruby-1.9.2-p180 :002 > Ripper.sexp("array[1 2]")
 => [:program, [:@int, "2", [1, 8]]] 
ruby-1.9.2-p180 :003 >

我浏览了一下源代码,发现了#compile_error、#warning、#warn 和#yydebug,但目前还不清楚如何让这些方法中的任何一个起作用。毫无疑问,这里有一些简单的答案。

4

1 回答 1

1

我想我在某处读到 ruby​​ ripper 扩展仍在积极开发中,所以如果还没有人开始连接#compile_error、#warning 或 #warn,我不会感到惊讶。

Ripper#yydebug 在 Ruby 1.9.3 中工作,它可能在 1.9.2 中工作,我只是做错了什么。但它会打印出调试信息,其中只有一小部分会与错误相关。

这是检测错误的一种直接方法:

require 'ripper'
require 'pp'

class SexpBuilderPP < Ripper::SexpBuilderPP
  def on_parse_error(*)
    raise "parse error!"
  end
end

while input = $stdin.gets
  pp SexpBuilderPP.new(input).parse
end

有几个事件名称中包含“error”:on_alias_error、on_assign_error、on_class_name_error、on_param_error 和 on_parse_error。

于 2011-10-19T23:10:24.710 回答