提供: tty00

2014年8月5日 (火) 14:12時点におけるTty00 (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索

import

import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Token

Text.ParserCombinators.Parsec.Char

oneOf ps
キャラクターリストpsの何れか1文字に一致する。
x :: Parser Char
x = oneOf "abc"
--:parseTest x "a1b2c3"
--:'a'
space
isSpaceを満たす文字に一致する。
newline
'\n'に一致する
noneOf ps

キャラクターリストps以外の1文字に一致する。

char
文字に一致する
spaces
isSpaceを満たす0 回以上の繰り返しをスキップする。
spaces = skipMany spaceと同じ
string
文字列に一致する。
x :: Parser String
x = string "abc"
--:parseTest x "abc123"
--:'abc'

Text.ParserCombinators.Parsec.Combinator

choice

choice ps
リスト内のパーサーを順番に適応し最初に一致したものを返す。
parseTest (choice [string "aaa",string "bbb"]) "bbb123"
--:["abc","abc"]

count

n回のパターンに一致する。

parseTest (count 2 (string "abc")) "abcabcabc1234"
--:["abc","abc"]

between

between open close p
openとcloseで囲まれたpに一致する。
between (between (string "{") (string "}") (many alphaNum)) "{abcd1234}"
--:"abcd1234"

option

option x p
pに一致しないときxを返す。そうでなければpを返す。

optionMaybe

optionMaybe p
pに一致しないときNothingを返す。そうでなければ Just pを返す。

skipMany1

1回以上のpをスキップする。

many1

1回以上のpに一致する。

sepBy/sepBy1

sepBy p sep
sepで0以上の区間に分割しリストを生成する
sepBy1 p sep
sepで1以上の区間に分割しリストを生成する
parseTest (sepBy (many1 letter) spaces) "abc abc abc"
--:["abc","abc","abc"]

eof

eof
eof = notFollowedBy anyToken <?> "end of input"

endBy/endBy1

終端記号で分割しリストを生成する

parseTest (endBy (many1 letter) (char ';')) "abc;abc;"
--:["abc","abc"]

Text.ParserCombinators.Parsec.Prim

p <|> q
pまたはqに一致する

(<|>)

parseTest (string "abc" <|> string "123") "123asdf"
--:"123"

try

try p
pに一致しないとき入力を消費しない。

many

main p
0回以上のpに一致する。

manyTill

manyTill p q
qまで繰り返しpに一致する

<$>

function <$> p
pの結果にfunctionを適用する

Parser ()

何も返さないパーサ

逆引き

スペースで区切る

sep :: Parser [String]
sep = sepBy (many1 letter) spaces
--:parseTest sep "aaa bbb ccc"
--:["aaa","bbb","ccc"]

エラー・例外

*** Exception: Text.ParserCombinators.Parsec.Prim.many: combinator 'many' is applied to a parser that accepts an empty string.

many xが空文字列に一致する場合例外が発生する。

--例外起こる
parseTest (sepBy (many letter) spaces) "aa bb cc"
 
--例外起こらない
parseTest (sepBy (many1 letter) spaces) "aa bb cc"