polyparse-1.2: docs/haddock/src/Text/ParserCombinators/HuttonMeijer.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>src/Text/ParserCombinators/HuttonMeijer.hs</title>
</head>
<body>
<pre><a name="line-1"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="line-2"></a><font color=Blue>-- |</font>
<a name="line-3"></a><font color=Blue>-- Module : Text.ParserCombinators.HuttonMeijer</font>
<a name="line-4"></a><font color=Blue>-- Copyright : Graham Hutton (University of Nottingham), Erik Meijer (University of Utrecht)</font>
<a name="line-5"></a><font color=Blue>-- Licence : BSD</font>
<a name="line-6"></a><font color=Blue>-- </font>
<a name="line-7"></a><font color=Blue>-- Maintainer : Malcolm Wallace <Malcolm.Wallace@cs.york.ac.uk></font>
<a name="line-8"></a><font color=Blue>-- Stability : Stable</font>
<a name="line-9"></a><font color=Blue>-- Portability : All</font>
<a name="line-10"></a><font color=Blue>--</font>
<a name="line-11"></a><font color=Blue>-- A LIBRARY OF MONADIC PARSER COMBINATORS</font>
<a name="line-12"></a><font color=Blue>-- </font>
<a name="line-13"></a><font color=Blue>-- 29th July 1996</font>
<a name="line-14"></a><font color=Blue>-- </font>
<a name="line-15"></a><font color=Blue>-- Graham Hutton Erik Meijer</font>
<a name="line-16"></a><font color=Blue>-- University of Nottingham University of Utrecht</font>
<a name="line-17"></a><font color=Blue>-- </font>
<a name="line-18"></a><font color=Blue>-- This Haskell script defines a library of parser combinators, and is</font>
<a name="line-19"></a><font color=Blue>-- taken from sections 1-6 of our article "Monadic Parser Combinators".</font>
<a name="line-20"></a><font color=Blue>-- Some changes to the library have been made in the move from Gofer</font>
<a name="line-21"></a><font color=Blue>-- to Haskell:</font>
<a name="line-22"></a><font color=Blue>-- </font>
<a name="line-23"></a><font color=Blue>-- * Do notation is used in place of monad comprehension notation;</font>
<a name="line-24"></a><font color=Blue>-- </font>
<a name="line-25"></a><font color=Blue>-- * The parser datatype is defined using "newtype", to avoid the overhead</font>
<a name="line-26"></a><font color=Blue>-- of tagging and untagging parsers with the P constructor.</font>
<a name="line-27"></a><font color=Blue>-----------------------------------------------------------------------------</font>
<a name="line-28"></a>
<a name="line-29"></a>
<a name="line-30"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>HuttonMeijer
<a name="line-31"></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="line-32"></a> sepby<font color=Cyan>,</font> sepby1<font color=Cyan>,</font> chainl<font color=Cyan>,</font>
<a name="line-33"></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="line-34"></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="line-35"></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="line-36"></a>
<a name="line-37"></a><font color=Green><u>import</u></font> Char
<a name="line-38"></a><font color=Green><u>import</u></font> Monad
<a name="line-39"></a>
<a name="line-40"></a><font color=Green><u>infixr</u></font> <font color=Magenta>5</font> <font color=Cyan>+++</font>
<a name="line-41"></a>
<a name="line-42"></a><a name="Token"></a><font color=Green><u>type</u></font> Token <font color=Red>=</font> Char
<a name="line-43"></a>
<a name="line-44"></a><font color=Blue>---------------------------------------------------------</font>
<a name="line-45"></a><font color=Blue>-- | The parser monad</font>
<a name="line-46"></a>
<a name="line-47"></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="line-48"></a>
<a name="line-49"></a><font color=Green><u>instance</u></font> Functor Parser <font color=Green><u>where</u></font>
<a name="line-50"></a> <font color=Blue>-- map :: (a -> b) -> (Parser a -> Parser b)</font>
<a name="line-51"></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="line-52"></a>
<a name="line-53"></a><font color=Green><u>instance</u></font> Monad Parser <font color=Green><u>where</u></font>
<a name="line-54"></a> <font color=Blue>-- return :: a -> Parser a</font>
<a name="line-55"></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="line-56"></a>
<a name="line-57"></a> <font color=Blue>-- >>= :: Parser a -> (a -> Parser b) -> Parser b</font>
<a name="line-58"></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="line-59"></a>
<a name="line-60"></a> <font color=Blue>-- fail :: String -> Parser a</font>
<a name="line-61"></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="line-62"></a>
<a name="line-63"></a><font color=Green><u>instance</u></font> MonadPlus Parser <font color=Green><u>where</u></font>
<a name="line-64"></a> <font color=Blue>-- mzero :: Parser a</font>
<a name="line-65"></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="line-66"></a>
<a name="line-67"></a> <font color=Blue>-- mplus :: Parser a -> Parser a -> Parser a</font>
<a name="line-68"></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="line-69"></a>
<a name="line-70"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-71"></a><font color=Blue>-- * Other primitive parser combinators</font>
<a name="line-72"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-73"></a>
<a name="line-74"></a><a name="item"></a><font color=Blue>item</font> <font color=Red>::</font> Parser Token
<a name="line-75"></a><font color=Blue>item</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> inp <font color=Green><u>of</u></font>
<a name="line-76"></a> [] <font color=Red>-></font> []
<a name="line-77"></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="line-78"></a>
<a name="line-79"></a><a name="first"></a><font color=Blue>first</font> <font color=Red>::</font> Parser a <font color=Red>-></font> Parser a
<a name="line-80"></a><font color=Blue>first</font> <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="line-81"></a> [] <font color=Red>-></font> []
<a name="line-82"></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="line-83"></a>
<a name="line-84"></a><a name="papply"></a><font color=Blue>papply</font> <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="line-85"></a><font color=Blue>papply</font> <font color=Cyan>(</font>P p<font color=Cyan>)</font> inp <font color=Red>=</font> p inp
<a name="line-86"></a>
<a name="line-87"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-88"></a><font color=Blue>-- * Derived combinators</font>
<a name="line-89"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-90"></a>
<a name="line-91"></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="line-92"></a><a name="p"></a><font color=Blue>p</font> <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="line-93"></a>
<a name="line-94"></a><a name="sat"></a><font color=Blue>sat</font> <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="line-95"></a><font color=Blue>sat</font> 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="line-96"></a>
<a name="line-97"></a><font color=Blue>--tok :: Token -> Parser Token</font>
<a name="line-98"></a><font color=Blue>--tok t = do {x <- item; if t==snd x then return t else mzero}</font>
<a name="line-99"></a>
<a name="line-100"></a><a name="many"></a><font color=Blue>many</font> <font color=Red>::</font> Parser a <font color=Red>-></font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="line-101"></a><font color=Blue>many</font> p <font color=Red>=</font> many1 p <font color=Cyan>+++</font> return []
<a name="line-102"></a><font color=Blue>--many p = force (many1 p +++ return [])</font>
<a name="line-103"></a>
<a name="line-104"></a><a name="many1"></a><font color=Blue>many1</font> <font color=Red>::</font> Parser a <font color=Red>-></font> Parser <font color=Red>[</font>a<font color=Red>]</font>
<a name="line-105"></a><font color=Blue>many1</font> 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="line-106"></a>
<a name="line-107"></a><a name="sepby"></a><font color=Blue>sepby</font> <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="line-108"></a><a name="sepby"></a><font color=Blue>p</font> <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="line-109"></a>
<a name="line-110"></a><a name="sepby1"></a><font color=Blue>sepby1</font> <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="line-111"></a><a name="sepby1"></a><font color=Blue>p</font> <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="line-112"></a>
<a name="line-113"></a><a name="chainl"></a><font color=Blue>chainl</font> <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="line-114"></a><font color=Blue>chainl</font> 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="line-115"></a>
<a name="line-116"></a><a name="chainl1"></a><font color=Blue>chainl1</font> <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="line-117"></a><a name="chainl1"></a><font color=Blue>p</font> <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="line-118"></a> <font color=Green><u>where</u></font>
<a name="line-119"></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="line-120"></a> <font color=Cyan>+++</font> return x
<a name="line-121"></a>
<a name="line-122"></a><a name="chainr"></a><font color=Blue>chainr</font> <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="line-123"></a><font color=Blue>chainr</font> 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="line-124"></a>
<a name="line-125"></a><a name="chainr1"></a><font color=Blue>chainr1</font> <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="line-126"></a><a name="chainr1"></a><font color=Blue>p</font> <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="line-127"></a> <font color=Green><u>where</u></font>
<a name="line-128"></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="line-129"></a> <font color=Cyan>+++</font> return x
<a name="line-130"></a>
<a name="line-131"></a><a name="ops"></a><font color=Blue>ops</font> <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="line-132"></a><font color=Blue>ops</font> 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="line-133"></a>
<a name="line-134"></a><a name="bracket"></a><font color=Blue>bracket</font> <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="line-135"></a><font color=Blue>bracket</font> 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="line-136"></a>
<a name="line-137"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-138"></a><font color=Blue>-- * Useful parsers</font>
<a name="line-139"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-140"></a>
<a name="line-141"></a><a name="char"></a><font color=Blue>char</font> <font color=Red>::</font> Char <font color=Red>-></font> Parser Char
<a name="line-142"></a><font color=Blue>char</font> 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="line-143"></a>
<a name="line-144"></a><a name="digit"></a><font color=Blue>digit</font> <font color=Red>::</font> Parser Char
<a name="line-145"></a><font color=Blue>digit</font> <font color=Red>=</font> sat isDigit
<a name="line-146"></a>
<a name="line-147"></a><a name="lower"></a><font color=Blue>lower</font> <font color=Red>::</font> Parser Char
<a name="line-148"></a><font color=Blue>lower</font> <font color=Red>=</font> sat isLower
<a name="line-149"></a>
<a name="line-150"></a><a name="upper"></a><font color=Blue>upper</font> <font color=Red>::</font> Parser Char
<a name="line-151"></a><font color=Blue>upper</font> <font color=Red>=</font> sat isUpper
<a name="line-152"></a>
<a name="line-153"></a><a name="letter"></a><font color=Blue>letter</font> <font color=Red>::</font> Parser Char
<a name="line-154"></a><font color=Blue>letter</font> <font color=Red>=</font> sat isAlpha
<a name="line-155"></a>
<a name="line-156"></a><a name="alphanum"></a><font color=Blue>alphanum</font> <font color=Red>::</font> Parser Char
<a name="line-157"></a><font color=Blue>alphanum</font> <font color=Red>=</font> sat isAlphaNum <font color=Cyan>+++</font> char <font color=Magenta>'_'</font>
<a name="line-158"></a>
<a name="line-159"></a><a name="string"></a><font color=Blue>string</font> <font color=Red>::</font> String <font color=Red>-></font> Parser String
<a name="line-160"></a><font color=Blue>string</font> <font color=Magenta>""</font> <font color=Red>=</font> return <font color=Magenta>""</font>
<a name="line-161"></a><font color=Blue>string</font> <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="line-162"></a>
<a name="line-163"></a><a name="ident"></a><font color=Blue>ident</font> <font color=Red>::</font> Parser String
<a name="line-164"></a><font color=Blue>ident</font> <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="line-165"></a>
<a name="line-166"></a><a name="nat"></a><font color=Blue>nat</font> <font color=Red>::</font> Parser Int
<a name="line-167"></a><font color=Blue>nat</font> <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="line-168"></a> <font color=Green><u>where</u></font>
<a name="line-169"></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="line-170"></a>
<a name="line-171"></a><a name="int"></a><font color=Blue>int</font> <font color=Red>::</font> Parser Int
<a name="line-172"></a><font color=Blue>int</font> <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="line-173"></a>
<a name="line-174"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-175"></a><font color=Blue>-- * Lexical combinators</font>
<a name="line-176"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-177"></a>
<a name="line-178"></a><a name="spaces"></a><font color=Blue>spaces</font> <font color=Red>::</font> Parser ()
<a name="line-179"></a><font color=Blue>spaces</font> <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="line-180"></a>
<a name="line-181"></a><a name="comment"></a><font color=Blue>comment</font> <font color=Red>::</font> Parser ()
<a name="line-182"></a><font color=Blue>--comment = do {string "--"; many (sat (\x -> x /= '\n')); return ()}</font>
<a name="line-183"></a><font color=Blue>--comment = do </font>
<a name="line-184"></a><font color=Blue>-- _ <- string "--"</font>
<a name="line-185"></a><font color=Blue>-- _ <- many (sat (\x -> x /= '\n'))</font>
<a name="line-186"></a><font color=Blue>-- return ()</font>
<a name="line-187"></a><font color=Blue>comment</font> <font color=Red>=</font> <font color=Green><u>do</u></font>
<a name="line-188"></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="line-189"></a> return ()
<a name="line-190"></a>
<a name="line-191"></a><a name="junk"></a><font color=Blue>junk</font> <font color=Red>::</font> Parser ()
<a name="line-192"></a><font color=Blue>junk</font> <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="line-193"></a>
<a name="line-194"></a><a name="skip"></a><font color=Blue>skip</font> <font color=Red>::</font> Parser a <font color=Red>-></font> Parser a
<a name="line-195"></a><font color=Blue>skip</font> 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="line-196"></a>
<a name="line-197"></a><a name="token"></a><font color=Blue>token</font> <font color=Red>::</font> Parser a <font color=Red>-></font> Parser a
<a name="line-198"></a><font color=Blue>token</font> 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="line-199"></a>
<a name="line-200"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-201"></a><font color=Blue>-- * Token parsers</font>
<a name="line-202"></a><font color=Blue>-- ------------------------------------------------------------</font>
<a name="line-203"></a>
<a name="line-204"></a><a name="natural"></a><font color=Blue>natural</font> <font color=Red>::</font> Parser Int
<a name="line-205"></a><font color=Blue>natural</font> <font color=Red>=</font> token nat
<a name="line-206"></a>
<a name="line-207"></a><a name="integer"></a><font color=Blue>integer</font> <font color=Red>::</font> Parser Int
<a name="line-208"></a><font color=Blue>integer</font> <font color=Red>=</font> token int
<a name="line-209"></a>
<a name="line-210"></a><a name="symbol"></a><font color=Blue>symbol</font> <font color=Red>::</font> String <font color=Red>-></font> Parser String
<a name="line-211"></a><font color=Blue>symbol</font> xs <font color=Red>=</font> token <font color=Cyan>(</font>string xs<font color=Cyan>)</font>
<a name="line-212"></a>
<a name="line-213"></a><a name="identifier"></a><font color=Blue>identifier</font> <font color=Red>::</font> <font color=Red>[</font>String<font color=Red>]</font> <font color=Red>-></font> Parser String
<a name="line-214"></a><font color=Blue>identifier</font> 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="line-215"></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="line-216"></a> <font color=Green><u>else</u></font> return mzero<font color=Cyan>}</font><font color=Cyan>)</font>
<a name="line-217"></a>
<a name="line-218"></a><font color=Blue>------------------------------------------------------------------------------</font>
</pre>
</body>
</html>