aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEinhard Leichtfuß <alguien@respiranto.de>2025-05-21 12:40:11 +0200
committerEinhard Leichtfuß <alguien@respiranto.de>2025-05-21 12:40:11 +0200
commitbc620adb5a07d791c67c42abd29d30e5c1a5c4d2 (patch)
tree0dbfe9331f07860c877000f95da24e4fd666fc3e
parent5f7e05b3fa3e3ea532629e1448048d8a98142198 (diff)
Distinguish first-pass expression parser
-rw-r--r--src/Language/SimpleShell/Parser/Expr.hs22
-rw-r--r--src/Language/SimpleShell/Parser/Function.hs4
2 files changed, 14 insertions, 12 deletions
diff --git a/src/Language/SimpleShell/Parser/Expr.hs b/src/Language/SimpleShell/Parser/Expr.hs
index 672bb05..441e890 100644
--- a/src/Language/SimpleShell/Parser/Expr.hs
+++ b/src/Language/SimpleShell/Parser/Expr.hs
@@ -1,12 +1,13 @@
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE FlexibleContexts #-}
module Language.SimpleShell.Parser.Expr
( ExprParser
, runExprParser
, exprP
, strongTermP
- , strongTermP_
+ , strongTermP0_
)
where
@@ -38,11 +39,12 @@ import Data.Map (Map)
import qualified Data.Map as Map (empty, lookup, fromList)
import Data.Text (Text, unpack)
import Data.Tuple (swap)
-import Text.Megaparsec (takeWhile1P, oneOf, many)
+import Text.Megaparsec (MonadParsec, takeWhile1P, oneOf, many)
import Text.Megaparsec.Char (char)
import qualified Text.Megaparsec.Char.Lexer as L (charLiteral, decimal)
+type ExprParser0 = RootParser
type ExprParser = ReaderT ExprContext RootParser
@@ -96,10 +98,10 @@ strongTermP
-- | Parse a strong term--assuming its correctness--without yielding a result.
-- This basically only checks for matching parentheses.
-strongTermP_ :: ExprParser ()
-strongTermP_
+strongTermP0_ :: ExprParser0 ()
+strongTermP0_
= void literalP
- <|> varP_
+ <|> varP0_
<|> symbol "(" *> void (many tok) <* symbol ")"
where
-- Notes:
@@ -108,7 +110,7 @@ strongTermP_
-- * string literals
-- * comments
- tok :: ExprParser ()
+ tok :: ExprParser0 ()
tok
= void strLitP
<|> symbol "(" *> void (many tok) <* symbol ")"
@@ -124,7 +126,7 @@ strongTermP' :: String -> SimpleType -> ExprParser Expr
strongTermP' errMsg t = forceType t strongTermP <|> fail errMsg
-literalP :: ExprParser TypedExpr
+literalP :: (MonadParsec e Text m) => m TypedExpr
literalP
= (IntType,) . IntLiteral <$> lexeme L.decimal
<|> (StrType,) . StrLiteral <$> strLitP
@@ -134,7 +136,7 @@ literalP
= True <$ keyword "true"
<|> False <$ keyword "false"
-strLitP :: ExprParser String
+strLitP :: (MonadParsec e Text m) => m String
strLitP = lexeme $ char '"' *> manyTill L.charLiteral (char '"')
varP :: ExprParser TypedExpr
@@ -144,8 +146,8 @@ varP = do
t <- lookupVar x
return (t, Var x)
-varP_ :: ExprParser ()
-varP_ = void (char '$') <* nameP
+varP0_ :: ExprParser0 ()
+varP0_ = void (char '$') <* nameP
funP :: ExprParser TypedExpr
funP = do
diff --git a/src/Language/SimpleShell/Parser/Function.hs b/src/Language/SimpleShell/Parser/Function.hs
index 3565966..be3f424 100644
--- a/src/Language/SimpleShell/Parser/Function.hs
+++ b/src/Language/SimpleShell/Parser/Function.hs
@@ -16,7 +16,7 @@ import Language.SimpleShell.Parser.Common.Root (RootParser)
import Language.SimpleShell.Parser.Expr
( runExprParser
, strongTermP
- , strongTermP_
+ , strongTermP0_
)
import Language.SimpleShell.Parser.Name (nameP, keyword)
import Language.SimpleShell.Parser.SimpleType (simpleTypeP, forceType)
@@ -57,4 +57,4 @@ bodyP :: [Typed VarName] -> RootParser (Typed Expr)
bodyP params = runExprParser params strongTermP
bodyP_ :: RootParser ()
-bodyP_ = runExprParser [] strongTermP_
+bodyP_ = strongTermP0_