diff options
Diffstat (limited to 'src/Language')
-rw-r--r-- | src/Language/SimpleShell/AST/Module.hs | 2 | ||||
-rw-r--r-- | src/Language/SimpleShell/Parser/Module.hs | 35 |
2 files changed, 28 insertions, 9 deletions
diff --git a/src/Language/SimpleShell/AST/Module.hs b/src/Language/SimpleShell/AST/Module.hs index 5503514..9eb87cf 100644 --- a/src/Language/SimpleShell/AST/Module.hs +++ b/src/Language/SimpleShell/AST/Module.hs @@ -9,7 +9,9 @@ import Language.SimpleShell.AST.Procedure (Procedure) newtype Module = Module [ModuleElement] + deriving (Show) data ModuleElement = FunctionElement Function | ProcedureElement Procedure + deriving (Show) 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 |