提供: 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"