aboutsummaryrefslogtreecommitdiff
path: root/src/Language/SimpleShell/Parser.hs
diff options
context:
space:
mode:
authorEinhard Leichtfuß <alguien@respiranto.de>2025-05-19 01:57:15 +0200
committerEinhard Leichtfuß <alguien@respiranto.de>2025-05-19 01:57:15 +0200
commit96b767d7cab6c8ca41f656e41dd57196cb45e233 (patch)
tree4d551007ae81f52a9430298867664649b66f59fc /src/Language/SimpleShell/Parser.hs
parent3b8dda1e8dc86cd584ee8cba0435abb6bca4301d (diff)
Expression AST and parser
Deleted old AST.hs; old code shall re-appear.
Diffstat (limited to 'src/Language/SimpleShell/Parser.hs')
-rw-r--r--src/Language/SimpleShell/Parser.hs52
1 files changed, 52 insertions, 0 deletions
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)