X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FParser.hs;h=f99cdf58b5afdd5c2d2a610e1ee3786e056c221d;hp=0d33a858a6b44362abf8668bc26974fcc5c737fa;hb=cd1b58b84ff354e3fc2a7d2c8fd548a7b59fe138;hpb=2d25d34513dc4f6bf62e53e2af2f4a4ef39cc6dc diff --git a/Network/HTTP/Lucu/Parser.hs b/Network/HTTP/Lucu/Parser.hs index 0d33a85..f99cdf5 100644 --- a/Network/HTTP/Lucu/Parser.hs +++ b/Network/HTTP/Lucu/Parser.hs @@ -1,7 +1,9 @@ module Network.HTTP.Lucu.Parser ( Parser(..) , ParserResult(..) + , parse -- Parser a -> ByteString -> ParserResult a + , anyChar -- Parser Char , satisfy -- (Char -> Bool) -> Parser Char , char -- Char -> Parser Char @@ -9,6 +11,7 @@ module Network.HTTP.Lucu.Parser , (<|>) -- Parser a -> Parser a -> Parser a , oneOf -- [Char] -> Parser Char , digit -- Parser Char + , hexDigit -- Parser Char , notFollowedBy -- Parser a -> Parser () , many -- Parser a -> Parser [a] , many1 -- Parser a -> Parser [a] @@ -33,6 +36,7 @@ data Parser a = Parser { data ParserResult a = Success a | IllegalInput -- 受理出來ない入力があった | ReachedEOF -- 限界を越えて讀まうとした + deriving (Eq, Show) -- (>>=) :: Parser a -> (a -> Parser b) -> Parser b @@ -98,7 +102,21 @@ notFollowedBy p = p >>= fail "" <|> return () digit :: Parser Char -digit = oneOf "0123456789" +digit = do c <- anyChar + if c >= '0' && c <= '9' then + return c + else + fail "" + + +hexDigit :: Parser Char +hexDigit = do c <- anyChar + if (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F') then + return c + else + fail "" many :: Parser a -> Parser [a]