|
|
- module Frontend.Syntax where
-
- import Frontend.Parser.Posn
- import qualified Data.Text as T
- import Data.Text (Text)
-
- data FeExpr var
- = Ref var
- | Con var
- | App (FeExpr var) (FeExpr var)
- | Lam (FePat var) (FeExpr var)
- | Let [FeDecl var] (FeExpr var)
- | Tuple [FeExpr var]
- | Annot (FeExpr var) (FeType var)
-
- | Literal Literal
-
- | ParenExp (FeExpr var)
- | SPExpr (FeExpr var) Posn Posn
- deriving (Eq, Show, Ord)
-
- instance HasPosn (FeExpr var) where
- startPosn (SPExpr _ s _) = s
- startPosn _ = error "no start posn in parsed expression?"
-
- endPosn (SPExpr _ _ e) = e
- endPosn _ = error "no end posn in parsed expression?"
-
- span sp ep (SPExpr x _ _) = SPExpr x (startPosn sp) (endPosn ep)
- span sp ep x = SPExpr x (startPosn sp) (endPosn ep)
-
- data FePat var
- = Var var
- | Wildcard
-
- | TupPat [FePat var]
- | LitPat Literal
-
- | ParenPat (FePat var) -- parsed parentheses
- | SPPat (FePat var) Posn Posn
- deriving (Eq, Show, Ord)
-
- instance HasPosn (FePat var) where
- startPosn (SPPat _ s _) = s
- startPosn _ = error "no start posn in parsed expression?"
-
- endPosn (SPPat _ _ e) = e
- endPosn _ = error "no end posn in parsed pattern?"
-
- span sp ep (SPPat x _ _) = SPPat x (startPosn sp) (endPosn ep)
- span sp ep x = SPPat x (startPosn sp) (endPosn ep)
-
- data FeType var
- = Tyvar var
- | Tycon var
- | Tyapp (FeType var) (FeType var)
- | Tyarr (FeType var) (FeType var)
- | Tytup [FeType var]
-
- | ParenType (FeType var) -- parsed parentheses
- | SPType (FeType var) Posn Posn
- deriving (Eq, Show, Ord)
-
- instance HasPosn (FeType var) where
- startPosn (SPType _ s _) = s
- startPosn _ = error "no start posn in parsed type?"
-
- endPosn (SPType _ _ e) = e
- endPosn _ = error "no end posn in parsed type?"
-
- span sp ep (SPType x _ _) = SPType x (startPosn sp) (endPosn ep)
- span sp ep x = SPType x (startPosn sp) (endPosn ep)
-
- data FeDecl var
- = PatDecl { pdPat :: FePat var, declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
- | FunDecl { fdVar :: var, fdArgs :: [FePat var], declRhs :: FeRhs var, declBegin :: Posn, declEnd :: Posn }
- | TySig { tsVars :: [var], tsType :: FeType var, declBegin :: Posn, declEnd :: Posn }
- deriving (Eq, Show, Ord)
-
- instance HasPosn (FeDecl var) where
- startPosn = declBegin
- endPosn = declEnd
-
- span sp ep s = s { declBegin = startPosn sp, declEnd = endPosn ep }
-
- data FeRhs var
- = BareRhs { bareRhs :: FeExpr var, rhsWhere :: [FeDecl var], rhsBegin :: Posn, rhsEnd :: Posn }
- deriving (Eq, Show, Ord)
-
- instance HasPosn (FeRhs var) where
- startPosn = rhsBegin
- endPosn = rhsEnd
-
- span sp ep s = s { rhsBegin = startPosn sp, rhsEnd = endPosn ep }
-
- data Literal
- = LitString T.Text
- | LitNumber Integer
- deriving (Eq, Show, Ord)
-
- data FeModule var
- = Module { moduleName :: var
- , moduleExports :: Maybe [NamespacedItem var]
- , moduleImports :: [ModuleImport var]
- , moduleItems :: [ModuleItem var]
- }
- deriving (Eq, Show, Ord)
-
- data ModuleImport var
- = Import { importMod :: var
- , importList :: Maybe [NamespacedItem var]
- , importQualified :: Bool
- , importAlias :: Maybe var
- , importBegin :: Posn
- , importEnd :: Posn
- }
- deriving (Eq, Show, Ord)
-
- instance HasPosn (ModuleImport var) where
- startPosn = importBegin
- endPosn = importEnd
-
- span sp ep s = s { importBegin = startPosn sp, importEnd = endPosn ep }
-
- data NamespacedItem var
- = IEVar var
- | IECon var
- | IEModule var
- deriving (Eq, Show, Ord)
-
- data ModuleItem var
- = ModDecl { itemDecl :: FeDecl var, itemBegin :: Posn, itemEnd :: Posn }
- | ModImport { itemImport :: ModuleImport var, itemBegin :: Posn, itemEnd :: Posn }
- deriving (Eq, Show, Ord)
-
- data ParsedVar
- = UnqualVar
- { varId :: Text
- , varBegin :: Posn
- , varEnd :: Posn
- }
- | QualVar
- { varId :: Text
- , varPrefix :: Text
- , varBegin :: Posn
- , varEnd :: Posn
- }
- | ModId
- { varId :: Text
- , varBegin :: Posn
- , varEnd :: Posn
- }
- deriving (Eq, Show, Ord)
-
- toModId :: ParsedVar -> ParsedVar
- toModId x@ModId{} = x
- toModId (UnqualVar x y z) = ModId x y z
- toModId (QualVar id pref b e) = ModId (pref <> T.singleton '.' <> id) b e
-
- instance HasPosn ParsedVar where
- startPosn = varBegin
- endPosn = varEnd
-
- span sp ep s = s { varBegin = startPosn sp, varEnd = endPosn ep }
-
- instance HasPosn (ModuleItem var) where
- startPosn = itemBegin
- endPosn = itemEnd
-
- span sp ep s = s { itemBegin = startPosn sp, itemEnd = endPosn ep }
|