diff options
Diffstat (limited to 'src/Language/SimpleShell/Parser/Expr.hs')
-rw-r--r-- | src/Language/SimpleShell/Parser/Expr.hs | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/src/Language/SimpleShell/Parser/Expr.hs b/src/Language/SimpleShell/Parser/Expr.hs index 441e890..7687fb0 100644 --- a/src/Language/SimpleShell/Parser/Expr.hs +++ b/src/Language/SimpleShell/Parser/Expr.hs @@ -4,7 +4,7 @@ module Language.SimpleShell.Parser.Expr ( ExprParser - , runExprParser + , ExprContext(..) , exprP , strongTermP , strongTermP0_ @@ -14,7 +14,7 @@ where import Language.SimpleShell.AST.Expr (Expr(..), TypedExpr) import Language.SimpleShell.AST.Name (FunName, VarName) -import Language.SimpleShell.AST.SimpleType (SimpleType(..), Typed, FunSig) +import Language.SimpleShell.AST.SimpleType (SimpleType(..), FunSig) import Language.SimpleShell.Parser.Common.Lexeme ( lexeme , symbol @@ -31,14 +31,12 @@ import Control.Monad.Combinators.FailExpr import Control.Applicative ((<|>)) import Control.Monad (void) -import Control.Monad.Reader (ask, ReaderT, runReaderT) +import Control.Monad.Reader (ask, ReaderT) import Control.Monad.Combinators (manyTill) import Data.Foldable (asum) -import Data.List (nub) import Data.Map (Map) -import qualified Data.Map as Map (empty, lookup, fromList) +import qualified Data.Map as Map (lookup) import Data.Text (Text, unpack) -import Data.Tuple (swap) import Text.Megaparsec (MonadParsec, takeWhile1P, oneOf, many) import Text.Megaparsec.Char (char) import qualified Text.Megaparsec.Char.Lexer as L (charLiteral, decimal) @@ -49,21 +47,11 @@ type ExprParser = ReaderT ExprContext RootParser data ExprContext = ExprContext - { ctxVars :: Map VarName SimpleType - , ctxFuns :: Map FunName FunSig + { ctxFuns :: Map FunName FunSig + , ctxVars :: Map VarName SimpleType } -runExprParser :: [Typed VarName] -> ExprParser a -> RootParser a -runExprParser decls p = - if length (nub names) == length names -- TODO: inefficient - then runReaderT p (ExprContext vars Map.empty) - else fail "Duplicate variable name." - where - names = map snd decls - vars = Map.fromList $ map swap decls - - lookupVar :: VarName -> ExprParser SimpleType lookupVar varname = do mt <- Map.lookup varname . ctxVars <$> ask |