packages feed

polyparse-1.1: docs/haddock/src/Text/ParserCombinators/HuttonMeijer.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<pre><a name="(line1)"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="(line2)"></a><font color=Blue>-- |</font>
<a name="(line3)"></a><font color=Blue>-- Module      :  Text.ParserCombinators.HuttonMeijer</font>
<a name="(line4)"></a><font color=Blue>-- Copyright   :  Graham Hutton (University of Nottingham), Erik Meijer (University of Utrecht)</font>
<a name="(line5)"></a><font color=Blue>-- Licence     :  BSD</font>
<a name="(line6)"></a><font color=Blue>-- </font>
<a name="(line7)"></a><font color=Blue>-- Maintainer  :  Malcolm Wallace &lt;Malcolm.Wallace@cs.york.ac.uk&gt;</font>
<a name="(line8)"></a><font color=Blue>-- Stability   :  Stable</font>
<a name="(line9)"></a><font color=Blue>-- Portability :  All</font>
<a name="(line10)"></a><font color=Blue>--</font>
<a name="(line11)"></a><font color=Blue>--                  A LIBRARY OF MONADIC PARSER COMBINATORS</font>
<a name="(line12)"></a><font color=Blue>-- </font>
<a name="(line13)"></a><font color=Blue>--                               29th July 1996</font>
<a name="(line14)"></a><font color=Blue>-- </font>
<a name="(line15)"></a><font color=Blue>--                  Graham Hutton               Erik Meijer</font>
<a name="(line16)"></a><font color=Blue>--             University of Nottingham    University of Utrecht</font>
<a name="(line17)"></a><font color=Blue>-- </font>
<a name="(line18)"></a><font color=Blue>-- This Haskell script defines a library of parser combinators, and is</font>
<a name="(line19)"></a><font color=Blue>-- taken from sections 1-6 of our article "Monadic Parser Combinators".</font>
<a name="(line20)"></a><font color=Blue>-- Some changes to the library have been made in the move from Gofer</font>
<a name="(line21)"></a><font color=Blue>-- to Haskell:</font>
<a name="(line22)"></a><font color=Blue>-- </font>
<a name="(line23)"></a><font color=Blue>--    * Do notation is used in place of monad comprehension notation;</font>
<a name="(line24)"></a><font color=Blue>-- </font>
<a name="(line25)"></a><font color=Blue>--    * The parser datatype is defined using "newtype", to avoid the overhead</font>
<a name="(line26)"></a><font color=Blue>--      of tagging and untagging parsers with the P constructor.</font>
<a name="(line27)"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="(line28)"></a>
<a name="(line29)"></a>
<a name="(line30)"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer
<a name="(line31)"></a>   <font color=Cyan>(</font>Parser<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font><font color=Cyan>,</font> item<font color=Cyan>,</font> first<font color=Cyan>,</font> papply<font color=Cyan>,</font> <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font><font color=Cyan>,</font> sat<font color=Cyan>,</font> <font color=Blue>{-tok,-}</font> many<font color=Cyan>,</font> many1<font color=Cyan>,</font>
<a name="(line32)"></a>    sepby<font color=Cyan>,</font> sepby1<font color=Cyan>,</font> chainl<font color=Cyan>,</font>
<a name="(line33)"></a>    chainl1<font color=Cyan>,</font> chainr<font color=Cyan>,</font> chainr1<font color=Cyan>,</font> ops<font color=Cyan>,</font> bracket<font color=Cyan>,</font> char<font color=Cyan>,</font> digit<font color=Cyan>,</font> lower<font color=Cyan>,</font> upper<font color=Cyan>,</font>
<a name="(line34)"></a>    letter<font color=Cyan>,</font> alphanum<font color=Cyan>,</font> string<font color=Cyan>,</font> ident<font color=Cyan>,</font> nat<font color=Cyan>,</font> int<font color=Cyan>,</font> spaces<font color=Cyan>,</font> comment<font color=Cyan>,</font> junk<font color=Cyan>,</font>
<a name="(line35)"></a>    skip<font color=Cyan>,</font> token<font color=Cyan>,</font> natural<font color=Cyan>,</font> integer<font color=Cyan>,</font> symbol<font color=Cyan>,</font> identifier<font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="(line36)"></a>
<a name="(line37)"></a><font color=Green><u>import</u></font> Char
<a name="(line38)"></a><font color=Green><u>import</u></font> Monad
<a name="(line39)"></a>
<a name="(line40)"></a><font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>+++</font>
<a name="(line41)"></a>
<a name="(line42)"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Char
<a name="(line43)"></a>
<a name="(line44)"></a><font color=Blue>---------------------------------------------------------</font>
<a name="(line45)"></a><font color=Blue>-- | The parser monad</font>
<a name="(line46)"></a>
<a name="(line47)"></a><a name="Parser"></a><font color=Green><u>newtype</u></font> Parser a   <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>
<a name="(line48)"></a>
<a name="(line49)"></a><font color=Green><u>instance</u></font> Functor Parser <font color=Green><u>where</u></font>
<a name="(line50)"></a>   <font color=Blue>-- map         :: (a -&gt; b) -&gt; (Parser a -&gt; Parser b)</font>
<a name="(line51)"></a>   fmap f <font color=Cyan>(</font>P p<font color=Cyan>)</font>    <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>f v<font color=Cyan>,</font> out<font color=Cyan>)</font> <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>
<a name="(line52)"></a>
<a name="(line53)"></a><font color=Green><u>instance</u></font> Monad Parser <font color=Green><u>where</u></font>
<a name="(line54)"></a>   <font color=Blue>-- return      :: a -&gt; Parser a</font>
<a name="(line55)"></a>   return v        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>v<font color=Cyan>,</font>inp<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>
<a name="(line56)"></a>
<a name="(line57)"></a>   <font color=Blue>-- &gt;&gt;=         :: Parser a -&gt; (a -&gt; Parser b) -&gt; Parser b</font>
<a name="(line58)"></a>   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>&gt;&gt;=</font> f     <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> concat <font color=Red>[</font>papply <font color=Cyan>(</font>f v<font color=Cyan>)</font> out <font color=Red>|</font> <font color=Cyan>(</font>v<font color=Cyan>,</font>out<font color=Cyan>)</font> <font color=Red>&lt;-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>
<a name="(line59)"></a>
<a name="(line60)"></a>   <font color=Blue>-- fail        :: String -&gt; Parser a</font>
<a name="(line61)"></a>   fail <font color=Green><u>_</u></font>          <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> []<font color=Cyan>)</font>
<a name="(line62)"></a>
<a name="(line63)"></a><font color=Green><u>instance</u></font> MonadPlus Parser <font color=Green><u>where</u></font>
<a name="(line64)"></a>   <font color=Blue>-- mzero       :: Parser a</font>
<a name="(line65)"></a>   mzero           <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font><font color=Green><u>_</u></font> <font color=Red>-&gt;</font> []<font color=Cyan>)</font>
<a name="(line66)"></a>
<a name="(line67)"></a>   <font color=Blue>-- mplus       :: Parser a -&gt; Parser a -&gt; Parser a</font>
<a name="(line68)"></a>   <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>`mplus`</font> <font color=Cyan>(</font>P q<font color=Cyan>)</font>  <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Cyan>(</font>p inp <font color=Cyan>++</font> q inp<font color=Cyan>)</font><font color=Cyan>)</font>
<a name="(line69)"></a>
<a name="(line70)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line71)"></a><font color=Blue>-- * Other primitive parser combinators</font>
<a name="(line72)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line73)"></a>
<a name="(line74)"></a><a name="item"></a>item               <font color=Red>::</font> Parser Token
<a name="(line75)"></a>item                <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>
<a name="(line76)"></a>                                   []     <font color=Red>-&gt;</font> []
<a name="(line77)"></a>                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>x<font color=Cyan>,</font>xs<font color=Cyan>)</font><font color=Red>]</font><font color=Cyan>)</font>
<a name="(line78)"></a>
<a name="(line79)"></a><a name="first"></a>first             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a
<a name="(line80)"></a>first <font color=Cyan>(</font>P p<font color=Cyan>)</font>        <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-&gt;</font> <font color=Green><u>case</u></font> p inp <font color=Green><u>of</u></font>
<a name="(line81)"></a>                                   []    <font color=Red>-&gt;</font> []
<a name="(line82)"></a>                                   <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-&gt;</font> <font color=Red>[</font>x<font color=Red>]</font><font color=Cyan>)</font>
<a name="(line83)"></a>
<a name="(line84)"></a><a name="papply"></a>papply            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-&gt;</font> <font color=Red>[</font><font color=Cyan>(</font>a<font color=Cyan>,</font><font color=Red>[</font>Token<font color=Red>]</font><font color=Cyan>)</font><font color=Red>]</font>
<a name="(line85)"></a>papply <font color=Cyan>(</font>P p<font color=Cyan>)</font> inp   <font color=Red>=</font> p inp
<a name="(line86)"></a>
<a name="(line87)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line88)"></a><font color=Blue>-- * Derived combinators</font>
<a name="(line89)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line90)"></a>
<a name="(line91)"></a><a name="+++"></a><font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font>             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a <font color=Red>-&gt;</font> Parser a
<a name="(line92)"></a><a name="p"></a>p <font color=Cyan>+++</font> q            <font color=Red>=</font> first <font color=Cyan>(</font>p <font color=Cyan>`mplus`</font> q<font color=Cyan>)</font>
<a name="(line93)"></a>
<a name="(line94)"></a><a name="sat"></a>sat               <font color=Red>::</font> <font color=Cyan>(</font>Token <font color=Red>-&gt;</font> Bool<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser Token
<a name="(line95)"></a>sat p              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> item<font color=Cyan>;</font> <font color=Green><u>if</u></font> p x <font color=Green><u>then</u></font> return x <font color=Green><u>else</u></font> mzero<font color=Cyan>}</font>
<a name="(line96)"></a>
<a name="(line97)"></a><font color=Blue>--tok               :: Token -&gt; Parser Token</font>
<a name="(line98)"></a><font color=Blue>--tok t              = do {x &lt;- item; if t==snd x then return t else mzero}</font>
<a name="(line99)"></a>
<a name="(line100)"></a><a name="many"></a>many              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="(line101)"></a>many p             <font color=Red>=</font> many1 p <font color=Cyan>+++</font> return []
<a name="(line102)"></a><font color=Blue>--many p           = force (many1 p +++ return [])</font>
<a name="(line103)"></a>
<a name="(line104)"></a><a name="many1"></a>many1             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="(line105)"></a>many1 p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many p<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line106)"></a>
<a name="(line107)"></a><a name="sepby"></a>sepby             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="(line108)"></a><a name="sepby"></a>p <font color=Cyan>`sepby`</font> sep      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`sepby1`</font> sep<font color=Cyan>)</font> <font color=Cyan>+++</font> return []
<a name="(line109)"></a>
<a name="(line110)"></a><a name="sepby1"></a>sepby1            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="(line111)"></a><a name="sepby1"></a>p <font color=Cyan>`sepby1`</font> sep     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>sep<font color=Cyan>;</font> p<font color=Cyan>}</font><font color=Cyan>)</font><font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line112)"></a>
<a name="(line113)"></a><a name="chainl"></a>chainl            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a
<a name="(line114)"></a>chainl p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainl1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v
<a name="(line115)"></a>
<a name="(line116)"></a><a name="chainl1"></a>chainl1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a
<a name="(line117)"></a><a name="chainl1"></a>p <font color=Cyan>`chainl1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>
<a name="(line118)"></a>                     <font color=Green><u>where</u></font>
<a name="(line119)"></a>                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line120)"></a>                                 <font color=Cyan>+++</font> return x
<a name="(line121)"></a>
<a name="(line122)"></a><a name="chainr"></a>chainr            <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> Parser a
<a name="(line123)"></a>chainr p op v      <font color=Red>=</font> <font color=Cyan>(</font>p <font color=Cyan>`chainr1`</font> op<font color=Cyan>)</font> <font color=Cyan>+++</font> return v
<a name="(line124)"></a>
<a name="(line125)"></a><a name="chainr1"></a>chainr1           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser <font color=Cyan>(</font>a <font color=Red>-&gt;</font> a <font color=Red>-&gt;</font> a<font color=Cyan>)</font> <font color=Red>-&gt;</font> Parser a
<a name="(line126)"></a><a name="chainr1"></a>p <font color=Cyan>`chainr1`</font> op     <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> rest x<font color=Cyan>}</font>
<a name="(line127)"></a>                     <font color=Green><u>where</u></font>
<a name="(line128)"></a>                        rest x <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>f <font color=Red>&lt;-</font> op<font color=Cyan>;</font> y <font color=Red>&lt;-</font> p <font color=Cyan>`chainr1`</font> op<font color=Cyan>;</font> return <font color=Cyan>(</font>f x y<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line129)"></a>                                 <font color=Cyan>+++</font> return x
<a name="(line130)"></a>
<a name="(line131)"></a><a name="ops"></a>ops               <font color=Red>::</font> <font color=Red>[</font><font color=Cyan>(</font>Parser a<font color=Cyan>,</font> b<font color=Cyan>)</font><font color=Red>]</font> <font color=Red>-&gt;</font> Parser b
<a name="(line132)"></a>ops xs             <font color=Red>=</font> foldr1 <font color=Cyan>(</font><font color=Cyan>+++</font><font color=Cyan>)</font> <font color=Red>[</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>p<font color=Cyan>;</font> return op<font color=Cyan>}</font> <font color=Red>|</font> <font color=Cyan>(</font>p<font color=Cyan>,</font>op<font color=Cyan>)</font> <font color=Red>&lt;-</font> xs<font color=Red>]</font>
<a name="(line133)"></a>
<a name="(line134)"></a><a name="bracket"></a>bracket           <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser b <font color=Red>-&gt;</font> Parser c <font color=Red>-&gt;</font> Parser b
<a name="(line135)"></a>bracket open p close <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>open<font color=Cyan>;</font> x <font color=Red>&lt;-</font> p<font color=Cyan>;</font> close<font color=Cyan>;</font> return x<font color=Cyan>}</font>
<a name="(line136)"></a>
<a name="(line137)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line138)"></a><font color=Blue>-- * Useful parsers</font>
<a name="(line139)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line140)"></a>
<a name="(line141)"></a><a name="char"></a>char              <font color=Red>::</font> Char <font color=Red>-&gt;</font> Parser Char
<a name="(line142)"></a>char x             <font color=Red>=</font> sat <font color=Cyan>(</font><font color=Red>\</font>y <font color=Red>-&gt;</font> x <font color=Cyan>==</font> y<font color=Cyan>)</font>
<a name="(line143)"></a>
<a name="(line144)"></a><a name="digit"></a>digit             <font color=Red>::</font> Parser Char
<a name="(line145)"></a>digit              <font color=Red>=</font> sat isDigit
<a name="(line146)"></a>
<a name="(line147)"></a><a name="lower"></a>lower             <font color=Red>::</font> Parser Char
<a name="(line148)"></a>lower              <font color=Red>=</font> sat isLower
<a name="(line149)"></a>
<a name="(line150)"></a><a name="upper"></a>upper             <font color=Red>::</font> Parser Char
<a name="(line151)"></a>upper              <font color=Red>=</font> sat isUpper
<a name="(line152)"></a>
<a name="(line153)"></a><a name="letter"></a>letter            <font color=Red>::</font> Parser Char
<a name="(line154)"></a>letter             <font color=Red>=</font> sat isAlpha
<a name="(line155)"></a>
<a name="(line156)"></a><a name="alphanum"></a>alphanum          <font color=Red>::</font> Parser Char
<a name="(line157)"></a>alphanum           <font color=Red>=</font> sat isAlphaNum <font color=Cyan>+++</font> char <font color=Magenta>'_'</font>
<a name="(line158)"></a>
<a name="(line159)"></a><a name="string"></a>string            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String
<a name="(line160)"></a>string <font color=Magenta>""</font>          <font color=Red>=</font> return <font color=Magenta>""</font>
<a name="(line161)"></a>string <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font>      <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char x<font color=Cyan>;</font> string xs<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line162)"></a>
<a name="(line163)"></a><a name="ident"></a>ident             <font color=Red>::</font> Parser String
<a name="(line164)"></a>ident              <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> lower<font color=Cyan>;</font> xs <font color=Red>&lt;-</font> many alphanum<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font><font color=Cyan>}</font>
<a name="(line165)"></a>
<a name="(line166)"></a><a name="nat"></a>nat               <font color=Red>::</font> Parser Int
<a name="(line167)"></a>nat                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> digit<font color=Cyan>;</font> return <font color=Cyan>(</font>fromEnum x <font color=Blue>-</font> fromEnum <font color=Magenta>'0'</font><font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>`chainl1`</font> return op
<a name="(line168)"></a>                     <font color=Green><u>where</u></font>
<a name="(line169)"></a>                        m <font color=Cyan>`op`</font> n <font color=Red>=</font> <font color=Magenta>10</font><font color=Cyan>*</font>m <font color=Cyan>+</font> n
<a name="(line170)"></a>
<a name="(line171)"></a><a name="int"></a>int               <font color=Red>::</font> Parser Int
<a name="(line172)"></a>int                <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>char <font color=Magenta>'-'</font><font color=Cyan>;</font> n <font color=Red>&lt;-</font> nat<font color=Cyan>;</font> return <font color=Cyan>(</font><font color=Blue>-</font>n<font color=Cyan>)</font><font color=Cyan>}</font> <font color=Cyan>+++</font> nat
<a name="(line173)"></a>
<a name="(line174)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line175)"></a><font color=Blue>-- * Lexical combinators</font>
<a name="(line176)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line177)"></a>
<a name="(line178)"></a><a name="spaces"></a>spaces            <font color=Red>::</font> Parser ()
<a name="(line179)"></a>spaces             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many1 <font color=Cyan>(</font>sat isSpace<font color=Cyan>)</font><font color=Cyan>;</font> return ()<font color=Cyan>}</font>
<a name="(line180)"></a>
<a name="(line181)"></a><a name="comment"></a>comment           <font color=Red>::</font> Parser ()
<a name="(line182)"></a><font color=Blue>--comment            = do {string "--"; many (sat (\x -&gt; x /= '\n')); return ()}</font>
<a name="(line183)"></a><font color=Blue>--comment            = do </font>
<a name="(line184)"></a><font color=Blue>--                       _ &lt;- string "--"</font>
<a name="(line185)"></a><font color=Blue>--                       _ &lt;- many (sat (\x -&gt; x /= '\n'))</font>
<a name="(line186)"></a><font color=Blue>--                       return ()</font>
<a name="(line187)"></a>comment            <font color=Red>=</font> <font color=Green><u>do</u></font>
<a name="(line188)"></a>                       bracket <font color=Cyan>(</font>string <font color=Magenta>"/*"</font><font color=Cyan>)</font> <font color=Cyan>(</font>many item<font color=Cyan>)</font> <font color=Cyan>(</font>string <font color=Magenta>"*/"</font><font color=Cyan>)</font>
<a name="(line189)"></a>                       return ()
<a name="(line190)"></a>
<a name="(line191)"></a><a name="junk"></a>junk              <font color=Red>::</font> Parser ()
<a name="(line192)"></a>junk               <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>many <font color=Cyan>(</font>spaces <font color=Cyan>+++</font> comment<font color=Cyan>)</font><font color=Cyan>;</font> return ()<font color=Cyan>}</font>
<a name="(line193)"></a>
<a name="(line194)"></a><a name="skip"></a>skip              <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a
<a name="(line195)"></a>skip p             <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>junk<font color=Cyan>;</font> p<font color=Cyan>}</font>
<a name="(line196)"></a>
<a name="(line197)"></a><a name="token"></a>token             <font color=Red>::</font> Parser a <font color=Red>-&gt;</font> Parser a
<a name="(line198)"></a>token p            <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font>v <font color=Red>&lt;-</font> p<font color=Cyan>;</font> junk<font color=Cyan>;</font> return v<font color=Cyan>}</font>
<a name="(line199)"></a>
<a name="(line200)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line201)"></a><font color=Blue>-- * Token parsers</font>
<a name="(line202)"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="(line203)"></a>
<a name="(line204)"></a><a name="natural"></a>natural           <font color=Red>::</font> Parser Int
<a name="(line205)"></a>natural            <font color=Red>=</font> token nat
<a name="(line206)"></a>
<a name="(line207)"></a><a name="integer"></a>integer           <font color=Red>::</font> Parser Int
<a name="(line208)"></a>integer            <font color=Red>=</font> token int
<a name="(line209)"></a>
<a name="(line210)"></a><a name="symbol"></a>symbol            <font color=Red>::</font> String <font color=Red>-&gt;</font> Parser String
<a name="(line211)"></a>symbol xs          <font color=Red>=</font> token <font color=Cyan>(</font>string xs<font color=Cyan>)</font>
<a name="(line212)"></a>
<a name="(line213)"></a><a name="identifier"></a>identifier        <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-&gt;</font> Parser String
<a name="(line214)"></a>identifier ks      <font color=Red>=</font> token <font color=Cyan>(</font><font color=Green><u>do</u></font> <font color=Cyan>{</font>x <font color=Red>&lt;-</font> ident<font color=Cyan>;</font>
<a name="(line215)"></a>                                <font color=Green><u>if</u></font> not <font color=Cyan>(</font>elem x ks<font color=Cyan>)</font> <font color=Green><u>then</u></font> return x
<a name="(line216)"></a>                                <font color=Green><u>else</u></font> return mzero<font color=Cyan>}</font><font color=Cyan>)</font>
<a name="(line217)"></a>
<a name="(line218)"></a><font color=Blue>------------------------------------------------------------------------------</font>
</pre>
</html>