module Curry.Syntax.Type
(
Module (..)
, ModulePragma (..), Extension (..), KnownExtension (..), Tool (..)
, ExportSpec (..), Export (..)
, ImportDecl (..), ImportSpec (..), Import (..), Qualified
, Interface (..), IImportDecl (..), Arity, IDecl (..)
, Decl (..), Precedence, Infix (..), ConstrDecl (..), NewConstrDecl (..)
, FieldDecl (..)
, CallConv (..), TypeExpr (..)
, Equation (..), Lhs (..), Rhs (..), CondExpr (..)
, Literal (..), Pattern (..), Expression (..), InfixOp (..)
, Statement (..), CaseType (..), Alt (..), Field (..)
, Goal (..)
) where
import Data.Generics (Data, Typeable)
import Curry.Base.Ident
import Curry.Base.Position
import Curry.Syntax.Extension
data Module = Module [ModulePragma] ModuleIdent (Maybe ExportSpec)
[ImportDecl] [Decl]
deriving (Eq, Read, Show, Data, Typeable)
data ModulePragma
= LanguagePragma Position [Extension]
| OptionsPragma Position (Maybe Tool) String
deriving (Eq, Read, Show, Data, Typeable)
data ExportSpec = Exporting Position [Export]
deriving (Eq, Read, Show, Data, Typeable)
data Export
= Export QualIdent
| ExportTypeWith QualIdent [Ident]
| ExportTypeAll QualIdent
| ExportModule ModuleIdent
deriving (Eq, Read, Show, Data, Typeable)
data ImportDecl = ImportDecl Position ModuleIdent Qualified
(Maybe ModuleIdent) (Maybe ImportSpec)
deriving (Eq, Read, Show, Data, Typeable)
type Qualified = Bool
data ImportSpec
= Importing Position [Import]
| Hiding Position [Import]
deriving (Eq, Read, Show, Data, Typeable)
data Import
= Import Ident
| ImportTypeWith Ident [Ident]
| ImportTypeAll Ident
deriving (Eq, Read, Show, Data, Typeable)
data Interface = Interface ModuleIdent [IImportDecl] [IDecl]
deriving (Eq, Read, Show, Data, Typeable)
data IImportDecl = IImportDecl Position ModuleIdent
deriving (Eq, Read, Show, Data, Typeable)
type Arity = Int
data IDecl
= IInfixDecl Position Infix Precedence QualIdent
| HidingDataDecl Position QualIdent [Ident]
| IDataDecl Position QualIdent [Ident] [ConstrDecl] [Ident]
| INewtypeDecl Position QualIdent [Ident] NewConstrDecl [Ident]
| ITypeDecl Position QualIdent [Ident] TypeExpr
| IFunctionDecl Position QualIdent Arity TypeExpr
deriving (Eq, Read, Show, Data, Typeable)
data Decl
= InfixDecl Position Infix (Maybe Precedence) [Ident]
| DataDecl Position Ident [Ident] [ConstrDecl]
| NewtypeDecl Position Ident [Ident] NewConstrDecl
| TypeDecl Position Ident [Ident] TypeExpr
| TypeSig Position [Ident] TypeExpr
| FunctionDecl Position Ident [Equation]
| ForeignDecl Position CallConv (Maybe String) Ident TypeExpr
| ExternalDecl Position [Ident]
| PatternDecl Position Pattern Rhs
| FreeDecl Position [Ident]
deriving (Eq, Read, Show, Data, Typeable)
type Precedence = Integer
data Infix
= InfixL
| InfixR
| Infix
deriving (Eq, Read, Show, Data, Typeable)
data ConstrDecl
= ConstrDecl Position [Ident] Ident [TypeExpr]
| ConOpDecl Position [Ident] TypeExpr Ident TypeExpr
| RecordDecl Position [Ident] Ident [FieldDecl]
deriving (Eq, Read, Show, Data, Typeable)
data NewConstrDecl
= NewConstrDecl Position [Ident] Ident TypeExpr
| NewRecordDecl Position [Ident] Ident (Ident, TypeExpr)
deriving (Eq, Read, Show, Data, Typeable)
data FieldDecl = FieldDecl Position [Ident] TypeExpr
deriving (Eq, Read, Show, Data, Typeable)
data CallConv
= CallConvPrimitive
| CallConvCCall
deriving (Eq, Read, Show, Data, Typeable)
data TypeExpr
= ConstructorType QualIdent [TypeExpr]
| VariableType Ident
| TupleType [TypeExpr]
| ListType TypeExpr
| ArrowType TypeExpr TypeExpr
| ParenType TypeExpr
deriving (Eq, Read, Show, Data, Typeable)
data Equation = Equation Position Lhs Rhs
deriving (Eq, Read, Show, Data, Typeable)
data Lhs
= FunLhs Ident [Pattern]
| OpLhs Pattern Ident Pattern
| ApLhs Lhs [Pattern]
deriving (Eq, Read, Show, Data, Typeable)
data Rhs
= SimpleRhs Position Expression [Decl]
| GuardedRhs [CondExpr] [Decl]
deriving (Eq, Read, Show, Data, Typeable)
data CondExpr = CondExpr Position Expression Expression
deriving (Eq, Read, Show, Data, Typeable)
data Literal
= Char SrcRef Char
| Int Ident Integer
| Float SrcRef Double
| String SrcRef String
deriving (Eq, Read, Show, Data, Typeable)
data Pattern
= LiteralPattern Literal
| NegativePattern Ident Literal
| VariablePattern Ident
| ConstructorPattern QualIdent [Pattern]
| InfixPattern Pattern QualIdent Pattern
| ParenPattern Pattern
| RecordPattern QualIdent [Field Pattern]
| TuplePattern SrcRef [Pattern]
| ListPattern [SrcRef] [Pattern]
| AsPattern Ident Pattern
| LazyPattern SrcRef Pattern
| FunctionPattern QualIdent [Pattern]
| InfixFuncPattern Pattern QualIdent Pattern
deriving (Eq, Read, Show, Data, Typeable)
data Expression
= Literal Literal
| Variable QualIdent
| Constructor QualIdent
| Paren Expression
| Typed Expression TypeExpr
| Record QualIdent [Field Expression]
| RecordUpdate Expression [Field Expression]
| Tuple SrcRef [Expression]
| List [SrcRef] [Expression]
| ListCompr SrcRef Expression [Statement]
| EnumFrom Expression
| EnumFromThen Expression Expression
| EnumFromTo Expression Expression
| EnumFromThenTo Expression Expression Expression
| UnaryMinus Ident Expression
| Apply Expression Expression
| InfixApply Expression InfixOp Expression
| LeftSection Expression InfixOp
| RightSection InfixOp Expression
| Lambda SrcRef [Pattern] Expression
| Let [Decl] Expression
| Do [Statement] Expression
| IfThenElse SrcRef Expression Expression Expression
| Case SrcRef CaseType Expression [Alt]
deriving (Eq, Read, Show, Data, Typeable)
data InfixOp
= InfixOp QualIdent
| InfixConstr QualIdent
deriving (Eq, Read, Show, Data, Typeable)
data Statement
= StmtExpr SrcRef Expression
| StmtDecl [Decl]
| StmtBind SrcRef Pattern Expression
deriving (Eq, Read, Show, Data, Typeable)
data CaseType
= Rigid
| Flex
deriving (Eq, Read, Show, Data, Typeable)
data Alt = Alt Position Pattern Rhs
deriving (Eq, Read, Show, Data, Typeable)
data Field a = Field Position QualIdent a
deriving (Eq, Read, Show, Data, Typeable)
data Goal = Goal Position Expression [Decl]
deriving (Eq, Read, Show, Data, Typeable)
instance SrcRefOf Pattern where
srcRefOf (LiteralPattern l) = srcRefOf l
srcRefOf (NegativePattern i _) = srcRefOf i
srcRefOf (VariablePattern i) = srcRefOf i
srcRefOf (ConstructorPattern i _) = srcRefOf i
srcRefOf (InfixPattern _ i _) = srcRefOf i
srcRefOf (ParenPattern c) = srcRefOf c
srcRefOf (TuplePattern s _) = s
srcRefOf (ListPattern _ _)
= error "list pattern has several source refs"
srcRefOf (AsPattern i _) = srcRefOf i
srcRefOf (LazyPattern s _) = s
srcRefOf (FunctionPattern i _) = srcRefOf i
srcRefOf (InfixFuncPattern _ i _) = srcRefOf i
srcRefOf (RecordPattern i _) = srcRefOf i
instance SrcRefOf Literal where
srcRefOf (Char s _) = s
srcRefOf (Int i _) = srcRefOf i
srcRefOf (Float s _) = s
srcRefOf (String s _) = s