packages feed

ddc-source-tetra-0.4.3.1: DDC/Source/Tetra/Parser/Base.hs

{-# LANGUAGE ExplicitNamespaces #-}
module DDC.Source.Tetra.Parser.Base
        ( type Parser
        , (<?>), SourcePos(..)

          -- * Generic Token parsers
        , pSym, pKey
        , pTok, pTokSP

          -- * Term Variables
        , pBindNameSP
        , pBoundName,           pBoundNameSP
        , pBoundIxSP
        , pBoundNameOpVarSP
        , pBoundNameOpSP

          -- * TyCons
        , pTyConBindName,       pTyConBindNameSP

          -- * DaCons
        , pDaConBindName
        , pDaConBoundName,      pDaConBoundNameSP
        , pDaConBoundLit,       pDaConBoundLitSP

          -- * Primitive Operators
        , pPrimValSP)
where
import DDC.Source.Tetra.Exp.Bind        hiding (Name)
import DDC.Source.Tetra.Prim
import DDC.Source.Tetra.Lexer
import DDC.Core.Lexer.Tokens
import DDC.Control.Parser               ((<?>))
import DDC.Control.Parser               (SourcePos(..))
import qualified DDC.Control.Parser     as P
import qualified Data.Text              as Text


import DDC.Core.Parser
        ( pSym, pKey
        , pTok, pTokSP
        , pIndexSP)

type Parser a
        = P.Parser (Token Name) a


-- Type and Term Variables ----------------------------------------------------
-- | Parse a binding occurrence of a named variable.
pBindNameSP  :: Parser (Bind, SourcePos)
pBindNameSP = P.pTokMaybeSP f <?> "a variable"
 where  f (KN (KVar (NameVar s)))       = Just (BName s)
        f _                             = Nothing


-- | Parse a named term variable.
pBoundName :: Parser Bound
pBoundName = P.pTokMaybe f <?> "a variable"
 where  f (KN (KVar (NameVar s)))       = Just (UName s)
        f _                             = Nothing


-- | Parse a named term variable.
pBoundNameSP :: Parser (Bound, SourcePos)
pBoundNameSP = P.pTokMaybeSP f <?> "a variable"
 where  f (KN (KVar (NameVar s)))       = Just (UName s)
        f _                             = Nothing


-- | Parse an indexed term variable.
pBoundIxSP   :: Parser (Bound, SourcePos)
pBoundIxSP 
 = do   (i, sp) <- pIndexSP
        return  $ (UIx i, sp)


-- | Parse an infix operator used as a variable.
pBoundNameOpSP :: Parser (Bound, SourcePos)
pBoundNameOpSP = P.pTokMaybeSP f
 where  f (KA (KOp s))                  = Just (UName (Text.pack s))
        f _                             = Nothing


-- | Parse an infix operator used as a variable.
pBoundNameOpVarSP :: Parser (Bound, SourcePos)
pBoundNameOpVarSP = P.pTokMaybeSP f
 where  f (KA (KOpVar s))               = Just (UName (Text.pack s))
        f _                             = Nothing


-- TyCons ---------------------------------------------------------------------
-- | Parse a binding occurrences of a type constructor name.
pTyConBindName :: Parser TyConBind
pTyConBindName = P.pTokMaybe f
 where  f (KN (KCon (NameCon n)))       = Just (TyConBindName n)
        f _                             = Nothing


-- | Parse a binding occurrences of a type constructor name.
pTyConBindNameSP :: Parser (TyConBind, SourcePos)
pTyConBindNameSP = P.pTokMaybeSP f
 where  f (KN (KCon (NameCon n)))       = Just (TyConBindName n)
        f _                             = Nothing



-- DaCons ---------------------------------------------------------------------
-- | Parse a binding occurrence of a data constructor name.
pDaConBindName :: Parser DaConBind
pDaConBindName = P.pTokMaybe f
 where  f (KN (KCon (NameCon n)))       = Just (DaConBindName n)
        f _                             = Nothing


-- | Parse a bound occurrence of a data constructor name.
pDaConBoundName :: Parser DaConBound
pDaConBoundName = P.pTokMaybe f
 where  f (KN (KCon (NameCon n)))       = Just (DaConBoundName n)
        f _                             = Nothing


-- | Parse a constructor name.
pDaConBoundNameSP :: Parser (DaConBound, SourcePos)
pDaConBoundNameSP = P.pTokMaybeSP f
 where  f (KN (KCon (NameCon n)))       = Just (DaConBoundName n)
        f _                             = Nothing


-- | Parse a literal.
--    These are numeric literals, string literals, 
--    and special constructors like 'True' and 'False'.
pDaConBoundLit :: Parser DaConBound
pDaConBoundLit = P.pTokMaybe f
 where  f (KA (KLiteral lit False))      = Just (DaConBoundLit (primLitOfLiteral lit))
        f (KN (KCon (NamePrimValLit n))) = Just (DaConBoundLit n)
        f _                              = Nothing


-- | Parse a literal, with source position.
--    These are numeric literals, string literals, 
--    and special constructors like 'True' and 'False'.
pDaConBoundLitSP :: Parser (DaConBound, SourcePos)
pDaConBoundLitSP = P.pTokMaybeSP f
 where  f (KA (KLiteral lit False))      = Just (DaConBoundLit (primLitOfLiteral lit))
        f (KN (KCon (NamePrimValLit n))) = Just (DaConBoundLit n)
        f _                              = Nothing


-- Primitive Values -----------------------------------------------------------
pPrimValSP :: Parser (PrimVal, SourcePos)
pPrimValSP =  P.pTokMaybeSP f <?> "a primitive operator"
 where  f (KN (KVar (NamePrimValOp p))) = Just p
        f _                             = Nothing