9 let e = Hashtbl.create 0 in
10 Hashtbl.add e Ast.EXPORT_all_decls ();
14 let empty_view = { Ast.view_imports = Hashtbl.create 0;
15 Ast.view_exports = default_exports }
18 let rec parse_expr (ps:pstate) : (Ast.stmt array * Ast.expr) =
19 let pexp = ctxt "expr" Pexp.parse_pexp ps in
20 Pexp.desugar_expr ps pexp
22 and parse_expr_atom (ps:pstate) : (Ast.stmt array * Ast.atom) =
23 let pexp = ctxt "expr" Pexp.parse_pexp ps in
24 Pexp.desugar_expr_atom ps pexp
26 and parse_expr_atom_list
30 : (Ast.stmt array * Ast.atom array) =
31 arj1st (bracketed_zero_or_more bra ket (Some COMMA)
32 (ctxt "expr-atom list" parse_expr_atom) ps)
34 and parse_expr_init (lv:Ast.lval) (ps:pstate) : (Ast.stmt array) =
35 let pexp = ctxt "expr" Pexp.parse_pexp ps in
36 Pexp.desugar_expr_init ps lv pexp
38 and parse_lval (ps:pstate) : (Ast.stmt array * Ast.lval) =
39 let pexp = Pexp.parse_pexp ps in
40 Pexp.desugar_lval ps pexp
42 and parse_identified_slot_and_ident
45 : (Ast.slot identified * Ast.ident) =
47 ctxt "identified slot and ident: slot"
48 (Pexp.parse_identified_slot aliases_ok) ps
51 ctxt "identified slot and ident: ident" Pexp.parse_ident ps
55 and parse_zero_or_more_identified_slot_ident_pairs
58 : (((Ast.slot identified) * Ast.ident) array) =
59 ctxt "zero+ slots and idents"
61 (parse_identified_slot_and_ident aliases_ok)) ps
63 and parse_block (ps:pstate) : Ast.block =
64 let apos = lexpos ps in
66 arj (ctxt "block: stmts"
67 (bracketed_zero_or_more LBRACE RBRACE
70 let bpos = lexpos ps in
71 span ps apos bpos stmts
73 and parse_block_stmt (ps:pstate) : Ast.stmt =
74 let apos = lexpos ps in
75 let block = parse_block ps in
76 let bpos = lexpos ps in
77 span ps apos bpos (Ast.STMT_block block)
83 let apos = lexpos ps in
88 parse_expr_init lval ps
91 let (stmts, rhs) = ctxt "init: port" parse_lval ps in
92 let bpos = lexpos ps in
93 let stmt = Ast.STMT_recv (lval, rhs) in
94 Array.append stmts [| (span ps apos bpos stmt) |]
97 let _ = expect ps SEMI in
100 and parse_slot_and_ident_and_init
102 : (Ast.stmt array * Ast.slot * Ast.ident) =
103 let apos = lexpos ps in
105 ctxt "slot, ident and init: slot and ident"
106 (Pexp.parse_slot_and_ident false) ps
108 let bpos = lexpos ps in
109 let lval = Ast.LVAL_base (span ps apos bpos (Ast.BASE_ident ident)) in
110 let stmts = ctxt "slot, ident and init: init" (parse_init lval) ps in
113 and parse_auto_slot_and_init
115 : (Ast.stmt array * Ast.slot * Ast.ident) =
116 let apos = lexpos ps in
117 let ident = Pexp.parse_ident ps in
118 let bpos = lexpos ps in
119 let lval = Ast.LVAL_base (span ps apos bpos (Ast.BASE_ident ident)) in
120 let stmts = ctxt "slot, ident and init: init" (parse_init lval) ps in
121 (stmts, slot_auto, ident)
124 * We have no way to parse a single Ast.stmt; any incoming syntactic statement
125 * may desugar to N>1 real Ast.stmts
128 and parse_stmts (ps:pstate) : Ast.stmt array =
129 let apos = lexpos ps in
134 let (stmts, atom) = ctxt "stmts: log value" parse_expr_atom ps in
136 spans ps stmts apos (Ast.STMT_log atom)
142 let rec name_to_lval (bpos:pos) (name:Ast.name)
146 Ast.LVAL_base (span ps apos bpos nb)
147 | Ast.NAME_ext (n, nc) ->
148 Ast.LVAL_ext (name_to_lval bpos n, Ast.COMP_named nc)
151 let rec carg_path_to_lval (bpos:pos) (path:Ast.carg_path)
154 Ast.CARG_base Ast.BASE_formal ->
155 raise (err "converting formal constraint-arg to atom" ps)
156 | Ast.CARG_base (Ast.BASE_named nb) ->
157 Ast.LVAL_base (span ps apos bpos nb)
158 | Ast.CARG_ext (pth, nc) ->
159 Ast.LVAL_ext (carg_path_to_lval bpos pth,
163 let carg_to_atom (bpos:pos) (carg:Ast.carg)
167 Ast.ATOM_literal (span ps apos bpos lit)
168 | Ast.CARG_path pth ->
169 Ast.ATOM_lval (carg_path_to_lval bpos pth)
172 let synthesise_check_call (bpos:pos) (constr:Ast.constr)
173 : (Ast.lval * (Ast.atom array)) =
174 let lval = name_to_lval bpos constr.Ast.constr_name in
176 Array.map (carg_to_atom bpos) constr.Ast.constr_args
181 let synthesise_check_calls (bpos:pos) (constrs:Ast.constrs)
183 Array.map (synthesise_check_call bpos) constrs
190 ctxt "stmts: check value" parse_expr ps
194 spans ps stmts apos (Ast.STMT_check_expr expr)
199 let constrs = Pexp.parse_constrs ps in
201 let block = parse_block ps in
202 let bpos = lexpos ps in
203 let calls = synthesise_check_calls bpos constrs in
205 (Ast.STMT_check_if (constrs, calls, block))
209 let constrs = Pexp.parse_constrs ps in
211 let bpos = lexpos ps in
212 let calls = synthesise_check_calls bpos constrs in
214 (Ast.STMT_check (constrs, calls))
224 let (stmts, lval) = bracketed LPAREN RPAREN parse_lval ps in
225 let rec parse_pat ps =
228 let apos = lexpos ps in
230 let bpos = lexpos ps in
232 (* TODO: nullary constructors *)
233 if peek ps != LPAREN then
235 { Ast.slot_mode = Ast.MODE_interior;
236 Ast.slot_mutable = false;
239 Ast.PAT_slot ((span ps apos bpos slot), ident)
242 paren_comma_list parse_pat ps
244 Ast.PAT_tag (ident, pats)
245 | LIT_INT _ | LIT_CHAR _ | LIT_BOOL _ ->
246 Ast.PAT_lit (Pexp.parse_lit ps)
247 | UNDERSCORE -> bump ps; Ast.PAT_wild
248 | tok -> raise (Parse_err (ps,
249 "Expected pattern but found '" ^
250 (string_of_tok tok) ^ "'"))
252 let rec parse_arms ps =
256 let pat = bracketed LPAREN RPAREN parse_pat ps in
257 let block = parse_block ps in
258 let arm = (pat, block) in
259 (span ps apos (lexpos ps) arm)::(parse_arms ps)
262 let parse_alt_block ps =
263 let arms = ctxt "alt tag arms" parse_arms ps in
264 spans ps stmts apos begin
266 Ast.alt_tag_lval = lval;
267 Ast.alt_tag_arms = Array.of_list arms
271 bracketed LBRACE RBRACE parse_alt_block ps
276 let final_else = ref None in
277 let rec parse_stmt_if _ =
280 ctxt "stmts: if cond"
281 (bracketed LPAREN RPAREN parse_expr) ps
283 let then_block = ctxt "stmts: if-then" parse_block ps in
291 let nested_if = parse_stmt_if () in
292 let bpos = lexpos ps in
294 Some (span ps apos bpos nested_if)
297 Some (ctxt "stmts: if-else" parse_block ps)
304 { Ast.if_test = expr;
305 Ast.if_then = then_block;
306 Ast.if_else = !final_else; })
319 let inner ps : ((Ast.slot identified * Ast.ident)
321 * (Ast.lval * Ast.atom array)) =
322 let slot = (parse_identified_slot_and_ident true ps) in
323 let _ = (expect ps IN) in
324 let (stmts1, iter) = (rstr true parse_lval) ps in
326 parse_expr_atom_list LPAREN RPAREN ps
328 (slot, Array.append stmts1 stmts2, (iter, args))
330 let (slot, stmts, call) = ctxt "stmts: foreach head"
331 (bracketed LPAREN RPAREN inner) ps
334 ctxt "stmts: foreach body" parse_block ps
336 let bpos = lexpos ps in
339 * Slightly weird, but we put an extra nesting level of
340 * block here to separate the part that lives in our frame
341 * (the iter slot) from the part that lives in the callee
342 * frame (the body block).
345 span ps apos bpos (Ast.STMT_block body_block);
351 { Ast.for_each_slot = slot;
352 Ast.for_each_call = call;
353 Ast.for_each_head = head_block;
354 Ast.for_each_body = body_block; }) |]
357 let slot = (parse_identified_slot_and_ident false ps) in
358 let _ = (expect ps IN) in
359 let lval = (parse_lval ps) in
362 ctxt "stmts: for head" (bracketed LPAREN RPAREN inner) ps
364 let body_block = ctxt "stmts: for body" parse_block ps in
365 let bpos = lexpos ps in
368 { Ast.for_slot = slot;
370 Ast.for_body = body_block; }) |]
376 ctxt "stmts: while cond" (bracketed LPAREN RPAREN parse_expr) ps
378 let body_block = ctxt "stmts: while body" parse_block ps in
379 let bpos = lexpos ps in
382 { Ast.while_lval = (stmts, test);
383 Ast.while_body = body_block; }) |]
392 ctxt "put each: lval" (rstr true parse_lval) ps
395 ctxt "put each: args"
396 (parse_expr_atom_list LPAREN RPAREN) ps
398 let bpos = lexpos ps in
400 span ps apos bpos (Ast.STMT_put_each (lval, args))
403 Array.concat [ lstmts; astmts; [| be |] ]
409 SEMI -> (arr [], None)
412 ctxt "stmts: put expr" parse_expr_atom ps
417 spans ps stmts apos (Ast.STMT_put e)
425 SEMI -> (bump ps; (arr [], None))
428 ctxt "stmts: ret expr" parse_expr_atom ps
433 spans ps stmts apos (Ast.STMT_ret e)
437 let (lstmts, lval) = ctxt "be: lval" (rstr true parse_lval) ps in
439 ctxt "be: args" (parse_expr_atom_list LPAREN RPAREN) ps
441 let bpos = lexpos ps in
442 let be = span ps apos bpos (Ast.STMT_be (lval, args)) in
444 Array.concat [ lstmts; astmts; [| be |] ]
446 | LBRACE -> [| ctxt "stmts: block" parse_block_stmt ps |]
450 let (stmts, slot, ident) =
451 ctxt "stmt slot" parse_slot_and_ident_and_init ps in
452 let slot = Pexp.apply_mutability slot true in
453 let bpos = lexpos ps in
454 let decl = Ast.DECL_slot (Ast.KEY_ident ident,
455 (span ps apos bpos slot))
457 Array.concat [[| span ps apos bpos (Ast.STMT_decl decl) |]; stmts]
461 let (stmts, slot, ident) =
462 ctxt "stmt slot" parse_auto_slot_and_init ps in
463 let slot = Pexp.apply_mutability slot true in
464 let bpos = lexpos ps in
465 let decl = Ast.DECL_slot (Ast.KEY_ident ident,
466 (span ps apos bpos slot))
468 Array.concat [[| span ps apos bpos (Ast.STMT_decl decl) |]; stmts]
473 let bpos = lexpos ps in
474 [| span ps apos bpos Ast.STMT_yield |]
479 let bpos = lexpos ps in
480 [| span ps apos bpos Ast.STMT_fail |]
484 let (stmts, lval) = ctxt "stmts: task expr" parse_lval ps in
486 spans ps stmts apos (Ast.STMT_join lval)
488 | MOD | OBJ | TYPE | FN | USE | NATIVE ->
489 let (ident, item) = ctxt "stmt: decl" parse_mod_item ps in
490 let decl = Ast.DECL_mod_item (ident, item) in
491 let stmts = expand_tags_to_stmts ps item in
492 spans ps stmts apos (Ast.STMT_decl decl)
495 let (lstmts, lval) = ctxt "stmt: lval" parse_lval ps in
499 SEMI -> (bump ps; lstmts)
501 | EQ -> parse_init lval ps
503 | OPEQ binop_token ->
506 ctxt "stmt: opeq rhs" parse_expr_atom ps
509 match binop_token with
510 PLUS -> Ast.BINOP_add
511 | MINUS -> Ast.BINOP_sub
512 | STAR -> Ast.BINOP_mul
513 | SLASH -> Ast.BINOP_div
514 | PERCENT -> Ast.BINOP_mod
515 | AND -> Ast.BINOP_and
517 | CARET -> Ast.BINOP_xor
518 | LSL -> Ast.BINOP_lsl
519 | LSR -> Ast.BINOP_lsr
520 | ASR -> Ast.BINOP_asr
521 | _ -> raise (err "unknown opeq token" ps)
525 (Ast.STMT_copy_binop (lval, binop, rhs))
529 let (stmts, rhs) = ctxt "stmt: recv rhs" parse_lval ps in
530 let _ = expect ps SEMI in
531 spans ps stmts apos (Ast.STMT_recv (lval, rhs))
536 ctxt "stmt: send rhs" parse_expr_atom ps
538 let _ = expect ps SEMI in
539 let bpos = lexpos ps in
540 let (src, copy) = match rhs with
541 Ast.ATOM_lval lv -> (lv, [| |])
543 let (_, tmp, tempdecl) =
544 build_tmp ps slot_auto apos bpos
546 let copy = span ps apos bpos
547 (Ast.STMT_copy (tmp, Ast.EXPR_atom rhs)) in
548 ((clone_lval ps tmp), [| tempdecl; copy |])
552 (Ast.STMT_send (lval, src))
554 Array.concat [ stmts; copy; [| send |] ]
556 | _ -> raise (unexpected ps)
560 and parse_ty_param (iref:int ref) (ps:pstate) : Ast.ty_param identified =
561 let apos = lexpos ps in
562 let e = Pexp.parse_effect ps in
563 let ident = Pexp.parse_ident ps in
565 let bpos = lexpos ps in
567 span ps apos bpos (ident, (i, e))
569 and parse_ty_params (ps:pstate)
570 : (Ast.ty_param identified) array =
573 bracketed_zero_or_more LBRACKET RBRACKET (Some COMMA)
574 (parse_ty_param (ref 0)) ps
577 and parse_ident_and_params (ps:pstate) (cstr:string)
578 : (Ast.ident * (Ast.ty_param identified) array) =
579 let ident = ctxt ("mod " ^ cstr ^ " item: ident") Pexp.parse_ident ps in
581 ctxt ("mod " ^ cstr ^ " item: type params") parse_ty_params ps
587 : ((Ast.slot identified * Ast.ident) array * Ast.constrs) =
590 LPAREN -> ctxt "inputs: input idents and slots"
591 (parse_zero_or_more_identified_slot_ident_pairs true) ps
592 | _ -> raise (unexpected ps)
596 COLON -> (bump ps; ctxt "inputs: constrs" Pexp.parse_constrs ps)
599 let rec rewrite_carg_path cp =
601 Ast.CARG_base (Ast.BASE_named (Ast.BASE_ident ident)) ->
604 for i = 0 to (Array.length slots) - 1
606 let (_, ident') = slots.(i) in
608 then res := Ast.CARG_ext (Ast.CARG_base Ast.BASE_formal,
614 | Ast.CARG_base _ -> cp
615 | Ast.CARG_ext (cp, ext) ->
616 Ast.CARG_ext (rewrite_carg_path cp, ext)
618 (* Rewrite constrs with input tuple as BASE_formal. *)
622 let args = constr.Ast.constr_args in
628 args.(i) <- Ast.CARG_path (rewrite_carg_path cp)
639 : ((Ast.slot identified * Ast.ident) array
641 * Ast.slot identified) =
642 let (inputs, constrs) = parse_inputs ps in
647 ctxt "fn in and out: output slot"
648 (Pexp.parse_identified_slot true) ps
650 let apos = lexpos ps in
651 span ps apos apos slot_nil
653 (inputs, constrs, output)
656 (* parse_fn starts at the first lparen of the sig. *)
662 let (inputs, constrs, output) =
663 ctxt "fn: in_and_out" parse_in_and_out ps
665 let body = ctxt "fn: body" parse_block ps in
666 { Ast.fn_input_slots = inputs;
667 Ast.fn_input_constrs = constrs;
668 Ast.fn_output_slot = output;
669 Ast.fn_aux = { Ast.fn_effect = effect;
670 Ast.fn_is_iter = is_iter; };
671 Ast.fn_body = body; }
673 and parse_meta_input (ps:pstate) : (Ast.ident * string option) =
674 let lab = (ctxt "meta input: label" Pexp.parse_ident ps) in
680 UNDERSCORE -> bump ps; None
681 | LIT_STR s -> bump ps; Some s
682 | _ -> raise (unexpected ps)
685 | _ -> raise (unexpected ps)
687 and parse_meta_pat (ps:pstate) : Ast.meta_pat =
688 bracketed_zero_or_more LPAREN RPAREN
689 (Some COMMA) parse_meta_input ps
691 and parse_meta (ps:pstate) : Ast.meta =
697 raise (err ("wildcard found in meta "
698 ^ "pattern where value expected") ps)
703 and parse_optional_meta_pat (ps:pstate) (ident:Ast.ident) : Ast.meta_pat =
705 LPAREN -> parse_meta_pat ps
706 | _ -> [| ("name", Some ident) |]
713 : (Ast.ident * Ast.mod_item) =
715 let (ident, params) = parse_ident_and_params ps "obj" in
716 let (state, constrs) = (ctxt "obj state" parse_inputs ps) in
717 let drop = ref None in
719 let fns = Hashtbl.create 0 in
720 while (not (peek ps = RBRACE))
722 let apos = lexpos ps in
724 IO | STATE | UNSAFE | FN | ITER ->
725 let effect = Pexp.parse_effect ps in
726 let is_iter = (peek ps) = ITER in
728 let ident = ctxt "obj fn: ident" Pexp.parse_ident ps in
729 let fn = ctxt "obj fn: fn" (parse_fn is_iter effect) ps in
730 let bpos = lexpos ps in
731 htab_put fns ident (span ps apos bpos fn)
734 drop := Some (parse_block ps)
736 | _ -> raise (unexpected ps)
739 let bpos = lexpos ps in
740 let obj = { Ast.obj_state = state;
741 Ast.obj_effect = effect;
742 Ast.obj_constrs = constrs;
744 Ast.obj_drop = !drop }
748 (decl params (Ast.MOD_ITEM_obj obj)))
751 and parse_mod_item (ps:pstate) : (Ast.ident * Ast.mod_item) =
752 let apos = lexpos ps in
753 let parse_lib_name ident =
759 LIT_STR s -> (bump ps; s)
760 | _ -> raise (unexpected ps)
762 | _ -> ps.pstate_infer_lib_name ident
767 IO | STATE | UNSAFE | OBJ | FN | ITER ->
768 let effect = Pexp.parse_effect ps in
771 OBJ -> parse_obj_item ps apos effect
773 let is_iter = (peek ps) = ITER in
775 let (ident, params) = parse_ident_and_params ps "fn" in
777 ctxt "mod fn item: fn" (parse_fn is_iter effect) ps
779 let bpos = lexpos ps in
782 (decl params (Ast.MOD_ITEM_fn fn)))
787 let (ident, params) = parse_ident_and_params ps "type" in
788 let _ = expect ps EQ in
789 let ty = ctxt "mod type item: ty" Pexp.parse_ty ps in
790 let _ = expect ps SEMI in
791 let bpos = lexpos ps in
792 let item = Ast.MOD_ITEM_type ty in
793 (ident, span ps apos bpos (decl params item))
797 let (ident, params) = parse_ident_and_params ps "mod" in
799 let items = parse_mod_items ps RBRACE in
800 let bpos = lexpos ps in
803 (decl params (Ast.MOD_ITEM_mod items)))
813 match string_to_conv s with
814 None -> raise (unexpected ps)
820 let (ident, params) = parse_ident_and_params ps "native mod" in
821 let path = parse_lib_name ident in
822 let items = parse_mod_items_from_signature ps in
823 let bpos = lexpos ps in
824 let rlib = REQUIRED_LIB_c { required_libname = path;
825 required_prefix = ps.pstate_depth }
827 let item = decl params (Ast.MOD_ITEM_mod items) in
828 let item = span ps apos bpos item in
829 note_required_mod ps {lo=apos; hi=bpos} conv rlib item;
836 let ident = ctxt "use mod: ident" Pexp.parse_ident ps in
838 ctxt "use mod: meta" parse_optional_meta_pat ps ident
840 let bpos = lexpos ps in
841 let id = (span ps apos bpos ()).id in
843 ps.pstate_get_mod meta id ps.pstate_node_id ps.pstate_opaque_id
845 let bpos = lexpos ps in
848 REQUIRED_LIB_rust { required_libname = path;
849 required_prefix = ps.pstate_depth }
854 log ps "extracted mod from %s (binding to %s)"
856 log ps "%a" Ast.sprintf_mod_items items;
858 let item = decl [||] (Ast.MOD_ITEM_mod (empty_view, items)) in
859 let item = span ps apos bpos item in
860 note_required_mod ps {lo=apos; hi=bpos} CONV_rust rlib item;
866 | _ -> raise (unexpected ps)
869 and parse_mod_items_from_signature
871 : (Ast.mod_view * Ast.mod_items) =
872 let mis = Hashtbl.create 0 in
874 while not (peek ps = RBRACE)
876 let (ident, mti) = ctxt "mod items from sig: mod item"
877 parse_mod_item_from_signature ps
879 Hashtbl.add mis ident mti;
885 and parse_mod_item_from_signature (ps:pstate)
886 : (Ast.ident * Ast.mod_item) =
887 let apos = lexpos ps in
891 let (ident, params) = parse_ident_and_params ps "mod signature" in
892 let items = parse_mod_items_from_signature ps in
893 let bpos = lexpos ps in
894 (ident, span ps apos bpos (decl params (Ast.MOD_ITEM_mod items)))
896 | IO | STATE | UNSAFE | FN | ITER ->
897 let effect = Pexp.parse_effect ps in
898 let is_iter = (peek ps) = ITER in
900 let (ident, params) = parse_ident_and_params ps "fn signature" in
901 let (inputs, constrs, output) = parse_in_and_out ps in
902 let bpos = lexpos ps in
903 let body = span ps apos bpos [| |] in
906 { Ast.fn_input_slots = inputs;
907 Ast.fn_input_constrs = constrs;
908 Ast.fn_output_slot = output;
909 Ast.fn_aux = { Ast.fn_effect = effect;
910 Ast.fn_is_iter = is_iter; };
911 Ast.fn_body = body; }
913 let node = span ps apos bpos (decl params fn) in
922 htab_put ps.pstate_required_syms node.id s
923 | _ -> raise (unexpected ps)
932 let (ident, params) = parse_ident_and_params ps "type type" in
935 SEMI -> Ast.TY_native (next_opaque_id ps)
936 | _ -> Pexp.parse_ty ps
939 let bpos = lexpos ps in
940 (ident, span ps apos bpos (decl params (Ast.MOD_ITEM_type t)))
942 (* FIXME: parse obj. *)
943 | _ -> raise (unexpected ps)
949 : (Ast.ident * Ast.mod_item) array =
950 let handle_ty_tag id ttag =
955 let ident = match name with
956 Ast.NAME_base (Ast.BASE_ident ident) -> ident
959 (ps, "unexpected name type while expanding tag"))
962 Array.map (fun slot -> (clone_span ps item slot)) tup
964 let tag_item' = Ast.MOD_ITEM_tag (header, ttag, id) in
966 Array.map (fun p -> clone_span ps p p.node)
967 item.node.Ast.decl_params
970 clone_span ps item (decl cloned_params tag_item')
972 tags := (ident, tag_item) :: (!tags)
977 let handle_ty_decl id tyd =
979 Ast.TY_tag ttag -> handle_ty_tag id ttag
982 match item.node.Ast.decl_item with
983 Ast.MOD_ITEM_type tyd -> handle_ty_decl item.id tyd
987 and expand_tags_to_stmts
991 let id_items = expand_tags ps item in
993 (fun (ident, tag_item) ->
996 (Ast.DECL_mod_item (ident, tag_item))))
1000 and expand_tags_to_items
1003 (items:Ast.mod_items)
1005 let id_items = expand_tags ps item in
1007 (fun (ident, item) -> htab_put items ident item)
1011 and note_required_mod
1020 fun _ -> log ps "marking item #%d as required" (int_of_node item.id)
1022 htab_put ps.pstate_required item.id (rlib, conv);
1023 if not (Hashtbl.mem ps.pstate_sess.Session.sess_spans item.id)
1024 then Hashtbl.add ps.pstate_sess.Session.sess_spans item.id sp;
1025 match item.node.Ast.decl_item with
1026 Ast.MOD_ITEM_mod (_, items) ->
1030 note_required_mod ps sp conv rlib sub
1038 (imports:(Ast.ident, Ast.name) Hashtbl.t)
1041 let a = match a with
1045 Ast.NAME_ext (_, Ast.COMP_ident i)
1046 | Ast.NAME_ext (_, Ast.COMP_app (i, _))
1047 | Ast.NAME_base (Ast.BASE_ident i)
1048 | Ast.NAME_base (Ast.BASE_app (i, _)) -> i
1049 | _ -> raise (Parse_err (ps, "bad import specification"))
1053 Hashtbl.add imports a n
1065 import (Some i) (Pexp.parse_name ps)
1070 import None (Pexp.parse_name_ext ps
1072 (Ast.BASE_ident i)))
1075 import None (Pexp.parse_name ps)
1080 (exports:(Ast.export, unit) Hashtbl.t)
1084 STAR -> bump ps; Ast.EXPORT_all_decls
1085 | IDENT i -> bump ps; Ast.EXPORT_ident i
1086 | _ -> raise (unexpected ps)
1088 Hashtbl.add exports e ()
1094 : (Ast.mod_view * Ast.mod_items) =
1095 ps.pstate_depth <- ps.pstate_depth + 1;
1096 let imports = Hashtbl.create 0 in
1097 let exports = Hashtbl.create 0 in
1098 let in_view = ref true in
1099 let items = Hashtbl.create 4 in
1100 while (not (peek ps = terminal))
1107 parse_import ps imports;
1111 parse_export ps exports;
1116 let (ident, item) = parse_mod_item ps in
1117 htab_put items ident item;
1118 expand_tags_to_items ps item items;
1120 if (Hashtbl.length exports) = 0
1121 then Hashtbl.add exports Ast.EXPORT_all_decls ();
1123 ps.pstate_depth <- ps.pstate_depth - 1;
1124 let view = { Ast.view_imports = imports;
1125 Ast.view_exports = exports }
1135 * indent-tabs-mode: nil
1136 * buffer-file-coding-system: utf-8-unix
1137 * compile-command: "make -k -C ../.. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";