summaryrefslogtreecommitdiffstats
path: root/parser.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-05-17 12:36:56 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-05-17 12:36:56 -0700
commitc39c43e144733973ebf9cd6842df75b5a5ceee0b (patch)
tree91712d2b3dd9dfe30806e447830e1f8665286c05 /parser.sml
parentRevert "Use strings for errors." (diff)
downloadsml-c39c43e144733973ebf9cd6842df75b5a5ceee0b.tar.zst
Add datatypes.
Diffstat (limited to 'parser.sml')
-rw-r--r--parser.sml23
1 files changed, 20 insertions, 3 deletions
diff --git a/parser.sml b/parser.sml
index 9325c98..8057873 100644
--- a/parser.sml
+++ b/parser.sml
@@ -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 "=" >>