From bc286c7f2ceb5c3d2e06ec72f78d28842f94ef65 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Thu, 24 Jun 2010 08:13:32 -0700 Subject: Resolve and typecheck patterns in pattern alt. --- src/boot/fe/ast.ml | 2 +- src/boot/fe/item.ml | 25 +++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml index bf7a11ff..438d9de9 100644 --- a/src/boot/fe/ast.ml +++ b/src/boot/fe/ast.ml @@ -300,7 +300,7 @@ and domain = and pat = PAT_lit of lit - | PAT_tag of ident * (pat array) + | PAT_tag of ((name identified) * (pat array)) | PAT_slot of ((slot identified) * ident) | PAT_wild diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml index 75f86a58..209526e5 100644 --- a/src/boot/fe/item.ml +++ b/src/boot/fe/item.ml @@ -224,24 +224,29 @@ and parse_stmts (ps:pstate) : Ast.stmt array = let (stmts, lval) = bracketed LPAREN RPAREN parse_lval ps in let rec parse_pat ps = match peek ps with - IDENT ident -> + IDENT _ -> let apos = lexpos ps in - bump ps; + let name = Pexp.parse_name ps in let bpos = lexpos ps in - (* TODO: nullary constructors *) if peek ps != LPAREN then - let slot = - { Ast.slot_mode = Ast.MODE_interior; - Ast.slot_mutable = false; - Ast.slot_ty = None } - in - Ast.PAT_slot ((span ps apos bpos slot), ident) + begin + match name with + Ast.NAME_base (Ast.BASE_ident ident) -> + let slot = + { Ast.slot_mode = Ast.MODE_interior; + Ast.slot_mutable = false; + Ast.slot_ty = None } + in + Ast.PAT_slot + ((span ps apos bpos slot), ident) + |_ -> raise (unexpected ps) + end else let pats = paren_comma_list parse_pat ps in - Ast.PAT_tag (ident, pats) + Ast.PAT_tag ((span ps apos bpos name), pats) | LIT_INT _ | LIT_CHAR _ | LIT_BOOL _ -> Ast.PAT_lit (Pexp.parse_lit ps) | UNDERSCORE -> bump ps; Ast.PAT_wild -- cgit v1.2.3