diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-28 15:06:43 -0700 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2024-04-28 15:06:43 -0700 |
| commit | 5737e8430d43b3b5bd448f761cd2f3c35707a174 (patch) | |
| tree | b24f44ea5245a56b2f712c2eef6a3897f53bd098 /parser.sml | |
| parent | 9f5889c1263d63b953b3a324da07321deef5ca58 (diff) | |
| download | sml-5737e8430d43b3b5bd448f761cd2f3c35707a174.tar.zst | |
Add case over int.
Diffstat (limited to 'parser.sml')
| -rw-r--r-- | parser.sml | 26 |
1 files changed, 18 insertions, 8 deletions
@@ -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 => |
