diff options
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 "=" >> |
