peg-sharp
C# で スクリプトをパースしたくなったので、peg-sharp というのを試しに遊んで見ることにした。
http://code.google.com/p/peg-sharp/
OMeta とかに近いかな? 字句解析と構文解析を区別する必要がなくて、その場でデータを処理できる。前々からお手軽に使えそうだから使いたいなと思っていたのだけど、C# で使える実装を調べてなくて結局手を出してなかった。
C# での実装では IronMeta も候補にしていたのだけど、peg-sharp の方がお手軽そうな気配があったので peg-sharp を触ってみることにした。
http://ironmeta.sourceforge.net/
パースに失敗した時のエラー情報を自動で付けてくれる
この手のパーザを自前で作ったときには、エラー表示がとても面倒なのだけど、パースされた結果のオブジェクトにLineやColumnがついていたり、エラーが出た時に期待する構文を示した例外を投げてくれるのでありがたい。
こんな感じの例外を投げてくれる。
Expected indent or identifier or whitespace or newline at line 4 col 9.
型をひとつしか指定できない
パースした結果として返す値に全体で一つの型しか指定できない。数値も文字列もリストも何かしらの一つのクラスにまとめないと行けないのは苦行かもしれない。
もちろん抽象クラスを指定して、個々に生成する奴は異なる型に変更することは可能だけども、それを処理する時は結局、ダウンキャストとかしないと行けないのだろうか。
peg-sharp のドキュメントによると 「union ライクなクラス作ればなんとかなるよ」らしい。うーん。型付きが欲しい。
スペースの扱いが少し手間
字句解析と構文解析が分かれている場合は、スペースのカットを字句解析で済ませることができるのだけど、PEG ではそうもいかないようだ。でも、同じコード内に字句解析と構文解析を含めることができるだけで、書き分けはできる。スペースを許すトークンごとに S* な要素を挟めばよいようだ。
文字列しか扱えなさそう
構文解析ってデータに対してもやりたいことがあるから、そこが少し惜しい気がする。使う予定は無いので要らないのだけど。