history

青木日記 RSS

<前の日 | この月 | 次の日>

2004-09-22

ripper (15) 仕様大変更

キャプションの番号がどこまで行ったかよくわからなくなってきた。

Ripper の仕様を昨日言ったように変更しました。

  • on__scan 廃止
  • on__XXX → on_XXX

うーむ、lib/ripper/ast.rb って LGPL なのか。 これだと Ruby にはとりこめないな。

(15:38)

ripper (16) Ripperとは何か

そういえば「Ripperとは何か」について 書いたことがないような気がするので書いておく。 一言で。

Ripper は Ruby プログラムのパーサベアボーンキットだ!

え、ベアボーンキットって知らないなあ。 あれだよあれ、自作パソコンのケースと 電源とマザーボードだけセットにして売ってるやつ。 あとは自分で CPU とメモリと HDD を買って付けるとできあがるんだよ。

Ripper も同じ。 Ruby プログラムのパーサの一番面倒でどーでもいいところが ライブラリ化されていて、あとはおいしいとこだけ作ってやれば パーサができるわけですよ。

もちっとわかってる人向けにわかってる説明をすると、 まず lex と yacc、わかるね? んで Ruby のパーサを lex と yacc で書いたとして、 そのアクション以外を提供してくれるのが Ripper。 あとはアクションを (Rubyで) 書けばいい。

そんでは、Ruby のパーサとしては他にもいろいろあるのに Ripper を選ぶ理由は何だろうか。 それは、Ripper は本物の Ruby との文法の互換性がとても高いからだ。 なぜならばパーサの根幹部分を本物の Ruby と共有しているからである。

なにい、「共有しなくても互換性くらい保てるだろヴァーカ!」だと? ふぅ―――――――ん。 ま、やるのは俺じゃないしね……やるだけやってみればいいんじゃない? その……若い頃に無駄な努力をしてあがくのって大切だと思うし! あ、それから Ruby の文法はどんどん アップデートして (複雑になって) いくことを忘れずにね。

一方 Ripper の弱点は以下のようなところだろう。

  • 構文木を作ってくれるインターフェイスが (まだ) ない
  • 動作が (まだ) 不安定
  • 仕様が (まだ) 不安定
  • 後述するように、いまんとこ ruby CVS HEAD でしか使えない

ripper (17) Ripperでできること

御託を並べるのはこのへんにしよう。 具体的に、Ripper ではどんなものが作れるのだろうか。 ようするに特製パーサが作れるわけだから、 Ruby プログラムをテキスト的にいじるものはだいたい何でもできる。 例えば以下のような例が挙げられる。

  • ソースコードの動的色付け
  • ソースコードの静的色付け
  • Ruby 用 indent
  • Ruby 用 lint? (真面目にコード解析をやると大変なので表面的なものだけにしたほうがよさげ)
  • rtag
  • Ruby Refactoring Browser は Ripper の前バージョンを使ってるらしい
  • Ruby コンパイラのパーサ部分
  • irb みたいなの
  • rdoc みたいなの

ripper (18) Ripperを入手する

さて、解説を読んで Ripper を使いたくなったとしよう! どこからダウンロードできんだよーとっとと URL さらしやがれ、 と思うかもしれないが、そういうわけにはいかない。現在のところ、 Ripper を使ってみたかったら ruby の CVS HEAD を自分でインストールする必要がある。

[試験に出るポイント]

  • Ripper は個別には配布していない。
  • Ruby の CVS HEAD をチェックアウトしてコンパイルすると勝手にインストールされる。
  • Ruby 1.8 では (まだ) Ripper は使えない。

なぜ 1.8 がだめかと言うと、yacc の定義するトークン (を表す定数) が Ruby 本体のパーサと完璧に同じでないといけないからだ。 1.9 ではトークンが追加されているので 1.8 に合わせるのはけっこう大変なのである。 とは言え 1.8 の parse.y に独自に ripper extension を追加するよりはずっと簡単だ。

# なんか今日はテンション高いなー俺……

(17:13)

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS