summaryrefslogtreecommitdiff
path: root/lambda-calcul/haskell/src
diff options
context:
space:
mode:
Diffstat (limited to 'lambda-calcul/haskell/src')
-rw-r--r--lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs16
1 files changed, 16 insertions, 0 deletions
diff --git a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
index 28da47f..37834d3 100644
--- a/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
+++ b/lambda-calcul/haskell/src/Minilang/Lambda/Parser.hs
@@ -11,6 +11,8 @@ import Data.Void (Void)
import Text.Megaparsec (Parsec, between, empty, errorBundlePretty, manyTill, notFollowedBy, optional, parse, try)
import Text.Megaparsec.Char (alphaNumChar, char, letterChar, space1, string, symbolChar)
import qualified Text.Megaparsec.Char.Lexer as L
+import Minilang.Lambda.Eval (Term)
+import qualified Minilang.Lambda.Eval as Eval
type Parser = Parsec Void Text
@@ -20,6 +22,20 @@ data ParseError = ParseError Text
data AST = Sym Text | Abs [Text] AST | App AST AST [AST]
deriving (Eq, Show)
+desugar :: AST -> Term
+desugar = \case
+ Sym sym -> Eval.Var sym
+ Abs bound body ->
+ foldr
+ Eval.Lam
+ (desugar body)
+ bound
+ App x y rest ->
+ foldl
+ (\acc a -> Eval.App acc (desugar a))
+ (Eval.App (desugar x) (desugar y))
+ rest
+
pretty :: AST -> Text
pretty = \case
Sym sym -> sym