1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
{-
This example illustrates the use of guards.
frown Markup.lg
Try
doc "aaa<ccc<>ddd<fff<iii>ggg<hhh>>eee>bbb" :: Maybe Doc
-}
> module Markup
> where
>
> type Doc = [Elem]
> data Elem = Text Char | Markup Doc
> deriving (Show)
>
> type Terminal = Char
>
> type Result = Maybe
>
> %{
>
> Terminal = '<'
> | '>'
> | guard {\ c -> c /= '<' && c /= '>'} as "char";
>
> doc {Doc};
> doc {d} : many elem {d};
>
> elem {Elem};
> elem {Text c} : "char" {c};
> {Markup d} | '<', doc {d}, '>';
>
> }%
>
> frown ts = fail "syntax error"
|