packages feed

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