diff options
Diffstat (limited to 'parser.sml')
| -rw-r--r-- | parser.sml | 28 |
1 files changed, 19 insertions, 9 deletions
@@ -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 |
