Parsec 入門


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'

プログラム言語や計算式のパースを行う場合も、これらの基本的なパーサを組み合わせて作る。パーサコンビネータはこれらのパーサを引数にとってより複雑なパーサを作る関数だ。