diff options
| author | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 16:49:32 +0200 |
|---|---|---|
| committer | Arnaud Bailly <arnaud@pankzsoft.com> | 2025-10-17 16:49:32 +0200 |
| commit | 3b20f8a9e85696b86f698e1bdbdbd31b786b77c2 (patch) | |
| tree | 3f8f7bbc3df51c1313fc9d1796b9650a76024d40 | |
| parent | dee78cba2ec18da811fd6f0499efe1bd27ad34e5 (diff) | |
| download | lambda-nantes-3b20f8a9e85696b86f698e1bdbdbd31b786b77c2.tar.gz | |
feat: parses single application
| -rw-r--r-- | lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs | 11 | ||||
| -rw-r--r-- | lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs | 3 |
2 files changed, 12 insertions, 2 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs index 8e97d46..e60d761 100644 --- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs +++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs @@ -13,7 +13,7 @@ type Parser = Parsec Void Text data ParseError = ParseError Text deriving (Eq, Show) -data AST = Sym Text | Abs [Text] AST +data AST = Sym Text | Abs [Text] AST | App AST AST deriving (Eq, Show) parse :: Text -> Either ParseError AST @@ -21,7 +21,14 @@ parse = first (ParseError . pack . errorBundlePretty) . Text.Megaparsec.parse ast "" ast :: Parser AST -ast = try lambda <|> try sym +ast = try lambda <|> try sym <|> try app + +app :: Parser AST +app = + between + lpar + rpar + (App <$> ast <*> ast) lambda :: Parser AST lambda = diff --git a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs index ea7cd89..b52017a 100644 --- a/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs +++ b/lambda-calcul/haskell/test/Minilang/Lambda/ParserSpec.hs @@ -20,6 +20,9 @@ spec = parallel $ do nestedAbs = Abs vars (Sym body) in parse ("(lam (" <> Text.unwords vars <> ") " <> body <> ")") `shouldBe` Right nestedAbs + prop "parses an application" $ \(Identifier ident1) (Identifier ident2) -> + parse ("(" <> ident1 <> " " <> ident2 <> ")") `shouldBe` Right (App (Sym ident1) (Sym ident2)) + newtype Identifier = Identifier {unIdent :: Text} deriving (Eq, Show) |
