| >  module RepMin where | 
| > | 
| >  data Tree a    =  Leaf a | Fork (Tree a) (Tree a) | 
| >                    deriving (Show) | 
| > | 
| >  data Terminal  =  Num Integer | LPar | RPar | 
| > | 
| >  %{ | 
| > | 
| >  Terminal      =  Num {Integer} | 
| >                |  LPar  as "(" | 
| >                |  RPar  as ")"; | 
| > | 
| >  Nonterminal   =  *  start  {Tree Integer} | 
| >                |     expr   {Integer -> (Tree Integer, 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" |