summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pouillard <np@nicolaspouillard.fr>2010-05-11 14:24:44 +0000
committerNicolas Pouillard <np@nicolaspouillard.fr>2010-05-11 14:24:44 +0000
commit03aaba0aae333793c06b50b3dc4684bd6a8dc152 (patch)
treec0e60b898b6d4fc970dac37b0d0514087b8f92ca
parentb8cef86ba3d8a926de901c15c282955cde9f6b1a (diff)
downloadocaml-03aaba0aae333793c06b50b3dc4684bd6a8dc152.tar.gz
Merge remote branch 'ocaml-git/buildsys' into trunk
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@10388 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml6
-rw-r--r--camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml2
-rw-r--r--camlp4/boot/Camlp4.ml11
-rw-r--r--camlp4/boot/camlp4boot.ml19
4 files changed, 34 insertions, 4 deletions
diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml
index dc5192bf03..de6e8add48 100644
--- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml
+++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml
@@ -490,7 +490,11 @@ module Make (Ast : Sig.Camlp4Ast) = struct
mkrangepat loc c1 c2
| _ -> error loc "range pattern allowed only for characters" ]
| PaRec loc p ->
- mkpat loc (Ppat_record (List.map mklabpat (list_of_patt p []), Closed))
+ let ps = list_of_patt p [] in
+ let is_wildcard = fun [ <:patt< _ >> -> True | _ -> False ] in
+ let (wildcards,ps) = List.partition is_wildcard ps in
+ let is_closed = if wildcards = [] then Closed else Open in
+ mkpat loc (Ppat_record (List.map mklabpat ps, is_closed))
| PaStr loc s ->
mkpat loc (Ppat_constant (Const_string (string_of_string_token loc s)))
| <:patt@loc< ($p1$, $p2$) >> ->
diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml
index 9dab8bd747..b51c493244 100644
--- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml
+++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml
@@ -909,6 +909,8 @@ Very old (no more supported) syntax:\n\
;
label_patt_list:
[ [ p1 = label_patt; ";"; p2 = SELF -> <:patt< $p1$ ; $p2$ >>
+ | p1 = label_patt; ";"; "_" -> <:patt< $p1$ ; _ >>
+ | p1 = label_patt; ";"; "_"; ";" -> <:patt< $p1$ ; _ >>
| p1 = label_patt; ";" -> p1
| p1 = label_patt -> p1
] ];
diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml
index 6d948e5aea..9e49f8f872 100644
--- a/camlp4/boot/Camlp4.ml
+++ b/camlp4/boot/Camlp4.ml
@@ -13889,9 +13889,14 @@ module Struct =
| _ ->
error loc "range pattern allowed only for characters")
| PaRec (loc, p) ->
- mkpat loc
- (Ppat_record
- (((List.map mklabpat (list_of_patt p [])), Closed)))
+ let ps = list_of_patt p [] in
+ let is_wildcard =
+ (function | Ast.PaAny _ -> true | _ -> false) in
+ let (wildcards, ps) = List.partition is_wildcard ps in
+ let is_closed = if wildcards = [] then Closed else Open
+ in
+ mkpat loc
+ (Ppat_record (((List.map mklabpat ps), is_closed)))
| PaStr (loc, s) ->
mkpat loc
(Ppat_constant
diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml
index 8b5537a54e..9e9ef23275 100644
--- a/camlp4/boot/camlp4boot.ml
+++ b/camlp4/boot/camlp4boot.ml
@@ -3676,6 +3676,25 @@ Very old (no more supported) syntax:\n\
([ Gram.Snterm
(Gram.Entry.obj
(label_patt : 'label_patt Gram.Entry.t));
+ Gram.Skeyword ";"; Gram.Skeyword "_";
+ Gram.Skeyword ";" ],
+ (Gram.Action.mk
+ (fun _ _ _ (p1 : 'label_patt)
+ (_loc : Gram.Loc.t) ->
+ (Ast.PaSem (_loc, p1, Ast.PaAny _loc) :
+ 'label_patt_list))));
+ ([ Gram.Snterm
+ (Gram.Entry.obj
+ (label_patt : 'label_patt Gram.Entry.t));
+ Gram.Skeyword ";"; Gram.Skeyword "_" ],
+ (Gram.Action.mk
+ (fun _ _ (p1 : 'label_patt) (_loc : Gram.Loc.t)
+ ->
+ (Ast.PaSem (_loc, p1, Ast.PaAny _loc) :
+ 'label_patt_list))));
+ ([ Gram.Snterm
+ (Gram.Entry.obj
+ (label_patt : 'label_patt Gram.Entry.t));
Gram.Skeyword ";"; Gram.Sself ],
(Gram.Action.mk
(fun (p2 : 'label_patt_list) _