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 40 41 42 43 44 45 46 47 48 49 50
|
{-
The Rep-Min problem: the example demonstrates how to simulate
inherited attributes using functional (synthesized) attributes.
frown -s RepMin.lg
Try
start [Num 47, LPar, Num 11, RPar]
-}
> module RepMin
> where
>
> data Tree = Leaf Integer
> | Fork Tree Tree
> deriving (Show)
>
> data Terminal = Num Integer
> | LPar
> | RPar
>
> type Result = Maybe
>
> %{
>
> Terminal = Num {Integer}
> | "(" = LPar
> | ")" = RPar;
>
> Nonterminal = *start {Tree}
> | expr {Integer -> (Tree, Integer)};
>
> start { let (t, m) = f m in t }
> : expr {f};
>
> expr { \ m -> (Leaf m, i) }
> : Num {i};
> expr { \ m -> let { (tl, ml) = l m
> ; (tr, mr) = r m }
> in (Fork tl tr, ml `min` mr) }
> : expr {l}, "(", expr {r}, ")";
>
>
> }%
>
> frown ts = fail "syntax error"
|