[ruby-list:42032] あたりの、 解析する文法を DSL で記述する話について。
Haskell の Parsec がまさにそれ。Ruby でも、ないわけではない。
例えば、Racc よりも速いぜーと ruby-talk で自慢していた Grammar はそれっぽい。 ただ DSL というよりはオブジェクトを作る感じが強くて、俺は好きになれなかった。
見ためがきれいという点では akr さんの abnf が一番いいと思う。 これは DSL じゃなくて文字列だけど。
るびま 8 号の立石さんの記事にもパーサ関係はいくつか出てたなあ。
http://jp.rubyist.net/magazine/?0008-RLR
今回見なおしてみると、tdp4r と syntax.rb が欲しいものに一番近いかもしれない。 でもどちらももうちょい見ためをすっきりできそうな印象を受ける。 あと syntax.rb は String#+ だの String#- だの定義しちゃうのが嫌だ。
Racc もさ、もう少しなんとかできそうな気はするんだよな。例えば
Racc::Grammar.define { rule program, expr rule expr, '(', expr, ')' _ expr, '+', expr do .... end _ expr, '-', expr do .... end _ expr, '*', expr do .... end _ expr, '/', expr do .... end _ num }
なんてのならすぐに実装できると思うけど。 うーん。ちょっとイマイチかなあ。
(05:44)
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
ふむふむ。なんとはなしにakrさんのやつが思い浮かんだのですが、返事には書きませんでした(ちょっと自信なかったので)。おお外しではなかったのですね。ちょっと安心。それとHaskellの勉強を続ける動機ができました(笑)。
callcc を使って, 任意の文脈自由文法が読める LL(∞) パーザが(右再帰の無限ループは回避しないとダメだけど)書けるんではないかなぁと前からぼんやり考えていたのですが、最近この文献が自分の「あとで読む」リストに →
http://d.hatena.ne.jp/sumii/20060413/1144920884