packages feed

spade-0.1.0.0: src/Compiler/Lexer/Delimeters.hs

module Compiler.Lexer.Delimeters where

import Common
import Control.Applicative
import Parser
import Test.Common

data Delimeter
  = DlColon
  | DlComma
  | DlPeriod
  | DlParenOpen
  | DlParenClose
  | DlSquareParenOpen
  | DlSquareParenClose
  | DlBraceParenOpen
  | DlBraceParenClose
  deriving (Show, Lift, Eq, Enum)

instance HasParser Delimeter where
  parser
    = parseFor DlColon
    <|> parseFor DlPeriod
    <|> parseFor DlParenOpen
    <|> parseFor DlParenClose
    <|> parseFor DlSquareParenOpen
    <|> parseFor DlSquareParenClose
    <|> parseFor DlBraceParenOpen
    <|> parseFor DlBraceParenClose
    <|> parseFor DlComma
    where
      parseFor :: Delimeter -> Parser Delimeter
      parseFor kw = parseAndReturn (toSource kw) kw

instance ToSource Delimeter where
  toSource = \case
    DlColon            -> ":"
    DlPeriod           -> "."
    DlParenOpen        -> "("
    DlParenClose       -> ")"
    DlSquareParenOpen  -> "["
    DlSquareParenClose -> "]"
    DlBraceParenOpen   -> "{"
    DlBraceParenClose  -> "}"
    DlComma            -> ","

instance HasGen Delimeter where
  getGen = enum DlColon DlBraceParenClose