Text.Parsec.Char その2
モジュール Text.Parsec.Char に定義されている基本的なパーサを虱潰しに使ってみた。パーサのテストは parse 関数より parseTest 関数のほうがエラーメッセージ用の名前を入力しないで済むので楽だ。実験には parseTest 関数を使った。
まず、使えるパーサを列挙してみた。
プログラム言語や計算式のパースを行う場合も、これらの基本的なパーサを組み合わせて作る。パーサコンビネータはこれらのパーサを引数にとってより複雑なパーサを作る関数だ。
基本的なパーサ
Prelude> import Text.Parsec
Prelude Text.Parsec> :browse Text.Parsec.Char
alphaNum :: Stream s m Char => ParsecT s u m Char
anyChar :: Stream s m Char => ParsecT s u m Char
char :: Stream s m Char => Char -> ParsecT s u m Char
crlf :: Stream s m Char => ParsecT s u m Char
digit :: Stream s m Char => ParsecT s u m Char
endOfLine :: Stream s m Char => ParsecT s u m Char
hexDigit :: Stream s m Char => ParsecT s u m Char
letter :: Stream s m Char => ParsecT s u m Char
lower :: Stream s m Char => ParsecT s u m Char
newline :: Stream s m Char => ParsecT s u m Char
noneOf :: Stream s m Char => [Char] -> ParsecT s u m Char
octDigit :: Stream s m Char => ParsecT s u m Char
oneOf :: Stream s m Char => [Char] -> ParsecT s u m Char
satisfy :: Stream s m Char => (Char -> Bool) -> ParsecT s u m Char
space :: Stream s m Char => ParsecT s u m Char
spaces :: Stream s m Char => ParsecT s u m ()
string :: Stream s m Char => String -> ParsecT s u m String
tab :: Stream s m Char => ParsecT s u m Char
upper :: Stream s m Char => ParsecT s u m Char
alphaNum : 英字と数字にマッチ
Prelude Text.Parsec> parseTest alphaNum "123"
'1'
Prelude Text.Parsec> parseTest alphaNum "abc"
'a'
anyChar : 種類を問わず1文字にマッチ
Prelude Text.Parsec> parseTest anyChar ",abc"
','
char 'a' : 'a'1文字にマッチ
Prelude Text.Parsec> parseTest (char 'a') "abc"
'a'
crlf : "\r\n" にマッチ(Windowsの行末記号)
Prelude Text.Parsec> parseTest crlf "\r\n"
'\n'
digit : 数字1文字にマッチ
Prelude Text.Parsec> parseTest digit "123"
'1'
endOfLine : 行末記号にマッチ
Prelude Text.Parsec> parseTest endOfLine "\nabc"
'\n'
hexDigit : 16 進数1文字にマッチ
Prelude Text.Parsec> parseTest hexDigit "FF"
'F'
letter : 英字1字にマッチ
Prelude Text.Parsec> parseTest letter "abc"
'a'
lower : 英小文字1字にマッチ
Prelude Text.Parsec> parseTest lower "abc"
'a'
newline : 改行文字にマッチ
Prelude Text.Parsec> parseTest newline "\nabc"
'\n'
noneOf : 指定した文字集合に含まれない1文字にマッチ
Prelude Text.Parsec> parseTest (noneOf "abc") "def"
'd'
octDigit : 8進数1文字にマッチ
oneOf : 指定した文字集合に含まれる1文字にマッチ
Prelude Text.Parsec> parseTest (oneOf "abc") "cde"
'c'
satisfy : 論理式を True にする1文字にマッチ
Prelude Text.Parsec> parseTest (satisfy (> 'd')) "efg"
'e'
space : スペースにマッチ
Prelude Text.Parsec> parseTest space " "
' '
spaces : 空白文字を読み捨てる。
Prelude Text.Parsec> parseTest (do spaces; letter) " abc"
'a'
string : 文字列にマッチ
Prelude Text.Parsec> parseTest (string "hello") "hello, world"
"hello"
tab : タブにマッチ
Prelude Text.Parsec> parseTest tab "\tabc"
'\t'
upper : 英大文字にマッチ
Prelude Text.Parsec> parseTest upper "ABC"
'A'