diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-05-17 12:36:56 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-05-17 12:36:56 -0700 |
| commit | c39c43e144733973ebf9cd6842df75b5a5ceee0b (patch) | |
| tree | 91712d2b3dd9dfe30806e447830e1f8665286c05 /parser.sml | |
| parent | Revert "Use strings for errors." (diff) | |
| download | sml-c39c43e144733973ebf9cd6842df75b5a5ceee0b.tar.zst | |
Add datatypes.
Diffstat (limited to 'parser.sml')
| -rw-r--r-- | parser.sml | 23 |
1 files changed, 20 insertions, 3 deletions
@@ -335,7 +335,7 @@ struct bind parseSingleType parseTycons st and parseTupleType : Syntax.etype parser = fn st => - bind (sepBy1 parseTycon (symbol "*")) (fn types => + bind (sepBy1 parseTycon (reserved "*")) (fn types => const (case types of [ty] => ty @@ -357,7 +357,12 @@ struct [p] => p | _ => Syntax.PTuple pats)) <|> Syntax.PVar <$> identifier) st - and pat : Syntax.pat parser = fn st => atpat st + and pat : Syntax.pat parser = fn st => + (bind identifier (fn ident => + bind atpat (fn arg => + const (Syntax.PCon (ident, arg))) + <|> const (Syntax.PVar ident)) + <|> atpat) st fun leftOp (i : int) : Syntax.expr parser = bind getUserState (fn UserState (_, opTable) => @@ -462,7 +467,19 @@ struct const (Syntax.ECase (e, arms))))) <|> orelseExpr) st and dec : Syntax.dec parser = fn st => - ((reserved "val" >> + ((reserved "datatype" >> + bind identifier (fn name => + reserved "=" >> + bind + (sepBy1 + (bind identifier (fn con => + (reserved "of" >> + bind parseType (fn ty => + const (con, SOME ty))) + <|> const (con, NONE))) + (reserved "|")) (fn cons => + const (Syntax.DDatatype (name, cons))))) + <|> (reserved "val" >> bind (true <$ reserved "rec" <|> const false) (fn isRec => bind pat (fn p => reserved "=" >> |
