Schemeでパーサコンビネータを作りました
Parser combinator(written in Scheme)「Gorgos」Niyarin
View Slide
Schemeでparser combinator を作った・私はパーサに関しては素人です・文字列を入れるとSchemeオブジェクトを返す手続きを作成する(Scheme手続きを組み合わせて)
返り値は多値・”受理したもの”と、”のこりの文字列”が返る・文字aのパーサに”abcdef”を入れると、 受理した#\aと残りの”bcdef”が返る
“ab”を受け取るパーサ1・”gchar”を2回使って実装する
“ab”を受け取るパーサ2・よく使いそうなものは楽できるような部品が提供されている特定の文字列を受け取るパーサ “gstring”
リストを意識したパーサコンビネータ1・gorgosはリストを返すことを意識した作りになっている・受理→ 変換の”変換”を簡潔に書くため リストリーダの例
リストを意識したパーサコンビネータ2・なるべく変換を手抜きしたいので、gpairというpairを返すものも作ったab…. を受け取る例
Schemeにcharsetがあって楽できた・Schemeには文字の集合というデータ構造がある(SRFI 14) or (scheme charset)・charsetに含まれているかどうかの部分だけでよかった・組み込みも充実しているchar-set:upper-casechar-set:digitchar-set:whitespaceなど
macro/手続きでありがちなやつ・glistは最初は手続きだった→ piyo-parserがfoo-parserの前に来ていないとだめ(右)再帰する場合もlambdaで囲わないと再帰できない・parserを受け取るものをすべてマクロに書き換えた・applyとかに渡すことができなくなったので、glist-fという関数版も用意した
未完成な部分・文字列→ Scheme objectはできている・今作り込んでいる部分1.エラー表示2.1文字先読みだけでいけるように変換orチェックする対応port (fileストリームなど)から使えるようにしたい1文字先読み