Last active
April 10, 2020 09:45
-
-
Save naoto-ogawa/fd935e3d0d1be55f4ef9f1df0587161f to your computer and use it in GitHub Desktop.
Polyparse example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
> 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