From 1eee551ed24b58ba64d54ea19ffaab1b2821a459 Mon Sep 17 00:00:00 2001 From: Arnaud Bailly Date: Mon, 27 Oct 2025 18:29:14 +0100 Subject: Parse multiple let expressions --- lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) (limited to 'lambda-calcul/haskell/src') diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs index 426a8e8..9ed4626 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs @@ -11,7 +11,7 @@ import qualified Data.Text as Text import Data.Void (Void) import Minilang.Lambda.Eval (Term) import qualified Minilang.Lambda.Eval as Eval -import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, parse, try) +import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, parse, some, try) import Text.Megaparsec.Char (alphaNumChar, char, letterChar, space1, symbolChar) import qualified Text.Megaparsec.Char.Lexer as L @@ -75,17 +75,23 @@ letExpr = rpar ( do void $ lexeme "let" - (bound, binding) <- + (bind : binds) <- between lpar rpar - ( (,) <$> identifier <*> ast - ) + (some binding) body <- ast - let fun = Abs [pack bound] body - return $ App fun binding [] + let fun = Abs (fst <$> (bind : binds)) body + return $ App fun (snd bind) (snd <$> binds) ) +binding :: Parser (Text, AST) +binding = + between + lpar + rpar + (((,) . pack <$> identifier) <*> ast) + lpar :: Parser Text lpar = symbol "(" -- cgit v1.2.3