data Operator a = Operator
{ precedence :: Int
, semantics :: a -> a -> a }
operator_precedence_parser
:: Map String ( Operator a )
-> Parser Char a -> Parser Char a
arithmetic :: Parser Char Integer
arithmetic = operator_precedence_parser ( M.fromList
[ ( "+", Operator { precedence = 1
, semantics = (+) } )
, ( "*", Operator { precedence = 2
, semantics = (*) }
] )
( zahl <|> parens arithmetic )