Parsecの基本的な関数
Parsecの基本的な関数
以下の3パターンをparse関数の引数として使う
parse <パーサ> <名前> <パースしたい文字列>
名前ってなに?
prelude> :m Text.ParserCombinators.Parsec
Parser
Parserモナドの関数
文字列の先頭から消費して、パターンが一致するかどうかを調べて結果を返す関数
char :: Char -> Parser Char
特定の一文字を受け付ける
string :: String -> Parser String
文字列にマッチ
oneOf [Char]
引数に文字列のどれか一文字とマッチ
> parse (oneOf "abcdefg") "" "egg"
noneOf [Char]
引数のどの文字列にもマッチしない
> parse (noneOf "abcdefg") "" "hello"
anyChar
文字列のどんな1文字にもマッチする
> parse anyChar "" "+One"
symbol
symbol "s"
文字列sをパース、直後の空白の並びを読み飛ばす
lexeme
option
第2引数のパターンマッチが失敗した時、第1引数の値を返す
成功したらその値を返す
optionMaybe
code:hs
xs <- many1 digit
ys <- optionMaybe (char '.' *> many1 digit)
123でも123.4でもいい
他
parser combinator
parserを引数に取る
型はParsecT s u m a -> ParsecT s u m [a]
many :: Parser a -> Parser [a]
引数のparserを0回以上繰り返す
マッチするものがなければ空文字を返す
つまり0回マッチしたので、エラーではない
many1 :: Stream s m t => ParsecT s u m a -> ParsecT s u m [a]
引数のparserを1回以上繰り返す
マッチするものがなければ空文字を返す
つまり1回もマッチしていないので、エラーになる
code:hs
parseTest (many letter) "123" -- ""
parseTest (many1 letter) "123" -- error!
それがパーサーなのか、パーサコンビネータなのかの見極め方がわかりません
lexemeってなに?
不要な空白を読み飛ばす?
↑のページの中のリンクを見てスクラッチで書いてみよう
symbolとcharってどう違うの
lexemeってなに?