diff options
Diffstat (limited to 'parser.sml')
| -rw-r--r-- | parser.sml | 24 |
1 files changed, 18 insertions, 6 deletions
@@ -390,12 +390,14 @@ struct (case pats of [p] => p | _ => Syntax.PTuple pats)) - <|> Syntax.PVar <$> identifier) st + <|> bind longIdentifier (fn [i] => const (Syntax.PVar i) | is => const (Syntax.PCon (is, Syntax.PTuple [])))) st and appPat : Syntax.pat parser = fn st => - (bind identifier (fn ident => + (bind longIdentifier (fn ident => bind atpat (fn arg => const (Syntax.PCon (ident, arg))) - <|> const (Syntax.PVar ident)) + <|> const (case ident of + [i] => Syntax.PVar i + | _ => Syntax.PCon (ident, Syntax.PTuple []))) <|> atpat) st and pat : Syntax.pat parser = fn st => foldl @@ -404,14 +406,14 @@ struct fun patLeft pat1 = bind (leftOp i) (fn opEx => bind patLower (fn pat2 => - let val app = Syntax.PCon (opEx, Syntax.PTuple [pat1, pat2]) + let val app = Syntax.PCon ([opEx], Syntax.PTuple [pat1, pat2]) in patLeft app <|> const app end)) fun patRight pat1 = bind (rightOp i) (fn opEx => bind patLower (fn pat2 => bind (patRight pat2 <|> const pat2) (fn rest => - const (Syntax.PCon (opEx, Syntax.PTuple [pat1, rest]))))) + const (Syntax.PCon ([opEx], Syntax.PTuple [pat1, rest]))))) in bind patLower (fn pat1 => patLeft pat1 <|> patRight pat1 <|> const pat1) @@ -565,8 +567,18 @@ struct else const (SOME (Syntax.DFun (name, map (fn (_, x, y) => (x, y)) cases))) end))) st + val rec strdec : Syntax.dec option parser = fn st => + ((reserved "structure" >> + bind identifier (fn strID => + reserved "=" >> + reserved "struct" >> + bind (many strdec) (fn bindings => + reserved "end" >> + const (SOME (Syntax.DStruct (strID, List.mapPartial (fn x => x) bindings)))))) + <|> dec) st + val program : Syntax.expr parser = - bind (many dec) (fn decs => + bind (many strdec) (fn decs => const (Syntax.ELet (List.mapPartial (fn x => x) decs, Syntax.EInt 0))) fun parse (f : string) : (string, Syntax.expr) Result.either = runParser program f end |
