これだけ人材がいるのに積極的に情報交換しないのは もったいなくないか、ということで社内勉強会。
家庭の事情で先に帰ってしまったのだが、それなりに有意義であった。
「正規表現よりこっち」とか「リテラルが〜」とか「Prologサイコー」とか、 本質的でない発言に惑わされそうだったが、 よーく考えてみると、Ragelのようなのが標準ライブラリとしてついてきたら、 JSONとかYAMLみたいな構文解析系は楽勝で書けるようになるし、 それはそれで新しい世界が広がるのではないか。
たとえば
class HttpParser < Ragel::Base
rules <<-END
main := Request_Line @done;
....
END
def initialize
....
end
def action_done
....
end
end
parser = HttpParser.new
というようなAPIであれば、どうだろう?
ヒアドキュメントがちょっと美しくないけど、 Raccよりシームレスな感じで使いやすいんじゃないだろうか。
誰かチャレンジしない?
This work is licensed under a Creative Commons License.
Ragelは文脈自由じゃないので、JSONが楽勝で書けるようにはならないと思います。<br>るびまにあった例では、字句解析だけRagelに任せて、構文解析は自力で書いています。<br>http://jp.rubyist.net/magazine/?0023-Ragel<br><br>つまり、言語としては正規表現と同等なので、「正規表現よりこっち」という文句はそれなりに当を得たものでしょう。<br>で、ここに関しては好みの問題で、わたしは正規言語の範囲ならば記述量等からして、<br>従来型の正規表現の方がバランスがいいように感じます。<br><br>で、文脈自由の場合をどうするかですが、<br>一つは、鬼車は文脈自由なパターンも可能なので、これもゴリゴリがんばる・・・<br>という手はありますが、以前やってみたところさすがにこれはそのままだとつらすぎます。<br>新しい記述方法を導入しつつ、構文木を取得する方法も追加になるので、<br>さすがに別のものを使った方がよさそう。<br><br>Ruby用PEGパーサ treetop というものもあります。<br>http://www.infoq.com/jp/news/2008/01/treetop-ruby-parser-generator<br>一見Rubyっぽくもあり、記述もしやすそうであり、魅力的なんですが、<br>これ、文法の記述が別ファイルなんですよね。<br>そのままRubyに突っ込むと文法エラーは不可避に感じます。<br><br>ダークホースとして、raccの記述方法をDSL風に変えるという話もありました。<br>http://i.loveruby.net/d/20060514.html#p03<br><br>この辺を見渡して思ったことは、現在のRubyの文法におけるパーサ記述時の限界です。<br>具体的には、ある単語 a が、単語 b とリテラル 'c' の結合である場合、<br>grammer.a = b 'c'<br>と書けると楽なのですが、このままだとRubyレベルでの文法エラーを回避できません。<br>回避するには、b 'c' の間に + や .等の演算子を入れるとか、<br>丸ごと文字列にしてしまうことになります。<br>この辺でうまい解決方法があればいいのですが。<br>で、それがもしあるならば racc でOKってことになってしまうという。
ああ、そうそう。Ragelは正規文法でしたね。ちゃんと聞いたのに忘れてました。うっかり。<br>上のエントリで欲しかったのは文脈自由文法パーザなので、Ragelの名前を出すのは不適切でしたね。<br>treetopとかをベースにするのがいいのかなあ。
思うに、ベースが何かというのは Ruby にこの類のものを融合させる場合には些細な問題で、<br>いかにシームレスにデザインするかが問題な気がします。<br><br>現状の枠組みで青木さんが行った例だと以下のとか<br>http://i.loveruby.net/d/20060728.html<br><br>今回のまつもとさんの例だと文法定義を文字列にすれば自由度は増すんですが、<br>アクションが文法定義から遠くなってしまうとか。<br>文法部分だけ文字列にするとかかなぁ。
私は上の例のように文法部は文字列、アクションはメソッドというのを考えてます。今のRubyの文法だけでは無理があるが、(Perl6のように)文法を追加するところまでは踏み切れないというところでの妥協点ではないかと。
Parsecとかみたいな、parser combinatorライブラリを<br>取り込むというアプローチはどうでしょうか?<br>rparsecとか結構悪く無さげに見えます(試したことはないですが)<br><br>http://docs.codehaus.org/display/JPARSEC/rparsec+overview