aboutsummaryrefslogtreecommitdiff
path: root/src/Language
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language')
-rw-r--r--src/Language/SimpleShell/Parser/Expr.hs26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/Language/SimpleShell/Parser/Expr.hs b/src/Language/SimpleShell/Parser/Expr.hs
index d0bd01a..57b1d22 100644
--- a/src/Language/SimpleShell/Parser/Expr.hs
+++ b/src/Language/SimpleShell/Parser/Expr.hs
@@ -28,22 +28,26 @@ import qualified Text.Megaparsec.Char.Lexer as L (charLiteral, decimal)
exprP :: Parser TypedExpr
exprP
- = makeExprParser termP binaryOperatorTable
+ = makeExprParser weakTermP binaryOperatorTable
+
+weakTermP :: Parser TypedExpr
+weakTermP
+ = strongTermP
+ <|> unaryOpP
<|> builtinUnaryFunP
<|> funP
-termP :: Parser TypedExpr
-termP
+strongTermP :: Parser TypedExpr
+strongTermP
= literalP
<|> varP
- <|> unaryOpP
<|> lexeme (char '(') *> exprP <* lexeme (char ')')
--- | Parse expression with fixed type.
-exprP' :: String -> SimpleType -> Parser Expr
-exprP' errMsg t = do
- (t', e) <- exprP
+-- | Parse "strong" term with fixed type.
+strongTermP' :: String -> SimpleType -> Parser Expr
+strongTermP' errMsg t = do
+ (t', e) <- strongTermP
if t == t'
then return e
else fail errMsg
@@ -71,7 +75,7 @@ funP :: Parser TypedExpr
funP = do
fname <- lexeme funNameP
(t', ts) <- lookupFun fname
- args <- mapM (exprP' "Type mismatch with function signature.") ts
+ args <- mapM (strongTermP' "Type mismatch with function signature.") ts
return (t', FunCall fname args)
@@ -169,8 +173,8 @@ unaryOperators, builtinUnaryFuns :: [UnaryParser]
unaryOpP, builtinUnaryFunP :: Parser TypedExpr
(unaryOpP, builtinUnaryFunP) =
- ( asum $ map (aux "unary operator" termP) unaryOperators
- , asum $ map (aux "builtin unary function" exprP) builtinUnaryFuns
+ ( asum $ map (aux "unary operator" weakTermP ) unaryOperators
+ , asum $ map (aux "builtin unary function" strongTermP) builtinUnaryFuns
)
where
aux :: String -> Parser TypedExpr -> UnaryParser -> Parser TypedExpr