ripperでシンタックスエラーを検出する
タグ: ruby / 初版公開: 2014-05-16

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すごい!