2006-11-23
■ Parsecの疑問

ひさしぶりに、プログラミング言語の概念と構造の問題を解いていて、elizaのようなプログラムの問題があったんだけど(問題をといたエントリはたぶん後で書く)、入力された文を解析してテンプレにあてはめて返すという処理をしなくちゃいけないので、Parsecを使おうかと思った。しかし、ここでちょっと疑問が発生した。
Parsecって、細かいパーサーを合成してひとつのパーサーを作るわけで、
bigParse = smallParse1 <|>smallParse2 <|>smallParse3
みたいに書くわけで(ひとつのパーサーが失敗したときのエラー処理はここでは省略)、このパーサーの評価方法というか順序がどうなっているかということに疑問をもった。このまま評価した場合って、smallParse3を評価して、失敗したらsmallParse2を評価してみたいになるのかな?それとも、裏側では小人さんがsmallParse1、smallParse2、smallParse3を同時にやっているのかな?
<|>はモナドになるから順序がかかわってくるから、順にやってるのかなぁ?
うーん。まだまだ、わからないことばかりだ。
Parsecのパーサはようするに関数なので「評価」というと少し違う気もしますが。
パターンマッチングを駆使する、というのがどのような処理を念頭に置かれているか想像できないので、そちらはわかりませんが。
mainParser (x:xs) = x of
isAlpha x -> parseAlpha xs
isDigit x -> parseDigit xs
のような感じでやったほうが、効率がよいのかなと思ったんですが、結局失敗したら戻ってパースしたりするから、同じなのかもしれないですね。