packages feed

noise-0.0.1: src/Text/Noise/Parser/AST.hs

module Text.Noise.Parser.AST
( SourceFile(..)
, QualifiedIdentifier(..)
, Identifier
, IdentifierPath
, OperatorFunction(..)
, Operator(..)
, Argument(..)
, Expression(..)
, Statement(..)
, Reserved(..)
, FunctionPrototype(..)
, ArgumentPrototype(..)
, Block(..)
) where

import Text.Noise.SourceRange (SourceRange, HasSourceRange(..))

data SourceFile = SourceFile [Statement] SourceRange deriving (Show, Eq)

data QualifiedIdentifier = QualifiedIdentifier IdentifierPath SourceRange deriving (Show, Eq)

type Identifier = String

data OperatorFunction = Add | Sub | Mul | Div deriving (Show, Eq)

type IdentifierPath = [Identifier]

data Reserved = Reserved String SourceRange deriving (Show, Eq)

data Statement = ExpressionStatement Expression
               | DefinitionStatement Reserved FunctionPrototype Expression SourceRange
               deriving (Show, Eq)

data FunctionPrototype = FunctionPrototype QualifiedIdentifier [ArgumentPrototype] SourceRange deriving (Show, Eq)

data ArgumentPrototype = RequiredArgumentPrototype Identifier SourceRange deriving (Show, Eq)

data Operator = Operator OperatorFunction SourceRange deriving (Show, Eq)

data Expression = FloatLiteral Double SourceRange
                | ColorLiteral String SourceRange
                | StringLiteral String SourceRange
                | FunctionCall QualifiedIdentifier [Argument] (Maybe Block) SourceRange
                | InfixOperation Operator Expression Expression
                | PrefixOperation Operator Expression
                deriving (Show, Eq)

data Argument = KeywordArgument Identifier Expression SourceRange
              | PositionalArgument Expression
              deriving (Show, Eq)

data Block = Block Reserved [Statement] Reserved SourceRange deriving (Show, Eq)

instance HasSourceRange SourceFile where
  rangeInSource (SourceFile _ r) = r

instance HasSourceRange QualifiedIdentifier where
  rangeInSource (QualifiedIdentifier _ r) = r

instance HasSourceRange Operator where
  rangeInSource (Operator _ r) = r

instance HasSourceRange Expression where
  rangeInSource (FloatLiteral _ r) = r
  rangeInSource (ColorLiteral _ r) = r
  rangeInSource (StringLiteral _ r) = r
  rangeInSource (FunctionCall _ _ _ r) = r
  rangeInSource (InfixOperation _ e0 e1) = (fst (rangeInSource e0), snd (rangeInSource e1))
  rangeInSource (PrefixOperation op expr) = (fst (rangeInSource op), snd (rangeInSource expr))

instance HasSourceRange Argument where
  rangeInSource (KeywordArgument _ _ r) = r
  rangeInSource (PositionalArgument expr) = rangeInSource expr

instance HasSourceRange Statement where
  rangeInSource (ExpressionStatement expression) = rangeInSource expression
  rangeInSource (DefinitionStatement _ _ _ r) = r

instance HasSourceRange FunctionPrototype where
  rangeInSource (FunctionPrototype _ _ r) = r

instance HasSourceRange ArgumentPrototype where
  rangeInSource (RequiredArgumentPrototype _ r) = r

instance HasSourceRange Reserved where
  rangeInSource (Reserved _ r) = r

instance HasSourceRange Block where
  rangeInSource (Block _ _ _ r) = r