From bc620adb5a07d791c67c42abd29d30e5c1a5c4d2 Mon Sep 17 00:00:00 2001 From: Einhard Leichtfuß Date: Wed, 21 May 2025 12:40:11 +0200 Subject: Distinguish first-pass expression parser --- src/Language/SimpleShell/Parser/Expr.hs | 22 ++++++++++++---------- src/Language/SimpleShell/Parser/Function.hs | 4 ++-- 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_ -- cgit v1.2.3