cpphs-1.6: docs/cpphs/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 : ParseLib</font>
<a name="(line4)"></a><font color=Blue>-- Copyright : ...</font>
<a name="(line5)"></a><font color=Blue>-- Copyright : Graham Hutton (University of Nottingham), Erik Meijer (University of Utrecht)</font>
<a name="(line6)"></a><font color=Blue>-- </font>
<a name="(line7)"></a><font color=Blue>-- Maintainer : Malcolm Wallace <Malcolm.Wallace@cs.york.ac.uk></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>-></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 -> b) -> (Parser a -> 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>-></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><-</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 -> 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>-></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>-- >>= :: Parser a -> (a -> Parser b) -> Parser b</font>
<a name="(line58)"></a> <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>>>=</font> f <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>inp <font color=Red>-></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><-</font> p inp<font color=Red>]</font><font color=Cyan>)</font>
<a name="(line59)"></a>
<a name="(line60)"></a> <font color=Blue>-- fail :: String -> 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>-></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>-></font> []<font color=Cyan>)</font>
<a name="(line66)"></a>
<a name="(line67)"></a> <font color=Blue>-- mplus :: Parser a -> Parser a -> 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>-></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>-></font> <font color=Green><u>case</u></font> inp <font color=Green><u>of</u></font>
<a name="(line76)"></a> [] <font color=Red>-></font> []
<a name="(line77)"></a> <font color=Cyan>(</font>x<font color=Red><b>:</b></font>xs<font color=Cyan>)</font> <font color=Red>-></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>-></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>-></font> <font color=Green><u>case</u></font> p inp <font color=Green><u>of</u></font>
<a name="(line81)"></a> [] <font color=Red>-></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>-></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>-></font> <font color=Red>[</font>Token<font color=Red>]</font> <font color=Red>-></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>-></font> Parser a <font color=Red>-></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>-></font> Bool<font color=Cyan>)</font> <font color=Red>-></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><-</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 -> Parser Token</font>
<a name="(line98)"></a><font color=Blue>--tok t = do {x <- 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>-></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>-></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><-</font> p<font color=Cyan>;</font> xs <font color=Red><-</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>-></font> Parser b <font color=Red>-></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>-></font> Parser b <font color=Red>-></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><-</font> p<font color=Cyan>;</font> xs <font color=Red><-</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>-></font> Parser <font color=Cyan>(</font>a <font color=Red>-></font> a <font color=Red>-></font> a<font color=Cyan>)</font> <font color=Red>-></font> a <font color=Red>-></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>-></font> Parser <font color=Cyan>(</font>a <font color=Red>-></font> a <font color=Red>-></font> a<font color=Cyan>)</font> <font color=Red>-></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><-</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><-</font> op<font color=Cyan>;</font> y <font color=Red><-</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>-></font> Parser <font color=Cyan>(</font>a <font color=Red>-></font> a <font color=Red>-></font> a<font color=Cyan>)</font> <font color=Red>-></font> a <font color=Red>-></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>-></font> Parser <font color=Cyan>(</font>a <font color=Red>-></font> a <font color=Red>-></font> a<font color=Cyan>)</font> <font color=Red>-></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><-</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><-</font> op<font color=Cyan>;</font> y <font color=Red><-</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>-></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><-</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>-></font> Parser b <font color=Red>-></font> Parser c <font color=Red>-></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><-</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>-></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>-></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>-></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><-</font> lower<font color=Cyan>;</font> xs <font color=Red><-</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><-</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><-</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 -> x /= '\n')); return ()}</font>
<a name="(line183)"></a><font color=Blue>--comment = do </font>
<a name="(line184)"></a><font color=Blue>-- _ <- string "--"</font>
<a name="(line185)"></a><font color=Blue>-- _ <- many (sat (\x -> 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>-></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>-></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><-</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>-></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>-></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><-</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>