diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 16:36:40 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 16:36:40 +0200 |
| commit | 78d2b3acf77dc0500d27836915dce99a9c368b53 (patch) | |
| tree | 8d82588ca47f7521fb134f309be1c457c78bf591 /lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | |
| parent | 1de68e897188941559a7f5bdc1314c69581c9208 (diff) | |
| download | lambda-nantes-78d2b3acf77dc0500d27836915dce99a9c368b53.tar.gz | |
feat: can parse a simple λ-expression
Diffstat (limited to 'lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs')
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs index da590ad..545536d 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs @@ -13,15 +13,38 @@ type Parser = Parsec Void Text data ParseError = ParseError Text deriving (Eq, Show) -data AST = Sym Text +data AST = Sym Text | Abs Text AST deriving (Eq, Show) parse :: Text -> Either ParseError AST parse = - first (ParseError . pack . errorBundlePretty) . Text.Megaparsec.parse symbol "" + first (ParseError . pack . errorBundlePretty) . Text.Megaparsec.parse ast "" -symbol :: Parser AST -symbol = Sym . pack <$> identifier +ast :: Parser AST +ast = try lambda <|> try sym + +lambda :: Parser AST +lambda = + between + lpar + rpar + ( do + lexeme "lam" + binding <- pack <$> between lpar rpar identifier + Abs binding <$> ast + ) + +lpar :: Parser Text +lpar = symbol "(" + +rpar :: Parser Text +rpar = symbol ")" + +symbol :: Text -> Parser Text +symbol = L.symbol spaceConsumer + +sym :: Parser AST +sym = Sym . pack <$> identifier identifier :: Parser String identifier = |
