> 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"