Blame camlp4/Camlp4/OCamlInitSyntax.ml

Packit 1f8b6b
(****************************************************************************)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*                                   OCaml                                  *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*                            INRIA Rocquencourt                            *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(*  Copyright  2006   Institut National de Recherche  en  Informatique et   *)
Packit 1f8b6b
(*  en Automatique.  All rights reserved.  This file is distributed under   *)
Packit 1f8b6b
(*  the terms of the GNU Library General Public License, with the special   *)
Packit 1f8b6b
(*  exception on linking described in LICENSE at the top of the Camlp4      *)
Packit 1f8b6b
(*  source tree.                                                            *)
Packit 1f8b6b
(*                                                                          *)
Packit 1f8b6b
(****************************************************************************)
Packit 1f8b6b
Packit 1f8b6b
(* Authors:
Packit 1f8b6b
 * - Nicolas Pouillard: initial version
Packit 1f8b6b
 *)
Packit 1f8b6b
Packit 1f8b6b
module Make (Ast     : Sig.Camlp4Ast)
Packit 1f8b6b
            (Gram    : Sig.Grammar.Static with module Loc = Ast.Loc
Packit 1f8b6b
                                            with type Token.t = Sig.camlp4_token)
Packit 1f8b6b
            (Quotation : Sig.Quotation with module Ast = Sig.Camlp4AstToAst Ast)
Packit 1f8b6b
: Sig.Camlp4Syntax with module Loc = Ast.Loc
Packit 1f8b6b
                    and module Ast = Ast
Packit 1f8b6b
                    and module Token = Gram.Token
Packit 1f8b6b
                    and module Gram = Gram
Packit 1f8b6b
                    and module Quotation = Quotation
Packit 1f8b6b
= struct
Packit 1f8b6b
Packit 1f8b6b
  module Loc     = Ast.Loc;
Packit 1f8b6b
  module Ast     = Ast;
Packit 1f8b6b
  module Gram    = Gram;
Packit 1f8b6b
  module Token   = Gram.Token;
Packit 1f8b6b
  open Sig;
Packit 1f8b6b
Packit 1f8b6b
  (* Warnings *)
Packit 1f8b6b
  type warning = Loc.t -> string -> unit;
Packit 1f8b6b
  value default_warning loc txt = Format.eprintf "<W> %a: %s@." Loc.print loc txt;
Packit 1f8b6b
  value current_warning = ref default_warning;
Packit 1f8b6b
  value print_warning loc txt = current_warning.val loc txt;
Packit 1f8b6b
Packit 1f8b6b
  value a_CHAR = Gram.Entry.mk "a_CHAR";
Packit 1f8b6b
  value a_FLOAT = Gram.Entry.mk "a_FLOAT";
Packit 1f8b6b
  value a_INT = Gram.Entry.mk "a_INT";
Packit 1f8b6b
  value a_INT32 = Gram.Entry.mk "a_INT32";
Packit 1f8b6b
  value a_INT64 = Gram.Entry.mk "a_INT64";
Packit 1f8b6b
  value a_LABEL = Gram.Entry.mk "a_LABEL";
Packit 1f8b6b
  value a_LIDENT = Gram.Entry.mk "a_LIDENT";
Packit 1f8b6b
  value a_NATIVEINT = Gram.Entry.mk "a_NATIVEINT";
Packit 1f8b6b
  value a_OPTLABEL = Gram.Entry.mk "a_OPTLABEL";
Packit 1f8b6b
  value a_STRING = Gram.Entry.mk "a_STRING";
Packit 1f8b6b
  value a_UIDENT = Gram.Entry.mk "a_UIDENT";
Packit 1f8b6b
  value a_ident = Gram.Entry.mk "a_ident";
Packit 1f8b6b
  value amp_ctyp = Gram.Entry.mk "amp_ctyp";
Packit 1f8b6b
  value and_ctyp = Gram.Entry.mk "and_ctyp";
Packit 1f8b6b
  value match_case = Gram.Entry.mk "match_case";
Packit 1f8b6b
  value match_case0 = Gram.Entry.mk "match_case0";
Packit 1f8b6b
  value binding = Gram.Entry.mk "binding";
Packit 1f8b6b
  value class_declaration = Gram.Entry.mk "class_declaration";
Packit 1f8b6b
  value class_description = Gram.Entry.mk "class_description";
Packit 1f8b6b
  value class_expr = Gram.Entry.mk "class_expr";
Packit 1f8b6b
  value class_fun_binding = Gram.Entry.mk "class_fun_binding";
Packit 1f8b6b
  value class_fun_def = Gram.Entry.mk "class_fun_def";
Packit 1f8b6b
  value class_info_for_class_expr = Gram.Entry.mk "class_info_for_class_expr";
Packit 1f8b6b
  value class_info_for_class_type = Gram.Entry.mk "class_info_for_class_type";
Packit 1f8b6b
  value class_longident = Gram.Entry.mk "class_longident";
Packit 1f8b6b
  value class_longident_and_param = Gram.Entry.mk "class_longident_and_param";
Packit 1f8b6b
  value class_name_and_param = Gram.Entry.mk "class_name_and_param";
Packit 1f8b6b
  value class_sig_item = Gram.Entry.mk "class_sig_item";
Packit 1f8b6b
  value class_signature = Gram.Entry.mk "class_signature";
Packit 1f8b6b
  value class_str_item = Gram.Entry.mk "class_str_item";
Packit 1f8b6b
  value class_structure = Gram.Entry.mk "class_structure";
Packit 1f8b6b
  value class_type = Gram.Entry.mk "class_type";
Packit 1f8b6b
  value class_type_declaration = Gram.Entry.mk "class_type_declaration";
Packit 1f8b6b
  value class_type_longident = Gram.Entry.mk "class_type_longident";
Packit 1f8b6b
  value class_type_longident_and_param = Gram.Entry.mk "class_type_longident_and_param";
Packit 1f8b6b
  value class_type_plus = Gram.Entry.mk "class_type_plus";
Packit 1f8b6b
  value comma_ctyp = Gram.Entry.mk "comma_ctyp";
Packit 1f8b6b
  value comma_expr = Gram.Entry.mk "comma_expr";
Packit 1f8b6b
  value comma_ipatt = Gram.Entry.mk "comma_ipatt";
Packit 1f8b6b
  value comma_patt = Gram.Entry.mk "comma_patt";
Packit 1f8b6b
  value comma_type_parameter = Gram.Entry.mk "comma_type_parameter";
Packit 1f8b6b
  value constrain = Gram.Entry.mk "constrain";
Packit 1f8b6b
  value constructor_arg_list = Gram.Entry.mk "constructor_arg_list";
Packit 1f8b6b
  value constructor_declaration = Gram.Entry.mk "constructor_declaration";
Packit 1f8b6b
  value constructor_declarations = Gram.Entry.mk "constructor_declarations";
Packit 1f8b6b
  value ctyp = Gram.Entry.mk "ctyp";
Packit 1f8b6b
  value cvalue_binding = Gram.Entry.mk "cvalue_binding";
Packit 1f8b6b
  value direction_flag = Gram.Entry.mk "direction_flag";
Packit 1f8b6b
  value direction_flag_quot = Gram.Entry.mk "direction_flag_quot";
Packit 1f8b6b
  value dummy = Gram.Entry.mk "dummy";
Packit 1f8b6b
  value entry_eoi = Gram.Entry.mk "entry_eoi";
Packit 1f8b6b
  value eq_expr = Gram.Entry.mk "eq_expr";
Packit 1f8b6b
  value expr = Gram.Entry.mk "expr";
Packit 1f8b6b
  value expr_eoi = Gram.Entry.mk "expr_eoi";
Packit 1f8b6b
  value field_expr = Gram.Entry.mk "field_expr";
Packit 1f8b6b
  value field_expr_list = Gram.Entry.mk "field_expr_list";
Packit 1f8b6b
  value fun_binding = Gram.Entry.mk "fun_binding";
Packit 1f8b6b
  value fun_def = Gram.Entry.mk "fun_def";
Packit 1f8b6b
  value ident = Gram.Entry.mk "ident";
Packit 1f8b6b
  value implem = Gram.Entry.mk "implem";
Packit 1f8b6b
  value interf = Gram.Entry.mk "interf";
Packit 1f8b6b
  value ipatt = Gram.Entry.mk "ipatt";
Packit 1f8b6b
  value ipatt_tcon = Gram.Entry.mk "ipatt_tcon";
Packit 1f8b6b
  value label = Gram.Entry.mk "label";
Packit 1f8b6b
  value label_declaration = Gram.Entry.mk "label_declaration";
Packit 1f8b6b
  value label_declaration_list = Gram.Entry.mk "label_declaration_list";
Packit 1f8b6b
  value label_expr = Gram.Entry.mk "label_expr";
Packit 1f8b6b
  value label_expr_list = Gram.Entry.mk "label_expr_list";
Packit 1f8b6b
  value label_ipatt = Gram.Entry.mk "label_ipatt";
Packit 1f8b6b
  value label_ipatt_list = Gram.Entry.mk "label_ipatt_list";
Packit 1f8b6b
  value label_longident = Gram.Entry.mk "label_longident";
Packit 1f8b6b
  value label_patt = Gram.Entry.mk "label_patt";
Packit 1f8b6b
  value label_patt_list = Gram.Entry.mk "label_patt_list";
Packit 1f8b6b
  value labeled_ipatt = Gram.Entry.mk "labeled_ipatt";
Packit 1f8b6b
  value let_binding = Gram.Entry.mk "let_binding";
Packit 1f8b6b
  value meth_list = Gram.Entry.mk "meth_list";
Packit 1f8b6b
  value meth_decl = Gram.Entry.mk "meth_decl";
Packit 1f8b6b
  value module_binding = Gram.Entry.mk "module_binding";
Packit 1f8b6b
  value module_binding0 = Gram.Entry.mk "module_binding0";
Packit 1f8b6b
  value module_declaration = Gram.Entry.mk "module_declaration";
Packit 1f8b6b
  value module_expr = Gram.Entry.mk "module_expr";
Packit 1f8b6b
  value module_longident = Gram.Entry.mk "module_longident";
Packit 1f8b6b
  value module_longident_with_app = Gram.Entry.mk "module_longident_with_app";
Packit 1f8b6b
  value module_rec_declaration = Gram.Entry.mk "module_rec_declaration";
Packit 1f8b6b
  value module_type = Gram.Entry.mk "module_type";
Packit 1f8b6b
  value package_type = Gram.Entry.mk "package_type";
Packit 1f8b6b
  value more_ctyp = Gram.Entry.mk "more_ctyp";
Packit 1f8b6b
  value name_tags = Gram.Entry.mk "name_tags";
Packit 1f8b6b
  value opt_as_lident = Gram.Entry.mk "opt_as_lident";
Packit 1f8b6b
  value opt_class_self_patt = Gram.Entry.mk "opt_class_self_patt";
Packit 1f8b6b
  value opt_class_self_type = Gram.Entry.mk "opt_class_self_type";
Packit 1f8b6b
  value opt_class_signature = Gram.Entry.mk "opt_class_signature";
Packit 1f8b6b
  value opt_class_structure = Gram.Entry.mk "opt_class_structure";
Packit 1f8b6b
  value opt_comma_ctyp = Gram.Entry.mk "opt_comma_ctyp";
Packit 1f8b6b
  value opt_dot_dot = Gram.Entry.mk "opt_dot_dot";
Packit 1f8b6b
  value row_var_flag_quot = Gram.Entry.mk "row_var_flag_quot";
Packit 1f8b6b
  value opt_eq_ctyp = Gram.Entry.mk "opt_eq_ctyp";
Packit 1f8b6b
  value opt_expr = Gram.Entry.mk "opt_expr";
Packit 1f8b6b
  value opt_meth_list = Gram.Entry.mk "opt_meth_list";
Packit 1f8b6b
  value opt_mutable = Gram.Entry.mk "opt_mutable";
Packit 1f8b6b
  value mutable_flag_quot = Gram.Entry.mk "mutable_flag_quot";
Packit 1f8b6b
  value opt_polyt = Gram.Entry.mk "opt_polyt";
Packit 1f8b6b
  value opt_private = Gram.Entry.mk "opt_private";
Packit 1f8b6b
  value private_flag_quot = Gram.Entry.mk "private_flag_quot";
Packit 1f8b6b
  value opt_rec = Gram.Entry.mk "opt_rec";
Packit 1f8b6b
  value opt_nonrec = Gram.Entry.mk "opt_nonrec";
Packit 1f8b6b
  value rec_flag_quot = Gram.Entry.mk "rec_flag_quot";
Packit 1f8b6b
  value opt_sig_items = Gram.Entry.mk "opt_sig_items";
Packit 1f8b6b
  value opt_str_items = Gram.Entry.mk "opt_str_items";
Packit 1f8b6b
  value opt_virtual = Gram.Entry.mk "opt_virtual";
Packit 1f8b6b
  value virtual_flag_quot = Gram.Entry.mk "virtual_flag_quot";
Packit 1f8b6b
  value opt_override = Gram.Entry.mk "opt_override";
Packit 1f8b6b
  value override_flag_quot = Gram.Entry.mk "override_flag_quot";
Packit 1f8b6b
  value opt_when_expr = Gram.Entry.mk "opt_when_expr";
Packit 1f8b6b
  value patt = Gram.Entry.mk "patt";
Packit 1f8b6b
  value patt_as_patt_opt = Gram.Entry.mk "patt_as_patt_opt";
Packit 1f8b6b
  value patt_eoi = Gram.Entry.mk "patt_eoi";
Packit 1f8b6b
  value patt_tcon = Gram.Entry.mk "patt_tcon";
Packit 1f8b6b
  value phrase = Gram.Entry.mk "phrase";
Packit 1f8b6b
  value poly_type = Gram.Entry.mk "poly_type";
Packit 1f8b6b
  value row_field = Gram.Entry.mk "row_field";
Packit 1f8b6b
  value sem_expr = Gram.Entry.mk "sem_expr";
Packit 1f8b6b
  value sem_expr_for_list = Gram.Entry.mk "sem_expr_for_list";
Packit 1f8b6b
  value sem_patt = Gram.Entry.mk "sem_patt";
Packit 1f8b6b
  value sem_patt_for_list = Gram.Entry.mk "sem_patt_for_list";
Packit 1f8b6b
  value semi = Gram.Entry.mk "semi";
Packit 1f8b6b
  value sequence = Gram.Entry.mk "sequence";
Packit 1f8b6b
  value do_sequence = Gram.Entry.mk "do_sequence";
Packit 1f8b6b
  value sig_item = Gram.Entry.mk "sig_item";
Packit 1f8b6b
  value sig_items = Gram.Entry.mk "sig_items";
Packit 1f8b6b
  value star_ctyp = Gram.Entry.mk "star_ctyp";
Packit 1f8b6b
  value str_item = Gram.Entry.mk "str_item";
Packit 1f8b6b
  value str_items = Gram.Entry.mk "str_items";
Packit 1f8b6b
  value top_phrase = Gram.Entry.mk "top_phrase";
Packit 1f8b6b
  value type_constraint = Gram.Entry.mk "type_constraint";
Packit 1f8b6b
  value type_declaration = Gram.Entry.mk "type_declaration";
Packit 1f8b6b
  value type_ident_and_parameters = Gram.Entry.mk "type_ident_and_parameters";
Packit 1f8b6b
  value type_kind = Gram.Entry.mk "type_kind";
Packit 1f8b6b
  value type_longident = Gram.Entry.mk "type_longident";
Packit 1f8b6b
  value type_longident_and_parameters = Gram.Entry.mk "type_longident_and_parameters";
Packit 1f8b6b
  value type_parameter = Gram.Entry.mk "type_parameter";
Packit 1f8b6b
  value type_parameters = Gram.Entry.mk "type_parameters";
Packit 1f8b6b
  value typevars = Gram.Entry.mk "typevars";
Packit 1f8b6b
  value use_file = Gram.Entry.mk "use_file";
Packit 1f8b6b
  value val_longident = Gram.Entry.mk "val_longident";
Packit 1f8b6b
  value value_let = Gram.Entry.mk "value_let";
Packit 1f8b6b
  value value_val = Gram.Entry.mk "value_val";
Packit 1f8b6b
  value with_constr = Gram.Entry.mk "with_constr";
Packit 1f8b6b
  value expr_quot = Gram.Entry.mk "quotation of expression";
Packit 1f8b6b
  value patt_quot = Gram.Entry.mk "quotation of pattern";
Packit 1f8b6b
  value ctyp_quot = Gram.Entry.mk "quotation of type";
Packit 1f8b6b
  value str_item_quot = Gram.Entry.mk "quotation of structure item";
Packit 1f8b6b
  value sig_item_quot = Gram.Entry.mk "quotation of signature item";
Packit 1f8b6b
  value class_str_item_quot = Gram.Entry.mk "quotation of class structure item";
Packit 1f8b6b
  value class_sig_item_quot = Gram.Entry.mk "quotation of class signature item";
Packit 1f8b6b
  value module_expr_quot = Gram.Entry.mk "quotation of module expression";
Packit 1f8b6b
  value module_type_quot = Gram.Entry.mk "quotation of module type";
Packit 1f8b6b
  value class_type_quot = Gram.Entry.mk "quotation of class type";
Packit 1f8b6b
  value class_expr_quot = Gram.Entry.mk "quotation of class expression";
Packit 1f8b6b
  value with_constr_quot = Gram.Entry.mk "quotation of with constraint";
Packit 1f8b6b
  value binding_quot = Gram.Entry.mk "quotation of binding";
Packit 1f8b6b
  value rec_binding_quot = Gram.Entry.mk "quotation of record binding";
Packit 1f8b6b
  value match_case_quot = Gram.Entry.mk "quotation of match_case (try/match/function case)";
Packit 1f8b6b
  value module_binding_quot = Gram.Entry.mk "quotation of module rec binding";
Packit 1f8b6b
  value ident_quot = Gram.Entry.mk "quotation of identifier";
Packit 1f8b6b
  value prefixop = Gram.Entry.mk "prefix operator (start with '!', '?', '~')";
Packit 1f8b6b
  value infixop0 = Gram.Entry.mk "infix operator (level 0) (comparison operators, and some others)";
Packit 1f8b6b
  value infixop1 = Gram.Entry.mk "infix operator (level 1) (start with '^', '@')";
Packit 1f8b6b
  value infixop2 = Gram.Entry.mk "infix operator (level 2) (start with '+', '-')";
Packit 1f8b6b
  value infixop3 = Gram.Entry.mk "infix operator (level 3) (start with '*', '/', '%')";
Packit 1f8b6b
  value infixop4 = Gram.Entry.mk "infix operator (level 4) (start with \"**\") (right assoc)";
Packit 1f8b6b
Packit 1f8b6b
  EXTEND Gram
Packit 1f8b6b
    top_phrase:
Packit 1f8b6b
      [ [ `EOI -> None ] ]
Packit 1f8b6b
    ;
Packit 1f8b6b
  END;
Packit 1f8b6b
Packit 1f8b6b
  module AntiquotSyntax = struct
Packit 1f8b6b
    module Loc  = Ast.Loc;
Packit 1f8b6b
    module Ast  = Sig.Camlp4AstToAst Ast;
Packit 1f8b6b
    module Gram = Gram;
Packit 1f8b6b
    value antiquot_expr = Gram.Entry.mk "antiquot_expr";
Packit 1f8b6b
    value antiquot_patt = Gram.Entry.mk "antiquot_patt";
Packit 1f8b6b
    EXTEND Gram
Packit 1f8b6b
      antiquot_expr:
Packit 1f8b6b
        [ [ x = expr; `EOI -> x ] ]
Packit 1f8b6b
      ;
Packit 1f8b6b
      antiquot_patt:
Packit 1f8b6b
        [ [ x = patt; `EOI -> x ] ]
Packit 1f8b6b
      ;
Packit 1f8b6b
    END;
Packit 1f8b6b
    value parse_expr loc str = Gram.parse_string antiquot_expr loc str;
Packit 1f8b6b
    value parse_patt loc str = Gram.parse_string antiquot_patt loc str;
Packit 1f8b6b
  end;
Packit 1f8b6b
Packit 1f8b6b
  module Quotation = Quotation;
Packit 1f8b6b
Packit 1f8b6b
  value wrap directive_handler pa init_loc cs =
Packit 1f8b6b
    let rec loop loc =
Packit 1f8b6b
      let (pl, stopped_at_directive) = pa loc cs in
Packit 1f8b6b
      match stopped_at_directive with
Packit 1f8b6b
      [ Some new_loc ->
Packit 1f8b6b
        let pl =
Packit 1f8b6b
          match List.rev pl with
Packit 1f8b6b
          [ [] -> assert False
Packit 1f8b6b
          | [x :: xs] ->
Packit 1f8b6b
              match directive_handler x with
Packit 1f8b6b
              [ None -> xs
Packit 1f8b6b
              | Some x -> [x :: xs] ] ]
Packit 1f8b6b
        in (List.rev pl) @ (loop new_loc)
Packit 1f8b6b
      | None -> pl ]
Packit 1f8b6b
    in loop init_loc;
Packit 1f8b6b
Packit 1f8b6b
  value parse_implem ?(directive_handler = fun _ -> None) _loc cs =
Packit 1f8b6b
    let l = wrap directive_handler (Gram.parse implem) _loc cs in
Packit 1f8b6b
    <:str_item< $list:l$ >>;
Packit 1f8b6b
Packit 1f8b6b
  value parse_interf ?(directive_handler = fun _ -> None) _loc cs =
Packit 1f8b6b
    let l = wrap directive_handler (Gram.parse interf) _loc cs in
Packit 1f8b6b
    <:sig_item< $list:l$ >>;
Packit 1f8b6b
Packit 1f8b6b
  value print_interf ?input_file:(_) ?output_file:(_) _ = failwith "No interface printer";
Packit 1f8b6b
  value print_implem ?input_file:(_) ?output_file:(_) _ = failwith "No implementation printer";
Packit 1f8b6b
end;