polyparse-1.4.1: docs/haddock/src/Text/ParserCombinators/Poly/StateLazy.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<pre><a name="line-1"></a><font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>StateLazy
<a name="line-2"></a> <font color=Cyan>(</font> <font color=Blue>-- * The Parser datatype</font>
<a name="line-3"></a> Parser<font color=Cyan>(</font>P<font color=Cyan>)</font> <font color=Blue>-- datatype, instance of: Functor, Monad, PolyParse</font>
<a name="line-4"></a> <font color=Cyan>,</font> Result<font color=Cyan>(</font><font color=Red>..</font><font color=Cyan>)</font> <font color=Blue>-- internal to the parser monad</font>
<a name="line-5"></a> <font color=Cyan>,</font> runParser <font color=Blue>-- :: Parser s t a -> s -> [t] -> (Either String a, s, [t])</font>
<a name="line-6"></a> <font color=Blue>-- ** basic parsers</font>
<a name="line-7"></a> <font color=Cyan>,</font> next <font color=Blue>-- :: Parser s t t</font>
<a name="line-8"></a> <font color=Cyan>,</font> eof <font color=Blue>-- :: Parser s t ()</font>
<a name="line-9"></a> <font color=Cyan>,</font> satisfy <font color=Blue>-- :: (t->Bool) -> Parser s t t</font>
<a name="line-10"></a> <font color=Cyan>,</font> manyFinally <font color=Blue>-- :: Parser s t a -> Parser s t z -> Parser s t [a]</font>
<a name="line-11"></a> <font color=Blue>-- ** State-handling</font>
<a name="line-12"></a> <font color=Cyan>,</font> stUpdate <font color=Blue>-- :: (s->s) -> Parser s t ()</font>
<a name="line-13"></a> <font color=Cyan>,</font> stQuery <font color=Blue>-- :: (s->a) -> Parser s t a</font>
<a name="line-14"></a> <font color=Cyan>,</font> stGet <font color=Blue>-- :: Parser s t s</font>
<a name="line-15"></a> <font color=Blue>-- ** re-parsing</font>
<a name="line-16"></a> <font color=Cyan>,</font> reparse <font color=Blue>-- :: [t] -> Parser s t ()</font>
<a name="line-17"></a> <font color=Blue>-- * Re-export all more general combinators</font>
<a name="line-18"></a> <font color=Cyan>,</font> <font color=Green><u>module</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>Base
<a name="line-19"></a> <font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="line-20"></a>
<a name="line-21"></a>
<a name="line-22"></a><font color=Green><u>import</u></font> Text<font color=Cyan>.</font>ParserCombinators<font color=Cyan>.</font>Poly<font color=Cyan>.</font>Base hiding <font color=Cyan>(</font>manyFinally<font color=Cyan>)</font>
<a name="line-23"></a>
<a name="line-24"></a><font color=Magenta><em>#if __GLASGOW_HASKELL__</em></font>
<a name="line-25"></a><font color=Green><u>import</u></font> Control<font color=Cyan>.</font>Exception hiding <font color=Cyan>(</font>bracket<font color=Cyan>)</font>
<a name="line-26"></a><a name="throwE"></a><font color=Blue>throwE</font> <font color=Red>::</font> String <font color=Red>-></font> a
<a name="line-27"></a><font color=Blue>throwE</font> msg <font color=Red>=</font> throw <font color=Cyan>(</font>ErrorCall msg<font color=Cyan>)</font>
<a name="line-28"></a><font color=Magenta><em>#else</em></font>
<a name="line-29"></a><font color=Blue>throwE</font> <font color=Red>::</font> String <font color=Red>-></font> a
<a name="line-30"></a><font color=Blue>throwE</font> msg <font color=Red>=</font> error msg
<a name="line-31"></a><font color=Magenta><em>#endif</em></font>
<a name="line-32"></a>
<a name="line-33"></a>
<a name="line-34"></a><a name="Parser"></a><font color=Blue>-- | This @Parser@ datatype is a fairly generic parsing monad with error</font>
<a name="line-35"></a><a name="Parser"></a><font color=Blue>-- reporting. It can be used for arbitrary token types, not just</font>
<a name="line-36"></a><a name="Parser"></a><font color=Blue>-- String input. (If you require a running state, use module PolyState</font>
<a name="line-37"></a><a name="Parser"></a><font color=Blue>-- instead)</font>
<a name="line-38"></a><a name="Parser"></a><font color=Green><u>newtype</u></font> Parser s t a <font color=Red>=</font> P <font color=Cyan>(</font>s <font color=Red>-></font> <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>-></font> Result <font color=Red>[</font>t<font color=Red>]</font> s a<font color=Cyan>)</font>
<a name="line-39"></a>
<a name="line-40"></a><a name="Result"></a><font color=Blue>-- | A return type like Either, that distinguishes not only between</font>
<a name="line-41"></a><a name="Result"></a><font color=Blue>-- right and wrong answers, but also has gradations of wrongness.</font>
<a name="line-42"></a><a name="Result"></a><font color=Blue>-- This should only be used for writing very primitive</font>
<a name="line-43"></a><a name="Result"></a><font color=Blue>-- parsers - really it is an internal detail of the library.</font>
<a name="line-44"></a><a name="Result"></a><font color=Green><u>data</u></font> Result z s a <font color=Red>=</font> Success z s a
<a name="line-45"></a> <font color=Red>|</font> Failure z s String
<a name="line-46"></a> <font color=Red>|</font> Committed <font color=Cyan>(</font>Result z s a<font color=Cyan>)</font>
<a name="line-47"></a>
<a name="line-48"></a><font color=Green><u>instance</u></font> Functor <font color=Cyan>(</font>Result z s<font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="line-49"></a> fmap f <font color=Cyan>(</font>Success z s a<font color=Cyan>)</font> <font color=Red>=</font> Success z s <font color=Cyan>(</font>f a<font color=Cyan>)</font>
<a name="line-50"></a> fmap f <font color=Cyan>(</font>Failure z s e<font color=Cyan>)</font> <font color=Red>=</font> Failure z s e
<a name="line-51"></a> fmap f <font color=Cyan>(</font>Committed r<font color=Cyan>)</font> <font color=Red>=</font> Committed <font color=Cyan>(</font>fmap f r<font color=Cyan>)</font>
<a name="line-52"></a>
<a name="line-53"></a><a name="runParser"></a><font color=Blue>-- | Apply a parser to an input token sequence.</font>
<a name="line-54"></a><font color=Blue>runParser</font> <font color=Red>::</font> Parser s t a <font color=Red>-></font> s <font color=Red>-></font> <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Cyan>,</font> s<font color=Cyan>,</font> <font color=Red>[</font>t<font color=Red>]</font><font color=Cyan>)</font>
<a name="line-55"></a><font color=Blue>runParser</font> <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Red>=</font> <font color=Red>\</font>s <font color=Red>-></font> fromResult <font color=Cyan>.</font> p s
<a name="line-56"></a> <font color=Green><u>where</u></font>
<a name="line-57"></a> fromResult <font color=Red>::</font> Result z s a <font color=Red>-></font> <font color=Cyan>(</font>a<font color=Cyan>,</font> s<font color=Cyan>,</font> z<font color=Cyan>)</font>
<a name="line-58"></a> fromResult <font color=Cyan>(</font>Success z s a<font color=Cyan>)</font> <font color=Red>=</font> <font color=Cyan>(</font>a<font color=Cyan>,</font> s<font color=Cyan>,</font> z<font color=Cyan>)</font>
<a name="line-59"></a> fromResult <font color=Cyan>(</font>Failure z s e<font color=Cyan>)</font> <font color=Red>=</font> throwE e
<a name="line-60"></a> fromResult <font color=Cyan>(</font>Committed r<font color=Cyan>)</font> <font color=Red>=</font> fromResult r
<a name="line-61"></a>
<a name="line-62"></a><font color=Green><u>instance</u></font> Functor <font color=Cyan>(</font>Parser s t<font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="line-63"></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>s <font color=Red>-></font> fmap f <font color=Cyan>.</font> p s<font color=Cyan>)</font>
<a name="line-64"></a>
<a name="line-65"></a><font color=Green><u>instance</u></font> Monad <font color=Cyan>(</font>Parser s t<font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="line-66"></a> return x <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> Success ts s x<font color=Cyan>)</font>
<a name="line-67"></a> fail e <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> Failure ts s e<font color=Cyan>)</font>
<a name="line-68"></a> <font color=Cyan>(</font>P f<font color=Cyan>)</font> <font color=Cyan>>>=</font> g <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> continue <font color=Cyan>.</font> f s<font color=Cyan>)</font>
<a name="line-69"></a> <font color=Green><u>where</u></font>
<a name="line-70"></a> continue <font color=Cyan>(</font>Success ts s x<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>P g'<font color=Cyan>)</font> <font color=Red>=</font> g x <font color=Green><u>in</u></font> g' s ts
<a name="line-71"></a> continue <font color=Cyan>(</font>Committed <font color=Cyan>(</font>Committed r<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>=</font> continue <font color=Cyan>(</font>Committed r<font color=Cyan>)</font>
<a name="line-72"></a> continue <font color=Cyan>(</font>Committed r<font color=Cyan>)</font> <font color=Red>=</font> Committed <font color=Cyan>(</font>continue r<font color=Cyan>)</font>
<a name="line-73"></a> continue <font color=Cyan>(</font>Failure ts s e<font color=Cyan>)</font> <font color=Red>=</font> Failure ts s e
<a name="line-74"></a>
<a name="line-75"></a><font color=Green><u>instance</u></font> PolyParse <font color=Cyan>(</font>Parser s t<font color=Cyan>)</font> <font color=Green><u>where</u></font>
<a name="line-76"></a> commit <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> Committed <font color=Cyan>.</font> p s<font color=Cyan>)</font>
<a name="line-77"></a> <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>`adjustErr`</font> f <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> adjust <font color=Cyan>.</font> p s<font color=Cyan>)</font>
<a name="line-78"></a> <font color=Green><u>where</u></font>
<a name="line-79"></a> adjust <font color=Cyan>(</font>Failure z s e<font color=Cyan>)</font> <font color=Red>=</font> Failure z s <font color=Cyan>(</font>f e<font color=Cyan>)</font>
<a name="line-80"></a> adjust <font color=Cyan>(</font>Committed r<font color=Cyan>)</font> <font color=Red>=</font> Committed <font color=Cyan>(</font>adjust r<font color=Cyan>)</font>
<a name="line-81"></a> adjust good <font color=Red>=</font> good
<a name="line-82"></a>
<a name="line-83"></a> <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Cyan>`onFail`</font> <font color=Cyan>(</font>P q<font color=Cyan>)</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> continue s ts <font color=Cyan>$</font> p s ts<font color=Cyan>)</font>
<a name="line-84"></a> <font color=Green><u>where</u></font>
<a name="line-85"></a> continue s ts <font color=Cyan>(</font>Failure <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>=</font> q s ts
<a name="line-86"></a> <font color=Blue>-- continue _ _ (Committed r) = r -- no, remain Committed</font>
<a name="line-87"></a> continue <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> r <font color=Red>=</font> r
<a name="line-88"></a>
<a name="line-89"></a> oneOf' <font color=Red>=</font> accum []
<a name="line-90"></a> <font color=Green><u>where</u></font> accum errs [] <font color=Red>=</font>
<a name="line-91"></a> fail <font color=Cyan>(</font><font color=Magenta>"failed to parse any of the possible choices:\n"</font>
<a name="line-92"></a> <font color=Cyan>++</font>indent <font color=Magenta>2</font> <font color=Cyan>(</font>concatMap showErr <font color=Cyan>(</font>reverse errs<font color=Cyan>)</font><font color=Cyan>)</font><font color=Cyan>)</font>
<a name="line-93"></a> accum errs <font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>P p<font color=Cyan>)</font><font color=Red><b>:</b></font>ps<font color=Cyan>)</font> <font color=Red>=</font>
<a name="line-94"></a> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> <font color=Green><u>case</u></font> p s ts <font color=Green><u>of</u></font>
<a name="line-95"></a> Failure <font color=Green><u>_</u></font> <font color=Green><u>_</u></font> err <font color=Red>-></font>
<a name="line-96"></a> <font color=Green><u>let</u></font> <font color=Cyan>(</font>P p<font color=Cyan>)</font> <font color=Red>=</font> accum <font color=Cyan>(</font><font color=Cyan>(</font>e<font color=Cyan>,</font>err<font color=Cyan>)</font><font color=Red><b>:</b></font>errs<font color=Cyan>)</font> ps
<a name="line-97"></a> <font color=Green><u>in</u></font> p s ts
<a name="line-98"></a> r<font color=Red>@</font><font color=Cyan>(</font>Success z <font color=Green><u>_</u></font> a<font color=Cyan>)</font> <font color=Red>-></font> r
<a name="line-99"></a> r<font color=Red>@</font><font color=Cyan>(</font>Committed <font color=Green><u>_</u></font><font color=Cyan>)</font> <font color=Red>-></font> r <font color=Cyan>)</font>
<a name="line-100"></a> showErr <font color=Cyan>(</font>name<font color=Cyan>,</font>err<font color=Cyan>)</font> <font color=Red>=</font> name<font color=Cyan>++</font><font color=Magenta>":\n"</font><font color=Cyan>++</font>indent <font color=Magenta>2</font> err
<a name="line-101"></a>
<a name="line-102"></a> <font color=Blue>-- Apply a parsed function to a parsed value. This version</font>
<a name="line-103"></a> <font color=Blue>-- is strict in the result of the function parser, but</font>
<a name="line-104"></a> <font color=Blue>-- lazy in the result of the argument parser. (Argument laziness is</font>
<a name="line-105"></a> <font color=Blue>-- the distinctive feature over other implementations.)</font>
<a name="line-106"></a> <font color=Cyan>(</font>P pf<font color=Cyan>)</font> <font color=Cyan>`apply`</font> px <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s<font color=Red>-></font> continue <font color=Cyan>.</font> pf s<font color=Cyan>)</font>
<a name="line-107"></a> <font color=Green><u>where</u></font>
<a name="line-108"></a> continue <font color=Cyan>(</font>Success z s f<font color=Cyan>)</font> <font color=Red>=</font> <font color=Green><u>let</u></font> <font color=Cyan>(</font>x<font color=Cyan>,</font>s'<font color=Cyan>,</font>z'<font color=Cyan>)</font> <font color=Red>=</font> runParser px s z
<a name="line-109"></a> <font color=Green><u>in</u></font> Success z' s' <font color=Cyan>(</font>f x<font color=Cyan>)</font>
<a name="line-110"></a> continue <font color=Cyan>(</font>Failure z s e<font color=Cyan>)</font> <font color=Red>=</font> Failure z s e
<a name="line-111"></a> continue <font color=Cyan>(</font>Committed r<font color=Cyan>)</font> <font color=Red>=</font> Committed <font color=Cyan>(</font>continue r<font color=Cyan>)</font>
<a name="line-112"></a>
<a name="line-113"></a><a name="manyFinally"></a><font color=Blue>manyFinally</font> <font color=Red>::</font> Parser s t a <font color=Red>-></font> Parser s t z <font color=Red>-></font> Parser s t <font color=Red>[</font>a<font color=Red>]</font>
<a name="line-114"></a><font color=Blue>{-
<a name="line-115"></a>manyFinally pp@(P p) pt@(P t) = P (\s ts -> item s ts (p s ts))
<a name="line-116"></a> where
<a name="line-117"></a> item _ _ (Success ts s x) = success ts s x
<a name="line-118"></a> item s ts (Failure _ _ e) = terminate (t s ts)
<a name="line-119"></a> item s ts (Committed r) = Committed (within r)
<a name="line-120"></a>
<a name="line-121"></a> success ts s x =
<a name="line-122"></a> let (tail,s',ts') = runParser (manyFinally pp pt) s ts
<a name="line-123"></a> in Success ts' s' (x:tail)
<a name="line-124"></a>
<a name="line-125"></a> terminate (Success ts s _) = Success ts s []
<a name="line-126"></a> terminate (Failure ts s e) = Failure ts s e
<a name="line-127"></a> terminate (Committed r) = Committed (terminate r)
<a name="line-128"></a>
<a name="line-129"></a> within (Success ts s x) = success ts s x
<a name="line-130"></a> within (Failure ts s e) = Failure ts s e
<a name="line-131"></a> within (Committed r) = within r
<a name="line-132"></a>-}</font>
<a name="line-133"></a>
<a name="line-134"></a><font color=Blue>manyFinally</font> p z <font color=Red>=</font>
<a name="line-135"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> x <font color=Red><-</font> p<font color=Cyan>;</font> return <font color=Cyan>(</font>x<font color=Red><b>:</b></font><font color=Cyan>)</font> <font color=Cyan>`apply`</font> manyFinally p z<font color=Cyan>)</font>
<a name="line-136"></a> <font color=Cyan>`onFail`</font>
<a name="line-137"></a> <font color=Cyan>(</font><font color=Green><u>do</u></font> z<font color=Cyan>;</font> return []<font color=Cyan>)</font>
<a name="line-138"></a> <font color=Cyan>`onFail`</font>
<a name="line-139"></a> oneOf' <font color=Red>[</font> <font color=Cyan>(</font><font color=Magenta>"item in sequence"</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> p<font color=Cyan>;</font> return []<font color=Cyan>)</font><font color=Cyan>)</font>
<a name="line-140"></a> <font color=Cyan>,</font> <font color=Cyan>(</font><font color=Magenta>"sequence terminator"</font><font color=Cyan>,</font> <font color=Cyan>(</font><font color=Green><u>do</u></font> z<font color=Cyan>;</font> return []<font color=Cyan>)</font><font color=Cyan>)</font> <font color=Red>]</font>
<a name="line-141"></a>
<a name="line-142"></a><a name="next"></a><font color=Blue>------------------------------------------------------------------------</font>
<a name="line-143"></a><font color=Blue>next</font> <font color=Red>::</font> Parser s t t
<a name="line-144"></a><font color=Blue>next</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> <font color=Green><u>case</u></font> ts <font color=Green><u>of</u></font>
<a name="line-145"></a> [] <font color=Red>-></font> Failure [] s <font color=Magenta>"Ran out of input (EOF)"</font>
<a name="line-146"></a> <font color=Cyan>(</font>t<font color=Red><b>:</b></font>ts'<font color=Cyan>)</font> <font color=Red>-></font> Success ts' s t <font color=Cyan>)</font>
<a name="line-147"></a>
<a name="line-148"></a><a name="eof"></a><font color=Blue>eof</font> <font color=Red>::</font> Parser s t ()
<a name="line-149"></a><font color=Blue>eof</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> <font color=Green><u>case</u></font> ts <font color=Green><u>of</u></font>
<a name="line-150"></a> [] <font color=Red>-></font> Success [] s ()
<a name="line-151"></a> <font color=Cyan>(</font>t<font color=Red><b>:</b></font>ts'<font color=Cyan>)</font> <font color=Red>-></font> Failure ts s <font color=Magenta>"Expected end of input (eof)"</font> <font color=Cyan>)</font>
<a name="line-152"></a>
<a name="line-153"></a><a name="satisfy"></a><font color=Blue>satisfy</font> <font color=Red>::</font> <font color=Cyan>(</font>t<font color=Red>-></font>Bool<font color=Cyan>)</font> <font color=Red>-></font> Parser s t t
<a name="line-154"></a><font color=Blue>satisfy</font> pred <font color=Red>=</font> <font color=Green><u>do</u></font> <font color=Cyan>{</font> x <font color=Red><-</font> next
<a name="line-155"></a> <font color=Cyan>;</font> <font color=Green><u>if</u></font> pred x <font color=Green><u>then</u></font> return x <font color=Green><u>else</u></font> fail <font color=Magenta>"Parse.satisfy: failed"</font>
<a name="line-156"></a> <font color=Cyan>}</font>
<a name="line-157"></a><font color=Blue>------------------------------------------------------------------------</font>
<a name="line-158"></a><font color=Blue>-- State handling</font>
<a name="line-159"></a>
<a name="line-160"></a><a name="stUpdate"></a><font color=Blue>-- | Update the internal state.</font>
<a name="line-161"></a><font color=Blue>stUpdate</font> <font color=Red>::</font> <font color=Cyan>(</font>s<font color=Red>-></font>s<font color=Cyan>)</font> <font color=Red>-></font> Parser s t ()
<a name="line-162"></a><font color=Blue>stUpdate</font> f <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> Success ts <font color=Cyan>(</font>f s<font color=Cyan>)</font> ()<font color=Cyan>)</font>
<a name="line-163"></a>
<a name="line-164"></a><a name="stQuery"></a><font color=Blue>-- | Query the internal state.</font>
<a name="line-165"></a><font color=Blue>stQuery</font> <font color=Red>::</font> <font color=Cyan>(</font>s<font color=Red>-></font>a<font color=Cyan>)</font> <font color=Red>-></font> Parser s t a
<a name="line-166"></a><font color=Blue>stQuery</font> f <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> Success ts s <font color=Cyan>(</font>f s<font color=Cyan>)</font><font color=Cyan>)</font>
<a name="line-167"></a>
<a name="line-168"></a><a name="stGet"></a><font color=Blue>-- | Deliver the entire internal state.</font>
<a name="line-169"></a><font color=Blue>stGet</font> <font color=Red>::</font> Parser s t s
<a name="line-170"></a><font color=Blue>stGet</font> <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s ts<font color=Red>-></font> Success ts s s<font color=Cyan>)</font>
<a name="line-171"></a>
<a name="line-172"></a><a name="reparse"></a><font color=Blue>------------------------------------------------------------------------</font>
<a name="line-173"></a><font color=Blue>-- | Push some tokens back onto the front of the input stream and reparse.</font>
<a name="line-174"></a><font color=Blue>-- This is useful e.g. for recursively expanding macros. When the</font>
<a name="line-175"></a><font color=Blue>-- user-parser recognises a macro use, it can lookup the macro</font>
<a name="line-176"></a><font color=Blue>-- expansion from the parse state, lex it, and then stuff the</font>
<a name="line-177"></a><font color=Blue>-- lexed expansion back down into the parser.</font>
<a name="line-178"></a><font color=Blue>reparse</font> <font color=Red>::</font> <font color=Red>[</font>t<font color=Red>]</font> <font color=Red>-></font> Parser s t ()
<a name="line-179"></a><font color=Blue>reparse</font> ts <font color=Red>=</font> P <font color=Cyan>(</font><font color=Red>\</font>s inp<font color=Red>-></font> Success <font color=Cyan>(</font>ts<font color=Cyan>++</font>inp<font color=Cyan>)</font> s ()<font color=Cyan>)</font>
<a name="line-180"></a>
<a name="line-181"></a><font color=Blue>------------------------------------------------------------------------</font>
</pre>
</html>