From 2581ac99323ead839964e9b5f2a799cf61fd5bdc Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 18 May 2024 13:08:31 -0700 Subject: Allow pattern matching in function definitions. --- parser.sml | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) (limited to 'parser.sml') diff --git a/parser.sml b/parser.sml index 8057873..08cb992 100644 --- a/parser.sml +++ b/parser.sml @@ -489,15 +489,20 @@ struct 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 + bind + (sepBy1 + (bind identifier (fn name => + bind (many1 atpat) (fn args => + reserved "=" >> + bind expr (fn body => + const (name, args, body))))) + (reserved "|")) (fn cases => + let val (name, _, _) = hd cases + in + if not (List.all (fn (n, _, _) => n = name) cases) + then raise Fail "clauses do not all have same function name" + else const (Syntax.DFun (name, map (fn (_, x, y) => (x, y)) cases)) + end))) 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