spade-0.1.0.10: src/Compiler/Lexer/Operators.hs
module Compiler.Lexer.Operators where
import Common
import Parser
import Test.Common
import GHC.Generics
import Control.DeepSeq
import Control.Applicative
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, Generic, Ord, Eq, Enum, Bounded)
instance NFData Operator
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