From aefb8988171d5eaf93514c02831e38857f58e2ee Mon Sep 17 00:00:00 2001 From: Hongbo Zhang Date: Oct 30 2013 15:29:33 +0000 Subject: this commit back-port several fixes relevant to camlp4: please see Changes for more details git-svn-id: http://caml.inria.fr/svn/ocaml/version/4.01@14253 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02 --- diff --git a/Changes b/Changes index 0b934d2..f81137f 100644 --- a/Changes +++ b/Changes @@ -101,6 +101,10 @@ Internals: Bug fixes: - PR#3236: Document the fact that queues are not thread-safe (Damien Doligez) +- PR#6175: Fix open! +- PR#5820: Fix camlp4 lexer roll back problem +- PR#4855: 'camlp4 -I +dir' accepted, dir is related to 'camlp4 -where' +- PR#6062: Fix a regression bug caused by commit 13047 - PR#3468: (part 1) Sys_error documentation (Damien Doligez) - PR#3679: Warning display problems @@ -377,7 +381,8 @@ Bug fixes: (Jacques Garrigue, report by Leo P. White) - PR#6164: segmentation fault on Num.power_num of 0/1 (Fabrice Le Fessant, report by Johannes Kanig) - +- PR#6210: Camlp4 location error + (Hongbo Zhang, report by Jun Furuse) Feature wishes: - PR#5181: Merge common floating point constants in ocamlopt (Benedikt Meurer) @@ -570,6 +575,7 @@ Installation procedure: (-runtime-variant) to select the debug runtime. Bug Fixes: + - PR#1643: functions of the Lazy module whose named started with 'lazy_' have been deprecated, and new ones without the prefix added - PR#3571: in Bigarrays, call msync() before unmapping to commit changes diff --git a/build/camlp4-bootstrap.sh b/build/camlp4-bootstrap.sh index 612e060..70600c0 100755 --- a/build/camlp4-bootstrap.sh +++ b/build/camlp4-bootstrap.sh @@ -34,9 +34,9 @@ for target in $TARGETS camlp4/boot/Camlp4Ast.ml; do done if [ -x ./boot/myocamlbuild.native ]; then - OCAMLBUILD=./boot/myocamlbuild.native + OCAMLBUILD=./boot/myocamlbuild.native -no-ocamlfind else - OCAMLBUILD="./boot/ocamlrun boot/myocamlbuild" + OCAMLBUILD="./boot/ocamlrun boot/myocamlbuild -no-ocamlfind" fi $OCAMLBUILD $TMPTARGETS $TARGETS diff --git a/camlp4/Camlp4/Camlp4Ast.partial.ml b/camlp4/Camlp4/Camlp4Ast.partial.ml index 2287437..d386951 100644 --- a/camlp4/Camlp4/Camlp4Ast.partial.ml +++ b/camlp4/Camlp4/Camlp4Ast.partial.ml @@ -200,7 +200,7 @@ (* while e do { e } *) | ExWhi of loc and expr and expr (* let open i in e *) - | ExOpI of loc and ident and expr + | ExOpI of loc and ident and override_flag and expr (* fun (type t) -> e *) (* let f x (type t) y z = e *) | ExFUN of loc and string and expr @@ -334,7 +334,7 @@ (* module type s = mt *) | StMty of loc and string and module_type (* open i *) - | StOpn of loc and ident + | StOpn of loc and override_flag and ident (* type t *) | StTyp of loc and ctyp (* value (rec)? bi *) diff --git a/camlp4/Camlp4/Printers/OCaml.ml b/camlp4/Camlp4/Printers/OCaml.ml index 338655f..7771ddf 100644 --- a/camlp4/Camlp4/Printers/OCaml.ml +++ b/camlp4/Camlp4/Printers/OCaml.ml @@ -493,9 +493,10 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | _ -> pp f "@[@[<2>let %a%a@]@ @[in@ %a@]@]" o#rec_flag r o#binding bi o#reset_semi#expr e ] - | <:expr< let open $i$ in $e$ >> -> - pp f "@[<2>let open %a@]@ @[<2>in@ %a@]" - o#ident i o#reset_semi#expr e + | Ast.ExOpI _loc i ov e -> + (* | <:expr< let open $i$ in $e$ >> -> *) + pp f "@[<2>let open%a %a@]@ @[<2>in@ %a@]" + o#override_flag ov o#ident i o#reset_semi#expr e | <:expr< match $e$ with [ $a$ ] >> -> pp f "@[@[@[<2>match %a@]@ with@]%a@]" o#expr e o#match_case a @@ -594,7 +595,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct <:expr< if $_$ then $_$ else $_$ >> | <:expr< let $rec:_$ $_$ in $_$ >> | <:expr< let module $_$ = $_$ in $_$ >> | - <:expr< let open $_$ in $_$ >> | + (* <:expr< let open $_$ in $_$ >> *)Ast.ExOpI _ _ _ _ | <:expr< assert $_$ >> | <:expr< assert False >> | <:expr< lazy $_$ >> | <:expr< new $_$ >> | <:expr< object ($_$) $_$ end >> -> @@ -866,8 +867,11 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | <:str_item< module type $s$ = $mt$ >> -> pp f "@[<2>module type %a =@ %a%(%)@]" o#var s o#module_type mt semisep - | <:str_item< open $sl$ >> -> - pp f "@[<2>open@ %a%(%)@]" o#ident sl semisep + | Ast.StOpn _loc ov sl -> + (* | <:str_item< open $sl$ >> -> *) + pp f "@[<2>open%a@ %a%(%)@]" + o#override_flag ov + o#ident sl semisep | <:str_item< type $t$ >> -> pp f "@[@[type %a@]%(%)@]" o#ctyp t semisep | <:str_item< value $rec:r$ $bi$ >> -> diff --git a/camlp4/Camlp4/Sig.ml b/camlp4/Camlp4/Sig.ml index bae3da5..02c1ef1 100644 --- a/camlp4/Camlp4/Sig.ml +++ b/camlp4/Camlp4/Sig.ml @@ -109,7 +109,9 @@ module type Loc = sig (** [merge loc1 loc2] Return a location that starts at [loc1] and end at [loc2]. *) value merge : t -> t -> t; - + (** [smart_merge loc1 loc2] Try to return a location that covers both [loc1] and [loc2]*) + + value smart_merge : t -> t -> t ; (** The stop pos becomes equal to the start pos. *) value join : t -> t; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml index 3c04214..c1468b9 100644 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml @@ -863,8 +863,9 @@ value varify_constructors var_names = | ExWhi loc e1 el -> let e2 = ExSeq loc el in mkexp loc (Pexp_while (expr e1) (expr e2)) - | <:expr@loc< let open $i$ in $e$ >> -> - mkexp loc (Pexp_open Fresh (long_uident i) (expr e)) + | ExOpI loc i ov e -> + let fresh = override_flag loc ov in + mkexp loc (Pexp_open fresh (long_uident i) (expr e)) | <:expr@loc< (module $me$ : $pt$) >> -> mkexp loc (Pexp_constraint (mkexp loc (Pexp_pack (module_expr me)), Some (mktyp loc (Ptyp_package (package_type pt))), None)) @@ -1074,8 +1075,9 @@ value varify_constructors var_names = | StRecMod loc mb -> [mkstr loc (Pstr_recmodule (module_str_binding mb [])) :: l] | StMty loc n mt -> [mkstr loc (Pstr_modtype (with_loc n loc) (module_type mt)) :: l] - | StOpn loc id -> - [mkstr loc (Pstr_open Fresh (long_uident id)) :: l] + | StOpn loc ov id -> + let fresh = override_flag loc ov in + [mkstr loc (Pstr_open fresh (long_uident id)) :: l] | StTyp loc tdl -> [mkstr loc (Pstr_type (mktype_decl tdl [])) :: l] | StVal loc rf bi -> [mkstr loc (Pstr_value (mkrf rf) (binding bi [])) :: l] diff --git a/camlp4/Camlp4/Struct/Lexer.mll b/camlp4/Camlp4/Struct/Lexer.mll index 6d5099a..41f1d04 100644 --- a/camlp4/Camlp4/Struct/Lexer.mll +++ b/camlp4/Camlp4/Struct/Lexer.mll @@ -144,7 +144,7 @@ module Make (Token : Sig.Camlp4Token) let is_in_comment c = c.in_comment let in_comment c = { (c) with in_comment = true } let set_start_p c = c.lexbuf.lex_start_p <- Loc.start_pos c.loc - let move_start_p shift c = + let move_start_p shift c = (* FIXME Please see PR#5820*) let p = c.lexbuf.lex_start_p in c.lexbuf.lex_start_p <- { (p) with pos_cnum = p.pos_cnum + shift } @@ -308,7 +308,8 @@ module Make (Token : Sig.Camlp4Token) parse comment (in_comment c); COMMENT (buff_contents c) } | "*)" { warn Comment_not_end (Loc.of_lexbuf lexbuf) ; - move_start_p (-1) c; SYMBOL "*" } + c.lexbuf.lex_curr_pos <- c.lexbuf.lex_curr_pos - 1; + SYMBOL "*" } | "<<" (quotchar* as beginning) { if quotations c then (move_start_p (-String.length beginning); diff --git a/camlp4/Camlp4/Struct/Loc.ml b/camlp4/Camlp4/Struct/Loc.ml index 2fd2c91..97f795f 100644 --- a/camlp4/Camlp4/Struct/Loc.ml +++ b/camlp4/Camlp4/Struct/Loc.ml @@ -98,6 +98,33 @@ value dump f x = value start_pos = { line = 1 ; bol = 0 ; off = 0 }; +value min_pos (x:pos) (y:pos) = + if x.off < y.off + then x + else y; +value max_pos (x:pos) (y:pos) = + if x.off > y.off + then x + else y; + +value smart_merge (a:t) (b:t) = + if a == b then a + else + match (a,b) with + [ ({ghost=False;start=a0;stop=a1;file_name = f}, + {ghost=False;start=b0;stop=b1;_}) -> + {ghost = False; + start = min_pos a0 b0; + stop = max_pos a1 b1; + file_name = f + } + | ({ghost = True;_},{ghost=True;_}) + | ({ghost = True;_},_) -> {(a) with stop = b.stop } + | ({ghost = _;_},{ghost = True;_}) -> + {(b) with start = a.start } + ] +; + value ghost = { file_name = "ghost-location"; start = start_pos; diff --git a/camlp4/Camlp4Bin.ml b/camlp4/Camlp4Bin.ml index ecc6431..51f5e5e 100644 --- a/camlp4/Camlp4Bin.ml +++ b/camlp4/Camlp4Bin.ml @@ -236,7 +236,7 @@ value input_file x = }; value initial_spec_list = - [("-I", Arg.String (fun x -> input_file (IncludeDir x)), + [("-I", Arg.String (fun x -> input_file (IncludeDir (Camlp4_import.Misc.expand_directory Camlp4_config.camlp4_standard_library x))), " Add directory in search patch for object files."); ("-where", Arg.Unit print_stdlib, "Print camlp4 library directory and exit."); diff --git a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml index 205afa9..6b5d6e1 100644 --- a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml @@ -496,7 +496,7 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct StringMap.add name (name, <:ident< $lid:name$ >>, tl, tk, False) acc | _ -> assert False ]; - value generate_class_implem mode c tydcl n = + value generate_class_implem ?(virtual_flag=False) mode c tydcl n = let tyMap = tyMap_of_type_decls tydcl StringMap.empty in let module M = Gen(struct value size = n; value mode = mode; end) in let generated = M.generate_structure tyMap in @@ -515,11 +515,13 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct <:ctyp< ! 'a . $M.method_type_of_type <:ctyp< 'a >> <:ctyp< 'a >> [] []$ >> in let unknown = - <:class_str_item< method unknown : $gen_type$ = $M.default_expr$ >> - in - <:str_item< class $lid:c$ = object (o : 'self_type) $generated$; $failure$; $unknown$ end >>; + <:class_str_item< method unknown : $gen_type$ = $M.default_expr$ >> in + if not virtual_flag then + <:str_item< class $lid:c$ = object (o : 'self_type) $generated$; $failure$; $unknown$ end >> + else + <:str_item< class virtual $lid:c$ = object (o : 'self_type) $generated$; $failure$; $unknown$ end >>; - value generate_class_interf mode c tydcl n = + value generate_class_interf ?(virtual_flag=False) mode c tydcl n = let tyMap = tyMap_of_type_decls tydcl StringMap.empty in let module M = Gen(struct value size = n; value mode = mode; end) in let generated = M.generate_signature tyMap in @@ -538,7 +540,10 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct let unknown = <:class_sig_item< method unknown : $gen_type$ >> in - <:sig_item< class $lid:c$ : object ('self_type) $generated$; $failure$; $unknown$ end >>; + if not virtual_flag then + <:sig_item< class $lid:c$ : object ('self_type) $generated$; $failure$; $unknown$ end >> + else + <:sig_item< class virtual $lid:c$ : object ('self_type) $generated$; $failure$; $unknown$ end >> ; value processor = let last = ref <:ctyp<>> in @@ -565,12 +570,19 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct (* backward compatibility *) | <:str_item@_loc< class $lid:c$ = Camlp4Filters.GenerateFold.generated >> -> generate_class_implem Fold c last.val 1 + | <:str_item@_loc< class virtual $lid:c$ = Camlp4Filters.GenerateFold.generated >> -> + generate_class_implem ~virtual_flag:True Fold c last.val 1 + | <:str_item@_loc< class $lid:c$ = Camlp4Filters.GenerateMap.generated >> -> generate_class_implem Map c last.val 1 + | <:str_item@_loc< class virtual $lid:c$ = Camlp4Filters.GenerateMap.generated >> -> + generate_class_implem ~virtual_flag:True Map c last.val 1 (* Handle Camlp4(Fold|Map|FoldMap)\d*Generator *) | <:str_item@_loc< class $lid:c$ = $uid:m$.generated >> -> - generate_class_from_module_name generate_class_implem c st m + generate_class_from_module_name (generate_class_implem ~virtual_flag:False) c st m + | <:str_item@_loc< class virtual $lid:c$ = $uid:m$.generated >> -> + generate_class_from_module_name (generate_class_implem ~virtual_flag:True) c st m (* It's a hack to force to recurse on the left to right order *) | <:str_item< $st1$; $st2$ >> -> @@ -586,12 +598,19 @@ module Make (AstFilters : Camlp4.Sig.AstFilters) = struct (* backward compatibility *) | <:sig_item@_loc< class $lid:c$ : Camlp4Filters.GenerateFold.generated >> -> generate_class_interf Fold c last.val 1 + | <:sig_item@_loc< class virtual $lid:c$ : Camlp4Filters.GenerateFold.generated >> -> + generate_class_interf ~virtual_flag:True Fold c last.val 1 + | <:sig_item@_loc< class $lid:c$ : Camlp4Filters.GenerateMap.generated >> -> generate_class_interf Map c last.val 1 + | <:sig_item@_loc< class virtual $lid:c$ : Camlp4Filters.GenerateMap.generated >> -> + generate_class_interf ~virtual_flag:True Map c last.val 1 (* Handle Camlp4(Fold|Map|FoldMap)\d*Generator *) | <:sig_item@_loc< class $lid:c$ : $uid:m$.generated >> -> - generate_class_from_module_name generate_class_interf c sg m + generate_class_from_module_name (generate_class_interf ~virtual_flag:False) c sg m + | <:sig_item@_loc< class virtual $lid:c$ : $uid:m$.generated >> -> + generate_class_from_module_name (generate_class_interf ~virtual_flag:True) c sg m (* It's a hack to force to recurse on the left to right order *) | <:sig_item< $sg1$; $sg2$ >> -> diff --git a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml index 840bc5e..bf7f69c 100644 --- a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml @@ -248,7 +248,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct defined.val := list_remove x defined.val; } with - [ Not_found -> () ]; + [ Struct.Grammar.Delete.Rule_not_found _ -> () ]; value parse_def s = match Gram.parse_string expr (Loc.mk "") s with diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml index d32fad9..50318a2 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml @@ -145,6 +145,7 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct DELETE_RULE Gram meth_list: meth_decl; opt_dot_dot END; DELETE_RULE Gram expr: "let"; opt_rec; binding; "in"; SELF END; DELETE_RULE Gram expr: "let"; "module"; a_UIDENT; module_binding0; "in"; SELF END; + DELETE_RULE Gram expr: "let"; "open"; "!"; module_longident; "in"; SELF END; DELETE_RULE Gram expr: "let"; "open"; module_longident; "in"; SELF END; DELETE_RULE Gram expr: "fun"; "["; LIST0 match_case0 SEP "|"; "]" END; DELETE_RULE Gram expr: "if"; SELF; "then"; SELF; "else"; SELF END; @@ -254,6 +255,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | _ -> <:str_item< value $rec:r$ $bi$ >> ] | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = expr -> <:str_item< let module $m$ = $mb$ in $e$ >> + | "let"; "open"; "!"; i = module_longident; "in"; e = expr -> + <:str_item< let open! $id:i$ in $e$ >> | "let"; "open"; i = module_longident; "in"; e = expr -> <:str_item< let open $id:i$ in $e$ >> ] ] @@ -272,6 +275,8 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = expr LEVEL ";" -> <:expr< let module $m$ = $mb$ in $e$ >> + | "let"; "open"; "!"; i = module_longident; "in"; e = expr LEVEL ";" -> + <:expr< let open! $id:i$ in $e$ >> | "let"; "open"; i = module_longident; "in"; e = expr LEVEL ";" -> <:expr< let open $id:i$ in $e$ >> | "function"; a = match_case -> @@ -528,8 +533,18 @@ module Make (Syntax : Sig.Camlp4Syntax) = struct meth_list: [ [ m = meth_decl -> (m, <:row_var_flag<>>) ] ]; comma_ctyp_app: - [ [ t1 = ctyp; ","; t2 = SELF -> fun acc -> t2 <:ctyp< $acc$ $t1$ >> - | t = ctyp -> fun acc -> <:ctyp< $acc$ $t$ >> + [ [ t1 = ctyp; ","; t2 = SELF -> + fun acc -> + let loc1 = Ast.loc_of_ctyp t1 in + let loc2 = Ast.loc_of_ctyp acc in + let _loc = Loc.smart_merge loc1 loc2 in + t2 <:ctyp< $acc$ $t1$ >> + | t = ctyp -> + fun acc -> + let loc1 = Ast.loc_of_ctyp t in + let loc2 = Ast.loc_of_ctyp acc in + let _loc = Loc.smart_merge loc1 loc2 in + <:ctyp< $acc$ $t$ >> ] ] ; star_ctyp: diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml index ffca679..54b2c28 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml @@ -370,9 +370,9 @@ New syntax:\ parser [ [: `((KEYWORD "(", _) as tok); xs :] -> match xs with parser - [ [: `(KEYWORD ("or"|"mod"|"land"|"lor"|"lxor"|"lsl"|"lsr"|"asr" as i), _loc); - `(KEYWORD ")", _); xs :] -> - [: `(LIDENT i, _loc); infix_kwds_filter xs :] + [ [: `(KEYWORD ("or"|"mod"|"land"|"lor"|"lxor"|"lsl"|"lsr"|"asr"|"*" as i) , _loc); + `(KEYWORD ")" , _); xs :] -> + [: `(LIDENT i, _loc); infix_kwds_filter xs :] | [: xs :] -> [: `tok; infix_kwds_filter xs :] ] | [: `x; xs :] -> [: `x; infix_kwds_filter xs :] ]; @@ -473,7 +473,11 @@ New syntax:\ <:str_item< module rec $mb$ >> | "module"; "type"; i = a_ident; "="; mt = module_type -> <:str_item< module type $i$ = $mt$ >> - | "open"; i = module_longident -> <:str_item< open $i$ >> + | "open"; "!"; i = module_longident -> Ast.StOpn _loc Ast.OvOverride i + | "open"; i = module_longident -> + Ast.StOpn _loc Ast.OvNil i + (* <:str_item< open $i$ >> *) + | "type"; td = type_declaration -> <:str_item< type $td$ >> | value_let; r = opt_rec; bi = binding -> @@ -551,7 +555,8 @@ New syntax:\ <:sig_item< module type $i$ = $mt$ >> | "module"; "type"; i = a_ident -> <:sig_item< module type $i$ >> - | "open"; i = module_longident -> <:sig_item< open $i$ >> + | "open"; i = module_longident -> + <:sig_item< open $i$ >> | "type"; t = type_declaration -> <:sig_item< type $t$ >> | value_val; i = a_LIDENT; ":"; t = ctyp -> @@ -601,6 +606,9 @@ New syntax:\ <:expr< let $rec:r$ $bi$ in $x$ >> | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = SELF -> <:expr< let module $m$ = $mb$ in $e$ >> + + | "let"; "open"; "!"; i = module_longident; "in"; e = SELF -> + <:expr< let open! $id:i$ in $e$>> | "let"; "open"; i = module_longident; "in"; e = SELF -> <:expr< let open $id:i$ in $e$ >> | "fun"; "["; a = LIST0 match_case0 SEP "|"; "]" -> @@ -696,7 +704,7 @@ New syntax:\ | s = a_STRING -> <:expr< $str:s$ >> | s = a_CHAR -> <:expr< $chr:s$ >> | i = TRY module_longident_dot_lparen; e = sequence; ")" -> - <:expr< let open $i$ in $e$ >> + <:expr< let open $i$ in $e$ >> | i = TRY val_longident -> <:expr< $id:i$ >> | "`"; s = a_ident -> <:expr< ` $s$ >> | "["; "]" -> <:expr< [] >> @@ -769,6 +777,9 @@ New syntax:\ k <:expr< let module $m$ = $mb$ in $e$ >> | "let"; "module"; m = a_UIDENT; mb = module_binding0; ";"; el = SELF -> <:expr< let module $m$ = $mb$ in $mksequence _loc el$ >> + + | "let"; "open"; "!"; i = module_longident; "in"; e = SELF -> + <:expr< let open! $id:i$ in $e$ >> | "let"; "open"; i = module_longident; "in"; e = SELF -> <:expr< let open $id:i$ in $e$ >> | `ANTIQUOT ("list" as n) s -> <:expr< $anti:mk_anti ~c:"expr;" n s$ >> diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index 2a6a4fb..672ebd9 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -1068,7 +1068,7 @@ module Sig = | (* while e do { e } *) ExWhi of loc * expr * expr | (* let open i in e *) - ExOpI of loc * ident * expr + ExOpI of loc * ident * override_flag * expr | (* fun (type t) -> e *) (* let f x (type t) y z = e *) ExFUN of loc * string * expr @@ -1214,7 +1214,7 @@ module Sig = | (* module type s = mt *) StMty of loc * string * module_type | (* open i *) - StOpn of loc * ident + StOpn of loc * override_flag * ident | (* type t *) StTyp of loc * ctyp | (* value (rec)? bi *) @@ -1878,7 +1878,7 @@ module Sig = | ExTyc of loc * expr * ctyp | ExVrn of loc * string | ExWhi of loc * expr * expr - | ExOpI of loc * ident * expr + | ExOpI of loc * ident * override_flag * expr | ExFUN of loc * string * expr | ExPkg of loc * module_expr and module_type = @@ -1957,7 +1957,7 @@ module Sig = | StMod of loc * string * module_expr | StRecMod of loc * module_binding | StMty of loc * string * module_type - | StOpn of loc * ident + | StOpn of loc * override_flag * ident | StTyp of loc * ctyp | StVal of loc * rec_flag * binding | StAnt of loc * string @@ -6464,7 +6464,7 @@ module Struct = COMMENT (buff_contents c)) | 17 -> (warn Comment_not_end (Loc.of_lexbuf lexbuf); - move_start_p (-1) c; + c.lexbuf.lex_curr_pos <- c.lexbuf.lex_curr_pos - 1; SYMBOL "*") | 18 -> let beginning = @@ -8281,17 +8281,19 @@ module Struct = (meta_loc _loc x0))), (meta_string _loc x1))), (meta_expr _loc x2)) - | Ast.ExOpI (x0, x1, x2) -> + | Ast.ExOpI (x0, x1, x2, x3) -> Ast.ExApp (_loc, (Ast.ExApp (_loc, (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOpI")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_expr _loc x2)) + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "ExOpI")))))), + (meta_loc _loc x0))), + (meta_ident _loc x1))), + (meta_override_flag _loc x2))), + (meta_expr _loc x3)) | Ast.ExWhi (x0, x1, x2) -> Ast.ExApp (_loc, (Ast.ExApp (_loc, @@ -9537,15 +9539,17 @@ module Struct = (Ast.IdUid (_loc, "StTyp")))))), (meta_loc _loc x0))), (meta_ctyp _loc x1)) - | Ast.StOpn (x0, x1) -> + | Ast.StOpn (x0, x1, x2) -> Ast.ExApp (_loc, (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StOpn")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) + (Ast.ExApp (_loc, + (Ast.ExId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "StOpn")))))), + (meta_loc _loc x0))), + (meta_override_flag _loc x1))), + (meta_ident _loc x2)) | Ast.StMty (x0, x1, x2) -> Ast.ExApp (_loc, (Ast.ExApp (_loc, @@ -10612,17 +10616,19 @@ module Struct = (meta_loc _loc x0))), (meta_string _loc x1))), (meta_expr _loc x2)) - | Ast.ExOpI (x0, x1, x2) -> + | Ast.ExOpI (x0, x1, x2, x3) -> Ast.PaApp (_loc, (Ast.PaApp (_loc, (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOpI")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_expr _loc x2)) + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "ExOpI")))))), + (meta_loc _loc x0))), + (meta_ident _loc x1))), + (meta_override_flag _loc x2))), + (meta_expr _loc x3)) | Ast.ExWhi (x0, x1, x2) -> Ast.PaApp (_loc, (Ast.PaApp (_loc, @@ -11868,15 +11874,17 @@ module Struct = (Ast.IdUid (_loc, "StTyp")))))), (meta_loc _loc x0))), (meta_ctyp _loc x1)) - | Ast.StOpn (x0, x1) -> + | Ast.StOpn (x0, x1, x2) -> Ast.PaApp (_loc, (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StOpn")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) + (Ast.PaApp (_loc, + (Ast.PaId (_loc, + (Ast.IdAcc (_loc, + (Ast.IdUid (_loc, "Ast")), + (Ast.IdUid (_loc, "StOpn")))))), + (meta_loc _loc x0))), + (meta_override_flag _loc x1))), + (meta_ident _loc x2)) | Ast.StMty (x0, x1, x2) -> Ast.PaApp (_loc, (Ast.PaApp (_loc, @@ -12173,9 +12181,10 @@ module Struct = let _x_i1 = o#string _x_i1 in let _x_i2 = o#module_type _x_i2 in StMty (_x, _x_i1, _x_i2) - | StOpn (_x, _x_i1) -> + | StOpn (_x, _x_i1, _x_i2) -> let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in StOpn (_x, _x_i1) + let _x_i1 = o#override_flag _x_i1 in + let _x_i2 = o#ident _x_i2 in StOpn (_x, _x_i1, _x_i2) | StTyp (_x, _x_i1) -> let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in StTyp (_x, _x_i1) @@ -12683,10 +12692,12 @@ module Struct = let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in let _x_i2 = o#expr _x_i2 in ExWhi (_x, _x_i1, _x_i2) - | ExOpI (_x, _x_i1, _x_i2) -> + | ExOpI (_x, _x_i1, _x_i2, _x_i3) -> let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#expr _x_i2 in ExOpI (_x, _x_i1, _x_i2) + let _x_i2 = o#override_flag _x_i2 in + let _x_i3 = o#expr _x_i3 + in ExOpI (_x, _x_i1, _x_i2, _x_i3) | ExFUN (_x, _x_i1, _x_i2) -> let _x = o#loc _x in let _x_i1 = o#string _x_i1 in @@ -13107,8 +13118,10 @@ module Struct = let o = o#loc _x in let o = o#string _x_i1 in let o = o#module_type _x_i2 in o - | StOpn (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o + | StOpn (_x, _x_i1, _x_i2) -> + let o = o#loc _x in + let o = o#override_flag _x_i1 in + let o = o#ident _x_i2 in o | StTyp (_x, _x_i1) -> let o = o#loc _x in let o = o#ctyp _x_i1 in o | StVal (_x, _x_i1, _x_i2) -> @@ -13497,9 +13510,11 @@ module Struct = | ExWhi (_x, _x_i1, _x_i2) -> let o = o#loc _x in let o = o#expr _x_i1 in let o = o#expr _x_i2 in o - | ExOpI (_x, _x_i1, _x_i2) -> + | ExOpI (_x, _x_i1, _x_i2, _x_i3) -> let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 in o + let o = o#ident _x_i1 in + let o = o#override_flag _x_i2 in + let o = o#expr _x_i3 in o | ExFUN (_x, _x_i1, _x_i2) -> let o = o#loc _x in let o = o#string _x_i1 in let o = o#expr _x_i2 in o @@ -15171,8 +15186,9 @@ module Struct = | ExWhi (loc, e1, el) -> let e2 = ExSeq (loc, el) in mkexp loc (Pexp_while ((expr e1), (expr e2))) - | Ast.ExOpI (loc, i, e) -> - mkexp loc (Pexp_open (Fresh, (long_uident i), (expr e))) + | ExOpI (loc, i, ov, e) -> + let fresh = override_flag loc ov + in mkexp loc (Pexp_open (fresh, (long_uident i), (expr e))) | Ast.ExPkg (loc, (Ast.MeTyc (_, me, pt))) -> mkexp loc (Pexp_constraint @@ -15461,8 +15477,9 @@ module Struct = (mkstr loc (Pstr_modtype ((with_loc n loc), (module_type mt)))) :: l - | StOpn (loc, id) -> - (mkstr loc (Pstr_open (Fresh, (long_uident id)))) :: l + | StOpn (loc, ov, id) -> + let fresh = override_flag loc ov + in (mkstr loc (Pstr_open (fresh, (long_uident id)))) :: l | StTyp (loc, tdl) -> (mkstr loc (Pstr_type (mktype_decl tdl []))) :: l | StVal (loc, rf, bi) -> @@ -19439,9 +19456,9 @@ module Printers = "@[@[<2>let %a%a@]@ @[in@ %a@]@]" o#rec_flag r o#binding bi o#reset_semi#expr e) - | Ast.ExOpI (_, i, e) -> - pp f "@[<2>let open %a@]@ @[<2>in@ %a@]" o#ident i - o#reset_semi#expr e + | Ast.ExOpI (_loc, i, ov, e) -> + pp f "@[<2>let open%a %a@]@ @[<2>in@ %a@]" + o#override_flag ov o#ident i o#reset_semi#expr e | Ast.ExMat (_, e, a) -> pp f "@[@[@[<2>match %a@]@ with@]%a@]" o#expr e o#match_case a @@ -19559,7 +19576,7 @@ module Printers = Ast.ExFun (_, _) | Ast.ExFUN (_, _, _) | Ast.ExMat (_, _, _) | Ast.ExTry (_, _, _) | Ast.ExIfe (_, _, _, _) | Ast.ExLet (_, _, _, _) | - Ast.ExLmd (_, _, _, _) | Ast.ExOpI (_, _, _) | + Ast.ExLmd (_, _, _, _) | Ast.ExOpI (_, _, _, _) | Ast.ExAsr (_, _) | Ast.ExAsf _ | Ast.ExLaz (_, _) | Ast.ExNew (_, _) | Ast.ExObj (_, _, _) -> pp f "(%a)" o#reset#expr e @@ -19914,8 +19931,9 @@ module Printers = | Ast.StMty (_, s, mt) -> pp f "@[<2>module type %a =@ %a%(%)@]" o#var s o#module_type mt semisep - | Ast.StOpn (_, sl) -> - pp f "@[<2>open@ %a%(%)@]" o#ident sl semisep + | Ast.StOpn (_loc, ov, sl) -> + pp f "@[<2>open%a@ %a%(%)@]" o#override_flag ov + o#ident sl semisep | Ast.StTyp (_, t) -> pp f "@[@[type %a@]%(%)@]" o#ctyp t semisep diff --git a/camlp4/boot/Camlp4Ast.ml b/camlp4/boot/Camlp4Ast.ml index 0b9a3de..1ceaa78 100644 --- a/camlp4/boot/Camlp4Ast.ml +++ b/camlp4/boot/Camlp4Ast.ml @@ -1247,16 +1247,18 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (meta_loc _loc x0)) (meta_string _loc x1)) (meta_expr _loc x2) - | Ast.ExOpI x0 x1 x2 -> + | Ast.ExOpI x0 x1 x2 x3 -> Ast.ExApp _loc (Ast.ExApp _loc (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOpI"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_expr _loc x2) + (Ast.ExApp _loc + (Ast.ExId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "ExOpI"))) + (meta_loc _loc x0)) + (meta_ident _loc x1)) + (meta_override_flag _loc x2)) + (meta_expr _loc x3) | Ast.ExWhi x0 x1 x2 -> Ast.ExApp _loc (Ast.ExApp _loc @@ -2388,14 +2390,16 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (Ast.IdUid _loc "StTyp"))) (meta_loc _loc x0)) (meta_ctyp _loc x1) - | Ast.StOpn x0 x1 -> + | Ast.StOpn x0 x1 x2 -> Ast.ExApp _loc (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StOpn"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) + (Ast.ExApp _loc + (Ast.ExId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "StOpn"))) + (meta_loc _loc x0)) + (meta_override_flag _loc x1)) + (meta_ident _loc x2) | Ast.StMty x0 x1 x2 -> Ast.ExApp _loc (Ast.ExApp _loc @@ -3354,16 +3358,18 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (meta_loc _loc x0)) (meta_string _loc x1)) (meta_expr _loc x2) - | Ast.ExOpI x0 x1 x2 -> + | Ast.ExOpI x0 x1 x2 x3 -> Ast.PaApp _loc (Ast.PaApp _loc (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOpI"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_expr _loc x2) + (Ast.PaApp _loc + (Ast.PaId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "ExOpI"))) + (meta_loc _loc x0)) + (meta_ident _loc x1)) + (meta_override_flag _loc x2)) + (meta_expr _loc x3) | Ast.ExWhi x0 x1 x2 -> Ast.PaApp _loc (Ast.PaApp _loc @@ -4495,14 +4501,16 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = (Ast.IdUid _loc "StTyp"))) (meta_loc _loc x0)) (meta_ctyp _loc x1) - | Ast.StOpn x0 x1 -> + | Ast.StOpn x0 x1 x2 -> Ast.PaApp _loc (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StOpn"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) + (Ast.PaApp _loc + (Ast.PaId _loc + (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") + (Ast.IdUid _loc "StOpn"))) + (meta_loc _loc x0)) + (meta_override_flag _loc x1)) + (meta_ident _loc x2) | Ast.StMty x0 x1 x2 -> Ast.PaApp _loc (Ast.PaApp _loc @@ -4770,9 +4778,10 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = let _x = o#loc _x in let _x_i1 = o#string _x_i1 in let _x_i2 = o#module_type _x_i2 in StMty _x _x_i1 _x_i2 - | StOpn _x _x_i1 -> + | StOpn _x _x_i1 _x_i2 -> let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in StOpn _x _x_i1 + let _x_i1 = o#override_flag _x_i1 in + let _x_i2 = o#ident _x_i2 in StOpn _x _x_i1 _x_i2 | StTyp _x _x_i1 -> let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in StTyp _x _x_i1 | StVal _x _x_i1 _x_i2 -> @@ -5253,10 +5262,11 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in let _x_i2 = o#expr _x_i2 in ExWhi _x _x_i1 _x_i2 - | ExOpI _x _x_i1 _x_i2 -> + | ExOpI _x _x_i1 _x_i2 _x_i3 -> let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#expr _x_i2 in ExOpI _x _x_i1 _x_i2 + let _x_i2 = o#override_flag _x_i2 in + let _x_i3 = o#expr _x_i3 in ExOpI _x _x_i1 _x_i2 _x_i3 | ExFUN _x _x_i1 _x_i2 -> let _x = o#loc _x in let _x_i1 = o#string _x_i1 in @@ -5637,7 +5647,9 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = | StMty _x _x_i1 _x_i2 -> let o = o#loc _x in let o = o#string _x_i1 in let o = o#module_type _x_i2 in o - | StOpn _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o + | StOpn _x _x_i1 _x_i2 -> + let o = o#loc _x in + let o = o#override_flag _x_i1 in let o = o#ident _x_i2 in o | StTyp _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o | StVal _x _x_i1 _x_i2 -> let o = o#loc _x in @@ -5962,9 +5974,10 @@ module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = | ExWhi _x _x_i1 _x_i2 -> let o = o#loc _x in let o = o#expr _x_i1 in let o = o#expr _x_i2 in o - | ExOpI _x _x_i1 _x_i2 -> + | ExOpI _x _x_i1 _x_i2 _x_i3 -> let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 in o + let o = o#ident _x_i1 in + let o = o#override_flag _x_i2 in let o = o#expr _x_i3 in o | ExFUN _x _x_i1 _x_i2 -> let o = o#loc _x in let o = o#string _x_i1 in let o = o#expr _x_i2 in o diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index fff2a1f..4065ec3 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -683,7 +683,7 @@ New syntax:\ | Some ((KEYWORD (("or" | "mod" | "land" | "lor" | "lxor" | "lsl" | - "lsr" | "asr" + "lsr" | "asr" | "*" as i)), _loc)) -> @@ -931,7 +931,8 @@ New syntax:\ and _ = (a_INT : 'a_INT Gram.Entry.t) and _ = (a_FLOAT : 'a_FLOAT Gram.Entry.t) in let grammar_entry_create = Gram.Entry.mk in - let (* Here it's LABEL and not tilde_label since ~a:b is different than ~a : b *) + let (* <:str_item< open $i$ >> *) + (* Here it's LABEL and not tilde_label since ~a:b is different than ~a : b *) (* Same remark for ?a:b *) infixop5 : 'infixop5 Gram.Entry.t = grammar_entry_create "infixop5" and (* | i = opt_label; "("; p = patt_tcon; ")" -> *) @@ -1175,7 +1176,18 @@ New syntax:\ (Gram.Action.mk (fun (i : 'module_longident) _ (_loc : Gram.Loc.t) -> - (Ast.StOpn (_loc, i) : 'str_item)))); + (Ast.StOpn (_loc, Ast.OvNil, i) : + 'str_item)))); + ([ Gram.Skeyword "open"; Gram.Skeyword "!"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)) ], + (Gram.Action.mk + (fun (i : 'module_longident) _ _ + (_loc : Gram.Loc.t) -> + (Ast.StOpn (_loc, Ast.OvOverride, i) : + 'str_item)))); ([ Gram.Skeyword "module"; Gram.Skeyword "type"; Gram.Snterm (Gram.Entry.obj @@ -2028,7 +2040,19 @@ New syntax:\ (Gram.Action.mk (fun (e : 'expr) _ (i : 'module_longident) _ _ (_loc : Gram.Loc.t) -> - (Ast.ExOpI (_loc, i, e) : 'expr)))); + (Ast.ExOpI (_loc, i, Ast.OvNil, e) : 'expr)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Skeyword "!"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'expr) _ (i : 'module_longident) _ _ + _ (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, Ast.OvOverride, e) : + 'expr)))); ([ Gram.Skeyword "let"; Gram.Skeyword "module"; Gram.Snterm (Gram.Entry.obj @@ -2599,7 +2623,7 @@ New syntax:\ (fun _ (e : 'sequence) (i : 'module_longident_dot_lparen) (_loc : Gram.Loc.t) -> - (Ast.ExOpI (_loc, i, e) : 'expr)))); + (Ast.ExOpI (_loc, i, Ast.OvNil, e) : 'expr)))); ([ Gram.Snterm (Gram.Entry.obj (a_CHAR : 'a_CHAR Gram.Entry.t)) ], @@ -2948,7 +2972,20 @@ New syntax:\ (Gram.Action.mk (fun (e : 'sequence) _ (i : 'module_longident) _ _ (_loc : Gram.Loc.t) -> - (Ast.ExOpI (_loc, i, e) : 'sequence)))); + (Ast.ExOpI (_loc, i, Ast.OvNil, e) : + 'sequence)))); + ([ Gram.Skeyword "let"; Gram.Skeyword "open"; + Gram.Skeyword "!"; + Gram.Snterm + (Gram.Entry.obj + (module_longident : + 'module_longident Gram.Entry.t)); + Gram.Skeyword "in"; Gram.Sself ], + (Gram.Action.mk + (fun (e : 'sequence) _ (i : 'module_longident) + _ _ _ (_loc : Gram.Loc.t) -> + (Ast.ExOpI (_loc, i, Ast.OvOverride, e) : + 'sequence)))); ([ Gram.Skeyword "let"; Gram.Skeyword "module"; Gram.Snterm (Gram.Entry.obj @@ -14264,7 +14301,7 @@ Added statements: Gram.Sself ]) | None -> ()); defined := list_remove x !defined) - with | Not_found -> () + with | Struct.Grammar.Delete.Rule_not_found _ -> () let parse_def s = match Gram.parse_string expr (Loc.mk "") s with @@ -15953,7 +15990,13 @@ You should give the -noassert option to the ocaml compiler instead.@." !rcall_callback ()) let initial_spec_list = - [ ("-I", (Arg.String (fun x -> input_file (IncludeDir x))), + [ ("-I", + (Arg.String + (fun x -> + input_file + (IncludeDir + (Camlp4_import.Misc.expand_directory Camlp4_config. + camlp4_standard_library x)))), " Add directory in search patch for object files."); ("-where", (Arg.Unit print_stdlib), "Print camlp4 library directory and exit.");