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'
だとエラーがでてしまいます.