Parsec --- 2.1 Running a parser

``Parsec, a fast combinator parser''をきちんと読んでみます.関係ないですけど,このドキュメント,誰がどうみてもLaTeX2e組で,PDFはdvipdfmで生成されてますね.

閑話休題
入力したソースは全部p.hsに保存することにして,ghciで実行します.

   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.6.1, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
Prelude> :l p.hs

バックスラッシュが円記号になってしまうのはあきらめ.私はMeadowのshellモードを使うのでいいんですが.

import Text.ParserCombinators.Parsec

を忘れないように.

simple

simple:: Parser Char
simple = letter

Parser CharはText.ParserCombinators.Parsec.Primで

type Parser a = GenParser Char () a

となってます.これは,Char型のトークンを「user supplied state ()」でパースして,型aの値を返すパーサを表しているのだそうです.状態ってなんだろう? ()のときは「without user state」とのことなので気にしません.

letterというのは

type CharParser st a = GenParser Char st a
letter :: CharParser st Char

と定義されているパーサでText.ParserCombinators.Parsec.Charで定義されています.stが「state」で a が返す値の型なので,letterはChar型の値をとって,Char型の値を返すパーサとなります.letterはChar型の値でもアルファベットしかだめです.

Parser Charの定義と合わせて書き下してみると

simple:: GenParser Char () Char
simple = letter

ということなので,(状態なしで)アルファベット一文字をとってそれを返すパーサということですね.ParsecのparseTest関数を使って実行してみます.parseTest関数はパースした結果を出力してくれる関数です.

simple:: Parser Char
simple = letter

*Main> parseTest simple "A"
'A'

ここで

parseTest :: Show a => GenParser tok () a -> [tok] -> IO ()

とのことなので,tokがCharの今の場合では,第二引数[tok]は[Char],すなわちStringである必要があるので,

parseTest simple 'A'

だとエラーがでてしまいます.