packages feed

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 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>=&gt;</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>&lt;-</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>&lt;-</font> many1 <font color=Cyan>(</font>satisfy isDigit<font color=Cyan>)</font> <a name="line-176"></a>                frac <font color=Red>&lt;-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'.'</font> <font color=Red>&lt;-</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>&lt;-</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Magenta>'e'</font> <font color=Red>&lt;-</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>&lt;-</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>-&gt;</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>&lt;-</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>-&gt;</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>-&gt;</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>-&gt;</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>&lt;-</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>&lt;-</font> next-<a name="line-197"></a>                  char <font color=Red>&lt;-</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>-&gt;</font> next <font color=Cyan>&gt;&gt;=</font> escape-<a name="line-199"></a>                            <font color=Magenta>'\''</font> <font color=Red>-&gt;</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>-&gt;</font> return c-<a name="line-201"></a>                  <font color=Magenta>'\''</font> <font color=Red>&lt;-</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>&lt;-</font> next-<a name="line-215"></a>                     <font color=Green><u>if</u></font> ctrl <font color=Cyan>&gt;=</font> <font color=Magenta>'@'</font> <font color=Cyan>&amp;&amp;</font> ctrl <font color=Cyan>&lt;=</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'E'</font> <font color=Red>&lt;-</font> next<font color=Cyan>;</font> return <font color=Magenta>'\DLE'</font>+<a name="line-180"></a>                exp  <font color=Red>&lt;-</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>-&gt;</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>&lt;-</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>-&gt;</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>-&gt;</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>-&gt;</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next+<a name="line-199"></a>                  char <font color=Red>&lt;-</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>-&gt;</font> next <font color=Cyan>&gt;&gt;=</font> escape+<a name="line-201"></a>                            <font color=Magenta>'\''</font> <font color=Red>-&gt;</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>-&gt;</font> return c+<a name="line-203"></a>                  <font color=Magenta>'\''</font> <font color=Red>&lt;-</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>&lt;-</font> next+<a name="line-217"></a>                     <font color=Green><u>if</u></font> ctrl <font color=Cyan>&gt;=</font> <font color=Magenta>'@'</font> <font color=Cyan>&amp;&amp;</font> ctrl <font color=Cyan>&lt;=</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'E'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'T'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'Q'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'T'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'Q'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'C'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'H'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'C'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'L'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'K'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'H'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'X'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red>&lt;-</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'N'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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 &lt;- 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>&lt;-</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>-&gt;</font> Success s ()-<a name="line-334"></a>                             <font color=Green><u>_</u></font>       <font color=Red>-&gt;</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>=&gt;</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>&lt;-</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>&lt;-</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>=&gt;</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>&lt;-</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>&lt;-</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>&lt;-</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>=&gt;</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>&gt;</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>=&gt;</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>&gt;</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>=&gt;</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>&lt;-</font> next<font color=Cyan>;</font> <font color=Magenta>'B'</font> <font color=Red>&lt;-</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>&lt;-</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>&lt;-</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>&lt;-</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 &lt;- 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>&lt;-</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>-&gt;</font> Success s ()+<a name="line-336"></a>                             <font color=Green><u>_</u></font>       <font color=Red>-&gt;</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>=&gt;</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>&lt;-</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>&lt;-</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>=&gt;</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>&lt;-</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>&lt;-</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>&lt;-</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>=&gt;</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>&gt;</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>=&gt;</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>&gt;</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>=&gt;</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")