74
74
| _ -> { (t) with ptyp_desc = Ptyp_poly [] t } ]
81
| Ast.BAnt _ -> assert False ];
78
[ <:virtual_flag< virtual >> -> Virtual
79
| <:virtual_flag<>> -> Concrete
80
| _ -> assert False ];
83
value mkvirtual m = if mb2b m then Virtual else Concrete;
82
value mkdirection = fun
83
[ <:direction_flag< to >> -> Upto
84
| <:direction_flag< downto >> -> Downto
85
| _ -> assert False ];
85
87
value lident s = Lident s;
86
88
value ldot l s = Ldot l s;
113
[ Ast.BTrue -> Recursive
114
| Ast.BFalse -> Nonrecursive
115
| Ast.BAnt _ -> assert False ];
115
[ <:rec_flag< rec >> -> Recursive
116
| <:rec_flag<>> -> Nonrecursive
117
| _ -> assert False ];
117
119
value mkli s = loop lident
118
120
where rec loop f =
232
234
mktyp loc (Ptyp_object (meth_list fl [mkfield loc Pfield_var]))
233
235
| TyCls loc id ->
234
236
mktyp loc (Ptyp_class (ident id) [] [])
237
| <:ctyp@loc< (module $pt$) >> ->
238
let (i, cs) = package_type pt in
239
mktyp loc (Ptyp_package i cs)
235
240
| TyLab loc _ _ -> error loc "labelled type not allowed here"
236
241
| TyMan loc _ _ -> error loc "manifest type not allowed here"
237
242
| TyOlb loc _ _ -> error loc "labelled type not allowed here"
256
261
| TyAnt loc _ -> error loc "antiquotation not allowed here"
257
262
| TyOfAmp _ _ _ |TyAmp _ _ _ |TySta _ _ _ |
258
263
TyCom _ _ _ |TyVrn _ _ |TyQuM _ _ |TyQuP _ _ |TyDcl _ _ _ _ _ |
259
TyObj _ _ (BAnt _) | TyNil _ | TyTup _ _ ->
264
TyObj _ _ (RvAnt _) | TyNil _ | TyTup _ _ ->
261
266
and row_field = fun
262
267
[ <:ctyp<>> -> []
276
281
| <:ctyp@loc< $lid:lab$ : $t$ >> ->
277
282
[mkfield loc (Pfield lab (mkpolytype (ctyp t))) :: acc]
278
283
| _ -> assert False ]
285
and package_type_constraints wc acc =
287
[ <:with_constr<>> -> acc
288
| <:with_constr< type $lid:id$ = $ct$ >> ->
289
[(id, ctyp ct) :: acc]
290
| <:with_constr< $wc1$ and $wc2$ >> ->
291
package_type_constraints wc1 (package_type_constraints wc2 acc)
292
| _ -> error (loc_of_with_constr wc) "unexpected `with constraint' for a package type" ]
294
and package_type : module_type -> package_type =
296
[ <:module_type< $id:i$ with $wc$ >> ->
297
(long_uident i, package_type_constraints wc [])
298
| <:module_type< $id:i$ >> -> (long_uident i, [])
299
| mt -> error (loc_of_module_type mt) "unexpected package type" ]
281
302
value mktype loc tl cl tk tp tm =
285
306
ptype_variance = variance}
287
308
value mkprivate' m = if m then Private else Public;
288
value mkprivate m = mkprivate' (mb2b m);
309
value mkprivate = fun
310
[ <:private_flag< private >> -> Private
311
| <:private_flag<>> -> Public
312
| _ -> assert False ];
289
313
value mktrecord =
291
315
[ <:ctyp@loc< $lid:s$ : mutable $t$ >> ->
332
356
| Ast.LCons x xs -> [x :: list_of_meta_list xs]
333
357
| Ast.LAnt _ -> assert False ];
335
value mkmutable m = if mb2b m then Mutable else Immutable;
359
value mkmutable = fun
360
[ <:mutable_flag< mutable >> -> Mutable
361
| <:mutable_flag<>> -> Immutable
362
| _ -> assert False ];
337
364
value paolab lab p =
338
365
match (lab, p) with
370
397
| <:ctyp< $id:i$ >> -> (ident i, acc)
371
398
| _ -> assert False ];
400
value mkwithtyp pwith_type loc id_tpl ct =
401
let (id, tpl) = type_parameters_and_type_name id_tpl [] in
402
let (params, variance) = List.split tpl in
403
let (kind, priv, ct) = opt_private_ctyp ct in
405
{ptype_params = params; ptype_cstrs = [];
407
ptype_private = priv;
408
ptype_manifest = Some ct;
409
ptype_loc = mkloc loc; ptype_variance = variance});
373
411
value rec mkwithc wc acc =
376
| WcTyp loc id_tpl ct ->
377
let (id, tpl) = type_parameters_and_type_name id_tpl [] in
378
let (params, variance) = List.split tpl in
379
let (kind, priv, ct) = opt_private_ctyp ct in
382
{ptype_params = params; ptype_cstrs = [];
384
ptype_private = priv;
385
ptype_manifest = Some ct;
386
ptype_loc = mkloc loc; ptype_variance = variance}) :: acc]
413
[ <:with_constr<>> -> acc
414
| <:with_constr@loc< type $id_tpl$ = $ct$ >> ->
415
[mkwithtyp (fun x -> Pwith_type x) loc id_tpl ct :: acc]
416
| <:with_constr< module $i1$ = $i2$ >> ->
388
417
[(long_uident i1, Pwith_module (long_uident i2)) :: acc]
418
| <:with_constr@loc< type $id_tpl$ := $ct$ >> ->
419
[mkwithtyp (fun x -> Pwith_typesubst x) loc id_tpl ct :: acc]
420
| <:with_constr< module $i1$ := $i2$ >> (*WcMoS _ i1 i2*) ->
421
[(long_uident i1, Pwith_modsubst (long_uident i2)) :: acc]
389
422
| <:with_constr< $wc1$ and $wc2$ >> -> mkwithc wc1 (mkwithc wc2 acc)
390
423
| <:with_constr@loc< $anti:_$ >> ->
391
424
error loc "bad with constraint (antiquotation)" ];
490
523
mkrangepat loc c1 c2
491
524
| _ -> error loc "range pattern allowed only for characters" ]
493
mkpat loc (Ppat_record (List.map mklabpat (list_of_patt p [])))
526
let ps = list_of_patt p [] in
527
let is_wildcard = fun [ <:patt< _ >> -> True | _ -> False ] in
528
let (wildcards,ps) = List.partition is_wildcard ps in
529
let is_closed = if wildcards = [] then Closed else Open in
530
mkpat loc (Ppat_record (List.map mklabpat ps, is_closed))
495
532
mkpat loc (Ppat_constant (Const_string (string_of_string_token loc s)))
496
533
| <:patt@loc< ($p1$, $p2$) >> ->
541
578
| e -> [(loc_of_expr e, [], e) :: l] ]
581
value override_flag loc =
582
fun [ <:override_flag< ! >> -> Override
583
| <:override_flag<>> -> Fresh
584
| _ -> error loc "antiquotation not allowed here"
544
587
value list_of_opt_ctyp ot acc =
546
589
[ <:ctyp<>> -> acc
639
682
| ExFlo loc s -> mkexp loc (Pexp_constant (Const_float (remove_underscores s)))
640
683
| ExFor loc i e1 e2 df el ->
641
684
let e3 = ExSeq loc el in
642
let df = if mb2b df then Upto else Downto in
643
mkexp loc (Pexp_for i (expr e1) (expr e2) df (expr e3))
685
mkexp loc (Pexp_for i (expr e1) (expr e2) (mkdirection df) (expr e3))
644
686
| <:expr@loc< fun [ $PaLab _ lab po$ when $w$ -> $e$ ] >> ->
646
688
(Pexp_function lab None
731
773
| ExWhi loc e1 el ->
732
774
let e2 = ExSeq loc el in
733
775
mkexp loc (Pexp_while (expr e1) (expr e2))
776
| <:expr@loc< let open $i$ in $e$ >> ->
777
mkexp loc (Pexp_open (long_uident i) (expr e))
778
| <:expr@loc< (module $me$ : $pt$) >> ->
779
mkexp loc (Pexp_pack (module_expr me) (package_type pt))
780
| <:expr@loc< (module $_$) >> ->
781
error loc "(module_expr : package_type) expected here"
783
mkexp loc (Pexp_newtype i (expr e))
734
784
| <:expr@loc< $_$,$_$ >> -> error loc "expr, expr: not allowed here"
735
785
| <:expr@loc< $_$;$_$ >> ->
736
786
error loc "expr; expr: not allowed here, use do {...} or [|...|] to surround them"
753
803
[ <:binding< $x$ and $y$ >> ->
754
804
binding x (binding y acc)
805
| <:binding@_loc< $p$ = ($e$ : ! $vs$ . $ty$) >> ->
806
[(patt <:patt< ($p$ : ! $vs$ . $ty$ ) >>, expr e) :: acc]
755
807
| <:binding< $p$ = $e$ >> -> [(patt p, expr e) :: acc]
756
808
| <:binding<>> -> acc
757
809
| _ -> assert False ]
865
917
mkmod loc (Pmod_structure (str_item sl []))
866
918
| <:module_expr@loc< ($me$ : $mt$) >> ->
867
919
mkmod loc (Pmod_constraint (module_expr me) (module_type mt))
920
| <:module_expr@loc< (value $e$ : $pt$) >> ->
921
mkmod loc (Pmod_unpack (expr e) (package_type pt))
922
| <:module_expr@loc< (value $_$) >> ->
923
error loc "(value expr) not supported yet"
868
924
| <:module_expr@loc< $anti:_$ >> -> error loc "antiquotation in module_expr" ]
869
925
and str_item s l =
900
956
| <:str_item@loc< $anti:_$ >> -> error loc "antiquotation in str_item" ]
903
[ CtCon loc Ast.BFalse id tl ->
959
[ CtCon loc ViNil id tl ->
905
961
(Pcty_constr (long_class_ident id) (List.map ctyp (list_of_opt_ctyp tl [])))
906
962
| CtFun loc (TyLab _ lab t) ct ->
930
986
[ <:ctyp<>> -> (loc, ([], []))
931
987
| t -> (loc_of_ctyp t, List.split (class_parameters t [])) ]
933
{pci_virt = if mb2b vir then Virtual else Concrete;
989
{pci_virt = mkvirtual vir;
934
990
pci_params = (params, mkloc loc_params);
936
992
pci_expr = class_expr ce;
946
1002
[ <:ctyp<>> -> (loc, ([], []))
947
1003
| t -> (loc_of_ctyp t, List.split (class_parameters t [])) ]
949
{pci_virt = if mb2b vir then Virtual else Concrete;
1005
{pci_virt = mkvirtual vir;
950
1006
pci_params = (params, mkloc loc_params);
951
1007
pci_name = name;
952
1008
pci_expr = class_type ct;
974
1030
let (ce, el) = class_expr_fa [] c in
975
1031
let el = List.map label_expr el in
976
1032
mkpcl loc (Pcl_apply (class_expr ce) el)
977
| CeCon loc Ast.BFalse id tl ->
1033
| CeCon loc ViNil id tl ->
979
1035
(Pcl_constr (long_class_ident id) (List.map ctyp (list_of_opt_ctyp tl [])))
980
1036
| CeFun loc (PaLab _ lab po) ce ->
1009
1065
| CrCtr loc t1 t2 -> [Pcf_cstr (ctyp t1, ctyp t2, mkloc loc) :: l]
1010
1066
| <:class_str_item< $cst1$; $cst2$ >> ->
1011
1067
class_str_item cst1 (class_str_item cst2 l)
1012
| CrInh _ ce "" -> [Pcf_inher (class_expr ce) None :: l]
1013
| CrInh _ ce pb -> [Pcf_inher (class_expr ce) (Some pb) :: l]
1068
| CrInh loc ov ce pb ->
1069
let opb = if pb = "" then None else Some pb in
1070
[Pcf_inher (override_flag loc ov) (class_expr ce) opb :: l]
1014
1071
| CrIni _ e -> [Pcf_init (expr e) :: l]
1015
| CrMth loc s b e t ->
1072
| CrMth loc s ov pf e t ->
1018
1075
[ <:ctyp<>> -> None
1019
1076
| t -> Some (mkpolytype (ctyp t)) ] in
1020
1077
let e = mkexp loc (Pexp_poly (expr e) t) in
1021
[Pcf_meth (s, mkprivate b, e, mkloc loc) :: l]
1022
| CrVal loc s b e -> [Pcf_val (s, mkmutable b, expr e, mkloc loc) :: l]
1023
| CrVir loc s b t ->
1024
[Pcf_virt (s, mkprivate b, mkpolytype (ctyp t), mkloc loc) :: l]
1025
| CrVvr loc s b t ->
1026
[Pcf_valvirt (s, mkmutable b, ctyp t, mkloc loc) :: l]
1078
[Pcf_meth (s, mkprivate pf, override_flag loc ov, e, mkloc loc) :: l]
1079
| CrVal loc s ov mf e ->
1080
[Pcf_val (s, mkmutable mf, override_flag loc ov, expr e, mkloc loc) :: l]
1081
| CrVir loc s pf t ->
1082
[Pcf_virt (s, mkprivate pf, mkpolytype (ctyp t), mkloc loc) :: l]
1083
| CrVvr loc s mf t ->
1084
[Pcf_valvirt (s, mkmutable mf, ctyp t, mkloc loc) :: l]
1027
1085
| CrAnt _ _ -> assert False ];
1029
1087
value sig_item ast = sig_item ast [];