diff --git a/src/Lib.hs b/src/Lib.hs index f081467..e4ecfed 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -34,7 +34,7 @@ import Data.Functor.Identity data Expression = Constant Bool | Binary BinaryOperator Expression Expression | Unary UnaryOperator Expression | Variable String deriving Show -data BinaryOperator = LogicalAnd | LogicalOr +data BinaryOperator = LogicalAnd | LogicalOr | LogicalEquality deriving Show data UnaryOperator = LogicalNot deriving Show @@ -44,9 +44,9 @@ def = emptyDef{ commentStart = "" , commentEnd = "" , identStart = letter <|> char '_' , identLetter = alphaNum <|> char '_' - , opStart = oneOf "&|~" - , opLetter = oneOf "&|~" - , reservedOpNames = ["&", "|", "~"] + , opStart = oneOf "&|~=" + , opLetter = oneOf "&|~=" + , reservedOpNames = ["&", "|", "~", "="] , reservedNames = ["true", "false"] } @@ -61,6 +61,9 @@ exprparser = buildExpressionParser table term "expression" table :: [[Operator String u Identity Expression]] table = [ + [ + Infix (m_reservedOp "=" >> return (Binary LogicalEquality)) AssocLeft + ], [ Prefix (m_reservedOp "~" >> return (Unary LogicalNot)) ], @@ -89,8 +92,9 @@ collectVariableNames (Unary _ right) = collectVariableNames right collectVariableNames (Variable name) = Set.singleton name evaluate :: Map String Bool -> Expression -> Bool -evaluate _ (Constant b) = b -evaluate vs (Unary LogicalNot e) = not (evaluate vs e) -evaluate vs (Binary LogicalAnd l r) = evaluate vs l && evaluate vs r -evaluate vs (Binary LogicalOr l r) = evaluate vs l || evaluate vs r -evaluate vs (Variable name) = maybe False id (Map.lookup name vs) +evaluate _ (Constant b) = b +evaluate vs (Unary LogicalNot e) = not (evaluate vs e) +evaluate vs (Binary LogicalAnd l r) = evaluate vs l && evaluate vs r +evaluate vs (Binary LogicalOr l r) = evaluate vs l || evaluate vs r +evaluate vs (Binary LogicalEquality l r) = evaluate vs l == evaluate vs r +evaluate vs (Variable name) = maybe False id (Map.lookup name vs)