From 34b86f22fddce09c6d45d4ba743cc9d1f4eceff9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 4 May 2024 15:54:23 -0700 Subject: Add "fun" syntax. --- parser.sml | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'parser.sml') diff --git a/parser.sml b/parser.sml index e4c7359..c1432f2 100644 --- a/parser.sml +++ b/parser.sml @@ -458,15 +458,25 @@ struct const (Syntax.ECase (e, arms))))) <|> orelseExpr) st and dec : Syntax.dec parser = fn st => - (reserved "val" >> - bind (true <$ reserved "rec" <|> const false) (fn isRec => - bind pat (fn p => - reserved "=" >> - bind expr (fn e => - const - (if isRec - then Syntax.DValRec (p, e) - else Syntax.DVal (p, e)))))) st + ((reserved "val" >> + bind (true <$ reserved "rec" <|> const false) (fn isRec => + bind pat (fn p => + reserved "=" >> + bind expr (fn e => + const + (if isRec + then Syntax.DValRec (p, e) + else Syntax.DVal (p, e)))))) + <|> (reserved "fun" >> + bind identifier (fn name => + bind (many1 atpat) (fn args => + reserved "=" >> + bind expr (fn body => + const + (Syntax.DValRec + ( Syntax.PVar name + , foldr Syntax.ELambda body args + ))))))) st val program : Syntax.expr parser = (fn decs => Syntax.ELet (decs, Syntax.EInt 0)) <$> many dec fun parse (f : string) : (string, Syntax.expr) Result.either = runParser program f -- cgit v1.3.1