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