summaryrefslogtreecommitdiffstats
path: root/parser.sml
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
committerRose Hogenson <rosehogenson@posteo.net>2024-04-28 15:06:43 -0700
commit5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch)
treeb24f44ea5245a56b2f712c2eef6a3897f53bd098 /parser.sml
parent9f5889c1263d63b953b3a324da07321deef5ca58 (diff)
downloadsml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst
Add case over int.
Diffstat (limited to 'parser.sml')
-rw-r--r--parser.sml26
1 files changed, 18 insertions, 8 deletions
diff --git a/parser.sml b/parser.sml
index 6efc4aa..3c044af 100644
--- a/parser.sml
+++ b/parser.sml
@@ -275,9 +275,10 @@ struct
List.exists (fn c => c = start) symbolicIdentifierLetters
in
lexeme
- (try (parseString s) >>
- notFollowedBy (if isSymbolic then symbolicIdentifierLetter else alphaNumIdentifierLetter) >>
- const s)
+ (try
+ (parseString s >>
+ notFollowedBy (if isSymbolic then symbolicIdentifierLetter else alphaNumIdentifierLetter) >>
+ const s))
<?> s
end
@@ -349,6 +350,7 @@ struct
val rec atpat : Syntax.pat parser = fn st =>
(Syntax.PWild <$ reserved "_"
+ <|> Syntax.PInt <$> integer
<|> between (symbol "(") (symbol ")") pat
<|> Syntax.PVar <$> identifier) st
and pat : Syntax.pat parser = fn st => atpat st
@@ -437,16 +439,24 @@ struct
bind orelseExpr (fn e2 =>
const (Syntax.EOrElse (e1, e2))))
<|> const e1) st
- and handleExpr : Syntax.expr parser = fn st => orelseExpr st
- and raiseExpr : Syntax.expr parser = fn st => handleExpr st
- and fnExpr : Syntax.expr parser = fn st =>
+ and expr : Syntax.expr parser = fn st =>
((reserved "fn" >>
bind pat (fn p =>
reserved "=>" >>
bind expr (fn e =>
const (Syntax.ELambda (p, e)))))
- <|> raiseExpr) st
- and expr : Syntax.expr parser = fn st => fnExpr st
+ <|> (reserved "case" >>
+ bind expr (fn e =>
+ reserved "of" >>
+ bind
+ (sepBy1
+ (bind pat (fn p =>
+ reserved "=>" >>
+ bind expr (fn e =>
+ const (p, e))))
+ (reserved "|")) (fn arms =>
+ const (Syntax.ECase (e, arms)))))
+ <|> orelseExpr) st
and dec : Syntax.dec parser = fn st =>
(reserved "val" >>
bind pat (fn p =>