|
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;
|