Skip to content

Instantly share code, notes, and snippets.

@naoto-ogawa
Last active April 10, 2020 09:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save naoto-ogawa/fd935e3d0d1be55f4ef9f1df0587161f to your computer and use it in GitHub Desktop.
Save naoto-ogawa/fd935e3d0d1be55f4ef9f1df0587161f to your computer and use it in GitHub Desktop.
Polyparse example
> import Text.Parse
>
-- type check
> :t word
word :: TextParser String
>
> :t runParser
runParser :: Parser t a -> [t] -> (Either String a, [t])
>
-- word
> runParser word " aaa bbb ccc "
(Right "aaa"," bbb ccc ")
> flip runParser " aaa bbb ccc " $ word >> word
(Right "bbb"," ccc ")
> flip runParser " aaa bbb ccc " $ word >> word >> word
(Right "ccc"," ")
>
-- isWord
> flip runParser " aaa bbb ccc " $ isWord "aaa"
(Right "aaa"," bbb ccc ")
> flip runParser " aaa bbb ccc " $ isWord "xxx"
(Left "expected xxx got aaa"," bbb ccc ")
>
-- literal
> flip runParser " aaa bbb ccc " $ literal "aaa"
(Left "expected aaa got ","aaa bbb ccc ")
> flip runParser " aaa bbb ccc " $ literal "aaa bbb ccc "
(Left "expected aaa bbb ccc got ","aaa bbb ccc ")
> flip runParser " aaa bbb ccc " $ literal " aaa bbb ccc "
(Right " aaa bbb ccc ","")
>
-- parens optinal
> flip runParser "aaa,bbb,ccc " $ optionalParens word
(Right "aaa",",bbb,ccc ")
> flip runParser "(aaa),bbb,ccc " $ optionalParens word
(Right "aaa",",bbb,ccc ")
> flip runParser "( aaa ),bbb,ccc " $ optionalParens word
(Right "aaa",",bbb,ccc ")
> flip runParser "((aaa)),bbb,ccc " $ optionalParens word
(Right "aaa",",bbb,ccc ")
>
-- parens mandatory
> flip runParser "aaa,bbb,ccc " $ parens True word
(Left "Missing opening bracket:\n\texpected ( got aaa",",bbb,ccc ")
> flip runParser "(aaa),bbb,ccc " $ parens True word
(Right "aaa",",bbb,ccc ")
>
-- enumeration
> flip runParser "\"True\" ccc" $ enumeration "xx" ["True", "False"]
(Right "True"," ccc")
> flip runParser "True ccc" $ enumeration "xx" ["True", "False"]
(Left "failed to parse any of the possible choices\n expected xx value (\"True\", or \"False\")","True ccc")
>
-- parseDec
> flip runParser "123.456" $ parseDec
(Right 123,".456")
> flip runParser "123 " $ parseDec
(Right 123," ")
> flip runParser " 123 " $ parseDec
(Left "In a sequence:\n Parse.satisfy: failed\n\nexpected one or more decimal digits","123 ")
>
-- parseHex
> flip runParser "123 " $ parseHex
(Right 291," ")
> flip runParser "FF " $ parseHex
(Right 255," ")
> flip runParser "Z123 " $ parseHex
(Left "In a sequence:\n Parse.satisfy: failed\n\nexpected one or more hex digits","123 ")
>
-- parseFloat
> flip runParser "123.45" $ parseFloat
(Right 123.45,"")
> flip runParser "-123.45" $ parseFloat
(Left "expected a floating point number","")
> flip runParser "-123.45" $ parseSigned parseFloat
(Right (-123.45),"")
> flip runParser "123.45" $ parseSigned parseFloat
(Right 123.45,"")
>
-- parse Char
> flip runParser "\'1\' 2 3" $ parse :: (Either String Char, String)
(Right '1'," 2 3")
> flip runParser "1 2 3" $ parse :: (Either String Char, String)
(Left "Pattern match failure in do expression at src/Text/Parse.hs:270:20-23"," 2 3")
>
-- parse Bool
> flip runParser "True" $ parse :: (Either String Bool, String)
(Right True,"")
> flip runParser "False" $ parse :: (Either String Bool, String)
(Right False,"")
> flip runParser "T" $ parse :: (Either String Bool, String)
(Left "failed to parse any of the possible choices\n expected Bool value (False, or True)","T")
>
-- parse as List
> flip runParser "[False,True,False]" $ parseList :: (Either String [Bool], String)
(Right [False,True,False],"")
>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment