exuberant-ctagsのruby.cをいじっている

ここ数日exuberant-ctagsのruby.cをいじっている。
俺はexuberant-ctagsを使ってRuby版eldocを作ろうとしている。RRSEはすべてのライブラリが範囲となるからあっというまに出力があふれてしまう。範囲が広すぎる。せめてrequireしているファイルだけが対象になれば、だいぶ探索範囲は狭められる。記憶力がやばすぎる俺にはこういうツールの存在は死活問題だ。漢字や英単語を一瞥しただけで覚えられた子供時代の記憶力は今はどこへやら。今その能力が必要なのにすでに失っているというのは、皮肉な話だ。

vi用のtagsを生成させれば(デフォルト)メソッドの属するクラスも出力してくれるんだが、いかんせんruby.cのparserがひどい。行頭のif/unless/while/untilしか見ないため、対応するendの認識がめちゃくちゃになる。

a = if true
      1
    else
      2
    end

のようなコードがあると末尾のendしか認識しないためendの対応が釣合わない。そのためにクラス名がめちゃくちゃになるというわけだ。↑のようなコードはrubyistなら少なくとも一度は書いたことがあるはずだ。他にもあらを探せばいくらでもあるんだが、手許のバージョンではやっとcgi.rbを正常にparseしてくれるようになった。ちなみにcgi.rbはありとあらゆるRubyの粋をつくしたなかなかの曲者。ヒアドキュメントまではサポートできた。

まだやってないのがリテラルの扱い。「"文字列」、「'文字列」以外にも「%記法」や「正規表現」がある。quotationさえ扱えばいいというわけではない。後者の2つはescapeなしのquotation記号を入れることができるため、それが出現したとたんめちゃくちゃになる。だから4つとも同時にサポートしないと意味がない。

とくに厄介なのが正規表現リテラルだ。割り算なのか正規表現なのかの区別をつけるのが難しい。幸いなことに

print / a /

はsyntax errorになってくれるんだけど、

def f(x)
  self
end
f /5  # !> ambiguous first argument; put parentheses or even spaces
/

f=10
f /5                            # => 2

の区別が問題だ。「f /5」の行だけ見たら正規表現の開始なのか割り算なのかが区別できない。fがメソッドなのか変数なのかの区別が必要だ。そうなると複雑なRubyのスコープを理解しないといけない。Ruby、人間には優しいがparser泣かせの言語だ。ムズイ…

いっそのことインデントで判断しようにもタブでインデントしてあるコードがいまだに存在するのが問題だ。タブ幅が8なのか4なのか。それがわからんと話にならん。んん……

クラス名の出力は捨てるべきか?ファイル名がわかれば推測できることも多いし。