Rubyの標準添付ライブラリripperでRubyのソースをパースするで紹介したとおり、ripperはRubyスクリプトのパーサである。
このripperを拙作のvimプラグイン RubyJumpで使いたいと思ったのだが、RubyJumpは編集中のRubyスクリプトが渡されるケースもあり、シンタックスエラーのあるRubyスクリプトが入力される可能性がある。
ripperによるパースがコケた場合は、フェールバックとして正規表現によるパースを行いたかったので、何とかしてripperでシンタックスエラーを検出したいと思っていた。
ドキュメントを眺めたが方法が良くわからなかったので、思い切ってruby-listで質問してみたところ、ご親切にも中田 伸悦さんから回答をいただいた。ありがとうございます。
ripperでシンタックスエラーを検出するにはon_parse_error
を使えば良いとのこと。以下はon_parse_error
でシンタックスエラーを検出する例。
require 'ripper'
class MyRipper < Ripper
def on_parse_error(msg)
puts msg
end
end
src = <<SRC
42.times do
}
SRC
MyRipper.parse(src) # syntax error, unexpected tSTRING_DEND
シンタックスエラーも検出できるとは、ripperすごい!