diff options
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | 18 |
1 files changed, 12 insertions, 6 deletions
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 "(" |
