module DDC.Core.Parser.Base
( Parser
, pModuleName
, pQualName
, pName
, pWbCon, pWbConSP
, pCon, pConSP
, pLit, pLitSP
, pIndex, pIndexSP
, pVar, pVarSP
, pTok, pTokSP
, pTokAs, pTokAsSP
, pOpSP
, pOpVarSP)
where
import DDC.Base.Pretty
import DDC.Core.Module
import DDC.Core.Exp
import DDC.Core.Lexer.Tokens
import DDC.Base.Parser ((<?>), SourcePos)
import qualified DDC.Base.Parser as P
type Parser n a
= P.Parser (Tok n) a
pModuleName :: Pretty n => Parser n ModuleName
pModuleName = P.pTokMaybe f
where f (KN (KCon n)) = Just $ ModuleName [renderPlain $ ppr n]
f _ = Nothing
pQualName :: Pretty n => Parser n (QualName n)
pQualName
= do mn <- pModuleName
pTok KDot
n <- pName
return $ QualName mn n
pName :: Parser n n
pName = P.choice [pCon, pVar]
pWbCon :: Parser n WbCon
pWbCon = P.pTokMaybe f
where f (KA (KWbConBuiltin wb)) = Just wb
f _ = Nothing
pWbConSP :: Parser n (WbCon, SourcePos)
pWbConSP = P.pTokMaybeSP f
where f (KA (KWbConBuiltin wb)) = Just wb
f _ = Nothing
pCon :: Parser n n
pCon = P.pTokMaybe f
where f (KN (KCon n)) = Just n
f _ = Nothing
pConSP :: Parser n (n, SourcePos)
pConSP = P.pTokMaybeSP f
where f (KN (KCon n)) = Just n
f _ = Nothing
pLit :: Parser n n
pLit = P.pTokMaybe f
where f (KN (KLit n)) = Just n
f _ = Nothing
pLitSP :: Parser n (n, SourcePos)
pLitSP = P.pTokMaybeSP f
where f (KN (KLit n)) = Just n
f _ = Nothing
pVar :: Parser n n
pVar = P.pTokMaybe f
<?> "a variable"
where f (KN (KVar n)) = Just n
f _ = Nothing
pVarSP :: Parser n (n, SourcePos)
pVarSP = P.pTokMaybeSP f
<?> "a variable"
where f (KN (KVar n)) = Just n
f _ = Nothing
pIndex :: Parser n Int
pIndex = P.pTokMaybe f
<?> "an index"
where f (KA (KIndex i)) = Just i
f _ = Nothing
pIndexSP :: Parser n (Int, SourcePos)
pIndexSP = P.pTokMaybeSP f
<?> "an index"
where f (KA (KIndex i)) = Just i
f _ = Nothing
pOpSP :: Parser n (String, SourcePos)
pOpSP = P.pTokMaybeSP f
where f (KA (KOp str)) = Just str
f _ = Nothing
pOpVarSP :: Parser n (String, SourcePos)
pOpVarSP = P.pTokMaybeSP f
where f (KA (KOpVar str)) = Just str
f _ = Nothing
pTok :: TokAtom -> Parser n ()
pTok k = P.pTok (KA k)
pTokSP :: TokAtom -> Parser n SourcePos
pTokSP k = P.pTokSP (KA k)
pTokAs :: TokAtom -> a -> Parser n a
pTokAs k x = P.pTokAs (KA k) x
pTokAsSP :: TokAtom -> a -> Parser n (a, SourcePos)
pTokAsSP k x = P.pTokAsSP (KA k) x