GroteTrap

From HaskellWiki

GroteTrap allows you to quickly define expression languages. It is available for download on Hackage.

Example: Logic[edit]

data Logic
  = Var String
  | Or [Logic]
  | And [Logic]
  | Impl Logic Logic
  | Not Logic
  deriving (Show, Eq)

logicLanguage :: Language Logic
logicLanguage = language
  { variable  = Var
  , operators =
      [ Unary    Not  Prefix  0 "!"
      , Assoc    And          1 "&&"
      , Assoc    Or           2 "||"
      , Binary   Impl InfixR  3 "->"
      ]
  }

With this, we can do:

> readExpression logicLanguage "p && q -> r"
Impl (And [Var "p",Var "q"]) (Var "r")

Example: Arithmetic[edit]

arith :: Language Int
arith = language
  { number    = id
  , operators =
      [ Assoc   sum             2 "+"
      , Binary  (-)     InfixL  2 "-"
      , Assoc   product         1 "*"
      , Binary  div     InfixL  1 "/"
      , Binary  (^)     InfixL  0 "^"
      ]
  , functions = [ function1 abs "abs" ]
  }

evalArith :: String -> Int
evalArith = readExpression arith

> evalArith "abs(2 - 3) + abs(4 - 5)"
2