module Compiler.Lexer.Operators where import Common import Control.Applicative import Parser import Test.Common data Operator = OpAnd | OpOr | OpLT -- Order here sets the operator precedence (bottom ones have higher) | OpGT | OpLTE | OpGTE | OpEquality | OpNotEquality | OpPlus | OpMinus | OpStar | OpDivide deriving (Show, Ord, Eq, Enum, Bounded) instance HasParser Operator where parser = parseFor OpPlus <|> parseFor OpStar <|> parseFor OpMinus <|> parseFor OpDivide <|> parseFor OpLTE <|> parseFor OpGTE <|> parseFor OpLT <|> parseFor OpGT <|> parseFor OpEquality <|> parseFor OpNotEquality <|> parseFor OpAnd <|> parseFor OpOr where parseFor :: Operator -> Parser Operator parseFor kw = parseAndReturn (toSource kw) kw instance ToSource Operator where toSource = \case OpPlus -> "+" OpStar -> "*" OpMinus -> "-" OpDivide -> "/" OpLT -> "<" OpGT -> ">" OpLTE -> "<=" OpGTE -> ">=" OpEquality -> "==" OpNotEquality -> "!==" OpAnd -> "and" OpOr -> "or" instance HasGen Operator where getGen = enum OpPlus OpOr