history

青木日記 RSS

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

2006-04-16

Ruby で BNF を記述

[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)

本日のツッコミ(全2件) [ツッコミを入れる]
きむら (2006-04-16 23:40)

ふむふむ。なんとはなしにakrさんのやつが思い浮かんだのですが、返事には書きませんでした(ちょっと自信なかったので)。おお外しではなかったのですね。ちょっと安心。それとHaskellの勉強を続ける動機ができました(笑)。

KM (2006-04-17 09:51)

callcc を使って, 任意の文脈自由文法が読める LL(∞) パーザが(右再帰の無限ループは回避しないとダメだけど)書けるんではないかなぁと前からぼんやり考えていたのですが、最近この文献が自分の「あとで読む」リストに →
http://d.hatena.ne.jp/sumii/20060413/1144920884

名前
メールアドレス

<前の日 | この月 | 次の日>
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