takkan_mのHaskell再挑戦 RSSフィード

2006-11-23

Parsecの疑問 21:57 Parsecの疑問 - takkan_mのHaskell再挑戦 を含むブックマーク はてなブックマーク - Parsecの疑問 - takkan_mのHaskell再挑戦 Parsecの疑問 - takkan_mのHaskell再挑戦 のブックマークコメント

ひさしぶりに、プログラミング言語概念と構造の問題を解いていて、elizaのようなプログラムの問題があったんだけど(問題をといたエントリはたぶん後で書く)、入力された文を解析してテンプレにあてはめて返すという処理をしなくちゃいけないので、Parsecを使おうかと思った。しかし、ここでちょっと疑問が発生した。

Parsecって、細かいパーサーを合成してひとつのパーサーを作るわけで、

bigParse = smallParse1
        <|>smallParse2
        <|>smallParse3

みたいに書くわけで(ひとつのパーサーが失敗したときのエラー処理はここでは省略)、このパーサーの評価方法というか順序がどうなっているかということに疑問をもった。このまま評価した場合って、smallParse3を評価して、失敗したらsmallParse2を評価してみたいになるのかな?それとも、裏側では小人さんがsmallParse1、smallParse2、smallParse3を同時にやっているのかな?

<|>はモナドになるから順序がかかわってくるから、順にやってるのかなぁ?

うーん。まだまだ、わからないことばかりだ。

jmkjmk 2006/11/23 22:35 1→2→3の順番で計算され、最初に成功したパースの結果が返されます。
Parsecのパーサはようするに関数なので「評価」というと少し違う気もしますが。

takkan_mtakkan_m 2006/11/25 22:05 解説ありがとうございます。1->2->3の順番で計算されるとういうことは、1、2、3ともに入力を最後までたどって失敗というときは、ものすごく計算量がおおくなって非効率的にかんじてしまうんですが。効率考えると、自分で、パターンマッチング駆使して書いた方がいいんでしょうか?

jmkjmk 2006/11/26 01:59 確かに、まず1を失敗するところまで試し、それから2を失敗するところまで試し、3を失敗するところまで試さないと完全にパースに失敗したかどうかはわかりません。しかし、パーサとはそもそもそういうものではないでしょうか。
パターンマッチングを駆使する、というのがどのような処理を念頭に置かれているか想像できないので、そちらはわかりませんが。

takkan_mtakkan_m 2006/11/26 19:55 またわかりづらいコメントを書いてしまいすいません。
mainParser (x:xs) = x of
isAlpha x -> parseAlpha xs
isDigit x -> parseDigit xs
のような感じでやったほうが、効率がよいのかなと思ったんですが、結局失敗したら戻ってパースしたりするから、同じなのかもしれないですね。

LuljetaLuljeta 2013/03/29 14:31 Surprising to think of soemthnig like that

xmggebigzwxmggebigzw 2013/03/30 14:23 HygUfH <a href="http://qxlpgsiceiwm.com/">qxlpgsiceiwm</a>

ycpwrmycpwrm 2013/04/01 10:42 JDVOro , [url=http://wwkygcdycknf.com/]wwkygcdycknf[/url], [link=http://smqjicmvlnwv.com/]smqjicmvlnwv[/link], http://yikinnrjcoev.com/

ゲスト



トラックバック - http://haskell.g.hatena.ne.jp/takkan_m/20061123