From 29987b56e1dafff4a850eef4e668a364340fc59b Mon Sep 17 00:00:00 2001 From: Graydon Hoare Date: Thu, 5 Aug 2010 10:04:11 -0700 Subject: Move 'as' precedence up to just above relational; support indexing str and vec by all integral types. Closes #94. --- src/boot/fe/pexp.ml | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/pexp.ml b/src/boot/fe/pexp.ml index fb2d91a0..3e17e0e4 100644 --- a/src/boot/fe/pexp.ml +++ b/src/boot/fe/pexp.ml @@ -817,11 +817,33 @@ and parse_or_pexp (ps:pstate) : pexp = step lhs +and parse_as_pexp (ps:pstate) : pexp = + let apos = lexpos ps in + let pexp = ctxt "as pexp" parse_or_pexp ps in + let rec step accum = + match peek ps with + AS -> + bump ps; + let tapos = lexpos ps in + let t = parse_ty ps in + let bpos = lexpos ps in + let t = span ps tapos bpos t in + let node = + span ps apos bpos + (PEXP_unop ((Ast.UNOP_cast t), accum)) + in + step node + + | _ -> accum + in + step pexp + + and parse_relational_pexp (ps:pstate) : pexp = let name = "relational pexp" in let apos = lexpos ps in - let lhs = ctxt (name ^ " lhs") parse_or_pexp ps in - let build = binop_build ps name apos parse_or_pexp in + let lhs = ctxt (name ^ " lhs") parse_as_pexp ps in + let build = binop_build ps name apos parse_as_pexp in let rec step accum = match peek ps with LT -> build accum step Ast.BINOP_lt @@ -883,30 +905,8 @@ and parse_oror_pexp (ps:pstate) : pexp = step lhs -and parse_as_pexp (ps:pstate) : pexp = - let apos = lexpos ps in - let pexp = ctxt "as pexp" parse_oror_pexp ps in - let rec step accum = - match peek ps with - AS -> - bump ps; - let tapos = lexpos ps in - let t = parse_ty ps in - let bpos = lexpos ps in - let t = span ps tapos bpos t in - let node = - span ps apos bpos - (PEXP_unop ((Ast.UNOP_cast t), accum)) - in - step node - - | _ -> accum - in - step pexp - - and parse_pexp (ps:pstate) : pexp = - parse_as_pexp ps + parse_oror_pexp ps and parse_mutable_and_pexp (ps:pstate) : (Ast.mutability * pexp) = let mutability = parse_mutability ps in -- cgit v1.2.3 From 514fb4b321d1d019a7bfcd64518d1162878cbf07 Mon Sep 17 00:00:00 2001 From: Roy Frostig Date: Fri, 6 Aug 2010 15:43:59 -0700 Subject: Accept uint literals as literal patterns. --- src/boot/fe/item.ml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/item.ml b/src/boot/fe/item.ml index 69fe5fc2..82ec2faf 100644 --- a/src/boot/fe/item.ml +++ b/src/boot/fe/item.ml @@ -253,7 +253,10 @@ and parse_stmts (ps:pstate) : Ast.stmt array = let lv = name_to_lval apos bpos name in Ast.PAT_tag (lv, paren_comma_list parse_pat ps) - | LIT_INT _ | LIT_CHAR _ | LIT_BOOL _ -> + | LIT_INT _ + | LIT_UINT _ + | LIT_CHAR _ + | LIT_BOOL _ -> Ast.PAT_lit (Pexp.parse_lit ps) | UNDERSCORE -> bump ps; Ast.PAT_wild -- cgit v1.2.3 From a0cc4817e952f1a022b1ad9c01793db1735a579e Mon Sep 17 00:00:00 2001 From: Or Brostovski Date: Thu, 5 Aug 2010 03:44:29 +0300 Subject: Added AST logging, and modified AST for consistent handling of alt stmts. - Modified the arm types, instead of a single arm type, there are now 2 (soon to be 3) arm types, one for each type of alt statement - Added AST logging for constrained type (see fmt_constrained) - Added AST logging for STMT_alt_type - Created a generic fmt_arm for use with all alt statements --- src/boot/fe/ast.ml | 75 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 18 deletions(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml index 651b1e65..d4ace045 100644 --- a/src/boot/fe/ast.ml +++ b/src/boot/fe/ast.ml @@ -247,13 +247,13 @@ and stmt = stmt' identified and stmt_alt_tag = { alt_tag_lval: lval; - alt_tag_arms: arm array; + alt_tag_arms: tag_arm array; } and stmt_alt_type = { alt_type_lval: lval; - alt_type_arms: (ident * slot * stmt) array; + alt_type_arms: type_arm array; alt_type_else: stmt option; } @@ -318,8 +318,11 @@ and pat = | PAT_slot of ((slot identified) * ident) | PAT_wild -and arm' = pat * block -and arm = arm' identified +and tag_arm' = pat * block +and tag_arm = tag_arm' identified + +and type_arm' = ident * slot * block +and type_arm = type_arm' identified and atom = ATOM_literal of (lit identified) @@ -646,6 +649,16 @@ and fmt_iso (ff:Format.formatter) (tiso:ty_iso) : unit = done; fmt ff "@]]@]" +and fmt_constrained ff (ty, constrs) : unit = + fmt ff "@["; + fmt_ty ff ty; + fmt ff " : "; + fmt ff "@["; + fmt_constrs ff constrs; + fmt ff "@]"; + fmt ff "@]"; + + and fmt_ty (ff:Format.formatter) (t:ty) : unit = match t with TY_any -> fmt ff "any" @@ -687,7 +700,7 @@ and fmt_ty (ff:Format.formatter) (t:ty) : unit = | TY_tag ttag -> fmt_tag ff ttag | TY_iso tiso -> fmt_iso ff tiso | TY_idx idx -> fmt ff "" idx - | TY_constrained _ -> fmt ff "?constrained?" + | TY_constrained ctrd -> fmt_constrained ff ctrd | TY_obj (effect, fns) -> fmt_obox ff; @@ -707,7 +720,13 @@ and fmt_ty (ff:Format.formatter) (t:ty) : unit = and fmt_constrs (ff:Format.formatter) (cc:constr array) : unit = - Array.iter (fmt_constr ff) cc + for i = 0 to (Array.length cc) - 1 + do + if i != 0 + then fmt ff ",@ "; + fmt_constr ff cc.(i) + done; + (* Array.iter (fmt_constr ff) cc *) and fmt_decl_constrs (ff:Format.formatter) (cc:constr array) : unit = if Array.length cc = 0 @@ -1204,25 +1223,45 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit = fmt_lval ff at.alt_tag_lval; fmt ff ") "; fmt_obr ff; - Array.iter (fmt_arm ff) at.alt_tag_arms; + Array.iter (fmt_tag_arm ff) at.alt_tag_arms; fmt_cbb ff; - | STMT_alt_type _ -> fmt ff "?stmt_alt_type?" + | STMT_alt_type at -> + fmt_obox ff; + fmt ff "alt type ("; + fmt_lval ff at.alt_type_lval; + fmt ff ") "; + fmt_obr ff; + Array.iter (fmt_type_arm ff) at.alt_type_arms; + fmt_cbb ff; + | STMT_alt_port _ -> fmt ff "?stmt_alt_port?" | STMT_note _ -> fmt ff "?stmt_note?" | STMT_slice _ -> fmt ff "?stmt_slice?" end -and fmt_arm (ff:Format.formatter) (arm:arm) : unit = - let (pat, block) = arm.node in - fmt ff "@\n"; - fmt_obox ff; - fmt ff "case ("; - fmt_pat ff pat; - fmt ff ") "; - fmt_obr ff; - fmt_stmts ff block.node; - fmt_cbb ff; +and fmt_arm + (ff:Format.formatter) + (fmt_arm_case_expr : Format.formatter -> unit) + (block : block) + : unit = + fmt ff "@\n"; + fmt_obox ff; + fmt ff "case ("; + fmt_arm_case_expr ff; + fmt ff ") "; + fmt_obr ff; + fmt_stmts ff block.node; + fmt_cbb ff; + +and fmt_tag_arm (ff:Format.formatter) (tag_arm:tag_arm) : unit = + let (pat, block) = tag_arm.node in + fmt_arm ff (fun ff -> fmt_pat ff pat) block; + +and fmt_type_arm (ff:Format.formatter) (type_arm:type_arm) : unit = + let (_, slot, block) = type_arm.node in + fmt_arm ff (fun ff -> fmt_slot ff slot) block; + and fmt_pat (ff:Format.formatter) (pat:pat) : unit = match pat with -- cgit v1.2.3 From 122ea68b12ec1587f0fe0bd4737ae866e2a56c39 Mon Sep 17 00:00:00 2001 From: Or Brostovski Date: Fri, 6 Aug 2010 16:11:15 +0300 Subject: Added AST pretty printing for slice expression --- src/boot/fe/ast.ml | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml index d4ace045..9cad5ce5 100644 --- a/src/boot/fe/ast.ml +++ b/src/boot/fe/ast.ml @@ -1237,7 +1237,13 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit = | STMT_alt_port _ -> fmt ff "?stmt_alt_port?" | STMT_note _ -> fmt ff "?stmt_note?" - | STMT_slice _ -> fmt ff "?stmt_slice?" + | STMT_slice (dst, src, slice) -> + fmt_lval ff dst; + fmt ff " = "; + fmt_lval ff src; + fmt ff "."; + fmt_slice ff slice; + fmt ff ";"; end and fmt_arm @@ -1275,6 +1281,27 @@ and fmt_pat (ff:Format.formatter) (pat:pat) : unit = | PAT_wild -> fmt ff "_" +and fmt_slice (ff:Format.formatter) (slice:slice) : unit = + let fmt_slice_start = (match slice.slice_start with + None -> (fun ff -> fmt ff "0") + | Some atom -> (fun ff -> fmt_atom ff atom)) in + fmt ff "(@["; + fmt_slice_start ff; + begin + match slice.slice_len with + None -> fmt ff "," + | Some slice_len -> + fmt ff ",@ @["; + fmt_slice_start ff; + fmt ff " +@ "; + fmt_atom ff slice_len; + fmt ff "@]"; + end; + fmt ff "@])"; + + + + and fmt_decl_param (ff:Format.formatter) (param:ty_param) : unit = let (ident, (i, e)) = param in fmt_effect ff e; -- cgit v1.2.3 From 459e86045707e39c692535e0e2394c143d08355e Mon Sep 17 00:00:00 2001 From: Or Brostovski Date: Fri, 6 Aug 2010 17:15:55 +0300 Subject: Added forgotten handling for alt_type_else, and also for stmt_note --- src/boot/fe/ast.ml | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'src/boot/fe') diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml index 9cad5ce5..efbd62ae 100644 --- a/src/boot/fe/ast.ml +++ b/src/boot/fe/ast.ml @@ -254,7 +254,14 @@ and stmt_alt_type = { alt_type_lval: lval; alt_type_arms: type_arm array; - alt_type_else: stmt option; + alt_type_else: block option; + } + +and stmt_alt_port = + { + (* else lval is a timeout value. *) + alt_port_arms: (lval * lval) array; + alt_port_else: (lval * block) option; } and block' = stmt array @@ -264,12 +271,6 @@ and stmt_decl = DECL_mod_item of (ident * mod_item) | DECL_slot of (slot_key * (slot identified)) -and stmt_alt_port = - { - (* else lval is a timeout value. *) - alt_port_arms: (lval * lval) array; - alt_port_else: (lval * stmt) option; - } and stmt_while = { @@ -1233,10 +1234,25 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit = fmt ff ") "; fmt_obr ff; Array.iter (fmt_type_arm ff) at.alt_type_arms; + begin + match at.alt_type_else with + None -> () + | Some block -> + fmt ff "@\n"; + fmt_obox ff; + fmt ff "case (_) "; + fmt_obr ff; + fmt_stmts ff block.node; + fmt_cbb ff; + end; fmt_cbb ff; - | STMT_alt_port _ -> fmt ff "?stmt_alt_port?" - | STMT_note _ -> fmt ff "?stmt_note?" + | STMT_note at -> + begin + fmt ff "note "; + fmt_atom ff at; + fmt ff ";" + end | STMT_slice (dst, src, slice) -> fmt_lval ff dst; fmt ff " = "; @@ -1245,7 +1261,7 @@ and fmt_stmt_body (ff:Format.formatter) (s:stmt) : unit = fmt_slice ff slice; fmt ff ";"; end - + and fmt_arm (ff:Format.formatter) (fmt_arm_case_expr : Format.formatter -> unit) -- cgit v1.2.3