string パーサは文字列にマッチするパーサなので、testOr = string "(a)" <|> "(b)" は、"(a)" または "(b)" にマッチするように思うが、"(a)" にはマッチするが、"(b)" にはマッチしてくれない。
Hugs> :l Text.ParserCombinators.Parsec Text.ParserCombinators.Parsec> parseTest (string "(a)" <|> string "(b)") "(a)" "(a)" Text.ParserCombinators.Parsec> parseTest (string "(a)" <|> string "(b)") "(b)" parse error at (line 1, column 1): unexpected "b" expecting "(a)" これはエラーメッセージの unexpected "b" で分かるように、最初の "(a)" とのマッチが失敗した時に、"(b)" の '(' が消費されてしまって、次に "(b)" とマッチさせようとしたときに、入力文字が "b)" になってしまっているからだ。Parsec は "predictive" (予見的)なパーサなので、指示しなければバックトラックをしてくれない。Parsec にバックトラックをさせようと思ったら、次のように try 関数を使う。 Text.ParserCombinators.Parsec> parseTest ((try (string "(a)")) <|> string "(b)") "(b)" "(b)"
by tnomura9
| 2009-09-29 06:59
| Haskell
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||