diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-05-04 15:54:23 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-05-04 15:54:23 -0700 |
| commit | 34b86f22fddce09c6d45d4ba743cc9d1f4eceff9 (patch) | |
| tree | 4f345edf6b34d86b9d3a8d5cb136b2c3d18700fb /parser.sml | |
| parent | 8ea9fc2536aa0eb45092ed3654dba19b0c8e7c20 (diff) | |
| download | sml-34b86f22fddce09c6d45d4ba743cc9d1f4eceff9.tar.zst | |
Add "fun" syntax.
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 |
