polyparse 1.2 → 1.3
raw patch · 7 files changed
+218/−197 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Text.Parse: instance Parse a => Parse (Maybe a)
- Text.Parse: instance Parse a => Parse [a]
+ Text.Parse: instance (Parse a) => Parse (Maybe a)
+ Text.Parse: instance (Parse a) => Parse [a]
- Text.Parse: enumeration :: Show a => String -> [a] -> TextParser a
+ Text.Parse: enumeration :: (Show a) => String -> [a] -> TextParser a
- Text.Parse: field :: Parse a => String -> TextParser a
+ Text.Parse: field :: (Parse a) => String -> TextParser a
- Text.Parse: parse :: Parse a => TextParser a
+ Text.Parse: parse :: (Parse a) => TextParser a
- Text.Parse: parseByRead :: Read a => String -> TextParser a
+ Text.Parse: parseByRead :: (Read a) => String -> TextParser a
- Text.Parse: parseDec :: Integral a => a -> TextParser a
+ Text.Parse: parseDec :: (Integral a) => a -> TextParser a
- Text.Parse: parseFloat :: RealFrac a => TextParser a
+ Text.Parse: parseFloat :: (RealFrac a) => TextParser a
- Text.Parse: parseHex :: Integral a => a -> TextParser a
+ Text.Parse: parseHex :: (Integral a) => a -> TextParser a
- Text.Parse: parseInt :: Integral a => String -> a -> (Char -> Bool) -> (Char -> Int) -> a -> TextParser a
+ Text.Parse: parseInt :: (Integral a) => String -> a -> (Char -> Bool) -> (Char -> Int) -> a -> TextParser a
- Text.Parse: parseList :: Parse a => TextParser [a]
+ Text.Parse: parseList :: (Parse a) => TextParser [a]
- Text.Parse: parseOct :: Integral a => a -> TextParser a
+ Text.Parse: parseOct :: (Integral a) => a -> TextParser a
- Text.Parse: parsePrec :: Parse a => Int -> TextParser a
+ Text.Parse: parsePrec :: (Parse a) => Int -> TextParser a
- Text.Parse: parseSigned :: Real a => TextParser a -> TextParser a
+ Text.Parse: parseSigned :: (Real a) => TextParser a -> TextParser a
- Text.ParserCombinators.HuttonMeijerWallace: eof :: Show p => Parser s (p, t) String ()
+ Text.ParserCombinators.HuttonMeijerWallace: eof :: (Show p) => Parser s (p, t) String ()
- Text.ParserCombinators.HuttonMeijerWallace: nottok :: Eq t => [t] -> Parser s (p, t) e t
+ Text.ParserCombinators.HuttonMeijerWallace: nottok :: (Eq t) => [t] -> Parser s (p, t) e t
- Text.ParserCombinators.HuttonMeijerWallace: toEOF :: Show p => Parser s (p, t) String a -> Parser s (p, t) String a
+ Text.ParserCombinators.HuttonMeijerWallace: toEOF :: (Show p) => Parser s (p, t) String a -> Parser s (p, t) String a
- Text.ParserCombinators.HuttonMeijerWallace: tok :: Eq t => t -> Parser s (p, t) e t
+ Text.ParserCombinators.HuttonMeijerWallace: tok :: (Eq t) => t -> Parser s (p, t) e t
- Text.ParserCombinators.Poly.Base: adjustErr :: PolyParse p => p a -> (String -> String) -> p a
+ Text.ParserCombinators.Poly.Base: adjustErr :: (PolyParse p) => p a -> (String -> String) -> p a
- Text.ParserCombinators.Poly.Base: adjustErrBad :: PolyParse p => p a -> (String -> String) -> p a
+ Text.ParserCombinators.Poly.Base: adjustErrBad :: (PolyParse p) => p a -> (String -> String) -> p a
- Text.ParserCombinators.Poly.Base: apply :: PolyParse p => p (a -> b) -> p a -> p b
+ Text.ParserCombinators.Poly.Base: apply :: (PolyParse p) => p (a -> b) -> p a -> p b
- Text.ParserCombinators.Poly.Base: bracket :: PolyParse p => p bra -> p ket -> p a -> p a
+ Text.ParserCombinators.Poly.Base: bracket :: (PolyParse p) => p bra -> p ket -> p a -> p a
- Text.ParserCombinators.Poly.Base: bracketSep :: PolyParse p => p bra -> p sep -> p ket -> p a -> p [a]
+ Text.ParserCombinators.Poly.Base: bracketSep :: (PolyParse p) => p bra -> p sep -> p ket -> p a -> p [a]
- Text.ParserCombinators.Poly.Base: commit :: PolyParse p => p a -> p a
+ Text.ParserCombinators.Poly.Base: commit :: (PolyParse p) => p a -> p a
- Text.ParserCombinators.Poly.Base: discard :: PolyParse p => p a -> p b -> p a
+ Text.ParserCombinators.Poly.Base: discard :: (PolyParse p) => p a -> p b -> p a
- Text.ParserCombinators.Poly.Base: exactly :: PolyParse p => Int -> p a -> p [a]
+ Text.ParserCombinators.Poly.Base: exactly :: (PolyParse p) => Int -> p a -> p [a]
- Text.ParserCombinators.Poly.Base: failBad :: PolyParse p => String -> p a
+ Text.ParserCombinators.Poly.Base: failBad :: (PolyParse p) => String -> p a
- Text.ParserCombinators.Poly.Base: many :: PolyParse p => p a -> p [a]
+ Text.ParserCombinators.Poly.Base: many :: (PolyParse p) => p a -> p [a]
- Text.ParserCombinators.Poly.Base: many1 :: PolyParse p => p a -> p [a]
+ Text.ParserCombinators.Poly.Base: many1 :: (PolyParse p) => p a -> p [a]
- Text.ParserCombinators.Poly.Base: manyFinally :: PolyParse p => p a -> p z -> p [a]
+ Text.ParserCombinators.Poly.Base: manyFinally :: (PolyParse p) => p a -> p z -> p [a]
- Text.ParserCombinators.Poly.Base: onFail :: PolyParse p => p a -> p a -> p a
+ Text.ParserCombinators.Poly.Base: onFail :: (PolyParse p) => p a -> p a -> p a
- Text.ParserCombinators.Poly.Base: oneOf :: PolyParse p => [p a] -> p a
+ Text.ParserCombinators.Poly.Base: oneOf :: (PolyParse p) => [p a] -> p a
- Text.ParserCombinators.Poly.Base: oneOf' :: PolyParse p => [(String, p a)] -> p a
+ Text.ParserCombinators.Poly.Base: oneOf' :: (PolyParse p) => [(String, p a)] -> p a
- Text.ParserCombinators.Poly.Base: optional :: PolyParse p => p a -> p (Maybe a)
+ Text.ParserCombinators.Poly.Base: optional :: (PolyParse p) => p a -> p (Maybe a)
- Text.ParserCombinators.Poly.Base: sepBy :: PolyParse p => p a -> p sep -> p [a]
+ Text.ParserCombinators.Poly.Base: sepBy :: (PolyParse p) => p a -> p sep -> p [a]
- Text.ParserCombinators.Poly.Base: sepBy1 :: PolyParse p => p a -> p sep -> p [a]
+ Text.ParserCombinators.Poly.Base: sepBy1 :: (PolyParse p) => p a -> p sep -> p [a]
Files
- Makefile +1/−1
- docs/changelog.html +7/−0
- docs/haddock/src/Text/Parse.html +187/−185
- docs/index.html +13/−3
- polyparse.cabal +2/−2
- src/Makefile +1/−1
- src/Text/Parse.hs +7/−5
Makefile view
@@ -1,5 +1,5 @@ SOFTWARE = polyparse-VERSION = 1.2+VERSION = 1.3 CPP = cpp -traditional #CPP = cpphs --text # useful e.g. on MacOS X
docs/changelog.html view
@@ -16,6 +16,13 @@ <h3>Changes in polyparse-1.2</h3> <p> <ul>+<li>Bugfix: Text.Parse.parseFloat now accepts ordinary floating point+ notation, in addition to scientific (exponent) notation.+</ul>++<h3>Changes in polyparse-1.2</h3>+<p>+<ul> <li>Improves the Text.Parse implementation significantly. Where previously all the parsers for builtin basic datatype (Int,Float,Char) were just thin wrappers over the H'98 Read instances, now they are all
docs/haddock/src/Text/Parse.html view
@@ -179,207 +179,209 @@ <a name="line-172"></a><a name="parseHex"></a><font color=Blue>parseHex</font> <font color=Red>=</font> parseInt <font color=Magenta>"hex"</font> <font color=Magenta>16</font> Char<font color=Cyan>.</font>isHexDigit Char<font color=Cyan>.</font>digitToInt <a name="line-173"></a> <a name="line-174"></a><a name="parseFloat"></a><font color=Blue>parseFloat</font> <font color=Red>::</font> <font color=Cyan>(</font>RealFrac a<font color=Cyan>)</font> <font color=Red>=></font> TextParser a-<a name="line-175"></a><font color=Blue>parseFloat</font> <font color=Red>=</font> <font color=Green><u>do</u></font> ds <font color=Red><-</font> many1 <font color=Cyan>(</font>satisfy isDigit<font color=Cyan>)</font>+<a name="line-175"></a><font color=Blue>parseFloat</font> <font color=Red>=</font> <font color=Green><u>do</u></font> ds <font color=Red><-</font> many1 <font color=Cyan>(</font>satisfy isDigit<font color=Cyan>)</font> <a name="line-176"></a> frac <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'.'</font> <font color=Red><-</font> next <a name="line-177"></a> many <font color=Cyan>(</font>satisfy isDigit<font color=Cyan>)</font> <a name="line-178"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"expected digit after ."</font><font color=Cyan>)</font> <a name="line-179"></a> <font color=Cyan>`onFail`</font> return [] <font color=Cyan>)</font>-<a name="line-180"></a> exp <font color=Red><-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'e'</font> <font color=Red><-</font> fmap toLower next-<a name="line-181"></a> commit <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'+'</font> <font color=Red><-</font> next<font color=Cyan>;</font> parseDec <font color=Magenta>0</font>-<a name="line-182"></a> <font color=Cyan>`onFail`</font>-<a name="line-183"></a> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>)</font><font color=Cyan>)</font>-<a name="line-184"></a> <font color=Cyan>(</font> return <font color=Cyan>.</font> fromRational <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>*</font> <font color=Cyan>(</font><font color=Magenta>10</font><font color=Cyan>^^</font><font color=Cyan>(</font>exp <font color=Blue>-</font> length frac<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="line-185"></a> <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>%</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>Right x<font color=Cyan>)</font><font color=Red>-></font>x<font color=Cyan>)</font> <font color=Cyan>.</font> fst-<a name="line-186"></a> <font color=Cyan>.</font> runParser <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>(</font>ds<font color=Cyan>++</font>frac<font color=Cyan>)</font>-<a name="line-187"></a> <font color=Cyan>`onFail`</font>-<a name="line-188"></a> <font color=Green><u>do</u></font> w <font color=Red><-</font> many <font color=Cyan>(</font>satisfy <font color=Cyan>(</font>not<font color=Cyan>.</font>isSpace<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="line-189"></a> <font color=Green><u>case</u></font> map toLower w <font color=Green><u>of</u></font>-<a name="line-190"></a> <font color=Magenta>"nan"</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>0</font><font color=Cyan>/</font><font color=Magenta>0</font><font color=Cyan>)</font>-<a name="line-191"></a> <font color=Magenta>"infinity"</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>1</font><font color=Cyan>/</font><font color=Magenta>0</font><font color=Cyan>)</font>-<a name="line-192"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> fail <font color=Magenta>"expected a floating point number"</font>-<a name="line-193"></a>-<a name="line-194"></a><a name="parseLitChar"></a><font color=Blue>parseLitChar</font> <font color=Red>::</font> TextParser Char-<a name="line-195"></a><font color=Blue>parseLitChar</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'\''</font> <font color=Red><-</font> next <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"expected a literal char"</font><font color=Cyan>)</font>-<a name="line-196"></a> c <font color=Red><-</font> next-<a name="line-197"></a> char <font color=Red><-</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>-<a name="line-198"></a> <font color=Magenta>'\\'</font> <font color=Red>-></font> next <font color=Cyan>>>=</font> escape-<a name="line-199"></a> <font color=Magenta>'\''</font> <font color=Red>-></font> fail <font color=Magenta>"expected a literal char, got ''"</font>-<a name="line-200"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> return c-<a name="line-201"></a> <font color=Magenta>'\''</font> <font color=Red><-</font> next <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"literal char has no final '"</font><font color=Cyan>)</font>-<a name="line-202"></a> return char-<a name="line-203"></a> <font color=Green><u>where</u></font>-<a name="line-204"></a> escape <font color=Magenta>'a'</font> <font color=Red>=</font> return <font color=Magenta>'\a'</font>-<a name="line-205"></a> escape <font color=Magenta>'b'</font> <font color=Red>=</font> return <font color=Magenta>'\b'</font>-<a name="line-206"></a> escape <font color=Magenta>'f'</font> <font color=Red>=</font> return <font color=Magenta>'\f'</font>-<a name="line-207"></a> escape <font color=Magenta>'n'</font> <font color=Red>=</font> return <font color=Magenta>'\n'</font>-<a name="line-208"></a> escape <font color=Magenta>'r'</font> <font color=Red>=</font> return <font color=Magenta>'\r'</font>-<a name="line-209"></a> escape <font color=Magenta>'t'</font> <font color=Red>=</font> return <font color=Magenta>'\t'</font>-<a name="line-210"></a> escape <font color=Magenta>'v'</font> <font color=Red>=</font> return <font color=Magenta>'\v'</font>-<a name="line-211"></a> escape <font color=Magenta>'\\'</font> <font color=Red>=</font> return <font color=Magenta>'\\'</font>-<a name="line-212"></a> escape <font color=Magenta>'"'</font> <font color=Red>=</font> return <font color=Magenta>'"'</font>-<a name="line-213"></a> escape <font color=Magenta>'\''</font> <font color=Red>=</font> return <font color=Magenta>'\''</font>-<a name="line-214"></a> escape <font color=Magenta>'^'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> ctrl <font color=Red><-</font> next-<a name="line-215"></a> <font color=Green><u>if</u></font> ctrl <font color=Cyan>>=</font> <font color=Magenta>'@'</font> <font color=Cyan>&&</font> ctrl <font color=Cyan><=</font> <font color=Magenta>'_'</font>-<a name="line-216"></a> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>chr <font color=Cyan>(</font>ord ctrl <font color=Blue>-</font> ord <font color=Magenta>'@'</font><font color=Cyan>)</font><font color=Cyan>)</font>-<a name="line-217"></a> <font color=Green><u>else</u></font> fail <font color=Cyan>(</font><font color=Magenta>"literal char ctrl-escape malformed: \\^"</font>-<a name="line-218"></a> <font color=Cyan>++</font><font color=Red>[</font>ctrl<font color=Red>]</font><font color=Cyan>)</font>-<a name="line-219"></a> escape d <font color=Red>|</font> isDigit d-<a name="line-220"></a> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseDec <font color=Cyan>(</font>Char<font color=Cyan>.</font>digitToInt d<font color=Cyan>)</font>-<a name="line-221"></a> escape <font color=Magenta>'o'</font> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseOct <font color=Magenta>0</font>-<a name="line-222"></a> escape <font color=Magenta>'x'</font> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseHex <font color=Magenta>0</font>-<a name="line-223"></a> escape c <font color=Red>|</font> isUpper c-<a name="line-224"></a> <font color=Red>=</font> mnemonic c-<a name="line-225"></a> escape c <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"unrecognised escape sequence in literal char: \\"</font><font color=Cyan>++</font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>-<a name="line-226"></a>-<a name="line-227"></a> mnemonic <font color=Magenta>'A'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ACK'</font>-<a name="line-228"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\ACK'"</font>-<a name="line-229"></a> mnemonic <font color=Magenta>'B'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\BEL'</font>-<a name="line-230"></a> <font color=Cyan>`onFail`</font>-<a name="line-231"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\BS'</font>-<a name="line-232"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\BEL' or '\\BS'"</font>-<a name="line-233"></a> mnemonic <font color=Magenta>'C'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'R'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\CR'</font>-<a name="line-234"></a> <font color=Cyan>`onFail`</font>-<a name="line-235"></a> <font color=Green><u>do</u></font> <font color=Magenta>'A'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\CAN'</font>-<a name="line-236"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\CR' or '\\CAN'"</font>-<a name="line-237"></a> mnemonic <font color=Magenta>'D'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DEL'</font>-<a name="line-238"></a> <font color=Cyan>`onFail`</font>-<a name="line-239"></a> <font color=Green><u>do</u></font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DLE'</font>+<a name="line-180"></a> exp <font color=Red><-</font> <font color=Green><u>if</u></font> null frac <font color=Green><u>then</u></font> exponent+<a name="line-181"></a> <font color=Green><u>else</u></font> exponent <font color=Cyan>`onFail`</font> return <font color=Magenta>0</font>+<a name="line-182"></a> <font color=Cyan>(</font> return <font color=Cyan>.</font> fromRational <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>*</font> <font color=Cyan>(</font><font color=Magenta>10</font><font color=Cyan>^^</font><font color=Cyan>(</font>exp <font color=Blue>-</font> length frac<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-183"></a> <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Cyan>%</font><font color=Magenta>1</font><font color=Cyan>)</font> <font color=Cyan>.</font> <font color=Cyan>(</font><font color=Red>\</font> <font color=Cyan>(</font>Right x<font color=Cyan>)</font><font color=Red>-></font>x<font color=Cyan>)</font> <font color=Cyan>.</font> fst+<a name="line-184"></a> <font color=Cyan>.</font> runParser <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>)</font> <font color=Cyan>(</font>ds<font color=Cyan>++</font>frac<font color=Cyan>)</font>+<a name="line-185"></a> <font color=Cyan>`onFail`</font>+<a name="line-186"></a> <font color=Green><u>do</u></font> w <font color=Red><-</font> many <font color=Cyan>(</font>satisfy <font color=Cyan>(</font>not<font color=Cyan>.</font>isSpace<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-187"></a> <font color=Green><u>case</u></font> map toLower w <font color=Green><u>of</u></font>+<a name="line-188"></a> <font color=Magenta>"nan"</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>0</font><font color=Cyan>/</font><font color=Magenta>0</font><font color=Cyan>)</font>+<a name="line-189"></a> <font color=Magenta>"infinity"</font> <font color=Red>-></font> return <font color=Cyan>(</font><font color=Magenta>1</font><font color=Cyan>/</font><font color=Magenta>0</font><font color=Cyan>)</font>+<a name="line-190"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> fail <font color=Magenta>"expected a floating point number"</font>+<a name="line-191"></a> <font color=Green><u>where</u></font> exponent <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'e'</font> <font color=Red><-</font> fmap toLower next+<a name="line-192"></a> commit <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'+'</font> <font color=Red><-</font> next<font color=Cyan>;</font> parseDec <font color=Magenta>0</font>+<a name="line-193"></a> <font color=Cyan>`onFail`</font>+<a name="line-194"></a> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font> <font color=Cyan>)</font>+<a name="line-195"></a>+<a name="line-196"></a><a name="parseLitChar"></a><font color=Blue>parseLitChar</font> <font color=Red>::</font> TextParser Char+<a name="line-197"></a><font color=Blue>parseLitChar</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'\''</font> <font color=Red><-</font> next <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"expected a literal char"</font><font color=Cyan>)</font>+<a name="line-198"></a> c <font color=Red><-</font> next+<a name="line-199"></a> char <font color=Red><-</font> <font color=Green><u>case</u></font> c <font color=Green><u>of</u></font>+<a name="line-200"></a> <font color=Magenta>'\\'</font> <font color=Red>-></font> next <font color=Cyan>>>=</font> escape+<a name="line-201"></a> <font color=Magenta>'\''</font> <font color=Red>-></font> fail <font color=Magenta>"expected a literal char, got ''"</font>+<a name="line-202"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> return c+<a name="line-203"></a> <font color=Magenta>'\''</font> <font color=Red><-</font> next <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Cyan>++</font><font color=Magenta>"literal char has no final '"</font><font color=Cyan>)</font>+<a name="line-204"></a> return char+<a name="line-205"></a> <font color=Green><u>where</u></font>+<a name="line-206"></a> escape <font color=Magenta>'a'</font> <font color=Red>=</font> return <font color=Magenta>'\a'</font>+<a name="line-207"></a> escape <font color=Magenta>'b'</font> <font color=Red>=</font> return <font color=Magenta>'\b'</font>+<a name="line-208"></a> escape <font color=Magenta>'f'</font> <font color=Red>=</font> return <font color=Magenta>'\f'</font>+<a name="line-209"></a> escape <font color=Magenta>'n'</font> <font color=Red>=</font> return <font color=Magenta>'\n'</font>+<a name="line-210"></a> escape <font color=Magenta>'r'</font> <font color=Red>=</font> return <font color=Magenta>'\r'</font>+<a name="line-211"></a> escape <font color=Magenta>'t'</font> <font color=Red>=</font> return <font color=Magenta>'\t'</font>+<a name="line-212"></a> escape <font color=Magenta>'v'</font> <font color=Red>=</font> return <font color=Magenta>'\v'</font>+<a name="line-213"></a> escape <font color=Magenta>'\\'</font> <font color=Red>=</font> return <font color=Magenta>'\\'</font>+<a name="line-214"></a> escape <font color=Magenta>'"'</font> <font color=Red>=</font> return <font color=Magenta>'"'</font>+<a name="line-215"></a> escape <font color=Magenta>'\''</font> <font color=Red>=</font> return <font color=Magenta>'\''</font>+<a name="line-216"></a> escape <font color=Magenta>'^'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> ctrl <font color=Red><-</font> next+<a name="line-217"></a> <font color=Green><u>if</u></font> ctrl <font color=Cyan>>=</font> <font color=Magenta>'@'</font> <font color=Cyan>&&</font> ctrl <font color=Cyan><=</font> <font color=Magenta>'_'</font>+<a name="line-218"></a> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>chr <font color=Cyan>(</font>ord ctrl <font color=Blue>-</font> ord <font color=Magenta>'@'</font><font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-219"></a> <font color=Green><u>else</u></font> fail <font color=Cyan>(</font><font color=Magenta>"literal char ctrl-escape malformed: \\^"</font>+<a name="line-220"></a> <font color=Cyan>++</font><font color=Red>[</font>ctrl<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-221"></a> escape d <font color=Red>|</font> isDigit d+<a name="line-222"></a> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseDec <font color=Cyan>(</font>Char<font color=Cyan>.</font>digitToInt d<font color=Cyan>)</font>+<a name="line-223"></a> escape <font color=Magenta>'o'</font> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseOct <font color=Magenta>0</font>+<a name="line-224"></a> escape <font color=Magenta>'x'</font> <font color=Red>=</font> fmap chr <font color=Cyan>$</font> parseHex <font color=Magenta>0</font>+<a name="line-225"></a> escape c <font color=Red>|</font> isUpper c+<a name="line-226"></a> <font color=Red>=</font> mnemonic c+<a name="line-227"></a> escape c <font color=Red>=</font> fail <font color=Cyan>(</font><font color=Magenta>"unrecognised escape sequence in literal char: \\"</font><font color=Cyan>++</font><font color=Red>[</font>c<font color=Red>]</font><font color=Cyan>)</font>+<a name="line-228"></a>+<a name="line-229"></a> mnemonic <font color=Magenta>'A'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ACK'</font>+<a name="line-230"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\ACK'"</font>+<a name="line-231"></a> mnemonic <font color=Magenta>'B'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\BEL'</font>+<a name="line-232"></a> <font color=Cyan>`onFail`</font>+<a name="line-233"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\BS'</font>+<a name="line-234"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\BEL' or '\\BS'"</font>+<a name="line-235"></a> mnemonic <font color=Magenta>'C'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'R'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\CR'</font>+<a name="line-236"></a> <font color=Cyan>`onFail`</font>+<a name="line-237"></a> <font color=Green><u>do</u></font> <font color=Magenta>'A'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\CAN'</font>+<a name="line-238"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\CR' or '\\CAN'"</font>+<a name="line-239"></a> mnemonic <font color=Magenta>'D'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DEL'</font> <a name="line-240"></a> <font color=Cyan>`onFail`</font>-<a name="line-241"></a> <font color=Green><u>do</u></font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> <font color=Magenta>'1'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC1'</font>-<a name="line-242"></a> <font color=Cyan>`onFail`</font>-<a name="line-243"></a> <font color=Green><u>do</u></font> <font color=Magenta>'2'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC2'</font>+<a name="line-241"></a> <font color=Green><u>do</u></font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'E'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DLE'</font>+<a name="line-242"></a> <font color=Cyan>`onFail`</font>+<a name="line-243"></a> <font color=Green><u>do</u></font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Cyan>(</font> <font color=Green><u>do</u></font> <font color=Magenta>'1'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC1'</font> <a name="line-244"></a> <font color=Cyan>`onFail`</font>-<a name="line-245"></a> <font color=Green><u>do</u></font> <font color=Magenta>'3'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC3'</font>+<a name="line-245"></a> <font color=Green><u>do</u></font> <font color=Magenta>'2'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC2'</font> <a name="line-246"></a> <font color=Cyan>`onFail`</font>-<a name="line-247"></a> <font color=Green><u>do</u></font> <font color=Magenta>'4'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC4'</font> <font color=Cyan>)</font>-<a name="line-248"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\DEL' or '\\DLE' or '\\DC[1..4]'"</font>-<a name="line-249"></a> mnemonic <font color=Magenta>'E'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ETX'</font>-<a name="line-250"></a> <font color=Cyan>`onFail`</font>-<a name="line-251"></a> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\EOT'</font>+<a name="line-247"></a> <font color=Green><u>do</u></font> <font color=Magenta>'3'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC3'</font>+<a name="line-248"></a> <font color=Cyan>`onFail`</font>+<a name="line-249"></a> <font color=Green><u>do</u></font> <font color=Magenta>'4'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DC4'</font> <font color=Cyan>)</font>+<a name="line-250"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\DEL' or '\\DLE' or '\\DC[1..4]'"</font>+<a name="line-251"></a> mnemonic <font color=Magenta>'E'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ETX'</font> <a name="line-252"></a> <font color=Cyan>`onFail`</font>-<a name="line-253"></a> <font color=Green><u>do</u></font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'Q'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ENQ'</font>+<a name="line-253"></a> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\EOT'</font> <a name="line-254"></a> <font color=Cyan>`onFail`</font>-<a name="line-255"></a> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ETB'</font>+<a name="line-255"></a> <font color=Green><u>do</u></font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'Q'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ENQ'</font> <a name="line-256"></a> <font color=Cyan>`onFail`</font>-<a name="line-257"></a> <font color=Green><u>do</u></font> <font color=Magenta>'M'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\EM'</font>+<a name="line-257"></a> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ETB'</font> <a name="line-258"></a> <font color=Cyan>`onFail`</font>-<a name="line-259"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ESC'</font>-<a name="line-260"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"one of '\\ETX' '\\EOT' '\\ENQ' '\\ETB' '\\EM' or '\\ESC'"</font>-<a name="line-261"></a> mnemonic <font color=Magenta>'F'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'F'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\FF'</font>-<a name="line-262"></a> <font color=Cyan>`onFail`</font>-<a name="line-263"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\FS'</font>-<a name="line-264"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\FF' or '\\FS'"</font>-<a name="line-265"></a> mnemonic <font color=Magenta>'G'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\GS'</font>-<a name="line-266"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\GS'"</font>-<a name="line-267"></a> mnemonic <font color=Magenta>'H'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\HT'</font>-<a name="line-268"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\HT'"</font>-<a name="line-269"></a> mnemonic <font color=Magenta>'L'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'F'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\LF'</font>-<a name="line-270"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\LF'"</font>-<a name="line-271"></a> mnemonic <font color=Magenta>'N'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'U'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\NUL'</font>-<a name="line-272"></a> <font color=Cyan>`onFail`</font>-<a name="line-273"></a> <font color=Green><u>do</u></font> <font color=Magenta>'A'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\NAK'</font>-<a name="line-274"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\NUL' or '\\NAK'"</font>-<a name="line-275"></a> mnemonic <font color=Magenta>'R'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\RS'</font>-<a name="line-276"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\RS'"</font>-<a name="line-277"></a> mnemonic <font color=Magenta>'S'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'H'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SOH'</font>-<a name="line-278"></a> <font color=Cyan>`onFail`</font>-<a name="line-279"></a> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SO'</font>+<a name="line-259"></a> <font color=Green><u>do</u></font> <font color=Magenta>'M'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\EM'</font>+<a name="line-260"></a> <font color=Cyan>`onFail`</font>+<a name="line-261"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'C'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\ESC'</font>+<a name="line-262"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"one of '\\ETX' '\\EOT' '\\ENQ' '\\ETB' '\\EM' or '\\ESC'"</font>+<a name="line-263"></a> mnemonic <font color=Magenta>'F'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'F'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\FF'</font>+<a name="line-264"></a> <font color=Cyan>`onFail`</font>+<a name="line-265"></a> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\FS'</font>+<a name="line-266"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\FF' or '\\FS'"</font>+<a name="line-267"></a> mnemonic <font color=Magenta>'G'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\GS'</font>+<a name="line-268"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\GS'"</font>+<a name="line-269"></a> mnemonic <font color=Magenta>'H'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\HT'</font>+<a name="line-270"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\HT'"</font>+<a name="line-271"></a> mnemonic <font color=Magenta>'L'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'F'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\LF'</font>+<a name="line-272"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\LF'"</font>+<a name="line-273"></a> mnemonic <font color=Magenta>'N'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'U'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\NUL'</font>+<a name="line-274"></a> <font color=Cyan>`onFail`</font>+<a name="line-275"></a> <font color=Green><u>do</u></font> <font color=Magenta>'A'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\NAK'</font>+<a name="line-276"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\NUL' or '\\NAK'"</font>+<a name="line-277"></a> mnemonic <font color=Magenta>'R'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\RS'</font>+<a name="line-278"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\RS'"</font>+<a name="line-279"></a> mnemonic <font color=Magenta>'S'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'H'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SOH'</font> <a name="line-280"></a> <font color=Cyan>`onFail`</font>-<a name="line-281"></a> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\STX'</font>+<a name="line-281"></a> <font color=Green><u>do</u></font> <font color=Magenta>'O'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SO'</font> <a name="line-282"></a> <font color=Cyan>`onFail`</font>-<a name="line-283"></a> <font color=Green><u>do</u></font> <font color=Magenta>'I'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SI'</font>+<a name="line-283"></a> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\STX'</font> <a name="line-284"></a> <font color=Cyan>`onFail`</font>-<a name="line-285"></a> <font color=Green><u>do</u></font> <font color=Magenta>'Y'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SYN'</font>+<a name="line-285"></a> <font color=Green><u>do</u></font> <font color=Magenta>'I'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SI'</font> <a name="line-286"></a> <font color=Cyan>`onFail`</font>-<a name="line-287"></a> <font color=Green><u>do</u></font> <font color=Magenta>'U'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SUB'</font>+<a name="line-287"></a> <font color=Green><u>do</u></font> <font color=Magenta>'Y'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SYN'</font> <a name="line-288"></a> <font color=Cyan>`onFail`</font>-<a name="line-289"></a> <font color=Green><u>do</u></font> <font color=Magenta>'P'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SP'</font>-<a name="line-290"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\SOH' '\\SO' '\\STX' '\\SI' '\\SYN' '\\SUB' or '\\SP'"</font>-<a name="line-291"></a> mnemonic <font color=Magenta>'U'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\US'</font>-<a name="line-292"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\US'"</font>-<a name="line-293"></a> mnemonic <font color=Magenta>'V'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\VT'</font>-<a name="line-294"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\VT'"</font>-<a name="line-295"></a> wrap p s <font color=Red>=</font> p <font color=Cyan>`onFail`</font> fail <font color=Cyan>(</font><font color=Magenta>"expected literal char "</font><font color=Cyan>++</font>s<font color=Cyan>)</font>-<a name="line-296"></a>-<a name="line-297"></a><font color=Blue>-- Basic types</font>-<a name="line-298"></a><font color=Green><u>instance</u></font> Parse Int <font color=Green><u>where</u></font>-<a name="line-299"></a> <font color=Blue>-- parse = parseByRead "Int" -- convert from Integer, deals with minInt</font>-<a name="line-300"></a> parse <font color=Red>=</font> fmap fromInteger <font color=Cyan>$</font>-<a name="line-301"></a> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font>-<a name="line-302"></a><font color=Green><u>instance</u></font> Parse Integer <font color=Green><u>where</u></font>-<a name="line-303"></a> <font color=Blue>-- parse = parseByRead "Integer"</font>-<a name="line-304"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font>-<a name="line-305"></a><font color=Green><u>instance</u></font> Parse Float <font color=Green><u>where</u></font>-<a name="line-306"></a> <font color=Blue>-- parse = parseByRead "Float"</font>-<a name="line-307"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned parseFloat-<a name="line-308"></a><font color=Green><u>instance</u></font> Parse Double <font color=Green><u>where</u></font>-<a name="line-309"></a> <font color=Blue>-- parse = parseByRead "Double"</font>-<a name="line-310"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned parseFloat-<a name="line-311"></a><font color=Green><u>instance</u></font> Parse Char <font color=Green><u>where</u></font>-<a name="line-312"></a><font color=Blue>-- parse = parseByRead "Char"</font>-<a name="line-313"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseLitChar-<a name="line-314"></a> <font color=Blue>-- parse = do { w <- word; if head w == '\'' then readLitChar (tail w)</font>-<a name="line-315"></a> <font color=Blue>-- else fail "expected a char" }</font>-<a name="line-316"></a> <font color=Blue>-- parseList = bracket (isWord "\"") (satisfy (=='"'))</font>-<a name="line-317"></a> <font color=Blue>-- (many (satisfy (/='"')))</font>-<a name="line-318"></a> <font color=Blue>-- not totally correct for strings...</font>-<a name="line-319"></a> parseList <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> w <font color=Red><-</font> word<font color=Cyan>;</font> <font color=Green><u>if</u></font> head w <font color=Cyan>==</font> <font color=Magenta>'"'</font> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>init <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>-<a name="line-320"></a> <font color=Green><u>else</u></font> fail <font color=Magenta>"not a string"</font> <font color=Cyan>}</font>-<a name="line-321"></a>-<a name="line-322"></a><font color=Green><u>instance</u></font> Parse Bool <font color=Green><u>where</u></font>-<a name="line-323"></a> parse <font color=Red>=</font> enumeration <font color=Magenta>"Bool"</font> <font color=Red>[</font>False<font color=Cyan>,</font>True<font color=Red>]</font>-<a name="line-324"></a>-<a name="line-325"></a><font color=Green><u>instance</u></font> Parse Ordering <font color=Green><u>where</u></font>-<a name="line-326"></a> parse <font color=Red>=</font> enumeration <font color=Magenta>"Ordering"</font> <font color=Red>[</font>LT<font color=Cyan>,</font>EQ<font color=Cyan>,</font>GT<font color=Red>]</font>-<a name="line-327"></a>-<a name="line-328"></a><font color=Blue>-- Structural types</font>-<a name="line-329"></a><font color=Green><u>instance</u></font> Parse () <font color=Green><u>where</u></font>-<a name="line-330"></a> parse <font color=Red>=</font> P p-<a name="line-331"></a> <font color=Green><u>where</u></font> p [] <font color=Red>=</font> Failure [] <font color=Magenta>"no input: expected a ()"</font>-<a name="line-332"></a> p <font color=Cyan>(</font><font color=Magenta>'('</font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> dropWhile isSpace cs <font color=Green><u>of</u></font>-<a name="line-333"></a> <font color=Cyan>(</font><font color=Magenta>')'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>-></font> Success s ()-<a name="line-334"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> Failure cs <font color=Magenta>"Expected ) after ("</font>-<a name="line-335"></a> p <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> isSpace c <font color=Red>=</font> p cs-<a name="line-336"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> Failure <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>"Expected a (), got "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font>-<a name="line-337"></a>-<a name="line-338"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="line-339"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font><font color=Cyan>{</font> isWord <font color=Magenta>"("</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Opening a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-340"></a> <font color=Cyan>;</font> x <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 1st item of a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-341"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-342"></a> <font color=Cyan>;</font> y <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 2nd item of a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-343"></a> <font color=Cyan>;</font> isWord <font color=Magenta>")"</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Closing a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-344"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="line-345"></a>-<a name="line-346"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>,</font> Parse c<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="line-347"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font><font color=Cyan>{</font> isWord <font color=Magenta>"("</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Opening a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-348"></a> <font color=Cyan>;</font> x <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 1st item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-349"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating(1) a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-350"></a> <font color=Cyan>;</font> y <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 2nd item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-351"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating(2) a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-352"></a> <font color=Cyan>;</font> z <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 3rd item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-353"></a> <font color=Cyan>;</font> isWord <font color=Magenta>")"</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Closing a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>-<a name="line-354"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>)</font> <font color=Cyan>}</font>-<a name="line-355"></a>-<a name="line-356"></a><font color=Green><u>instance</u></font> Parse a <font color=Red>=></font> Parse <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="line-357"></a> parsePrec p <font color=Red>=</font>-<a name="line-358"></a> parens False <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font> isWord <font color=Magenta>"Nothing"</font><font color=Cyan>;</font> return Nothing <font color=Cyan>}</font><font color=Cyan>)</font>-<a name="line-359"></a> <font color=Cyan>`onFail`</font>-<a name="line-360"></a> parens <font color=Cyan>(</font>p<font color=Cyan>></font><font color=Magenta>9</font><font color=Cyan>)</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font> isWord <font color=Magenta>"Just"</font>-<a name="line-361"></a> <font color=Cyan>;</font> fmap Just <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font>-<a name="line-362"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"but within Just, "</font><font color=Cyan>++</font><font color=Cyan>)</font> <font color=Cyan>}</font><font color=Cyan>)</font>-<a name="line-363"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"expected a Maybe (Just or Nothing)\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>.</font>indent <font color=Magenta>2</font><font color=Cyan>)</font>-<a name="line-364"></a>-<a name="line-365"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>-<a name="line-366"></a> parsePrec p <font color=Red>=</font>-<a name="line-367"></a> parens <font color=Cyan>(</font>p<font color=Cyan>></font><font color=Magenta>9</font><font color=Cyan>)</font> <font color=Cyan>$</font>-<a name="line-368"></a> constructors <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"Left"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> fmap Left <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font> <font color=Cyan>}</font> <font color=Cyan>)</font>-<a name="line-369"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"Right"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> fmap Right <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font> <font color=Cyan>}</font> <font color=Cyan>)</font>-<a name="line-370"></a> <font color=Red>]</font>-<a name="line-371"></a>-<a name="line-372"></a><font color=Green><u>instance</u></font> Parse a <font color=Red>=></font> Parse <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>-<a name="line-373"></a> parse <font color=Red>=</font> parseList-<a name="line-374"></a>-<a name="line-375"></a><font color=Blue>------------------------------------------------------------------------</font>+<a name="line-289"></a> <font color=Green><u>do</u></font> <font color=Magenta>'U'</font> <font color=Red><-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SUB'</font>+<a name="line-290"></a> <font color=Cyan>`onFail`</font>+<a name="line-291"></a> <font color=Green><u>do</u></font> <font color=Magenta>'P'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\SP'</font>+<a name="line-292"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\SOH' '\\SO' '\\STX' '\\SI' '\\SYN' '\\SUB' or '\\SP'"</font>+<a name="line-293"></a> mnemonic <font color=Magenta>'U'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'S'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\US'</font>+<a name="line-294"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\US'"</font>+<a name="line-295"></a> mnemonic <font color=Magenta>'V'</font> <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Magenta>'T'</font> <font color=Red><-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\VT'</font>+<a name="line-296"></a> <font color=Cyan>`wrap`</font> <font color=Magenta>"'\\VT'"</font>+<a name="line-297"></a> wrap p s <font color=Red>=</font> p <font color=Cyan>`onFail`</font> fail <font color=Cyan>(</font><font color=Magenta>"expected literal char "</font><font color=Cyan>++</font>s<font color=Cyan>)</font>+<a name="line-298"></a>+<a name="line-299"></a><font color=Blue>-- Basic types</font>+<a name="line-300"></a><font color=Green><u>instance</u></font> Parse Int <font color=Green><u>where</u></font>+<a name="line-301"></a> <font color=Blue>-- parse = parseByRead "Int" -- convert from Integer, deals with minInt</font>+<a name="line-302"></a> parse <font color=Red>=</font> fmap fromInteger <font color=Cyan>$</font>+<a name="line-303"></a> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font>+<a name="line-304"></a><font color=Green><u>instance</u></font> Parse Integer <font color=Green><u>where</u></font>+<a name="line-305"></a> <font color=Blue>-- parse = parseByRead "Integer"</font>+<a name="line-306"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned <font color=Cyan>(</font>parseDec <font color=Magenta>0</font><font color=Cyan>)</font>+<a name="line-307"></a><font color=Green><u>instance</u></font> Parse Float <font color=Green><u>where</u></font>+<a name="line-308"></a> <font color=Blue>-- parse = parseByRead "Float"</font>+<a name="line-309"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned parseFloat+<a name="line-310"></a><font color=Green><u>instance</u></font> Parse Double <font color=Green><u>where</u></font>+<a name="line-311"></a> <font color=Blue>-- parse = parseByRead "Double"</font>+<a name="line-312"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseSigned parseFloat+<a name="line-313"></a><font color=Green><u>instance</u></font> Parse Char <font color=Green><u>where</u></font>+<a name="line-314"></a><font color=Blue>-- parse = parseByRead "Char"</font>+<a name="line-315"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font> many <font color=Cyan>(</font>satisfy isSpace<font color=Cyan>)</font><font color=Cyan>;</font> parseLitChar+<a name="line-316"></a> <font color=Blue>-- parse = do { w <- word; if head w == '\'' then readLitChar (tail w)</font>+<a name="line-317"></a> <font color=Blue>-- else fail "expected a char" }</font>+<a name="line-318"></a> <font color=Blue>-- parseList = bracket (isWord "\"") (satisfy (=='"'))</font>+<a name="line-319"></a> <font color=Blue>-- (many (satisfy (/='"')))</font>+<a name="line-320"></a> <font color=Blue>-- not totally correct for strings...</font>+<a name="line-321"></a> parseList <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> w <font color=Red><-</font> word<font color=Cyan>;</font> <font color=Green><u>if</u></font> head w <font color=Cyan>==</font> <font color=Magenta>'"'</font> <font color=Green><u>then</u></font> return <font color=Cyan>(</font>init <font color=Cyan>(</font>tail w<font color=Cyan>)</font><font color=Cyan>)</font>+<a name="line-322"></a> <font color=Green><u>else</u></font> fail <font color=Magenta>"not a string"</font> <font color=Cyan>}</font>+<a name="line-323"></a>+<a name="line-324"></a><font color=Green><u>instance</u></font> Parse Bool <font color=Green><u>where</u></font>+<a name="line-325"></a> parse <font color=Red>=</font> enumeration <font color=Magenta>"Bool"</font> <font color=Red>[</font>False<font color=Cyan>,</font>True<font color=Red>]</font>+<a name="line-326"></a>+<a name="line-327"></a><font color=Green><u>instance</u></font> Parse Ordering <font color=Green><u>where</u></font>+<a name="line-328"></a> parse <font color=Red>=</font> enumeration <font color=Magenta>"Ordering"</font> <font color=Red>[</font>LT<font color=Cyan>,</font>EQ<font color=Cyan>,</font>GT<font color=Red>]</font>+<a name="line-329"></a>+<a name="line-330"></a><font color=Blue>-- Structural types</font>+<a name="line-331"></a><font color=Green><u>instance</u></font> Parse () <font color=Green><u>where</u></font>+<a name="line-332"></a> parse <font color=Red>=</font> P p+<a name="line-333"></a> <font color=Green><u>where</u></font> p [] <font color=Red>=</font> Failure [] <font color=Magenta>"no input: expected a ()"</font>+<a name="line-334"></a> p <font color=Cyan>(</font><font color=Magenta>'('</font><font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>case</u></font> dropWhile isSpace cs <font color=Green><u>of</u></font>+<a name="line-335"></a> <font color=Cyan>(</font><font color=Magenta>')'</font><font color=Red><b>:</b></font>s<font color=Cyan>)</font> <font color=Red>-></font> Success s ()+<a name="line-336"></a> <font color=Green><u>_</u></font> <font color=Red>-></font> Failure cs <font color=Magenta>"Expected ) after ("</font>+<a name="line-337"></a> p <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Red>|</font> isSpace c <font color=Red>=</font> p cs+<a name="line-338"></a> <font color=Red>|</font> otherwise <font color=Red>=</font> Failure <font color=Cyan>(</font>c<font color=Red><b>:</b></font>cs<font color=Cyan>)</font> <font color=Cyan>(</font><font color=Magenta>"Expected a (), got "</font><font color=Cyan>++</font>show c<font color=Cyan>)</font>+<a name="line-339"></a>+<a name="line-340"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-341"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font><font color=Cyan>{</font> isWord <font color=Magenta>"("</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Opening a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-342"></a> <font color=Cyan>;</font> x <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 1st item of a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-343"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-344"></a> <font color=Cyan>;</font> y <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 2nd item of a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-345"></a> <font color=Cyan>;</font> isWord <font color=Magenta>")"</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Closing a 2-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-346"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-347"></a>+<a name="line-348"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>,</font> Parse c<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>a<font color=Cyan>,</font>b<font color=Cyan>,</font>c<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-349"></a> parse <font color=Red>=</font> <font color=Green><u>do</u></font><font color=Cyan>{</font> isWord <font color=Magenta>"("</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Opening a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-350"></a> <font color=Cyan>;</font> x <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 1st item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-351"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating(1) a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-352"></a> <font color=Cyan>;</font> y <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 2nd item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-353"></a> <font color=Cyan>;</font> isWord <font color=Magenta>","</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Separating(2) a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-354"></a> <font color=Cyan>;</font> z <font color=Red><-</font> parse <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"In 3rd item of a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-355"></a> <font color=Cyan>;</font> isWord <font color=Magenta>")"</font> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Magenta>"Closing a 3-tuple\n"</font><font color=Cyan>++</font><font color=Cyan>)</font>+<a name="line-356"></a> <font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Cyan>,</font>y<font color=Cyan>,</font>z<font color=Cyan>)</font> <font color=Cyan>}</font>+<a name="line-357"></a>+<a name="line-358"></a><font color=Green><u>instance</u></font> Parse a <font color=Red>=></font> Parse <font color=Cyan>(</font>Maybe a<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-359"></a> parsePrec p <font color=Red>=</font>+<a name="line-360"></a> parens False <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font> isWord <font color=Magenta>"Nothing"</font><font color=Cyan>;</font> return Nothing <font color=Cyan>}</font><font color=Cyan>)</font>+<a name="line-361"></a> <font color=Cyan>`onFail`</font>+<a name="line-362"></a> parens <font color=Cyan>(</font>p<font color=Cyan>></font><font color=Magenta>9</font><font color=Cyan>)</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font> isWord <font color=Magenta>"Just"</font>+<a name="line-363"></a> <font color=Cyan>;</font> fmap Just <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font>+<a name="line-364"></a> <font color=Cyan>`adjustErrBad`</font> <font color=Cyan>(</font><font color=Magenta>"but within Just, "</font><font color=Cyan>++</font><font color=Cyan>)</font> <font color=Cyan>}</font><font color=Cyan>)</font>+<a name="line-365"></a> <font color=Cyan>`adjustErr`</font> <font color=Cyan>(</font><font color=Cyan>(</font><font color=Magenta>"expected a Maybe (Just or Nothing)\n"</font><font color=Cyan>++</font><font color=Cyan>)</font><font color=Cyan>.</font>indent <font color=Magenta>2</font><font color=Cyan>)</font>+<a name="line-366"></a>+<a name="line-367"></a><font color=Green><u>instance</u></font> <font color=Cyan>(</font>Parse a<font color=Cyan>,</font> Parse b<font color=Cyan>)</font> <font color=Red>=></font> Parse <font color=Cyan>(</font>Either a b<font color=Cyan>)</font> <font color=Green><u>where</u></font>+<a name="line-368"></a> parsePrec p <font color=Red>=</font>+<a name="line-369"></a> parens <font color=Cyan>(</font>p<font color=Cyan>></font><font color=Magenta>9</font><font color=Cyan>)</font> <font color=Cyan>$</font>+<a name="line-370"></a> constructors <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"Left"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> fmap Left <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font> <font color=Cyan>}</font> <font color=Cyan>)</font>+<a name="line-371"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"Right"</font><font color=Cyan>,</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> fmap Right <font color=Cyan>$</font> parsePrec <font color=Magenta>10</font> <font color=Cyan>}</font> <font color=Cyan>)</font>+<a name="line-372"></a> <font color=Red>]</font>+<a name="line-373"></a>+<a name="line-374"></a><font color=Green><u>instance</u></font> Parse a <font color=Red>=></font> Parse <font color=Red>[</font>a<font color=Red>]</font> <font color=Green><u>where</u></font>+<a name="line-375"></a> parse <font color=Red>=</font> parseList+<a name="line-376"></a>+<a name="line-377"></a><font color=Blue>------------------------------------------------------------------------</font> </pre> </body> </html>
docs/index.html view
@@ -161,10 +161,10 @@ <p> <b>Current released version:</b><br>-polyparse-1.2, release date 2009.03.04<br>+polyparse-1.3, release date 2009.03.09<br> By HTTP:-<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.2.tar.gz">.tar.gz</a>,-<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.2.zip">.zip</a>.+<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.3.tar.gz">.tar.gz</a>,+<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.3.zip">.zip</a>. <br> By FTP: <a href="ftp://ftp.cs.york.ac.uk/pub/haskell/polyparse/">@@ -172,6 +172,11 @@ <p> <b>Older versions:</b><br>+polyparse-1.2, release date 2009.03.04<br>+By HTTP:+<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.2.tar.gz">.tar.gz</a>,+<a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.2.zip">.zip</a>.+<br> polyparse-1.1, release date 2007.10.23<br> By HTTP: <a href="http://www.cs.york.ac.uk/fp/polyparse/polyparse-1.1.tar.gz">.tar.gz</a>,@@ -215,6 +220,11 @@ <hr> <center><h3><a name="news">Recent news</a></h3></center>+<p>+Version 1.3 has a single bugfix: Text.Parse.parseFloat now accepts+ordinary floating point notation, in addition to scientific (exponent)+notation.+ <p> Version 1.2 improves the Text.Parse implementation significantly. Where previously all the parsers for builtin basic datatype (Int,Float,Char)
polyparse.cabal view
@@ -1,6 +1,6 @@ name: polyparse-version: 1.2-cpp-options: -DVERSION="1.2"+version: 1.3+cpp-options: -DVERSION="1.3" nhc98-options: -K6M license: LGPL license-file: COPYRIGHT
src/Makefile view
@@ -1,5 +1,5 @@ SOFTWARE = polyparse-VERSION = 1.2+VERSION = 1.3 LIBSRCS = \ Text/ParserCombinators/HuttonMeijer.hs \
src/Text/Parse.hs view
@@ -172,15 +172,13 @@ parseHex = parseInt "hex" 16 Char.isHexDigit Char.digitToInt parseFloat :: (RealFrac a) => TextParser a-parseFloat = do ds <- many1 (satisfy isDigit)+parseFloat = do ds <- many1 (satisfy isDigit) frac <- (do '.' <- next many (satisfy isDigit) `adjustErrBad` (++"expected digit after .") `onFail` return [] )- exp <- (do 'e' <- fmap toLower next- commit (do '+' <- next; parseDec 0- `onFail`- parseSigned (parseDec 0) ))+ exp <- if null frac then exponent+ else exponent `onFail` return 0 ( return . fromRational . (* (10^^(exp - length frac))) . (%1) . (\ (Right x)->x) . fst . runParser (parseDec 0) ) (ds++frac)@@ -190,6 +188,10 @@ "nan" -> return (0/0) "infinity" -> return (1/0) _ -> fail "expected a floating point number"+ where exponent = do 'e' <- fmap toLower next+ commit (do '+' <- next; parseDec 0+ `onFail`+ parseSigned (parseDec 0) ) parseLitChar :: TextParser Char parseLitChar = do '\'' <- next `adjustErr` (++"expected a literal char")