aboutsummaryrefslogtreecommitdiff
path: root/src/Language/SimpleShell/Parser/Module.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/SimpleShell/Parser/Module.hs')
-rw-r--r--src/Language/SimpleShell/Parser/Module.hs35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/Language/SimpleShell/Parser/Module.hs b/src/Language/SimpleShell/Parser/Module.hs
index a20ee7a..8918f86 100644
--- a/src/Language/SimpleShell/Parser/Module.hs
+++ b/src/Language/SimpleShell/Parser/Module.hs
@@ -5,19 +5,23 @@ module Language.SimpleShell.Parser.Module
where
-import Language.SimpleShell.AST.Module (Module)
+import Language.SimpleShell.AST.Module (Module(..), ModuleElement(..))
import Language.SimpleShell.AST.Name (FunName, ProcedureName)
import Language.SimpleShell.AST.SimpleType (FunSig, ProcedureSig)
import Language.SimpleShell.Parser.Common.Root (RootParser)
+import Language.SimpleShell.Parser.Function (functionP0, functionP)
-import Control.Monad.Reader (ReaderT, runReaderT)
-import Control.Monad.State (StateT, execStateT)
+import Control.Monad (void)
+import Control.Monad.Reader (ReaderT, runReaderT, withReaderT)
+import Control.Monad.State (StateT, execStateT, gets, modify)
+import Control.Monad.Trans.Class (lift)
import Data.Map (Map)
-import qualified Data.Map as Map (empty)
+import qualified Data.Map as Map (empty, lookup, insert)
+import Data.Text (unpack)
+import Text.Megaparsec (many)
type ModuleParser0 = StateT ModuleContext RootParser
-
type ModuleParser = ReaderT ModuleContext RootParser
moduleP0 :: RootParser ModuleContext
@@ -29,16 +33,29 @@ modulePF = runReaderT moduleMP
data ModuleContext
= ModuleContext
- (Map FunName FunSig)
- (Map ProcedureName ProcedureSig)
+ { ctxFuns :: Map FunName FunSig
+ , ctxProcedures :: Map ProcedureName ProcedureSig
+ }
+ deriving (Show)
initModuleContext :: ModuleContext
initModuleContext = ModuleContext Map.empty Map.empty
+addFun :: FunName -> FunSig -> ModuleParser0 ()
+addFun fname sig = do
+ funs <- gets ctxFuns
+ case Map.lookup fname funs of
+ Just _ -> fail $ "Function `" ++ unpack fname ++ "` already defined."
+ Nothing -> modify (\ctx -> ctx { ctxFuns = Map.insert fname sig funs })
+
+
moduleMP0 :: ModuleParser0 ()
-moduleMP0 = undefined
+moduleMP0 = void $ many (lift functionP0 >>= uncurry addFun)
moduleMP :: ModuleParser Module
-moduleMP = undefined
+moduleMP = Module <$> many elementP
+ where
+ elementP :: ModuleParser ModuleElement
+ elementP = FunctionElement <$> withReaderT ctxFuns functionP