From 96b767d7cab6c8ca41f656e41dd57196cb45e233 Mon Sep 17 00:00:00 2001 From: Einhard Leichtfuß Date: Mon, 19 May 2025 01:57:15 +0200 Subject: Expression AST and parser Deleted old AST.hs; old code shall re-appear. --- src/Language/SimpleShell/Parser.hs | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/Language/SimpleShell/Parser.hs (limited to 'src/Language/SimpleShell/Parser.hs') diff --git a/src/Language/SimpleShell/Parser.hs b/src/Language/SimpleShell/Parser.hs new file mode 100644 index 0000000..be78beb --- /dev/null +++ b/src/Language/SimpleShell/Parser.hs @@ -0,0 +1,52 @@ +module Language.SimpleShell.Parser + ( Parser + , lookupVar + , lookupFun + , initContext + , parseTest' + ) +where + + +import Language.SimpleShell.AST.Expr (FunName, VarName) +import Language.SimpleShell.AST.SimpleType (SimpleType, FunSig) + +import Control.Monad.Reader (ask, ReaderT, runReaderT) +import Data.Map (Map) +import qualified Data.Map as Map (empty, lookup) +import Data.Text (Text, unpack) +import Data.Void (Void) +import Text.Megaparsec + + +type Parser = ReaderT Context (Parsec Void Text) + +data Context = Context + { ctxVars :: Map VarName SimpleType + , ctxFuns :: Map FunName FunSig + } + +initContext :: Context +initContext = Context + { ctxVars = Map.empty + , ctxFuns = Map.empty + } + + +lookupVar :: VarName -> Parser SimpleType +lookupVar varname = do + mt <- Map.lookup varname . ctxVars <$> ask + case mt of + Just t -> return t + Nothing -> fail $ "Undeclared variable $" ++ unpack varname + +lookupFun :: FunName -> Parser FunSig +lookupFun fname = do + msig <- Map.lookup fname . ctxFuns <$> ask + case msig of + Just sig -> return sig + Nothing -> fail $ "Undefined function " ++ unpack fname + + +parseTest' :: Show a => Parser a -> Text -> IO () +parseTest' p = parseTest (runReaderT p initContext) -- cgit v1.2.3