From 1a935ede44653d1dd2053cd1373558111f335925 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Tue, 21 Oct 2014 11:38:19 +0200 Subject: [PATCH] Imported Upstream version 4.02.0 --- .depend | 723 +- .gitignore | 2758 ++ .ignore | 8 - .ocp-indent | 2 + .travis-ci.sh | 18 + .travis.yml | 4 + Changes | 367 +- INSTALL | 51 +- LICENSE | 2 +- Makefile | 250 +- Makefile.nt | 203 +- README | 1 - README.win32 | 69 +- VERSION | 2 +- _tags | 98 - asmcomp/.ignore | 1 + asmcomp/CSEgen.ml | 322 + asmcomp/CSEgen.mli | 35 + asmcomp/amd64/CSE.ml | 38 + asmcomp/amd64/arch.ml | 17 +- asmcomp/amd64/emit.mlp | 67 +- asmcomp/amd64/emit_nt.mlp | 87 +- asmcomp/amd64/proc.ml | 38 +- asmcomp/amd64/reload.ml | 12 +- asmcomp/amd64/selection.ml | 45 +- asmcomp/arm/CSE.ml | 37 + asmcomp/arm/arch.ml | 59 +- asmcomp/arm/emit.mlp | 128 +- asmcomp/arm/proc.ml | 32 +- asmcomp/arm/scheduling.ml | 10 +- asmcomp/arm/selection.ml | 65 +- asmcomp/arm64/CSE.ml | 37 + asmcomp/arm64/arch.ml | 145 + asmcomp/arm64/emit.mlp | 736 + asmcomp/arm64/proc.ml | 226 + .../arm64/reload.ml | 15 +- asmcomp/arm64/scheduling.ml | 18 + asmcomp/arm64/selection.ml | 243 + asmcomp/asmgen.ml | 10 + asmcomp/asmlibrarian.ml | 7 + asmcomp/asmlink.ml | 70 +- asmcomp/asmlink.mli | 5 +- asmcomp/asmpackager.ml | 14 +- asmcomp/asmpackager.mli | 2 +- asmcomp/clambda.ml | 87 +- asmcomp/clambda.mli | 32 +- asmcomp/closure.ml | 818 +- asmcomp/closure.mli | 1 + asmcomp/cmm.ml | 11 +- asmcomp/cmm.mli | 11 +- asmcomp/cmmgen.ml | 779 +- asmcomp/cmmgen.mli | 2 +- asmcomp/cmx_format.mli | 9 +- asmcomp/coloring.ml | 8 +- asmcomp/comballoc.ml | 2 +- asmcomp/compilenv.ml | 95 +- asmcomp/compilenv.mli | 24 +- asmcomp/deadcode.ml | 67 + asmcomp/deadcode.mli | 16 + asmcomp/emitaux.ml | 21 +- asmcomp/emitaux.mli | 7 +- asmcomp/i386/CSE.ml | 47 + asmcomp/i386/arch.ml | 26 +- asmcomp/i386/emit.mlp | 53 +- asmcomp/i386/emit_nt.mlp | 76 +- asmcomp/i386/proc.ml | 33 +- asmcomp/i386/reload.ml | 6 +- asmcomp/i386/selection.ml | 47 +- asmcomp/interf.ml | 10 +- asmcomp/linearize.ml | 64 +- asmcomp/linearize.mli | 3 +- asmcomp/liveness.ml | 55 +- asmcomp/liveness.mli | 1 + asmcomp/mach.ml | 11 +- asmcomp/mach.mli | 12 +- asmcomp/power/CSE.ml | 37 + asmcomp/power/emit.mlp | 83 +- asmcomp/power/proc.ml | 23 +- asmcomp/power/scheduling.ml | 6 +- asmcomp/power/selection.ml | 12 +- asmcomp/printclambda.ml | 99 +- asmcomp/printclambda.mli | 2 + asmcomp/printcmm.ml | 12 +- asmcomp/printlinear.ml | 4 +- asmcomp/printmach.ml | 21 +- asmcomp/proc.mli | 6 + asmcomp/reg.ml | 73 +- asmcomp/reg.mli | 14 +- asmcomp/reloadgen.ml | 4 +- asmcomp/schedgen.ml | 43 +- asmcomp/schedgen.mli | 2 + asmcomp/selectgen.ml | 106 +- asmcomp/selectgen.mli | 29 +- asmcomp/sparc/CSE.ml | 30 + asmcomp/sparc/emit.mlp | 62 +- asmcomp/sparc/proc.ml | 19 +- asmcomp/sparc/scheduling.ml | 2 - asmcomp/sparc/selection.ml | 14 +- asmcomp/spill.ml | 23 +- asmcomp/spill.mli | 1 + asmcomp/split.ml | 13 +- asmcomp/split.mli | 2 + asmcomp/strmatch.ml | 389 + asmcomp/strmatch.mli | 28 + asmrun/.depend | 30 +- asmrun/Makefile | 31 +- asmrun/Makefile.nt | 4 +- asmrun/amd64.S | 40 +- asmrun/amd64nt.asm | 16 +- asmrun/arm.S | 9 + asmrun/arm64.S | 551 + asmrun/backtrace.c | 88 +- asmrun/fail.c | 73 +- asmrun/i386.S | 31 +- asmrun/i386nt.asm | 18 +- asmrun/natdynlink.c | 5 +- asmrun/power-elf.S | 72 +- asmrun/power-rhapsody.S | 42 +- asmrun/signals_asm.c | 2 - asmrun/signals_osdep.h | 23 + asmrun/stack.h | 7 +- asmrun/startup.c | 6 - boot/.ignore | 2 - boot/myocamlbuild.boot | Bin 2314135 -> 0 bytes boot/ocamlc | Bin 1398746 -> 1707956 bytes boot/ocamldep | Bin 362050 -> 526023 bytes boot/ocamllex | Bin 176611 -> 251568 bytes build/.ignore | 1 - build/boot-c-parts.sh | 50 - build/boot.sh | 39 - build/buildbot | 125 - build/camlp4-bootstrap-recipe.txt | 181 - build/camlp4-bootstrap.sh | 51 - build/camlp4-mkCamlp4Ast.sh | 36 - build/camlp4-native-only.sh | 23 - build/camlp4-targets.sh | 46 - build/distclean.sh | 43 - build/fastworld.sh | 48 - build/install.sh | 573 - build/mixed-boot.sh | 22 - build/mkconfig.sh | 27 - build/mkmyocamlbuild_config.sh | 40 - build/mkruntimedef.sh | 21 - build/myocamlbuild.sh | 31 - build/new-build-system | 52 - build/ocamlbuildlib-native-only.sh | 19 - build/otherlibs-targets.sh | 120 - build/partial-install.sh | 188 - build/targets.sh | 62 - build/tolower.sed | 23 - build/world.all.sh | 24 - build/world.byte.sh | 21 - build/world.native.sh | 22 - build/world.sh | 35 - bytecomp/bytegen.ml | 105 +- bytecomp/bytegen.mli | 1 + bytecomp/bytelibrarian.ml | 14 +- bytecomp/bytelibrarian.mli | 2 + bytecomp/bytelink.ml | 63 +- bytecomp/bytelink.mli | 3 +- bytecomp/bytepackager.ml | 43 +- bytecomp/bytepackager.mli | 3 +- bytecomp/bytesections.ml | 12 +- bytecomp/bytesections.mli | 2 + bytecomp/cmo_format.mli | 3 +- bytecomp/dll.ml | 6 + bytecomp/dll.mli | 2 + bytecomp/emitcode.ml | 31 +- bytecomp/emitcode.mli | 7 +- bytecomp/instruct.ml | 2 +- bytecomp/instruct.mli | 2 +- bytecomp/lambda.ml | 242 +- bytecomp/lambda.mli | 40 +- bytecomp/matching.ml | 776 +- bytecomp/matching.mli | 8 +- bytecomp/meta.ml | 10 +- bytecomp/meta.mli | 10 +- bytecomp/printinstr.ml | 2 +- bytecomp/printlambda.ml | 37 +- bytecomp/simplif.ml | 69 +- bytecomp/switch.ml | 238 +- bytecomp/switch.mli | 47 +- bytecomp/symtable.ml | 33 +- bytecomp/symtable.mli | 6 +- bytecomp/translclass.ml | 77 +- bytecomp/translcore.ml | 262 +- bytecomp/translcore.mli | 7 +- bytecomp/translmod.ml | 438 +- bytecomp/translmod.mli | 2 + bytecomp/translobj.ml | 22 +- bytecomp/translobj.mli | 2 + bytecomp/typeopt.ml | 4 +- byterun/.depend | 24 +- byterun/Makefile | 4 +- byterun/Makefile.common | 30 +- byterun/alloc.c | 6 +- byterun/alloc.h | 1 + byterun/array.c | 29 +- byterun/backtrace.c | 275 +- byterun/backtrace.h | 2 +- byterun/callback.c | 5 +- byterun/compact.c | 2 +- byterun/compatibility.h | 1 - byterun/config.h | 73 +- byterun/debugger.c | 2 - byterun/dynlink.c | 4 +- byterun/exec.h | 2 +- byterun/fail.c | 39 +- byterun/fail.h | 1 - byterun/fix_code.c | 6 +- byterun/floats.c | 48 +- byterun/gc_ctrl.c | 49 +- byterun/gc_ctrl.h | 2 + byterun/hash.c | 25 +- byterun/instrtrace.c | 17 +- byterun/instruct.h | 9 +- byterun/intern.c | 24 +- byterun/interp.c | 65 +- byterun/ints.c | 218 +- byterun/io.c | 21 +- byterun/io.h | 9 - byterun/lexing.c | 2 +- byterun/major_gc.c | 51 +- byterun/memory.h | 16 +- byterun/misc.c | 38 + byterun/misc.h | 16 +- byterun/mlvalues.h | 1 + byterun/obj.c | 12 + byterun/osdeps.h | 5 +- byterun/parsing.c | 2 +- byterun/printexc.c | 40 +- byterun/startup.c | 32 +- byterun/str.c | 136 +- byterun/sys.c | 96 +- byterun/unix.c | 63 +- byterun/win32.c | 133 +- camlp4/.ignore | 2 - camlp4/CHANGES | 898 - camlp4/Camlp4.mlpack | 9 - camlp4/Camlp4/Camlp4Ast.partial.ml | 412 - camlp4/Camlp4/Debug.ml | 64 - camlp4/Camlp4/Debug.mli | 22 - camlp4/Camlp4/ErrorHandler.ml | 171 - camlp4/Camlp4/ErrorHandler.mli | 36 - camlp4/Camlp4/OCamlInitSyntax.ml | 265 - camlp4/Camlp4/Options.ml | 191 - camlp4/Camlp4/Options.mli | 26 - camlp4/Camlp4/PreCast.ml | 67 - camlp4/Camlp4/PreCast.mli | 76 - camlp4/Camlp4/Printers.mlpack | 5 - camlp4/Camlp4/Printers/DumpCamlp4Ast.ml | 51 - camlp4/Camlp4/Printers/DumpCamlp4Ast.mli | 21 - camlp4/Camlp4/Printers/DumpOCamlAst.ml | 53 - camlp4/Camlp4/Printers/DumpOCamlAst.mli | 21 - camlp4/Camlp4/Printers/Null.ml | 30 - camlp4/Camlp4/Printers/Null.mli | 22 - camlp4/Camlp4/Printers/OCaml.ml | 1156 - camlp4/Camlp4/Printers/OCaml.mli | 167 - camlp4/Camlp4/Printers/OCamlr.ml | 324 - camlp4/Camlp4/Printers/OCamlr.mli | 47 - camlp4/Camlp4/Register.ml | 171 - camlp4/Camlp4/Register.mli | 95 - camlp4/Camlp4/Sig.ml | 1445 -- camlp4/Camlp4/Struct.mlpack | 15 - camlp4/Camlp4/Struct/.ignore | 2 - camlp4/Camlp4/Struct/AstFilters.ml | 37 - camlp4/Camlp4/Struct/Camlp4Ast.mlast | 544 - camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml | 1238 - camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli | 32 - camlp4/Camlp4/Struct/CleanAst.ml | 145 - camlp4/Camlp4/Struct/CommentFilter.ml | 56 - camlp4/Camlp4/Struct/CommentFilter.mli | 33 - camlp4/Camlp4/Struct/DynAst.ml | 91 - camlp4/Camlp4/Struct/DynLoader.ml | 84 - camlp4/Camlp4/Struct/DynLoader.mli | 20 - camlp4/Camlp4/Struct/EmptyError.ml | 22 - camlp4/Camlp4/Struct/EmptyError.mli | 19 - camlp4/Camlp4/Struct/EmptyPrinter.ml | 22 - camlp4/Camlp4/Struct/EmptyPrinter.mli | 19 - camlp4/Camlp4/Struct/FreeVars.ml | 127 - camlp4/Camlp4/Struct/FreeVars.mli | 48 - camlp4/Camlp4/Struct/Grammar.mlpack | 13 - camlp4/Camlp4/Struct/Grammar/Delete.ml | 187 - camlp4/Camlp4/Struct/Grammar/Dynamic.ml | 73 - camlp4/Camlp4/Struct/Grammar/Entry.ml | 92 - camlp4/Camlp4/Struct/Grammar/Failed.ml | 132 - camlp4/Camlp4/Struct/Grammar/Find.ml | 68 - camlp4/Camlp4/Struct/Grammar/Fold.ml | 95 - camlp4/Camlp4/Struct/Grammar/Fold.mli | 30 - camlp4/Camlp4/Struct/Grammar/Insert.ml | 323 - camlp4/Camlp4/Struct/Grammar/Parser.ml | 431 - camlp4/Camlp4/Struct/Grammar/Parser.mli | 62 - camlp4/Camlp4/Struct/Grammar/Print.ml | 270 - camlp4/Camlp4/Struct/Grammar/Print.mli | 47 - camlp4/Camlp4/Struct/Grammar/Search.ml | 95 - camlp4/Camlp4/Struct/Grammar/Static.ml | 84 - camlp4/Camlp4/Struct/Grammar/Structure.ml | 294 - camlp4/Camlp4/Struct/Grammar/Tools.ml | 132 - camlp4/Camlp4/Struct/Lexer.mll | 495 - camlp4/Camlp4/Struct/Loc.ml | 307 - camlp4/Camlp4/Struct/Loc.mli | 19 - camlp4/Camlp4/Struct/Quotation.ml | 167 - camlp4/Camlp4/Struct/Token.ml | 244 - camlp4/Camlp4/Struct/Token.mli | 35 - camlp4/Camlp4Bin.ml | 325 - camlp4/Camlp4Filters/Camlp4AstLifter.ml | 44 - camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml | 68 - camlp4/Camlp4Filters/Camlp4FoldGenerator.ml | 609 - .../Camlp4Filters/Camlp4LocationStripper.ml | 36 - camlp4/Camlp4Filters/Camlp4MapGenerator.ml | 19 - camlp4/Camlp4Filters/Camlp4MetaGenerator.ml | 212 - camlp4/Camlp4Filters/Camlp4Profiler.ml | 77 - camlp4/Camlp4Filters/Camlp4TrashRemover.ml | 41 - camlp4/Camlp4Parsers/Camlp4AstLoader.ml | 49 - camlp4/Camlp4Parsers/Camlp4DebugParser.ml | 83 - camlp4/Camlp4Parsers/Camlp4GrammarParser.ml | 898 - .../Camlp4Parsers/Camlp4ListComprehension.ml | 149 - camlp4/Camlp4Parsers/Camlp4MacroParser.ml | 459 - .../Camlp4OCamlOriginalQuotationExpander.ml | 25 - camlp4/Camlp4Parsers/Camlp4OCamlParser.ml | 720 - .../Camlp4Parsers/Camlp4OCamlParserParser.ml | 60 - .../Camlp4OCamlReloadedParser.ml | 94 - .../Camlp4Parsers/Camlp4OCamlRevisedParser.ml | 1925 -- .../Camlp4OCamlRevisedParserParser.ml | 394 - .../Camlp4OCamlRevisedQuotationExpander.ml | 24 - camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml | 212 - .../Camlp4Parsers/Camlp4QuotationExpander.ml | 33 - camlp4/Camlp4Printers/Camlp4AstDumper.ml | 19 - camlp4/Camlp4Printers/Camlp4AutoPrinter.ml | 24 - camlp4/Camlp4Printers/Camlp4NullDumper.ml | 19 - camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml | 19 - camlp4/Camlp4Printers/Camlp4OCamlPrinter.ml | 19 - .../Camlp4OCamlRevisedPrinter.ml | 19 - camlp4/Camlp4Top.mlpack | 2 - camlp4/Camlp4Top/Rprint.ml | 507 - camlp4/Camlp4Top/Top.ml | 133 - camlp4/Camlp4_config.ml | 39 - camlp4/Camlp4_config.mli | 34 - camlp4/ICHANGES | 27 - camlp4/boot/.ignore | 5 - camlp4/boot/Camlp4.ml | 21644 ---------------- camlp4/boot/Camlp4.ml4 | 78 - camlp4/boot/Camlp4Ast.ml | 6219 ----- camlp4/boot/camlp4boot.ml | 16057 ------------ camlp4/boot/camlp4boot.ml4 | 10 - camlp4/build/.ignore | 5 - camlp4/camlp4.odocl | 1 - camlp4/camlp4fulllib.mllib | 35 - camlp4/camlp4lib.mllib | 3 - camlp4/camlp4prof.ml | 38 - camlp4/camlp4prof.mli | 17 - camlp4/examples/_tags | 32 - camlp4/examples/all.itarget | 11 - camlp4/examples/apply_operator.ml | 20 - camlp4/examples/apply_operator_test.ml | 17 - camlp4/examples/arith.ml | 63 - camlp4/examples/debug_extension.ml | 51 - camlp4/examples/ex_str.ml | 36 - camlp4/examples/ex_str_test.ml | 15 - camlp4/examples/expression_closure.ml | 37 - camlp4/examples/expression_closure_filter.ml | 64 - camlp4/examples/expression_closure_test.ml | 28 - camlp4/examples/fancy_lambda_quot.ml | 173 - camlp4/examples/fancy_lambda_quot_test.ml | 36 - camlp4/examples/free_vars_test.ml | 86 - camlp4/examples/gen_match_case.ml | 26 - camlp4/examples/gen_type_N.ml | 47 - camlp4/examples/gettext_test.ml | 15 - camlp4/examples/global_handler.ml | 33 - camlp4/examples/global_handler_test.ml | 26 - camlp4/examples/lambda_parser.ml | 48 - camlp4/examples/lambda_quot.ml | 52 - camlp4/examples/lambda_quot_expr.ml | 55 - camlp4/examples/lambda_quot_patt.ml | 55 - camlp4/examples/lambda_test.ml | 26 - camlp4/examples/macros.ml | 81 - camlp4/examples/parse_files.ml | 43 - camlp4/examples/syb_fold.ml | 104 - camlp4/examples/syb_map.ml | 65 - camlp4/examples/test.itarget | 8 - camlp4/examples/test_macros.ml | 29 - camlp4/examples/test_type_quotation.ml | 17 - camlp4/examples/type_quotation.ml | 32 - camlp4/man/.ignore | 2 - camlp4/man/Makefile | 32 - camlp4/man/camlp4.1.tpl | 292 - camlp4/mkcamlp4.ml | 70 - config/.ignore | 1 - config/Makefile-templ | 20 +- config/Makefile.mingw | 30 +- config/Makefile.mingw64 | 23 +- config/Makefile.msvc | 39 +- config/Makefile.msvc64 | 29 +- config/auto-aux/int64align.c | 18 +- config/auto-aux/sizes.c | 5 +- config/auto-aux/tclversion.c | 24 - config/gnu/config.guess | 196 +- config/gnu/config.sub | 117 +- configure | 1050 +- debugger/.depend | 16 +- debugger/Makefile | 2 +- debugger/Makefile.shared | 10 +- debugger/command_line.ml | 22 +- debugger/debugcom.ml | 6 +- debugger/debugger_config.mli | 2 +- debugger/eval.ml | 6 +- debugger/input_handling.mli | 2 +- debugger/main.ml | 13 +- debugger/parameters.ml | 2 + debugger/parameters.mli | 2 + debugger/printval.ml | 4 +- debugger/program_loading.ml | 82 +- debugger/program_management.ml | 4 +- debugger/show_information.ml | 13 +- debugger/source.ml | 2 +- debugger/symbols.ml | 15 +- debugger/symbols.mli | 4 + driver/compenv.ml | 36 +- driver/compenv.mli | 3 +- driver/compile.ml | 80 +- driver/compmisc.ml | 20 +- driver/errors.ml | 71 +- driver/main.ml | 12 +- driver/main_args.ml | 304 +- driver/main_args.mli | 202 +- driver/optcompile.ml | 87 +- driver/opterrors.ml | 73 +- driver/optmain.ml | 16 +- driver/pparse.ml | 73 +- driver/pparse.mli | 8 +- lex/Makefile | 4 +- lex/common.ml | 10 +- lex/common.mli | 2 + lex/compact.ml | 28 +- lex/cset.ml | 2 +- lex/lexer.mll | 13 +- lex/lexgen.ml | 6 +- lex/main.ml | 6 +- lex/output.ml | 28 +- lex/output.mli | 1 + lex/outputbis.ml | 138 +- lex/outputbis.mli | 1 + lex/parser.mly | 14 +- lex/syntax.ml | 10 +- lex/syntax.mli | 10 +- lex/table.ml | 4 +- man/Makefile | 13 +- man/ocaml.m | 29 +- man/ocamlc.m | 63 +- man/ocamldebug.m | 9 + man/ocamldoc.m | 8 +- man/ocamlopt.m | 91 +- myocamlbuild.ml | 1082 - myocamlbuild_config.mli | 72 - ocamlbuild/.depend | 117 +- ocamlbuild/Makefile | 313 +- ocamlbuild/Makefile.noboot | 21 +- ocamlbuild/command.ml | 7 +- ocamlbuild/configuration.ml | 46 +- ocamlbuild/configuration.mli | 7 +- ocamlbuild/const.ml | 11 + ocamlbuild/display.ml | 18 +- ocamlbuild/findlib.ml | 10 +- ocamlbuild/flags.ml | 52 +- ocamlbuild/flags.mli | 22 +- ocamlbuild/lexers.mli | 30 +- ocamlbuild/lexers.mll | 169 +- ocamlbuild/loc.ml | 35 + ocamlbuild/loc.mli | 7 + ocamlbuild/log.ml | 24 + ocamlbuild/log.mli | 10 + ocamlbuild/main.ml | 85 +- ocamlbuild/man/ocamlbuild.1 | 3 + ocamlbuild/my_std.ml | 48 +- ocamlbuild/my_std.mli | 3 + ocamlbuild/my_unix.ml | 4 +- ocamlbuild/ocaml_compiler.ml | 40 +- ocamlbuild/ocaml_compiler.mli | 1 + ocamlbuild/ocaml_specific.ml | 278 +- ocamlbuild/ocaml_utils.ml | 10 +- ocamlbuild/ocamlbuild_executor.ml | 38 +- ocamlbuild/ocamlbuild_pack.mlpack | 2 + ocamlbuild/ocamlbuild_plugin.ml | 3 +- ocamlbuild/ocamlbuild_where.ml | 4 +- ocamlbuild/options.ml | 67 +- ocamlbuild/options.mli | 10 +- ocamlbuild/param_tags.ml | 22 +- ocamlbuild/param_tags.mli | 4 +- ocamlbuild/plugin.ml | 5 +- ocamlbuild/resource.ml | 5 +- ocamlbuild/resource.mli | 1 + ocamlbuild/rule.ml | 57 +- ocamlbuild/rule.mli | 4 + ocamlbuild/signatures.mli | 32 +- ocamlbuild/testsuite/README | 13 + ocamlbuild/testsuite/external.ml | 22 + ocamlbuild/testsuite/external_test_header.ml | 7 + ocamlbuild/testsuite/findlibonly.ml | 42 + .../testsuite/findlibonly_test_header.ml | 9 + .../testsuite/{level0.ml => internal.ml} | 232 +- ocamlbuild/testsuite/internal_test_header.ml | 10 + ocamlbuild/testsuite/ocamlbuild_test.ml | 257 +- ocamldoc/.depend | 146 +- ocamldoc/Makefile | 125 +- ocamldoc/Makefile.nt | 106 +- ocamldoc/generators/odoc_literate.ml | 4 +- ocamldoc/generators/odoc_todo.ml | 8 + ocamldoc/odoc_analyse.ml | 89 +- ocamldoc/odoc_ast.ml | 382 +- ocamldoc/odoc_ast.mli | 17 +- ocamldoc/odoc_cross.ml | 72 +- ocamldoc/odoc_dag2html.ml | 4 +- ocamldoc/odoc_dep.ml | 10 +- ocamldoc/odoc_env.ml | 35 +- ocamldoc/odoc_env.mli | 6 +- ocamldoc/odoc_exception.ml | 1 + ocamldoc/odoc_extension.ml | 46 + ocamldoc/odoc_html.ml | 203 +- ocamldoc/odoc_info.ml | 8 + ocamldoc/odoc_info.mli | 93 +- ocamldoc/odoc_latex.ml | 238 +- ocamldoc/odoc_man.ml | 677 +- ocamldoc/odoc_merge.ml | 88 +- ocamldoc/odoc_messages.ml | 11 + ocamldoc/odoc_misc.ml | 8 +- ocamldoc/odoc_module.ml | 26 +- ocamldoc/odoc_print.ml | 25 +- ocamldoc/odoc_scan.ml | 22 + ocamldoc/odoc_search.ml | 76 +- ocamldoc/odoc_search.mli | 25 + ocamldoc/odoc_sig.ml | 397 +- ocamldoc/odoc_sig.mli | 16 +- ocamldoc/odoc_str.ml | 238 +- ocamldoc/odoc_str.mli | 7 + ocamldoc/odoc_test.ml | 5 +- ocamldoc/odoc_texi.ml | 113 +- ocamldoc/odoc_text.ml | 1 + ocamldoc/odoc_text_lexer.mll | 18 + ocamldoc/odoc_text_parser.mly | 2 + ocamldoc/odoc_to_text.ml | 58 +- ocamldoc/odoc_type.ml | 17 +- ocamldoc/odoc_types.ml | 1 + ocamldoc/odoc_types.mli | 1 + otherlibs/Makefile | 5 +- otherlibs/Makefile.nt | 7 +- otherlibs/Makefile.shared | 21 +- otherlibs/bigarray/.depend | 2 +- otherlibs/bigarray/Makefile | 6 +- otherlibs/bigarray/bigarray.h | 12 +- otherlibs/bigarray/bigarray.ml | 101 +- otherlibs/bigarray/bigarray.mli | 94 +- otherlibs/bigarray/bigarray_stubs.c | 95 +- otherlibs/bigarray/mmap_unix.c | 6 +- otherlibs/bigarray/mmap_win32.c | 2 +- otherlibs/dynlink/Makefile | 40 +- otherlibs/dynlink/dynlink.ml | 55 +- otherlibs/dynlink/dynlink.mli | 25 +- otherlibs/dynlink/natdynlink.ml | 59 +- otherlibs/graph/open.c | 3 +- otherlibs/labltk/.ignore | 4 - otherlibs/labltk/Changes | 17 - otherlibs/labltk/Makefile | 95 - otherlibs/labltk/Makefile.nt | 76 - otherlibs/labltk/README | 151 - otherlibs/labltk/Widgets.src | 2304 -- otherlibs/labltk/browser/.depend | 265 - otherlibs/labltk/browser/.ignore | 3 - otherlibs/labltk/browser/Makefile | 22 - otherlibs/labltk/browser/Makefile.nt | 35 - otherlibs/labltk/browser/Makefile.shared | 78 - otherlibs/labltk/browser/README | 170 - otherlibs/labltk/browser/dummyUnix.mli | 27 - otherlibs/labltk/browser/dummyWin.mli | 15 - otherlibs/labltk/browser/editor.ml | 667 - otherlibs/labltk/browser/editor.mli | 20 - otherlibs/labltk/browser/fileselect.ml | 290 - otherlibs/labltk/browser/fileselect.mli | 39 - otherlibs/labltk/browser/help.txt | 166 - otherlibs/labltk/browser/jg_bind.ml | 28 - otherlibs/labltk/browser/jg_bind.mli | 21 - otherlibs/labltk/browser/jg_box.ml | 82 - otherlibs/labltk/browser/jg_button.ml | 25 - otherlibs/labltk/browser/jg_completion.ml | 53 - otherlibs/labltk/browser/jg_completion.mli | 25 - otherlibs/labltk/browser/jg_config.ml | 40 - otherlibs/labltk/browser/jg_config.mli | 17 - otherlibs/labltk/browser/jg_entry.ml | 27 - otherlibs/labltk/browser/jg_memo.ml | 33 - otherlibs/labltk/browser/jg_memo.mli | 19 - otherlibs/labltk/browser/jg_menu.ml | 44 - otherlibs/labltk/browser/jg_message.ml | 111 - otherlibs/labltk/browser/jg_message.mli | 33 - otherlibs/labltk/browser/jg_multibox.ml | 185 - otherlibs/labltk/browser/jg_multibox.mli | 35 - otherlibs/labltk/browser/jg_text.ml | 104 - otherlibs/labltk/browser/jg_text.mli | 28 - otherlibs/labltk/browser/jg_tk.ml | 24 - otherlibs/labltk/browser/jg_toplevel.ml | 25 - otherlibs/labltk/browser/jglib.mllib | 13 - otherlibs/labltk/browser/lexical.ml | 145 - otherlibs/labltk/browser/lexical.mli | 20 - otherlibs/labltk/browser/list2.ml | 23 - otherlibs/labltk/browser/main.ml | 132 - otherlibs/labltk/browser/mytypes.mli | 29 - otherlibs/labltk/browser/searchid.ml | 541 - otherlibs/labltk/browser/searchid.mli | 45 - otherlibs/labltk/browser/searchpos.ml | 888 - otherlibs/labltk/browser/searchpos.mli | 77 - otherlibs/labltk/browser/setpath.ml | 162 - otherlibs/labltk/browser/setpath.mli | 25 - otherlibs/labltk/browser/shell.ml | 365 - otherlibs/labltk/browser/shell.mli | 46 - otherlibs/labltk/browser/typecheck.ml | 186 - otherlibs/labltk/browser/typecheck.mli | 23 - otherlibs/labltk/browser/useunix.ml | 69 - otherlibs/labltk/browser/useunix.mli | 23 - otherlibs/labltk/browser/viewer.ml | 635 - otherlibs/labltk/browser/viewer.mli | 31 - otherlibs/labltk/browser/winmain.c | 40 - otherlibs/labltk/builtin/LICENSE | 19 - .../labltk/builtin/builtin_FilePattern.ml | 20 - otherlibs/labltk/builtin/builtin_GetBitmap.ml | 22 - otherlibs/labltk/builtin/builtin_GetCursor.ml | 60 - otherlibs/labltk/builtin/builtin_GetPixel.ml | 28 - .../labltk/builtin/builtin_ScrollValue.ml | 22 - otherlibs/labltk/builtin/builtin_bind.ml | 469 - otherlibs/labltk/builtin/builtin_bindtags.ml | 20 - otherlibs/labltk/builtin/builtin_font.ml | 3 - otherlibs/labltk/builtin/builtin_grab.ml | 3 - otherlibs/labltk/builtin/builtin_index.ml | 92 - otherlibs/labltk/builtin/builtin_palette.ml | 20 - otherlibs/labltk/builtin/builtin_text.ml | 50 - otherlibs/labltk/builtin/builtinf_GetPixel.ml | 23 - otherlibs/labltk/builtin/builtinf_bind.ml | 133 - .../labltk/builtin/builtini_GetBitmap.ml | 28 - .../labltk/builtin/builtini_GetCursor.ml | 55 - otherlibs/labltk/builtin/builtini_GetPixel.ml | 43 - .../labltk/builtin/builtini_ScrollValue.ml | 45 - otherlibs/labltk/builtin/builtini_bind.ml | 136 - otherlibs/labltk/builtin/builtini_bindtags.ml | 29 - otherlibs/labltk/builtin/builtini_font.ml | 2 - otherlibs/labltk/builtin/builtini_grab.ml | 2 - otherlibs/labltk/builtin/builtini_index.ml | 140 - otherlibs/labltk/builtin/builtini_palette.ml | 19 - otherlibs/labltk/builtin/builtini_text.ml | 64 - otherlibs/labltk/builtin/canvas_bind.ml | 52 - otherlibs/labltk/builtin/canvas_bind.mli | 16 - otherlibs/labltk/builtin/dialog.ml | 45 - otherlibs/labltk/builtin/dialog.mli | 24 - otherlibs/labltk/builtin/image.ml | 33 - otherlibs/labltk/builtin/image.mli | 9 - otherlibs/labltk/builtin/optionmenu.ml | 54 - otherlibs/labltk/builtin/optionmenu.mli | 21 - otherlibs/labltk/builtin/rawimg.ml | 142 - otherlibs/labltk/builtin/rawimg.mli | 44 - otherlibs/labltk/builtin/report.ml | 17 - .../labltk/builtin/selection_handle_set.ml | 41 - .../labltk/builtin/selection_handle_set.mli | 13 - otherlibs/labltk/builtin/selection_own_set.ml | 29 - .../labltk/builtin/selection_own_set.mli | 12 - otherlibs/labltk/builtin/text_tag_bind.ml | 55 - otherlibs/labltk/builtin/text_tag_bind.mli | 13 - otherlibs/labltk/builtin/winfo_contained.ml | 13 - otherlibs/labltk/builtin/winfo_contained.mli | 11 - otherlibs/labltk/camltk/.ignore | 4 - otherlibs/labltk/camltk/Makefile | 60 - otherlibs/labltk/camltk/Makefile.gen | 68 - otherlibs/labltk/camltk/Makefile.gen.nt | 17 - otherlibs/labltk/camltk/Makefile.nt | 17 - otherlibs/labltk/camltk/byte.itarget | 9 - otherlibs/labltk/camltk/modules | 80 - otherlibs/labltk/camltk/native.itarget | 7 - otherlibs/labltk/compiler/.depend | 28 - otherlibs/labltk/compiler/.ignore | 11 - otherlibs/labltk/compiler/Makefile | 79 - otherlibs/labltk/compiler/Makefile.nt | 17 - otherlibs/labltk/compiler/code.mli | 22 - otherlibs/labltk/compiler/compile.ml | 1074 - otherlibs/labltk/compiler/copyright | 15 - otherlibs/labltk/compiler/flags.ml | 17 - otherlibs/labltk/compiler/intf.ml | 191 - otherlibs/labltk/compiler/lexer.mll | 169 - otherlibs/labltk/compiler/maincompile.ml | 418 - otherlibs/labltk/compiler/parser.mly | 330 - otherlibs/labltk/compiler/pp.ml | 23 - otherlibs/labltk/compiler/ppexec.ml | 60 - otherlibs/labltk/compiler/pplex.mli | 18 - otherlibs/labltk/compiler/pplex.mll | 56 - otherlibs/labltk/compiler/ppparse.ml | 36 - otherlibs/labltk/compiler/ppyac.mly | 52 - otherlibs/labltk/compiler/printer.ml | 189 - otherlibs/labltk/compiler/tables.ml | 426 - otherlibs/labltk/compiler/tsort.ml | 87 - otherlibs/labltk/examples_camltk/.ignore | 8 - otherlibs/labltk/examples_camltk/Makefile | 118 - otherlibs/labltk/examples_camltk/Makefile.nt | 54 - otherlibs/labltk/examples_camltk/addition.ml | 55 - otherlibs/labltk/examples_camltk/eyes.ml | 74 - otherlibs/labltk/examples_camltk/fileinput.ml | 35 - otherlibs/labltk/examples_camltk/fileopen.ml | 56 - .../labltk/examples_camltk/helloworld.ml | 50 - .../examples_camltk/images/CamlBook.gif | Bin 15168 -> 0 bytes .../examples_camltk/images/Lambda2.back.gif | Bin 53442 -> 0 bytes .../examples_camltk/images/dojoji.back.gif | Bin 49935 -> 0 bytes otherlibs/labltk/examples_camltk/jptest.ml | 23 - otherlibs/labltk/examples_camltk/mytext.ml | 62 - .../labltk/examples_camltk/socketinput.ml | 42 - otherlibs/labltk/examples_camltk/taddition.ml | 53 - otherlibs/labltk/examples_camltk/taquin.ml | 146 - otherlibs/labltk/examples_camltk/tetris.ml | 542 - otherlibs/labltk/examples_camltk/text.ml | 54 - otherlibs/labltk/examples_camltk/winskel.ml | 63 - otherlibs/labltk/examples_labltk/.ignore | 8 - .../labltk/examples_labltk/Lambda2.back.gif | Bin 53442 -> 0 bytes otherlibs/labltk/examples_labltk/Makefile | 69 - otherlibs/labltk/examples_labltk/Makefile.nt | 66 - otherlibs/labltk/examples_labltk/README | 20 - otherlibs/labltk/examples_labltk/calc.ml | 129 - otherlibs/labltk/examples_labltk/clock.ml | 133 - otherlibs/labltk/examples_labltk/demo.ml | 166 - otherlibs/labltk/examples_labltk/eyes.ml | 62 - otherlibs/labltk/examples_labltk/hello.ml | 38 - otherlibs/labltk/examples_labltk/hello.tcl | 21 - otherlibs/labltk/examples_labltk/lang.ml | 75 - otherlibs/labltk/examples_labltk/taquin.ml | 143 - otherlibs/labltk/examples_labltk/tetris.ml | 709 - otherlibs/labltk/frx/.depend | 38 - otherlibs/labltk/frx/Makefile | 67 - otherlibs/labltk/frx/Makefile.nt | 17 - otherlibs/labltk/frx/README | 2 - otherlibs/labltk/frx/frx_after.ml | 24 - otherlibs/labltk/frx/frx_after.mli | 17 - otherlibs/labltk/frx/frx_color.ml | 35 - otherlibs/labltk/frx/frx_color.mli | 16 - otherlibs/labltk/frx/frx_ctext.ml | 66 - otherlibs/labltk/frx/frx_ctext.mli | 23 - otherlibs/labltk/frx/frx_dialog.ml | 115 - otherlibs/labltk/frx/frx_dialog.mli | 22 - otherlibs/labltk/frx/frx_entry.ml | 40 - otherlibs/labltk/frx/frx_entry.mli | 31 - otherlibs/labltk/frx/frx_fileinput.ml | 39 - otherlibs/labltk/frx/frx_fillbox.ml | 65 - otherlibs/labltk/frx/frx_fillbox.mli | 31 - otherlibs/labltk/frx/frx_fit.ml | 83 - otherlibs/labltk/frx/frx_fit.mli | 29 - otherlibs/labltk/frx/frx_focus.ml | 26 - otherlibs/labltk/frx/frx_focus.mli | 18 - otherlibs/labltk/frx/frx_font.ml | 50 - otherlibs/labltk/frx/frx_font.mli | 20 - otherlibs/labltk/frx/frx_group.ml | 22 - otherlibs/labltk/frx/frx_lbutton.ml | 50 - otherlibs/labltk/frx/frx_lbutton.mli | 23 - otherlibs/labltk/frx/frx_listbox.ml | 92 - otherlibs/labltk/frx/frx_listbox.mli | 32 - otherlibs/labltk/frx/frx_mem.ml | 89 - otherlibs/labltk/frx/frx_mem.mli | 22 - otherlibs/labltk/frx/frx_misc.ml | 69 - otherlibs/labltk/frx/frx_misc.mli | 21 - otherlibs/labltk/frx/frx_req.ml | 198 - otherlibs/labltk/frx/frx_req.mli | 43 - otherlibs/labltk/frx/frx_rpc.ml | 55 - otherlibs/labltk/frx/frx_rpc.mli | 25 - otherlibs/labltk/frx/frx_selection.ml | 45 - otherlibs/labltk/frx/frx_selection.mli | 17 - otherlibs/labltk/frx/frx_synth.ml | 88 - otherlibs/labltk/frx/frx_synth.mli | 31 - otherlibs/labltk/frx/frx_text.ml | 228 - otherlibs/labltk/frx/frx_text.mli | 46 - otherlibs/labltk/frx/frx_toplevel.mli | 17 - otherlibs/labltk/frx/frx_widget.ml | 23 - otherlibs/labltk/frx/frx_widget.mli | 18 - otherlibs/labltk/frx/frxlib.mllib | 4 - otherlibs/labltk/jpf/Makefile | 93 - otherlibs/labltk/jpf/Makefile.nt | 17 - otherlibs/labltk/jpf/README | 2 - otherlibs/labltk/jpf/balloon.ml | 102 - otherlibs/labltk/jpf/balloon.mli | 24 - otherlibs/labltk/jpf/balloontest.ml | 31 - otherlibs/labltk/jpf/fileselect.ml | 367 - otherlibs/labltk/jpf/fileselect.mli | 37 - otherlibs/labltk/jpf/jpf_font.ml | 218 - otherlibs/labltk/jpf/jpf_font.mli | 54 - otherlibs/labltk/jpf/jpflib.mllib | 1 - otherlibs/labltk/jpf/shell.ml | 35 - otherlibs/labltk/jpf/shell.mli | 16 - otherlibs/labltk/labl.gif | Bin 1533 -> 0 bytes otherlibs/labltk/labltk/.ignore | 4 - otherlibs/labltk/labltk/Makefile | 59 - otherlibs/labltk/labltk/Makefile.gen | 68 - otherlibs/labltk/labltk/Makefile.gen.nt | 17 - otherlibs/labltk/labltk/Makefile.nt | 17 - otherlibs/labltk/labltk/byte.itarget | 8 - otherlibs/labltk/labltk/modules | 77 - otherlibs/labltk/labltk/native.itarget | 6 - otherlibs/labltk/lib/.ignore | 7 - otherlibs/labltk/lib/Makefile | 105 - otherlibs/labltk/lib/Makefile.nt | 17 - otherlibs/labltk/lib/labltk.bat | 1 - otherlibs/labltk/support/.depend | 27 - otherlibs/labltk/support/Makefile | 92 - otherlibs/labltk/support/Makefile.common | 45 - otherlibs/labltk/support/Makefile.nt | 17 - otherlibs/labltk/support/byte.itarget | 3 - otherlibs/labltk/support/camltk.h | 68 - otherlibs/labltk/support/camltkwrap.ml | 77 - otherlibs/labltk/support/camltkwrap.mli | 251 - otherlibs/labltk/support/cltkCaml.c | 85 - otherlibs/labltk/support/cltkDMain.c | 247 - otherlibs/labltk/support/cltkEval.c | 243 - otherlibs/labltk/support/cltkEvent.c | 54 - otherlibs/labltk/support/cltkFile.c | 154 - otherlibs/labltk/support/cltkImg.c | 118 - otherlibs/labltk/support/cltkMain.c | 181 - otherlibs/labltk/support/cltkMisc.c | 62 - otherlibs/labltk/support/cltkTimer.c | 44 - otherlibs/labltk/support/cltkUtf.c | 89 - otherlibs/labltk/support/cltkVar.c | 128 - otherlibs/labltk/support/cltkWait.c | 102 - otherlibs/labltk/support/fileevent.ml | 79 - otherlibs/labltk/support/fileevent.mli | 25 - otherlibs/labltk/support/liblabltk.clib | 2 - otherlibs/labltk/support/native.itarget | 3 - otherlibs/labltk/support/protocol.ml | 274 - otherlibs/labltk/support/protocol.mli | 124 - otherlibs/labltk/support/rawwidget.ml | 174 - otherlibs/labltk/support/rawwidget.mli | 109 - otherlibs/labltk/support/slave.ml | 51 - otherlibs/labltk/support/support.ml | 48 - otherlibs/labltk/support/support.mli | 21 - otherlibs/labltk/support/textvariable.ml | 150 - otherlibs/labltk/support/textvariable.mli | 45 - otherlibs/labltk/support/timer.ml | 56 - otherlibs/labltk/support/timer.mli | 23 - otherlibs/labltk/support/tkthread.ml | 67 - otherlibs/labltk/support/tkthread.mli | 46 - otherlibs/labltk/support/tkwait.ml | 25 - otherlibs/labltk/support/widget.ml | 23 - otherlibs/labltk/support/widget.mli | 109 - otherlibs/num/.depend | 1 + otherlibs/num/arith_flags.ml | 2 - otherlibs/num/arith_flags.mli | 2 - otherlibs/num/arith_status.ml | 2 - otherlibs/num/arith_status.mli | 2 - otherlibs/num/big_int.ml | 45 +- otherlibs/num/big_int.mli | 4 +- otherlibs/num/bng.c | 6 +- otherlibs/num/bng_arm64.c | 20 + otherlibs/num/bng_digit.c | 8 + otherlibs/num/int_misc.ml | 2 - otherlibs/num/int_misc.mli | 2 - otherlibs/num/nat.ml | 27 +- otherlibs/num/nat.mli | 2 - otherlibs/num/num.ml | 2 - otherlibs/num/num.mli | 2 - otherlibs/num/ratio.ml | 51 +- otherlibs/num/ratio.mli | 2 - otherlibs/str/str.ml | 54 +- otherlibs/str/str.mli | 1 + otherlibs/systhreads/Makefile | 39 +- otherlibs/systhreads/Makefile.nt | 21 +- otherlibs/systhreads/event.ml | 4 +- otherlibs/systhreads/threadUnix.ml | 6 + otherlibs/systhreads/threadUnix.mli | 25 +- otherlibs/threads/.depend | 4 +- otherlibs/threads/Makefile | 26 +- otherlibs/threads/event.ml | 4 +- otherlibs/threads/marshal.ml | 30 +- otherlibs/threads/pervasives.ml | 229 +- otherlibs/threads/threadUnix.ml | 7 + otherlibs/threads/threadUnix.mli | 25 +- otherlibs/threads/unix.ml | 42 +- otherlibs/unix/.depend | 105 +- otherlibs/unix/access.c | 12 +- otherlibs/unix/chdir.c | 12 +- otherlibs/unix/chmod.c | 12 +- otherlibs/unix/chown.c | 12 +- otherlibs/unix/chroot.c | 12 +- otherlibs/unix/close.c | 7 +- otherlibs/unix/closedir.c | 7 +- otherlibs/unix/fchmod.c | 7 +- otherlibs/unix/fchown.c | 8 +- otherlibs/unix/ftruncate.c | 16 +- otherlibs/unix/getaddrinfo.c | 14 +- otherlibs/unix/gethost.c | 3 +- otherlibs/unix/link.c | 17 +- otherlibs/unix/mkdir.c | 14 +- otherlibs/unix/mkfifo.c | 26 +- otherlibs/unix/open.c | 4 +- otherlibs/unix/opendir.c | 13 +- otherlibs/unix/readdir.c | 3 + otherlibs/unix/readlink.c | 12 +- otherlibs/unix/rename.c | 17 +- otherlibs/unix/rmdir.c | 14 +- otherlibs/unix/stat.c | 49 +- otherlibs/unix/symlink.c | 17 +- otherlibs/unix/truncate.c | 29 +- otherlibs/unix/unix.ml | 43 +- otherlibs/unix/unix.mli | 64 +- otherlibs/unix/unixLabels.mli | 92 +- otherlibs/unix/unlink.c | 14 +- otherlibs/unix/utimes.c | 26 +- otherlibs/win32graph/draw.c | 8 +- otherlibs/win32graph/open.c | 19 +- otherlibs/win32unix/Makefile | 60 + otherlibs/win32unix/createprocess.c | 5 + otherlibs/win32unix/select.c | 2 +- otherlibs/win32unix/sendrecv.c | 12 +- otherlibs/win32unix/unix.ml | 54 +- parsing/ast_helper.ml | 437 + parsing/ast_helper.mli | 363 + parsing/ast_mapper.ml | 1135 +- parsing/ast_mapper.mli | 371 +- parsing/asttypes.mli | 10 +- parsing/lexer.mli | 22 +- parsing/lexer.mll | 143 +- parsing/location.ml | 118 +- parsing/location.mli | 44 +- parsing/parse.ml | 23 +- parsing/parse.mli | 3 + parsing/parser.mly | 1182 +- parsing/parsetree.mli | 811 +- parsing/pprintast.ml | 1145 +- parsing/pprintast.mli | 32 +- parsing/printast.ml | 501 +- parsing/printast.mli | 4 + parsing/syntaxerr.ml | 68 +- parsing/syntaxerr.mli | 4 + stdlib/.depend | 187 +- stdlib/Compflags | 10 +- stdlib/Makefile | 25 +- stdlib/Makefile.nt | 2 +- stdlib/Makefile.shared | 25 +- stdlib/StdlibModules | 4 + stdlib/arg.ml | 8 +- stdlib/arg.mli | 4 +- stdlib/array.ml | 1 + stdlib/array.mli | 5 + stdlib/arrayLabels.mli | 6 +- stdlib/buffer.ml | 44 +- stdlib/buffer.mli | 41 +- stdlib/bytes.ml | 253 + stdlib/bytes.mli | 398 + stdlib/bytesLabels.ml | 16 + stdlib/bytesLabels.mli | 213 + stdlib/callback.ml | 4 +- stdlib/camlinternalFormat.ml | 2623 ++ stdlib/camlinternalFormat.mli | 104 + stdlib/camlinternalFormatBasics.ml | 614 + stdlib/camlinternalFormatBasics.mli | 287 + stdlib/camlinternalMod.ml | 5 + stdlib/camlinternalMod.mli | 1 + stdlib/camlinternalOO.ml | 28 +- stdlib/digest.ml | 28 +- stdlib/digest.mli | 10 +- stdlib/filename.mli | 7 +- stdlib/format.ml | 529 +- stdlib/format.mli | 71 +- stdlib/gc.mli | 12 +- stdlib/genlex.ml | 16 +- stdlib/hashtbl.mli | 31 +- stdlib/lazy.mli | 6 +- stdlib/lexing.ml | 47 +- stdlib/lexing.mli | 10 +- stdlib/list.ml | 103 + stdlib/list.mli | 3 + stdlib/map.mli | 20 + stdlib/marshal.ml | 35 +- stdlib/marshal.mli | 98 +- stdlib/moreLabels.mli | 1 + stdlib/nativeint.mli | 4 +- stdlib/obj.ml | 34 +- stdlib/obj.mli | 12 +- stdlib/parsing.ml | 16 +- stdlib/pervasives.ml | 142 +- stdlib/pervasives.mli | 102 +- stdlib/printexc.ml | 181 +- stdlib/printexc.mli | 183 +- stdlib/printf.ml | 751 +- stdlib/printf.mli | 73 +- stdlib/queue.mli | 2 +- stdlib/scanf.ml | 1042 +- stdlib/scanf.mli | 44 +- stdlib/set.ml | 30 + stdlib/set.mli | 27 + stdlib/sort.mli | 3 + stdlib/stdLabels.ml | 2 + stdlib/stdLabels.mli | 129 +- stdlib/stream.ml | 19 +- stdlib/stream.mli | 3 + stdlib/string.ml | 223 +- stdlib/string.mli | 165 +- stdlib/stringLabels.mli | 145 +- stdlib/sys.mli | 9 +- stdlib/weak.ml | 4 +- testsuite/Makefile | 11 +- testsuite/external/.ignore | 18 +- testsuite/external/Makefile | 215 +- testsuite/external/camlp5-git.patch | 12 + testsuite/external/coq-8.4pl1.patch | 11 + testsuite/external/coq-8.4pl2.patch | 11 + testsuite/external/obrowser-1.1.1.patch | 224 + testsuite/external/ocamlnet-3.5.1.patch | 11 + testsuite/interactive/lib-gc/alloc.ml | 2 +- testsuite/interactive/lib-graph-3/sorts.ml | 2 +- testsuite/makefiles/Makefile.common | 11 +- testsuite/makefiles/Makefile.one | 5 +- testsuite/makefiles/Makefile.several | 2 +- testsuite/tests/asmcomp/Makefile | 101 +- testsuite/tests/asmcomp/amd64.S | 2 +- testsuite/tests/asmcomp/arm64.S | 52 + testsuite/tests/asmcomp/lexcmm.mll | 18 +- testsuite/tests/asmcomp/main.ml | 1 + testsuite/tests/asmcomp/mainarith.c | 12 +- testsuite/tests/asmcomp/optargs.ml | 33 + testsuite/tests/asmcomp/parsecmm.mly | 12 +- testsuite/tests/asmcomp/sparc.S | 6 +- testsuite/tests/asmcomp/staticalloc.ml | 31 + testsuite/tests/backtrace/Makefile | 5 +- .../tests/backtrace/backtrace_deprecated.ml | 50 + .../backtrace/backtrace_deprecated.reference | 27 + testsuite/tests/backtrace/backtrace_slots.ml | 72 + .../tests/backtrace/backtrace_slots.reference | 27 + testsuite/tests/basic-io-2/io.ml | 6 +- .../Makefile | 10 +- testsuite/tests/basic-modules/main.ml | 13 + testsuite/tests/basic-modules/main.reference | 1 + testsuite/tests/basic-modules/offset.ml | 10 + testsuite/tests/basic-more/Makefile | 1 + testsuite/tests/basic-more/pr2719.ml | 17 + testsuite/tests/basic-more/pr2719.reference | 4 + testsuite/tests/basic-more/pr6216.ml | 12 + testsuite/tests/basic-more/pr6216.reference | 2 + testsuite/tests/basic-more/tprintf.ml | 11 +- testsuite/tests/basic/arrays.ml | 2 +- testsuite/tests/basic/constprop.ml | 72 + testsuite/tests/basic/constprop.mlp | 130 + testsuite/tests/basic/constprop.reference | 10 + testsuite/tests/basic/divint.ml | 112 + testsuite/tests/basic/divint.reference | 33 + testsuite/tests/basic/maps.ml | 15 +- testsuite/tests/basic/patmatch.ml | 38 + testsuite/tests/basic/patmatch.reference | 3 + testsuite/tests/basic/stringmatch.ml | 738 + .../tests/basic/stringmatch.reference | 0 testsuite/tests/basic/tailcalls.ml | 17 +- testsuite/tests/basic/tailcalls.reference | 1 + testsuite/tests/callback/Makefile | 3 +- testsuite/tests/embedded/Makefile | 4 +- testsuite/tests/embedded/cmcaml.ml | 2 +- testsuite/tests/formats-transition/Makefile | 3 + .../deprecated_unsigned_printers.ml | 22 + .../deprecated_unsigned_printers.ml.reference | 7 + .../ignored_scan_counters.ml | 30 + .../ignored_scan_counters.ml.reference | 14 + .../legacy_incompatible_flags.ml | 20 + .../legacy_unfinished_modifiers.ml | 18 + .../legacy_unfinished_modifiers.ml.reference | 6 + testsuite/tests/gc-roots/globrootsprim.c | 12 +- testsuite/tests/lib-bigarray-2/bigarrfml.ml | 12 +- testsuite/tests/lib-bigarray/bigarrays.ml | 32 +- testsuite/tests/lib-digest/md5.ml | 26 +- testsuite/tests/lib-dynlink-bytecode/Makefile | 6 +- testsuite/tests/lib-dynlink-csharp/Makefile | 6 +- testsuite/tests/lib-dynlink-csharp/entry.c | 4 +- testsuite/tests/lib-dynlink-native/Makefile | 6 +- testsuite/tests/lib-format/Makefile | 6 +- testsuite/tests/lib-hashtbl/hfun.ml | 3 +- testsuite/tests/lib-marshal/intext.ml | 48 +- testsuite/tests/lib-num/end_test.reference | 4 +- testsuite/tests/lib-num/test_big_ints.ml | 12 + testsuite/tests/lib-num/test_nats.ml | 5 +- testsuite/tests/lib-num/test_nums.ml | 15 + testsuite/tests/lib-printf/Makefile | 5 +- testsuite/tests/lib-printf/tprintf.ml | 251 +- testsuite/tests/lib-printf/tprintf.reference | 88 +- testsuite/tests/lib-scanf-2/Makefile | 7 +- testsuite/tests/lib-scanf/tscanf.ml | 4 +- testsuite/tests/lib-set/testset.ml | 3 +- .../tests/lib-systhreads/testfork.precheck | 1 - testsuite/tests/lib-threads/test1.ml | 2 +- testsuite/tests/lib-threads/test7.checker | 3 +- testsuite/tests/lib-threads/testA.ml | 4 +- testsuite/tests/lib-threads/testsocket.ml | 8 +- .../tests/lib-threads/testsocket.precheck | 2 +- testsuite/tests/lib-threads/token1.ml | 2 +- testsuite/tests/lib-threads/token2.ml | 6 +- .../tests/match-exception-warnings/Makefile | 14 +- .../exhaustiveness_warnings.ml | 12 + .../exhaustiveness_warnings.ml.reference | 11 + .../tests/match-exception/Makefile | 14 +- testsuite/tests/match-exception/allocation.ml | 24 + .../match-exception/allocation.reference | 1 + .../match-exception/exception_propagation.ml | 17 + .../exception_propagation.reference | 1 + .../tests/match-exception/match_failure.ml | 19 + .../match-exception/match_failure.reference | 1 + .../tests/match-exception/nested_handlers.ml | 45 + .../match-exception/nested_handlers.reference | 1 + .../raise_from_success_continuation.ml | 15 + .../raise_from_success_continuation.reference | 2 + testsuite/tests/match-exception/streams.ml | 37 + .../tests/match-exception/streams.reference | 1 + testsuite/tests/match-exception/tail_calls.ml | 21 + .../match-exception/tail_calls.reference | 1 + testsuite/tests/misc-kb/kb.mli | 4 +- testsuite/tests/misc-unsafe/fft.ml | 4 +- testsuite/tests/misc-unsafe/quicksort.ml | 4 +- testsuite/tests/misc/bdd.ml | 24 +- testsuite/tests/prim-bigstring/Makefile | 8 + .../tests/prim-bigstring/bigstring_access.ml | 102 + .../prim-bigstring/bigstring_access.reference | 6 + .../tests/prim-bigstring/string_access.ml | 89 + .../prim-bigstring/string_access.reference | 6 + testsuite/tests/regression/pr5757/pr5757.ml | 2 +- testsuite/tests/regression/pr6024/Makefile | 5 +- testsuite/tests/runtime-errors/Makefile | 4 +- .../stackoverflow.bytecode.checker | 1 - .../stackoverflow.native.checker | 1 - .../runtime-errors/syserror.bytecode.checker | 3 - testsuite/tests/tool-debugger/basic/.ignore | 1 + testsuite/tests/tool-debugger/basic/Makefile | 58 + .../tests/tool-debugger/basic/debuggee.ml | 2 + .../tool-debugger/basic/debuggee.reference | 5 + .../tests/tool-debugger/basic/input_script | 5 + .../tool-debugger/find-artifacts/.ignore | 2 + .../tool-debugger/find-artifacts/Makefile | 67 + .../find-artifacts/debuggee.reference | 6 + .../tool-debugger/find-artifacts/in/blah.ml | 3 + .../tool-debugger/find-artifacts/in/foo.ml | 13 + .../tool-debugger/find-artifacts/input_script | 5 + testsuite/tests/tool-lexyacc/lexgen.ml | 17 +- testsuite/tests/tool-ocamldoc/Makefile | 6 +- testsuite/tests/tool-ocamldoc/odoc_test.ml | 14 +- testsuite/tests/tool-ocamldoc/t01.ml | 3 + testsuite/tests/tool-ocamldoc/t01.reference | 5 + .../tests/tool-toplevel/Makefile | 14 +- testsuite/tests/tool-toplevel/tracing.ml | 4 + .../tests/tool-toplevel/tracing.ml.reference | 30 + testsuite/tests/typing-extensions/Makefile | 4 + testsuite/tests/typing-extensions/cast.ml | 96 + .../tests/typing-extensions/cast.ml.reference | 33 + .../tests/typing-extensions/extensions.ml | 321 + .../typing-extensions/extensions.ml.reference | 131 + testsuite/tests/typing-extensions/msg.ml | 131 + .../tests/typing-extensions/msg.ml.reference | 23 + .../tests/typing-extensions/open_types.ml | 109 + .../typing-extensions/open_types.ml.reference | 83 + testsuite/tests/typing-fstclassmod/Makefile | 2 +- .../tests/typing-fstclassmod/fstclassmod.ml | 24 + .../typing-fstclassmod/fstclassmod.reference | 1 + testsuite/tests/typing-gadts/didier.ml | 48 + testsuite/tests/typing-gadts/omega07.ml | 6 +- .../omega07.ml.principal.reference | 2 +- .../tests/typing-gadts/omega07.ml.reference | 2 +- testsuite/tests/typing-gadts/pr5948.ml | 8 +- testsuite/tests/typing-gadts/pr5985.ml | 8 + .../tests/typing-gadts/pr5985.ml.reference | 26 +- testsuite/tests/typing-gadts/pr6163.ml | 2 +- testsuite/tests/typing-gadts/pr6174.ml | 3 + .../pr6174.ml.principal.reference | 7 + .../tests/typing-gadts/pr6174.ml.reference | 7 + testsuite/tests/typing-gadts/pr6241.ml | 16 + .../pr6241.ml.principal.reference | 15 + .../tests/typing-gadts/pr6241.ml.reference | 15 + testsuite/tests/typing-gadts/test.ml | 8 +- .../typing-gadts/test.ml.principal.reference | 8 +- .../tests/typing-gadts/test.ml.reference | 11 +- testsuite/tests/typing-gadts/unify_mb.ml | 170 + .../unify_mb.ml.principal.reference | 45 + .../tests/typing-gadts/unify_mb.ml.reference | 45 + testsuite/tests/typing-labels/mixin2.ml | 4 +- testsuite/tests/typing-labels/mixin3.ml | 4 +- testsuite/tests/typing-misc-bugs/Makefile | 14 + .../tests/typing-misc-bugs/pr6303_bad.ml | 3 + testsuite/tests/typing-misc/constraints.ml | 8 + .../typing-misc/constraints.ml.reference | 5 + testsuite/tests/typing-misc/labels.ml | 9 +- .../typing-misc/labels.ml.principal.reference | 10 +- .../tests/typing-misc/labels.ml.reference | 10 +- testsuite/tests/typing-misc/variant.ml | 8 + .../tests/typing-misc/variant.ml.reference | 16 + .../gatien_baron_20131019_ok.ml | 31 + .../tests/typing-modules-bugs/pr6240_ok.ml | 11 + .../tests/typing-modules-bugs/pr6293_bad.ml | 2 + .../tests/typing-modules-bugs/pr6427_bad.ml | 20 + .../tests/typing-modules-bugs/pr6513_ok.ml | 25 + testsuite/tests/typing-modules/Test.ml | 5 + .../Test.ml.principal.reference | 5 + .../tests/typing-modules/Test.ml.reference | 5 + testsuite/tests/typing-modules/a.mli | 3 + testsuite/tests/typing-modules/aliases.ml | 237 + .../tests/typing-modules/aliases.ml.reference | 414 + testsuite/tests/typing-modules/b.ml | 18 + testsuite/tests/typing-modules/b2.ml | 14 + testsuite/tests/typing-modules/b3.mli | 4 + testsuite/tests/typing-modules/d.ml | 2 + testsuite/tests/typing-modules/firstclass.ml | 21 + .../typing-modules/firstclass.ml.reference | 27 + testsuite/tests/typing-modules/generative.ml | 34 + .../typing-modules/generative.ml.reference | 44 + testsuite/tests/typing-objects/Exemples.ml | 12 +- .../Exemples.ml.principal.reference | 24 +- .../typing-objects/Exemples.ml.reference | 24 +- testsuite/tests/typing-objects/Tests.ml | 22 +- .../Tests.ml.principal.reference | 22 +- .../tests/typing-objects/Tests.ml.reference | 22 +- testsuite/tests/typing-objects/pr6383.ml | 1 + .../tests/typing-objects/pr6383.ml.reference | 6 + testsuite/tests/typing-private/private.ml | 8 + .../private.ml.principal.reference | 125 + .../tests/typing-private/private.ml.reference | 21 +- testsuite/tests/typing-recmod/t19ok.ml | 7 +- .../tests/typing-rectypes-bugs/pr6174_bad.ml | 3 + .../short-paths.ml.reference | 47 +- testsuite/tests/typing-signatures/els.ml | 3 + .../tests/typing-signatures/els.ml.reference | 2 + testsuite/tests/typing-signatures/pr6371.ml | 7 + .../typing-signatures/pr6371.ml.reference | 4 + testsuite/tests/typing-warnings/coercions.ml | 5 + .../coercions.ml.principal.reference | 15 + .../typing-warnings/coercions.ml.reference | 11 + testsuite/tests/typing-warnings/records.ml | 20 + .../records.ml.principal.reference | 56 +- .../typing-warnings/records.ml.reference | 54 +- testsuite/typing | 2 + tools/.depend | 70 +- tools/.ignore | 3 +- tools/Makefile | 2 +- tools/Makefile.nt | 2 +- tools/Makefile.shared | 96 +- tools/addlabels.ml | 10 +- tools/check-typo | 18 +- tools/ci-build | 144 + tools/cmt2annot.ml | 29 +- tools/depend.ml | 216 +- tools/dumpobj.ml | 14 +- tools/eqparsetree.ml | 40 +- tools/make-package-macosx | 2 +- tools/make-version-header.sh | 20 +- tools/objinfo.ml | 82 +- tools/objinfo_helper.c | 5 + tools/ocamlcp.ml | 11 +- tools/ocamldep.ml | 56 +- tools/{ocamlmklib.mlp => ocamlmklib.ml} | 12 +- tools/ocamloptp.ml | 13 +- tools/ocamlprof.ml | 125 +- tools/profiling.ml | 2 +- tools/read_cmt.ml | 42 +- tools/tast_iter.ml | 178 +- tools/tast_iter.mli | 22 +- tools/untypeast.ml | 489 +- tools/untypeast.mli | 3 + toplevel/expunge.ml | 2 +- toplevel/genprintval.ml | 106 +- toplevel/genprintval.mli | 2 +- toplevel/opttoploop.ml | 12 +- toplevel/opttoploop.mli | 2 + toplevel/opttopmain.ml | 4 +- toplevel/topdirs.ml | 147 +- toplevel/toploop.ml | 95 +- toplevel/toploop.mli | 6 +- toplevel/topmain.ml | 8 +- toplevel/trace.ml | 8 +- typing/btype.ml | 159 +- typing/btype.mli | 30 + typing/cmi_format.ml | 15 +- typing/cmi_format.mli | 2 +- typing/cmt_format.ml | 27 +- typing/cmt_format.mli | 9 +- typing/ctype.ml | 575 +- typing/ctype.mli | 14 +- typing/datarepr.ml | 100 +- typing/datarepr.mli | 12 +- typing/env.ml | 572 +- typing/env.mli | 60 +- typing/envaux.ml | 28 +- typing/ident.ml | 12 + typing/ident.mli | 5 + typing/includeclass.ml | 2 +- typing/includecore.ml | 66 +- typing/includecore.mli | 4 +- typing/includemod.ml | 229 +- typing/includemod.mli | 13 +- typing/mtype.ml | 233 +- typing/mtype.mli | 3 + typing/oprint.ml | 167 +- typing/oprint.mli | 1 + typing/outcometree.mli | 31 +- typing/parmatch.ml | 250 +- typing/parmatch.mli | 6 +- typing/predef.ml | 83 +- typing/predef.mli | 9 +- typing/printtyp.ml | 209 +- typing/printtyp.mli | 8 +- typing/printtyped.ml | 445 +- typing/subst.ml | 128 +- typing/subst.mli | 5 +- typing/typeclass.ml | 506 +- typing/typeclass.mli | 3 +- typing/typecore.ml | 1410 +- typing/typecore.mli | 20 +- typing/typedecl.ml | 838 +- typing/typedecl.mli | 29 +- typing/typedtree.ml | 350 +- typing/typedtree.mli | 345 +- typing/typedtreeIter.ml | 270 +- typing/typedtreeIter.mli | 20 +- typing/typedtreeMap.ml | 377 +- typing/typedtreeMap.mli | 20 +- typing/typemod.ml | 1113 +- typing/typemod.mli | 13 +- typing/types.ml | 101 +- typing/types.mli | 104 +- typing/typetexp.ml | 375 +- typing/typetexp.mli | 22 +- utils/clflags.ml | 11 +- utils/clflags.mli | 11 +- utils/config.mlbuild | 13 +- utils/config.mli | 6 + utils/config.mlp | 21 +- utils/consistbl.ml | 15 +- utils/consistbl.mli | 7 +- utils/misc.ml | 39 +- utils/misc.mli | 9 +- utils/warnings.ml | 97 +- utils/warnings.mli | 13 +- yacc/main.c | 50 +- 1327 files changed, 44135 insertions(+), 110328 deletions(-) create mode 100644 .gitignore create mode 100644 .ocp-indent create mode 100644 .travis-ci.sh create mode 100644 .travis.yml delete mode 100644 _tags create mode 100644 asmcomp/CSEgen.ml create mode 100644 asmcomp/CSEgen.mli create mode 100644 asmcomp/amd64/CSE.ml create mode 100644 asmcomp/arm/CSE.ml create mode 100644 asmcomp/arm64/CSE.ml create mode 100644 asmcomp/arm64/arch.ml create mode 100644 asmcomp/arm64/emit.mlp create mode 100644 asmcomp/arm64/proc.ml rename testsuite/tests/regression/camlp4-class-type-plus/camlp4_class_type_plus_ok.ml => asmcomp/arm64/reload.ml (71%) create mode 100644 asmcomp/arm64/scheduling.ml create mode 100644 asmcomp/arm64/selection.ml create mode 100644 asmcomp/deadcode.ml create mode 100644 asmcomp/deadcode.mli create mode 100644 asmcomp/i386/CSE.ml create mode 100644 asmcomp/power/CSE.ml create mode 100644 asmcomp/sparc/CSE.ml create mode 100644 asmcomp/strmatch.ml create mode 100644 asmcomp/strmatch.mli create mode 100644 asmrun/arm64.S delete mode 100755 boot/myocamlbuild.boot delete mode 100644 build/.ignore delete mode 100755 build/boot-c-parts.sh delete mode 100755 build/boot.sh delete mode 100755 build/buildbot delete mode 100644 build/camlp4-bootstrap-recipe.txt delete mode 100755 build/camlp4-bootstrap.sh delete mode 100755 build/camlp4-mkCamlp4Ast.sh delete mode 100755 build/camlp4-native-only.sh delete mode 100644 build/camlp4-targets.sh delete mode 100755 build/distclean.sh delete mode 100755 build/fastworld.sh delete mode 100755 build/install.sh delete mode 100755 build/mixed-boot.sh delete mode 100755 build/mkconfig.sh delete mode 100755 build/mkmyocamlbuild_config.sh delete mode 100755 build/mkruntimedef.sh delete mode 100755 build/myocamlbuild.sh delete mode 100644 build/new-build-system delete mode 100755 build/ocamlbuildlib-native-only.sh delete mode 100644 build/otherlibs-targets.sh delete mode 100755 build/partial-install.sh delete mode 100644 build/targets.sh delete mode 100644 build/tolower.sed delete mode 100755 build/world.all.sh delete mode 100755 build/world.byte.sh delete mode 100755 build/world.native.sh delete mode 100755 build/world.sh delete mode 100644 camlp4/.ignore delete mode 100644 camlp4/CHANGES delete mode 100644 camlp4/Camlp4.mlpack delete mode 100644 camlp4/Camlp4/Camlp4Ast.partial.ml delete mode 100644 camlp4/Camlp4/Debug.ml delete mode 100644 camlp4/Camlp4/Debug.mli delete mode 100644 camlp4/Camlp4/ErrorHandler.ml delete mode 100644 camlp4/Camlp4/ErrorHandler.mli delete mode 100644 camlp4/Camlp4/OCamlInitSyntax.ml delete mode 100644 camlp4/Camlp4/Options.ml delete mode 100644 camlp4/Camlp4/Options.mli delete mode 100644 camlp4/Camlp4/PreCast.ml delete mode 100644 camlp4/Camlp4/PreCast.mli delete mode 100644 camlp4/Camlp4/Printers.mlpack delete mode 100644 camlp4/Camlp4/Printers/DumpCamlp4Ast.ml delete mode 100644 camlp4/Camlp4/Printers/DumpCamlp4Ast.mli delete mode 100644 camlp4/Camlp4/Printers/DumpOCamlAst.ml delete mode 100644 camlp4/Camlp4/Printers/DumpOCamlAst.mli delete mode 100644 camlp4/Camlp4/Printers/Null.ml delete mode 100644 camlp4/Camlp4/Printers/Null.mli delete mode 100644 camlp4/Camlp4/Printers/OCaml.ml delete mode 100644 camlp4/Camlp4/Printers/OCaml.mli delete mode 100644 camlp4/Camlp4/Printers/OCamlr.ml delete mode 100644 camlp4/Camlp4/Printers/OCamlr.mli delete mode 100644 camlp4/Camlp4/Register.ml delete mode 100644 camlp4/Camlp4/Register.mli delete mode 100644 camlp4/Camlp4/Sig.ml delete mode 100644 camlp4/Camlp4/Struct.mlpack delete mode 100644 camlp4/Camlp4/Struct/.ignore delete mode 100644 camlp4/Camlp4/Struct/AstFilters.ml delete mode 100644 camlp4/Camlp4/Struct/Camlp4Ast.mlast delete mode 100644 camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml delete mode 100644 camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli delete mode 100644 camlp4/Camlp4/Struct/CleanAst.ml delete mode 100644 camlp4/Camlp4/Struct/CommentFilter.ml delete mode 100644 camlp4/Camlp4/Struct/CommentFilter.mli delete mode 100644 camlp4/Camlp4/Struct/DynAst.ml delete mode 100644 camlp4/Camlp4/Struct/DynLoader.ml delete mode 100644 camlp4/Camlp4/Struct/DynLoader.mli delete mode 100644 camlp4/Camlp4/Struct/EmptyError.ml delete mode 100644 camlp4/Camlp4/Struct/EmptyError.mli delete mode 100644 camlp4/Camlp4/Struct/EmptyPrinter.ml delete mode 100644 camlp4/Camlp4/Struct/EmptyPrinter.mli delete mode 100644 camlp4/Camlp4/Struct/FreeVars.ml delete mode 100644 camlp4/Camlp4/Struct/FreeVars.mli delete mode 100644 camlp4/Camlp4/Struct/Grammar.mlpack delete mode 100644 camlp4/Camlp4/Struct/Grammar/Delete.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Dynamic.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Entry.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Failed.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Find.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Fold.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Fold.mli delete mode 100644 camlp4/Camlp4/Struct/Grammar/Insert.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Parser.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Parser.mli delete mode 100644 camlp4/Camlp4/Struct/Grammar/Print.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Print.mli delete mode 100644 camlp4/Camlp4/Struct/Grammar/Search.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Static.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Structure.ml delete mode 100644 camlp4/Camlp4/Struct/Grammar/Tools.ml delete mode 100644 camlp4/Camlp4/Struct/Lexer.mll delete mode 100644 camlp4/Camlp4/Struct/Loc.ml delete mode 100644 camlp4/Camlp4/Struct/Loc.mli delete mode 100644 camlp4/Camlp4/Struct/Quotation.ml delete mode 100644 camlp4/Camlp4/Struct/Token.ml delete mode 100644 camlp4/Camlp4/Struct/Token.mli delete mode 100644 camlp4/Camlp4Bin.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4AstLifter.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4FoldGenerator.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4LocationStripper.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4MapGenerator.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4MetaGenerator.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4Profiler.ml delete mode 100644 camlp4/Camlp4Filters/Camlp4TrashRemover.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4AstLoader.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4DebugParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4GrammarParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4ListComprehension.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4MacroParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml delete mode 100644 camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4AstDumper.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4AutoPrinter.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4NullDumper.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4OCamlPrinter.ml delete mode 100644 camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.ml delete mode 100644 camlp4/Camlp4Top.mlpack delete mode 100644 camlp4/Camlp4Top/Rprint.ml delete mode 100644 camlp4/Camlp4Top/Top.ml delete mode 100644 camlp4/Camlp4_config.ml delete mode 100644 camlp4/Camlp4_config.mli delete mode 100644 camlp4/ICHANGES delete mode 100644 camlp4/boot/.ignore delete mode 100644 camlp4/boot/Camlp4.ml delete mode 100644 camlp4/boot/Camlp4.ml4 delete mode 100644 camlp4/boot/Camlp4Ast.ml delete mode 100644 camlp4/boot/camlp4boot.ml delete mode 100644 camlp4/boot/camlp4boot.ml4 delete mode 100644 camlp4/build/.ignore delete mode 100644 camlp4/camlp4.odocl delete mode 100644 camlp4/camlp4fulllib.mllib delete mode 100644 camlp4/camlp4lib.mllib delete mode 100644 camlp4/camlp4prof.ml delete mode 100644 camlp4/camlp4prof.mli delete mode 100644 camlp4/examples/_tags delete mode 100644 camlp4/examples/all.itarget delete mode 100644 camlp4/examples/apply_operator.ml delete mode 100644 camlp4/examples/apply_operator_test.ml delete mode 100644 camlp4/examples/arith.ml delete mode 100644 camlp4/examples/debug_extension.ml delete mode 100644 camlp4/examples/ex_str.ml delete mode 100644 camlp4/examples/ex_str_test.ml delete mode 100644 camlp4/examples/expression_closure.ml delete mode 100644 camlp4/examples/expression_closure_filter.ml delete mode 100644 camlp4/examples/expression_closure_test.ml delete mode 100644 camlp4/examples/fancy_lambda_quot.ml delete mode 100644 camlp4/examples/fancy_lambda_quot_test.ml delete mode 100644 camlp4/examples/free_vars_test.ml delete mode 100644 camlp4/examples/gen_match_case.ml delete mode 100644 camlp4/examples/gen_type_N.ml delete mode 100644 camlp4/examples/gettext_test.ml delete mode 100644 camlp4/examples/global_handler.ml delete mode 100644 camlp4/examples/global_handler_test.ml delete mode 100644 camlp4/examples/lambda_parser.ml delete mode 100644 camlp4/examples/lambda_quot.ml delete mode 100644 camlp4/examples/lambda_quot_expr.ml delete mode 100644 camlp4/examples/lambda_quot_patt.ml delete mode 100644 camlp4/examples/lambda_test.ml delete mode 100644 camlp4/examples/macros.ml delete mode 100644 camlp4/examples/parse_files.ml delete mode 100644 camlp4/examples/syb_fold.ml delete mode 100644 camlp4/examples/syb_map.ml delete mode 100644 camlp4/examples/test.itarget delete mode 100644 camlp4/examples/test_macros.ml delete mode 100644 camlp4/examples/test_type_quotation.ml delete mode 100644 camlp4/examples/type_quotation.ml delete mode 100644 camlp4/man/.ignore delete mode 100644 camlp4/man/Makefile delete mode 100644 camlp4/man/camlp4.1.tpl delete mode 100644 camlp4/mkcamlp4.ml delete mode 100644 config/auto-aux/tclversion.c delete mode 100644 myocamlbuild.ml delete mode 100644 myocamlbuild_config.mli create mode 100644 ocamlbuild/const.ml create mode 100644 ocamlbuild/loc.ml create mode 100644 ocamlbuild/loc.mli create mode 100644 ocamlbuild/testsuite/README create mode 100644 ocamlbuild/testsuite/external.ml create mode 100644 ocamlbuild/testsuite/external_test_header.ml create mode 100644 ocamlbuild/testsuite/findlibonly.ml create mode 100644 ocamlbuild/testsuite/findlibonly_test_header.ml rename ocamlbuild/testsuite/{level0.ml => internal.ml} (53%) create mode 100644 ocamlbuild/testsuite/internal_test_header.ml create mode 100644 ocamldoc/odoc_extension.ml delete mode 100644 otherlibs/labltk/.ignore delete mode 100644 otherlibs/labltk/Changes delete mode 100644 otherlibs/labltk/Makefile delete mode 100644 otherlibs/labltk/Makefile.nt delete mode 100644 otherlibs/labltk/README delete mode 100644 otherlibs/labltk/Widgets.src delete mode 100644 otherlibs/labltk/browser/.depend delete mode 100644 otherlibs/labltk/browser/.ignore delete mode 100644 otherlibs/labltk/browser/Makefile delete mode 100644 otherlibs/labltk/browser/Makefile.nt delete mode 100644 otherlibs/labltk/browser/Makefile.shared delete mode 100644 otherlibs/labltk/browser/README delete mode 100644 otherlibs/labltk/browser/dummyUnix.mli delete mode 100644 otherlibs/labltk/browser/dummyWin.mli delete mode 100644 otherlibs/labltk/browser/editor.ml delete mode 100644 otherlibs/labltk/browser/editor.mli delete mode 100644 otherlibs/labltk/browser/fileselect.ml delete mode 100644 otherlibs/labltk/browser/fileselect.mli delete mode 100644 otherlibs/labltk/browser/help.txt delete mode 100644 otherlibs/labltk/browser/jg_bind.ml delete mode 100644 otherlibs/labltk/browser/jg_bind.mli delete mode 100644 otherlibs/labltk/browser/jg_box.ml delete mode 100644 otherlibs/labltk/browser/jg_button.ml delete mode 100644 otherlibs/labltk/browser/jg_completion.ml delete mode 100644 otherlibs/labltk/browser/jg_completion.mli delete mode 100644 otherlibs/labltk/browser/jg_config.ml delete mode 100644 otherlibs/labltk/browser/jg_config.mli delete mode 100644 otherlibs/labltk/browser/jg_entry.ml delete mode 100644 otherlibs/labltk/browser/jg_memo.ml delete mode 100644 otherlibs/labltk/browser/jg_memo.mli delete mode 100644 otherlibs/labltk/browser/jg_menu.ml delete mode 100644 otherlibs/labltk/browser/jg_message.ml delete mode 100644 otherlibs/labltk/browser/jg_message.mli delete mode 100644 otherlibs/labltk/browser/jg_multibox.ml delete mode 100644 otherlibs/labltk/browser/jg_multibox.mli delete mode 100644 otherlibs/labltk/browser/jg_text.ml delete mode 100644 otherlibs/labltk/browser/jg_text.mli delete mode 100644 otherlibs/labltk/browser/jg_tk.ml delete mode 100644 otherlibs/labltk/browser/jg_toplevel.ml delete mode 100644 otherlibs/labltk/browser/jglib.mllib delete mode 100644 otherlibs/labltk/browser/lexical.ml delete mode 100644 otherlibs/labltk/browser/lexical.mli delete mode 100644 otherlibs/labltk/browser/list2.ml delete mode 100644 otherlibs/labltk/browser/main.ml delete mode 100644 otherlibs/labltk/browser/mytypes.mli delete mode 100644 otherlibs/labltk/browser/searchid.ml delete mode 100644 otherlibs/labltk/browser/searchid.mli delete mode 100644 otherlibs/labltk/browser/searchpos.ml delete mode 100644 otherlibs/labltk/browser/searchpos.mli delete mode 100644 otherlibs/labltk/browser/setpath.ml delete mode 100644 otherlibs/labltk/browser/setpath.mli delete mode 100644 otherlibs/labltk/browser/shell.ml delete mode 100644 otherlibs/labltk/browser/shell.mli delete mode 100644 otherlibs/labltk/browser/typecheck.ml delete mode 100644 otherlibs/labltk/browser/typecheck.mli delete mode 100644 otherlibs/labltk/browser/useunix.ml delete mode 100644 otherlibs/labltk/browser/useunix.mli delete mode 100644 otherlibs/labltk/browser/viewer.ml delete mode 100644 otherlibs/labltk/browser/viewer.mli delete mode 100644 otherlibs/labltk/browser/winmain.c delete mode 100644 otherlibs/labltk/builtin/LICENSE delete mode 100644 otherlibs/labltk/builtin/builtin_FilePattern.ml delete mode 100644 otherlibs/labltk/builtin/builtin_GetBitmap.ml delete mode 100644 otherlibs/labltk/builtin/builtin_GetCursor.ml delete mode 100644 otherlibs/labltk/builtin/builtin_GetPixel.ml delete mode 100644 otherlibs/labltk/builtin/builtin_ScrollValue.ml delete mode 100644 otherlibs/labltk/builtin/builtin_bind.ml delete mode 100644 otherlibs/labltk/builtin/builtin_bindtags.ml delete mode 100644 otherlibs/labltk/builtin/builtin_font.ml delete mode 100644 otherlibs/labltk/builtin/builtin_grab.ml delete mode 100644 otherlibs/labltk/builtin/builtin_index.ml delete mode 100644 otherlibs/labltk/builtin/builtin_palette.ml delete mode 100644 otherlibs/labltk/builtin/builtin_text.ml delete mode 100644 otherlibs/labltk/builtin/builtinf_GetPixel.ml delete mode 100644 otherlibs/labltk/builtin/builtinf_bind.ml delete mode 100644 otherlibs/labltk/builtin/builtini_GetBitmap.ml delete mode 100644 otherlibs/labltk/builtin/builtini_GetCursor.ml delete mode 100644 otherlibs/labltk/builtin/builtini_GetPixel.ml delete mode 100644 otherlibs/labltk/builtin/builtini_ScrollValue.ml delete mode 100644 otherlibs/labltk/builtin/builtini_bind.ml delete mode 100644 otherlibs/labltk/builtin/builtini_bindtags.ml delete mode 100644 otherlibs/labltk/builtin/builtini_font.ml delete mode 100644 otherlibs/labltk/builtin/builtini_grab.ml delete mode 100644 otherlibs/labltk/builtin/builtini_index.ml delete mode 100644 otherlibs/labltk/builtin/builtini_palette.ml delete mode 100644 otherlibs/labltk/builtin/builtini_text.ml delete mode 100644 otherlibs/labltk/builtin/canvas_bind.ml delete mode 100644 otherlibs/labltk/builtin/canvas_bind.mli delete mode 100644 otherlibs/labltk/builtin/dialog.ml delete mode 100644 otherlibs/labltk/builtin/dialog.mli delete mode 100644 otherlibs/labltk/builtin/image.ml delete mode 100644 otherlibs/labltk/builtin/image.mli delete mode 100644 otherlibs/labltk/builtin/optionmenu.ml delete mode 100644 otherlibs/labltk/builtin/optionmenu.mli delete mode 100644 otherlibs/labltk/builtin/rawimg.ml delete mode 100644 otherlibs/labltk/builtin/rawimg.mli delete mode 100644 otherlibs/labltk/builtin/report.ml delete mode 100644 otherlibs/labltk/builtin/selection_handle_set.ml delete mode 100644 otherlibs/labltk/builtin/selection_handle_set.mli delete mode 100644 otherlibs/labltk/builtin/selection_own_set.ml delete mode 100644 otherlibs/labltk/builtin/selection_own_set.mli delete mode 100644 otherlibs/labltk/builtin/text_tag_bind.ml delete mode 100644 otherlibs/labltk/builtin/text_tag_bind.mli delete mode 100644 otherlibs/labltk/builtin/winfo_contained.ml delete mode 100644 otherlibs/labltk/builtin/winfo_contained.mli delete mode 100644 otherlibs/labltk/camltk/.ignore delete mode 100644 otherlibs/labltk/camltk/Makefile delete mode 100644 otherlibs/labltk/camltk/Makefile.gen delete mode 100644 otherlibs/labltk/camltk/Makefile.gen.nt delete mode 100644 otherlibs/labltk/camltk/Makefile.nt delete mode 100644 otherlibs/labltk/camltk/byte.itarget delete mode 100644 otherlibs/labltk/camltk/modules delete mode 100644 otherlibs/labltk/camltk/native.itarget delete mode 100644 otherlibs/labltk/compiler/.depend delete mode 100644 otherlibs/labltk/compiler/.ignore delete mode 100644 otherlibs/labltk/compiler/Makefile delete mode 100644 otherlibs/labltk/compiler/Makefile.nt delete mode 100644 otherlibs/labltk/compiler/code.mli delete mode 100644 otherlibs/labltk/compiler/compile.ml delete mode 100644 otherlibs/labltk/compiler/copyright delete mode 100644 otherlibs/labltk/compiler/flags.ml delete mode 100644 otherlibs/labltk/compiler/intf.ml delete mode 100644 otherlibs/labltk/compiler/lexer.mll delete mode 100644 otherlibs/labltk/compiler/maincompile.ml delete mode 100644 otherlibs/labltk/compiler/parser.mly delete mode 100644 otherlibs/labltk/compiler/pp.ml delete mode 100644 otherlibs/labltk/compiler/ppexec.ml delete mode 100644 otherlibs/labltk/compiler/pplex.mli delete mode 100644 otherlibs/labltk/compiler/pplex.mll delete mode 100644 otherlibs/labltk/compiler/ppparse.ml delete mode 100644 otherlibs/labltk/compiler/ppyac.mly delete mode 100644 otherlibs/labltk/compiler/printer.ml delete mode 100644 otherlibs/labltk/compiler/tables.ml delete mode 100644 otherlibs/labltk/compiler/tsort.ml delete mode 100644 otherlibs/labltk/examples_camltk/.ignore delete mode 100644 otherlibs/labltk/examples_camltk/Makefile delete mode 100644 otherlibs/labltk/examples_camltk/Makefile.nt delete mode 100644 otherlibs/labltk/examples_camltk/addition.ml delete mode 100644 otherlibs/labltk/examples_camltk/eyes.ml delete mode 100644 otherlibs/labltk/examples_camltk/fileinput.ml delete mode 100644 otherlibs/labltk/examples_camltk/fileopen.ml delete mode 100644 otherlibs/labltk/examples_camltk/helloworld.ml delete mode 100644 otherlibs/labltk/examples_camltk/images/CamlBook.gif delete mode 100644 otherlibs/labltk/examples_camltk/images/Lambda2.back.gif delete mode 100644 otherlibs/labltk/examples_camltk/images/dojoji.back.gif delete mode 100644 otherlibs/labltk/examples_camltk/jptest.ml delete mode 100644 otherlibs/labltk/examples_camltk/mytext.ml delete mode 100644 otherlibs/labltk/examples_camltk/socketinput.ml delete mode 100644 otherlibs/labltk/examples_camltk/taddition.ml delete mode 100644 otherlibs/labltk/examples_camltk/taquin.ml delete mode 100644 otherlibs/labltk/examples_camltk/tetris.ml delete mode 100644 otherlibs/labltk/examples_camltk/text.ml delete mode 100644 otherlibs/labltk/examples_camltk/winskel.ml delete mode 100644 otherlibs/labltk/examples_labltk/.ignore delete mode 100644 otherlibs/labltk/examples_labltk/Lambda2.back.gif delete mode 100644 otherlibs/labltk/examples_labltk/Makefile delete mode 100644 otherlibs/labltk/examples_labltk/Makefile.nt delete mode 100644 otherlibs/labltk/examples_labltk/README delete mode 100644 otherlibs/labltk/examples_labltk/calc.ml delete mode 100644 otherlibs/labltk/examples_labltk/clock.ml delete mode 100644 otherlibs/labltk/examples_labltk/demo.ml delete mode 100644 otherlibs/labltk/examples_labltk/eyes.ml delete mode 100644 otherlibs/labltk/examples_labltk/hello.ml delete mode 100755 otherlibs/labltk/examples_labltk/hello.tcl delete mode 100644 otherlibs/labltk/examples_labltk/lang.ml delete mode 100644 otherlibs/labltk/examples_labltk/taquin.ml delete mode 100644 otherlibs/labltk/examples_labltk/tetris.ml delete mode 100644 otherlibs/labltk/frx/.depend delete mode 100644 otherlibs/labltk/frx/Makefile delete mode 100644 otherlibs/labltk/frx/Makefile.nt delete mode 100644 otherlibs/labltk/frx/README delete mode 100644 otherlibs/labltk/frx/frx_after.ml delete mode 100644 otherlibs/labltk/frx/frx_after.mli delete mode 100644 otherlibs/labltk/frx/frx_color.ml delete mode 100644 otherlibs/labltk/frx/frx_color.mli delete mode 100644 otherlibs/labltk/frx/frx_ctext.ml delete mode 100644 otherlibs/labltk/frx/frx_ctext.mli delete mode 100644 otherlibs/labltk/frx/frx_dialog.ml delete mode 100644 otherlibs/labltk/frx/frx_dialog.mli delete mode 100644 otherlibs/labltk/frx/frx_entry.ml delete mode 100644 otherlibs/labltk/frx/frx_entry.mli delete mode 100644 otherlibs/labltk/frx/frx_fileinput.ml delete mode 100644 otherlibs/labltk/frx/frx_fillbox.ml delete mode 100644 otherlibs/labltk/frx/frx_fillbox.mli delete mode 100644 otherlibs/labltk/frx/frx_fit.ml delete mode 100644 otherlibs/labltk/frx/frx_fit.mli delete mode 100644 otherlibs/labltk/frx/frx_focus.ml delete mode 100644 otherlibs/labltk/frx/frx_focus.mli delete mode 100644 otherlibs/labltk/frx/frx_font.ml delete mode 100644 otherlibs/labltk/frx/frx_font.mli delete mode 100644 otherlibs/labltk/frx/frx_group.ml delete mode 100644 otherlibs/labltk/frx/frx_lbutton.ml delete mode 100644 otherlibs/labltk/frx/frx_lbutton.mli delete mode 100644 otherlibs/labltk/frx/frx_listbox.ml delete mode 100644 otherlibs/labltk/frx/frx_listbox.mli delete mode 100644 otherlibs/labltk/frx/frx_mem.ml delete mode 100644 otherlibs/labltk/frx/frx_mem.mli delete mode 100644 otherlibs/labltk/frx/frx_misc.ml delete mode 100644 otherlibs/labltk/frx/frx_misc.mli delete mode 100644 otherlibs/labltk/frx/frx_req.ml delete mode 100644 otherlibs/labltk/frx/frx_req.mli delete mode 100644 otherlibs/labltk/frx/frx_rpc.ml delete mode 100644 otherlibs/labltk/frx/frx_rpc.mli delete mode 100644 otherlibs/labltk/frx/frx_selection.ml delete mode 100644 otherlibs/labltk/frx/frx_selection.mli delete mode 100644 otherlibs/labltk/frx/frx_synth.ml delete mode 100644 otherlibs/labltk/frx/frx_synth.mli delete mode 100644 otherlibs/labltk/frx/frx_text.ml delete mode 100644 otherlibs/labltk/frx/frx_text.mli delete mode 100644 otherlibs/labltk/frx/frx_toplevel.mli delete mode 100644 otherlibs/labltk/frx/frx_widget.ml delete mode 100644 otherlibs/labltk/frx/frx_widget.mli delete mode 100644 otherlibs/labltk/frx/frxlib.mllib delete mode 100644 otherlibs/labltk/jpf/Makefile delete mode 100644 otherlibs/labltk/jpf/Makefile.nt delete mode 100644 otherlibs/labltk/jpf/README delete mode 100644 otherlibs/labltk/jpf/balloon.ml delete mode 100644 otherlibs/labltk/jpf/balloon.mli delete mode 100644 otherlibs/labltk/jpf/balloontest.ml delete mode 100644 otherlibs/labltk/jpf/fileselect.ml delete mode 100644 otherlibs/labltk/jpf/fileselect.mli delete mode 100644 otherlibs/labltk/jpf/jpf_font.ml delete mode 100644 otherlibs/labltk/jpf/jpf_font.mli delete mode 100644 otherlibs/labltk/jpf/jpflib.mllib delete mode 100644 otherlibs/labltk/jpf/shell.ml delete mode 100644 otherlibs/labltk/jpf/shell.mli delete mode 100644 otherlibs/labltk/labl.gif delete mode 100644 otherlibs/labltk/labltk/.ignore delete mode 100644 otherlibs/labltk/labltk/Makefile delete mode 100644 otherlibs/labltk/labltk/Makefile.gen delete mode 100644 otherlibs/labltk/labltk/Makefile.gen.nt delete mode 100644 otherlibs/labltk/labltk/Makefile.nt delete mode 100644 otherlibs/labltk/labltk/byte.itarget delete mode 100644 otherlibs/labltk/labltk/modules delete mode 100644 otherlibs/labltk/labltk/native.itarget delete mode 100644 otherlibs/labltk/lib/.ignore delete mode 100644 otherlibs/labltk/lib/Makefile delete mode 100644 otherlibs/labltk/lib/Makefile.nt delete mode 100755 otherlibs/labltk/lib/labltk.bat delete mode 100644 otherlibs/labltk/support/.depend delete mode 100644 otherlibs/labltk/support/Makefile delete mode 100644 otherlibs/labltk/support/Makefile.common delete mode 100644 otherlibs/labltk/support/Makefile.nt delete mode 100644 otherlibs/labltk/support/byte.itarget delete mode 100644 otherlibs/labltk/support/camltk.h delete mode 100644 otherlibs/labltk/support/camltkwrap.ml delete mode 100644 otherlibs/labltk/support/camltkwrap.mli delete mode 100644 otherlibs/labltk/support/cltkCaml.c delete mode 100644 otherlibs/labltk/support/cltkDMain.c delete mode 100644 otherlibs/labltk/support/cltkEval.c delete mode 100644 otherlibs/labltk/support/cltkEvent.c delete mode 100644 otherlibs/labltk/support/cltkFile.c delete mode 100644 otherlibs/labltk/support/cltkImg.c delete mode 100644 otherlibs/labltk/support/cltkMain.c delete mode 100644 otherlibs/labltk/support/cltkMisc.c delete mode 100644 otherlibs/labltk/support/cltkTimer.c delete mode 100644 otherlibs/labltk/support/cltkUtf.c delete mode 100644 otherlibs/labltk/support/cltkVar.c delete mode 100644 otherlibs/labltk/support/cltkWait.c delete mode 100644 otherlibs/labltk/support/fileevent.ml delete mode 100644 otherlibs/labltk/support/fileevent.mli delete mode 100644 otherlibs/labltk/support/liblabltk.clib delete mode 100644 otherlibs/labltk/support/native.itarget delete mode 100644 otherlibs/labltk/support/protocol.ml delete mode 100644 otherlibs/labltk/support/protocol.mli delete mode 100644 otherlibs/labltk/support/rawwidget.ml delete mode 100644 otherlibs/labltk/support/rawwidget.mli delete mode 100644 otherlibs/labltk/support/slave.ml delete mode 100644 otherlibs/labltk/support/support.ml delete mode 100644 otherlibs/labltk/support/support.mli delete mode 100644 otherlibs/labltk/support/textvariable.ml delete mode 100644 otherlibs/labltk/support/textvariable.mli delete mode 100644 otherlibs/labltk/support/timer.ml delete mode 100644 otherlibs/labltk/support/timer.mli delete mode 100644 otherlibs/labltk/support/tkthread.ml delete mode 100644 otherlibs/labltk/support/tkthread.mli delete mode 100644 otherlibs/labltk/support/tkwait.ml delete mode 100644 otherlibs/labltk/support/widget.ml delete mode 100644 otherlibs/labltk/support/widget.mli create mode 100644 otherlibs/num/bng_arm64.c create mode 100644 otherlibs/win32unix/Makefile create mode 100644 parsing/ast_helper.ml create mode 100644 parsing/ast_helper.mli create mode 100644 stdlib/bytes.ml create mode 100644 stdlib/bytes.mli create mode 100644 stdlib/bytesLabels.ml create mode 100644 stdlib/bytesLabels.mli create mode 100644 stdlib/camlinternalFormat.ml create mode 100644 stdlib/camlinternalFormat.mli create mode 100644 stdlib/camlinternalFormatBasics.ml create mode 100644 stdlib/camlinternalFormatBasics.mli create mode 100644 testsuite/external/camlp5-git.patch create mode 100644 testsuite/external/coq-8.4pl1.patch create mode 100644 testsuite/external/coq-8.4pl2.patch create mode 100644 testsuite/tests/asmcomp/arm64.S create mode 100644 testsuite/tests/asmcomp/optargs.ml create mode 100644 testsuite/tests/asmcomp/staticalloc.ml create mode 100644 testsuite/tests/backtrace/backtrace_deprecated.ml create mode 100644 testsuite/tests/backtrace/backtrace_deprecated.reference create mode 100644 testsuite/tests/backtrace/backtrace_slots.ml create mode 100644 testsuite/tests/backtrace/backtrace_slots.reference rename testsuite/tests/{regression/camlp4-class-type-plus => basic-modules}/Makefile (84%) create mode 100644 testsuite/tests/basic-modules/main.ml create mode 100644 testsuite/tests/basic-modules/main.reference create mode 100644 testsuite/tests/basic-modules/offset.ml create mode 100644 testsuite/tests/basic-more/pr2719.ml create mode 100644 testsuite/tests/basic-more/pr2719.reference create mode 100644 testsuite/tests/basic-more/pr6216.ml create mode 100644 testsuite/tests/basic-more/pr6216.reference create mode 100644 testsuite/tests/basic/constprop.ml create mode 100644 testsuite/tests/basic/constprop.mlp create mode 100644 testsuite/tests/basic/constprop.reference create mode 100644 testsuite/tests/basic/divint.ml create mode 100644 testsuite/tests/basic/divint.reference create mode 100644 testsuite/tests/basic/stringmatch.ml rename otherlibs/labltk/builtin/builtina_empty.ml => testsuite/tests/basic/stringmatch.reference (100%) create mode 100644 testsuite/tests/formats-transition/Makefile create mode 100644 testsuite/tests/formats-transition/deprecated_unsigned_printers.ml create mode 100644 testsuite/tests/formats-transition/deprecated_unsigned_printers.ml.reference create mode 100644 testsuite/tests/formats-transition/ignored_scan_counters.ml create mode 100644 testsuite/tests/formats-transition/ignored_scan_counters.ml.reference create mode 100644 testsuite/tests/formats-transition/legacy_incompatible_flags.ml create mode 100644 testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml create mode 100644 testsuite/tests/formats-transition/legacy_unfinished_modifiers.ml.reference rename build/camlp4-byte-only.sh => testsuite/tests/match-exception-warnings/Makefile (71%) mode change 100755 => 100644 create mode 100644 testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml create mode 100644 testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml.reference rename build/ocamlbuild-byte-only.sh => testsuite/tests/match-exception/Makefile (71%) mode change 100755 => 100644 create mode 100644 testsuite/tests/match-exception/allocation.ml create mode 100644 testsuite/tests/match-exception/allocation.reference create mode 100644 testsuite/tests/match-exception/exception_propagation.ml create mode 100644 testsuite/tests/match-exception/exception_propagation.reference create mode 100644 testsuite/tests/match-exception/match_failure.ml create mode 100644 testsuite/tests/match-exception/match_failure.reference create mode 100644 testsuite/tests/match-exception/nested_handlers.ml create mode 100644 testsuite/tests/match-exception/nested_handlers.reference create mode 100644 testsuite/tests/match-exception/raise_from_success_continuation.ml create mode 100644 testsuite/tests/match-exception/raise_from_success_continuation.reference create mode 100644 testsuite/tests/match-exception/streams.ml create mode 100644 testsuite/tests/match-exception/streams.reference create mode 100644 testsuite/tests/match-exception/tail_calls.ml create mode 100644 testsuite/tests/match-exception/tail_calls.reference create mode 100644 testsuite/tests/prim-bigstring/Makefile create mode 100644 testsuite/tests/prim-bigstring/bigstring_access.ml create mode 100644 testsuite/tests/prim-bigstring/bigstring_access.reference create mode 100644 testsuite/tests/prim-bigstring/string_access.ml create mode 100644 testsuite/tests/prim-bigstring/string_access.reference create mode 100644 testsuite/tests/tool-debugger/basic/.ignore create mode 100644 testsuite/tests/tool-debugger/basic/Makefile create mode 100644 testsuite/tests/tool-debugger/basic/debuggee.ml create mode 100644 testsuite/tests/tool-debugger/basic/debuggee.reference create mode 100755 testsuite/tests/tool-debugger/basic/input_script create mode 100644 testsuite/tests/tool-debugger/find-artifacts/.ignore create mode 100644 testsuite/tests/tool-debugger/find-artifacts/Makefile create mode 100644 testsuite/tests/tool-debugger/find-artifacts/debuggee.reference create mode 100644 testsuite/tests/tool-debugger/find-artifacts/in/blah.ml create mode 100644 testsuite/tests/tool-debugger/find-artifacts/in/foo.ml create mode 100644 testsuite/tests/tool-debugger/find-artifacts/input_script rename build/ocamlbuild-native-only.sh => testsuite/tests/tool-toplevel/Makefile (71%) mode change 100755 => 100644 create mode 100644 testsuite/tests/tool-toplevel/tracing.ml create mode 100644 testsuite/tests/tool-toplevel/tracing.ml.reference create mode 100644 testsuite/tests/typing-extensions/Makefile create mode 100644 testsuite/tests/typing-extensions/cast.ml create mode 100644 testsuite/tests/typing-extensions/cast.ml.reference create mode 100644 testsuite/tests/typing-extensions/extensions.ml create mode 100644 testsuite/tests/typing-extensions/extensions.ml.reference create mode 100644 testsuite/tests/typing-extensions/msg.ml create mode 100644 testsuite/tests/typing-extensions/msg.ml.reference create mode 100644 testsuite/tests/typing-extensions/open_types.ml create mode 100644 testsuite/tests/typing-extensions/open_types.ml.reference create mode 100644 testsuite/tests/typing-gadts/didier.ml create mode 100644 testsuite/tests/typing-gadts/pr6174.ml create mode 100644 testsuite/tests/typing-gadts/pr6174.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/pr6174.ml.reference create mode 100644 testsuite/tests/typing-gadts/pr6241.ml create mode 100644 testsuite/tests/typing-gadts/pr6241.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/pr6241.ml.reference create mode 100644 testsuite/tests/typing-gadts/unify_mb.ml create mode 100644 testsuite/tests/typing-gadts/unify_mb.ml.principal.reference create mode 100644 testsuite/tests/typing-gadts/unify_mb.ml.reference create mode 100644 testsuite/tests/typing-misc-bugs/Makefile create mode 100644 testsuite/tests/typing-misc-bugs/pr6303_bad.ml create mode 100644 testsuite/tests/typing-misc/variant.ml create mode 100644 testsuite/tests/typing-misc/variant.ml.reference create mode 100644 testsuite/tests/typing-modules-bugs/gatien_baron_20131019_ok.ml create mode 100644 testsuite/tests/typing-modules-bugs/pr6240_ok.ml create mode 100644 testsuite/tests/typing-modules-bugs/pr6293_bad.ml create mode 100644 testsuite/tests/typing-modules-bugs/pr6427_bad.ml create mode 100644 testsuite/tests/typing-modules-bugs/pr6513_ok.ml create mode 100644 testsuite/tests/typing-modules/a.mli create mode 100644 testsuite/tests/typing-modules/aliases.ml create mode 100644 testsuite/tests/typing-modules/aliases.ml.reference create mode 100644 testsuite/tests/typing-modules/b.ml create mode 100644 testsuite/tests/typing-modules/b2.ml create mode 100644 testsuite/tests/typing-modules/b3.mli create mode 100644 testsuite/tests/typing-modules/d.ml create mode 100644 testsuite/tests/typing-modules/firstclass.ml create mode 100644 testsuite/tests/typing-modules/firstclass.ml.reference create mode 100644 testsuite/tests/typing-modules/generative.ml create mode 100644 testsuite/tests/typing-modules/generative.ml.reference create mode 100644 testsuite/tests/typing-objects/pr6383.ml create mode 100644 testsuite/tests/typing-objects/pr6383.ml.reference create mode 100644 testsuite/tests/typing-private/private.ml.principal.reference create mode 100644 testsuite/tests/typing-rectypes-bugs/pr6174_bad.ml create mode 100644 testsuite/tests/typing-signatures/pr6371.ml create mode 100644 testsuite/tests/typing-signatures/pr6371.ml.reference create mode 100644 testsuite/tests/typing-warnings/coercions.ml create mode 100644 testsuite/tests/typing-warnings/coercions.ml.principal.reference create mode 100644 testsuite/tests/typing-warnings/coercions.ml.reference create mode 100755 tools/ci-build rename tools/{ocamlmklib.mlp => ocamlmklib.ml} (97%) diff --git a/.depend b/.depend index 50b63374..9b6b9ffb 100644 --- a/.depend +++ b/.depend @@ -24,26 +24,32 @@ utils/terminfo.cmo : utils/terminfo.cmi utils/terminfo.cmx : utils/terminfo.cmi utils/warnings.cmo : utils/warnings.cmi utils/warnings.cmx : utils/warnings.cmi -parsing/ast_mapper.cmi : parsing/parsetree.cmi parsing/longident.cmi \ +parsing/ast_helper.cmi : parsing/parsetree.cmi parsing/longident.cmi \ parsing/location.cmi parsing/asttypes.cmi +parsing/ast_mapper.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/asttypes.cmi : parsing/location.cmi parsing/lexer.cmi : parsing/parser.cmi parsing/location.cmi parsing/location.cmi : utils/warnings.cmi parsing/longident.cmi : parsing/parse.cmi : parsing/parsetree.cmi -parsing/parser.cmi : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi +parsing/parser.cmi : parsing/parsetree.cmi parsing/location.cmi parsing/parsetree.cmi : parsing/longident.cmi parsing/location.cmi \ parsing/asttypes.cmi parsing/pprintast.cmi : parsing/parsetree.cmi parsing/longident.cmi \ parsing/asttypes.cmi parsing/printast.cmi : parsing/parsetree.cmi parsing/syntaxerr.cmi : parsing/location.cmi -parsing/ast_mapper.cmo : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi utils/config.cmi parsing/asttypes.cmi \ +parsing/ast_helper.cmo : parsing/parsetree.cmi parsing/longident.cmi \ + parsing/location.cmi parsing/asttypes.cmi parsing/ast_helper.cmi +parsing/ast_helper.cmx : parsing/parsetree.cmi parsing/longident.cmx \ + parsing/location.cmx parsing/asttypes.cmi parsing/ast_helper.cmi +parsing/ast_mapper.cmo : parsing/parsetree.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi utils/config.cmi \ + utils/clflags.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ parsing/ast_mapper.cmi -parsing/ast_mapper.cmx : parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx utils/config.cmx parsing/asttypes.cmi \ +parsing/ast_mapper.cmx : parsing/parsetree.cmi utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx utils/config.cmx \ + utils/clflags.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ parsing/ast_mapper.cmi parsing/lexer.cmo : utils/warnings.cmi parsing/parser.cmi utils/misc.cmi \ parsing/location.cmi parsing/lexer.cmi @@ -61,18 +67,22 @@ parsing/parse.cmx : parsing/syntaxerr.cmx parsing/parser.cmx \ parsing/location.cmx parsing/lexer.cmx parsing/parse.cmi parsing/parser.cmo : parsing/syntaxerr.cmi parsing/parsetree.cmi \ parsing/longident.cmi parsing/location.cmi utils/clflags.cmi \ - parsing/asttypes.cmi parsing/parser.cmi + parsing/asttypes.cmi parsing/ast_helper.cmi parsing/parser.cmi parsing/parser.cmx : parsing/syntaxerr.cmx parsing/parsetree.cmi \ parsing/longident.cmx parsing/location.cmx utils/clflags.cmx \ - parsing/asttypes.cmi parsing/parser.cmi -parsing/pprintast.cmo : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi parsing/pprintast.cmi -parsing/pprintast.cmx : parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx parsing/asttypes.cmi parsing/pprintast.cmi -parsing/printast.cmo : parsing/parsetree.cmi parsing/longident.cmi \ - parsing/location.cmi parsing/asttypes.cmi parsing/printast.cmi -parsing/printast.cmx : parsing/parsetree.cmi parsing/longident.cmx \ - parsing/location.cmx parsing/asttypes.cmi parsing/printast.cmi + parsing/asttypes.cmi parsing/ast_helper.cmx parsing/parser.cmi +parsing/pprintast.cmo : parsing/parsetree.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi parsing/asttypes.cmi \ + parsing/pprintast.cmi +parsing/pprintast.cmx : parsing/parsetree.cmi utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx parsing/asttypes.cmi \ + parsing/pprintast.cmi +parsing/printast.cmo : parsing/parsetree.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi parsing/asttypes.cmi \ + parsing/printast.cmi +parsing/printast.cmx : parsing/parsetree.cmi utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx parsing/asttypes.cmi \ + parsing/printast.cmi parsing/syntaxerr.cmo : parsing/location.cmi parsing/syntaxerr.cmi parsing/syntaxerr.cmx : parsing/location.cmx parsing/syntaxerr.cmi typing/annot.cmi : parsing/location.cmi @@ -93,8 +103,8 @@ typing/includeclass.cmi : typing/types.cmi typing/env.cmi typing/ctype.cmi typing/includecore.cmi : typing/types.cmi typing/typedtree.cmi \ typing/ident.cmi typing/env.cmi typing/includemod.cmi : typing/types.cmi typing/typedtree.cmi \ - typing/path.cmi typing/includecore.cmi typing/ident.cmi typing/env.cmi \ - typing/ctype.cmi + typing/path.cmi parsing/location.cmi typing/includecore.cmi \ + typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/mtype.cmi : typing/types.cmi typing/path.cmi typing/ident.cmi \ typing/env.cmi typing/oprint.cmi : typing/outcometree.cmi @@ -120,29 +130,29 @@ typing/typecore.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/annot.cmi typing/typedecl.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/includecore.cmi typing/ident.cmi typing/env.cmi \ - parsing/asttypes.cmi + typing/includecore.cmi typing/ident.cmi typing/env.cmi typing/typedtree.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ - parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ - typing/env.cmi parsing/asttypes.cmi + parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/typedtreeIter.cmi : typing/typedtree.cmi parsing/asttypes.cmi typing/typedtreeMap.cmi : typing/typedtree.cmi -typing/typemod.cmi : typing/types.cmi typing/typedtree.cmi \ +typing/typemod.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/includemod.cmi typing/ident.cmi typing/env.cmi -typing/types.cmi : typing/primitive.cmi typing/path.cmi \ - parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/includemod.cmi typing/ident.cmi typing/env.cmi \ parsing/asttypes.cmi +typing/types.cmi : typing/primitive.cmi typing/path.cmi \ + parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/typetexp.cmi : typing/types.cmi typing/typedtree.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ - typing/env.cmi parsing/asttypes.cmi + typing/env.cmi parsing/asttypes.cmi parsing/ast_mapper.cmi typing/btype.cmo : typing/types.cmi typing/path.cmi utils/misc.cmi \ typing/ident.cmi typing/btype.cmi typing/btype.cmx : typing/types.cmx typing/path.cmx utils/misc.cmx \ typing/ident.cmx typing/btype.cmi -typing/cmi_format.cmo : typing/types.cmi utils/misc.cmi parsing/location.cmi \ +typing/cmi_format.cmo : typing/types.cmi parsing/location.cmi \ utils/config.cmi typing/cmi_format.cmi -typing/cmi_format.cmx : typing/types.cmx utils/misc.cmx parsing/location.cmx \ +typing/cmi_format.cmx : typing/types.cmx parsing/location.cmx \ utils/config.cmx typing/cmi_format.cmi typing/cmt_format.cmo : typing/types.cmi typing/typedtreeMap.cmi \ typing/typedtree.cmi utils/misc.cmi parsing/location.cmi \ @@ -160,10 +170,10 @@ typing/ctype.cmx : typing/types.cmx typing/subst.cmx typing/path.cmx \ utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ typing/ident.cmx typing/env.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/ctype.cmi -typing/datarepr.cmo : typing/types.cmi typing/predef.cmi typing/path.cmi \ +typing/datarepr.cmo : typing/types.cmi typing/path.cmi parsing/location.cmi \ typing/ident.cmi typing/btype.cmi parsing/asttypes.cmi \ typing/datarepr.cmi -typing/datarepr.cmx : typing/types.cmx typing/predef.cmx typing/path.cmx \ +typing/datarepr.cmx : typing/types.cmx typing/path.cmx parsing/location.cmx \ typing/ident.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/datarepr.cmi typing/env.cmo : utils/warnings.cmi typing/types.cmi utils/tbl.cmi \ @@ -179,10 +189,10 @@ typing/env.cmx : utils/warnings.cmx typing/types.cmx utils/tbl.cmx \ typing/cmi_format.cmx utils/clflags.cmx typing/btype.cmx \ parsing/asttypes.cmi typing/env.cmi typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \ - typing/path.cmi typing/mtype.cmi utils/misc.cmi typing/env.cmi \ + typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \ parsing/asttypes.cmi typing/envaux.cmi typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \ - typing/path.cmx typing/mtype.cmx utils/misc.cmx typing/env.cmx \ + typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \ parsing/asttypes.cmi typing/envaux.cmi typing/ident.cmo : typing/ident.cmi typing/ident.cmx : typing/ident.cmi @@ -199,21 +209,25 @@ typing/includecore.cmx : typing/types.cmx typing/typedtree.cmx \ typing/env.cmx typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/includecore.cmi typing/includemod.cmo : typing/types.cmi typing/typedtree.cmi utils/tbl.cmi \ - typing/subst.cmi typing/printtyp.cmi typing/path.cmi typing/mtype.cmi \ - utils/misc.cmi parsing/location.cmi typing/includecore.cmi \ - typing/includeclass.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ - utils/clflags.cmi typing/includemod.cmi + typing/subst.cmi typing/printtyp.cmi typing/primitive.cmi typing/path.cmi \ + typing/mtype.cmi utils/misc.cmi parsing/location.cmi \ + typing/includecore.cmi typing/includeclass.cmi typing/ident.cmi \ + typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi utils/clflags.cmi \ + typing/includemod.cmi typing/includemod.cmx : typing/types.cmx typing/typedtree.cmx utils/tbl.cmx \ - typing/subst.cmx typing/printtyp.cmx typing/path.cmx typing/mtype.cmx \ - utils/misc.cmx parsing/location.cmx typing/includecore.cmx \ - typing/includeclass.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ - utils/clflags.cmx typing/includemod.cmi + typing/subst.cmx typing/printtyp.cmx typing/primitive.cmx typing/path.cmx \ + typing/mtype.cmx utils/misc.cmx parsing/location.cmx \ + typing/includecore.cmx typing/includeclass.cmx typing/ident.cmx \ + typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx utils/clflags.cmx \ + typing/includemod.cmi typing/mtype.cmo : typing/types.cmi typing/subst.cmi typing/path.cmi \ - typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/mtype.cmi + utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/env.cmi \ + typing/ctype.cmi utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + typing/mtype.cmi typing/mtype.cmx : typing/types.cmx typing/subst.cmx typing/path.cmx \ - typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/mtype.cmi + utils/misc.cmx parsing/location.cmx typing/ident.cmx typing/env.cmx \ + typing/ctype.cmx utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + typing/mtype.cmi typing/oprint.cmo : typing/outcometree.cmi parsing/asttypes.cmi \ typing/oprint.cmi typing/oprint.cmx : typing/outcometree.cmi parsing/asttypes.cmi \ @@ -221,14 +235,14 @@ typing/oprint.cmx : typing/outcometree.cmi parsing/asttypes.cmi \ typing/parmatch.cmo : utils/warnings.cmi typing/types.cmi \ typing/typedtree.cmi typing/subst.cmi typing/predef.cmi typing/path.cmi \ parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi typing/datarepr.cmi \ - typing/ctype.cmi typing/btype.cmi parsing/asttypes.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ + typing/btype.cmi parsing/asttypes.cmi parsing/ast_helper.cmi \ typing/parmatch.cmi typing/parmatch.cmx : utils/warnings.cmx typing/types.cmx \ typing/typedtree.cmx typing/subst.cmx typing/predef.cmx typing/path.cmx \ parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/ident.cmx typing/env.cmx typing/datarepr.cmx \ - typing/ctype.cmx typing/btype.cmx parsing/asttypes.cmi \ + parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ + typing/btype.cmx parsing/asttypes.cmi parsing/ast_helper.cmx \ typing/parmatch.cmi typing/path.cmo : typing/ident.cmi typing/path.cmi typing/path.cmx : typing/ident.cmx typing/path.cmi @@ -250,86 +264,90 @@ typing/printtyp.cmx : typing/types.cmx typing/primitive.cmx \ parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ typing/printtyp.cmi -typing/printtyped.cmo : typing/typedtree.cmi typing/path.cmi \ - parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ - parsing/asttypes.cmi typing/printtyped.cmi -typing/printtyped.cmx : typing/typedtree.cmx typing/path.cmx \ - parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ - parsing/asttypes.cmi typing/printtyped.cmi +typing/printtyped.cmo : typing/typedtree.cmi parsing/printast.cmi \ + typing/path.cmi utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/printtyped.cmi +typing/printtyped.cmx : typing/typedtree.cmx parsing/printast.cmx \ + typing/path.cmx utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx parsing/asttypes.cmi typing/printtyped.cmi typing/stypes.cmo : typing/typedtree.cmi typing/printtyp.cmi \ parsing/location.cmi utils/clflags.cmi typing/annot.cmi typing/stypes.cmi typing/stypes.cmx : typing/typedtree.cmx typing/printtyp.cmx \ parsing/location.cmx utils/clflags.cmx typing/annot.cmi typing/stypes.cmi typing/subst.cmo : typing/types.cmi utils/tbl.cmi typing/path.cmi \ - utils/misc.cmi parsing/location.cmi typing/ident.cmi typing/btype.cmi \ - typing/subst.cmi + utils/misc.cmi parsing/location.cmi typing/ident.cmi utils/clflags.cmi \ + typing/btype.cmi parsing/ast_mapper.cmi typing/subst.cmi typing/subst.cmx : typing/types.cmx utils/tbl.cmx typing/path.cmx \ - utils/misc.cmx parsing/location.cmx typing/ident.cmx typing/btype.cmx \ - typing/subst.cmi + utils/misc.cmx parsing/location.cmx typing/ident.cmx utils/clflags.cmx \ + typing/btype.cmx parsing/ast_mapper.cmx typing/subst.cmi typing/typeclass.cmo : utils/warnings.cmi typing/typetexp.cmi \ typing/types.cmi typing/typedtree.cmi typing/typedecl.cmi \ - typing/typecore.cmi typing/subst.cmi typing/stypes.cmi \ - typing/printtyp.cmi typing/predef.cmi typing/path.cmi \ + typing/typecore.cmi parsing/syntaxerr.cmi typing/subst.cmi \ + typing/stypes.cmi typing/printtyp.cmi typing/predef.cmi typing/path.cmi \ parsing/parsetree.cmi typing/parmatch.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/includeclass.cmi \ typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - typing/typeclass.cmi + parsing/ast_helper.cmi typing/typeclass.cmi typing/typeclass.cmx : utils/warnings.cmx typing/typetexp.cmx \ typing/types.cmx typing/typedtree.cmx typing/typedecl.cmx \ - typing/typecore.cmx typing/subst.cmx typing/stypes.cmx \ - typing/printtyp.cmx typing/predef.cmx typing/path.cmx \ + typing/typecore.cmx parsing/syntaxerr.cmx typing/subst.cmx \ + typing/stypes.cmx typing/printtyp.cmx typing/predef.cmx typing/path.cmx \ parsing/parsetree.cmi typing/parmatch.cmx utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx typing/includeclass.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - typing/typeclass.cmi + parsing/ast_helper.cmx typing/typeclass.cmi typing/typecore.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/types.cmi typing/typedtree.cmi typing/subst.cmi typing/stypes.cmi \ - typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ - typing/path.cmi parsing/parsetree.cmi typing/parmatch.cmi \ - typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/ident.cmi typing/env.cmi typing/ctype.cmi \ - typing/cmt_format.cmi utils/clflags.cmi typing/btype.cmi \ - parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi + typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ + typing/subst.cmi typing/stypes.cmi typing/printtyp.cmi \ + typing/primitive.cmi typing/predef.cmi typing/path.cmi \ + parsing/parsetree.cmi typing/parmatch.cmi typing/oprint.cmi \ + utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi typing/env.cmi typing/ctype.cmi typing/cmt_format.cmi \ + utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + parsing/ast_helper.cmi typing/annot.cmi typing/typecore.cmi typing/typecore.cmx : utils/warnings.cmx typing/typetexp.cmx \ - typing/types.cmx typing/typedtree.cmx typing/subst.cmx typing/stypes.cmx \ - typing/printtyp.cmx typing/primitive.cmx typing/predef.cmx \ - typing/path.cmx parsing/parsetree.cmi typing/parmatch.cmx \ - typing/oprint.cmx utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/ident.cmx typing/env.cmx typing/ctype.cmx \ - typing/cmt_format.cmx utils/clflags.cmx typing/btype.cmx \ - parsing/asttypes.cmi typing/annot.cmi typing/typecore.cmi + typing/types.cmx typing/typedtree.cmx parsing/syntaxerr.cmx \ + typing/subst.cmx typing/stypes.cmx typing/printtyp.cmx \ + typing/primitive.cmx typing/predef.cmx typing/path.cmx \ + parsing/parsetree.cmi typing/parmatch.cmx typing/oprint.cmx \ + utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx typing/env.cmx typing/ctype.cmx typing/cmt_format.cmx \ + utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + parsing/ast_helper.cmx typing/annot.cmi typing/typecore.cmi typing/typedecl.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/types.cmi typing/typedtree.cmi typing/subst.cmi \ - typing/printtyp.cmi typing/primitive.cmi typing/predef.cmi \ - typing/path.cmi parsing/parsetree.cmi utils/misc.cmi \ + typing/types.cmi typing/typedtree.cmi parsing/syntaxerr.cmi \ + typing/subst.cmi typing/printtyp.cmi typing/primitive.cmi \ + typing/predef.cmi typing/path.cmi parsing/parsetree.cmi utils/misc.cmi \ parsing/longident.cmi parsing/location.cmi typing/includecore.cmi \ typing/ident.cmi typing/env.cmi typing/ctype.cmi utils/config.cmi \ utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ - typing/typedecl.cmi + parsing/ast_helper.cmi typing/typedecl.cmi typing/typedecl.cmx : utils/warnings.cmx typing/typetexp.cmx \ - typing/types.cmx typing/typedtree.cmx typing/subst.cmx \ - typing/printtyp.cmx typing/primitive.cmx typing/predef.cmx \ - typing/path.cmx parsing/parsetree.cmi utils/misc.cmx \ + typing/types.cmx typing/typedtree.cmx parsing/syntaxerr.cmx \ + typing/subst.cmx typing/printtyp.cmx typing/primitive.cmx \ + typing/predef.cmx typing/path.cmx parsing/parsetree.cmi utils/misc.cmx \ parsing/longident.cmx parsing/location.cmx typing/includecore.cmx \ typing/ident.cmx typing/env.cmx typing/ctype.cmx utils/config.cmx \ utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ - typing/typedecl.cmi + parsing/ast_helper.cmx typing/typedecl.cmi typing/typedtree.cmo : typing/types.cmi typing/primitive.cmi typing/path.cmi \ - utils/misc.cmi parsing/longident.cmi parsing/location.cmi \ - typing/ident.cmi typing/env.cmi parsing/asttypes.cmi typing/typedtree.cmi + parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi \ + typing/typedtree.cmi typing/typedtree.cmx : typing/types.cmx typing/primitive.cmx typing/path.cmx \ - utils/misc.cmx parsing/longident.cmx parsing/location.cmx \ - typing/ident.cmx typing/env.cmx parsing/asttypes.cmi typing/typedtree.cmi -typing/typedtreeIter.cmo : typing/typedtree.cmi parsing/asttypes.cmi \ - typing/typedtreeIter.cmi -typing/typedtreeIter.cmx : typing/typedtree.cmx parsing/asttypes.cmi \ - typing/typedtreeIter.cmi + parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx typing/ident.cmx typing/env.cmx parsing/asttypes.cmi \ + typing/typedtree.cmi +typing/typedtreeIter.cmo : typing/typedtree.cmi utils/misc.cmi \ + parsing/asttypes.cmi typing/typedtreeIter.cmi +typing/typedtreeIter.cmx : typing/typedtree.cmx utils/misc.cmx \ + parsing/asttypes.cmi typing/typedtreeIter.cmi typing/typedtreeMap.cmo : typing/typedtree.cmi utils/misc.cmi \ - parsing/asttypes.cmi typing/typedtreeMap.cmi + typing/typedtreeMap.cmi typing/typedtreeMap.cmx : typing/typedtree.cmx utils/misc.cmx \ - parsing/asttypes.cmi typing/typedtreeMap.cmi + typing/typedtreeMap.cmi typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/typedtree.cmi typing/typedecl.cmi typing/typecore.cmi \ typing/typeclass.cmi typing/subst.cmi typing/stypes.cmi \ @@ -337,8 +355,8 @@ typing/typemod.cmo : utils/warnings.cmi typing/typetexp.cmi typing/types.cmi \ typing/mtype.cmi utils/misc.cmi parsing/longident.cmi \ parsing/location.cmi typing/includemod.cmi typing/ident.cmi \ typing/env.cmi typing/ctype.cmi utils/config.cmi typing/cmt_format.cmi \ - utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi typing/annot.cmi \ - typing/typemod.cmi + utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + parsing/ast_mapper.cmi typing/annot.cmi typing/typemod.cmi typing/typemod.cmx : utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ typing/typedtree.cmx typing/typedecl.cmx typing/typecore.cmx \ typing/typeclass.cmx typing/subst.cmx typing/stypes.cmx \ @@ -346,28 +364,30 @@ typing/typemod.cmx : utils/warnings.cmx typing/typetexp.cmx typing/types.cmx \ typing/mtype.cmx utils/misc.cmx parsing/longident.cmx \ parsing/location.cmx typing/includemod.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx utils/config.cmx typing/cmt_format.cmx \ - utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi typing/annot.cmi \ - typing/typemod.cmi + utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + parsing/ast_mapper.cmx typing/annot.cmi typing/typemod.cmi typing/types.cmo : typing/primitive.cmi typing/path.cmi \ - parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ - parsing/asttypes.cmi typing/types.cmi + parsing/parsetree.cmi parsing/longident.cmi parsing/location.cmi \ + typing/ident.cmi parsing/asttypes.cmi typing/types.cmi typing/types.cmx : typing/primitive.cmx typing/path.cmx \ - parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ - parsing/asttypes.cmi typing/types.cmi + parsing/parsetree.cmi parsing/longident.cmx parsing/location.cmx \ + typing/ident.cmx parsing/asttypes.cmi typing/types.cmi typing/typetexp.cmo : utils/warnings.cmi typing/types.cmi \ - typing/typedtree.cmi utils/tbl.cmi typing/printtyp.cmi typing/path.cmi \ - parsing/parsetree.cmi utils/misc.cmi parsing/longident.cmi \ - parsing/location.cmi typing/env.cmi typing/ctype.cmi utils/clflags.cmi \ - typing/btype.cmi parsing/asttypes.cmi typing/typetexp.cmi + typing/typedtree.cmi utils/tbl.cmi parsing/syntaxerr.cmi \ + typing/printtyp.cmi typing/path.cmi parsing/parsetree.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi typing/env.cmi \ + typing/ctype.cmi utils/clflags.cmi typing/btype.cmi parsing/asttypes.cmi \ + parsing/ast_mapper.cmi parsing/ast_helper.cmi typing/typetexp.cmi typing/typetexp.cmx : utils/warnings.cmx typing/types.cmx \ - typing/typedtree.cmx utils/tbl.cmx typing/printtyp.cmx typing/path.cmx \ - parsing/parsetree.cmi utils/misc.cmx parsing/longident.cmx \ - parsing/location.cmx typing/env.cmx typing/ctype.cmx utils/clflags.cmx \ - typing/btype.cmx parsing/asttypes.cmi typing/typetexp.cmi + typing/typedtree.cmx utils/tbl.cmx parsing/syntaxerr.cmx \ + typing/printtyp.cmx typing/path.cmx parsing/parsetree.cmi utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx typing/env.cmx \ + typing/ctype.cmx utils/clflags.cmx typing/btype.cmx parsing/asttypes.cmi \ + parsing/ast_mapper.cmx parsing/ast_helper.cmx typing/typetexp.cmi bytecomp/bytegen.cmi : bytecomp/lambda.cmi bytecomp/instruct.cmi bytecomp/bytelibrarian.cmi : bytecomp/bytelink.cmi : bytecomp/symtable.cmi bytecomp/cmo_format.cmi -bytecomp/bytepackager.cmi : typing/ident.cmi +bytecomp/bytepackager.cmi : typing/ident.cmi typing/env.cmi bytecomp/bytesections.cmi : bytecomp/cmo_format.cmi : bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi : @@ -377,7 +397,7 @@ bytecomp/instruct.cmi : typing/types.cmi typing/subst.cmi \ bytecomp/lambda.cmi : typing/types.cmi typing/primitive.cmi typing/path.cmi \ parsing/location.cmi typing/ident.cmi typing/env.cmi parsing/asttypes.cmi bytecomp/matching.cmi : typing/typedtree.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi parsing/asttypes.cmi + bytecomp/lambda.cmi typing/ident.cmi bytecomp/meta.cmi : bytecomp/printinstr.cmi : bytecomp/instruct.cmi bytecomp/printlambda.cmi : bytecomp/lambda.cmi @@ -397,13 +417,13 @@ bytecomp/translobj.cmi : bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi bytecomp/typeopt.cmi : typing/typedtree.cmi typing/path.cmi \ bytecomp/lambda.cmi bytecomp/bytegen.cmo : typing/types.cmi bytecomp/switch.cmi typing/subst.cmi \ - typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi \ - bytecomp/instruct.cmi typing/ident.cmi utils/config.cmi \ - parsing/asttypes.cmi bytecomp/bytegen.cmi + typing/primitive.cmi utils/misc.cmi bytecomp/matching.cmi \ + bytecomp/lambda.cmi bytecomp/instruct.cmi typing/ident.cmi \ + utils/config.cmi parsing/asttypes.cmi bytecomp/bytegen.cmi bytecomp/bytegen.cmx : typing/types.cmx bytecomp/switch.cmx typing/subst.cmx \ - typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx \ - bytecomp/instruct.cmx typing/ident.cmx utils/config.cmx \ - parsing/asttypes.cmi bytecomp/bytegen.cmi + typing/primitive.cmx utils/misc.cmx bytecomp/matching.cmx \ + bytecomp/lambda.cmx bytecomp/instruct.cmx typing/ident.cmx \ + utils/config.cmx parsing/asttypes.cmi bytecomp/bytegen.cmi bytecomp/bytelibrarian.cmo : utils/misc.cmi parsing/location.cmi \ utils/config.cmi bytecomp/cmo_format.cmi utils/clflags.cmi \ bytecomp/bytelink.cmi bytecomp/bytelibrarian.cmi @@ -421,33 +441,31 @@ bytecomp/bytelink.cmx : utils/warnings.cmx bytecomp/symtable.cmx \ bytecomp/cmo_format.cmi utils/clflags.cmx utils/ccomp.cmx \ bytecomp/bytesections.cmx bytecomp/bytelink.cmi bytecomp/bytepackager.cmo : typing/typemod.cmi bytecomp/translmod.cmi \ - typing/subst.cmi typing/path.cmi utils/misc.cmi parsing/location.cmi \ - bytecomp/instruct.cmi typing/ident.cmi typing/env.cmi \ - bytecomp/emitcode.cmi utils/config.cmi bytecomp/cmo_format.cmi \ - utils/clflags.cmi bytecomp/bytelink.cmi bytecomp/bytegen.cmi \ - bytecomp/bytepackager.cmi + typing/subst.cmi bytecomp/printlambda.cmi typing/path.cmi utils/misc.cmi \ + parsing/location.cmi bytecomp/instruct.cmi typing/ident.cmi \ + typing/env.cmi bytecomp/emitcode.cmi utils/config.cmi \ + bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytelink.cmi \ + bytecomp/bytegen.cmi bytecomp/bytepackager.cmi bytecomp/bytepackager.cmx : typing/typemod.cmx bytecomp/translmod.cmx \ - typing/subst.cmx typing/path.cmx utils/misc.cmx parsing/location.cmx \ - bytecomp/instruct.cmx typing/ident.cmx typing/env.cmx \ - bytecomp/emitcode.cmx utils/config.cmx bytecomp/cmo_format.cmi \ - utils/clflags.cmx bytecomp/bytelink.cmx bytecomp/bytegen.cmx \ - bytecomp/bytepackager.cmi -bytecomp/bytesections.cmo : utils/misc.cmi utils/config.cmi \ - bytecomp/bytesections.cmi -bytecomp/bytesections.cmx : utils/misc.cmx utils/config.cmx \ - bytecomp/bytesections.cmi + typing/subst.cmx bytecomp/printlambda.cmx typing/path.cmx utils/misc.cmx \ + parsing/location.cmx bytecomp/instruct.cmx typing/ident.cmx \ + typing/env.cmx bytecomp/emitcode.cmx utils/config.cmx \ + bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytelink.cmx \ + bytecomp/bytegen.cmx bytecomp/bytepackager.cmi +bytecomp/bytesections.cmo : utils/config.cmi bytecomp/bytesections.cmi +bytecomp/bytesections.cmx : utils/config.cmx bytecomp/bytesections.cmi bytecomp/dll.cmo : utils/misc.cmi utils/config.cmi bytecomp/dll.cmi bytecomp/dll.cmx : utils/misc.cmx utils/config.cmx bytecomp/dll.cmi bytecomp/emitcode.cmo : bytecomp/translmod.cmi typing/primitive.cmi \ - bytecomp/opcodes.cmo utils/misc.cmi bytecomp/meta.cmi bytecomp/lambda.cmi \ - bytecomp/instruct.cmi typing/env.cmi utils/config.cmi \ - bytecomp/cmo_format.cmi utils/clflags.cmi typing/btype.cmi \ - parsing/asttypes.cmi bytecomp/emitcode.cmi + bytecomp/opcodes.cmo utils/misc.cmi bytecomp/meta.cmi \ + parsing/location.cmi bytecomp/lambda.cmi bytecomp/instruct.cmi \ + typing/env.cmi utils/config.cmi bytecomp/cmo_format.cmi utils/clflags.cmi \ + typing/btype.cmi parsing/asttypes.cmi bytecomp/emitcode.cmi bytecomp/emitcode.cmx : bytecomp/translmod.cmx typing/primitive.cmx \ - bytecomp/opcodes.cmx utils/misc.cmx bytecomp/meta.cmx bytecomp/lambda.cmx \ - bytecomp/instruct.cmx typing/env.cmx utils/config.cmx \ - bytecomp/cmo_format.cmi utils/clflags.cmx typing/btype.cmx \ - parsing/asttypes.cmi bytecomp/emitcode.cmi + bytecomp/opcodes.cmx utils/misc.cmx bytecomp/meta.cmx \ + parsing/location.cmx bytecomp/lambda.cmx bytecomp/instruct.cmx \ + typing/env.cmx utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ + typing/btype.cmx parsing/asttypes.cmi bytecomp/emitcode.cmi bytecomp/instruct.cmo : typing/types.cmi typing/subst.cmi \ parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi \ bytecomp/instruct.cmi @@ -492,24 +510,24 @@ bytecomp/printlambda.cmx : typing/types.cmx typing/primitive.cmx \ parsing/asttypes.cmi bytecomp/printlambda.cmi bytecomp/runtimedef.cmo : bytecomp/runtimedef.cmi bytecomp/runtimedef.cmx : bytecomp/runtimedef.cmi -bytecomp/simplif.cmo : utils/tbl.cmi typing/stypes.cmi bytecomp/lambda.cmi \ - typing/ident.cmi utils/clflags.cmi parsing/asttypes.cmi typing/annot.cmi \ - bytecomp/simplif.cmi -bytecomp/simplif.cmx : utils/tbl.cmx typing/stypes.cmx bytecomp/lambda.cmx \ - typing/ident.cmx utils/clflags.cmx parsing/asttypes.cmi typing/annot.cmi \ - bytecomp/simplif.cmi +bytecomp/simplif.cmo : utils/tbl.cmi typing/stypes.cmi utils/misc.cmi \ + bytecomp/lambda.cmi typing/ident.cmi utils/clflags.cmi \ + parsing/asttypes.cmi typing/annot.cmi bytecomp/simplif.cmi +bytecomp/simplif.cmx : utils/tbl.cmx typing/stypes.cmx utils/misc.cmx \ + bytecomp/lambda.cmx typing/ident.cmx utils/clflags.cmx \ + parsing/asttypes.cmi typing/annot.cmi bytecomp/simplif.cmi bytecomp/switch.cmo : bytecomp/switch.cmi bytecomp/switch.cmx : bytecomp/switch.cmi bytecomp/symtable.cmo : utils/tbl.cmi bytecomp/runtimedef.cmi \ - typing/predef.cmi utils/misc.cmi bytecomp/meta.cmi bytecomp/lambda.cmi \ - typing/ident.cmi bytecomp/dll.cmi bytecomp/cmo_format.cmi \ - utils/clflags.cmi bytecomp/bytesections.cmi parsing/asttypes.cmi \ - bytecomp/symtable.cmi + typing/predef.cmi utils/misc.cmi bytecomp/meta.cmi parsing/location.cmi \ + bytecomp/lambda.cmi typing/ident.cmi bytecomp/dll.cmi \ + bytecomp/cmo_format.cmi utils/clflags.cmi bytecomp/bytesections.cmi \ + parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/symtable.cmx : utils/tbl.cmx bytecomp/runtimedef.cmx \ - typing/predef.cmx utils/misc.cmx bytecomp/meta.cmx bytecomp/lambda.cmx \ - typing/ident.cmx bytecomp/dll.cmx bytecomp/cmo_format.cmi \ - utils/clflags.cmx bytecomp/bytesections.cmx parsing/asttypes.cmi \ - bytecomp/symtable.cmi + typing/predef.cmx utils/misc.cmx bytecomp/meta.cmx parsing/location.cmx \ + bytecomp/lambda.cmx typing/ident.cmx bytecomp/dll.cmx \ + bytecomp/cmo_format.cmi utils/clflags.cmx bytecomp/bytesections.cmx \ + parsing/asttypes.cmi bytecomp/symtable.cmi bytecomp/translclass.cmo : typing/types.cmi bytecomp/typeopt.cmi \ typing/typedtree.cmi bytecomp/translobj.cmi bytecomp/translcore.cmi \ typing/path.cmi bytecomp/matching.cmi parsing/location.cmi \ @@ -560,37 +578,39 @@ bytecomp/typeopt.cmo : typing/types.cmi typing/typedtree.cmi \ bytecomp/typeopt.cmx : typing/types.cmx typing/typedtree.cmx \ typing/predef.cmx typing/path.cmx bytecomp/lambda.cmx typing/ident.cmx \ typing/env.cmx typing/ctype.cmx bytecomp/typeopt.cmi +asmcomp/CSEgen.cmi : asmcomp/mach.cmi asmcomp/asmgen.cmi : bytecomp/lambda.cmi asmcomp/cmm.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmi : asmcomp/cmx_format.cmi -asmcomp/asmpackager.cmi : +asmcomp/asmpackager.cmi : typing/env.cmi asmcomp/clambda.cmi : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/debuginfo.cmi parsing/asttypes.cmi asmcomp/closure.cmi : bytecomp/lambda.cmi asmcomp/clambda.cmi -asmcomp/cmm.cmi : typing/ident.cmi asmcomp/debuginfo.cmi +asmcomp/cmm.cmi : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmmgen.cmi : asmcomp/cmx_format.cmi asmcomp/cmm.cmi \ asmcomp/clambda.cmi asmcomp/cmx_format.cmi : asmcomp/clambda.cmi asmcomp/codegen.cmi : asmcomp/cmm.cmi asmcomp/coloring.cmi : asmcomp/comballoc.cmi : asmcomp/mach.cmi -asmcomp/compilenv.cmi : bytecomp/lambda.cmi typing/ident.cmi \ - asmcomp/cmx_format.cmi asmcomp/clambda.cmi +asmcomp/compilenv.cmi : typing/ident.cmi asmcomp/cmx_format.cmi \ + asmcomp/clambda.cmi +asmcomp/deadcode.cmi : asmcomp/mach.cmi asmcomp/debuginfo.cmi : parsing/location.cmi bytecomp/lambda.cmi asmcomp/emit.cmi : asmcomp/linearize.cmi asmcomp/cmm.cmi asmcomp/emitaux.cmi : asmcomp/debuginfo.cmi asmcomp/interf.cmi : asmcomp/mach.cmi -asmcomp/linearize.cmi : asmcomp/reg.cmi asmcomp/mach.cmi \ +asmcomp/linearize.cmi : asmcomp/reg.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi asmcomp/liveness.cmi : asmcomp/mach.cmi -asmcomp/mach.cmi : asmcomp/reg.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/arch.cmo +asmcomp/mach.cmi : asmcomp/reg.cmi bytecomp/lambda.cmi asmcomp/debuginfo.cmi \ + asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/printclambda.cmi : asmcomp/clambda.cmi asmcomp/printcmm.cmi : asmcomp/cmm.cmi asmcomp/printlinear.cmi : asmcomp/linearize.cmi asmcomp/printmach.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/proc.cmi : asmcomp/reg.cmi asmcomp/mach.cmi -asmcomp/reg.cmi : asmcomp/cmm.cmi +asmcomp/reg.cmi : typing/ident.cmi asmcomp/cmm.cmi asmcomp/reload.cmi : asmcomp/mach.cmi asmcomp/reloadgen.cmi : asmcomp/reg.cmi asmcomp/mach.cmi asmcomp/schedgen.cmi : asmcomp/mach.cmi asmcomp/linearize.cmi @@ -600,6 +620,13 @@ asmcomp/selectgen.cmi : utils/tbl.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ asmcomp/selection.cmi : asmcomp/mach.cmi asmcomp/cmm.cmi asmcomp/spill.cmi : asmcomp/mach.cmi asmcomp/split.cmi : asmcomp/mach.cmi +asmcomp/strmatch.cmi : asmcomp/cmm.cmi +asmcomp/CSE.cmo : asmcomp/mach.cmi asmcomp/CSEgen.cmi asmcomp/arch.cmo +asmcomp/CSE.cmx : asmcomp/mach.cmx asmcomp/CSEgen.cmx asmcomp/arch.cmx +asmcomp/CSEgen.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ + asmcomp/CSEgen.cmi asmcomp/arch.cmo : asmcomp/arch.cmx : asmcomp/asmgen.cmo : bytecomp/translmod.cmi asmcomp/split.cmi \ @@ -608,27 +635,27 @@ asmcomp/asmgen.cmo : bytecomp/translmod.cmi asmcomp/split.cmi \ asmcomp/printlinear.cmi asmcomp/printcmm.cmi asmcomp/printclambda.cmi \ typing/primitive.cmi utils/misc.cmi asmcomp/mach.cmi parsing/location.cmi \ asmcomp/liveness.cmi asmcomp/linearize.cmi asmcomp/interf.cmi \ - asmcomp/emitaux.cmi asmcomp/emit.cmi utils/config.cmi \ - asmcomp/compilenv.cmi asmcomp/comballoc.cmi asmcomp/coloring.cmi \ - asmcomp/cmmgen.cmi asmcomp/cmm.cmi asmcomp/closure.cmi utils/clflags.cmi \ - asmcomp/asmgen.cmi + asmcomp/emitaux.cmi asmcomp/emit.cmi asmcomp/deadcode.cmi \ + utils/config.cmi asmcomp/compilenv.cmi asmcomp/comballoc.cmi \ + asmcomp/coloring.cmi asmcomp/cmmgen.cmi asmcomp/cmm.cmi \ + asmcomp/closure.cmi utils/clflags.cmi asmcomp/CSE.cmo asmcomp/asmgen.cmi asmcomp/asmgen.cmx : bytecomp/translmod.cmx asmcomp/split.cmx \ asmcomp/spill.cmx asmcomp/selection.cmx asmcomp/scheduling.cmx \ asmcomp/reload.cmx asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/printmach.cmx \ asmcomp/printlinear.cmx asmcomp/printcmm.cmx asmcomp/printclambda.cmx \ typing/primitive.cmx utils/misc.cmx asmcomp/mach.cmx parsing/location.cmx \ asmcomp/liveness.cmx asmcomp/linearize.cmx asmcomp/interf.cmx \ - asmcomp/emitaux.cmx asmcomp/emit.cmx utils/config.cmx \ - asmcomp/compilenv.cmx asmcomp/comballoc.cmx asmcomp/coloring.cmx \ - asmcomp/cmmgen.cmx asmcomp/cmm.cmx asmcomp/closure.cmx utils/clflags.cmx \ - asmcomp/asmgen.cmi -asmcomp/asmlibrarian.cmo : utils/misc.cmi utils/config.cmi \ - asmcomp/compilenv.cmi asmcomp/cmx_format.cmi utils/clflags.cmi \ - asmcomp/clambda.cmi utils/ccomp.cmi asmcomp/asmlink.cmi \ + asmcomp/emitaux.cmx asmcomp/emit.cmx asmcomp/deadcode.cmx \ + utils/config.cmx asmcomp/compilenv.cmx asmcomp/comballoc.cmx \ + asmcomp/coloring.cmx asmcomp/cmmgen.cmx asmcomp/cmm.cmx \ + asmcomp/closure.cmx utils/clflags.cmx asmcomp/CSE.cmx asmcomp/asmgen.cmi +asmcomp/asmlibrarian.cmo : utils/misc.cmi parsing/location.cmi \ + utils/config.cmi asmcomp/compilenv.cmi asmcomp/cmx_format.cmi \ + utils/clflags.cmi asmcomp/clambda.cmi utils/ccomp.cmi asmcomp/asmlink.cmi \ asmcomp/asmlibrarian.cmi -asmcomp/asmlibrarian.cmx : utils/misc.cmx utils/config.cmx \ - asmcomp/compilenv.cmx asmcomp/cmx_format.cmi utils/clflags.cmx \ - asmcomp/clambda.cmx utils/ccomp.cmx asmcomp/asmlink.cmx \ +asmcomp/asmlibrarian.cmx : utils/misc.cmx parsing/location.cmx \ + utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ + utils/clflags.cmx asmcomp/clambda.cmx utils/ccomp.cmx asmcomp/asmlink.cmx \ asmcomp/asmlibrarian.cmi asmcomp/asmlink.cmo : bytecomp/runtimedef.cmi asmcomp/proc.cmi \ utils/misc.cmi parsing/location.cmi asmcomp/emitaux.cmi asmcomp/emit.cmi \ @@ -655,29 +682,31 @@ asmcomp/clambda.cmo : bytecomp/lambda.cmi typing/ident.cmi \ asmcomp/clambda.cmx : bytecomp/lambda.cmx typing/ident.cmx \ asmcomp/debuginfo.cmx parsing/asttypes.cmi asmcomp/clambda.cmi asmcomp/closure.cmo : utils/tbl.cmi bytecomp/switch.cmi typing/primitive.cmi \ - utils/misc.cmi bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/compilenv.cmi utils/clflags.cmi asmcomp/clambda.cmi \ - parsing/asttypes.cmi asmcomp/arch.cmo asmcomp/closure.cmi -asmcomp/closure.cmx : utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ - utils/misc.cmx bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/compilenv.cmx utils/clflags.cmx asmcomp/clambda.cmx \ - parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/closure.cmi -asmcomp/cmm.cmo : typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/arch.cmo \ - asmcomp/cmm.cmi -asmcomp/cmm.cmx : typing/ident.cmx asmcomp/debuginfo.cmx asmcomp/arch.cmx \ - asmcomp/cmm.cmi -asmcomp/cmmgen.cmo : typing/types.cmi bytecomp/switch.cmi asmcomp/proc.cmi \ - typing/primitive.cmi utils/misc.cmi bytecomp/lambda.cmi typing/ident.cmi \ - asmcomp/debuginfo.cmi utils/config.cmi asmcomp/compilenv.cmi \ - asmcomp/cmx_format.cmi asmcomp/cmm.cmi utils/clflags.cmi \ + utils/misc.cmi parsing/location.cmi bytecomp/lambda.cmi typing/ident.cmi \ + asmcomp/debuginfo.cmi asmcomp/compilenv.cmi utils/clflags.cmi \ asmcomp/clambda.cmi parsing/asttypes.cmi asmcomp/arch.cmo \ - asmcomp/cmmgen.cmi -asmcomp/cmmgen.cmx : typing/types.cmx bytecomp/switch.cmx asmcomp/proc.cmx \ - typing/primitive.cmx utils/misc.cmx bytecomp/lambda.cmx typing/ident.cmx \ - asmcomp/debuginfo.cmx utils/config.cmx asmcomp/compilenv.cmx \ - asmcomp/cmx_format.cmi asmcomp/cmm.cmx utils/clflags.cmx \ + asmcomp/closure.cmi +asmcomp/closure.cmx : utils/tbl.cmx bytecomp/switch.cmx typing/primitive.cmx \ + utils/misc.cmx parsing/location.cmx bytecomp/lambda.cmx typing/ident.cmx \ + asmcomp/debuginfo.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ asmcomp/clambda.cmx parsing/asttypes.cmi asmcomp/arch.cmx \ - asmcomp/cmmgen.cmi + asmcomp/closure.cmi +asmcomp/cmm.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ + asmcomp/arch.cmo asmcomp/cmm.cmi +asmcomp/cmm.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ + asmcomp/arch.cmx asmcomp/cmm.cmi +asmcomp/cmmgen.cmo : typing/types.cmi bytecomp/switch.cmi \ + asmcomp/strmatch.cmi asmcomp/proc.cmi typing/primitive.cmi utils/misc.cmi \ + bytecomp/lambda.cmi typing/ident.cmi asmcomp/debuginfo.cmi \ + utils/config.cmi asmcomp/compilenv.cmi asmcomp/cmx_format.cmi \ + asmcomp/cmm.cmi utils/clflags.cmi asmcomp/clambda.cmi \ + parsing/asttypes.cmi asmcomp/arch.cmo asmcomp/cmmgen.cmi +asmcomp/cmmgen.cmx : typing/types.cmx bytecomp/switch.cmx \ + asmcomp/strmatch.cmx asmcomp/proc.cmx typing/primitive.cmx utils/misc.cmx \ + bytecomp/lambda.cmx typing/ident.cmx asmcomp/debuginfo.cmx \ + utils/config.cmx asmcomp/compilenv.cmx asmcomp/cmx_format.cmi \ + asmcomp/cmm.cmx utils/clflags.cmx asmcomp/clambda.cmx \ + parsing/asttypes.cmi asmcomp/arch.cmx asmcomp/cmmgen.cmi asmcomp/codegen.cmo : asmcomp/split.cmi asmcomp/spill.cmi asmcomp/reload.cmi \ asmcomp/reg.cmi asmcomp/printmach.cmi asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi asmcomp/liveness.cmi asmcomp/linearize.cmi \ @@ -694,24 +723,30 @@ asmcomp/comballoc.cmo : asmcomp/reg.cmi asmcomp/mach.cmi utils/config.cmi \ asmcomp/arch.cmo asmcomp/comballoc.cmi asmcomp/comballoc.cmx : asmcomp/reg.cmx asmcomp/mach.cmx utils/config.cmx \ asmcomp/arch.cmx asmcomp/comballoc.cmi -asmcomp/compilenv.cmo : utils/misc.cmi parsing/location.cmi \ - bytecomp/lambda.cmi typing/ident.cmi typing/env.cmi utils/config.cmi \ - asmcomp/cmx_format.cmi asmcomp/clambda.cmi asmcomp/compilenv.cmi -asmcomp/compilenv.cmx : utils/misc.cmx parsing/location.cmx \ - bytecomp/lambda.cmx typing/ident.cmx typing/env.cmx utils/config.cmx \ - asmcomp/cmx_format.cmi asmcomp/clambda.cmx asmcomp/compilenv.cmi +asmcomp/compilenv.cmo : utils/misc.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi utils/config.cmi asmcomp/cmx_format.cmi \ + asmcomp/clambda.cmi asmcomp/compilenv.cmi +asmcomp/compilenv.cmx : utils/misc.cmx parsing/location.cmx typing/ident.cmx \ + typing/env.cmx utils/config.cmx asmcomp/cmx_format.cmi \ + asmcomp/clambda.cmx asmcomp/compilenv.cmi +asmcomp/deadcode.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ + asmcomp/deadcode.cmi +asmcomp/deadcode.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ + asmcomp/deadcode.cmi asmcomp/debuginfo.cmo : parsing/location.cmi bytecomp/lambda.cmi \ asmcomp/debuginfo.cmi asmcomp/debuginfo.cmx : parsing/location.cmx bytecomp/lambda.cmx \ asmcomp/debuginfo.cmi asmcomp/emit.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ - asmcomp/mach.cmi asmcomp/linearize.cmi asmcomp/emitaux.cmi \ - asmcomp/debuginfo.cmi utils/config.cmi asmcomp/compilenv.cmi \ - asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emit.cmi + asmcomp/mach.cmi asmcomp/linearize.cmi bytecomp/lambda.cmi \ + asmcomp/emitaux.cmi asmcomp/debuginfo.cmi utils/config.cmi \ + asmcomp/compilenv.cmi asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo \ + asmcomp/emit.cmi asmcomp/emit.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ - asmcomp/mach.cmx asmcomp/linearize.cmx asmcomp/emitaux.cmx \ - asmcomp/debuginfo.cmx utils/config.cmx asmcomp/compilenv.cmx \ - asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx asmcomp/emit.cmi + asmcomp/mach.cmx asmcomp/linearize.cmx bytecomp/lambda.cmx \ + asmcomp/emitaux.cmx asmcomp/debuginfo.cmx utils/config.cmx \ + asmcomp/compilenv.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \ + asmcomp/emit.cmi asmcomp/emitaux.cmo : asmcomp/linearize.cmi asmcomp/debuginfo.cmi \ utils/config.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/emitaux.cmi asmcomp/emitaux.cmx : asmcomp/linearize.cmx asmcomp/debuginfo.cmx \ @@ -721,49 +756,53 @@ asmcomp/interf.cmo : asmcomp/reg.cmi asmcomp/proc.cmi asmcomp/mach.cmi \ asmcomp/interf.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ asmcomp/interf.cmi asmcomp/linearize.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ - asmcomp/mach.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/linearize.cmi + asmcomp/mach.cmi bytecomp/lambda.cmi asmcomp/debuginfo.cmi \ + asmcomp/cmm.cmi asmcomp/linearize.cmi asmcomp/linearize.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ - asmcomp/mach.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/linearize.cmi + asmcomp/mach.cmx bytecomp/lambda.cmx asmcomp/debuginfo.cmx \ + asmcomp/cmm.cmx asmcomp/linearize.cmi asmcomp/liveness.cmo : asmcomp/reg.cmi asmcomp/proc.cmi \ asmcomp/printmach.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/liveness.cmi asmcomp/liveness.cmx : asmcomp/reg.cmx asmcomp/proc.cmx \ asmcomp/printmach.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/liveness.cmi -asmcomp/mach.cmo : asmcomp/reg.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi \ - asmcomp/arch.cmo asmcomp/mach.cmi -asmcomp/mach.cmx : asmcomp/reg.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx \ - asmcomp/arch.cmx asmcomp/mach.cmi +asmcomp/mach.cmo : asmcomp/reg.cmi bytecomp/lambda.cmi asmcomp/debuginfo.cmi \ + asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/mach.cmi +asmcomp/mach.cmx : asmcomp/reg.cmx bytecomp/lambda.cmx asmcomp/debuginfo.cmx \ + asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/mach.cmi asmcomp/printclambda.cmo : bytecomp/printlambda.cmi bytecomp/lambda.cmi \ typing/ident.cmi asmcomp/clambda.cmi parsing/asttypes.cmi \ asmcomp/printclambda.cmi asmcomp/printclambda.cmx : bytecomp/printlambda.cmx bytecomp/lambda.cmx \ typing/ident.cmx asmcomp/clambda.cmx parsing/asttypes.cmi \ asmcomp/printclambda.cmi -asmcomp/printcmm.cmo : typing/ident.cmi asmcomp/debuginfo.cmi \ - asmcomp/cmm.cmi asmcomp/printcmm.cmi -asmcomp/printcmm.cmx : typing/ident.cmx asmcomp/debuginfo.cmx \ - asmcomp/cmm.cmx asmcomp/printcmm.cmi +asmcomp/printcmm.cmo : bytecomp/lambda.cmi typing/ident.cmi \ + asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/printcmm.cmi +asmcomp/printcmm.cmx : bytecomp/lambda.cmx typing/ident.cmx \ + asmcomp/debuginfo.cmx asmcomp/cmm.cmx asmcomp/printcmm.cmi asmcomp/printlinear.cmo : asmcomp/printmach.cmi asmcomp/mach.cmi \ - asmcomp/linearize.cmi asmcomp/debuginfo.cmi asmcomp/printlinear.cmi + asmcomp/linearize.cmi bytecomp/lambda.cmi asmcomp/debuginfo.cmi \ + asmcomp/printlinear.cmi asmcomp/printlinear.cmx : asmcomp/printmach.cmx asmcomp/mach.cmx \ - asmcomp/linearize.cmx asmcomp/debuginfo.cmx asmcomp/printlinear.cmi + asmcomp/linearize.cmx bytecomp/lambda.cmx asmcomp/debuginfo.cmx \ + asmcomp/printlinear.cmi asmcomp/printmach.cmo : asmcomp/reg.cmi asmcomp/proc.cmi \ - asmcomp/printcmm.cmi asmcomp/mach.cmi asmcomp/debuginfo.cmi \ - asmcomp/cmm.cmi asmcomp/arch.cmo asmcomp/printmach.cmi + asmcomp/printcmm.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ + asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ + asmcomp/printmach.cmi asmcomp/printmach.cmx : asmcomp/reg.cmx asmcomp/proc.cmx \ - asmcomp/printcmm.cmx asmcomp/mach.cmx asmcomp/debuginfo.cmx \ - asmcomp/cmm.cmx asmcomp/arch.cmx asmcomp/printmach.cmi + asmcomp/printcmm.cmx asmcomp/mach.cmx bytecomp/lambda.cmx \ + asmcomp/debuginfo.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ + asmcomp/printmach.cmi asmcomp/proc.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ utils/config.cmi asmcomp/cmm.cmi utils/clflags.cmi utils/ccomp.cmi \ asmcomp/arch.cmo asmcomp/proc.cmi asmcomp/proc.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ utils/config.cmx asmcomp/cmm.cmx utils/clflags.cmx utils/ccomp.cmx \ asmcomp/arch.cmx asmcomp/proc.cmi -asmcomp/reg.cmo : asmcomp/cmm.cmi asmcomp/reg.cmi -asmcomp/reg.cmx : asmcomp/cmm.cmx asmcomp/reg.cmi +asmcomp/reg.cmo : typing/ident.cmi asmcomp/cmm.cmi asmcomp/reg.cmi +asmcomp/reg.cmx : typing/ident.cmx asmcomp/cmm.cmx asmcomp/reg.cmi asmcomp/reload.cmo : asmcomp/reloadgen.cmi asmcomp/reg.cmi asmcomp/mach.cmi \ asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo asmcomp/reload.cmi asmcomp/reload.cmx : asmcomp/reloadgen.cmx asmcomp/reg.cmx asmcomp/mach.cmx \ @@ -781,19 +820,19 @@ asmcomp/schedgen.cmx : asmcomp/reg.cmx asmcomp/proc.cmx asmcomp/mach.cmx \ asmcomp/scheduling.cmo : asmcomp/schedgen.cmi asmcomp/scheduling.cmi asmcomp/scheduling.cmx : asmcomp/schedgen.cmx asmcomp/scheduling.cmi asmcomp/selectgen.cmo : utils/tbl.cmi bytecomp/simplif.cmi asmcomp/reg.cmi \ - asmcomp/proc.cmi utils/misc.cmi asmcomp/mach.cmi typing/ident.cmi \ - asmcomp/debuginfo.cmi asmcomp/cmm.cmi asmcomp/arch.cmo \ - asmcomp/selectgen.cmi + asmcomp/proc.cmi utils/misc.cmi asmcomp/mach.cmi bytecomp/lambda.cmi \ + typing/ident.cmi asmcomp/debuginfo.cmi asmcomp/cmm.cmi utils/clflags.cmi \ + asmcomp/arch.cmo asmcomp/selectgen.cmi asmcomp/selectgen.cmx : utils/tbl.cmx bytecomp/simplif.cmx asmcomp/reg.cmx \ - asmcomp/proc.cmx utils/misc.cmx asmcomp/mach.cmx typing/ident.cmx \ - asmcomp/debuginfo.cmx asmcomp/cmm.cmx asmcomp/arch.cmx \ - asmcomp/selectgen.cmi + asmcomp/proc.cmx utils/misc.cmx asmcomp/mach.cmx bytecomp/lambda.cmx \ + typing/ident.cmx asmcomp/debuginfo.cmx asmcomp/cmm.cmx utils/clflags.cmx \ + asmcomp/arch.cmx asmcomp/selectgen.cmi asmcomp/selection.cmo : asmcomp/selectgen.cmi asmcomp/proc.cmi \ - utils/misc.cmi asmcomp/mach.cmi asmcomp/cmm.cmi utils/clflags.cmi \ - asmcomp/arch.cmo asmcomp/selection.cmi + asmcomp/mach.cmi asmcomp/cmm.cmi utils/clflags.cmi asmcomp/arch.cmo \ + asmcomp/selection.cmi asmcomp/selection.cmx : asmcomp/selectgen.cmx asmcomp/proc.cmx \ - utils/misc.cmx asmcomp/mach.cmx asmcomp/cmm.cmx utils/clflags.cmx \ - asmcomp/arch.cmx asmcomp/selection.cmi + asmcomp/mach.cmx asmcomp/cmm.cmx utils/clflags.cmx asmcomp/arch.cmx \ + asmcomp/selection.cmi asmcomp/spill.cmo : asmcomp/reg.cmi asmcomp/proc.cmi utils/misc.cmi \ asmcomp/mach.cmi asmcomp/spill.cmi asmcomp/spill.cmx : asmcomp/reg.cmx asmcomp/proc.cmx utils/misc.cmx \ @@ -802,6 +841,10 @@ asmcomp/split.cmo : asmcomp/reg.cmi utils/misc.cmi asmcomp/mach.cmi \ asmcomp/split.cmi asmcomp/split.cmx : asmcomp/reg.cmx utils/misc.cmx asmcomp/mach.cmx \ asmcomp/split.cmi +asmcomp/strmatch.cmo : bytecomp/lambda.cmi typing/ident.cmi asmcomp/cmm.cmi \ + asmcomp/arch.cmo asmcomp/strmatch.cmi +asmcomp/strmatch.cmx : bytecomp/lambda.cmx typing/ident.cmx asmcomp/cmm.cmx \ + asmcomp/arch.cmx asmcomp/strmatch.cmi driver/compenv.cmi : driver/compile.cmi : driver/compmisc.cmi : typing/env.cmi @@ -811,7 +854,7 @@ driver/main_args.cmi : driver/optcompile.cmi : driver/opterrors.cmi : driver/optmain.cmi : -driver/pparse.cmi : +driver/pparse.cmi : parsing/parsetree.cmi driver/compenv.cmo : utils/warnings.cmi utils/misc.cmi parsing/location.cmi \ utils/config.cmi utils/clflags.cmi driver/compenv.cmi driver/compenv.cmx : utils/warnings.cmx utils/misc.cmx parsing/location.cmx \ @@ -821,48 +864,36 @@ driver/compile.cmo : utils/warnings.cmi typing/typemod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyped.cmi \ typing/printtyp.cmi bytecomp/printlambda.cmi bytecomp/printinstr.cmi \ parsing/printast.cmi parsing/pprintast.cmi driver/pparse.cmi \ - parsing/parse.cmi utils/misc.cmi parsing/location.cmi \ - typing/includemod.cmi typing/env.cmi bytecomp/emitcode.cmi \ - utils/config.cmi driver/compmisc.cmi driver/compenv.cmi utils/clflags.cmi \ - utils/ccomp.cmi bytecomp/bytegen.cmi driver/compile.cmi + utils/misc.cmi parsing/location.cmi typing/includemod.cmi typing/env.cmi \ + bytecomp/emitcode.cmi driver/compmisc.cmi driver/compenv.cmi \ + utils/clflags.cmi utils/ccomp.cmi bytecomp/bytegen.cmi driver/compile.cmi driver/compile.cmx : utils/warnings.cmx typing/typemod.cmx \ typing/typedtree.cmx typing/typecore.cmx bytecomp/translmod.cmx \ typing/stypes.cmx bytecomp/simplif.cmx typing/printtyped.cmx \ typing/printtyp.cmx bytecomp/printlambda.cmx bytecomp/printinstr.cmx \ parsing/printast.cmx parsing/pprintast.cmx driver/pparse.cmx \ - parsing/parse.cmx utils/misc.cmx parsing/location.cmx \ - typing/includemod.cmx typing/env.cmx bytecomp/emitcode.cmx \ - utils/config.cmx driver/compmisc.cmx driver/compenv.cmx utils/clflags.cmx \ - utils/ccomp.cmx bytecomp/bytegen.cmx driver/compile.cmi -driver/compmisc.cmo : utils/misc.cmi typing/ident.cmi typing/env.cmi \ - utils/config.cmi driver/compenv.cmi utils/clflags.cmi driver/compmisc.cmi -driver/compmisc.cmx : utils/misc.cmx typing/ident.cmx typing/env.cmx \ - utils/config.cmx driver/compenv.cmx utils/clflags.cmx driver/compmisc.cmi -driver/errors.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/typemod.cmi typing/typedecl.cmi typing/typecore.cmi \ - typing/typeclass.cmi bytecomp/translmod.cmi bytecomp/translcore.cmi \ - bytecomp/translclass.cmi parsing/syntaxerr.cmi bytecomp/symtable.cmi \ - driver/pparse.cmi parsing/location.cmi parsing/lexer.cmi \ - typing/includemod.cmi typing/env.cmi typing/ctype.cmi \ - typing/cmi_format.cmi bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ - bytecomp/bytelibrarian.cmi driver/errors.cmi -driver/errors.cmx : utils/warnings.cmx typing/typetexp.cmx \ - typing/typemod.cmx typing/typedecl.cmx typing/typecore.cmx \ - typing/typeclass.cmx bytecomp/translmod.cmx bytecomp/translcore.cmx \ - bytecomp/translclass.cmx parsing/syntaxerr.cmx bytecomp/symtable.cmx \ - driver/pparse.cmx parsing/location.cmx parsing/lexer.cmx \ - typing/includemod.cmx typing/env.cmx typing/ctype.cmx \ - typing/cmi_format.cmx bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ - bytecomp/bytelibrarian.cmx driver/errors.cmi + utils/misc.cmx parsing/location.cmx typing/includemod.cmx typing/env.cmx \ + bytecomp/emitcode.cmx driver/compmisc.cmx driver/compenv.cmx \ + utils/clflags.cmx utils/ccomp.cmx bytecomp/bytegen.cmx driver/compile.cmi +driver/compmisc.cmo : typing/typemod.cmi utils/misc.cmi \ + parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi utils/config.cmi driver/compenv.cmi utils/clflags.cmi \ + parsing/asttypes.cmi driver/compmisc.cmi +driver/compmisc.cmx : typing/typemod.cmx utils/misc.cmx \ + parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ + typing/env.cmx utils/config.cmx driver/compenv.cmx utils/clflags.cmx \ + parsing/asttypes.cmi driver/compmisc.cmi +driver/errors.cmo : parsing/location.cmi driver/errors.cmi +driver/errors.cmx : parsing/location.cmx driver/errors.cmi driver/main.cmo : utils/warnings.cmi utils/misc.cmi driver/main_args.cmi \ - parsing/location.cmi driver/errors.cmi utils/config.cmi \ - driver/compmisc.cmi driver/compile.cmi driver/compenv.cmi \ - utils/clflags.cmi bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ + parsing/location.cmi utils/config.cmi driver/compmisc.cmi \ + driver/compile.cmi driver/compenv.cmi utils/clflags.cmi \ + bytecomp/bytepackager.cmi bytecomp/bytelink.cmi \ bytecomp/bytelibrarian.cmi driver/main.cmi driver/main.cmx : utils/warnings.cmx utils/misc.cmx driver/main_args.cmx \ - parsing/location.cmx driver/errors.cmx utils/config.cmx \ - driver/compmisc.cmx driver/compile.cmx driver/compenv.cmx \ - utils/clflags.cmx bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ + parsing/location.cmx utils/config.cmx driver/compmisc.cmx \ + driver/compile.cmx driver/compenv.cmx utils/clflags.cmx \ + bytecomp/bytepackager.cmx bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmx driver/main.cmi driver/main_args.cmo : utils/warnings.cmi driver/main_args.cmi driver/main_args.cmx : utils/warnings.cmx driver/main_args.cmi @@ -870,52 +901,38 @@ driver/optcompile.cmo : utils/warnings.cmi typing/typemod.cmi \ typing/typedtree.cmi typing/typecore.cmi bytecomp/translmod.cmi \ typing/stypes.cmi bytecomp/simplif.cmi typing/printtyped.cmi \ typing/printtyp.cmi bytecomp/printlambda.cmi parsing/printast.cmi \ - parsing/pprintast.cmi driver/pparse.cmi parsing/parse.cmi utils/misc.cmi \ - parsing/location.cmi typing/includemod.cmi typing/env.cmi \ - utils/config.cmi driver/compmisc.cmi asmcomp/compilenv.cmi \ - driver/compenv.cmi utils/clflags.cmi utils/ccomp.cmi asmcomp/asmgen.cmi \ - driver/optcompile.cmi + parsing/pprintast.cmi driver/pparse.cmi utils/misc.cmi \ + typing/includemod.cmi typing/env.cmi utils/config.cmi driver/compmisc.cmi \ + asmcomp/compilenv.cmi driver/compenv.cmi utils/clflags.cmi \ + utils/ccomp.cmi asmcomp/asmgen.cmi driver/optcompile.cmi driver/optcompile.cmx : utils/warnings.cmx typing/typemod.cmx \ typing/typedtree.cmx typing/typecore.cmx bytecomp/translmod.cmx \ typing/stypes.cmx bytecomp/simplif.cmx typing/printtyped.cmx \ typing/printtyp.cmx bytecomp/printlambda.cmx parsing/printast.cmx \ - parsing/pprintast.cmx driver/pparse.cmx parsing/parse.cmx utils/misc.cmx \ - parsing/location.cmx typing/includemod.cmx typing/env.cmx \ - utils/config.cmx driver/compmisc.cmx asmcomp/compilenv.cmx \ - driver/compenv.cmx utils/clflags.cmx utils/ccomp.cmx asmcomp/asmgen.cmx \ - driver/optcompile.cmi -driver/opterrors.cmo : utils/warnings.cmi typing/typetexp.cmi \ - typing/typemod.cmi typing/typedecl.cmi typing/typecore.cmi \ - typing/typeclass.cmi bytecomp/translmod.cmi bytecomp/translcore.cmi \ - bytecomp/translclass.cmi parsing/syntaxerr.cmi driver/pparse.cmi \ - parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ - typing/env.cmi typing/ctype.cmi asmcomp/compilenv.cmi \ - typing/cmi_format.cmi asmcomp/asmpackager.cmi asmcomp/asmlink.cmi \ - asmcomp/asmlibrarian.cmi asmcomp/asmgen.cmi driver/opterrors.cmi -driver/opterrors.cmx : utils/warnings.cmx typing/typetexp.cmx \ - typing/typemod.cmx typing/typedecl.cmx typing/typecore.cmx \ - typing/typeclass.cmx bytecomp/translmod.cmx bytecomp/translcore.cmx \ - bytecomp/translclass.cmx parsing/syntaxerr.cmx driver/pparse.cmx \ - parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ - typing/env.cmx typing/ctype.cmx asmcomp/compilenv.cmx \ - typing/cmi_format.cmx asmcomp/asmpackager.cmx asmcomp/asmlink.cmx \ - asmcomp/asmlibrarian.cmx asmcomp/asmgen.cmx driver/opterrors.cmi + parsing/pprintast.cmx driver/pparse.cmx utils/misc.cmx \ + typing/includemod.cmx typing/env.cmx utils/config.cmx driver/compmisc.cmx \ + asmcomp/compilenv.cmx driver/compenv.cmx utils/clflags.cmx \ + utils/ccomp.cmx asmcomp/asmgen.cmx driver/optcompile.cmi +driver/opterrors.cmo : parsing/location.cmi driver/opterrors.cmi +driver/opterrors.cmx : parsing/location.cmx driver/opterrors.cmi driver/optmain.cmo : utils/warnings.cmi asmcomp/printmach.cmi \ - driver/opterrors.cmi driver/optcompile.cmi utils/misc.cmi \ - driver/main_args.cmi parsing/location.cmi utils/config.cmi \ - driver/compmisc.cmi driver/compenv.cmi utils/clflags.cmi \ - asmcomp/asmpackager.cmi asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi \ - asmcomp/arch.cmo driver/optmain.cmi + driver/optcompile.cmi utils/misc.cmi driver/main_args.cmi \ + parsing/location.cmi utils/config.cmi driver/compmisc.cmi \ + driver/compenv.cmi utils/clflags.cmi asmcomp/asmpackager.cmi \ + asmcomp/asmlink.cmi asmcomp/asmlibrarian.cmi asmcomp/arch.cmo \ + driver/optmain.cmi driver/optmain.cmx : utils/warnings.cmx asmcomp/printmach.cmx \ - driver/opterrors.cmx driver/optcompile.cmx utils/misc.cmx \ - driver/main_args.cmx parsing/location.cmx utils/config.cmx \ - driver/compmisc.cmx driver/compenv.cmx utils/clflags.cmx \ - asmcomp/asmpackager.cmx asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx \ - asmcomp/arch.cmx driver/optmain.cmi -driver/pparse.cmo : utils/misc.cmi parsing/location.cmi utils/clflags.cmi \ - utils/ccomp.cmi driver/pparse.cmi -driver/pparse.cmx : utils/misc.cmx parsing/location.cmx utils/clflags.cmx \ - utils/ccomp.cmx driver/pparse.cmi + driver/optcompile.cmx utils/misc.cmx driver/main_args.cmx \ + parsing/location.cmx utils/config.cmx driver/compmisc.cmx \ + driver/compenv.cmx utils/clflags.cmx asmcomp/asmpackager.cmx \ + asmcomp/asmlink.cmx asmcomp/asmlibrarian.cmx asmcomp/arch.cmx \ + driver/optmain.cmi +driver/pparse.cmo : parsing/parsetree.cmi parsing/parse.cmi utils/misc.cmi \ + parsing/location.cmi utils/config.cmi utils/clflags.cmi utils/ccomp.cmi \ + parsing/ast_mapper.cmi parsing/ast_helper.cmi driver/pparse.cmi +driver/pparse.cmx : parsing/parsetree.cmi parsing/parse.cmx utils/misc.cmx \ + parsing/location.cmx utils/config.cmx utils/clflags.cmx utils/ccomp.cmx \ + parsing/ast_mapper.cmx parsing/ast_helper.cmx driver/pparse.cmi toplevel/genprintval.cmi : typing/types.cmi typing/path.cmi \ typing/outcometree.cmi typing/env.cmi toplevel/opttopdirs.cmi : parsing/longident.cmi @@ -958,9 +975,9 @@ toplevel/opttoploop.cmo : utils/warnings.cmi typing/types.cmi \ typing/printtyp.cmi bytecomp/printlambda.cmi parsing/printast.cmi \ typing/predef.cmi parsing/pprintast.cmi typing/path.cmi \ parsing/parsetree.cmi parsing/parse.cmi typing/outcometree.cmi \ - driver/opterrors.cmi typing/oprint.cmi utils/misc.cmi \ - parsing/longident.cmi parsing/location.cmi parsing/lexer.cmi \ - typing/ident.cmi toplevel/genprintval.cmi typing/env.cmi utils/config.cmi \ + typing/oprint.cmi utils/misc.cmi parsing/longident.cmi \ + parsing/location.cmi parsing/lexer.cmi typing/ident.cmi \ + toplevel/genprintval.cmi typing/env.cmi utils/config.cmi \ driver/compmisc.cmi asmcomp/compilenv.cmi utils/clflags.cmi \ typing/btype.cmi asmcomp/asmlink.cmi asmcomp/asmgen.cmi \ toplevel/opttoploop.cmi @@ -970,34 +987,38 @@ toplevel/opttoploop.cmx : utils/warnings.cmx typing/types.cmx \ typing/printtyp.cmx bytecomp/printlambda.cmx parsing/printast.cmx \ typing/predef.cmx parsing/pprintast.cmx typing/path.cmx \ parsing/parsetree.cmi parsing/parse.cmx typing/outcometree.cmi \ - driver/opterrors.cmx typing/oprint.cmx utils/misc.cmx \ - parsing/longident.cmx parsing/location.cmx parsing/lexer.cmx \ - typing/ident.cmx toplevel/genprintval.cmx typing/env.cmx utils/config.cmx \ + typing/oprint.cmx utils/misc.cmx parsing/longident.cmx \ + parsing/location.cmx parsing/lexer.cmx typing/ident.cmx \ + toplevel/genprintval.cmx typing/env.cmx utils/config.cmx \ driver/compmisc.cmx asmcomp/compilenv.cmx utils/clflags.cmx \ typing/btype.cmx asmcomp/asmlink.cmx asmcomp/asmgen.cmx \ toplevel/opttoploop.cmi toplevel/opttopmain.cmo : utils/warnings.cmi asmcomp/printmach.cmi \ - toplevel/opttoploop.cmi toplevel/opttopdirs.cmi driver/opterrors.cmi \ - utils/misc.cmi driver/main_args.cmi parsing/location.cmi utils/config.cmi \ + toplevel/opttoploop.cmi toplevel/opttopdirs.cmi utils/misc.cmi \ + driver/main_args.cmi parsing/location.cmi utils/config.cmi \ driver/compenv.cmi utils/clflags.cmi toplevel/opttopmain.cmi toplevel/opttopmain.cmx : utils/warnings.cmx asmcomp/printmach.cmx \ - toplevel/opttoploop.cmx toplevel/opttopdirs.cmx driver/opterrors.cmx \ - utils/misc.cmx driver/main_args.cmx parsing/location.cmx utils/config.cmx \ + toplevel/opttoploop.cmx toplevel/opttopdirs.cmx utils/misc.cmx \ + driver/main_args.cmx parsing/location.cmx utils/config.cmx \ driver/compenv.cmx utils/clflags.cmx toplevel/opttopmain.cmi toplevel/opttopstart.cmo : toplevel/opttopmain.cmi toplevel/opttopstart.cmx : toplevel/opttopmain.cmx -toplevel/topdirs.cmo : utils/warnings.cmi typing/types.cmi \ - toplevel/trace.cmi toplevel/toploop.cmi bytecomp/symtable.cmi \ - typing/printtyp.cmi typing/path.cmi bytecomp/opcodes.cmo utils/misc.cmi \ - bytecomp/meta.cmi parsing/longident.cmi typing/ident.cmi typing/env.cmi \ - bytecomp/dll.cmi typing/ctype.cmi utils/consistbl.cmi utils/config.cmi \ - bytecomp/cmo_format.cmi utils/clflags.cmi toplevel/topdirs.cmi -toplevel/topdirs.cmx : utils/warnings.cmx typing/types.cmx \ - toplevel/trace.cmx toplevel/toploop.cmx bytecomp/symtable.cmx \ - typing/printtyp.cmx typing/path.cmx bytecomp/opcodes.cmx utils/misc.cmx \ - bytecomp/meta.cmx parsing/longident.cmx typing/ident.cmx typing/env.cmx \ - bytecomp/dll.cmx typing/ctype.cmx utils/consistbl.cmx utils/config.cmx \ - bytecomp/cmo_format.cmi utils/clflags.cmx toplevel/topdirs.cmi +toplevel/topdirs.cmo : utils/warnings.cmi typing/typetexp.cmi \ + typing/types.cmi toplevel/trace.cmi toplevel/toploop.cmi \ + bytecomp/symtable.cmi typing/printtyp.cmi typing/predef.cmi \ + typing/path.cmi bytecomp/opcodes.cmo utils/misc.cmi bytecomp/meta.cmi \ + parsing/longident.cmi parsing/location.cmi typing/ident.cmi \ + typing/env.cmi bytecomp/dll.cmi typing/ctype.cmi utils/consistbl.cmi \ + utils/config.cmi bytecomp/cmo_format.cmi utils/clflags.cmi \ + parsing/asttypes.cmi toplevel/topdirs.cmi +toplevel/topdirs.cmx : utils/warnings.cmx typing/typetexp.cmx \ + typing/types.cmx toplevel/trace.cmx toplevel/toploop.cmx \ + bytecomp/symtable.cmx typing/printtyp.cmx typing/predef.cmx \ + typing/path.cmx bytecomp/opcodes.cmx utils/misc.cmx bytecomp/meta.cmx \ + parsing/longident.cmx parsing/location.cmx typing/ident.cmx \ + typing/env.cmx bytecomp/dll.cmx typing/ctype.cmx utils/consistbl.cmx \ + utils/config.cmx bytecomp/cmo_format.cmi utils/clflags.cmx \ + parsing/asttypes.cmi toplevel/topdirs.cmi toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ typing/typemod.cmi typing/typedtree.cmi typing/typecore.cmi \ bytecomp/translmod.cmi bytecomp/symtable.cmi bytecomp/simplif.cmi \ @@ -1007,10 +1028,11 @@ toplevel/toploop.cmo : utils/warnings.cmi typing/types.cmi \ parsing/parsetree.cmi parsing/parse.cmi typing/outcometree.cmi \ typing/oprint.cmi utils/misc.cmi bytecomp/meta.cmi parsing/longident.cmi \ parsing/location.cmi parsing/lexer.cmi typing/includemod.cmi \ - typing/ident.cmi toplevel/genprintval.cmi driver/errors.cmi \ - typing/env.cmi bytecomp/emitcode.cmi bytecomp/dll.cmi utils/consistbl.cmi \ + typing/ident.cmi toplevel/genprintval.cmi typing/env.cmi \ + bytecomp/emitcode.cmi bytecomp/dll.cmi utils/consistbl.cmi \ utils/config.cmi driver/compmisc.cmi utils/clflags.cmi \ - bytecomp/bytegen.cmi typing/btype.cmi toplevel/toploop.cmi + bytecomp/bytegen.cmi typing/btype.cmi parsing/ast_helper.cmi \ + toplevel/toploop.cmi toplevel/toploop.cmx : utils/warnings.cmx typing/types.cmx \ typing/typemod.cmx typing/typedtree.cmx typing/typecore.cmx \ bytecomp/translmod.cmx bytecomp/symtable.cmx bytecomp/simplif.cmx \ @@ -1020,18 +1042,19 @@ toplevel/toploop.cmx : utils/warnings.cmx typing/types.cmx \ parsing/parsetree.cmi parsing/parse.cmx typing/outcometree.cmi \ typing/oprint.cmx utils/misc.cmx bytecomp/meta.cmx parsing/longident.cmx \ parsing/location.cmx parsing/lexer.cmx typing/includemod.cmx \ - typing/ident.cmx toplevel/genprintval.cmx driver/errors.cmx \ - typing/env.cmx bytecomp/emitcode.cmx bytecomp/dll.cmx utils/consistbl.cmx \ + typing/ident.cmx toplevel/genprintval.cmx typing/env.cmx \ + bytecomp/emitcode.cmx bytecomp/dll.cmx utils/consistbl.cmx \ utils/config.cmx driver/compmisc.cmx utils/clflags.cmx \ - bytecomp/bytegen.cmx typing/btype.cmx toplevel/toploop.cmi + bytecomp/bytegen.cmx typing/btype.cmx parsing/ast_helper.cmx \ + toplevel/toploop.cmi toplevel/topmain.cmo : utils/warnings.cmi toplevel/toploop.cmi \ toplevel/topdirs.cmi utils/misc.cmi driver/main_args.cmi \ - parsing/location.cmi driver/errors.cmi utils/config.cmi \ - driver/compenv.cmi utils/clflags.cmi toplevel/topmain.cmi + parsing/location.cmi utils/config.cmi driver/compenv.cmi \ + utils/clflags.cmi toplevel/topmain.cmi toplevel/topmain.cmx : utils/warnings.cmx toplevel/toploop.cmx \ toplevel/topdirs.cmx utils/misc.cmx driver/main_args.cmx \ - parsing/location.cmx driver/errors.cmx utils/config.cmx \ - driver/compenv.cmx utils/clflags.cmx toplevel/topmain.cmi + parsing/location.cmx utils/config.cmx driver/compenv.cmx \ + utils/clflags.cmx toplevel/topmain.cmi toplevel/topstart.cmo : toplevel/topmain.cmi toplevel/topstart.cmx : toplevel/topmain.cmx toplevel/trace.cmo : typing/types.cmi toplevel/toploop.cmi \ diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d36195a2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2758 @@ + +# / +/*.o +/*.a +/*.so +/*.obj +/*.lib +/*.dll +/*.cm[ioxat] +/*.cmx[as] +/*.cmti +/*.annot +/*.result +/*.byte +/*.native +/program +/*.exe +/*.exe.manifest +/.depend +/.depend.nt +/.DS_Store +/configure +/ocamlc +/ocamlc.opt +/expunge +/ocaml +/ocamlopt +/ocamlopt.opt +/ocamlcomp.sh +/ocamlcompopt.sh +/package-macosx +/ocamlnat + +# /asmcomp/ +/asmcomp/*.o +/asmcomp/*.a +/asmcomp/*.so +/asmcomp/*.obj +/asmcomp/*.lib +/asmcomp/*.dll +/asmcomp/*.cm[ioxat] +/asmcomp/*.cmx[as] +/asmcomp/*.cmti +/asmcomp/*.annot +/asmcomp/*.result +/asmcomp/*.byte +/asmcomp/*.native +/asmcomp/program +/asmcomp/*.exe +/asmcomp/*.exe.manifest +/asmcomp/.depend +/asmcomp/.depend.nt +/asmcomp/.DS_Store +/asmcomp/emit.ml +/asmcomp/arch.ml +/asmcomp/proc.ml +/asmcomp/selection.ml +/asmcomp/reload.ml +/asmcomp/scheduling.ml +/asmcomp/CSE.ml + +# /asmcomp/amd64/ +/asmcomp/amd64/*.o +/asmcomp/amd64/*.a +/asmcomp/amd64/*.so +/asmcomp/amd64/*.obj +/asmcomp/amd64/*.cm[ioxat] +/asmcomp/amd64/*.cmx[as] +/asmcomp/amd64/*.cmti +/asmcomp/amd64/*.annot +/asmcomp/amd64/*.result +/asmcomp/amd64/*.byte +/asmcomp/amd64/*.native +/asmcomp/amd64/program +/asmcomp/amd64/program.exe +/asmcomp/amd64/.depend +/asmcomp/amd64/.depend.nt +/asmcomp/amd64/.DS_Store + +# /asmrun/ +/asmrun/*.o +/asmrun/*.a +/asmrun/*.so +/asmrun/*.obj +/asmrun/*.lib +/asmrun/*.dll +/asmrun/*.cm[ioxat] +/asmrun/*.cmx[as] +/asmrun/*.cmti +/asmrun/*.annot +/asmrun/*.result +/asmrun/*.byte +/asmrun/*.native +/asmrun/program +/asmrun/*.exe +/asmrun/.depend +/asmrun/.depend.nt +/asmrun/.DS_Store +/asmrun/*.p.c +/asmrun/*.d.c +/asmrun/libasmrun.a +/asmrun/libasmrunp.a +/asmrun/main.c +/asmrun/misc.c +/asmrun/freelist.c +/asmrun/major_gc.c +/asmrun/minor_gc.c +/asmrun/memory.c +/asmrun/alloc.c +/asmrun/array.c +/asmrun/compare.c +/asmrun/ints.c +/asmrun/floats.c +/asmrun/str.c +/asmrun/io.c +/asmrun/extern.c +/asmrun/intern.c +/asmrun/hash.c +/asmrun/sys.c +/asmrun/parsing.c +/asmrun/gc_ctrl.c +/asmrun/terminfo.c +/asmrun/md5.c +/asmrun/obj.c +/asmrun/lexing.c +/asmrun/printexc.c +/asmrun/callback.c +/asmrun/weak.c +/asmrun/compact.c +/asmrun/finalise.c +/asmrun/custom.c +/asmrun/meta.c +/asmrun/globroots.c +/asmrun/unix.c +/asmrun/dynlink.c +/asmrun/signals.c +/asmrun/debugger.c +/asmrun/.depend.nt + +# /boot/ +/boot/*.o +/boot/*.a +/boot/*.so +/boot/*.obj +/boot/*.lib +/boot/*.dll +/boot/*.cm[ioxat] +/boot/*.cmx[as] +/boot/*.cmti +/boot/*.annot +/boot/*.result +/boot/*.byte +/boot/*.native +/boot/program +/boot/*.exe +/boot/*.exe.manifest +/boot/.depend +/boot/.depend.nt +/boot/.DS_Store +/boot/Saved +/boot/ocamlrun +/boot/ocamlrun.exe +/boot/ocamlyacc +/boot/ocamlyacc.exe +/boot/camlheader + +# /bytecomp/ +/bytecomp/*.o +/bytecomp/*.a +/bytecomp/*.so +/bytecomp/*.obj +/bytecomp/*.lib +/bytecomp/*.dll +/bytecomp/*.cm[ioxat] +/bytecomp/*.cmx[as] +/bytecomp/*.cmti +/bytecomp/*.annot +/bytecomp/*.result +/bytecomp/*.byte +/bytecomp/*.native +/bytecomp/program +/bytecomp/*.exe +/bytecomp/.depend +/bytecomp/.depend.nt +/bytecomp/.DS_Store +/bytecomp/runtimedef.ml +/bytecomp/opcodes.ml + +# /byterun/ +/byterun/*.o +/byterun/*.a +/byterun/*.so +/byterun/*.obj +/byterun/*.cm[ioxa] +/byterun/*.cmx[as] +/byterun/*.annot +/byterun/*.result +/byterun/*.byte +/byterun/*.native +/byterun/program +/byterun/program.exe +/byterun/.depend +/byterun/.depend.nt +/byterun/.DS_Store +/byterun/jumptbl.h +/byterun/primitives +/byterun/prims.c +/byterun/opnames.h +/byterun/version.h +/byterun/ocamlrun +/byterun/ocamlrun.exe +/byterun/ocamlrund +/byterun/ocamlrund.exe +/byterun/ld.conf +/byterun/interp.a.lst +/byterun/*.[sd]obj +/byterun/*.lib +/byterun/.gdb_history +/byterun/*.d.c +/byterun/*.pic.c + +# /compilerlibs/ +/compilerlibs/* + +# /config/ +/config/*.o +/config/*.a +/config/*.so +/config/*.obj +/config/*.lib +/config/*.dll +/config/*.cm[ioxat] +/config/*.cmx[as] +/config/*.cmti +/config/*.annot +/config/*.result +/config/*.byte +/config/*.native +/config/program +/config/*.exe +/config/*.exe.manifest +/config/.depend +/config/.depend.nt +/config/.DS_Store +/config/m.h +/config/s.h +/config/Makefile + +# /config/auto-aux/ +/config/auto-aux/*.o +/config/auto-aux/*.a +/config/auto-aux/*.so +/config/auto-aux/*.obj +/config/auto-aux/*.cm[ioxa] +/config/auto-aux/*.cmx[as] +/config/auto-aux/*.annot +/config/auto-aux/*.result +/config/auto-aux/*.byte +/config/auto-aux/*.native +/config/auto-aux/program +/config/auto-aux/.depend +/config/auto-aux/.depend.nt +/config/auto-aux/.DS_Store +/config/auto-aux/camlp4_config.ml + +# /config/gnu/ + +# /debugger/ +/debugger/*.o +/debugger/*.a +/debugger/*.so +/debugger/*.obj +/debugger/*.cm[ioxa] +/debugger/*.cmx[as] +/debugger/*.annot +/debugger/*.result +/debugger/*.byte +/debugger/*.native +/debugger/program +/debugger/program.exe +/debugger/.depend +/debugger/.depend.nt +/debugger/.DS_Store +/debugger/lexer.ml +/debugger/parser.ml +/debugger/parser.mli +/debugger/ocamldebug +/debugger/ocamldebug.exe +/debugger/dynlink.ml +/debugger/dynlink.mli + +# /driver/ +/driver/*.o +/driver/*.a +/driver/*.so +/driver/*.obj +/driver/*.lib +/driver/*.dll +/driver/*.cm[ioxat] +/driver/*.cmx[as] +/driver/*.cmti +/driver/*.annot +/driver/*.result +/driver/*.byte +/driver/*.native +/driver/program +/driver/*.exe +/driver/*.exe.manifest +/driver/.depend +/driver/.depend.nt +/driver/.DS_Store + +# /emacs/ +/emacs/*.o +/emacs/*.a +/emacs/*.so +/emacs/*.obj +/emacs/*.lib +/emacs/*.dll +/emacs/*.cm[ioxat] +/emacs/*.cmx[as] +/emacs/*.cmti +/emacs/*.annot +/emacs/*.result +/emacs/*.byte +/emacs/*.native +/emacs/program +/emacs/*.exe +/emacs/*.exe.manifest +/emacs/.depend +/emacs/.depend.nt +/emacs/.DS_Store +/emacs/ocamltags +/emacs/*.elc + +# /experimental/ + +# /experimental/garrigue/ +/experimental/garrigue/*.out +/experimental/garrigue/*.out2 + +# /lex/ +/lex/*.o +/lex/*.a +/lex/*.so +/lex/*.obj +/lex/*.lib +/lex/*.dll +/lex/*.cm[ioxat] +/lex/*.cmx[as] +/lex/*.cmti +/lex/*.annot +/lex/*.result +/lex/*.byte +/lex/*.native +/lex/program +/lex/*.exe +/lex/*.exe.manifest +/lex/.depend +/lex/.depend.nt +/lex/.DS_Store +/lex/parser.ml +/lex/parser.mli +/lex/lexer.ml +/lex/ocamllex +/lex/ocamllex.opt +/lex/parser.output + +# /ocamlbuild/ +/ocamlbuild/*.o +/ocamlbuild/*.a +/ocamlbuild/*.so +/ocamlbuild/*.obj +/ocamlbuild/*.lib +/ocamlbuild/*.dll +/ocamlbuild/*.cm[ioxat] +/ocamlbuild/*.cmx[as] +/ocamlbuild/*.cmti +/ocamlbuild/*.annot +/ocamlbuild/*.byte +/ocamlbuild/*.native +/ocamlbuild/ocamlbuild_config.ml +/ocamlbuild/lexers.ml +/ocamlbuild/glob_lexer.ml + +# /ocamldoc/ +/ocamldoc/*.o +/ocamldoc/*.a +/ocamldoc/*.so +/ocamldoc/*.obj +/ocamldoc/*.lib +/ocamldoc/*.dll +/ocamldoc/*.cm[ioxat] +/ocamldoc/*.cmx[as] +/ocamldoc/*.cmti +/ocamldoc/*.annot +/ocamldoc/*.result +/ocamldoc/*.byte +/ocamldoc/*.native +/ocamldoc/program +/ocamldoc/*.exe +/ocamldoc/.depend +/ocamldoc/.depend.nt +/ocamldoc/.DS_Store +/ocamldoc/ocamldoc +/ocamldoc/ocamldoc.opt +/ocamldoc/odoc_crc.ml +/ocamldoc/odoc_lexer.ml +/ocamldoc/odoc_ocamlhtml.ml +/ocamldoc/odoc_parser.ml +/ocamldoc/odoc_parser.mli +/ocamldoc/odoc_see_lexer.ml +/ocamldoc/odoc_text_lexer.ml +/ocamldoc/odoc_text_parser.ml +/ocamldoc/odoc_text_parser.mli +/ocamldoc/stdlib_man +/ocamldoc/*.output +/ocamldoc/test_stdlib +/ocamldoc/test_latex +/ocamldoc/test + +# /ocamldoc/generators/ +/ocamldoc/generators/*.o +/ocamldoc/generators/*.a +/ocamldoc/generators/*.so +/ocamldoc/generators/*.obj +/ocamldoc/generators/*.lib +/ocamldoc/generators/*.dll +/ocamldoc/generators/*.cm[ioxat] +/ocamldoc/generators/*.cmx[as] +/ocamldoc/generators/*.cmti +/ocamldoc/generators/*.annot +/ocamldoc/generators/*.result +/ocamldoc/generators/*.byte +/ocamldoc/generators/*.native +/ocamldoc/generators/program +/ocamldoc/generators/*.exe +/ocamldoc/generators/*.exe.manifest +/ocamldoc/generators/.depend +/ocamldoc/generators/.depend.nt +/ocamldoc/generators/.DS_Store + +# /otherlibs/ +/otherlibs/.depend +/otherlibs/configure +/otherlibs/ocamlc +/otherlibs/ocamlc.opt +/otherlibs/expunge +/otherlibs/ocaml +/otherlibs/ocamlopt +/otherlibs/ocamlopt.opt +/otherlibs/ocamlcomp.sh +/otherlibs/ocamlcompopt.sh +/otherlibs/package-macosx +/otherlibs/.DS_Store +/otherlibs/*.annot +/otherlibs/_boot_log1 +/otherlibs/_boot_log2 +/otherlibs/_build +/otherlibs/_log +/otherlibs/myocamlbuild_config.ml +/otherlibs/ocamlnat +/otherlibs/*.cm* +/otherlibs/*.o + +# /otherlibs/bigarray/ +/otherlibs/bigarray/*.o +/otherlibs/bigarray/*.a +/otherlibs/bigarray/*.so +/otherlibs/bigarray/*.obj +/otherlibs/bigarray/*.lib +/otherlibs/bigarray/*.dll +/otherlibs/bigarray/*.cm[ioxat] +/otherlibs/bigarray/*.cmx[as] +/otherlibs/bigarray/*.cmti +/otherlibs/bigarray/*.annot +/otherlibs/bigarray/*.result +/otherlibs/bigarray/*.byte +/otherlibs/bigarray/*.native +/otherlibs/bigarray/program +/otherlibs/bigarray/*.exe +/otherlibs/bigarray/.depend +/otherlibs/bigarray/.depend.nt +/otherlibs/bigarray/.DS_Store + +# /otherlibs/dynlink/ +/otherlibs/dynlink/*.o +/otherlibs/dynlink/*.a +/otherlibs/dynlink/*.so +/otherlibs/dynlink/*.obj +/otherlibs/dynlink/*.lib +/otherlibs/dynlink/*.dll +/otherlibs/dynlink/*.cm[ioxat] +/otherlibs/dynlink/*.cmx[as] +/otherlibs/dynlink/*.cmti +/otherlibs/dynlink/*.annot +/otherlibs/dynlink/*.result +/otherlibs/dynlink/*.byte +/otherlibs/dynlink/*.native +/otherlibs/dynlink/program +/otherlibs/dynlink/*.exe +/otherlibs/dynlink/.depend +/otherlibs/dynlink/.depend.nt +/otherlibs/dynlink/.DS_Store +/otherlibs/dynlink/extract_crc + +# /otherlibs/graph/ +/otherlibs/graph/*.o +/otherlibs/graph/*.a +/otherlibs/graph/*.so +/otherlibs/graph/*.obj +/otherlibs/graph/*.lib +/otherlibs/graph/*.dll +/otherlibs/graph/*.cm[ioxat] +/otherlibs/graph/*.cmx[as] +/otherlibs/graph/*.cmti +/otherlibs/graph/*.annot +/otherlibs/graph/*.result +/otherlibs/graph/*.byte +/otherlibs/graph/*.native +/otherlibs/graph/program +/otherlibs/graph/*.exe +/otherlibs/graph/*.exe.manifest +/otherlibs/graph/.depend +/otherlibs/graph/.depend.nt +/otherlibs/graph/.DS_Store + +# /otherlibs/num/ +/otherlibs/num/*.o +/otherlibs/num/*.a +/otherlibs/num/*.so +/otherlibs/num/*.obj +/otherlibs/num/*.lib +/otherlibs/num/*.dll +/otherlibs/num/*.cm[ioxat] +/otherlibs/num/*.cmx[as] +/otherlibs/num/*.cmti +/otherlibs/num/*.annot +/otherlibs/num/*.result +/otherlibs/num/*.byte +/otherlibs/num/*.native +/otherlibs/num/program +/otherlibs/num/*.exe +/otherlibs/num/.depend +/otherlibs/num/.depend.nt +/otherlibs/num/.DS_Store + +# /otherlibs/str/ +/otherlibs/str/*.o +/otherlibs/str/*.a +/otherlibs/str/*.so +/otherlibs/str/*.obj +/otherlibs/str/*.lib +/otherlibs/str/*.dll +/otherlibs/str/*.cm[ioxat] +/otherlibs/str/*.cmx[as] +/otherlibs/str/*.cmti +/otherlibs/str/*.annot +/otherlibs/str/*.result +/otherlibs/str/*.byte +/otherlibs/str/*.native +/otherlibs/str/program +/otherlibs/str/*.exe +/otherlibs/str/.depend +/otherlibs/str/.depend.nt +/otherlibs/str/.DS_Store + +# /otherlibs/systhreads/ +/otherlibs/systhreads/*.o +/otherlibs/systhreads/*.a +/otherlibs/systhreads/*.so +/otherlibs/systhreads/*.obj +/otherlibs/systhreads/*.lib +/otherlibs/systhreads/*.dll +/otherlibs/systhreads/*.cm[ioxat] +/otherlibs/systhreads/*.cmx[as] +/otherlibs/systhreads/*.cmti +/otherlibs/systhreads/*.annot +/otherlibs/systhreads/*.result +/otherlibs/systhreads/*.byte +/otherlibs/systhreads/*.native +/otherlibs/systhreads/program +/otherlibs/systhreads/*.exe +/otherlibs/systhreads/.depend +/otherlibs/systhreads/.depend.nt +/otherlibs/systhreads/.DS_Store +/otherlibs/systhreads/thread.ml + +# /otherlibs/threads/ +/otherlibs/threads/*.o +/otherlibs/threads/*.a +/otherlibs/threads/*.so +/otherlibs/threads/*.obj +/otherlibs/threads/*.lib +/otherlibs/threads/*.dll +/otherlibs/threads/*.cm[ioxat] +/otherlibs/threads/*.cmx[as] +/otherlibs/threads/*.cmti +/otherlibs/threads/*.annot +/otherlibs/threads/*.result +/otherlibs/threads/*.byte +/otherlibs/threads/*.native +/otherlibs/threads/program +/otherlibs/threads/*.exe +/otherlibs/threads/*.exe.manifest +/otherlibs/threads/.depend +/otherlibs/threads/.depend.nt +/otherlibs/threads/.DS_Store +/otherlibs/threads/marshal.mli +/otherlibs/threads/pervasives.mli +/otherlibs/threads/unix.mli + +# /otherlibs/unix/ +/otherlibs/unix/*.o +/otherlibs/unix/*.a +/otherlibs/unix/*.so +/otherlibs/unix/*.obj +/otherlibs/unix/*.lib +/otherlibs/unix/*.dll +/otherlibs/unix/*.cm[ioxat] +/otherlibs/unix/*.cmx[as] +/otherlibs/unix/*.cmti +/otherlibs/unix/*.annot +/otherlibs/unix/*.result +/otherlibs/unix/*.byte +/otherlibs/unix/*.native +/otherlibs/unix/program +/otherlibs/unix/*.exe +/otherlibs/unix/*.exe.manifest +/otherlibs/unix/.depend +/otherlibs/unix/.depend.nt +/otherlibs/unix/.DS_Store + +# /otherlibs/win32graph/ +/otherlibs/win32graph/*.o +/otherlibs/win32graph/*.a +/otherlibs/win32graph/*.so +/otherlibs/win32graph/*.obj +/otherlibs/win32graph/*.lib +/otherlibs/win32graph/*.dll +/otherlibs/win32graph/*.cm[ioxat] +/otherlibs/win32graph/*.cmx[as] +/otherlibs/win32graph/*.cmti +/otherlibs/win32graph/*.annot +/otherlibs/win32graph/*.result +/otherlibs/win32graph/*.byte +/otherlibs/win32graph/*.native +/otherlibs/win32graph/program +/otherlibs/win32graph/*.exe +/otherlibs/win32graph/.depend +/otherlibs/win32graph/.depend.nt +/otherlibs/win32graph/.DS_Store +/otherlibs/win32graph/graphics.ml +/otherlibs/win32graph/graphics.mli + +# /otherlibs/win32unix/ +/otherlibs/win32unix/*.o +/otherlibs/win32unix/*.a +/otherlibs/win32unix/*.so +/otherlibs/win32unix/*.obj +/otherlibs/win32unix/*.lib +/otherlibs/win32unix/*.dll +/otherlibs/win32unix/*.cm[ioxat] +/otherlibs/win32unix/*.cmx[as] +/otherlibs/win32unix/*.cmti +/otherlibs/win32unix/*.annot +/otherlibs/win32unix/*.result +/otherlibs/win32unix/*.byte +/otherlibs/win32unix/*.native +/otherlibs/win32unix/program +/otherlibs/win32unix/*.exe +/otherlibs/win32unix/.depend +/otherlibs/win32unix/.depend.nt +/otherlibs/win32unix/.DS_Store +/otherlibs/win32unix/unixLabels.ml* +/otherlibs/win32unix/unix.mli +/otherlibs/win32unix/unix.lib +/otherlibs/win32unix/access.c +/otherlibs/win32unix/addrofstr.c +/otherlibs/win32unix/chdir.c +/otherlibs/win32unix/chmod.c +/otherlibs/win32unix/cst2constr.c +/otherlibs/win32unix/cstringv.c +/otherlibs/win32unix/envir.c +/otherlibs/win32unix/execv.c +/otherlibs/win32unix/execve.c +/otherlibs/win32unix/execvp.c +/otherlibs/win32unix/exit.c +/otherlibs/win32unix/getaddrinfo.c +/otherlibs/win32unix/getcwd.c +/otherlibs/win32unix/gethost.c +/otherlibs/win32unix/gethostname.c +/otherlibs/win32unix/getnameinfo.c +/otherlibs/win32unix/getproto.c +/otherlibs/win32unix/getserv.c +/otherlibs/win32unix/gmtime.c +/otherlibs/win32unix/putenv.c +/otherlibs/win32unix/rmdir.c +/otherlibs/win32unix/socketaddr.c +/otherlibs/win32unix/strofaddr.c +/otherlibs/win32unix/time.c +/otherlibs/win32unix/unlink.c +/otherlibs/win32unix/utimes.c + +# /parsing/ +/parsing/*.o +/parsing/*.a +/parsing/*.so +/parsing/*.obj +/parsing/*.lib +/parsing/*.dll +/parsing/*.cm[ioxat] +/parsing/*.cmx[as] +/parsing/*.cmti +/parsing/*.annot +/parsing/*.result +/parsing/*.byte +/parsing/*.native +/parsing/program +/parsing/*.exe +/parsing/*.exe.manifest +/parsing/.depend +/parsing/.depend.nt +/parsing/.DS_Store +/parsing/parser.ml +/parsing/parser.mli +/parsing/lexer.ml +/parsing/lexer_tmp.mll +/parsing/lexer_tmp.ml +/parsing/linenum.ml +/parsing/parser.output +/parsing/parser.automaton +/parsing/parser.conflicts + +# /stdlib/ +/stdlib/*.o +/stdlib/*.a +/stdlib/*.so +/stdlib/*.obj +/stdlib/*.lib +/stdlib/*.dll +/stdlib/*.cm[ioxat] +/stdlib/*.cmx[as] +/stdlib/*.cmti +/stdlib/*.annot +/stdlib/*.result +/stdlib/*.byte +/stdlib/*.native +/stdlib/program +/stdlib/*.exe +/stdlib/.depend +/stdlib/.depend.nt +/stdlib/.DS_Store +/stdlib/camlheader +/stdlib/camlheaderd +/stdlib/camlheader_ur +/stdlib/labelled-* +/stdlib/caml +/stdlib/sys.ml + +# /testsuite/ +/testsuite/*.o +/testsuite/*.a +/testsuite/*.so +/testsuite/*.obj +/testsuite/*.cm[ioxa] +/testsuite/*.cmx[as] +/testsuite/*.annot +/testsuite/*.result +/testsuite/*.byte +/testsuite/*.native +/testsuite/program +/testsuite/.depend +/testsuite/.depend.nt +/testsuite/.DS_Store +/testsuite/_log + +# /testsuite/external/ +/testsuite/external/*.o +/testsuite/external/*.a +/testsuite/external/*.so +/testsuite/external/*.obj +/testsuite/external/*.lib +/testsuite/external/*.dll +/testsuite/external/*.cm[ioxat] +/testsuite/external/*.cmx[as] +/testsuite/external/*.cmti +/testsuite/external/*.annot +/testsuite/external/*.result +/testsuite/external/*.byte +/testsuite/external/*.native +/testsuite/external/program +/testsuite/external/*.exe +/testsuite/external/*.exe.manifest +/testsuite/external/.depend +/testsuite/external/.depend.nt +/testsuite/external/.DS_Store +/testsuite/external/*.tar.gz +/testsuite/external/*.tar.bz2 +/testsuite/external/*.tgz +/testsuite/external/*.tbz +/testsuite/external/*.zip +/testsuite/external/log-* +/testsuite/external/log_* +/testsuite/external/advi +/testsuite/external/advi-1.10.2 +/testsuite/external/altergo +/testsuite/external/alt-ergo-0.95.2 +/testsuite/external/binprot +/testsuite/external/bin_prot-109.30.00 +/testsuite/external/bitstring +/testsuite/external/ocaml-bitstring-2.0.3 +/testsuite/external/boomerang +/testsuite/external/boomerang-0.2 +/testsuite/external/calendar +/testsuite/external/calendar-2.03.2 +/testsuite/external/camlimages +/testsuite/external/camlimages-4.0.1 +/testsuite/external/camlpdf +/testsuite/external/camlpdf-0.5 +/testsuite/external/camlp4 +/testsuite/external/camlp4-trunk +/testsuite/external/camlp5 +/testsuite/external/camlp5-git +/testsuite/external/camlzip +/testsuite/external/camlzip-1.04 +/testsuite/external/camomile +/testsuite/external/camomile-0.8.4 +/testsuite/external/comparelib +/testsuite/external/comparelib-109.15.00 +/testsuite/external/compcert +/testsuite/external/compcert-1.13 +/testsuite/external/configfile +/testsuite/external/config-file-1.1 +/testsuite/external/coq +/testsuite/external/coq-8.4pl2 +/testsuite/external/core +/testsuite/external/core-109.37.00 +/testsuite/external/coreextended +/testsuite/external/core_extended-109.36.00 +/testsuite/external/corekernel +/testsuite/external/core_kernel-109.37.00 +/testsuite/external/cryptokit +/testsuite/external/cryptokit-1.6 +/testsuite/external/csv +/testsuite/external/csv-1.3.1 +/testsuite/external/customprintf +/testsuite/external/custom_printf-109.27.00 +/testsuite/external/dbm +/testsuite/external/camldbm-1.0 +/testsuite/external/expect +/testsuite/external/ocaml-expect-0.0.3 +/testsuite/external/extlib +/testsuite/external/extlib-1.5.2 +/testsuite/external/fieldslib +/testsuite/external/fieldslib-109.15.00 +/testsuite/external/fileutils +/testsuite/external/ocaml-fileutils-0.4.4 +/testsuite/external/findlib +/testsuite/external/findlib-1.4.1 +/testsuite/external/framac +/testsuite/external/frama-c-Oxygen-20120901 +/testsuite/external/geneweb +/testsuite/external/gw-6.05-src +/testsuite/external/herelib +/testsuite/external/herelib-109.35.00 +/testsuite/external/hevea +/testsuite/external/hevea-2.09 +/testsuite/external/kaputt +/testsuite/external/kaputt-1.2 +/testsuite/external/lablgtk +/testsuite/external/lablgtk-2.18.0 +/testsuite/external/lablgtkextras +/testsuite/external/lablgtkextras-1.3 +/testsuite/external/lwt +/testsuite/external/lwt-2.4.0 +/testsuite/external/menhir +/testsuite/external/menhir-20120123 +/testsuite/external/mldonkey +/testsuite/external/mldonkey-3.1.2 +/testsuite/external/mysql +/testsuite/external/ocaml-mysql-1.0.4 +/testsuite/external/oasis +/testsuite/external/oasis-0.3.0 +/testsuite/external/obrowser +/testsuite/external/obrowser-1.1.1 +/testsuite/external/ocamlgraph +/testsuite/external/ocamlgraph-1.8.2 +/testsuite/external/ocamlify +/testsuite/external/ocamlify-0.0.1 +/testsuite/external/ocamlmod +/testsuite/external/ocamlmod-0.0.3 +/testsuite/external/ocamlnet +/testsuite/external/ocamlnet-3.5.1 +/testsuite/external/ocamlscript +/testsuite/external/ocamlscript-2.0.3 +/testsuite/external/ocamlssl +/testsuite/external/ocaml-ssl-0.4.6 +/testsuite/external/ocamltext +/testsuite/external/ocaml-text-0.5 +/testsuite/external/ocgi +/testsuite/external/ocgi-0.5 +/testsuite/external/ocsigen +/testsuite/external/ocsigen-bundle-2.2.2 +/testsuite/external/odn +/testsuite/external/ocaml-data-notation-0.0.10 +/testsuite/external/omake +/testsuite/external/omake-0.9.8.6 +/testsuite/external/ounit +/testsuite/external/ounit-1.1.2 +/testsuite/external/paounit +/testsuite/external/pa_ounit-109.36.00 +/testsuite/external/pcre +/testsuite/external/pcre-ocaml-6.2.5 +/testsuite/external/pipebang +/testsuite/external/pipebang-109.28.00 +/testsuite/external/react +/testsuite/external/react-0.9.3 +/testsuite/external/res +/testsuite/external/res-3.2.0 +/testsuite/external/rss +/testsuite/external/ocamlrss-2.2.2 +/testsuite/external/sexplib +/testsuite/external/sexplib-109.15.00 +/testsuite/external/sks +/testsuite/external/sks-1.1.3 +/testsuite/external/sqlite +/testsuite/external/sqlite3-ocaml-2.0.1 +/testsuite/external/textutils +/testsuite/external/textutils-109.36.00 +/testsuite/external/typeconv +/testsuite/external/type_conv-109.28.00 +/testsuite/external/unison +/testsuite/external/unison-2.45.4 +/testsuite/external/variantslib +/testsuite/external/variantslib-109.15.00 +/testsuite/external/vsyml +/testsuite/external/vsyml-2010-04-06 +/testsuite/external/xmllight +/testsuite/external/xml-light.2.3 +/testsuite/external/xmlm +/testsuite/external/xmlm-1.1.0 +/testsuite/external/zarith +/testsuite/external/zarith-1.2.1 +/testsuite/external/zen +/testsuite/external/zen_2.3.2 +/testsuite/external/._ZEN_2.3.2 + +# /testsuite/interactive/ +/testsuite/interactive/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/_log +/testsuite/interactive/*.so +/testsuite/interactive/*.a +/testsuite/interactive/*.result +/testsuite/interactive/*.byte +/testsuite/interactive/*.native +/testsuite/interactive/program +/testsuite/interactive/*.cm* +/testsuite/interactive/*.o + +# /testsuite/interactive/lib-gc/ +/testsuite/interactive/lib-gc/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/lib-gc/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/lib-gc/_log +/testsuite/interactive/lib-gc/*.so +/testsuite/interactive/lib-gc/*.a +/testsuite/interactive/lib-gc/*.result +/testsuite/interactive/lib-gc/*.byte +/testsuite/interactive/lib-gc/*.native +/testsuite/interactive/lib-gc/program +/testsuite/interactive/lib-gc/*.cm* +/testsuite/interactive/lib-gc/*.o + +# /testsuite/interactive/lib-graph/ +/testsuite/interactive/lib-graph/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/lib-graph/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/lib-graph/_log +/testsuite/interactive/lib-graph/*.so +/testsuite/interactive/lib-graph/*.a +/testsuite/interactive/lib-graph/*.result +/testsuite/interactive/lib-graph/*.byte +/testsuite/interactive/lib-graph/*.native +/testsuite/interactive/lib-graph/program +/testsuite/interactive/lib-graph/*.cm* +/testsuite/interactive/lib-graph/*.o + +# /testsuite/interactive/lib-graph-2/ +/testsuite/interactive/lib-graph-2/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/lib-graph-2/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/lib-graph-2/_log +/testsuite/interactive/lib-graph-2/*.so +/testsuite/interactive/lib-graph-2/*.a +/testsuite/interactive/lib-graph-2/*.result +/testsuite/interactive/lib-graph-2/*.byte +/testsuite/interactive/lib-graph-2/*.native +/testsuite/interactive/lib-graph-2/program +/testsuite/interactive/lib-graph-2/*.cm* +/testsuite/interactive/lib-graph-2/*.o + +# /testsuite/interactive/lib-graph-3/ +/testsuite/interactive/lib-graph-3/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/lib-graph-3/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/lib-graph-3/_log +/testsuite/interactive/lib-graph-3/*.so +/testsuite/interactive/lib-graph-3/*.a +/testsuite/interactive/lib-graph-3/*.result +/testsuite/interactive/lib-graph-3/*.byte +/testsuite/interactive/lib-graph-3/*.native +/testsuite/interactive/lib-graph-3/program +/testsuite/interactive/lib-graph-3/*.cm* +/testsuite/interactive/lib-graph-3/*.o + +# /testsuite/interactive/lib-signals/ +/testsuite/interactive/lib-signals/# svn propset -R svn:ignore -F .svnignore . +/testsuite/interactive/lib-signals/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/interactive/lib-signals/_log +/testsuite/interactive/lib-signals/*.so +/testsuite/interactive/lib-signals/*.a +/testsuite/interactive/lib-signals/*.result +/testsuite/interactive/lib-signals/*.byte +/testsuite/interactive/lib-signals/*.native +/testsuite/interactive/lib-signals/program +/testsuite/interactive/lib-signals/*.cm* +/testsuite/interactive/lib-signals/*.o + +# /testsuite/lib/ +/testsuite/lib/*.o +/testsuite/lib/*.a +/testsuite/lib/*.so +/testsuite/lib/*.obj +/testsuite/lib/*.dll +/testsuite/lib/*.cm[ioxat] +/testsuite/lib/*.cmx[as] +/testsuite/lib/*.cmti +/testsuite/lib/*.annot +/testsuite/lib/*.result +/testsuite/lib/*.byte +/testsuite/lib/*.native +/testsuite/lib/program +/testsuite/lib/*.exe +/testsuite/lib/.depend +/testsuite/lib/.depend.nt +/testsuite/lib/.DS_Store + +# /testsuite/makefiles/ +/testsuite/makefiles/# svn propset -R svn:ignore -F .svnignore . +/testsuite/makefiles/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/makefiles/_log +/testsuite/makefiles/*.so +/testsuite/makefiles/*.a +/testsuite/makefiles/*.result +/testsuite/makefiles/*.byte +/testsuite/makefiles/*.native +/testsuite/makefiles/program +/testsuite/makefiles/*.cm* +/testsuite/makefiles/*.o + +# /testsuite/tests/ +/testsuite/tests/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/_log +/testsuite/tests/*.so +/testsuite/tests/*.a +/testsuite/tests/*.result +/testsuite/tests/*.byte +/testsuite/tests/*.native +/testsuite/tests/program +/testsuite/tests/*.cm* +/testsuite/tests/*.o + +# /testsuite/tests/asmcomp/ +/testsuite/tests/asmcomp/*.o +/testsuite/tests/asmcomp/*.a +/testsuite/tests/asmcomp/*.so +/testsuite/tests/asmcomp/*.obj +/testsuite/tests/asmcomp/*.lib +/testsuite/tests/asmcomp/*.dll +/testsuite/tests/asmcomp/*.cm[ioxat] +/testsuite/tests/asmcomp/*.cmx[as] +/testsuite/tests/asmcomp/*.cmti +/testsuite/tests/asmcomp/*.annot +/testsuite/tests/asmcomp/*.result +/testsuite/tests/asmcomp/*.byte +/testsuite/tests/asmcomp/*.native +/testsuite/tests/asmcomp/program +/testsuite/tests/asmcomp/*.exe +/testsuite/tests/asmcomp/*.exe.manifest +/testsuite/tests/asmcomp/.depend +/testsuite/tests/asmcomp/.depend.nt +/testsuite/tests/asmcomp/.DS_Store +/testsuite/tests/asmcomp/codegen +/testsuite/tests/asmcomp/parsecmm.ml +/testsuite/tests/asmcomp/parsecmm.mli +/testsuite/tests/asmcomp/lexcmm.ml +/testsuite/tests/asmcomp/*.s +/testsuite/tests/asmcomp/*.out +/testsuite/tests/asmcomp/*.out.dSYM + +# /testsuite/tests/backtrace/ +/testsuite/tests/backtrace/*.o +/testsuite/tests/backtrace/*.a +/testsuite/tests/backtrace/*.so +/testsuite/tests/backtrace/*.obj +/testsuite/tests/backtrace/*.lib +/testsuite/tests/backtrace/*.dll +/testsuite/tests/backtrace/*.cm[ioxat] +/testsuite/tests/backtrace/*.cmx[as] +/testsuite/tests/backtrace/*.cmti +/testsuite/tests/backtrace/*.annot +/testsuite/tests/backtrace/*.result +/testsuite/tests/backtrace/*.byte +/testsuite/tests/backtrace/*.native +/testsuite/tests/backtrace/program +/testsuite/tests/backtrace/*.exe +/testsuite/tests/backtrace/*.exe.manifest +/testsuite/tests/backtrace/.depend +/testsuite/tests/backtrace/.depend.nt +/testsuite/tests/backtrace/.DS_Store + +# /testsuite/tests/basic/ +/testsuite/tests/basic/*.o +/testsuite/tests/basic/*.a +/testsuite/tests/basic/*.so +/testsuite/tests/basic/*.obj +/testsuite/tests/basic/*.cm[ioxa] +/testsuite/tests/basic/*.cmx[as] +/testsuite/tests/basic/*.annot +/testsuite/tests/basic/*.result +/testsuite/tests/basic/*.byte +/testsuite/tests/basic/*.native +/testsuite/tests/basic/program +/testsuite/tests/basic/program.exe +/testsuite/tests/basic/.depend +/testsuite/tests/basic/.depend.nt +/testsuite/tests/basic/.DS_Store + +# /testsuite/tests/basic-float/ +/testsuite/tests/basic-float/*.o +/testsuite/tests/basic-float/*.a +/testsuite/tests/basic-float/*.so +/testsuite/tests/basic-float/*.obj +/testsuite/tests/basic-float/*.lib +/testsuite/tests/basic-float/*.dll +/testsuite/tests/basic-float/*.cm[ioxat] +/testsuite/tests/basic-float/*.cmx[as] +/testsuite/tests/basic-float/*.cmti +/testsuite/tests/basic-float/*.annot +/testsuite/tests/basic-float/*.result +/testsuite/tests/basic-float/*.byte +/testsuite/tests/basic-float/*.native +/testsuite/tests/basic-float/program +/testsuite/tests/basic-float/*.exe +/testsuite/tests/basic-float/*.exe.manifest +/testsuite/tests/basic-float/.depend +/testsuite/tests/basic-float/.depend.nt +/testsuite/tests/basic-float/.DS_Store + +# /testsuite/tests/basic-io/ +/testsuite/tests/basic-io/*.o +/testsuite/tests/basic-io/*.a +/testsuite/tests/basic-io/*.so +/testsuite/tests/basic-io/*.obj +/testsuite/tests/basic-io/*.lib +/testsuite/tests/basic-io/*.dll +/testsuite/tests/basic-io/*.cm[ioxat] +/testsuite/tests/basic-io/*.cmx[as] +/testsuite/tests/basic-io/*.cmti +/testsuite/tests/basic-io/*.annot +/testsuite/tests/basic-io/*.result +/testsuite/tests/basic-io/*.byte +/testsuite/tests/basic-io/*.native +/testsuite/tests/basic-io/program +/testsuite/tests/basic-io/*.exe +/testsuite/tests/basic-io/*.exe.manifest +/testsuite/tests/basic-io/.depend +/testsuite/tests/basic-io/.depend.nt +/testsuite/tests/basic-io/.DS_Store + +# /testsuite/tests/basic-io-2/ +/testsuite/tests/basic-io-2/*.o +/testsuite/tests/basic-io-2/*.a +/testsuite/tests/basic-io-2/*.so +/testsuite/tests/basic-io-2/*.obj +/testsuite/tests/basic-io-2/*.lib +/testsuite/tests/basic-io-2/*.dll +/testsuite/tests/basic-io-2/*.cm[ioxat] +/testsuite/tests/basic-io-2/*.cmx[as] +/testsuite/tests/basic-io-2/*.cmti +/testsuite/tests/basic-io-2/*.annot +/testsuite/tests/basic-io-2/*.result +/testsuite/tests/basic-io-2/*.byte +/testsuite/tests/basic-io-2/*.native +/testsuite/tests/basic-io-2/program +/testsuite/tests/basic-io-2/*.exe +/testsuite/tests/basic-io-2/*.exe.manifest +/testsuite/tests/basic-io-2/.depend +/testsuite/tests/basic-io-2/.depend.nt +/testsuite/tests/basic-io-2/.DS_Store + +# /testsuite/tests/basic-manyargs/ +/testsuite/tests/basic-manyargs/*.o +/testsuite/tests/basic-manyargs/*.a +/testsuite/tests/basic-manyargs/*.so +/testsuite/tests/basic-manyargs/*.obj +/testsuite/tests/basic-manyargs/*.lib +/testsuite/tests/basic-manyargs/*.dll +/testsuite/tests/basic-manyargs/*.cm[ioxat] +/testsuite/tests/basic-manyargs/*.cmx[as] +/testsuite/tests/basic-manyargs/*.cmti +/testsuite/tests/basic-manyargs/*.annot +/testsuite/tests/basic-manyargs/*.result +/testsuite/tests/basic-manyargs/*.byte +/testsuite/tests/basic-manyargs/*.native +/testsuite/tests/basic-manyargs/program +/testsuite/tests/basic-manyargs/*.exe +/testsuite/tests/basic-manyargs/*.exe.manifest +/testsuite/tests/basic-manyargs/.depend +/testsuite/tests/basic-manyargs/.depend.nt +/testsuite/tests/basic-manyargs/.DS_Store + +# /testsuite/tests/basic-modules/ +/testsuite/tests/basic-modules/*.o +/testsuite/tests/basic-modules/*.a +/testsuite/tests/basic-modules/*.so +/testsuite/tests/basic-modules/*.obj +/testsuite/tests/basic-modules/*.lib +/testsuite/tests/basic-modules/*.dll +/testsuite/tests/basic-modules/*.cm[ioxat] +/testsuite/tests/basic-modules/*.cmx[as] +/testsuite/tests/basic-modules/*.cmti +/testsuite/tests/basic-modules/*.annot +/testsuite/tests/basic-modules/*.result +/testsuite/tests/basic-modules/*.byte +/testsuite/tests/basic-modules/*.native +/testsuite/tests/basic-modules/program +/testsuite/tests/basic-modules/*.exe +/testsuite/tests/basic-modules/*.exe.manifest +/testsuite/tests/basic-modules/.depend +/testsuite/tests/basic-modules/.depend.nt +/testsuite/tests/basic-modules/.DS_Store + +# /testsuite/tests/basic-more/ +/testsuite/tests/basic-more/*.o +/testsuite/tests/basic-more/*.a +/testsuite/tests/basic-more/*.so +/testsuite/tests/basic-more/*.obj +/testsuite/tests/basic-more/*.cm[ioxa] +/testsuite/tests/basic-more/*.cmx[as] +/testsuite/tests/basic-more/*.annot +/testsuite/tests/basic-more/*.result +/testsuite/tests/basic-more/*.byte +/testsuite/tests/basic-more/*.native +/testsuite/tests/basic-more/program +/testsuite/tests/basic-more/program.exe +/testsuite/tests/basic-more/.depend +/testsuite/tests/basic-more/.depend.nt +/testsuite/tests/basic-more/.DS_Store + +# /testsuite/tests/basic-multdef/ +/testsuite/tests/basic-multdef/*.o +/testsuite/tests/basic-multdef/*.a +/testsuite/tests/basic-multdef/*.so +/testsuite/tests/basic-multdef/*.obj +/testsuite/tests/basic-multdef/*.lib +/testsuite/tests/basic-multdef/*.dll +/testsuite/tests/basic-multdef/*.cm[ioxat] +/testsuite/tests/basic-multdef/*.cmx[as] +/testsuite/tests/basic-multdef/*.cmti +/testsuite/tests/basic-multdef/*.annot +/testsuite/tests/basic-multdef/*.result +/testsuite/tests/basic-multdef/*.byte +/testsuite/tests/basic-multdef/*.native +/testsuite/tests/basic-multdef/program +/testsuite/tests/basic-multdef/*.exe +/testsuite/tests/basic-multdef/*.exe.manifest +/testsuite/tests/basic-multdef/.depend +/testsuite/tests/basic-multdef/.depend.nt +/testsuite/tests/basic-multdef/.DS_Store + +# /testsuite/tests/basic-private/ +/testsuite/tests/basic-private/*.o +/testsuite/tests/basic-private/*.a +/testsuite/tests/basic-private/*.so +/testsuite/tests/basic-private/*.obj +/testsuite/tests/basic-private/*.lib +/testsuite/tests/basic-private/*.dll +/testsuite/tests/basic-private/*.cm[ioxat] +/testsuite/tests/basic-private/*.cmx[as] +/testsuite/tests/basic-private/*.cmti +/testsuite/tests/basic-private/*.annot +/testsuite/tests/basic-private/*.result +/testsuite/tests/basic-private/*.byte +/testsuite/tests/basic-private/*.native +/testsuite/tests/basic-private/program +/testsuite/tests/basic-private/*.exe +/testsuite/tests/basic-private/*.exe.manifest +/testsuite/tests/basic-private/.depend +/testsuite/tests/basic-private/.depend.nt +/testsuite/tests/basic-private/.DS_Store + +# /testsuite/tests/callback/ +/testsuite/tests/callback/*.o +/testsuite/tests/callback/*.a +/testsuite/tests/callback/*.so +/testsuite/tests/callback/*.obj +/testsuite/tests/callback/*.cm[ioxa] +/testsuite/tests/callback/*.cmx[as] +/testsuite/tests/callback/*.annot +/testsuite/tests/callback/*.result +/testsuite/tests/callback/*.byte +/testsuite/tests/callback/*.native +/testsuite/tests/callback/program +/testsuite/tests/callback/program.exe +/testsuite/tests/callback/.depend +/testsuite/tests/callback/.depend.nt +/testsuite/tests/callback/.DS_Store + +# /testsuite/tests/embedded/ +/testsuite/tests/embedded/*.o +/testsuite/tests/embedded/*.a +/testsuite/tests/embedded/*.so +/testsuite/tests/embedded/*.obj +/testsuite/tests/embedded/*.lib +/testsuite/tests/embedded/*.dll +/testsuite/tests/embedded/*.cm[ioxat] +/testsuite/tests/embedded/*.cmx[as] +/testsuite/tests/embedded/*.cmti +/testsuite/tests/embedded/*.annot +/testsuite/tests/embedded/*.result +/testsuite/tests/embedded/*.byte +/testsuite/tests/embedded/*.native +/testsuite/tests/embedded/program +/testsuite/tests/embedded/*.exe +/testsuite/tests/embedded/*.exe.manifest +/testsuite/tests/embedded/.depend +/testsuite/tests/embedded/.depend.nt +/testsuite/tests/embedded/.DS_Store +/testsuite/tests/embedded/caml + +# /testsuite/tests/exotic-syntax/ +/testsuite/tests/exotic-syntax/*.o +/testsuite/tests/exotic-syntax/*.a +/testsuite/tests/exotic-syntax/*.so +/testsuite/tests/exotic-syntax/*.obj +/testsuite/tests/exotic-syntax/*.lib +/testsuite/tests/exotic-syntax/*.dll +/testsuite/tests/exotic-syntax/*.cm[ioxat] +/testsuite/tests/exotic-syntax/*.cmx[as] +/testsuite/tests/exotic-syntax/*.cmti +/testsuite/tests/exotic-syntax/*.annot +/testsuite/tests/exotic-syntax/*.result +/testsuite/tests/exotic-syntax/*.byte +/testsuite/tests/exotic-syntax/*.native +/testsuite/tests/exotic-syntax/program +/testsuite/tests/exotic-syntax/*.exe +/testsuite/tests/exotic-syntax/*.exe.manifest +/testsuite/tests/exotic-syntax/.depend +/testsuite/tests/exotic-syntax/.depend.nt +/testsuite/tests/exotic-syntax/.DS_Store + +# /testsuite/tests/formats-transition/ +/testsuite/tests/formats-transition/*.o +/testsuite/tests/formats-transition/*.a +/testsuite/tests/formats-transition/*.so +/testsuite/tests/formats-transition/*.obj +/testsuite/tests/formats-transition/*.lib +/testsuite/tests/formats-transition/*.dll +/testsuite/tests/formats-transition/*.cm[ioxat] +/testsuite/tests/formats-transition/*.cmx[as] +/testsuite/tests/formats-transition/*.cmti +/testsuite/tests/formats-transition/*.annot +/testsuite/tests/formats-transition/*.result +/testsuite/tests/formats-transition/*.byte +/testsuite/tests/formats-transition/*.native +/testsuite/tests/formats-transition/program +/testsuite/tests/formats-transition/*.exe +/testsuite/tests/formats-transition/*.exe.manifest +/testsuite/tests/formats-transition/.depend +/testsuite/tests/formats-transition/.depend.nt +/testsuite/tests/formats-transition/.DS_Store + +# /testsuite/tests/gc-roots/ +/testsuite/tests/gc-roots/*.o +/testsuite/tests/gc-roots/*.a +/testsuite/tests/gc-roots/*.so +/testsuite/tests/gc-roots/*.obj +/testsuite/tests/gc-roots/*.lib +/testsuite/tests/gc-roots/*.dll +/testsuite/tests/gc-roots/*.cm[ioxat] +/testsuite/tests/gc-roots/*.cmx[as] +/testsuite/tests/gc-roots/*.cmti +/testsuite/tests/gc-roots/*.annot +/testsuite/tests/gc-roots/*.result +/testsuite/tests/gc-roots/*.byte +/testsuite/tests/gc-roots/*.native +/testsuite/tests/gc-roots/program +/testsuite/tests/gc-roots/*.exe +/testsuite/tests/gc-roots/*.exe.manifest +/testsuite/tests/gc-roots/.depend +/testsuite/tests/gc-roots/.depend.nt +/testsuite/tests/gc-roots/.DS_Store + +# /testsuite/tests/letrec/ +/testsuite/tests/letrec/*.o +/testsuite/tests/letrec/*.a +/testsuite/tests/letrec/*.so +/testsuite/tests/letrec/*.obj +/testsuite/tests/letrec/*.cm[ioxa] +/testsuite/tests/letrec/*.cmx[as] +/testsuite/tests/letrec/*.annot +/testsuite/tests/letrec/*.result +/testsuite/tests/letrec/*.byte +/testsuite/tests/letrec/*.native +/testsuite/tests/letrec/program +/testsuite/tests/letrec/program.exe +/testsuite/tests/letrec/.depend +/testsuite/tests/letrec/.depend.nt +/testsuite/tests/letrec/.DS_Store + +# /testsuite/tests/lib-bigarray/ +/testsuite/tests/lib-bigarray/*.o +/testsuite/tests/lib-bigarray/*.a +/testsuite/tests/lib-bigarray/*.so +/testsuite/tests/lib-bigarray/*.obj +/testsuite/tests/lib-bigarray/*.lib +/testsuite/tests/lib-bigarray/*.dll +/testsuite/tests/lib-bigarray/*.cm[ioxat] +/testsuite/tests/lib-bigarray/*.cmx[as] +/testsuite/tests/lib-bigarray/*.cmti +/testsuite/tests/lib-bigarray/*.annot +/testsuite/tests/lib-bigarray/*.result +/testsuite/tests/lib-bigarray/*.byte +/testsuite/tests/lib-bigarray/*.native +/testsuite/tests/lib-bigarray/program +/testsuite/tests/lib-bigarray/*.exe +/testsuite/tests/lib-bigarray/*.exe.manifest +/testsuite/tests/lib-bigarray/.depend +/testsuite/tests/lib-bigarray/.depend.nt +/testsuite/tests/lib-bigarray/.DS_Store + +# /testsuite/tests/lib-bigarray-2/ +/testsuite/tests/lib-bigarray-2/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/lib-bigarray-2/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/lib-bigarray-2/_log +/testsuite/tests/lib-bigarray-2/*.so +/testsuite/tests/lib-bigarray-2/*.a +/testsuite/tests/lib-bigarray-2/*.result +/testsuite/tests/lib-bigarray-2/*.byte +/testsuite/tests/lib-bigarray-2/*.native +/testsuite/tests/lib-bigarray-2/program +/testsuite/tests/lib-bigarray-2/*.cm* +/testsuite/tests/lib-bigarray-2/*.o + +# /testsuite/tests/lib-digest/ +/testsuite/tests/lib-digest/*.o +/testsuite/tests/lib-digest/*.a +/testsuite/tests/lib-digest/*.so +/testsuite/tests/lib-digest/*.obj +/testsuite/tests/lib-digest/*.lib +/testsuite/tests/lib-digest/*.dll +/testsuite/tests/lib-digest/*.cm[ioxat] +/testsuite/tests/lib-digest/*.cmx[as] +/testsuite/tests/lib-digest/*.cmti +/testsuite/tests/lib-digest/*.annot +/testsuite/tests/lib-digest/*.result +/testsuite/tests/lib-digest/*.byte +/testsuite/tests/lib-digest/*.native +/testsuite/tests/lib-digest/program +/testsuite/tests/lib-digest/*.exe +/testsuite/tests/lib-digest/*.exe.manifest +/testsuite/tests/lib-digest/.depend +/testsuite/tests/lib-digest/.depend.nt +/testsuite/tests/lib-digest/.DS_Store + +# /testsuite/tests/lib-dynlink-bytecode/ +/testsuite/tests/lib-dynlink-bytecode/*.o +/testsuite/tests/lib-dynlink-bytecode/*.a +/testsuite/tests/lib-dynlink-bytecode/*.so +/testsuite/tests/lib-dynlink-bytecode/*.obj +/testsuite/tests/lib-dynlink-bytecode/*.lib +/testsuite/tests/lib-dynlink-bytecode/*.dll +/testsuite/tests/lib-dynlink-bytecode/*.cm[ioxat] +/testsuite/tests/lib-dynlink-bytecode/*.cmx[as] +/testsuite/tests/lib-dynlink-bytecode/*.cmti +/testsuite/tests/lib-dynlink-bytecode/*.annot +/testsuite/tests/lib-dynlink-bytecode/*.result +/testsuite/tests/lib-dynlink-bytecode/*.byte +/testsuite/tests/lib-dynlink-bytecode/*.native +/testsuite/tests/lib-dynlink-bytecode/program +/testsuite/tests/lib-dynlink-bytecode/*.exe +/testsuite/tests/lib-dynlink-bytecode/*.exe.manifest +/testsuite/tests/lib-dynlink-bytecode/.depend +/testsuite/tests/lib-dynlink-bytecode/.depend.nt +/testsuite/tests/lib-dynlink-bytecode/.DS_Store +/testsuite/tests/lib-dynlink-bytecode/main +/testsuite/tests/lib-dynlink-bytecode/static +/testsuite/tests/lib-dynlink-bytecode/custom +/testsuite/tests/lib-dynlink-bytecode/custom.exe +/testsuite/tests/lib-dynlink-bytecode/marshal.data +/testsuite/tests/lib-dynlink-bytecode/caml + +# /testsuite/tests/lib-dynlink-csharp/ +/testsuite/tests/lib-dynlink-csharp/*.o +/testsuite/tests/lib-dynlink-csharp/*.a +/testsuite/tests/lib-dynlink-csharp/*.so +/testsuite/tests/lib-dynlink-csharp/*.obj +/testsuite/tests/lib-dynlink-csharp/*.lib +/testsuite/tests/lib-dynlink-csharp/*.dll +/testsuite/tests/lib-dynlink-csharp/*.cm[ioxat] +/testsuite/tests/lib-dynlink-csharp/*.cmx[as] +/testsuite/tests/lib-dynlink-csharp/*.cmti +/testsuite/tests/lib-dynlink-csharp/*.annot +/testsuite/tests/lib-dynlink-csharp/*.result +/testsuite/tests/lib-dynlink-csharp/*.byte +/testsuite/tests/lib-dynlink-csharp/*.native +/testsuite/tests/lib-dynlink-csharp/program +/testsuite/tests/lib-dynlink-csharp/*.exe +/testsuite/tests/lib-dynlink-csharp/*.exe.manifest +/testsuite/tests/lib-dynlink-csharp/.depend +/testsuite/tests/lib-dynlink-csharp/.depend.nt +/testsuite/tests/lib-dynlink-csharp/.DS_Store + +# /testsuite/tests/lib-dynlink-native/ +/testsuite/tests/lib-dynlink-native/*.o +/testsuite/tests/lib-dynlink-native/*.a +/testsuite/tests/lib-dynlink-native/*.so +/testsuite/tests/lib-dynlink-native/*.obj +/testsuite/tests/lib-dynlink-native/*.lib +/testsuite/tests/lib-dynlink-native/*.dll +/testsuite/tests/lib-dynlink-native/*.cm[ioxat] +/testsuite/tests/lib-dynlink-native/*.cmx[as] +/testsuite/tests/lib-dynlink-native/*.cmti +/testsuite/tests/lib-dynlink-native/*.annot +/testsuite/tests/lib-dynlink-native/*.result +/testsuite/tests/lib-dynlink-native/*.byte +/testsuite/tests/lib-dynlink-native/*.native +/testsuite/tests/lib-dynlink-native/program +/testsuite/tests/lib-dynlink-native/*.exe +/testsuite/tests/lib-dynlink-native/*.exe.manifest +/testsuite/tests/lib-dynlink-native/.depend +/testsuite/tests/lib-dynlink-native/.depend.nt +/testsuite/tests/lib-dynlink-native/.DS_Store +/testsuite/tests/lib-dynlink-native/mypack.pack.s +/testsuite/tests/lib-dynlink-native/mypack.pack.asm +/testsuite/tests/lib-dynlink-native/result +/testsuite/tests/lib-dynlink-native/main +/testsuite/tests/lib-dynlink-native/main.exe +/testsuite/tests/lib-dynlink-native/marshal.data +/testsuite/tests/lib-dynlink-native/caml + +# /testsuite/tests/lib-dynlink-native/sub/ +/testsuite/tests/lib-dynlink-native/sub/*.o +/testsuite/tests/lib-dynlink-native/sub/*.a +/testsuite/tests/lib-dynlink-native/sub/*.so +/testsuite/tests/lib-dynlink-native/sub/*.obj +/testsuite/tests/lib-dynlink-native/sub/*.lib +/testsuite/tests/lib-dynlink-native/sub/*.dll +/testsuite/tests/lib-dynlink-native/sub/*.cm[ioxat] +/testsuite/tests/lib-dynlink-native/sub/*.cmx[as] +/testsuite/tests/lib-dynlink-native/sub/*.cmti +/testsuite/tests/lib-dynlink-native/sub/*.annot +/testsuite/tests/lib-dynlink-native/sub/*.result +/testsuite/tests/lib-dynlink-native/sub/*.byte +/testsuite/tests/lib-dynlink-native/sub/*.native +/testsuite/tests/lib-dynlink-native/sub/program +/testsuite/tests/lib-dynlink-native/sub/*.exe +/testsuite/tests/lib-dynlink-native/sub/*.exe.manifest +/testsuite/tests/lib-dynlink-native/sub/.depend +/testsuite/tests/lib-dynlink-native/sub/.depend.nt +/testsuite/tests/lib-dynlink-native/sub/.DS_Store + +# /testsuite/tests/lib-format/ +/testsuite/tests/lib-format/*.o +/testsuite/tests/lib-format/*.a +/testsuite/tests/lib-format/*.so +/testsuite/tests/lib-format/*.obj +/testsuite/tests/lib-format/*.lib +/testsuite/tests/lib-format/*.dll +/testsuite/tests/lib-format/*.cm[ioxat] +/testsuite/tests/lib-format/*.cmx[as] +/testsuite/tests/lib-format/*.cmti +/testsuite/tests/lib-format/*.annot +/testsuite/tests/lib-format/*.result +/testsuite/tests/lib-format/*.byte +/testsuite/tests/lib-format/*.native +/testsuite/tests/lib-format/program +/testsuite/tests/lib-format/*.exe +/testsuite/tests/lib-format/*.exe.manifest +/testsuite/tests/lib-format/.depend +/testsuite/tests/lib-format/.depend.nt +/testsuite/tests/lib-format/.DS_Store + +# /testsuite/tests/lib-hashtbl/ +/testsuite/tests/lib-hashtbl/*.o +/testsuite/tests/lib-hashtbl/*.a +/testsuite/tests/lib-hashtbl/*.so +/testsuite/tests/lib-hashtbl/*.obj +/testsuite/tests/lib-hashtbl/*.cm[ioxa] +/testsuite/tests/lib-hashtbl/*.cmx[as] +/testsuite/tests/lib-hashtbl/*.annot +/testsuite/tests/lib-hashtbl/*.result +/testsuite/tests/lib-hashtbl/*.byte +/testsuite/tests/lib-hashtbl/*.native +/testsuite/tests/lib-hashtbl/program +/testsuite/tests/lib-hashtbl/program.exe +/testsuite/tests/lib-hashtbl/.depend +/testsuite/tests/lib-hashtbl/.depend.nt +/testsuite/tests/lib-hashtbl/.DS_Store + +# /testsuite/tests/lib-marshal/ +/testsuite/tests/lib-marshal/*.o +/testsuite/tests/lib-marshal/*.a +/testsuite/tests/lib-marshal/*.so +/testsuite/tests/lib-marshal/*.obj +/testsuite/tests/lib-marshal/*.lib +/testsuite/tests/lib-marshal/*.dll +/testsuite/tests/lib-marshal/*.cm[ioxat] +/testsuite/tests/lib-marshal/*.cmx[as] +/testsuite/tests/lib-marshal/*.cmti +/testsuite/tests/lib-marshal/*.annot +/testsuite/tests/lib-marshal/*.result +/testsuite/tests/lib-marshal/*.byte +/testsuite/tests/lib-marshal/*.native +/testsuite/tests/lib-marshal/program +/testsuite/tests/lib-marshal/*.exe +/testsuite/tests/lib-marshal/*.exe.manifest +/testsuite/tests/lib-marshal/.depend +/testsuite/tests/lib-marshal/.depend.nt +/testsuite/tests/lib-marshal/.DS_Store + +# /testsuite/tests/lib-num/ +/testsuite/tests/lib-num/*.o +/testsuite/tests/lib-num/*.a +/testsuite/tests/lib-num/*.so +/testsuite/tests/lib-num/*.obj +/testsuite/tests/lib-num/*.lib +/testsuite/tests/lib-num/*.dll +/testsuite/tests/lib-num/*.cm[ioxat] +/testsuite/tests/lib-num/*.cmx[as] +/testsuite/tests/lib-num/*.cmti +/testsuite/tests/lib-num/*.annot +/testsuite/tests/lib-num/*.result +/testsuite/tests/lib-num/*.byte +/testsuite/tests/lib-num/*.native +/testsuite/tests/lib-num/program +/testsuite/tests/lib-num/*.exe +/testsuite/tests/lib-num/*.exe.manifest +/testsuite/tests/lib-num/.depend +/testsuite/tests/lib-num/.depend.nt +/testsuite/tests/lib-num/.DS_Store + +# /testsuite/tests/lib-num-2/ +/testsuite/tests/lib-num-2/*.o +/testsuite/tests/lib-num-2/*.a +/testsuite/tests/lib-num-2/*.so +/testsuite/tests/lib-num-2/*.obj +/testsuite/tests/lib-num-2/*.cm[ioxa] +/testsuite/tests/lib-num-2/*.cmx[as] +/testsuite/tests/lib-num-2/*.annot +/testsuite/tests/lib-num-2/*.result +/testsuite/tests/lib-num-2/*.byte +/testsuite/tests/lib-num-2/*.native +/testsuite/tests/lib-num-2/program +/testsuite/tests/lib-num-2/program.exe +/testsuite/tests/lib-num-2/.depend +/testsuite/tests/lib-num-2/.depend.nt +/testsuite/tests/lib-num-2/.DS_Store + +# /testsuite/tests/lib-printf/ +/testsuite/tests/lib-printf/*.o +/testsuite/tests/lib-printf/*.a +/testsuite/tests/lib-printf/*.so +/testsuite/tests/lib-printf/*.obj +/testsuite/tests/lib-printf/*.lib +/testsuite/tests/lib-printf/*.dll +/testsuite/tests/lib-printf/*.cm[ioxat] +/testsuite/tests/lib-printf/*.cmx[as] +/testsuite/tests/lib-printf/*.cmti +/testsuite/tests/lib-printf/*.annot +/testsuite/tests/lib-printf/*.result +/testsuite/tests/lib-printf/*.byte +/testsuite/tests/lib-printf/*.native +/testsuite/tests/lib-printf/program +/testsuite/tests/lib-printf/*.exe +/testsuite/tests/lib-printf/*.exe.manifest +/testsuite/tests/lib-printf/.depend +/testsuite/tests/lib-printf/.depend.nt +/testsuite/tests/lib-printf/.DS_Store + +# /testsuite/tests/lib-random/ +/testsuite/tests/lib-random/*.o +/testsuite/tests/lib-random/*.a +/testsuite/tests/lib-random/*.so +/testsuite/tests/lib-random/*.obj +/testsuite/tests/lib-random/*.lib +/testsuite/tests/lib-random/*.dll +/testsuite/tests/lib-random/*.cm[ioxat] +/testsuite/tests/lib-random/*.cmx[as] +/testsuite/tests/lib-random/*.cmti +/testsuite/tests/lib-random/*.annot +/testsuite/tests/lib-random/*.result +/testsuite/tests/lib-random/*.byte +/testsuite/tests/lib-random/*.native +/testsuite/tests/lib-random/program +/testsuite/tests/lib-random/*.exe +/testsuite/tests/lib-random/*.exe.manifest +/testsuite/tests/lib-random/.depend +/testsuite/tests/lib-random/.depend.nt +/testsuite/tests/lib-random/.DS_Store + +# /testsuite/tests/lib-scanf/ +/testsuite/tests/lib-scanf/*.o +/testsuite/tests/lib-scanf/*.a +/testsuite/tests/lib-scanf/*.so +/testsuite/tests/lib-scanf/*.obj +/testsuite/tests/lib-scanf/*.lib +/testsuite/tests/lib-scanf/*.dll +/testsuite/tests/lib-scanf/*.cm[ioxat] +/testsuite/tests/lib-scanf/*.cmx[as] +/testsuite/tests/lib-scanf/*.cmti +/testsuite/tests/lib-scanf/*.annot +/testsuite/tests/lib-scanf/*.result +/testsuite/tests/lib-scanf/*.byte +/testsuite/tests/lib-scanf/*.native +/testsuite/tests/lib-scanf/program +/testsuite/tests/lib-scanf/*.exe +/testsuite/tests/lib-scanf/*.exe.manifest +/testsuite/tests/lib-scanf/.depend +/testsuite/tests/lib-scanf/.depend.nt +/testsuite/tests/lib-scanf/.DS_Store +/testsuite/tests/lib-scanf/tscanf_data + +# /testsuite/tests/lib-scanf-2/ +/testsuite/tests/lib-scanf-2/*.o +/testsuite/tests/lib-scanf-2/*.a +/testsuite/tests/lib-scanf-2/*.so +/testsuite/tests/lib-scanf-2/*.obj +/testsuite/tests/lib-scanf-2/*.lib +/testsuite/tests/lib-scanf-2/*.dll +/testsuite/tests/lib-scanf-2/*.cm[ioxat] +/testsuite/tests/lib-scanf-2/*.cmx[as] +/testsuite/tests/lib-scanf-2/*.cmti +/testsuite/tests/lib-scanf-2/*.annot +/testsuite/tests/lib-scanf-2/*.result +/testsuite/tests/lib-scanf-2/*.byte +/testsuite/tests/lib-scanf-2/*.native +/testsuite/tests/lib-scanf-2/program +/testsuite/tests/lib-scanf-2/*.exe +/testsuite/tests/lib-scanf-2/*.exe.manifest +/testsuite/tests/lib-scanf-2/.depend +/testsuite/tests/lib-scanf-2/.depend.nt +/testsuite/tests/lib-scanf-2/.DS_Store + +# /testsuite/tests/lib-set/ +/testsuite/tests/lib-set/*.o +/testsuite/tests/lib-set/*.a +/testsuite/tests/lib-set/*.so +/testsuite/tests/lib-set/*.obj +/testsuite/tests/lib-set/*.cm[ioxa] +/testsuite/tests/lib-set/*.cmx[as] +/testsuite/tests/lib-set/*.annot +/testsuite/tests/lib-set/*.result +/testsuite/tests/lib-set/*.byte +/testsuite/tests/lib-set/*.native +/testsuite/tests/lib-set/program +/testsuite/tests/lib-set/program.exe +/testsuite/tests/lib-set/.depend +/testsuite/tests/lib-set/.depend.nt +/testsuite/tests/lib-set/.DS_Store + +# /testsuite/tests/lib-str/ +/testsuite/tests/lib-str/*.o +/testsuite/tests/lib-str/*.a +/testsuite/tests/lib-str/*.so +/testsuite/tests/lib-str/*.obj +/testsuite/tests/lib-str/*.cm[ioxa] +/testsuite/tests/lib-str/*.cmx[as] +/testsuite/tests/lib-str/*.annot +/testsuite/tests/lib-str/*.result +/testsuite/tests/lib-str/*.byte +/testsuite/tests/lib-str/*.native +/testsuite/tests/lib-str/program +/testsuite/tests/lib-str/program.exe +/testsuite/tests/lib-str/.depend +/testsuite/tests/lib-str/.depend.nt +/testsuite/tests/lib-str/.DS_Store + +# /testsuite/tests/lib-stream/ +/testsuite/tests/lib-stream/*.o +/testsuite/tests/lib-stream/*.a +/testsuite/tests/lib-stream/*.so +/testsuite/tests/lib-stream/*.obj +/testsuite/tests/lib-stream/*.cm[ioxa] +/testsuite/tests/lib-stream/*.cmx[as] +/testsuite/tests/lib-stream/*.annot +/testsuite/tests/lib-stream/*.result +/testsuite/tests/lib-stream/*.byte +/testsuite/tests/lib-stream/*.native +/testsuite/tests/lib-stream/program +/testsuite/tests/lib-stream/program.exe +/testsuite/tests/lib-stream/.depend +/testsuite/tests/lib-stream/.depend.nt +/testsuite/tests/lib-stream/.DS_Store + +# /testsuite/tests/lib-systhreads/ +/testsuite/tests/lib-systhreads/*.o +/testsuite/tests/lib-systhreads/*.a +/testsuite/tests/lib-systhreads/*.so +/testsuite/tests/lib-systhreads/*.obj +/testsuite/tests/lib-systhreads/*.cm[ioxa] +/testsuite/tests/lib-systhreads/*.cmx[as] +/testsuite/tests/lib-systhreads/*.annot +/testsuite/tests/lib-systhreads/*.result +/testsuite/tests/lib-systhreads/*.byte +/testsuite/tests/lib-systhreads/*.native +/testsuite/tests/lib-systhreads/program +/testsuite/tests/lib-systhreads/program.exe +/testsuite/tests/lib-systhreads/.depend +/testsuite/tests/lib-systhreads/.depend.nt +/testsuite/tests/lib-systhreads/.DS_Store + +# /testsuite/tests/lib-threads/ +/testsuite/tests/lib-threads/*.o +/testsuite/tests/lib-threads/*.a +/testsuite/tests/lib-threads/*.so +/testsuite/tests/lib-threads/*.obj +/testsuite/tests/lib-threads/*.cm[ioxa] +/testsuite/tests/lib-threads/*.cmx[as] +/testsuite/tests/lib-threads/*.annot +/testsuite/tests/lib-threads/*.result +/testsuite/tests/lib-threads/*.byte +/testsuite/tests/lib-threads/*.native +/testsuite/tests/lib-threads/program +/testsuite/tests/lib-threads/program.exe +/testsuite/tests/lib-threads/.depend +/testsuite/tests/lib-threads/.depend.nt +/testsuite/tests/lib-threads/.DS_Store +/testsuite/tests/lib-threads/*.byt + +# /testsuite/tests/match-exception/ +/testsuite/tests/match-exception/*.o +/testsuite/tests/match-exception/*.a +/testsuite/tests/match-exception/*.so +/testsuite/tests/match-exception/*.obj +/testsuite/tests/match-exception/*.lib +/testsuite/tests/match-exception/*.dll +/testsuite/tests/match-exception/*.cm[ioxat] +/testsuite/tests/match-exception/*.cmx[as] +/testsuite/tests/match-exception/*.cmti +/testsuite/tests/match-exception/*.annot +/testsuite/tests/match-exception/*.result +/testsuite/tests/match-exception/*.byte +/testsuite/tests/match-exception/*.native +/testsuite/tests/match-exception/program +/testsuite/tests/match-exception/*.exe +/testsuite/tests/match-exception/*.exe.manifest +/testsuite/tests/match-exception/.depend +/testsuite/tests/match-exception/.depend.nt +/testsuite/tests/match-exception/.DS_Store + +# /testsuite/tests/match-exception-warnings/ +/testsuite/tests/match-exception-warnings/*.o +/testsuite/tests/match-exception-warnings/*.a +/testsuite/tests/match-exception-warnings/*.so +/testsuite/tests/match-exception-warnings/*.obj +/testsuite/tests/match-exception-warnings/*.lib +/testsuite/tests/match-exception-warnings/*.dll +/testsuite/tests/match-exception-warnings/*.cm[ioxat] +/testsuite/tests/match-exception-warnings/*.cmx[as] +/testsuite/tests/match-exception-warnings/*.cmti +/testsuite/tests/match-exception-warnings/*.annot +/testsuite/tests/match-exception-warnings/*.result +/testsuite/tests/match-exception-warnings/*.byte +/testsuite/tests/match-exception-warnings/*.native +/testsuite/tests/match-exception-warnings/program +/testsuite/tests/match-exception-warnings/*.exe +/testsuite/tests/match-exception-warnings/*.exe.manifest +/testsuite/tests/match-exception-warnings/.depend +/testsuite/tests/match-exception-warnings/.depend.nt +/testsuite/tests/match-exception-warnings/.DS_Store + +# /testsuite/tests/misc/ +/testsuite/tests/misc/*.o +/testsuite/tests/misc/*.a +/testsuite/tests/misc/*.so +/testsuite/tests/misc/*.obj +/testsuite/tests/misc/*.cm[ioxa] +/testsuite/tests/misc/*.cmx[as] +/testsuite/tests/misc/*.annot +/testsuite/tests/misc/*.result +/testsuite/tests/misc/*.byte +/testsuite/tests/misc/*.native +/testsuite/tests/misc/program +/testsuite/tests/misc/program.exe +/testsuite/tests/misc/.depend +/testsuite/tests/misc/.depend.nt +/testsuite/tests/misc/.DS_Store + +# /testsuite/tests/misc-kb/ +/testsuite/tests/misc-kb/*.o +/testsuite/tests/misc-kb/*.a +/testsuite/tests/misc-kb/*.so +/testsuite/tests/misc-kb/*.obj +/testsuite/tests/misc-kb/*.lib +/testsuite/tests/misc-kb/*.dll +/testsuite/tests/misc-kb/*.cm[ioxat] +/testsuite/tests/misc-kb/*.cmx[as] +/testsuite/tests/misc-kb/*.cmti +/testsuite/tests/misc-kb/*.annot +/testsuite/tests/misc-kb/*.result +/testsuite/tests/misc-kb/*.byte +/testsuite/tests/misc-kb/*.native +/testsuite/tests/misc-kb/program +/testsuite/tests/misc-kb/*.exe +/testsuite/tests/misc-kb/*.exe.manifest +/testsuite/tests/misc-kb/.depend +/testsuite/tests/misc-kb/.depend.nt +/testsuite/tests/misc-kb/.DS_Store + +# /testsuite/tests/misc-unsafe/ +/testsuite/tests/misc-unsafe/*.o +/testsuite/tests/misc-unsafe/*.a +/testsuite/tests/misc-unsafe/*.so +/testsuite/tests/misc-unsafe/*.obj +/testsuite/tests/misc-unsafe/*.cm[ioxa] +/testsuite/tests/misc-unsafe/*.cmx[as] +/testsuite/tests/misc-unsafe/*.annot +/testsuite/tests/misc-unsafe/*.result +/testsuite/tests/misc-unsafe/*.byte +/testsuite/tests/misc-unsafe/*.native +/testsuite/tests/misc-unsafe/program +/testsuite/tests/misc-unsafe/program.exe +/testsuite/tests/misc-unsafe/.depend +/testsuite/tests/misc-unsafe/.depend.nt +/testsuite/tests/misc-unsafe/.DS_Store + +# /testsuite/tests/prim-bigstring/ +/testsuite/tests/prim-bigstring/*.o +/testsuite/tests/prim-bigstring/*.a +/testsuite/tests/prim-bigstring/*.so +/testsuite/tests/prim-bigstring/*.obj +/testsuite/tests/prim-bigstring/*.lib +/testsuite/tests/prim-bigstring/*.dll +/testsuite/tests/prim-bigstring/*.cm[ioxat] +/testsuite/tests/prim-bigstring/*.cmx[as] +/testsuite/tests/prim-bigstring/*.cmti +/testsuite/tests/prim-bigstring/*.annot +/testsuite/tests/prim-bigstring/*.result +/testsuite/tests/prim-bigstring/*.byte +/testsuite/tests/prim-bigstring/*.native +/testsuite/tests/prim-bigstring/program +/testsuite/tests/prim-bigstring/*.exe +/testsuite/tests/prim-bigstring/*.exe.manifest +/testsuite/tests/prim-bigstring/.depend +/testsuite/tests/prim-bigstring/.depend.nt +/testsuite/tests/prim-bigstring/.DS_Store + +# /testsuite/tests/prim-bswap/ +/testsuite/tests/prim-bswap/*.o +/testsuite/tests/prim-bswap/*.a +/testsuite/tests/prim-bswap/*.so +/testsuite/tests/prim-bswap/*.obj +/testsuite/tests/prim-bswap/*.cm[ioxat] +/testsuite/tests/prim-bswap/*.cmx[as] +/testsuite/tests/prim-bswap/*.cmti +/testsuite/tests/prim-bswap/*.annot +/testsuite/tests/prim-bswap/*.result +/testsuite/tests/prim-bswap/*.byte +/testsuite/tests/prim-bswap/*.native +/testsuite/tests/prim-bswap/program +/testsuite/tests/prim-bswap/program.exe +/testsuite/tests/prim-bswap/.depend +/testsuite/tests/prim-bswap/.depend.nt +/testsuite/tests/prim-bswap/.DS_Store + +# /testsuite/tests/prim-revapply/ +/testsuite/tests/prim-revapply/*.o +/testsuite/tests/prim-revapply/*.a +/testsuite/tests/prim-revapply/*.so +/testsuite/tests/prim-revapply/*.obj +/testsuite/tests/prim-revapply/*.cm[ioxa] +/testsuite/tests/prim-revapply/*.cmx[as] +/testsuite/tests/prim-revapply/*.annot +/testsuite/tests/prim-revapply/*.result +/testsuite/tests/prim-revapply/*.byte +/testsuite/tests/prim-revapply/*.native +/testsuite/tests/prim-revapply/program +/testsuite/tests/prim-revapply/program.exe +/testsuite/tests/prim-revapply/.depend +/testsuite/tests/prim-revapply/.depend.nt +/testsuite/tests/prim-revapply/.DS_Store + +# /testsuite/tests/regression/pr5080-notes/ +/testsuite/tests/regression/pr5080-notes/*.o +/testsuite/tests/regression/pr5080-notes/*.a +/testsuite/tests/regression/pr5080-notes/*.so +/testsuite/tests/regression/pr5080-notes/*.obj +/testsuite/tests/regression/pr5080-notes/*.cm[ioxa] +/testsuite/tests/regression/pr5080-notes/*.cmx[as] +/testsuite/tests/regression/pr5080-notes/*.annot +/testsuite/tests/regression/pr5080-notes/*.result +/testsuite/tests/regression/pr5080-notes/*.byte +/testsuite/tests/regression/pr5080-notes/*.native +/testsuite/tests/regression/pr5080-notes/program +/testsuite/tests/regression/pr5080-notes/program.exe +/testsuite/tests/regression/pr5080-notes/.depend +/testsuite/tests/regression/pr5080-notes/.depend.nt +/testsuite/tests/regression/pr5080-notes/.DS_Store + +# /testsuite/tests/regression/pr5233/ +/testsuite/tests/regression/pr5233/*.o +/testsuite/tests/regression/pr5233/*.a +/testsuite/tests/regression/pr5233/*.so +/testsuite/tests/regression/pr5233/*.obj +/testsuite/tests/regression/pr5233/*.lib +/testsuite/tests/regression/pr5233/*.dll +/testsuite/tests/regression/pr5233/*.cm[ioxat] +/testsuite/tests/regression/pr5233/*.cmx[as] +/testsuite/tests/regression/pr5233/*.cmti +/testsuite/tests/regression/pr5233/*.annot +/testsuite/tests/regression/pr5233/*.result +/testsuite/tests/regression/pr5233/*.byte +/testsuite/tests/regression/pr5233/*.native +/testsuite/tests/regression/pr5233/program +/testsuite/tests/regression/pr5233/*.exe +/testsuite/tests/regression/pr5233/*.exe.manifest +/testsuite/tests/regression/pr5233/.depend +/testsuite/tests/regression/pr5233/.depend.nt +/testsuite/tests/regression/pr5233/.DS_Store + +# /testsuite/tests/regression/pr5757/ +/testsuite/tests/regression/pr5757/*.o +/testsuite/tests/regression/pr5757/*.a +/testsuite/tests/regression/pr5757/*.so +/testsuite/tests/regression/pr5757/*.obj +/testsuite/tests/regression/pr5757/*.lib +/testsuite/tests/regression/pr5757/*.dll +/testsuite/tests/regression/pr5757/*.cm[ioxat] +/testsuite/tests/regression/pr5757/*.cmx[as] +/testsuite/tests/regression/pr5757/*.cmti +/testsuite/tests/regression/pr5757/*.annot +/testsuite/tests/regression/pr5757/*.result +/testsuite/tests/regression/pr5757/*.byte +/testsuite/tests/regression/pr5757/*.native +/testsuite/tests/regression/pr5757/program +/testsuite/tests/regression/pr5757/*.exe +/testsuite/tests/regression/pr5757/*.exe.manifest +/testsuite/tests/regression/pr5757/.depend +/testsuite/tests/regression/pr5757/.depend.nt +/testsuite/tests/regression/pr5757/.DS_Store + +# /testsuite/tests/regression/pr6024/ +/testsuite/tests/regression/pr6024/*.o +/testsuite/tests/regression/pr6024/*.a +/testsuite/tests/regression/pr6024/*.so +/testsuite/tests/regression/pr6024/*.obj +/testsuite/tests/regression/pr6024/*.lib +/testsuite/tests/regression/pr6024/*.dll +/testsuite/tests/regression/pr6024/*.cm[ioxat] +/testsuite/tests/regression/pr6024/*.cmx[as] +/testsuite/tests/regression/pr6024/*.cmti +/testsuite/tests/regression/pr6024/*.annot +/testsuite/tests/regression/pr6024/*.result +/testsuite/tests/regression/pr6024/*.byte +/testsuite/tests/regression/pr6024/*.native +/testsuite/tests/regression/pr6024/program +/testsuite/tests/regression/pr6024/*.exe +/testsuite/tests/regression/pr6024/*.exe.manifest +/testsuite/tests/regression/pr6024/.depend +/testsuite/tests/regression/pr6024/.depend.nt +/testsuite/tests/regression/pr6024/.DS_Store + +# /testsuite/tests/runtime-errors/ +/testsuite/tests/runtime-errors/*.o +/testsuite/tests/runtime-errors/*.a +/testsuite/tests/runtime-errors/*.so +/testsuite/tests/runtime-errors/*.obj +/testsuite/tests/runtime-errors/*.lib +/testsuite/tests/runtime-errors/*.dll +/testsuite/tests/runtime-errors/*.cm[ioxat] +/testsuite/tests/runtime-errors/*.cmx[as] +/testsuite/tests/runtime-errors/*.cmti +/testsuite/tests/runtime-errors/*.annot +/testsuite/tests/runtime-errors/*.result +/testsuite/tests/runtime-errors/*.byte +/testsuite/tests/runtime-errors/*.native +/testsuite/tests/runtime-errors/program +/testsuite/tests/runtime-errors/*.exe +/testsuite/tests/runtime-errors/*.exe.manifest +/testsuite/tests/runtime-errors/.depend +/testsuite/tests/runtime-errors/.depend.nt +/testsuite/tests/runtime-errors/.DS_Store +/testsuite/tests/runtime-errors/*.bytecode + +# /testsuite/tests/tool-debugger/ +/testsuite/tests/tool-debugger/*.o +/testsuite/tests/tool-debugger/*.a +/testsuite/tests/tool-debugger/*.so +/testsuite/tests/tool-debugger/*.obj +/testsuite/tests/tool-debugger/*.lib +/testsuite/tests/tool-debugger/*.dll +/testsuite/tests/tool-debugger/*.cm[ioxat] +/testsuite/tests/tool-debugger/*.cmx[as] +/testsuite/tests/tool-debugger/*.cmti +/testsuite/tests/tool-debugger/*.annot +/testsuite/tests/tool-debugger/*.result +/testsuite/tests/tool-debugger/*.byte +/testsuite/tests/tool-debugger/*.native +/testsuite/tests/tool-debugger/program +/testsuite/tests/tool-debugger/*.exe +/testsuite/tests/tool-debugger/*.exe.manifest +/testsuite/tests/tool-debugger/.depend +/testsuite/tests/tool-debugger/.depend.nt +/testsuite/tests/tool-debugger/.DS_Store +/testsuite/tests/tool-debugger/compiler-libs + +# /testsuite/tests/tool-debugger/basic/ +/testsuite/tests/tool-debugger/basic/*.o +/testsuite/tests/tool-debugger/basic/*.a +/testsuite/tests/tool-debugger/basic/*.so +/testsuite/tests/tool-debugger/basic/*.obj +/testsuite/tests/tool-debugger/basic/*.lib +/testsuite/tests/tool-debugger/basic/*.dll +/testsuite/tests/tool-debugger/basic/*.cm[ioxat] +/testsuite/tests/tool-debugger/basic/*.cmx[as] +/testsuite/tests/tool-debugger/basic/*.cmti +/testsuite/tests/tool-debugger/basic/*.annot +/testsuite/tests/tool-debugger/basic/*.result +/testsuite/tests/tool-debugger/basic/*.byte +/testsuite/tests/tool-debugger/basic/*.native +/testsuite/tests/tool-debugger/basic/program +/testsuite/tests/tool-debugger/basic/*.exe +/testsuite/tests/tool-debugger/basic/*.exe.manifest +/testsuite/tests/tool-debugger/basic/.depend +/testsuite/tests/tool-debugger/basic/.depend.nt +/testsuite/tests/tool-debugger/basic/.DS_Store +/testsuite/tests/tool-debugger/basic/compiler-libs + +# /testsuite/tests/tool-debugger/find-artifacts/ +/testsuite/tests/tool-debugger/find-artifacts/*.o +/testsuite/tests/tool-debugger/find-artifacts/*.a +/testsuite/tests/tool-debugger/find-artifacts/*.so +/testsuite/tests/tool-debugger/find-artifacts/*.obj +/testsuite/tests/tool-debugger/find-artifacts/*.lib +/testsuite/tests/tool-debugger/find-artifacts/*.dll +/testsuite/tests/tool-debugger/find-artifacts/*.cm[ioxat] +/testsuite/tests/tool-debugger/find-artifacts/*.cmx[as] +/testsuite/tests/tool-debugger/find-artifacts/*.cmti +/testsuite/tests/tool-debugger/find-artifacts/*.annot +/testsuite/tests/tool-debugger/find-artifacts/*.result +/testsuite/tests/tool-debugger/find-artifacts/*.byte +/testsuite/tests/tool-debugger/find-artifacts/*.native +/testsuite/tests/tool-debugger/find-artifacts/program +/testsuite/tests/tool-debugger/find-artifacts/*.exe +/testsuite/tests/tool-debugger/find-artifacts/*.exe.manifest +/testsuite/tests/tool-debugger/find-artifacts/.depend +/testsuite/tests/tool-debugger/find-artifacts/.depend.nt +/testsuite/tests/tool-debugger/find-artifacts/.DS_Store +/testsuite/tests/tool-debugger/find-artifacts/compiler-libs +/testsuite/tests/tool-debugger/find-artifacts/out + +# /testsuite/tests/tool-lexyacc/ +/testsuite/tests/tool-lexyacc/*.o +/testsuite/tests/tool-lexyacc/*.a +/testsuite/tests/tool-lexyacc/*.so +/testsuite/tests/tool-lexyacc/*.obj +/testsuite/tests/tool-lexyacc/*.lib +/testsuite/tests/tool-lexyacc/*.dll +/testsuite/tests/tool-lexyacc/*.cm[ioxat] +/testsuite/tests/tool-lexyacc/*.cmx[as] +/testsuite/tests/tool-lexyacc/*.cmti +/testsuite/tests/tool-lexyacc/*.annot +/testsuite/tests/tool-lexyacc/*.result +/testsuite/tests/tool-lexyacc/*.byte +/testsuite/tests/tool-lexyacc/*.native +/testsuite/tests/tool-lexyacc/program +/testsuite/tests/tool-lexyacc/*.exe +/testsuite/tests/tool-lexyacc/*.exe.manifest +/testsuite/tests/tool-lexyacc/.depend +/testsuite/tests/tool-lexyacc/.depend.nt +/testsuite/tests/tool-lexyacc/.DS_Store +/testsuite/tests/tool-lexyacc/scanner.ml +/testsuite/tests/tool-lexyacc/grammar.mli +/testsuite/tests/tool-lexyacc/grammar.ml + +# /testsuite/tests/tool-ocaml/ +/testsuite/tests/tool-ocaml/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/tool-ocaml/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/tool-ocaml/_log +/testsuite/tests/tool-ocaml/*.so +/testsuite/tests/tool-ocaml/*.a +/testsuite/tests/tool-ocaml/*.result +/testsuite/tests/tool-ocaml/*.byte +/testsuite/tests/tool-ocaml/*.native +/testsuite/tests/tool-ocaml/program +/testsuite/tests/tool-ocaml/*.cm* +/testsuite/tests/tool-ocaml/*.o + +# /testsuite/tests/tool-ocamldoc/ +/testsuite/tests/tool-ocamldoc/*.o +/testsuite/tests/tool-ocamldoc/*.a +/testsuite/tests/tool-ocamldoc/*.so +/testsuite/tests/tool-ocamldoc/*.obj +/testsuite/tests/tool-ocamldoc/*.cm[ioxa] +/testsuite/tests/tool-ocamldoc/*.cmx[as] +/testsuite/tests/tool-ocamldoc/*.annot +/testsuite/tests/tool-ocamldoc/*.result +/testsuite/tests/tool-ocamldoc/*.byte +/testsuite/tests/tool-ocamldoc/*.native +/testsuite/tests/tool-ocamldoc/program +/testsuite/tests/tool-ocamldoc/.depend +/testsuite/tests/tool-ocamldoc/.depend.nt +/testsuite/tests/tool-ocamldoc/.DS_Store +/testsuite/tests/tool-ocamldoc/*.html +/testsuite/tests/tool-ocamldoc/*.sty +/testsuite/tests/tool-ocamldoc/*.css +/testsuite/tests/tool-ocamldoc/ocamldoc.out + +# /testsuite/tests/tool-toplevel/ +/testsuite/tests/tool-toplevel/*.o +/testsuite/tests/tool-toplevel/*.a +/testsuite/tests/tool-toplevel/*.so +/testsuite/tests/tool-toplevel/*.obj +/testsuite/tests/tool-toplevel/*.lib +/testsuite/tests/tool-toplevel/*.dll +/testsuite/tests/tool-toplevel/*.cm[ioxat] +/testsuite/tests/tool-toplevel/*.cmx[as] +/testsuite/tests/tool-toplevel/*.cmti +/testsuite/tests/tool-toplevel/*.annot +/testsuite/tests/tool-toplevel/*.result +/testsuite/tests/tool-toplevel/*.byte +/testsuite/tests/tool-toplevel/*.native +/testsuite/tests/tool-toplevel/program +/testsuite/tests/tool-toplevel/*.exe +/testsuite/tests/tool-toplevel/*.exe.manifest +/testsuite/tests/tool-toplevel/.depend +/testsuite/tests/tool-toplevel/.depend.nt +/testsuite/tests/tool-toplevel/.DS_Store + +# /testsuite/tests/typing-extensions/ +/testsuite/tests/typing-extensions/*.o +/testsuite/tests/typing-extensions/*.a +/testsuite/tests/typing-extensions/*.so +/testsuite/tests/typing-extensions/*.obj +/testsuite/tests/typing-extensions/*.lib +/testsuite/tests/typing-extensions/*.dll +/testsuite/tests/typing-extensions/*.cm[ioxat] +/testsuite/tests/typing-extensions/*.cmx[as] +/testsuite/tests/typing-extensions/*.cmti +/testsuite/tests/typing-extensions/*.annot +/testsuite/tests/typing-extensions/*.result +/testsuite/tests/typing-extensions/*.byte +/testsuite/tests/typing-extensions/*.native +/testsuite/tests/typing-extensions/program +/testsuite/tests/typing-extensions/*.exe +/testsuite/tests/typing-extensions/*.exe.manifest +/testsuite/tests/typing-extensions/.depend +/testsuite/tests/typing-extensions/.depend.nt +/testsuite/tests/typing-extensions/.DS_Store + +# /testsuite/tests/typing-fstclassmod/ +/testsuite/tests/typing-fstclassmod/*.o +/testsuite/tests/typing-fstclassmod/*.a +/testsuite/tests/typing-fstclassmod/*.so +/testsuite/tests/typing-fstclassmod/*.obj +/testsuite/tests/typing-fstclassmod/*.lib +/testsuite/tests/typing-fstclassmod/*.dll +/testsuite/tests/typing-fstclassmod/*.cm[ioxat] +/testsuite/tests/typing-fstclassmod/*.cmx[as] +/testsuite/tests/typing-fstclassmod/*.cmti +/testsuite/tests/typing-fstclassmod/*.annot +/testsuite/tests/typing-fstclassmod/*.result +/testsuite/tests/typing-fstclassmod/*.byte +/testsuite/tests/typing-fstclassmod/*.native +/testsuite/tests/typing-fstclassmod/program +/testsuite/tests/typing-fstclassmod/*.exe +/testsuite/tests/typing-fstclassmod/*.exe.manifest +/testsuite/tests/typing-fstclassmod/.depend +/testsuite/tests/typing-fstclassmod/.depend.nt +/testsuite/tests/typing-fstclassmod/.DS_Store + +# /testsuite/tests/typing-gadts/ +/testsuite/tests/typing-gadts/*.o +/testsuite/tests/typing-gadts/*.a +/testsuite/tests/typing-gadts/*.so +/testsuite/tests/typing-gadts/*.obj +/testsuite/tests/typing-gadts/*.cm[ioxa] +/testsuite/tests/typing-gadts/*.cmx[as] +/testsuite/tests/typing-gadts/*.annot +/testsuite/tests/typing-gadts/*.result +/testsuite/tests/typing-gadts/*.byte +/testsuite/tests/typing-gadts/*.native +/testsuite/tests/typing-gadts/program +/testsuite/tests/typing-gadts/.depend +/testsuite/tests/typing-gadts/.depend.nt +/testsuite/tests/typing-gadts/.DS_Store + +# /testsuite/tests/typing-implicit_unpack/ +/testsuite/tests/typing-implicit_unpack/*.o +/testsuite/tests/typing-implicit_unpack/*.a +/testsuite/tests/typing-implicit_unpack/*.so +/testsuite/tests/typing-implicit_unpack/*.obj +/testsuite/tests/typing-implicit_unpack/*.cm[ioxa] +/testsuite/tests/typing-implicit_unpack/*.cmx[as] +/testsuite/tests/typing-implicit_unpack/*.annot +/testsuite/tests/typing-implicit_unpack/*.result +/testsuite/tests/typing-implicit_unpack/*.byte +/testsuite/tests/typing-implicit_unpack/*.native +/testsuite/tests/typing-implicit_unpack/program +/testsuite/tests/typing-implicit_unpack/.depend +/testsuite/tests/typing-implicit_unpack/.depend.nt +/testsuite/tests/typing-implicit_unpack/.DS_Store + +# /testsuite/tests/typing-labels/ +/testsuite/tests/typing-labels/*.o +/testsuite/tests/typing-labels/*.a +/testsuite/tests/typing-labels/*.so +/testsuite/tests/typing-labels/*.obj +/testsuite/tests/typing-labels/*.cm[ioxa] +/testsuite/tests/typing-labels/*.cmx[as] +/testsuite/tests/typing-labels/*.annot +/testsuite/tests/typing-labels/*.result +/testsuite/tests/typing-labels/*.byte +/testsuite/tests/typing-labels/*.native +/testsuite/tests/typing-labels/program +/testsuite/tests/typing-labels/program.exe +/testsuite/tests/typing-labels/.depend +/testsuite/tests/typing-labels/.depend.nt +/testsuite/tests/typing-labels/.DS_Store + +# /testsuite/tests/typing-misc/ +/testsuite/tests/typing-misc/*.o +/testsuite/tests/typing-misc/*.a +/testsuite/tests/typing-misc/*.so +/testsuite/tests/typing-misc/*.obj +/testsuite/tests/typing-misc/*.cm[ioxa] +/testsuite/tests/typing-misc/*.cmx[as] +/testsuite/tests/typing-misc/*.annot +/testsuite/tests/typing-misc/*.result +/testsuite/tests/typing-misc/*.byte +/testsuite/tests/typing-misc/*.native +/testsuite/tests/typing-misc/program +/testsuite/tests/typing-misc/.depend +/testsuite/tests/typing-misc/.depend.nt +/testsuite/tests/typing-misc/.DS_Store + +# /testsuite/tests/typing-modules/ +/testsuite/tests/typing-modules/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-modules/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-modules/_log +/testsuite/tests/typing-modules/*.so +/testsuite/tests/typing-modules/*.a +/testsuite/tests/typing-modules/*.result +/testsuite/tests/typing-modules/*.byte +/testsuite/tests/typing-modules/*.native +/testsuite/tests/typing-modules/program + +# /testsuite/tests/typing-modules-bugs/ +/testsuite/tests/typing-modules-bugs/*.o +/testsuite/tests/typing-modules-bugs/*.a +/testsuite/tests/typing-modules-bugs/*.so +/testsuite/tests/typing-modules-bugs/*.obj +/testsuite/tests/typing-modules-bugs/*.cm[ioxa] +/testsuite/tests/typing-modules-bugs/*.cmx[as] +/testsuite/tests/typing-modules-bugs/*.annot +/testsuite/tests/typing-modules-bugs/*.result +/testsuite/tests/typing-modules-bugs/*.byte +/testsuite/tests/typing-modules-bugs/*.native +/testsuite/tests/typing-modules-bugs/program +/testsuite/tests/typing-modules-bugs/program.exe +/testsuite/tests/typing-modules-bugs/.depend +/testsuite/tests/typing-modules-bugs/.depend.nt +/testsuite/tests/typing-modules-bugs/.DS_Store + +# /testsuite/tests/typing-objects/ +/testsuite/tests/typing-objects/*.o +/testsuite/tests/typing-objects/*.a +/testsuite/tests/typing-objects/*.so +/testsuite/tests/typing-objects/*.obj +/testsuite/tests/typing-objects/*.cm[ioxa] +/testsuite/tests/typing-objects/*.cmx[as] +/testsuite/tests/typing-objects/*.annot +/testsuite/tests/typing-objects/*.result +/testsuite/tests/typing-objects/*.byte +/testsuite/tests/typing-objects/*.native +/testsuite/tests/typing-objects/program +/testsuite/tests/typing-objects/.depend +/testsuite/tests/typing-objects/.depend.nt +/testsuite/tests/typing-objects/.DS_Store + +# /testsuite/tests/typing-objects-bugs/ +/testsuite/tests/typing-objects-bugs/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-objects-bugs/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-objects-bugs/_log +/testsuite/tests/typing-objects-bugs/*.so +/testsuite/tests/typing-objects-bugs/*.a +/testsuite/tests/typing-objects-bugs/*.result +/testsuite/tests/typing-objects-bugs/*.byte +/testsuite/tests/typing-objects-bugs/*.native +/testsuite/tests/typing-objects-bugs/program +/testsuite/tests/typing-objects-bugs/*.cm* +/testsuite/tests/typing-objects-bugs/*.o + +# /testsuite/tests/typing-poly/ +/testsuite/tests/typing-poly/*.o +/testsuite/tests/typing-poly/*.a +/testsuite/tests/typing-poly/*.so +/testsuite/tests/typing-poly/*.obj +/testsuite/tests/typing-poly/*.cm[ioxa] +/testsuite/tests/typing-poly/*.cmx[as] +/testsuite/tests/typing-poly/*.annot +/testsuite/tests/typing-poly/*.result +/testsuite/tests/typing-poly/*.byte +/testsuite/tests/typing-poly/*.native +/testsuite/tests/typing-poly/program +/testsuite/tests/typing-poly/.depend +/testsuite/tests/typing-poly/.depend.nt +/testsuite/tests/typing-poly/.DS_Store + +# /testsuite/tests/typing-poly-bugs/ +/testsuite/tests/typing-poly-bugs/*.o +/testsuite/tests/typing-poly-bugs/*.a +/testsuite/tests/typing-poly-bugs/*.so +/testsuite/tests/typing-poly-bugs/*.obj +/testsuite/tests/typing-poly-bugs/*.cm[ioxa] +/testsuite/tests/typing-poly-bugs/*.cmx[as] +/testsuite/tests/typing-poly-bugs/*.annot +/testsuite/tests/typing-poly-bugs/*.result +/testsuite/tests/typing-poly-bugs/*.byte +/testsuite/tests/typing-poly-bugs/*.native +/testsuite/tests/typing-poly-bugs/program +/testsuite/tests/typing-poly-bugs/program.exe +/testsuite/tests/typing-poly-bugs/.depend +/testsuite/tests/typing-poly-bugs/.depend.nt +/testsuite/tests/typing-poly-bugs/.DS_Store + +# /testsuite/tests/typing-polyvariants-bugs/ +/testsuite/tests/typing-polyvariants-bugs/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-polyvariants-bugs/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-polyvariants-bugs/_log +/testsuite/tests/typing-polyvariants-bugs/*.so +/testsuite/tests/typing-polyvariants-bugs/*.a +/testsuite/tests/typing-polyvariants-bugs/*.result +/testsuite/tests/typing-polyvariants-bugs/*.byte +/testsuite/tests/typing-polyvariants-bugs/*.native +/testsuite/tests/typing-polyvariants-bugs/program +/testsuite/tests/typing-polyvariants-bugs/*.cm* +/testsuite/tests/typing-polyvariants-bugs/*.o + +# /testsuite/tests/typing-polyvariants-bugs-2/ +/testsuite/tests/typing-polyvariants-bugs-2/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-polyvariants-bugs-2/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-polyvariants-bugs-2/_log +/testsuite/tests/typing-polyvariants-bugs-2/*.so +/testsuite/tests/typing-polyvariants-bugs-2/*.a +/testsuite/tests/typing-polyvariants-bugs-2/*.result +/testsuite/tests/typing-polyvariants-bugs-2/*.byte +/testsuite/tests/typing-polyvariants-bugs-2/*.native +/testsuite/tests/typing-polyvariants-bugs-2/program +/testsuite/tests/typing-polyvariants-bugs-2/*.cm* +/testsuite/tests/typing-polyvariants-bugs-2/*.o + +# /testsuite/tests/typing-private/ +/testsuite/tests/typing-private/*.o +/testsuite/tests/typing-private/*.a +/testsuite/tests/typing-private/*.so +/testsuite/tests/typing-private/*.obj +/testsuite/tests/typing-private/*.cm[ioxa] +/testsuite/tests/typing-private/*.cmx[as] +/testsuite/tests/typing-private/*.annot +/testsuite/tests/typing-private/*.result +/testsuite/tests/typing-private/*.byte +/testsuite/tests/typing-private/*.native +/testsuite/tests/typing-private/program +/testsuite/tests/typing-private/.depend +/testsuite/tests/typing-private/.depend.nt +/testsuite/tests/typing-private/.DS_Store + +# /testsuite/tests/typing-private-bugs/ +/testsuite/tests/typing-private-bugs/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-private-bugs/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-private-bugs/_log +/testsuite/tests/typing-private-bugs/*.so +/testsuite/tests/typing-private-bugs/*.a +/testsuite/tests/typing-private-bugs/*.result +/testsuite/tests/typing-private-bugs/*.byte +/testsuite/tests/typing-private-bugs/*.native +/testsuite/tests/typing-private-bugs/program +/testsuite/tests/typing-private-bugs/*.cm* +/testsuite/tests/typing-private-bugs/*.o + +# /testsuite/tests/typing-recmod/ +/testsuite/tests/typing-recmod/# svn propset -R svn:ignore -F .svnignore . +/testsuite/tests/typing-recmod/# find . -name .svnignore -print | while read f; do svn propset svn:ignore -F $f `dirname $f`; done +/testsuite/tests/typing-recmod/_log +/testsuite/tests/typing-recmod/*.so +/testsuite/tests/typing-recmod/*.a +/testsuite/tests/typing-recmod/*.result +/testsuite/tests/typing-recmod/*.byte +/testsuite/tests/typing-recmod/*.native +/testsuite/tests/typing-recmod/program +/testsuite/tests/typing-recmod/*.cm* +/testsuite/tests/typing-recmod/*.o + +# /testsuite/tests/typing-short-paths/ +/testsuite/tests/typing-short-paths/*.o +/testsuite/tests/typing-short-paths/*.a +/testsuite/tests/typing-short-paths/*.so +/testsuite/tests/typing-short-paths/*.obj +/testsuite/tests/typing-short-paths/*.cm[ioxat] +/testsuite/tests/typing-short-paths/*.cmx[as] +/testsuite/tests/typing-short-paths/*.cmti +/testsuite/tests/typing-short-paths/*.annot +/testsuite/tests/typing-short-paths/*.result +/testsuite/tests/typing-short-paths/*.byte +/testsuite/tests/typing-short-paths/*.native +/testsuite/tests/typing-short-paths/program +/testsuite/tests/typing-short-paths/program.exe +/testsuite/tests/typing-short-paths/.depend +/testsuite/tests/typing-short-paths/.depend.nt +/testsuite/tests/typing-short-paths/.DS_Store + +# /testsuite/tests/typing-signatures/ +/testsuite/tests/typing-signatures/*.o +/testsuite/tests/typing-signatures/*.a +/testsuite/tests/typing-signatures/*.so +/testsuite/tests/typing-signatures/*.obj +/testsuite/tests/typing-signatures/*.cm[ioxa] +/testsuite/tests/typing-signatures/*.cmx[as] +/testsuite/tests/typing-signatures/*.annot +/testsuite/tests/typing-signatures/*.result +/testsuite/tests/typing-signatures/*.byte +/testsuite/tests/typing-signatures/*.native +/testsuite/tests/typing-signatures/program +/testsuite/tests/typing-signatures/.depend +/testsuite/tests/typing-signatures/.depend.nt +/testsuite/tests/typing-signatures/.DS_Store + +# /testsuite/tests/typing-sigsubst/ +/testsuite/tests/typing-sigsubst/*.o +/testsuite/tests/typing-sigsubst/*.a +/testsuite/tests/typing-sigsubst/*.so +/testsuite/tests/typing-sigsubst/*.obj +/testsuite/tests/typing-sigsubst/*.cm[ioxa] +/testsuite/tests/typing-sigsubst/*.cmx[as] +/testsuite/tests/typing-sigsubst/*.annot +/testsuite/tests/typing-sigsubst/*.result +/testsuite/tests/typing-sigsubst/*.byte +/testsuite/tests/typing-sigsubst/*.native +/testsuite/tests/typing-sigsubst/program +/testsuite/tests/typing-sigsubst/.depend +/testsuite/tests/typing-sigsubst/.depend.nt +/testsuite/tests/typing-sigsubst/.DS_Store + +# /testsuite/tests/typing-typeparam/ +/testsuite/tests/typing-typeparam/*.o +/testsuite/tests/typing-typeparam/*.a +/testsuite/tests/typing-typeparam/*.so +/testsuite/tests/typing-typeparam/*.obj +/testsuite/tests/typing-typeparam/*.cm[ioxa] +/testsuite/tests/typing-typeparam/*.cmx[as] +/testsuite/tests/typing-typeparam/*.annot +/testsuite/tests/typing-typeparam/*.result +/testsuite/tests/typing-typeparam/*.byte +/testsuite/tests/typing-typeparam/*.native +/testsuite/tests/typing-typeparam/program +/testsuite/tests/typing-typeparam/.depend +/testsuite/tests/typing-typeparam/.depend.nt +/testsuite/tests/typing-typeparam/.DS_Store + +# /testsuite/tests/typing-warnings/ +/testsuite/tests/typing-warnings/*.o +/testsuite/tests/typing-warnings/*.a +/testsuite/tests/typing-warnings/*.so +/testsuite/tests/typing-warnings/*.obj +/testsuite/tests/typing-warnings/*.cm[ioxat] +/testsuite/tests/typing-warnings/*.cmx[as] +/testsuite/tests/typing-warnings/*.cmti +/testsuite/tests/typing-warnings/*.annot +/testsuite/tests/typing-warnings/*.result +/testsuite/tests/typing-warnings/*.byte +/testsuite/tests/typing-warnings/*.native +/testsuite/tests/typing-warnings/program +/testsuite/tests/typing-warnings/program.exe +/testsuite/tests/typing-warnings/.depend +/testsuite/tests/typing-warnings/.depend.nt +/testsuite/tests/typing-warnings/.DS_Store + +# /testsuite/tests/utils/ +/testsuite/tests/utils/*.o +/testsuite/tests/utils/*.a +/testsuite/tests/utils/*.so +/testsuite/tests/utils/*.obj +/testsuite/tests/utils/*.cm[ioxat] +/testsuite/tests/utils/*.cmx[as] +/testsuite/tests/utils/*.cmti +/testsuite/tests/utils/*.annot +/testsuite/tests/utils/*.result +/testsuite/tests/utils/*.byte +/testsuite/tests/utils/*.native +/testsuite/tests/utils/program +/testsuite/tests/utils/program.exe +/testsuite/tests/utils/.depend +/testsuite/tests/utils/.depend.nt +/testsuite/tests/utils/.DS_Store + +# /testsuite/tests/warnings/ +/testsuite/tests/warnings/*.o +/testsuite/tests/warnings/*.a +/testsuite/tests/warnings/*.so +/testsuite/tests/warnings/*.obj +/testsuite/tests/warnings/*.lib +/testsuite/tests/warnings/*.dll +/testsuite/tests/warnings/*.cm[ioxat] +/testsuite/tests/warnings/*.cmx[as] +/testsuite/tests/warnings/*.cmti +/testsuite/tests/warnings/*.annot +/testsuite/tests/warnings/*.result +/testsuite/tests/warnings/*.byte +/testsuite/tests/warnings/*.native +/testsuite/tests/warnings/program +/testsuite/tests/warnings/*.exe +/testsuite/tests/warnings/*.exe.manifest +/testsuite/tests/warnings/.depend +/testsuite/tests/warnings/.depend.nt +/testsuite/tests/warnings/.DS_Store + +# /tools/ +/tools/*.o +/tools/*.a +/tools/*.so +/tools/*.obj +/tools/*.lib +/tools/*.dll +/tools/*.cm[ioxat] +/tools/*.cmx[as] +/tools/*.cmti +/tools/*.annot +/tools/*.result +/tools/*.byte +/tools/*.native +/tools/program +/tools/*.exe +/tools/*.exe.manifest +/tools/.depend +/tools/.depend.nt +/tools/.DS_Store +/tools/ocamldep +/tools/ocamldep.opt +/tools/ocamldep.bak +/tools/ocamlprof +/tools/opnames.ml +/tools/dumpobj +/tools/dumpapprox +/tools/objinfo +/tools/cvt_emit +/tools/cvt_emit.bak +/tools/cvt_emit.ml +/tools/ocamlcp +/tools/ocamloptp +/tools/ocamlmktop +/tools/primreq +/tools/ocamldumpobj +/tools/keywords +/tools/lexer299.ml +/tools/ocaml299to3 +/tools/ocamlmklib +/tools/ocamlmklibconfig.ml +/tools/lexer301.ml +/tools/scrapelabels +/tools/addlabels +/tools/objinfo_helper +/tools/read_cmt +/tools/read_cmt.opt + +# /toplevel/ +/toplevel/.depend +/toplevel/configure +/toplevel/ocamlc +/toplevel/ocamlc.opt +/toplevel/expunge +/toplevel/ocaml +/toplevel/ocamlopt +/toplevel/ocamlopt.opt +/toplevel/ocamlcomp.sh +/toplevel/ocamlcompopt.sh +/toplevel/package-macosx +/toplevel/.DS_Store +/toplevel/*.annot +/toplevel/_boot_log1 +/toplevel/_boot_log2 +/toplevel/_build +/toplevel/_log +/toplevel/myocamlbuild_config.ml +/toplevel/ocamlnat +/toplevel/*.cm* +/toplevel/*.o + +# /typing/ +/typing/*.o +/typing/*.a +/typing/*.so +/typing/*.obj +/typing/*.dll +/typing/*.cm[ioxat] +/typing/*.cmx[as] +/typing/*.cmti +/typing/*.annot +/typing/*.result +/typing/*.byte +/typing/*.native +/typing/program +/typing/*.exe +/typing/.depend +/typing/.depend.nt +/typing/.DS_Store + +# /utils/ +/utils/*.o +/utils/*.a +/utils/*.so +/utils/*.obj +/utils/*.dll +/utils/*.cm[ioxat] +/utils/*.cmx[as] +/utils/*.cmti +/utils/*.annot +/utils/*.result +/utils/*.byte +/utils/*.native +/utils/program +/utils/*.exe +/utils/.depend +/utils/.depend.nt +/utils/.DS_Store +/utils/config.ml + +# /yacc/ +/yacc/*.o +/yacc/*.a +/yacc/*.so +/yacc/*.obj +/yacc/*.cm[ioxa] +/yacc/*.cmx[as] +/yacc/*.annot +/yacc/*.result +/yacc/*.byte +/yacc/*.native +/yacc/program +/yacc/program.exe +/yacc/.depend +/yacc/.depend.nt +/yacc/.DS_Store +/yacc/ocamlyacc +/yacc/ocamlyacc.exe +/yacc/version.h +/yacc/.gdb_history diff --git a/.ignore b/.ignore index 7e8d3f05..6dce10ee 100644 --- a/.ignore +++ b/.ignore @@ -8,12 +8,4 @@ ocamlopt.opt ocamlcomp.sh ocamlcompopt.sh package-macosx -_boot_log1 -_boot_log2 -_build -_start -_buildtest -_log -myocamlbuild_config.ml -ocamlbuild-mixed-boot ocamlnat diff --git a/.ocp-indent b/.ocp-indent new file mode 100644 index 00000000..324a3827 --- /dev/null +++ b/.ocp-indent @@ -0,0 +1,2 @@ +match_clause=4 +strict_with=auto diff --git a/.travis-ci.sh b/.travis-ci.sh new file mode 100644 index 00000000..788c997a --- /dev/null +++ b/.travis-ci.sh @@ -0,0 +1,18 @@ +case $XARCH in +i386) + ./configure + make world.opt + sudo make install + cd testsuite && make all + git clone git://github.com/ocaml/camlp4 + cd camlp4 && ./configure && make && sudo make install + git clone git://github.com/ocaml/opam + cd opam && ./configure && make lib-ext && make && sudo make install + opam init -y -a git://github.com/ocaml/opam-repository + opam install -y utop + ;; +*) + echo unknown arch + exit 1 + ;; +esac diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..3015c16d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: c +script: bash -ex .travis-ci.sh +env: + - XARCH=i386 diff --git a/Changes b/Changes index 1056294a..55c3b9a8 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,356 @@ +OCaml 4.02.0: +------------- + +(Changes that can break existing programs are marked with a "*") + +Language features: +- Attributes and extension nodes + (Alain Frisch) +- Generative functors (PR#5905) + (Jacques Garrigue) +- Module aliases + (Jacques Garrigue) +* Alternative syntax for string literals {id|...|id} (can break comments) + (Alain Frisch) +- Separation between read-only strings (type string) and read-write byte + sequences (type bytes). Activated by command-line option -safe-string. + (Damien Doligez) +- PR#6318: Exception cases in pattern matching + (Jeremy Yallop, backend by Alain Frisch) +- PR#5584: Extensible open datatypes + (Leo White) + +Build system for the OCaml distribution: +- Use -bin-annot when building. +- Use GNU make instead of portable makefiles. +- Updated build instructions for 32-bit Mac OS X on Intel hardware. + +Shedding weight: +* Removed Camlp4 from the distribution, now available as third-party software. +* Removed Labltk from the distribution, now available as a third-party library. + +Type system: +* PR#6235: Keep typing of pattern cases independent in principal mode + (i.e. information from previous cases is no longer used when typing + patterns; cf. 'PR#6235' in testsuite/test/typing-warnings/records.ml) + (Jacques Garrigue) +- Allow opening a first-class module or applying a generative functor + in the body of a generative functor. Allow it also in the body of + an applicative functor if no types are created + (Jacques Garrigue, suggestion by Leo White) +* Module aliases are now typed in a specific way, which remembers their + identity. In particular this changes the signature inferred by + "module type of" + (Jacques Garrigue, feedback from Leo White, Mark Shinwell and Nick Chapman) +- PR#6331: Slight change in the criterion to distinguish private + abbreviations and private row types: create a private abbreviation for + closed objects and fixed polymorphic variants. + (Jacques Garrigue) +* PR#6333: Compare first class module types structurally rather than + nominally. Value subtyping allows module subtyping as long as the internal + representation is unchanged. + (Jacques Garrigue) + +Compilers: +- More aggressive constant propagation, including float and + int32/int64/nativeint arithmetic. Constant propagation for floats + can be turned off with option -no-float-const-prop, for codes that + change FP rounding modes at run-time. + (Xavier Leroy) +- New back-end optimization pass: common subexpression elimination (CSE). + (Reuses results of previous computations instead of recomputing them.) + (Xavier Leroy) +- New back-end optimization pass: dead code elimination. + (Removes arithmetic and load instructions whose results are unused.) + (Xavier Leroy) +- PR#6269: Optimization of sequences of string patterns + (Benoît Vaugon and Luc Maranget) +- Experimental native code generator for AArch64 (ARM 64 bits) + (Xavier Leroy) +- PR#6042: Optimization of integer division and modulus by constant divisors + (Xavier Leroy and Phil Denys) +- Add "-open" command line flag for opening a single module before typing + (Leo White, Mark Shinwell and Nick Chapman) +* "-o" now sets module name to the output file name up to the first "." + (it also applies when "-o" is not given, i.e. the module name is then + the input file name up to the first ".") + (Leo White, Mark Shinwell and Nick Chapman) +* PR#5779: better sharing of structured constants + (Alain Frisch) +- PR#5817: new flag to keep locations in cmi files + (Alain Frisch) +- PR#5854: issue warning 3 when referring to a value marked with + the [@@ocaml.deprecated] attribute + (Alain Frisch, suggestion by Pierre-Marie Pédrot) +- PR#6017: a new format implementation based on GADTs + (Benoît Vaugon and Gabriel Scherer) +* PR#6203: Constant exception constructors no longer allocate + (Alain Frisch) +- PR#6260: avoid unnecessary boxing in let + (Vladimir Brankov) +- PR#6345: Better compilation of optional arguments with default values + (Alain Frisch, review by Jacques Garrigue) +- PR#6389: ocamlopt -opaque option for incremental native compilation + (Pierre Chambart, Gabriel Scherer) + +Toplevel interactive system: +- PR#5377: New "#show_*" directives + (ygrek, Jacques Garrigue and Alain Frisch) + +Runtime system: +- New configure option "-no-naked-pointers" to improve performance by + avoiding page table tests during block darkening and the marking phase + of the major GC. In this mode, all out-of-heap pointers must point at + things that look like OCaml values: in particular they must have a valid + header. The colour of said headers should be black. + (Mark Shinwell, reviews by Damien Doligez and Xavier Leroy) +- Fixed bug in native code version of [caml_raise_with_string] that could + potentially lead to heap corruption. + (Mark Shinwell) +- Blocks initialized by [CAMLlocal*] and [caml_alloc] are now filled with + [Val_unit] rather than zero. + (Mark Shinwell) +- Fixed a major performance problem on large heaps (~1GB) by making heap + increments proportional to heap size by default + (Damien Doligez) +- PR#4765: Structural equality treats exception specifically + (Alain Frisch) +- PR#5009: efficient comparison/indexing of exceptions + (Alain Frisch, request by Markus Mottl) +- PR#6075: avoid using unsafe C library functions (strcpy, strcat, sprintf) + (Xavier Leroy, reports from user 'jfc' and Anil Madhavapeddy) +- An ISO C99-compliant C compiler and standard library is now assumed. + (Plus special exceptions for MSVC.) In particular, emulation code for + 64-bit integer arithmetic was removed, the C compiler must support a + 64-bit integer type. + (Xavier Leroy) + +Standard library: +* Add new modules Bytes and BytesLabels for mutable byte sequences. + (Damien Doligez) +- PR#4986: add List.sort_uniq and Set.of_list + (Alain Frisch) +- PR#5935: a faster version of "raise" which does not maintain the backtrace + (Alain Frisch) +- PR#6146: support "Unix.kill pid Sys.sigkill" under Windows + (Romain Bardou and Alain Frisch) +- PR#6148: speed improvement for Buffer + (John Whitington) +- PR#6180: efficient creation of uninitialized float arrays + (Alain Frisch, request by Markus Mottl) +- PR#6355: Improve documentation regarding finalisers and multithreading + (Daniel Bünzli, Mark Shinwell) +- Trigger warning 3 for all values marked as deprecated in the documentation. + (Damien Doligez) + +OCamldoc: +- PR#6257: handle full doc comments for variant constructors and + record fields + (Maxence Guesdon, request by ygrek) +- PR#6274: allow doc comments on object types + (Thomas Refis) +- PR#6310: fix ocamldoc's subscript/superscript CSS font size + (Anil Madhavapeddy) +- PR#6425: fix generation of man pages + (Maxence Guesdon, report by Anil Madhavapeddy) + +Bug fixes: +- PR#2719: wrong scheduling of bound checks within a + try...with Invalid_argument -> _ ... (Xavier Leroy) +- PR#4719: Sys.executable_name wrong if executable name contains dots (Windows) + (Alain Frisch, report by Bart Jacobs) +- PR#5406 ocamlbuild: "tag 'package' does not expect a parameter" + (Gabriel Scherer) +- PR#5598, PR#6165: Alterations to handling of \013 in source files + breaking other tools + (David Allsopp and Damien Doligez) +- PR#5820: Fix camlp4 lexer roll back problem + (Hongbo Zhang) +- PR#5946: CAMLprim taking (void) as argument + (Benoît Vaugon) +- PR#6038: on x86-32, enforce 16-byte stack alignment for compatibility + with recent GCC and Clang. Win32/MSVC keeps 4-byte stack alignment. + (Xavier Leroy) +- PR#6062: Fix a 4.01 camlp4 DELETE_RULE regression caused by commit 13047 + (Hongbo Zhang, report by Christophe Troestler) +- PR#6173: Typing error message is worse than before + (Jacques Garrigue and John Whitington) +- PR#6174: OCaml compiler loops on an example using GADTs (-rectypes case) + (Jacques Garrigue and Grégoire Henry, report by Chantal Keller) +- PR#6175: open! was not suppored by camlp4 + (Hongbo Zhang) +- PR#6184: ocamlbuild: `ocamlfind ocamldep` does not support -predicate + (Jacques-Pascal Deplaix) +- PR#6194: Incorrect unused warning with first-class modules in patterns + (Jacques Garrigue, report by Markus Mottl and Leo White) +- PR#6211: in toplevel interactive use, bad interaction between uncaught + exceptions and multiple bindings of the form "let x = a let y = b;;". + (Xavier Leroy) +- PR#6216: inlining of GADT matches generates invalid assembly + (Xavier Leroy and Alain Frisch, report by Mark Shinwell) +- PR#6232: Don't use [mktemp] on platforms where [mkstemp] is available + (Stéphane Glondu, Mark Shinwell) +- PR#6233: out-of-bounds exceptions lose their locations on ARM, PowerPC + (Jacques-Henri Jourdan and Xavier Leroy, + report and testing by Stéphane Glondu) +- PR#6235: Issue with type information flowing through a variant pattern + (Jacques Garrigue, report by Hongbo Zhang) +- PR#6239: sometimes wrong stack alignment when raising exceptions + in -g mode with backtraces active + (Xavier Leroy, report by Yaron Minsky) +- PR#6240: Fail to expand module type abbreviation during substyping + (Jacques Garrigue, report by Leo White) +- PR#6241: Assumed inequality between paths involving functor arguments + (Jacques Garrigue, report by Jeremy Yallop) +- PR#6243: Make "ocamlopt -g" more resistant to ill-formed locations + (Xavier Leroy, report by Pierre-Marie Pédrot) +- PR#6262: equality of first-class modules take module aliases into account + (Alain Frisch and Leo White) +- PR#6268: -DMODEL_$(MODEL) not passed when building asmrun/arm.p.o + (Peter Michael Green) +- PR#6273: fix Sys.file_exists on large files (Win32) + (Christoph Bauer) +- PR#6275: Soundness bug related to type constraints + (Jacques Garrigue, report by Leo White) +- PR#6293: Assert_failure with invalid package type + (Jacques Garrigue, report by Elnatan Reisner) +- PR#6300: ocamlbuild -use-ocamlfind conflicts with -ocamlc + (Gabriel Scherer) +- PR#6302: bytecode debug information re-read from filesystem every time + (Jacques-Henri Jourdan) +- PR#6307: Behavior of 'module type of' w.r.t. module aliases + (Jacques Garrigue, report by Alain Frisch) +- PR#6332: Unix.open_process fails to pass empty arguments under Windows + (Damien Doligez, report Virgile Prevosto) +- PR#6346: Build failure with latest version of xcode on OSX + (Jérémie Dimino) +- PR#6348: Unification failure for GADT when original definition is hidden + (Leo White and Jacques Garrigue, report by Jeremy Yallop) +- PR#6352: Automatic removal of optional arguments and sequencing + (Jacques Garrigue and Alain Frisch) +- PR#6361: Hashtbl.hash not terminating on some lazy values w/ recursive types + (Xavier Leroy, report by Leo White) +- PR#6383: Exception Not_found when using object type in absent module + (Jacques Garrigue, report by Sébastien Briais) +- PR#6384: Uncaught Not_found exception with a hidden .cmi file + (Leo White) +- PR#6385: wrong allocation of large closures by the bytecode interpreter + (Xavier Leroy, report by Stephen Dolan) +- PR#6394: Assertion failed in Typecore.expand_path + (Alain Frisch and Jacques Garrigue) +- PR#6405: unsound interaction of -rectypes and GADTs + (Jacques Garrigue, report by Gabriel Scherer and Benoît Vaugon) +- PR#6408: Optional arguments given as ~?arg instead of ?arg in message + (Michael O'Connor) +- PR#6411: missing libgcc_s_sjlj-1.dll in mingw (add -static-libgcc) + (Jun Furuse and Alain Frisch, Jonathan Protzenko and Adrien Nader) +- PR#6436: Typos in @deprecated text in stdlib/arrayLabels.mli + (John Whitington) +- PR#6439: Don't use the deprecated [getpagesize] function + (John Whitington, Mark Shinwell) +- PR#6441: undetected tail-call in some mutually-recursive functions + (many arguments, and mutual block mixes functions and non-functions) + (Stefan Holdermans, review by Xavier Leroy) +- PR#6443: ocaml segfault when List.fold_left is traced then executed + (Jacques Garrigue, report by user 'Reventlov') +- PR#6451: some bugs in untypeast.ml + (Jun Furuse, review by Alain Frisch) +- PR#6460: runtime assertion failure with large [| e1;...eN |] + float array expressions + (Leo White) +- PR#6463: -dtypedtree fails on class fields + (Leo White) +- PR#6469: invalid -dsource printing of "external _pipe = ...", "Pervasives.(!)" + (Gabriel Scherer and Damien Doligez, user 'ngunn') +- PR#6482: ocamlbuild fails when _tags file in unhygienic directory + (Gabriel Scherer) +- PR#6502: ocamlbuild spurious warning on "use_menhir" tag + (Xavier Leroy) +- PR#6505: Missed Type-error leads to a segfault upon record access + (Jacques Garrigue, Jeremy Yallop, report by Christoph Höger) +- PR#6507: crash on AArch64 resulting from incorrect setting of + [caml_bottom_of_stack]. (Richard Jones, Mark Shinwell) +- PR#6509: add -linkall flag to ocamlcommon.cma + (Frédéric Bour) +- PR#6513: Fatal error Ctype.Unify(_) in functor type +- PR#6523: failure upon character bigarray access, and unnecessary change + in comparison ordering (Jeremy Yallop, Mark Shinwell) +- bound-checking bug in caml_string_{get,set}{16,32,64} + (Pierre Chambart and Gabriel Scherer, report by Nicolas Trangez) +- sometimes wrong stack alignment at out-of-bounds array access + (Gabriel Scherer and Xavier Leroy, report by Pierre Chambart) + +Features wishes: +- PR#4243: make the Makefiles parallelizable + (Grégoire Henry and Damien Doligez) +- PR#4323: have "of_string" in Num and Big_int work with binary and + hex representations + (Zoe Paraskevopoulou, review by Gabriel Scherer) +- PR#4771: Clarify documentation of Dynlink.allow_only + (Damien Doligez, report by David Allsopp) +- PR#4855: 'camlp4 -I +dir' accepted, dir is relative to 'camlp4 -where' + (Jun Furuse and Hongbo Zhang, report by Dmitry Grebeniuk) +- PR#5201: ocamlbuild: add --norc to the bash invocation to help performances + (user 'daweil') +- PR#5650: Camlp4FoldGenerator doesn't handle well "abstract" types + (Hongbo Zhang) +- PR#5808: allow simple patterns, not just identifiers, in "let p : t = ..." + (Alain Frisch) +- PR#5851: warn when -r is disabled because no _tags file is present + (Gabriel Scherer) +- PR#5899: a programmer-friendly access to backtrace information + (Jacques-Henri Jourdan and Gabriel Scherer) +- PR#6000 comment 9644: add a warning for non-principal coercions to format + (Jacques Garrigue, report by Damien Doligez) +- PR#6054: add support for M.[ foo ], M.[| foo |] etc. + (Kaustuv Chaudhuri) +- PR#6064: GADT representation for Bigarray.kind + CAML_BA_CHAR runtime kind + (Jeremy Yallop, review by Gabriel Scherer) +- PR#6071: Add a -noinit option to the toplevel + (David Sheets) +- PR#6087: ocamlbuild, improve _tags parsing of escaped newlines + (Gabriel Scherer, request by Daniel Bünzli) +- PR#6109: Typos in ocamlbuild error messages + (Gabriel Kerneis) +- PR#6116: more efficient implementation of Digest.to_hex + (ygrek) +- PR#6142: add cmt file support to ocamlobjinfo + (Anil Madhavapeddy) +- PR#6166: document -ocamldoc option of ocamlbuild + (Xavier Clerc) +- PR#6182: better message for virtual objects and class types + (Leo White, Stephen Dolan) +- PR#6183: enhanced documentation for 'Unix.shutdown_connection' + (Anil Madhavapeddy, report by Jun Furuse) +- PR#6187: ocamlbuild: warn when using -plugin-tag(s) without myocamlbuild.ml + (Jacques-Pascal Deplaix) +- PR#6246: allow wildcard _ as for-loop index + (Alain Frisch, request by ygrek) +- PR#6267: more information printed by "bt" command of ocamldebug + (Josh Watzman) +- PR#6270: remove need for -I directives to ocamldebug in common case + (Josh Watzman, review by Xavier Clerc and Alain Frisch) +- PR#6311: Improve signature mismatch error messages + (Alain Frisch, suggestion by Daniel Bünzli) +- PR#6358: obey DESTDIR in install targets + (Gabriel Scherer, request by François Berenger) +- PR#6388, PR#6424: more parsetree correctness checks for -ppx users + (Alain Frisch, request by Peter Zotov and Jun Furuse) +- PR#6406: Expose OCaml version in C headers + (Peter Zotov and Romain Calascibetta) +- PR#6446: improve "unused declaration" warnings wrt. name shadowing + (Alain Frisch) +- PR#6495: ocamlbuild tags 'safe_string', 'unsafe_string' + (Anil Madhavapeddy) +- PR#6497: pass context information to -ppx preprocessors + (Peter Zotov, Alain Frisch) +- ocamllex: user-definable refill action + (Frédéric Bour, review by Gabriel Scherer and Luc Maranget) +- shorten syntax for functor signatures: "functor (M1:S1) (M2:S2) .. -> .." + (Thomas Gazagnaire and Jeremy Yallop, review by Gabriel Scherer) +- make ocamldebug -I auto-detection work with ocamlbuild + (Josh Watzman) + OCaml 4.01.0: ------------- @@ -69,6 +422,9 @@ Standard library: (Xavier Leroy) - infix application operators |> and @@ in Pervasives (Fabrice Le Fessant) +- PR#6176: new Format.asprintf function with a %a formatter + compatible with Format.fprintf (unlike Format.sprintf) + (Pierre Weis) Other libraries: - PR#5568: add O_CLOEXEC flag to Unix.openfile, so that the returned @@ -150,7 +506,7 @@ Bug fixes: (Alain Frisch) - PR#5552: unrecognized gcc option -no-cpp-precomp (Damien Doligez, report by Markus Mottl) -- PR#5580: missed opportunities for constant propagation +* PR#5580: missed opportunities for constant propagation (Xavier Leroy and John Carr) - PR#5611: avoid clashes betwen .cmo files and output files during linking (Wojciech Meyer) @@ -347,8 +703,6 @@ Bug fixes: (Jacques Garrigue, report by Elnatan Reisner) - PR#6058: 'ocamlbuild -use-ocamlfind -tag thread -package threads t.cma' fails (Gabriel Scherer, report by Hezekiah M. Carty) -- PR#6060: ocamlbuild rules for -principal, -strict-sequence and -short-paths - (Anil Madhavapeddy) - PR#6069: ocamldoc: lexing: empty token (Maxence Guesdon, Grégoire Henry, report by ygrek) - PR#6072: configure does not handle FreeBSD current (i.e. 10) correctly @@ -370,6 +724,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 @@ -412,6 +768,10 @@ Feature wishes: (Anil Madhavapeddy, review by Benedikt Meurer) - PR#6059: add -output-obj rules for ocamlbuild (Anil Madhavapeddy) +- PR#6060: ocamlbuild tags 'principal', 'strict_sequence' and 'short_paths' + (Anil Madhavapeddy) +- ocamlbuild tag 'no_alias_deps' + (Daniel Bünzli) Tools: - OCamlbuild now features a bin_annot tag to generate .cmt files. @@ -563,6 +923,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/INSTALL b/INSTALL index 813f2bf8..63ae5c67 100644 --- a/INSTALL +++ b/INSTALL @@ -15,11 +15,11 @@ PREREQUISITES are all *required*. The vendor-provided compiler, assembler and make have major problems. -* GNU make is needed to build ocamlbuild and camlp4. If your system's - default make is not GNU make, you need to define the GNUMAKE environment +* GNU make is needed to build ocamlbuild. If your system's default + make is not GNU make, you need to define the GNUMAKE environment variable to the name of GNU make, typically with this command: - export GNUMAKE=gnumake + export GNUMAKE=gmake INSTALLATION INSTRUCTIONS @@ -65,29 +65,20 @@ The "configure" script accepts the following options: hand. The installation instructions for gcc or emacs contain a complete list of configuration names. +-target (default: same as -host) + The type of the target machine, in GNU's "configuration name" + format (CPU-COMPANY-SYSTEM or CPU-COMPANY-KERNEL-SYSTEM). + Setting this will setup OCaml as a cross-compiler which runs on + $host and produces code for $target. This requires a C toolchain + which also produces code for $target and a native OCaml + compiler of the exact same version (if you want a cross 4.00.1, + you need a native 4.00.1). + -x11include (default: determined automatically) -x11lib (default: determined automatically) Location of the X11 include directory (e.g. /usr/X11R6/include) and the X11 library directory (e.g. /usr/X11R6/lib). --tkdefs (default: none) --tklibs (default: determined automatically) - These options specify where to find the Tcl/Tk libraries for - LablTk. "-tkdefs" helps to find the headers, and "-tklibs" - the C libraries. "-tklibs" may contain either only -L/path and - -Wl,... flags, in which case the library names are determined - automatically, or the actual libraries, which are used as given. - Example: for a Japanese tcl/tk whose headers are in specific - directories and libraries in /usr/local/lib, you can use - ./configure -tklibs "-L/usr/local/lib -ltk8.0jp -ltcl8.0jp" - -tkdefs "-I/usr/local/include/tcl8.0jp -I/usr/local/include/tk8.0jp" - --tk-no-x11 - Build LablTk without using X11. This option is needed on Cygwin. - --no-tk - Do not attempt to build LablTk. - -no-pthread Do not attempt to use POSIX threads. @@ -120,8 +111,14 @@ The "configure" script accepts the following options: Verbose output of the configuration tests. Use it if the outcome of configure is not what you were expecting. --no-camlp4 - Do not compile Camlp4. +-no-debugger + Do not build ocamldebug. + +-no-ocamldoc + Do not build ocamldoc. + +-no-ocamlbuild + Do not build ocamlbuild. -no-graph Do not compile the Graphics library. @@ -156,8 +153,9 @@ Examples: to build a 64-bit version of OCaml: ./configure -cc "gcc -m64" - On a MacOSX 10.6/Intel Core 2, to build a 32-bit version of OCaml: - ./configure -cc "gcc -m32" -as "as -arch i386" -aspp "gcc -m32 -c" + On Intel Mac OS X, to build a 32-bit version of OCaml: + ./configure -host "i386-apple-darwin13.2.0" -cc "gcc -arch i386 -m32" \ + -as "as -arch i386" -aspp "gcc -arch i386 -m32 -c" For Sun Solaris with the "acc" compiler: ./configure -cc "acc -fast" -libs "-lucb" @@ -320,6 +318,9 @@ Fix: do not pass the -j option to make, and be patient. * The Makefiles use the "include" directive, which is not supported by all versions of make. Use GNU make if this is a problem. +* Solaris make mishandles a space in our Makefiles, so you have to use GNU +make to build on Solaris. + * The Makefiles assume that make executes commands by calling /bin/sh. They won't work if /bin/csh is called instead. You may have to unset the SHELL environment variable, or set it to /bin/sh. diff --git a/LICENSE b/LICENSE index 29b5c850..8209011f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,7 @@ In the following, "the Library" refers to all files marked "Copyright INRIA" in the following directories and their sub-directories: - asmrun, byterun, camlp4, config, otherlibs, stdlib, win32caml + asmrun, byterun, config, otherlibs, stdlib, win32caml and "the Compiler" refers to all files marked "Copyright INRIA" in the following directories and their sub-directories: diff --git a/Makefile b/Makefile index 10c80d2f..733ed99d 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,8 @@ include stdlib/StdlibModules CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink -COMPFLAGS=-strict-sequence -w +33..39 -warn-error A $(INCLUDES) +COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot \ + -safe-string $(INCLUDES) LINKFLAGS= CAMLYACC=boot/ocamlyacc @@ -29,8 +30,10 @@ CAMLRUN=byterun/ocamlrun SHELL=/bin/sh MKDIR=mkdir -p -CAMLP4OUT=$(CAMLP4:=out) -CAMLP4OPT=$(CAMLP4:=opt) +OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) +OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) + +OCAMLDOC_OPT=$(WITH_OCAMLDOC:=.opt) INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver \ -I toplevel @@ -40,6 +43,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ + parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ @@ -53,8 +57,8 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ typing/printtyp.cmo typing/includeclass.cmo \ typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ - typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ typing/typedtreeIter.cmo typing/typedtreeMap.cmo typing/cmt_format.cmo \ + typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ typing/stypes.cmo typing/typecore.cmo \ typing/typedecl.cmo typing/typeclass.cmo \ typing/typemod.cmo @@ -79,12 +83,15 @@ ASMCOMP=asmcomp/arch.cmo asmcomp/debuginfo.cmo \ asmcomp/cmm.cmo asmcomp/printcmm.cmo \ asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \ asmcomp/clambda.cmo asmcomp/printclambda.cmo asmcomp/compilenv.cmo \ - asmcomp/closure.cmo asmcomp/cmmgen.cmo \ + asmcomp/closure.cmo asmcomp/strmatch.cmo asmcomp/cmmgen.cmo \ asmcomp/printmach.cmo asmcomp/selectgen.cmo asmcomp/selection.cmo \ - asmcomp/comballoc.cmo asmcomp/liveness.cmo \ + asmcomp/comballoc.cmo \ + asmcomp/CSEgen.cmo asmcomp/CSE.cmo \ + asmcomp/liveness.cmo \ asmcomp/spill.cmo asmcomp/split.cmo \ asmcomp/interf.cmo asmcomp/coloring.cmo \ asmcomp/reloadgen.cmo asmcomp/reload.cmo \ + asmcomp/deadcode.cmo \ asmcomp/printlinear.cmo asmcomp/linearize.cmo \ asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ @@ -116,8 +123,12 @@ defaultentry: @echo "should work. But see the file INSTALL for more details." # Recompile the system using the bootstrap compiler -all: runtime ocamlc ocamllex ocamlyacc ocamltools library ocaml \ - otherlibraries ocamlbuild.byte $(CAMLP4OUT) $(DEBUGGER) ocamldoc +all: + $(MAKE) runtime + $(MAKE) coreall + $(MAKE) ocaml + $(MAKE) otherlibraries $(OCAMLBUILDBYTE) $(WITH_DEBUGGER) \ + $(WITH_OCAMLDOC) # Compile everything the first time world: @@ -134,11 +145,10 @@ world.opt: # # make coreboot [old system -- you were in a stable state] # -# make core [cross-compiler] -# make partialclean [if you get "inconsistent assumptions"] +# make clean runtime coreall # -# make core [cross-compiler] -# make coreboot [new system -- now you are in a stable state] +# make clean runtime coreall +# make coreboot [new system -- now in a stable state] # Core bootstrapping cycle coreboot: @@ -185,10 +195,14 @@ coldstart: ln -s ../byterun stdlib/caml; fi # Build the core system: the minimum needed to make depend and bootstrap -core: coldstart ocamlc ocamllex ocamlyacc ocamltools library +core: + $(MAKE) coldstart + $(MAKE) coreall # Recompile the core system using the bootstrap compiler -coreall: ocamlc ocamllex ocamlyacc ocamltools library +coreall: + $(MAKE) ocamlc + $(MAKE) ocamllex ocamlyacc ocamltools library # Save the current bootstrap compiler MAXSAVED=boot/Saved/Saved.prev/Saved.prev/Saved.prev/Saved.prev/Saved.prev @@ -245,86 +259,112 @@ opt: $(MAKE) runtimeopt $(MAKE) ocamlopt $(MAKE) libraryopt - $(MAKE) otherlibrariesopt - $(MAKE) ocamltoolsopt - $(MAKE) ocamlbuildlib.native + $(MAKE) otherlibrariesopt ocamltoolsopt $(OCAMLBUILDNATIVE) # Native-code versions of the tools -opt.opt: checkstack runtime core ocaml opt-core ocamlc.opt otherlibraries \ - $(DEBUGGER) ocamldoc ocamlbuild.byte $(CAMLP4OUT) \ - ocamlopt.opt otherlibrariesopt ocamllex.opt \ - ocamltoolsopt ocamltoolsopt.opt ocamldoc.opt ocamlbuild.native \ - $(CAMLP4OPT) +opt.opt: + $(MAKE) checkstack + $(MAKE) runtime + $(MAKE) core + $(MAKE) ocaml + $(MAKE) opt-core + $(MAKE) ocamlc.opt + $(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC) \ + $(OCAMLBUILDBYTE) + $(MAKE) ocamlopt.opt + $(MAKE) otherlibrariesopt + $(MAKE) ocamllex.opt ocamltoolsopt ocamltoolsopt.opt $(OCAMLDOC_OPT) \ + $(OCAMLBUILDNATIVE) -base.opt: checkstack runtime core ocaml opt-core ocamlc.opt otherlibraries \ - ocamlbuild.byte $(CAMLP4OUT) $(DEBUGGER) ocamldoc ocamlopt.opt \ - otherlibrariesopt +base.opt: + $(MAKE) checkstack + $(MAKE) runtime + $(MAKE) core + $(MAKE) ocaml + $(MAKE) opt-core + $(MAKE) ocamlc.opt + $(MAKE) otherlibraries $(OCAMLBUILDBYTE) $(WITH_DEBUGGER) \ + $(WITH_OCAMLDOC) + $(MAKE) ocamlopt.opt + $(MAKE) otherlibrariesopt # Installation COMPLIBDIR=$(LIBDIR)/compiler-libs +INSTALL_BINDIR=$(DESTDIR)$(BINDIR) +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) +INSTALL_COMPLIBDIR=$(DESTDIR)$(COMPLIBDIR) +INSTALL_STUBLIBDIR=$(DESTDIR)$(STUBLIBDIR) +INSTALL_MANDIR=$(DESTDIR)$(MANDIR) + install: - if test -d $(BINDIR); then : ; else $(MKDIR) $(BINDIR); fi - if test -d $(LIBDIR); then : ; else $(MKDIR) $(LIBDIR); fi - if test -d $(STUBLIBDIR); then : ; else $(MKDIR) $(STUBLIBDIR); fi - if test -d $(COMPLIBDIR); then : ; else $(MKDIR) $(COMPLIBDIR); fi - if test -d $(MANDIR)/man$(MANEXT); then : ; \ - else $(MKDIR) $(MANDIR)/man$(MANEXT); fi - cp VERSION $(LIBDIR)/ - cd $(LIBDIR); rm -f dllbigarray.so dlllabltk.so dllnums.so \ - dllthreads.so dllunix.so dllgraphics.so dllstr.so \ - dlltkanim.so + if test -d $(INSTALL_BINDIR); then : ; \ + else $(MKDIR) $(INSTALL_BINDIR); fi + if test -d $(INSTALL_LIBDIR); then : ; \ + else $(MKDIR) $(INSTALL_LIBDIR); fi + if test -d $(INSTALL_STUBLIBDIR); then : ; \ + else $(MKDIR) $(INSTALL_STUBLIBDIR); fi + if test -d $(INSTALL_COMPLIBDIR); then : ; \ + else $(MKDIR) $(INSTALL_COMPLIBDIR); fi + if test -d $(INSTALL_MANDIR)/man$(MANEXT); then : ; \ + else $(MKDIR) $(INSTALL_MANDIR)/man$(MANEXT); fi + cp VERSION $(INSTALL_LIBDIR)/ + cd $(INSTALL_LIBDIR); rm -f dllbigarray.so dllnums.so dllthreads.so \ + dllunix.so dllgraphics.so dllstr.so cd byterun; $(MAKE) install - cp ocamlc $(BINDIR)/ocamlc$(EXE) - cp ocaml $(BINDIR)/ocaml$(EXE) + cp ocamlc $(INSTALL_BINDIR)/ocamlc$(EXE) + cp ocaml $(INSTALL_BINDIR)/ocaml$(EXE) cd stdlib; $(MAKE) install - cp lex/ocamllex $(BINDIR)/ocamllex$(EXE) - cp yacc/ocamlyacc$(EXE) $(BINDIR)/ocamlyacc$(EXE) + cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex$(EXE) + cp yacc/ocamlyacc$(EXE) $(INSTALL_BINDIR)/ocamlyacc$(EXE) cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ - toplevel/*.cmi $(COMPLIBDIR) + toplevel/*.cmi $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ compilerlibs/ocamltoplevel.cma $(BYTESTART) $(TOPLEVELSTART) \ - $(COMPLIBDIR) - cp expunge $(LIBDIR)/expunge$(EXE) - cp toplevel/topdirs.cmi $(LIBDIR) + $(INSTALL_COMPLIBDIR) + cp expunge $(INSTALL_LIBDIR)/expunge$(EXE) + cp toplevel/topdirs.cmi $(INSTALL_LIBDIR) cd tools; $(MAKE) install -cd man; $(MAKE) install for i in $(OTHERLIBRARIES); do \ (cd otherlibs/$$i; $(MAKE) install) || exit $$?; \ done - cd ocamldoc; $(MAKE) install - if test -f ocamlopt; then $(MAKE) installopt; else :; fi - if test -f debugger/ocamldebug; then (cd debugger; $(MAKE) install); \ + if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKE) install); else :; fi + if test -n "$(WITH_DEBUGGER)"; then (cd debugger; $(MAKE) install); \ + else :; fi + if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) install); \ else :; fi - cp config/Makefile $(LIBDIR)/Makefile.config - BINDIR=$(BINDIR) LIBDIR=$(LIBDIR) PREFIX=$(PREFIX) \ - ./build/partial-install.sh + cp config/Makefile $(INSTALL_LIBDIR)/Makefile.config + if test -f ocamlopt; then $(MAKE) installopt; else :; fi # Installation of the native-code compiler installopt: cd asmrun; $(MAKE) install - cp ocamlopt $(BINDIR)/ocamlopt$(EXE) + cp ocamlopt $(INSTALL_BINDIR)/ocamlopt$(EXE) cd stdlib; $(MAKE) installopt - cp asmcomp/*.cmi $(COMPLIBDIR) - cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(COMPLIBDIR) - cd ocamldoc; $(MAKE) installopt + cp asmcomp/*.cmi $(INSTALL_COMPLIBDIR) + cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(INSTALL_COMPLIBDIR) + if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKE) installopt); \ + else :; fi + if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) installopt); \ + else :; fi for i in $(OTHERLIBRARIES); \ do (cd otherlibs/$$i; $(MAKE) installopt) || exit $$?; done if test -f ocamlopt.opt ; then $(MAKE) installoptopt; fi cd tools; $(MAKE) installopt installoptopt: - cp ocamlc.opt $(BINDIR)/ocamlc.opt$(EXE) - cp ocamlopt.opt $(BINDIR)/ocamlopt.opt$(EXE) - cp lex/ocamllex.opt $(BINDIR)/ocamllex.opt$(EXE) + cp ocamlc.opt $(INSTALL_BINDIR)/ocamlc.opt$(EXE) + cp ocamlopt.opt $(INSTALL_BINDIR)/ocamlopt.opt$(EXE) + cp lex/ocamllex.opt $(INSTALL_BINDIR)/ocamllex.opt$(EXE) cp compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.a \ compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.a \ compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.a \ $(BYTESTART:.cmo=.cmx) $(BYTESTART:.cmo=.o) \ $(OPTSTART:.cmo=.cmx) $(OPTSTART:.cmo=.o) \ - $(COMPLIBDIR) - cd $(COMPLIBDIR) && $(RANLIB) ocamlcommon.a ocamlbytecomp.a \ + $(INSTALL_COMPLIBDIR) + cd $(INSTALL_COMPLIBDIR) && $(RANLIB) ocamlcommon.a ocamlbytecomp.a \ ocamloptcomp.a clean:: partialclean @@ -332,7 +372,7 @@ clean:: partialclean # Shared parts of the system compilerlibs/ocamlcommon.cma: $(COMMON) - $(CAMLC) -a -o $@ $(COMMON) + $(CAMLC) -a -linkall -o $@ $(COMMON) partialclean:: rm -f compilerlibs/ocamlcommon.cma @@ -346,9 +386,6 @@ partialclean:: ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc \ compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) - @sed -e 's|@compiler@|$$topdir/boot/ocamlrun $$topdir/ocamlc|' \ - driver/ocamlcomp.sh.in > ocamlcomp.sh - @chmod +x ocamlcomp.sh # The native-code compiler @@ -360,12 +397,9 @@ partialclean:: ocamlopt: compilerlibs/ocamlcommon.cma compilerlibs/ocamloptcomp.cma $(OPTSTART) $(CAMLC) $(LINKFLAGS) -o ocamlopt \ compilerlibs/ocamlcommon.cma compilerlibs/ocamloptcomp.cma $(OPTSTART) - @sed -e 's|@compiler@|$$topdir/boot/ocamlrun $$topdir/ocamlopt|' \ - driver/ocamlcomp.sh.in > ocamlcompopt.sh - @chmod +x ocamlcompopt.sh partialclean:: - rm -f ocamlopt ocamlcompopt.sh + rm -f ocamlopt # The toplevel @@ -425,8 +459,9 @@ utils/config.ml: utils/config.mlp config/Makefile -e 's|%%MKDLL%%|$(MKDLL)|' \ -e 's|%%MKEXE%%|$(MKEXE)|' \ -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ + -e 's|%%HOST%%|$(HOST)|' \ + -e 's|%%TARGET%%|$(TARGET)|' \ utils/config.mlp > utils/config.ml - @chmod -w utils/config.ml partialclean:: rm -f utils/config.ml @@ -456,7 +491,7 @@ beforedepend:: parsing/lexer.ml # Shared parts of the system compiled with the native-code compiler compilerlibs/ocamlcommon.cmxa: $(COMMON:.cmo=.cmx) - $(CAMLOPT) -a -o $@ $(COMMON:.cmo=.cmx) + $(CAMLOPT) -a -linkall -o $@ $(COMMON:.cmo=.cmx) partialclean:: rm -f compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.a @@ -472,9 +507,6 @@ ocamlc.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa \ $(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o ocamlc.opt \ compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa \ $(BYTESTART:.cmo=.cmx) -cclib "$(BYTECCLIBS)" - @sed -e 's|@compiler@|$$topdir/ocamlc.opt|' \ - driver/ocamlcomp.sh.in > ocamlcomp.sh - @chmod +x ocamlcomp.sh partialclean:: rm -f ocamlc.opt @@ -491,9 +523,6 @@ ocamlopt.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ $(CAMLOPT) $(LINKFLAGS) -o ocamlopt.opt \ compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ $(OPTSTART:.cmo=.cmx) - @sed -e 's|@compiler@|$$topdir/ocamlopt.opt|' \ - driver/ocamlcomp.sh.in > ocamlcompopt.sh - @chmod +x ocamlcompopt.sh partialclean:: rm -f ocamlopt.opt @@ -556,6 +585,14 @@ partialclean:: beforedepend:: asmcomp/selection.ml +asmcomp/CSE.ml: asmcomp/$(ARCH)/CSE.ml + ln -s $(ARCH)/CSE.ml asmcomp/CSE.ml + +partialclean:: + rm -f asmcomp/CSE.ml + +beforedepend:: asmcomp/CSE.ml + asmcomp/reload.ml: asmcomp/$(ARCH)/reload.ml ln -s $(ARCH)/reload.ml asmcomp/reload.ml @@ -666,13 +703,15 @@ clean:: # Tools -ocamltools: ocamlc ocamlyacc ocamllex asmcomp/cmx_format.cmi +ocamltools: ocamlc ocamlyacc ocamllex asmcomp/cmx_format.cmi \ + asmcomp/printclambda.cmo cd tools; $(MAKE) all ocamltoolsopt: ocamlopt cd tools; $(MAKE) opt -ocamltoolsopt.opt: ocamlc.opt ocamlyacc ocamllex asmcomp/cmx_format.cmi +ocamltoolsopt.opt: ocamlc.opt ocamlyacc ocamllex asmcomp/cmx_format.cmi \ + asmcomp/printclambda.cmx cd tools; $(MAKE) opt.opt partialclean:: @@ -689,6 +728,12 @@ ocamldoc: ocamlc ocamlyacc ocamllex otherlibraries ocamldoc.opt: ocamlc.opt ocamlyacc ocamllex cd ocamldoc && $(MAKE) opt.opt +# Documentation + +html_doc: ocamldoc + make -C ocamldoc html_doc + @echo "documentation is in ./ocamldoc/stdlib_html/" + partialclean:: cd ocamldoc && $(MAKE) clean @@ -709,11 +754,11 @@ otherlibrariesopt: partialclean:: for i in $(OTHERLIBRARIES); do \ - (cd otherlibs/$$i; $(MAKE) partialclean); \ + (cd otherlibs/$$i && $(MAKE) partialclean); \ done clean:: - for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) clean); done + for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i && $(MAKE) clean); done alldepend:: for i in $(OTHERLIBRARIES); do (cd otherlibs/$$i; $(MAKE) depend); done @@ -729,39 +774,25 @@ partialclean:: alldepend:: cd debugger; $(MAKE) depend -# Camlp4 - -camlp4out: ocamlc ocamlbuild.byte - ./build/camlp4-byte-only.sh - -camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ocamlbuild.native - ./build/camlp4-native-only.sh - # Ocamlbuild -#ifeq ($(OCAMLBUILD_NOBOOT),"yes") -#ocamlbuild.byte: ocamlc -# $(MAKE) -C ocamlbuild -f Makefile.noboot -#else -ocamlbuild.byte: ocamlc ocamlbuild-mixed-boot - ./build/ocamlbuild-byte-only.sh -#endif -ocamlbuild.native: ocamlopt ocamlbuild-mixed-boot otherlibrariesopt - ./build/ocamlbuild-native-only.sh -ocamlbuildlib.native: ocamlopt ocamlbuild-mixed-boot otherlibrariesopt - ./build/ocamlbuildlib-native-only.sh +ocamlbuild.byte: ocamlc otherlibraries + cd ocamlbuild && $(MAKE) all -ocamlbuild-mixed-boot: ocamlc - ./build/mixed-boot.sh - touch ocamlbuild-mixed-boot +ocamlbuild.native: ocamlopt otherlibrariesopt + cd ocamlbuild && $(MAKE) allopt partialclean:: - rm -rf _build ocamlbuild-mixed-boot + cd ocamlbuild && $(MAKE) clean + +alldepend:: + cd ocamlbuild && $(MAKE) depend # Check that the stack limit is reasonable. checkstack: - @if $(BYTECC) -o tools/checkstack tools/checkstack.c; \ + @if $(BYTECC) $(BYTECCCOMPOPTS) $(BYTECCLINKOPTS) \ + -o tools/checkstack tools/checkstack.c; \ then tools/checkstack; \ else :; \ fi @@ -798,7 +829,7 @@ clean:: partialclean:: for d in utils parsing typing bytecomp asmcomp driver toplevel tools; \ - do rm -f $$d/*.cm[iox] $$d/*.annot $$d/*.[so] $$d/*~; done + do rm -f $$d/*.cm[ioxt] $$d/*.cmti $$d/*.annot $$d/*.[so] $$d/*~; done rm -f *~ depend: beforedepend @@ -809,10 +840,15 @@ depend: beforedepend alldepend:: depend distclean: - ./build/distclean.sh - rm -f ocaml ocamlcomp.sh testsuite/_log - -.PHONY: all backup bootstrap camlp4opt camlp4out checkstack clean + $(MAKE) clean + rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader boot/ocamlyacc \ + boot/*.cm* boot/libcamlrun.a + rm -f config/Makefile config/m.h config/s.h + rm -f tools/*.bak + rm -f ocaml ocamlc + rm -f testsuite/_log + +.PHONY: all backup bootstrap checkstack clean .PHONY: partialclean beforedepend alldepend cleanboot coldstart .PHONY: compare core coreall .PHONY: coreboot defaultentry depend distclean install installopt diff --git a/Makefile.nt b/Makefile.nt index 41d9c4a8..648c918d 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -17,7 +17,7 @@ include stdlib/StdlibModules CAMLC=boot/ocamlrun boot/ocamlc -nostdlib -I boot CAMLOPT=boot/ocamlrun ./ocamlopt -nostdlib -I stdlib -I otherlibs/dynlink -COMPFLAGS=-strict-sequence -warn-error A $(INCLUDES) +COMPFLAGS=-strict-sequence -w +33..39+48 -warn-error A -bin-annot $(INCLUDES) LINKFLAGS= CAMLYACC=boot/ocamlyacc YACCFLAGS= @@ -26,8 +26,10 @@ CAMLDEP=boot/ocamlrun tools/ocamldep DEPFLAGS=$(INCLUDES) CAMLRUN=byterun/ocamlrun -CAMLP4OUT=$(CAMLP4:=out) -CAMLP4OPT=$(CAMLP4:=opt) +OCAMLBUILDBYTE=$(WITH_OCAMLBUILD:=.byte) +OCAMLBUILDNATIVE=$(WITH_OCAMLBUILD:=.native) + +OCAMLDOC_OPT=$(WITH_OCAMLDOC:=.opt) INCLUDES=-I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver \ -I toplevel @@ -37,6 +39,7 @@ UTILS=utils/misc.cmo utils/tbl.cmo utils/config.cmo \ utils/consistbl.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ + parsing/ast_helper.cmo \ parsing/syntaxerr.cmo parsing/parser.cmo \ parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ parsing/pprintast.cmo \ @@ -50,8 +53,8 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ typing/printtyp.cmo typing/includeclass.cmo \ typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ - typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ typing/typedtreeIter.cmo typing/typedtreeMap.cmo typing/cmt_format.cmo \ + typing/includemod.cmo typing/typetexp.cmo typing/parmatch.cmo \ typing/stypes.cmo typing/typecore.cmo \ typing/typedecl.cmo typing/typeclass.cmo \ typing/typemod.cmo @@ -76,12 +79,15 @@ ASMCOMP=asmcomp/arch.cmo asmcomp/debuginfo.cmo \ asmcomp/cmm.cmo asmcomp/printcmm.cmo \ asmcomp/reg.cmo asmcomp/mach.cmo asmcomp/proc.cmo \ asmcomp/clambda.cmo asmcomp/printclambda.cmo asmcomp/compilenv.cmo \ - asmcomp/closure.cmo asmcomp/cmmgen.cmo \ + asmcomp/closure.cmo asmcomp/strmatch.cmo asmcomp/cmmgen.cmo \ asmcomp/printmach.cmo asmcomp/selectgen.cmo asmcomp/selection.cmo \ - asmcomp/comballoc.cmo asmcomp/liveness.cmo \ + asmcomp/comballoc.cmo \ + asmcomp/CSEgen.cmo asmcomp/CSE.cmo \ + asmcomp/liveness.cmo \ asmcomp/spill.cmo asmcomp/split.cmo \ asmcomp/interf.cmo asmcomp/coloring.cmo \ asmcomp/reloadgen.cmo asmcomp/reload.cmo \ + asmcomp/deadcode.cmo \ asmcomp/printlinear.cmo asmcomp/linearize.cmo \ asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ @@ -105,7 +111,8 @@ defaultentry: # Recompile the system using the bootstrap compiler all: runtime ocamlc ocamllex ocamlyacc ocamltools library ocaml \ - otherlibraries ocamldoc.byte ocamlbuild.byte $(CAMLP4OUT) $(DEBUGGER) + otherlibraries $(OCAMLBUILDBYTE) $(WITH_DEBUGGER) \ + $(WITH_OCAMLDOC) # The compilation of ocaml will fail if the runtime has changed. # Never mind, just do make bootstrap to reach fixpoint again. @@ -113,12 +120,13 @@ all: runtime ocamlc ocamllex ocamlyacc ocamltools library ocaml \ # Compile everything the first time world: coldstart all -# Complete bootstrapping cycle -bootstrap: +# Core bootstrapping cycle +coreboot: # Save the original bootstrap compiler $(MAKEREC) backup # Promote the new compiler but keep the old runtime -# This compiler runs on boot/ocamlrun and produces bytecode for byterun/ocamlrun +# This compiler runs on boot/ocamlrun and produces bytecode for +# byterun/ocamlrun $(MAKEREC) promote-cross # Rebuild ocamlc and ocamllex (run on byterun/ocamlrun) $(MAKEREC) partialclean @@ -127,12 +135,18 @@ bootstrap: $(MAKEREC) library-cross # Promote the new compiler and the new runtime $(MAKEREC) promote -# Rebuild everything, including ocaml and the tools +# Rebuild the core system $(MAKEREC) partialclean - $(MAKEREC) all + $(MAKEREC) core # Check if fixpoint reached $(MAKEREC) compare +# Do a complete bootstrapping cycle +bootstrap: + $(MAKEREC) coreboot + $(MAKEREC) all + $(MAKEREC) compare + LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader # Start up the system from the distribution compiler @@ -145,7 +159,7 @@ coldstart: cd stdlib ; cp $(LIBFILES) ../boot # Build the core system: the minimum needed to make depend and bootstrap -core : runtime ocamlc ocamllex ocamlyacc ocamltools library +core: runtime ocamlc ocamllex ocamlyacc ocamltools library # Save the current bootstrap compiler MAXSAVED=boot/Saved/Saved.prev/Saved.prev/Saved.prev/Saved.prev/Saved.prev @@ -190,12 +204,18 @@ cleanboot: rm -rf boot/Saved/Saved.prev/* # Compile the native-code compiler -opt-core: runtimeopt ocamlopt libraryopt -opt: opt-core otherlibrariesopt ocamlbuildlib.native +opt-core: + $(MAKE) -f Makefile.nt runtimeopt + $(MAKE) -f Makefile.nt ocamlopt + $(MAKE) -f Makefile.nt libraryopt + +opt: + $(MAKE) -f Makefile.nt opt-core + $(MAKE) -f Makefile.nt otherlibrariesopt ocamltoolsopt # Native-code versions of the tools opt.opt: core opt-core ocamlc.opt all ocamlopt.opt ocamllex.opt \ - ocamltoolsopt.opt ocamlbuild.native $(CAMLP4OPT) ocamldoc.opt + ocamltoolsopt ocamltoolsopt.opt $(OCAMLBUILDNATIVE) $(OCAMLDOC_OPT) # Complete build using fast compilers world.opt: coldstart opt.opt @@ -204,59 +224,71 @@ world.opt: coldstart opt.opt COMPLIBDIR=$(LIBDIR)/compiler-libs +INSTALL_BINDIR=$(DESTDIR)$(BINDIR) +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) +INSTALL_COMPLIBDIR=$(DESTDIR)$(COMPLIBDIR) +INSTALL_STUBLIBDIR=$(DESTDIR)$(STUBLIBDIR) +INSTALL_MANDIR=$(DESTDIR)$(MANDIR) + install: installbyt installopt installbyt: - mkdir -p $(BINDIR) - mkdir -p $(LIBDIR) - mkdir -p $(COMPLIBDIR) + mkdir -p $(INSTALL_BINDIR) + mkdir -p $(INSTALL_LIBDIR) + mkdir -p $(INSTALL_STUBLIBDIR) + mkdir -p $(INSTALL_COMPLIBDIR) + cp VERSION $(INSTALL_LIBDIR)/ cd byterun ; $(MAKEREC) install - cp ocamlc $(BINDIR)/ocamlc.exe - cp ocaml $(BINDIR)/ocaml.exe + cp ocamlc $(INSTALL_BINDIR)/ocamlc.exe + cp ocaml $(INSTALL_BINDIR)/ocaml.exe cd stdlib ; $(MAKEREC) install - cp lex/ocamllex $(BINDIR)/ocamllex.exe - cp yacc/ocamlyacc.exe $(BINDIR)/ocamlyacc.exe + cp lex/ocamllex $(INSTALL_BINDIR)/ocamllex.exe + cp yacc/ocamlyacc.exe $(INSTALL_BINDIR)/ocamlyacc.exe cp utils/*.cmi parsing/*.cmi typing/*.cmi bytecomp/*.cmi driver/*.cmi \ - toplevel/*.cmi $(COMPLIBDIR) + toplevel/*.cmi $(INSTALL_COMPLIBDIR) cp compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma \ compilerlibs/ocamltoplevel.cma $(BYTESTART) $(TOPLEVELSTART) \ - $(COMPLIBDIR) - cp expunge $(LIBDIR)/expunge.exe - cp toplevel/topdirs.cmi $(LIBDIR) + $(INSTALL_COMPLIBDIR) + cp expunge $(INSTALL_LIBDIR)/expunge.exe + cp toplevel/topdirs.cmi $(INSTALL_LIBDIR) cd tools ; $(MAKEREC) install - cd ocamldoc ; $(MAKEREC) install - mkdir -p $(STUBLIBDIR) for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i install; done - if test -f debugger/ocamldebug.exe; then (cd debugger; $(MAKEREC) install); \ + if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) install); \ + else :; fi + if test -n "$(WITH_DEBUGGER)"; then (cd debugger; $(MAKEREC) install); \ + else :; fi + if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) install); \ else :; fi - ./build/partial-install.sh - cp config/Makefile $(LIBDIR)/Makefile.config - cp README $(DISTRIB)/Readme.general.txt - cp README.win32 $(DISTRIB)/Readme.windows.txt - cp LICENSE $(DISTRIB)/License.txt - cp Changes $(DISTRIB)/Changes.txt + cp config/Makefile $(INSTALL_LIBDIR)/Makefile.config + cp README $(INSTALL_DISTRIB)/Readme.general.txt + cp README.win32 $(INSTALL_DISTRIB)/Readme.windows.txt + cp LICENSE $(INSTALL_DISTRIB)/License.txt + cp Changes $(INSTALL_DISTRIB)/Changes.txt # Installation of the native-code compiler installopt: cd asmrun ; $(MAKEREC) install - cp ocamlopt $(BINDIR)/ocamlopt.exe + cp ocamlopt $(INSTALL_BINDIR)/ocamlopt.exe cd stdlib ; $(MAKEREC) installopt - cp asmcomp/*.cmi driver/*.cmi $(COMPLIBDIR) - cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(COMPLIBDIR) - cd ocamldoc ; $(MAKEREC) installopt + cp asmcomp/*.cmi $(INSTALL_COMPLIBDIR) + cp compilerlibs/ocamloptcomp.cma $(OPTSTART) $(INSTALL_COMPLIBDIR) + if test -n "$(WITH_OCAMLDOC)"; then (cd ocamldoc; $(MAKEREC) installopt); fi + if test -n "$(WITH_OCAMLBUILD)"; then (cd ocamlbuild; $(MAKE) installopt); \ + else :; fi for i in $(OTHERLIBRARIES); do $(MAKEREC) -C otherlibs/$$i installopt; done if test -f ocamlopt.opt ; then $(MAKEREC) installoptopt; fi + cd tools; $(MAKE) installopt installoptopt: - cp ocamlc.opt $(BINDIR)/ocamlc.opt$(EXE) - cp ocamlopt.opt $(BINDIR)/ocamlopt.opt$(EXE) - cp lex/ocamllex.opt $(BINDIR)/ocamllex.opt$(EXE) + cp ocamlc.opt $(INSTALL_BINDIR)/ocamlc.opt$(EXE) + cp ocamlopt.opt $(INSTALL_BINDIR)/ocamlopt.opt$(EXE) + cp lex/ocamllex.opt $(INSTALL_BINDIR)/ocamllex.opt$(EXE) cp compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A) \ compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A) \ compilerlibs/ocamloptcomp.cmxa compilerlibs/ocamloptcomp.$(A) \ $(BYTESTART:.cmo=.cmx) $(BYTESTART:.cmo=.$(O)) \ $(OPTSTART:.cmo=.cmx) $(OPTSTART:.cmo=.$(O)) \ - $(COMPLIBDIR) + $(INSTALL_COMPLIBDIR) clean:: partialclean @@ -277,12 +309,9 @@ partialclean:: ocamlc: compilerlibs/ocamlcommon.cma compilerlibs/ocamlbytecomp.cma $(BYTESTART) $(CAMLC) $(LINKFLAGS) -compat-32 -o ocamlc compilerlibs/ocamlcommon.cma \ compilerlibs/ocamlbytecomp.cma $(BYTESTART) - @sed -e 's|@compiler@|$$topdir/boot/ocamlrun $$topdir/ocamlc|' \ - driver/ocamlcomp.sh.in > ocamlcomp.sh - @chmod +x ocamlcomp.sh partialclean:: - rm -f ocamlc ocamlcomp.sh + rm -f ocamlc # The native-code compiler @@ -294,12 +323,9 @@ partialclean:: ocamlopt: compilerlibs/ocamlcommon.cma compilerlibs/ocamloptcomp.cma $(OPTSTART) $(CAMLC) $(LINKFLAGS) -o ocamlopt \ compilerlibs/ocamlcommon.cma compilerlibs/ocamloptcomp.cma $(OPTSTART) - @sed -e 's|@compiler@|$$topdir/boot/ocamlrun $$topdir/ocamlopt|' \ - driver/ocamlcomp.sh.in > ocamlcompopt.sh - @chmod +x ocamlcompopt.sh partialclean:: - rm -f ocamlopt ocamlcompopt.sh + rm -f ocamlopt # The toplevel @@ -328,7 +354,7 @@ ocamlnat: ocamlopt otherlibs/dynlink/dynlink.cmxa $(NATTOPOBJS:.cmo=.cmx) toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml - cd otherlibs/dynlink && $(MAKE) allopt + cd otherlibs/dynlink && $(MAKE) -f Makefile.nt allopt # The configuration file @@ -363,8 +389,9 @@ utils/config.ml: utils/config.mlp config/Makefile -e 's|%%MKEXE%%|$(MKEXE)|' \ -e 's|%%MKMAINDLL%%|$(MKMAINDLL)|' \ -e 's|%%CC_PROFILE%%||' \ + -e 's|%%HOST%%|$(HOST)|' \ + -e 's|%%TARGET%%|$(TARGET)|' \ utils/config.mlp > utils/config.ml - @chmod -w utils/config.ml partialclean:: rm -f utils/config.ml @@ -410,9 +437,6 @@ ocamlc.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa \ $(CAMLOPT) $(LINKFLAGS) -ccopt "$(BYTECCLINKOPTS)" -o ocamlc.opt \ compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlbytecomp.cmxa \ $(BYTESTART:.cmo=.cmx) -cclib "$(BYTECCLIBS)" - @sed -e 's|@compiler@|$$topdir/ocamlc.opt|' \ - driver/ocamlcomp.sh.in > ocamlcomp.sh - @chmod +x ocamlcomp.sh partialclean:: rm -f ocamlc.opt @@ -429,9 +453,6 @@ ocamlopt.opt: compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ $(CAMLOPT) $(LINKFLAGS) -o ocamlopt.opt \ compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ $(OPTSTART:.cmo=.cmx) - @sed -e 's|@compiler@|$$topdir/ocamlopt.opt|' \ - driver/ocamlcomp.sh.in > ocamlcompopt.sh - @chmod +x ocamlcompopt.sh partialclean:: rm -f ocamlopt.opt @@ -500,6 +521,14 @@ partialclean:: beforedepend:: asmcomp/selection.ml +asmcomp/CSE.ml: asmcomp/$(ARCH)/CSE.ml + cp asmcomp/$(ARCH)/CSE.ml asmcomp/CSE.ml + +partialclean:: + rm -f asmcomp/CSE.ml + +beforedepend:: asmcomp/CSE.ml + asmcomp/reload.ml: asmcomp/$(ARCH)/reload.ml cp asmcomp/$(ARCH)/reload.ml asmcomp/reload.ml @@ -598,10 +627,17 @@ clean:: # Tools -ocamltools: asmcomp/cmx_format.cmi +ocamltools: ocamlc ocamlyacc ocamllex asmcomp/cmx_format.cmi \ + asmcomp/printclambda.cmo cd tools ; $(MAKEREC) all -ocamltoolsopt.opt: asmcomp/cmx_format.cmi + +ocamltoolsopt: + cd tools ; $(MAKEREC) opt + +ocamltoolsopt.opt: ocamlc.opt ocamlyacc ocamllex asmcomp/cmx_format.cmi \ + asmcomp/printclambda.cmx cd tools ; $(MAKEREC) opt.opt + partialclean:: cd tools ; $(MAKEREC) clean alldepend:: @@ -609,7 +645,7 @@ alldepend:: # OCamldoc -ocamldoc.byte: +ocamldoc: cd ocamldoc ; $(MAKEREC) all ocamldoc.opt: cd ocamldoc ; $(MAKEREC) opt.opt @@ -640,28 +676,19 @@ partialclean:: alldepend:: cd debugger; $(MAKEREC) depend -# Camlp4 - -camlp4out: ocamlc otherlibraries ocamlbuild-mixed-boot ocamlbuild.byte - ./build/camlp4-byte-only.sh -camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ocamlbuild.native - ./build/camlp4-native-only.sh - # Ocamlbuild -ocamlbuild.byte: ocamlc otherlibraries ocamlbuild-mixed-boot - ./build/ocamlbuild-byte-only.sh -ocamlbuild.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot - ./build/ocamlbuild-native-only.sh -ocamlbuildlib.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot - ./build/ocamlbuildlib-native-only.sh +ocamlbuild.byte: ocamlc otherlibraries + cd ocamlbuild && $(MAKE) all +ocamlbuild.native: ocamlopt otherlibrariesopt + cd ocamlbuild && $(MAKE) allopt -.PHONY: ocamlbuild-mixed-boot -ocamlbuild-mixed-boot: - ./build/mixed-boot.sh partialclean:: - rm -rf _build + cd ocamlbuild && $(MAKE) clean + +alldepend:: + cd ocamlbuild && $(MAKE) depend # Make clean in the test suite @@ -699,16 +726,22 @@ depend: beforedepend alldepend:: depend distclean: - ./build/distclean.sh - -.PHONY: all backup bootstrap camlp4opt camlp4out checkstack clean + $(MAKE) clean + rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader boot/ocamlyacc \ + boot/*.cm* boot/libcamlrun.a + rm -f config/Makefile config/m.h config/s.h + rm -f tools/*.bak + rm -f ocaml ocamlc + rm -f testsuite/_log + +.PHONY: all backup bootstrap checkstack clean .PHONY: partialclean beforedepend alldepend cleanboot coldstart .PHONY: compare core coreall .PHONY: coreboot defaultentry depend distclean install installopt .PHONY: library library-cross libraryopt ocamlbuild-mixed-boot .PHONY: ocamlbuild.byte ocamlbuild.native ocamldebugger ocamldoc -.PHONY: ocamldoc.opt ocamllex ocamllex.opt ocamltools ocamltools.opt -.PHONY: ocamlyacc opt-core opt opt.opt otherlibraries +.PHONY: ocamldoc.opt ocamllex ocamllex.opt ocamltools ocamltoolsopt +.PHONY: ocamltoolsopt.opt ocamlyacc opt-core opt opt.opt otherlibraries .PHONY: otherlibrariesopt promote promote-cross .PHONY: restore runtime runtimeopt makeruntimeopt world world.opt diff --git a/README b/README index 06591e23..093ad8ed 100644 --- a/README +++ b/README @@ -54,7 +54,6 @@ CONTENTS: boot/ bootstrap compiler bytecomp/ bytecode compiler and linker byterun/ bytecode interpreter and runtime system - camlp4/ the Camlp4 preprocessor config/ autoconfiguration stuff debugger/ source-level replay debugger driver/ driver code for the compilers diff --git a/README.win32 b/README.win32 index 00006dd4..111c9a10 100644 --- a/README.win32 +++ b/README.win32 @@ -62,24 +62,12 @@ The native-code compiler (ocamlopt) requires the Microsoft Windows SDK Statically linking OCaml bytecode with C code (ocamlc -custom) also requires items [1] and [2]. -The LablTk GUI requires Tcl/Tk 8.5 (item [3]). - INSTALLATION: The binary distribution is a self-installing executable archive. Just run it and it should install OCaml automatically. -To run programs that use the LablTK GUI, the directory where the -DLLs tk85.dll and tcl85.dll were installed (by the Tcl/Tk -installer) must be added to the PATH environment variable. - -To compile programs that use the LablTK GUI, the directory where the -libraries tk85.lib and tcl85.lib were installed (by the Tcl/Tk -installer) must be added to the library search path in the LIB -environment variable. E.g. if Tcl/Tk was installed in C:\Tcl, add -"C:\Tcl\lib" to the LIB environment variable. - THIRD-PARTY SOFTWARE: [1] Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 Service Pack 1. @@ -90,9 +78,6 @@ THIRD-PARTY SOFTWARE: [2] flexdll version 0.31 or later. Can be downloaded from http://alain.frisch.fr/flexdll.html -[3] TCL/TK version 8.5. Windows binaries are available as part of the - ActiveTCL distribution at http://www.activestate.com/activetcl/downloads - RECOMPILATION FROM THE SOURCES: The command-line tools can be recompiled from the Unix source @@ -101,9 +86,7 @@ for Windows. You will need the following software components to perform the recompilation: - Windows NT, 2000, XP, Vista, or 7 (32 or 64 bits). -- Items [1], [2] and [3] from the list of recommended software above. - Make sure to install the 32-bit version of TCL/TK, even if you are - compiling on a 64-bit Windows. +- Items [1] and [2] from the list of recommended software above. - The Cygwin port of GNU tools, available from http://www.cygwin.com/ Install at least the following packages (and their dependencies): diffutils, dos2unix, gcc-core, make, ncurses. @@ -124,9 +107,8 @@ to adjust the paths accordingly. set FLEXDLLDIR=%PFPATH%\flexdll vcvars32 echo VCPATH="`cygpath -p '%Path%'`" >C:\cygwin\tmp\msenv - echo LIB="%LIB%;C:\Tcl\lib" >>C:\cygwin\tmp\msenv echo LIBPATH="%LIBPATH%" >>C:\cygwin\tmp\msenv - echo INCLUDE="%INCLUDE%;%FLEXDLLDIR%;C:\Tcl\include" >>C:\cygwin\tmp\msenv + echo INCLUDE="%INCLUDE%;%FLEXDLLDIR%" >>C:\cygwin\tmp\msenv echo FLPATH="`cygpath '%FLEXDLLDIR%'`" >>C:\cygwin\tmp\msenv echo PATH="$VCPATH:$FLPATH:$PATH" >>C:\cygwin\tmp\msenv echo export PATH LIB LIBPATH INCLUDE >>C:\cygwin\tmp\msenv @@ -148,9 +130,8 @@ directory of the OCaml distribution. Then, do cp config/Makefile.msvc config/Makefile Then, edit config/Makefile as needed, following the comments in this file. -Normally, the only variables that need to be changed are +Normally, the only variable that need to be changed is PREFIX where to install everything - TK_ROOT where TCL/TK was installed Finally, use "make -f Makefile.nt" to build the system, e.g. @@ -168,7 +149,7 @@ performance of bytecode programs is about 2/3 of that obtained under Unix/GCC or Cygwin or Mingw on similar hardware. * Libraries available in this port: "num", "str", "threads", "graphics", -"labltk", and large parts of "unix". +and large parts of "unix". * The replay debugger is partially supported (no reverse execution). @@ -224,27 +205,11 @@ NOTES: (http://mingw-w64.sourceforge.net/) is not supported. Please use the version packaged in Cygwin instead. -The LablTk GUI requires Tcl/Tk 8.5. Windows binaries are available -as part of the ActiveTCL distribution at - http://www.activestate.com/activetcl/downloads -Note that you will need to install the 32-bit version of ActiveTCL, -even if you are on a 64-bit version of Windows. - INSTALLATION: The binary distribution is a self-installing executable archive. Just run it and it should install OCaml automatically. -To run programs that use the LablTK GUI, the directory where the -DLLs tk85.dll and tcl85.dll were installed (by the Tcl/Tk -installer) must be added to the PATH environment variable. - -To compile programs that use the LablTK GUI, the directory where the -libraries tk85.lib and tcl85.lib were installed (by the Tcl/Tk -installer) must be added to the library search path in the LIB -environment variable. E.g. if Tcl/Tk was installed in C:\tcl, add -"C:\tcl\lib" to the LIB environment variable. - RECOMPILATION FROM THE SOURCES: @@ -260,7 +225,6 @@ You will need the following software components to perform the recompilation: diffutils make ncurses -- Tcl/Tk version 8.5 (see above). - The flexdll tool (see above). Do not forget to add the flexdll directory to your PATH @@ -277,9 +241,8 @@ directory of the OCaml distribution. Then, do cp config/Makefile.mingw config/Makefile Then, edit config/Makefile as needed, following the comments in this file. -Normally, the only variables that need to be changed are +Normally, the only variable that need to be changed is PREFIX where to install everything - TK_ROOT where Tcl/Tk was installed Finally, use "make -f Makefile.nt" to build the system, e.g. @@ -293,10 +256,16 @@ Finally, use "make -f Makefile.nt" to build the system, e.g. NOTES: * Libraries available in this port: "num", "str", "threads", "graphics", - "labltk", and large parts of "unix". + and large parts of "unix". * The replay debugger is partially supported (no reverse execution). +* The default Makefile.mingw passes -static-libgcc to the linker. + For more information on this topic: + + http://gcc.gnu.org/onlinedocs/gcc-4.9.1/gcc/Link-Options.html#Link-Options + http://caml.inria.fr/mantis/view.php?id=6411 + ------------------------------------------------------------------------------ The Cygwin port of OCaml @@ -334,8 +303,8 @@ launch the C compiler. In order to recompile flexdll, you first need to configure, compile, and install OCaml without flexdll support (configure with options --no-shared-libs -no-tk -no-camlp4), then modify the flexdll Makefile -to change line 51 from: +-no-shared-libs), then modify the flexdll Makefile to change +line 51 from: LINKFLAGS = -ccopt "-link version_res.o" to: LINKFLAGS = -cclib version_res.o @@ -356,9 +325,9 @@ NOTES: - The replay debugger is fully supported. - When upgrading from 3.12.0 to 3.12.1, you will need to remove /usr/local/bin/ocamlmktop.exe before typing "make install". -- In order to use the "graph" and "labltk" libraries, you will need - to use Cygwin's setup.exe to install the xinit, libX11-devel, tcl, - and tcl-tk packages before compiling OCaml. +- In order to use the "graph" library, you will need to use Cygwin's + setup.exe to install the xinit, and libX11-devel packages before compiling + OCaml. ------------------------------------------------------------------------------ @@ -380,8 +349,6 @@ Microsoft Platform SDK compiler (item [1] in the section The native-code compiler (ocamlopt) requires the Microsoft compiler and the Microsoft assembler MASM64 (item [1]) and the flexdll tool (item [2]). -The LablTk GUI is not available in this version. - INSTALLATION: There is no binary distribution yet. Please compile from sources as @@ -421,9 +388,7 @@ to adjust the paths accordingly. cd "%PFPATH%\Microsoft Visual Studio 9.0\VC\bin" vcvars64 echo VCPATH="`cygpath -p '%Path%'`" >C:\cygwin\tmp\msenv - echo LIB="%LIB%;C:\Tcl\lib" >>C:\cygwin\tmp\msenv echo LIBPATH="%LIBPATH%" >>C:\cygwin\tmp\msenv - echo INCLUDE="%INCLUDE%;C:\Tcl\include" >>C:\cygwin\tmp\msenv echo FLPATH="`cygpath '%PFPATH%\flexdll'`" >>C:\cygwin\tmp\msenv echo PATH="$VCPATH:$FLPATH:$PATH" >>C:\cygwin\tmp\msenv echo export PATH LIB LIBPATH INCLUDE >>C:\cygwin\tmp\msenv diff --git a/VERSION b/VERSION index d6ae7090..da8c290a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.01.0 +4.02.0 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/_tags b/_tags deleted file mode 100644 index 0f1b6f66..00000000 --- a/_tags +++ /dev/null @@ -1,98 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -# Ocamlbuild tags file - -true: -traverse - -# Traverse only these directories -<{bytecomp,driver,stdlib,tools,asmcomp,camlp4,ocamlbuild,toplevel,ocamldoc,typing,otherlibs,utils,debugger,lex,parsing,byterun,asmrun}/**>: traverse - -"boot" or "byterun" or "asmrun" or "compilerlibs": not_hygienic - -# These should not be required but it fails on *BSD and Windows... -"yacc" or "win32caml": not_hygienic - -# We want -g everywhere it's possible -true: debug - -# By default everything we link needs the stdlib -true: use_stdlib - -# The stdlib neither requires the stdlib nor debug information -: -use_stdlib, -debug - -<**/*.ml*>: warn_error_A - -<{bytecomp,driver,stdlib,tools,asmcomp,toplevel,typing,utils,lex,parsing}/**>: strict_sequence - -"toplevel/topstart.byte": linkall - -: -debug -: ocamldoc_sources -: include_unix, include_str, include_dynlink -: use_unix, use_str, use_dynlink - -: camlp4boot, warn_Z -: -camlp4boot -"camlp4/Camlp4_import.ml": -warn_Z - or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Z, warn_a - or : use_dynlink -: include_unix -"camlp4/Camlp4/Struct/DynLoader.ml" or "camlp4/boot/Camlp4.ml": include_dynlink -: include_toplevel -: -debug - -: include_unix - -<**/pervasives.ml> or <**/pervasives.mli> or <**/camlinternalOO.mli>: nopervasives -<**/camlinternalOO*.cmx>: inline(0) -<**/scanf*.cmx>: inline(9) -<**/*Labels.ml*>: nolabels - -"tools/addlabels.ml": warn_s - - or : use_unix, linkall -: include_unix - - or : ocamlmklib - or : ocamlmklib -: ocamlmklib -: ocamlmklib -"otherlibs/threads/unix.cma": ocamlmklib -: ocamlmklib - -: include_unix - -# See the remark about static linking of threads.cmxa in myocamlbuild.ml -: ocamlmklib - -"otherlibs/threads/pervasives.ml": include_unix - -: otherlibs -: otherlibs_unix -: otherlibs_win32unix -: otherlibs_bigarray -: otherlibs_num -: otherlibs_threads -"otherlibs/threads/unix.cma": -otherlibs_threads -: otherlibs_systhreads -: otherlibs_dbm -: otherlibs_graph -: otherlibs_win32graph -: otherlibs_labltk - - or : bootstrap_thread -: ocamlmklib -"otherlibs/labltk/browser/jglib.cma": -ocamlmklib -"otherlibs/labltk/browser/main.byte": use_unix, use_str, ocamlbrowser, bootstrap_thread -: include_unix, include_str diff --git a/asmcomp/.ignore b/asmcomp/.ignore index 31d00178..8c24e74a 100644 --- a/asmcomp/.ignore +++ b/asmcomp/.ignore @@ -4,3 +4,4 @@ proc.ml selection.ml reload.ml scheduling.ml +CSE.ml diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml new file mode 100644 index 00000000..8cd23b0a --- /dev/null +++ b/asmcomp/CSEgen.ml @@ -0,0 +1,322 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Common subexpression elimination by value numbering over extended + basic blocks. *) + +open Mach + +type valnum = int + +(* We maintain sets of equations of the form + valnums = operation(valnums) + plus a mapping from registers to valnums (value numbers). *) + +type rhs = operation * valnum array + +module Equations = + Map.Make(struct type t = rhs let compare = Pervasives.compare end) + +type numbering = + { num_next: int; (* next fresh value number *) + num_eqs: valnum array Equations.t; (* mapping rhs -> valnums *) + num_reg: valnum Reg.Map.t } (* mapping register -> valnum *) + +let empty_numbering = + { num_next = 0; num_eqs = Equations.empty; num_reg = Reg.Map.empty } + +(** Generate a fresh value number [v] and associate it to register [r]. + Returns a pair [(n',v)] with the updated value numbering [n']. *) + +let fresh_valnum_reg n r = + let v = n.num_next in + ({n with num_next = v + 1; num_reg = Reg.Map.add r v n.num_reg}, v) + +(* Same, for a set of registers [rs]. *) + +let array_fold_transf (f: numbering -> 'a -> numbering * 'b) n (a: 'a array) + : numbering * 'b array = + match Array.length a with + | 0 -> (n, [||]) + | 1 -> let (n', b) = f n a.(0) in (n', [|b|]) + | l -> let b = Array.make l 0 and n = ref n in + for i = 0 to l - 1 do + let (n', x) = f !n a.(i) in + b.(i) <- x; n := n' + done; + (!n, b) + +let fresh_valnum_regs n rs = + array_fold_transf fresh_valnum_reg n rs + +(** [valnum_reg n r] returns the value number for the contents of + register [r]. If none exists, a fresh value number is returned + and associated with register [r]. The possibly updated numbering + is also returned. [valnum_regs] is similar, but for an array of + registers. *) + +let valnum_reg n r = + try + (n, Reg.Map.find r n.num_reg) + with Not_found -> + fresh_valnum_reg n r + +let valnum_regs n rs = + array_fold_transf valnum_reg n rs + +(* Look up the set of equations for an equation with the given rhs. + Return [Some res] if there is one, where [res] is the lhs. *) + +let find_equation n rhs = + try + Some(Equations.find rhs n.num_eqs) + with Not_found -> + None + +(* Find a register containing the given value number. *) + +let find_reg_containing n v = + Reg.Map.fold (fun r v' res -> if v' = v then Some r else res) + n.num_reg None + +(* Find a set of registers containing the given value numbers. *) + +let find_regs_containing n vs = + match Array.length vs with + | 0 -> Some [||] + | 1 -> begin match find_reg_containing n vs.(0) with + | None -> None + | Some r -> Some [|r|] + end + | l -> let rs = Array.make l Reg.dummy in + begin try + for i = 0 to l - 1 do + match find_reg_containing n vs.(i) with + | None -> raise Exit + | Some r -> rs.(i) <- r + done; + Some rs + with Exit -> + None + end + +(* Associate the given value number to the given result register, + without adding new equations. *) + +let set_known_reg n r v = + { n with num_reg = Reg.Map.add r v n.num_reg } + +(* Associate the given value numbers to the given result registers, + without adding new equations. *) + +let array_fold2 f n a1 a2 = + let l = Array.length a1 in + assert (l = Array.length a2); + let n = ref n in + for i = 0 to l - 1 do n := f !n a1.(i) a2.(i) done; + !n + +let set_known_regs n rs vs = + array_fold2 set_known_reg n rs vs + +(* Record the effect of a move: no new equations, but the result reg + maps to the same value number as the argument reg. *) + +let set_move n src dst = + let (n1, v) = valnum_reg n src in + { n1 with num_reg = Reg.Map.add dst v n1.num_reg } + +(* Record the equation [fresh valnums = rhs] and associate the given + result registers [rs] to [fresh valnums]. *) + +let set_fresh_regs n rs rhs = + let (n1, vs) = fresh_valnum_regs n rs in + { n1 with num_eqs = Equations.add rhs vs n.num_eqs } + +(* Forget everything we know about the given result registers, + which are receiving unpredictable values at run-time. *) + +let set_unknown_regs n rs = + { n with num_reg = Array.fold_right Reg.Map.remove rs n.num_reg } + +(* Keep only the equations satisfying the given predicate. *) + +let filter_equations pred n = + { n with num_eqs = Equations.filter (fun (op,_) res -> pred op) n.num_eqs } + +(* Prepend a set of moves before [i] to assign [srcs] to [dsts]. *) + +let insert_single_move i src dst = instr_cons (Iop Imove) [|src|] [|dst|] i + +let insert_move srcs dsts i = + match Array.length srcs with + | 0 -> i + | 1 -> instr_cons (Iop Imove) srcs dsts i + | l -> (* Parallel move: first copy srcs into tmps one by one, + then copy tmps into dsts one by one *) + let tmps = Reg.createv_like srcs in + array_fold2 insert_single_move + (array_fold2 insert_single_move i srcs tmps) tmps dsts + +(* Classification of operations *) + +type op_class = + | Op_pure (* pure arithmetic, produce one or several result *) + | Op_checkbound (* checkbound-style: no result, can raise an exn *) + | Op_load (* memory load *) + | Op_store of bool (* memory store, false = init, true = assign *) + | Op_other (* anything else that does not allocate nor store in memory *) + +class cse_generic = object (self) + +(* Default classification of operations. Can be overriden in + processor-specific files to classify specific operations better. *) + +method class_of_operation op = + match op with + | Imove | Ispill | Ireload -> assert false (* treated specially *) + | Iconst_int _ | Iconst_float _ | Iconst_symbol _ + | Iconst_blockheader _ -> Op_pure + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ -> assert false (* treated specially *) + | Istackoffset _ -> Op_other + | Iload(_,_) -> Op_load + | Istore(_,_,asg) -> Op_store asg + | Ialloc _ -> assert false (* treated specially *) + | Iintop(Icheckbound) -> Op_checkbound + | Iintop _ -> Op_pure + | Iintop_imm(Icheckbound, _) -> Op_checkbound + | Iintop_imm(_, _) -> Op_pure + | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf + | Ifloatofint | Iintoffloat -> Op_pure + | Ispecific _ -> Op_other + +(* Operations that are so cheap that it isn't worth factoring them. *) + +method is_cheap_operation op = + match op with + | Iconst_int _ | Iconst_blockheader _ -> true + | _ -> false + +(* Forget all equations involving memory loads. Performed after a + non-initializing store *) + +method private kill_loads n = + filter_equations (fun o -> self#class_of_operation o <> Op_load) n + +(* Perform CSE on the given instruction [i] and its successors. + [n] is the value numbering current at the beginning of [i]. *) + +method private cse n i = + match i.desc with + | Iend | Ireturn | Iop(Itailcall_ind) | Iop(Itailcall_imm _) + | Iexit _ | Iraise _ -> + i + | Iop (Imove | Ispill | Ireload) -> + (* For moves, we associate the same value number to the result reg + as to the argument reg. *) + let n1 = set_move n i.arg.(0) i.res.(0) in + {i with next = self#cse n1 i.next} + | Iop (Icall_ind | Icall_imm _ | Iextcall _) -> + (* For function calls, we should at least forget: + - equations involving memory loads, since the callee can + perform arbitrary memory stores; + - equations involving arithmetic operations that can + produce bad pointers into the heap (see below for Ialloc); + - mappings from hardware registers to value numbers, + since the callee does not preserve these registers. + That doesn't leave much usable information: checkbounds + could be kept, but won't be usable for CSE as one of their + arguments is always a memory load. For simplicity, we + just forget everything. *) + {i with next = self#cse empty_numbering i.next} + | Iop (Ialloc _) -> + (* For allocations, we must avoid extending the live range of a + pseudoregister across the allocation if this pseudoreg can + contain a value that looks like a pointer into the heap but + is not a pointer to the beginning of a Caml object. PR#6484 + is an example of such a value (a derived pointer into a + block). In the absence of more precise typing information, + we just forget everything. *) + {i with next = self#cse empty_numbering i.next} + | Iop op -> + begin match self#class_of_operation op with + | Op_pure | Op_checkbound | Op_load -> + let (n1, varg) = valnum_regs n i.arg in + let n2 = set_unknown_regs n1 (Proc.destroyed_at_oper i.desc) in + begin match find_equation n1 (op, varg) with + | Some vres -> + (* This operation was computed earlier. *) + (* Are there registers that hold the results computed earlier? *) + begin match find_regs_containing n1 vres with + | Some res when (not (self#is_cheap_operation op)) + && (not (Proc.regs_are_volatile res)) -> + (* We can replace res <- op args with r <- move res, + provided res are stable (non-volatile) registers. + If the operation is very cheap to compute, e.g. + an integer constant, don't bother. *) + let n3 = set_known_regs n1 i.res vres in + (* This is n1 above and not n2 because the move + does not destroy any regs *) + insert_move res i.res (self#cse n3 i.next) + | _ -> + (* We already computed the operation but lost its + results. Associate the result registers to + the result valnums of the previous operation. *) + let n3 = set_known_regs n2 i.res vres in + {i with next = self#cse n3 i.next} + end + | None -> + (* This operation produces a result we haven't seen earlier. *) + let n3 = set_fresh_regs n2 i.res (op, varg) in + {i with next = self#cse n3 i.next} + end + | Op_store false | Op_other -> + (* An initializing store or an "other" operation do not invalidate + any equations, but we do not know anything about the results. *) + let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in + let n2 = set_unknown_regs n1 i.res in + {i with next = self#cse n2 i.next} + | Op_store true -> + (* A non-initializing store can invalidate + anything we know about prior loads. *) + let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in + let n2 = set_unknown_regs n1 i.res in + let n3 = self#kill_loads n2 in + {i with next = self#cse n3 i.next} + end + (* For control structures, we set the numbering to empty at every + join point, but propagate the current numbering across fork points. *) + | Iifthenelse(test, ifso, ifnot) -> + let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in + {i with desc = Iifthenelse(test, self#cse n1 ifso, self#cse n1 ifnot); + next = self#cse empty_numbering i.next} + | Iswitch(index, cases) -> + let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in + {i with desc = Iswitch(index, Array.map (self#cse n1) cases); + next = self#cse empty_numbering i.next} + | Iloop(body) -> + {i with desc = Iloop(self#cse empty_numbering body); + next = self#cse empty_numbering i.next} + | Icatch(nfail, body, handler) -> + {i with desc = Icatch(nfail, self#cse n body, + self#cse empty_numbering handler); + next = self#cse empty_numbering i.next} + | Itrywith(body, handler) -> + {i with desc = Itrywith(self#cse n body, + self#cse empty_numbering handler); + next = self#cse empty_numbering i.next} + +method fundecl f = + {f with fun_body = self#cse empty_numbering f.fun_body} + +end diff --git a/asmcomp/CSEgen.mli b/asmcomp/CSEgen.mli new file mode 100644 index 00000000..0b375ff5 --- /dev/null +++ b/asmcomp/CSEgen.mli @@ -0,0 +1,35 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Common subexpression elimination by value numbering over extended + basic blocks. *) + +type op_class = + | Op_pure (* pure, produce one result *) + | Op_checkbound (* checkbound-style: no result, can raise an exn *) + | Op_load (* memory load *) + | Op_store of bool (* memory store, false = init, true = assign *) + | Op_other (* anything else that does not allocate nor store in memory *) + +class cse_generic : object + (* The following methods can be overriden to handle processor-specific + operations. *) + + method class_of_operation: Mach.operation -> op_class + + method is_cheap_operation: Mach.operation -> bool + (* Operations that are so cheap that it isn't worth factoring them. *) + + (* The following method is the entry point and should not be overridden *) + method fundecl: Mach.fundecl -> Mach.fundecl + +end diff --git a/asmcomp/amd64/CSE.ml b/asmcomp/amd64/CSE.ml new file mode 100644 index 00000000..aee43d2b --- /dev/null +++ b/asmcomp/amd64/CSE.ml @@ -0,0 +1,38 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for the AMD64 *) + +open Arch +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic as super + +method! class_of_operation op = + match op with + | Ispecific spec -> + begin match spec with + | Ilea _ -> Op_pure + | Istore_int(_, _, is_asg) | Istore_symbol(_, _, is_asg) -> Op_store is_asg + | Ioffset_loc(_, _) -> Op_store true + | Ifloatarithmem _ | Ifloatsqrtf _ -> Op_load + | Ibswap _ | Isqrtf -> super#class_of_operation op + end + | _ -> super#class_of_operation op + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/amd64/arch.ml b/asmcomp/amd64/arch.ml index b0a5ffb8..a4f1abd9 100644 --- a/asmcomp/amd64/arch.ml +++ b/asmcomp/amd64/arch.ml @@ -33,8 +33,9 @@ type addressing_mode = type specific_operation = Ilea of addressing_mode (* "lea" gives scaled adds *) - | Istore_int of nativeint * addressing_mode (* Store an integer constant *) - | Istore_symbol of string * addressing_mode (* Store a symbol *) + | Istore_int of nativeint * addressing_mode * bool + (* Store an integer constant *) + | Istore_symbol of string * addressing_mode * bool (* Store a symbol *) | Ioffset_loc of int * addressing_mode (* Add a constant to a location *) | Ifloatarithmem of float_operation * addressing_mode (* Float arith operation with memory *) @@ -101,10 +102,14 @@ let print_addressing printreg addr ppf arg = let print_specific_operation printreg op ppf arg = match op with | Ilea addr -> print_addressing printreg addr ppf arg - | Istore_int(n, addr) -> - fprintf ppf "[%a] := %nd" (print_addressing printreg addr) arg n - | Istore_symbol(lbl, addr) -> - fprintf ppf "[%a] := \"%s\"" (print_addressing printreg addr) arg lbl + | Istore_int(n, addr, is_assign) -> + fprintf ppf "[%a] := %nd %s" + (print_addressing printreg addr) arg n + (if is_assign then "(assign)" else "(init)") + | Istore_symbol(lbl, addr, is_assign) -> + fprintf ppf "[%a] := \"%s\" %s" + (print_addressing printreg addr) arg lbl + (if is_assign then "(assign)" else "(init)") | Ioffset_loc(n, addr) -> fprintf ppf "[%a] +:= %i" (print_addressing printreg addr) arg n | Isqrtf -> diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 8dad2206..b576ece9 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -22,6 +22,7 @@ open Emitaux let macosx = (Config.system = "macosx") let mingw64 = (Config.system = "mingw64") +let cygwin = (Config.system = "cygwin") let fp = Config.with_frame_pointers @@ -61,17 +62,17 @@ let emit_symbol s = Emitaux.emit_symbol '$' s let emit_call s = - if !Clflags.dlcode && not macosx && not mingw64 + if !Clflags.dlcode && not macosx && not mingw64 && not cygwin then `call {emit_symbol s}@PLT` else `call {emit_symbol s}` let emit_jump s = - if !Clflags.dlcode && not macosx && not mingw64 + if !Clflags.dlcode && not macosx && not mingw64 && not cygwin then `jmp {emit_symbol s}@PLT` else `jmp {emit_symbol s}` let load_symbol_addr s = - if !Clflags.dlcode && not mingw64 + if !Clflags.dlcode && not mingw64 && not cygwin then `movq {emit_symbol s}@GOTPCREL(%rip)` else if !pic_code then `leaq {emit_symbol s}(%rip)` @@ -334,15 +335,16 @@ let output_epilogue f = (* Floating-point constants *) -let float_constants = ref ([] : (string * int) list) +let float_constants = ref ([] : (int64 * int) list) let add_float_constant cst = + let repr = Int64.bits_of_float cst in try - List.assoc cst !float_constants + List.assoc repr !float_constants with Not_found -> let lbl = new_label() in - float_constants := (cst, lbl) :: !float_constants; + float_constants := (repr, lbl) :: !float_constants; lbl let emit_float_constant (cst, lbl) = @@ -372,7 +374,7 @@ let emit_instr fallthrough i = | _ -> ` movq {emit_reg src}, {emit_reg dst}\n` end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if n = 0n then begin match i.res.(0).loc with Reg n -> ` xorq {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` @@ -381,12 +383,12 @@ let emit_instr fallthrough i = ` movq ${emit_nativeint n}, {emit_reg i.res.(0)}\n` else ` movabsq ${emit_nativeint n}, {emit_reg i.res.(0)}\n` - | Lop(Iconst_float s) -> - begin match Int64.bits_of_float (float_of_string s) with + | Lop(Iconst_float f) -> + begin match Int64.bits_of_float f with | 0x0000_0000_0000_0000L -> (* +0.0 *) ` xorpd {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` | _ -> - let lbl = add_float_constant s in + let lbl = add_float_constant f in ` movsd {emit_label lbl}(%rip), {emit_reg i.res.(0)}\n` end | Lop(Iconst_symbol s) -> @@ -447,7 +449,7 @@ let emit_instr fallthrough i = | Double | Double_u -> ` movsd {emit_addressing addr i.arg 0}, {emit_reg dest}\n` end - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> begin match chunk with | Word -> ` movq {emit_reg i.arg.(0)}, {emit_addressing addr i.arg 1}\n` @@ -514,6 +516,8 @@ let emit_instr fallthrough i = | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> (* We have i.arg.(0) = i.res.(0) and i.arg.(1) = %rcx *) ` {emit_string(instr_for_intop op)} %cl, {emit_reg i.res.(0)}\n` + | Lop(Iintop Imulh) -> + ` imulq {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.arg.(1)}, {emit_reg i.res.(0)}\n` @@ -523,22 +527,6 @@ let emit_instr fallthrough i = ` incq {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Iadd, -1) | Iintop_imm(Isub, 1)) -> ` decq {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Idiv, n)) -> - (* Note: i.arg.(0) = i.res.(0) = rdx (cf. selection.ml) *) - let l = Misc.log2 n in - ` movq {emit_reg i.arg.(0)}, %rax\n`; - ` addq ${emit_int(n-1)}, {emit_reg i.arg.(0)}\n`; - ` testq %rax, %rax\n`; - ` cmovns %rax, {emit_reg i.arg.(0)}\n`; - ` sarq ${emit_int l}, {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Imod, n)) -> - (* Note: i.arg.(0) = i.res.(0) = rdx (cf. selection.ml) *) - ` movq {emit_reg i.arg.(0)}, %rax\n`; - ` testq %rax, %rax\n`; - ` leaq {emit_int(n-1)}(%rax), %rax\n`; - ` cmovns {emit_reg i.arg.(0)}, %rax\n`; - ` andq ${emit_int (-n)}, %rax\n`; - ` subq %rax, {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(op, n)) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} ${emit_int n}, {emit_reg i.res.(0)}\n` @@ -554,9 +542,9 @@ let emit_instr fallthrough i = ` cvttsd2siq {emit_reg i.arg.(0)}, {emit_reg i.res.(0)}\n` | Lop(Ispecific(Ilea addr)) -> ` leaq {emit_addressing addr i.arg 0}, {emit_reg i.res.(0)}\n` - | Lop(Ispecific(Istore_int(n, addr))) -> + | Lop(Ispecific(Istore_int(n, addr, _))) -> ` movq ${emit_nativeint n}, {emit_addressing addr i.arg 0}\n` - | Lop(Ispecific(Istore_symbol(s, addr))) -> + | Lop(Ispecific(Istore_symbol(s, addr, _))) -> assert (not !pic_code && not !Clflags.dlcode); ` movq ${emit_symbol s}, {emit_addressing addr i.arg 0}\n` | Lop(Ispecific(Ioffset_loc(n, addr))) -> @@ -650,7 +638,7 @@ let emit_instr fallthrough i = ` jmp *{emit_reg tmp1}\n`; if macosx then ` .const\n` - else if mingw64 then + else if mingw64 || cygwin then ` .section .rdata,\"dr\"\n` else ` .section .rodata\n`; @@ -674,11 +662,16 @@ let emit_instr fallthrough i = ` addq $8, %rsp\n`; cfi_adjust_cfa_offset (-8); stack_offset := !stack_offset - 16 - | Lraise -> - if !Clflags.debug then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, Lambda.Raise_regular -> ` {emit_call "caml_raise_exn"}\n`; record_frame Reg.Set.empty i.dbg - end else begin + | true, Lambda.Raise_reraise -> + ` {emit_call "caml_reraise_exn"}\n`; + record_frame Reg.Set.empty i.dbg + | false, _ + | true, Lambda.Raise_notrace -> ` movq %r14, %rsp\n`; ` popq %r14\n`; ` ret\n` @@ -772,9 +765,9 @@ let emit_item = function | Cint n -> ` .quad {emit_nativeint n}\n` | Csingle f -> - emit_float32_directive ".long" f + emit_float32_directive ".long" (Int32.bits_of_float f) | Cdouble f -> - emit_float64_directive ".quad" f + emit_float64_directive ".quad" (Int64.bits_of_float f) | Csymbol_address s -> ` .quad {emit_symbol s}\n` | Clabel_address lbl -> @@ -799,7 +792,7 @@ let begin_assembly() = (* from amd64.S; could emit these constants on demand *) if macosx then ` .literal16\n` - else if mingw64 then + else if mingw64 || cygwin then ` .section .rdata,\"dr\"\n` else ` .section .rodata.cst8,\"a\",@progbits\n`; @@ -822,7 +815,7 @@ let end_assembly() = if !float_constants <> [] then begin if macosx then ` .literal8\n` - else if mingw64 then + else if mingw64 || cygwin then ` .section .rdata,\"dr\"\n` else ` .section .rodata.cst8,\"a\",@progbits\n`; diff --git a/asmcomp/amd64/emit_nt.mlp b/asmcomp/amd64/emit_nt.mlp index c38c21f2..f14e69cd 100644 --- a/asmcomp/amd64/emit_nt.mlp +++ b/asmcomp/amd64/emit_nt.mlp @@ -15,7 +15,6 @@ module StringSet = Set.Make(struct type t = string let compare (x:t) y = compare x y end) -open Misc open Cmm open Arch open Proc @@ -24,6 +23,8 @@ open Mach open Linearize open Emitaux +let rdx = phys_reg 4 + (* Tradeoff between code size and code speed *) let fastcode_flag = ref true @@ -52,9 +53,10 @@ let slot_offset loc cl = else !stack_offset + (num_stack_slots.(0) + n) * 8 | Outgoing n -> n -(* Output a 32 bit integer in hex *) +(* Output a 32 or 64 bit integer in hex *) let emit_int32 n = emit_printf "0%lxh" n +let emit_int64 n = emit_printf "0%Lxh" n (* Symbols *) @@ -320,36 +322,24 @@ let output_epilogue () = (* Floating-point constants *) -let float_constants = ref ([] : (string * int) list) +let float_constants = ref ([] : (int64 * int) list) let add_float_constant cst = + let repr = Int64.bits_of_float cst in try - List.assoc cst !float_constants + List.assoc repr !float_constants with Not_found -> let lbl = new_label() in - float_constants := (cst, lbl) :: !float_constants; + float_constants := (repr, lbl) :: !float_constants; lbl -let emit_float s = - (* MASM doesn't like floating-point constants such as 2e9. - Turn them into 2.0e9. *) - let pos_e = ref (-1) and pos_dot = ref (-1) in - for i = 0 to String.length s - 1 do - match s.[i] with - 'e'|'E' -> pos_e := i - | '.' -> pos_dot := i - | _ -> () - done; - if !pos_dot < 0 && !pos_e >= 0 then begin - emit_string (String.sub s 0 !pos_e); - emit_string ".0"; - emit_string (String.sub s !pos_e (String.length s - !pos_e)) - end else - emit_string s - let emit_float_constant (cst, lbl) = - `{emit_label lbl} REAL8 {emit_float cst}\n` + `{emit_label lbl} QWORD {emit_int64 cst}\n` + +let emit_movabs reg n = + (* force ml64 to use mov reg, imm64 instruction *) + ` mov {emit_reg reg}, {emit_printf "0%nxH" n}\n` (* Output the assembly code for an instruction *) @@ -372,7 +362,7 @@ let emit_instr fallthrough i = | _ -> ` mov {emit_reg dst}, {emit_reg src}\n` end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if n = 0n then begin match i.res.(0).loc with Reg n -> ` xor {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` @@ -383,14 +373,13 @@ let emit_instr fallthrough i = (* work around bug in ml64 *) ` mov {emit_reg32 i.res.(0)}, {emit_nativeint n}\n` else - (* force ml64 to use mov reg, imm64 instruction *) - ` mov {emit_reg i.res.(0)}, {emit_printf "0%nxH" n}\n` - | Lop(Iconst_float s) -> - begin match Int64.bits_of_float (float_of_string s) with + emit_movabs i.res.(0) n + | Lop(Iconst_float f) -> + begin match Int64.bits_of_float f with | 0x0000_0000_0000_0000L -> (* +0.0 *) ` xorpd {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` | _ -> - let lbl = add_float_constant s in + let lbl = add_float_constant f in ` movsd {emit_reg i.res.(0)}, {emit_label lbl}\n` end | Lop(Iconst_symbol s) -> @@ -454,7 +443,7 @@ let emit_instr fallthrough i = | Double | Double_u -> ` movsd {emit_reg dest}, REAL8 PTR {emit_addressing addr i.arg 0}\n` end - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> begin match chunk with | Word -> ` mov QWORD PTR {emit_addressing addr i.arg 1}, {emit_reg i.arg.(0)}\n` @@ -517,6 +506,8 @@ let emit_instr fallthrough i = | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> (* We have i.arg.(0) = i.res.(0) and i.arg.(1) = %rcx *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, cl\n` + | Lop(Iintop Imulh) -> + ` imul {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}\n` @@ -526,22 +517,6 @@ let emit_instr fallthrough i = ` inc {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Iadd, -1) | Iintop_imm(Isub, 1)) -> ` dec {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Idiv, n)) -> - (* Note: i.arg.(0) = i.res.(0) = rdx (cf. selection.ml) *) - let l = Misc.log2 n in - ` mov rax, {emit_reg i.arg.(0)}\n`; - ` add {emit_reg i.arg.(0)}, {emit_int(n-1)}\n`; - ` test rax, rax\n`; - ` cmovns {emit_reg i.arg.(0)}, rax\n`; - ` sar {emit_reg i.res.(0)}, {emit_int l}\n` - | Lop(Iintop_imm(Imod, n)) -> - (* Note: i.arg.(0) = i.res.(0) = rdx (cf. selection.ml) *) - ` mov rax, {emit_reg i.arg.(0)}\n`; - ` test rax, rax\n`; - ` lea rax, {emit_int(n-1)}[rax]\n`; - ` cmovns rax, {emit_reg i.arg.(0)}\n`; - ` and rax, {emit_int (-n)}\n`; - ` sub {emit_reg i.res.(0)}, rax\n` | Lop(Iintop_imm(op, n)) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, {emit_int n}\n` @@ -557,9 +532,9 @@ let emit_instr fallthrough i = ` cvttsd2si {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` | Lop(Ispecific(Ilea addr)) -> ` lea {emit_reg i.res.(0)}, {emit_addressing addr i.arg 0}\n` - | Lop(Ispecific(Istore_int(n, addr))) -> + | Lop(Ispecific(Istore_int(n, addr, _))) -> ` mov QWORD PTR {emit_addressing addr i.arg 0}, {emit_nativeint n}\n` - | Lop(Ispecific(Istore_symbol(s, addr))) -> + | Lop(Ispecific(Istore_symbol(s, addr, _))) -> assert (not !pic_code); add_used_symbol s; ` mov QWORD PTR {emit_addressing addr i.arg 0}, OFFSET {emit_symbol s}\n` @@ -666,11 +641,16 @@ let emit_instr fallthrough i = ` pop r14\n`; ` add rsp, 8\n`; stack_offset := !stack_offset - 16 - | Lraise -> - if !Clflags.debug then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, Lambda.Raise_regular -> ` call caml_raise_exn\n`; record_frame Reg.Set.empty i.dbg - end else begin + | true, Lambda.Raise_reraise -> + ` call caml_reraise_exn\n`; + record_frame Reg.Set.empty i.dbg + | false, _ + | true, Lambda.Raise_notrace -> ` mov rsp, r14\n`; ` pop r14\n`; ` ret\n` @@ -726,9 +706,9 @@ let emit_item = function | Cint n -> ` QWORD {emit_nativeint n}\n` | Csingle f -> - ` REAL4 {emit_float f}\n` + ` DWORD {emit_int32 (Int32.bits_of_float f)}\n` | Cdouble f -> - ` REAL8 {emit_float f}\n` + ` QWORD {emit_int64 (Int64.bits_of_float f)}\n` | Csymbol_address s -> add_used_symbol s; ` QWORD {emit_symbol s}\n` @@ -762,6 +742,7 @@ let begin_assembly() = ` EXTRN caml_alloc3: NEAR\n`; ` EXTRN caml_ml_array_bound_error: NEAR\n`; ` EXTRN caml_raise_exn: NEAR\n`; + ` EXTRN caml_reraise_exn: NEAR\n`; let lbl_begin = Compilenv.make_symbol (Some "data_begin") in add_def_symbol lbl_begin; ` .DATA\n`; diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index 8774a0da..298e9290 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -24,7 +24,7 @@ let fp = Config.with_frame_pointers let win64 = match Config.system with - | "win64" | "mingw64" -> true + | "win64" | "mingw64" | "cygwin" -> true | _ -> false (* Which asm conventions to use *) @@ -117,12 +117,12 @@ let rotate_registers = false (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 13 Reg.dummy in + let v = Array.make 13 Reg.dummy in for i = 0 to 12 do v.(i) <- Reg.at_location Int (Reg i) done; v let hard_float_reg = - let v = Array.create 16 Reg.dummy in + let v = Array.make 16 Reg.dummy in for i = 0 to 15 do v.(i) <- Reg.at_location Float (Reg (100 + i)) done; v @@ -149,7 +149,7 @@ let word_addressed = false let calling_conventions first_int last_int first_float last_float make_stack arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref 0 in @@ -210,7 +210,7 @@ let win64_float_external_arguments = [| 100 (*xmm0*); 101 (*xmm1*); 102 (*xmm2*); 103 (*xmm3*) |] let win64_loc_external_arguments arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let reg = ref 0 and ofs = ref 32 in for i = 0 to Array.length arg - 1 do @@ -239,6 +239,10 @@ let loc_external_arguments = let loc_exn_bucket = rax +(* Volatile registers: none *) + +let regs_are_volatile rs = false + (* Registers destroyed by operations *) let destroyed_at_c_call = @@ -257,9 +261,10 @@ let destroyed_at_c_call = let destroyed_at_oper = function Iop(Icall_ind | Icall_imm _ | Iextcall(_, true)) -> all_phys_regs | Iop(Iextcall(_, false)) -> destroyed_at_c_call - | Iop(Iintop(Idiv | Imod)) -> [| rax; rdx |] - | Iop(Istore(Single, _)) -> [| rxmm15 |] - | Iop(Ialloc _ | Iintop(Icomp _) | Iintop_imm((Idiv|Imod|Icomp _), _)) + | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) + -> [| rax; rdx |] + | Iop(Istore(Single, _, _)) -> [| rxmm15 |] + | Iop(Ialloc _ | Iintop(Imulh | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] | Iswitch(_, _) -> [| rax; rdx |] | _ -> @@ -285,14 +290,25 @@ let max_register_pressure = function if fp then [| 7; 10 |] else [| 8; 10 |] else if fp then [| 3; 0 |] else [| 4; 0 |] - | Iintop(Idiv | Imod) -> + | Iintop(Idiv | Imod) | Iintop_imm((Idiv | Imod), _) -> if fp then [| 10; 16 |] else [| 11; 16 |] - | Ialloc _ | Iintop(Icomp _) | Iintop_imm((Idiv|Imod|Icomp _), _) -> + | Ialloc _ | Iintop(Icomp _) | Iintop_imm((Icomp _), _) -> if fp then [| 11; 16 |] else [| 12; 16 |] - | Istore(Single, _) -> + | Istore(Single, _, _) -> if fp then [| 12; 15 |] else [| 13; 15 |] | _ -> if fp then [| 12; 16 |] else [| 13; 16 |] +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Ispecific(Ilea _) -> true + | Ispecific _ -> false + | _ -> true + (* Layout of the stack frame *) let num_stack_slots = [| 0; 0 |] diff --git a/asmcomp/amd64/reload.ml b/asmcomp/amd64/reload.ml index 510f201f..49070d29 100644 --- a/asmcomp/amd64/reload.ml +++ b/asmcomp/amd64/reload.ml @@ -22,7 +22,8 @@ open Mach Operation Res Arg1 Arg2 Imove R S or S R - Iconst_int S if 32-bit signed, R otherwise + Iconst_int ] S if 32-bit signed, R otherwise + Iconst_blockheader ] Iconst_float R Iconst_symbol (not PIC) S Iconst_symbol (PIC) R @@ -32,7 +33,8 @@ open Mach Istore R R Iintop(Icomp) R R S or S S R - Iintop(Imul|Idiv|mod) R R S + Iintop(Imul|Idiv|Imod) R R S + Iintop(Imulh) R R S Iintop(shift) S S R Iintop(others) R R S or S S R @@ -71,10 +73,10 @@ method! reload_operation op arg res = (* This add will be turned into a lea; args and results must be in registers *) super#reload_operation op arg res - | Iintop(Idiv | Imod | Ilsl | Ilsr | Iasr) + | Iintop(Imulh | Idiv | Imod | Ilsl | Ilsr | Iasr) | Iintop_imm(_, _) -> (* The argument(s) and results can be either in register or on stack *) - (* Note: Idiv, Imod: arg(0) and res(0) already forced in regs + (* Note: Imulh, Idiv, Imod: arg(0) and res(0) already forced in regs Ilsl, Ilsr, Iasr: arg(1) already forced in regs *) (arg, res) | Iintop(Imul) | Iaddf | Isubf | Imulf | Idivf -> @@ -86,7 +88,7 @@ method! reload_operation op arg res = | Ifloatofint | Iintoffloat -> (* Result must be in register, but argument can be on stack *) (arg, (if stackp res.(0) then [| self#makereg res.(0) |] else res)) - | Iconst_int n -> + | Iconst_int n | Iconst_blockheader n -> if n <= 0x7FFFFFFFn && n >= -0x80000000n then (arg, res) else super#reload_operation op arg res diff --git a/asmcomp/amd64/selection.ml b/asmcomp/amd64/selection.ml index 4de84128..fa7fe66c 100644 --- a/asmcomp/amd64/selection.ml +++ b/asmcomp/amd64/selection.ml @@ -91,6 +91,10 @@ let pseudoregs_for_operation op arg res = (rax, rbx, rcx or rdx). Keep it simple, just force the argument in rax. *) | Ispecific(Ibswap 16) -> ([| rax |], [| rax |]) + (* For imulq, first arg must be in rax, rax is clobbered, and result is in + rdx. *) + | Iintop(Imulh) -> + ([| rax; arg.(1) |], [| rdx |]) | Ispecific(Ifloatarithmem(_,_)) -> let arg' = Array.copy arg in arg'.(0) <- res.(0); @@ -105,10 +109,6 @@ let pseudoregs_for_operation op arg res = ([| rax; rcx |], [| rax |]) | Iintop(Imod) -> ([| rax; rcx |], [| rdx |]) - (* For div and mod with immediate operand, arg must not be in rax. - Keep it simple, force it in rdx. *) - | Iintop_imm((Idiv|Imod), _) -> - ([| rdx |], [| rdx |]) (* Other instructions are regular *) | _ -> raise Use_default @@ -152,20 +152,20 @@ method select_addressing chunk exp = | Ascaledadd(e1, e2, scale) -> (Iindexed2scaled(scale, d), Ctuple[e1; e2]) -method! select_store addr exp = +method! select_store is_assign addr exp = match exp with Cconst_int n when self#is_immediate n -> - (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) - | Cconst_natint n when self#is_immediate_natint n -> - (Ispecific(Istore_int(n, addr)), Ctuple []) + (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) + | (Cconst_natint n | Cconst_blockheader n) when self#is_immediate_natint n -> + (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | Cconst_pointer n when self#is_immediate n -> - (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) + (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) | Cconst_natpointer n when self#is_immediate_natint n -> - (Ispecific(Istore_int(n, addr)), Ctuple []) + (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | Cconst_symbol s when not (!pic_code || !Clflags.dlcode) -> - (Ispecific(Istore_symbol(s, addr)), Ctuple []) + (Ispecific(Istore_symbol(s, addr, is_assign)), Ctuple []) | _ -> - super#select_store addr exp + super#select_store is_assign addr exp method! select_operation op args = match op with @@ -176,21 +176,6 @@ method! select_operation op args = | (Iindexed2 0, _) -> super#select_operation op args | (addr, arg) -> (Ispecific(Ilea addr), [arg]) end - (* Recognize (x / cst) and (x % cst) only if cst is a power of 2. *) - | Cdivi -> - begin match args with - [arg1; Cconst_int n] when self#is_immediate n - && n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Idiv, n), [arg1]) - | _ -> (Iintop Idiv, args) - end - | Cmodi -> - begin match args with - [arg1; Cconst_int n] when self#is_immediate n - && n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Imod, n), [arg1]) - | _ -> (Iintop Imod, args) - end (* Recognize float arithmetic with memory. *) | Caddf -> self#select_floatarith true Iaddf Ifloatadd args @@ -227,6 +212,9 @@ method! select_operation op args = | Cextcall("caml_int64_direct_bswap", _, _, _) | Cextcall("caml_nativeint_direct_bswap", _, _, _) -> (Ispecific (Ibswap 64), args) + (* AMD64 does not support immediate operands for multiply high signed *) + | Cmulhi -> + (Iintop Imulh, args) | _ -> super#select_operation op args (* Recognize float arithmetic with mem *) @@ -246,6 +234,9 @@ method select_floatarith commutative regular_op mem_op args = | _ -> assert false +method! mark_c_tailcall = + Proc.contains_calls := true + (* Deal with register constraints *) method! insert_op_debug op dbg rs rd = diff --git a/asmcomp/arm/CSE.ml b/asmcomp/arm/CSE.ml new file mode 100644 index 00000000..bea333dc --- /dev/null +++ b/asmcomp/arm/CSE.ml @@ -0,0 +1,37 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for ARM *) + +open Arch +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic as super + +method! class_of_operation op = + match op with + | Ispecific(Ishiftcheckbound _) -> Op_checkbound + | Ispecific _ -> Op_pure + | _ -> super#class_of_operation op + +method! is_cheap_operation op = + match op with + | Iconst_int n | Iconst_blockheader n -> n <= 255n && n >= 0n + | _ -> false + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/arm/arch.ml b/asmcomp/arm/arch.ml index cac286aa..d93c1e0e 100644 --- a/asmcomp/arm/arch.ml +++ b/asmcomp/arm/arch.ml @@ -21,7 +21,7 @@ type fpu = Soft | VFPv2 | VFPv3_D16 | VFPv3 let abi = match Config.system with - "linux_eabi" -> EABI + "linux_eabi" | "freebsd" -> EABI | "linux_eabihf" -> EABI_HF | _ -> assert false @@ -107,9 +107,10 @@ type addressing_mode = (* Specific operations *) type specific_operation = - Ishiftarith of arith_operation * int - | Ishiftcheckbound of int + Ishiftarith of arith_operation * shift_operation * int + | Ishiftcheckbound of shift_operation * int | Irevsubimm of int + | Imulhadd (* multiply high and add *) | Imuladd (* multiply and add *) | Imulsub (* multiply and subtract *) | Inegmulf (* floating-point negate and multiply *) @@ -124,6 +125,14 @@ and arith_operation = Ishiftadd | Ishiftsub | Ishiftsubrev + | Ishiftand + | Ishiftor + | Ishiftxor + +and shift_operation = + Ishiftlogicalleft + | Ishiftlogicalright + | Ishiftarithmeticright (* Sizes, endianness *) @@ -155,23 +164,41 @@ let print_addressing printreg addr ppf arg = printreg ppf arg.(0); if n <> 0 then fprintf ppf " + %i" n +let shiftop_name = function + | Ishiftlogicalleft -> "<<" + | Ishiftlogicalright -> ">>u" + | Ishiftarithmeticright -> ">>s" + let print_specific_operation printreg op ppf arg = match op with - | Ishiftarith(op, shift) -> - let op_name = function - | Ishiftadd -> "+" - | Ishiftsub -> "-" - | Ishiftsubrev -> "-rev" in - let shift_mark = - if shift >= 0 - then sprintf "<< %i" shift - else sprintf ">> %i" (-shift) in - fprintf ppf "%a %s %a %s" - printreg arg.(0) (op_name op) printreg arg.(1) shift_mark - | Ishiftcheckbound n -> - fprintf ppf "check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) + Ishiftarith(op, shiftop, amount) -> + let (op1_name, op2_name) = match op with + Ishiftadd -> ("", "+") + | Ishiftsub -> ("", "-") + | Ishiftsubrev -> ("-", "+") + | Ishiftand -> ("", "&") + | Ishiftor -> ("", "|") + | Ishiftxor -> ("", "^") in + fprintf ppf "%s%a %s (%a %s %i)" + op1_name + printreg arg.(0) + op2_name + printreg arg.(1) + (shiftop_name shiftop) + amount + | Ishiftcheckbound(shiftop, amount) -> + fprintf ppf "check (%a %s %i) > %a" + printreg arg.(0) + (shiftop_name shiftop) + amount + printreg arg.(1) | Irevsubimm n -> fprintf ppf "%i %s %a" n "-" printreg arg.(0) + | Imulhadd -> + fprintf ppf "%a *h %a) + %a" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) | Imuladd -> fprintf ppf "(%a * %a) + %a" printreg arg.(0) diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index 4a126151..61035b85 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -173,19 +173,23 @@ let name_for_comparison = function | Iunsigned Cge -> "cs" | Iunsigned Clt -> "cc" | Iunsigned Cgt -> "hi" let name_for_int_operation = function - Iadd -> "add" - | Isub -> "sub" - | Imul -> "mul" - | Iand -> "and" - | Ior -> "orr" - | Ixor -> "eor" + (* Use adds,subs,... to enable 16-bit T1 encoding *) + Iadd -> "adds" + | Isub -> "subs" + | Imul -> "mul" + | Imulh -> "smmul" + | Iand -> "ands" + | Ior -> "orrs" + | Ixor -> "eors" + | Ilsl -> "lsls" + | Ilsr -> "lsrs" + | Iasr -> "asrs" | _ -> assert false let name_for_shift_operation = function - Ilsl -> "lsl" - | Ilsr -> "lsr" - | Iasr -> "asr" - | _ -> assert false + Ishiftlogicalleft -> "lsl" + | Ishiftlogicalright -> "lsr" + | Ishiftarithmeticright -> "asr" (* General functional to decompose a non-immediate integer constant into 8-bit chunks shifted left 0 ... 30 bits. *) @@ -233,8 +237,9 @@ let emit_intconst dst n = decompose_intconst n (fun bits -> if !first - then ` mov {emit_reg dst}, #{emit_int32 bits} @ {emit_int32 n}\n` - else ` add {emit_reg dst}, {emit_reg dst}, #{emit_int32 bits}\n`; + (* Use movs,adds here to enable 16-bit T1 encoding *) + then ` movs {emit_reg dst}, #{emit_int32 bits} @ {emit_int32 n}\n` + else ` adds {emit_reg dst}, {emit_reg dst}, #{emit_int32 bits}\n`; first := false) end @@ -268,7 +273,7 @@ let function_name = ref "" (* Entry point for tail recursive calls *) let tailrec_entry_point = ref 0 (* Pending floating-point literals *) -let float_literals = ref ([] : (string * label) list) +let float_literals = ref ([] : (int64 * label) list) (* Pending relative references to the global offset table *) let gotrel_literals = ref ([] : (label * label) list) (* Pending symbol literals *) @@ -278,12 +283,13 @@ let num_literals = ref 0 (* Label a floating-point literal *) let float_literal f = + let repr = Int64.bits_of_float f in try - List.assoc f !float_literals + List.assoc repr !float_literals with Not_found -> let lbl = new_label() in num_literals := !num_literals + 2; - float_literals := (f, lbl) :: !float_literals; + float_literals := (repr, lbl) :: !float_literals; lbl (* Label a GOTREL literal *) @@ -309,7 +315,7 @@ let emit_literals() = ` .align 3\n`; List.iter (fun (f, lbl) -> - `{emit_label lbl}: .double {emit_string f}\n`) + `{emit_label lbl}:`; emit_float64_split_directive ".long" f) !float_literals; float_literals := [] end; @@ -382,11 +388,10 @@ let emit_instr i = ` ldr {emit_reg dst}, {emit_stack src}\n` end; 1 end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> emit_intconst i.res.(0) (Nativeint.to_int32 n) | Lop(Iconst_float f) when !fpu = Soft -> - ` @ {emit_string f}\n`; - let bits = Int64.bits_of_float (float_of_string f) in + let bits = Int64.bits_of_float f in let high_bits = Int64.to_int32 (Int64.shift_right_logical bits 32) and low_bits = Int64.to_int32 bits in if is_immediate low_bits || is_immediate high_bits then begin @@ -401,7 +406,7 @@ let emit_instr i = end | Lop(Iconst_float f) when !fpu = VFPv2 -> let lbl = float_literal f in - ` fldd {emit_reg i.res.(0)}, {emit_label lbl} @ {emit_string f}\n`; + ` fldd {emit_reg i.res.(0)}, {emit_label lbl}\n`; 1 | Lop(Iconst_float f) -> let encode imm = @@ -420,12 +425,12 @@ let emit_instr i = let ex = ((ex + 3) land 0x07) lxor 0x04 in Some((sg lsl 7) lor (ex lsl 4) lor mn) end in - begin match encode (Int64.bits_of_float (float_of_string f)) with + begin match encode (Int64.bits_of_float f) with None -> let lbl = float_literal f in - ` fldd {emit_reg i.res.(0)}, {emit_label lbl} @ {emit_string f}\n` + ` fldd {emit_reg i.res.(0)}, {emit_label lbl}\n` | Some imm8 -> - ` fconstd {emit_reg i.res.(0)}, #{emit_int imm8} @ {emit_string f}\n` + ` fconstd {emit_reg i.res.(0)}, #{emit_int imm8}\n` end; 1 | Lop(Iconst_symbol s) -> emit_load_symbol_addr i.res.(0) s @@ -503,10 +508,10 @@ let emit_instr i = | Double_u -> "fldd" | _ (* 32-bit quantities *) -> "ldr" in ` {emit_string instr} {emit_reg r}, {emit_addressing addr i.arg 0}\n`; 1 - | Lop(Istore(Single, addr)) when !fpu >= VFPv2 -> + | Lop(Istore(Single, addr, _)) when !fpu >= VFPv2 -> ` fcvtsd s14, {emit_reg i.arg.(0)}\n`; ` fsts s14, {emit_addressing addr i.arg 1}\n`; 2 - | Lop(Istore((Double | Double_u), addr)) when !fpu = Soft -> + | Lop(Istore((Double | Double_u), addr, _)) when !fpu = Soft -> (* Use STM or STRD if possible *) begin match i.arg.(0), i.arg.(1), addr with {loc = Reg rt}, {loc = Reg rt2}, Iindexed 0 @@ -520,7 +525,7 @@ let emit_instr i = ` str {emit_reg i.arg.(0)}, {emit_addressing addr i.arg 2}\n`; ` str {emit_reg i.arg.(1)}, {emit_addressing addr' i.arg 2}\n`; 2 end - | Lop(Istore(size, addr)) -> + | Lop(Istore(size, addr, _)) -> let r = i.arg.(0) in let instr = match size with @@ -562,9 +567,6 @@ let emit_instr i = `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 1 + ninstr end - | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> - let shift = name_for_shift_operation op in - ` mov {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_string shift} {emit_reg i.arg.(1)}\n`; 1 | Lop(Iintop(Icomp cmp)) -> let compthen = name_for_comparison cmp in let compelse = name_for_comparison (negate_integer_comparison cmp) in @@ -587,45 +589,21 @@ let emit_instr i = let lbl = bound_error_label i.dbg in ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; ` bls {emit_label lbl}\n`; 2 - | Lop(Ispecific(Ishiftcheckbound shift)) -> + | Lop(Ispecific(Ishiftcheckbound(shiftop, n))) -> let lbl = bound_error_label i.dbg in - ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; + let op = name_for_shift_operation shiftop in + ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, {emit_string op} #{emit_int n}\n`; ` bcs {emit_label lbl}\n`; 2 + | Lop(Iintop Imulh) when !arch < ARMv6 -> + ` smull r12, {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 + | Lop(Ispecific Imulhadd) -> + ` smmla {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n`; 1 | Lop(Iintop op) -> let instr = name_for_int_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 - | Lop(Iintop_imm(Idiv, n)) -> (* n is a power of 2 *) - let l = Misc.log2 n in - let r = i.res.(0) in - ` movs {emit_reg r}, {emit_reg i.arg.(0)}\n`; - if n <= 256 then begin - ` it lt\n`; - ` addlt {emit_reg r}, {emit_reg r}, #{emit_int (n-1)}\n` - end else begin - ` itt lt\n`; - ` addlt {emit_reg r}, {emit_reg r}, #{emit_int n}\n`; - ` sublt {emit_reg r}, {emit_reg r}, #1\n` - end; - ` mov {emit_reg r}, {emit_reg r}, asr #{emit_int l}\n`; 5 - | Lop(Iintop_imm(Imod, n)) -> (* n is a power of 2 *) - let l = Misc.log2 n in - let a = i.arg.(0) in - let r = i.res.(0) in - let lbl = new_label() in - ` cmp {emit_reg a}, #0\n`; - ` mov {emit_reg r}, {emit_reg a}, lsl #{emit_int (32-l)}\n`; - ` mov {emit_reg r}, {emit_reg r}, lsr #{emit_int (32-l)}\n`; - ` bpl {emit_label lbl}\n`; - ` cmp {emit_reg r}, #0\n`; - ` it ne\n`; - ` subne {emit_reg r}, {emit_reg r}, #{emit_int n}\n`; - `{emit_label lbl}:\n`; 7 - | Lop(Iintop_imm((Ilsl | Ilsr | Iasr as op), n)) -> - let shift = name_for_shift_operation op in - ` mov {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_string shift} #{emit_int n}\n`; 1 + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 | Lop(Iintop_imm(op, n)) -> let instr = name_for_int_operation op in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n`; 1 + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n`; 1 | Lop(Iabsf | Inegf as op) when !fpu = Soft -> let instr = (match op with Iabsf -> "bic" @@ -664,16 +642,16 @@ let emit_instr i = | _ -> assert false) in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n`; 1 - | Lop(Ispecific(Ishiftarith(op, shift))) -> + | Lop(Ispecific(Ishiftarith(op, shiftop, n))) -> let instr = (match op with Ishiftadd -> "add" | Ishiftsub -> "sub" - | Ishiftsubrev -> "rsb") in - ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}`; - if shift >= 0 - then `, lsl #{emit_int shift}\n` - else `, asr #{emit_int (-shift)}\n`; - 1 + | Ishiftsubrev -> "rsb" + | Ishiftand -> "and" + | Ishiftor -> "orr" + | Ishiftxor -> "eor") in + let op = name_for_shift_operation shiftop in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_string op} #{emit_int n}\n`; 1 | Lop(Ispecific(Irevsubimm n)) -> ` rsb {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n`; 1 | Lop(Ispecific(Imuladd | Imulsub as op)) -> @@ -803,11 +781,13 @@ let emit_instr i = ` pop \{trap_ptr, lr}\n`; cfi_adjust_cfa_offset (-8); stack_offset := !stack_offset - 8; 1 - | Lraise -> - if !Clflags.debug then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, (Lambda.Raise_regular | Lambda.Raise_reraise) -> ` {emit_call "caml_raise_exn"}\n`; `{record_frame Reg.Set.empty i.dbg}\n`; 1 - end else begin + | false, _ + | true, Lambda.Raise_notrace -> ` mov sp, trap_ptr\n`; ` pop \{trap_ptr, pc}\n`; 2 end @@ -894,8 +874,8 @@ let emit_item = function | Cint16 n -> ` .short {emit_int n}\n` | Cint32 n -> ` .long {emit_int32 (Nativeint.to_int32 n)}\n` | Cint n -> ` .long {emit_int32 (Nativeint.to_int32 n)}\n` - | Csingle f -> ` .single {emit_string f}\n` - | Cdouble f -> ` .double {emit_string f}\n` + | Csingle f -> emit_float32_directive ".long" (Int32.bits_of_float f) + | Cdouble f -> emit_float64_split_directive ".long" (Int64.bits_of_float f) | Csymbol_address s -> ` .word {emit_symbol s}\n` | Clabel_address lbl -> ` .word {emit_data_label lbl}\n` | Cstring s -> emit_string_directive " .ascii " s diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index dbb13173..6b2ba3cf 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -82,14 +82,14 @@ let rotate_registers = true (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 9 Reg.dummy in + let v = Array.make 9 Reg.dummy in for i = 0 to 8 do v.(i) <- Reg.at_location Int (Reg i) done; v let hard_float_reg = - let v = Array.create 32 Reg.dummy in + let v = Array.make 32 Reg.dummy in for i = 0 to 31 do v.(i) <- Reg.at_location Float (Reg(100 + i)) done; @@ -108,7 +108,7 @@ let stack_slot slot ty = let calling_conventions first_int last_int first_float last_float make_stack arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref 0 in @@ -166,13 +166,17 @@ let loc_external_results res = let loc_exn_bucket = phys_reg 0 +(* Volatile registers: none *) + +let regs_are_volatile rs = false + (* Registers destroyed by operations *) let destroyed_at_alloc = (* r0-r6, d0-d15 preserved *) Array.of_list (List.map phys_reg [7;8; - 116;116;118;119;120;121;122;123; + 116;117;118;119;120;121;122;123; 124;125;126;127;128;129;130;131]) let destroyed_at_c_call = @@ -183,12 +187,12 @@ let destroyed_at_c_call = [0;1;2;3;8; 100;101;102;103;104;105;106;107; 108;109;110;111;112;113;114;115; - 116;116;118;119;120;121;122;123; + 116;117;118;119;120;121;122;123; 124;125;126;127;128;129;130;131] | EABI_HF -> (* r4-r7, d8-d15 preserved *) [0;1;2;3;8; 100;101;102;103;104;105;106;107; - 116;116;118;119;120;121;122;123; + 116;117;118;119;120;121;122;123; 124;125;126;127;128;129;130;131])) let destroyed_at_oper = function @@ -201,7 +205,9 @@ let destroyed_at_oper = function destroyed_at_alloc | Iop(Iconst_symbol _) when !pic_code -> [| phys_reg 3; phys_reg 8 |] (* r3 and r12 destroyed *) - | Iop(Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _)) -> + | Iop(Iintop Imulh) when !arch < ARMv6 -> + [| phys_reg 8 |] (* r12 destroyed *) + | Iop(Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _, _)) -> [| phys_reg 107 |] (* d7 (s14-s15) destroyed *) | _ -> [||] @@ -220,9 +226,19 @@ let max_register_pressure = function | Ialloc _ -> if abi = EABI then [| 7; 0; 0 |] else [| 7; 8; 8 |] | Iconst_symbol _ when !pic_code -> [| 7; 16; 32 |] | Iintoffloat | Ifloatofint - | Iload(Single, _) | Istore(Single, _) -> [| 9; 15; 31 |] + | Iload(Single, _) | Istore(Single, _, _) -> [| 9; 15; 31 |] | _ -> [| 9; 16; 32 |] +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) + | Ispecific(Ishiftcheckbound _) -> false + | _ -> true + (* Layout of the stack *) let num_stack_slots = [| 0; 0; 0 |] diff --git a/asmcomp/arm/scheduling.ml b/asmcomp/arm/scheduling.ml index 9e2d65bc..0d6618ab 100644 --- a/asmcomp/arm/scheduling.ml +++ b/asmcomp/arm/scheduling.ml @@ -31,8 +31,8 @@ method oper_latency = function | Ifloatofint (* mcr/mrc count as memory access *) | Iintoffloat -> 2 (* Multiplys have a latency of two cycles *) - | Iintop Imul - | Ispecific(Imuladd | Imulsub) -> 2 + | Iintop (Imul | Imulh) + | Ispecific(Imuladd | Imulsub | Imulhadd) -> 2 (* VFP instructions *) | Iaddf | Isubf @@ -58,10 +58,8 @@ method oper_issue_cycles = function | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> 2 | Ispecific(Ishiftcheckbound _) -> 3 - | Iintop_imm(Idiv, _) -> 4 - | Iintop_imm(Imod, _) -> 6 - | Iintop Imul - | Ispecific(Imuladd | Imulsub) -> 2 + | Iintop(Imul | Imulh) + | Ispecific(Imuladd | Imulsub | Imulhadd) -> 2 (* VFP instructions *) | Iaddf | Isubf -> 7 diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index 97f615ec..9cd6090c 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -37,15 +37,18 @@ let is_offset chunk n = | _ -> n >= -255 && n <= 255 -let is_intconst = function - Cconst_int _ -> true - | _ -> false +let select_shiftop = function + Clsl -> Ishiftlogicalleft + | Clsr -> Ishiftlogicalright + | Casr -> Ishiftarithmeticright + | __-> assert false (* Special constraints on operand and result registers *) exception Use_default let r1 = phys_reg 1 +let r12 = phys_reg 8 let pseudoregs_for_operation op arg res = match op with @@ -54,6 +57,11 @@ let pseudoregs_for_operation op arg res = is also a result of the mul / mla operation. *) Iintop Imul | Ispecific Imuladd when !arch < ARMv6 -> (arg, [| res.(0); arg.(0) |]) + (* For smull rdlo,rdhi,rn,rm (pre-ARMv6) the registers rdlo, rdhi and rn + must be different. We deal with this by pretending that rn is also a + result of the smull operation. *) + | Iintop Imulh when !arch < ARMv6 -> + (arg, [| res.(0); arg.(0) |]) (* Soft-float Iabsf and Inegf: arg.(0) and res.(0) must be the same *) | Iabsf | Inegf when !fpu = Soft -> ([|res.(0); arg.(1)|], res) @@ -110,24 +118,27 @@ method select_addressing chunk = function | arg -> (Iindexed 0, arg) -method select_shift_arith op shiftop shiftrevop args = +method select_shift_arith op arithop arithrevop args = match args with - [arg1; Cop(Clsl, [arg2; Cconst_int n])] - when n > 0 && n < 32 && not(is_intconst arg2) -> - (Ispecific(Ishiftarith(shiftop, n)), [arg1; arg2]) - | [arg1; Cop(Casr, [arg2; Cconst_int n])] - when n > 0 && n < 32 && not(is_intconst arg2) -> - (Ispecific(Ishiftarith(shiftop, -n)), [arg1; arg2]) - | [Cop(Clsl, [arg1; Cconst_int n]); arg2] - when n > 0 && n < 32 && not(is_intconst arg1) -> - (Ispecific(Ishiftarith(shiftrevop, n)), [arg2; arg1]) - | [Cop(Casr, [arg1; Cconst_int n]); arg2] - when n > 0 && n < 32 && not(is_intconst arg1) -> - (Ispecific(Ishiftarith(shiftrevop, -n)), [arg2; arg1]) + [arg1; Cop(Clsl | Clsr | Casr as op, [arg2; Cconst_int n])] + when n > 0 && n < 32 -> + (Ispecific(Ishiftarith(arithop, select_shiftop op, n)), [arg1; arg2]) + | [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int n]); arg2] + when n > 0 && n < 32 -> + (Ispecific(Ishiftarith(arithrevop, select_shiftop op, n)), [arg2; arg1]) | args -> begin match super#select_operation op args with + (* Recognize multiply high and add *) + (Iintop Iadd, [Cop(Cmulhi, args); arg3]) + | (Iintop Iadd, [arg3; Cop(Cmulhi, args)]) as op_args + when !arch >= ARMv6 -> + begin match self#select_operation Cmulhi args with + (Iintop Imulh, [arg1; arg2]) -> + (Ispecific Imulhadd, [arg1; arg2; arg3]) + | _ -> op_args + end (* Recognize multiply and add *) - (Iintop Iadd, [Cop(Cmuli, args); arg3]) + | (Iintop Iadd, [Cop(Cmuli, args); arg3]) | (Iintop Iadd, [arg3; Cop(Cmuli, args)]) as op_args -> begin match self#select_operation Cmuli args with (Iintop Imul, [arg1; arg2]) -> @@ -161,21 +172,23 @@ method! select_operation op args = (Ispecific(Irevsubimm n), [arg]) | ((Csuba | Csubi as op), args) -> self#select_shift_arith op Ishiftsub Ishiftsubrev args - | (Ccheckbound _, [Cop(Clsr, [arg1; Cconst_int n]); arg2]) - when n > 0 && n < 32 && not(is_intconst arg2) -> - (Ispecific(Ishiftcheckbound n), [arg1; arg2]) + | (Cand as op, args) -> + self#select_shift_arith op Ishiftand Ishiftand args + | (Cor as op, args) -> + self#select_shift_arith op Ishiftor Ishiftor args + | (Cxor as op, args) -> + self#select_shift_arith op Ishiftxor Ishiftxor args + | (Ccheckbound _, [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int n]); arg2]) + when n > 0 && n < 32 -> + (Ispecific(Ishiftcheckbound(select_shiftop op, n)), [arg1; arg2]) (* ARM does not support immediate operands for multiplication *) | (Cmuli, args) -> (Iintop Imul, args) + | (Cmulhi, args) -> + (Iintop Imulh, args) (* Turn integer division/modulus into runtime ABI calls *) - | (Cdivi, [arg; Cconst_int n]) - when n = 1 lsl Misc.log2 n -> - (Iintop_imm(Idiv, n), [arg]) | (Cdivi, args) -> (Iextcall("__aeabi_idiv", false), args) - | (Cmodi, [arg; Cconst_int n]) - when n > 1 && n = 1 lsl Misc.log2 n -> - (Iintop_imm(Imod, n), [arg]) | (Cmodi, args) -> (* See above for fix up of return register *) (Iextcall("__aeabi_idivmod", false), args) diff --git a/asmcomp/arm64/CSE.ml b/asmcomp/arm64/CSE.ml new file mode 100644 index 00000000..f9e03e48 --- /dev/null +++ b/asmcomp/arm64/CSE.ml @@ -0,0 +1,37 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for ARM64 *) + +open Arch +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic as super + +method! class_of_operation op = + match op with + | Ispecific(Ishiftcheckbound _) -> Op_checkbound + | Ispecific _ -> Op_pure + | _ -> super#class_of_operation op + +method! is_cheap_operation op = + match op with + | Iconst_int n | Iconst_blockheader n -> n <= 65535n && n >= 0n + | _ -> false + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/arm64/arch.ml b/asmcomp/arm64/arch.ml new file mode 100644 index 00000000..bfbe183f --- /dev/null +++ b/asmcomp/arm64/arch.ml @@ -0,0 +1,145 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* Benedikt Meurer, University of Siegen *) +(* *) +(* Copyright 2013 Institut National de Recherche en Informatique *) +(* et en Automatique. Copyright 2012 Benedikt Meurer. All rights *) +(* reserved. This file is distributed under the terms of the Q *) +(* Public License version 1.0. *) +(* *) +(***********************************************************************) + +let command_line_options = [] + +(* Specific operations for the ARM processor, 64-bit mode *) + +open Format + +let command_line_options = [] + +(* Addressing modes *) + +type addressing_mode = + | Iindexed of int (* reg + displ *) + | Ibased of string * int (* global var + displ *) + +(* We do not support the reg + shifted reg addressing mode, because + what we really need is reg + shifted reg + displ, + and this is decomposed in two instructions (reg + shifted reg -> tmp, + then addressing tmp + displ). *) + +(* Specific operations *) + +type specific_operation = + | Ishiftarith of arith_operation * int + | Ishiftcheckbound of int + | Imuladd (* multiply and add *) + | Imulsub (* multiply and subtract *) + | Inegmulf (* floating-point negate and multiply *) + | Imuladdf (* floating-point multiply and add *) + | Inegmuladdf (* floating-point negate, multiply and add *) + | Imulsubf (* floating-point multiply and subtract *) + | Inegmulsubf (* floating-point negate, multiply and subtract *) + | Isqrtf (* floating-point square root *) + | Ibswap of int (* endianess conversion *) + +and arith_operation = + Ishiftadd + | Ishiftsub + +(* Sizes, endianness *) + +let big_endian = false + +let size_addr = 8 +let size_int = 8 +let size_float = 8 + +let allow_unaligned_access = false + +(* Behavior of division *) + +let division_crashes_on_overflow = false + +(* Operations on addressing modes *) + +let identity_addressing = Iindexed 0 + +let offset_addressing addr delta = + match addr with + | Iindexed n -> Iindexed(n + delta) + | Ibased(s, n) -> Ibased(s, n + delta) + +let num_args_addressing = function + | Iindexed n -> 1 + | Ibased(s, n) -> 0 + +(* Printing operations and addressing modes *) + +let print_addressing printreg addr ppf arg = + match addr with + | Iindexed n -> + printreg ppf arg.(0); + if n <> 0 then fprintf ppf " + %i" n + | Ibased(s, 0) -> + fprintf ppf "\"%s\"" s + | Ibased(s, n) -> + fprintf ppf "\"%s\" + %i" s n + +let print_specific_operation printreg op ppf arg = + match op with + | Ishiftarith(op, shift) -> + let op_name = function + | Ishiftadd -> "+" + | Ishiftsub -> "-" in + let shift_mark = + if shift >= 0 + then sprintf "<< %i" shift + else sprintf ">> %i" (-shift) in + fprintf ppf "%a %s %a %s" + printreg arg.(0) (op_name op) printreg arg.(1) shift_mark + | Ishiftcheckbound n -> + fprintf ppf "check %a >> %i > %a" printreg arg.(0) n printreg arg.(1) + | Imuladd -> + fprintf ppf "(%a * %a) + %a" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Imulsub -> + fprintf ppf "-(%a * %a) + %a" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Inegmulf -> + fprintf ppf "-f (%a *f %a)" + printreg arg.(0) + printreg arg.(1) + | Imuladdf -> + fprintf ppf "%a +f (%a *f %a)" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Inegmuladdf -> + fprintf ppf "(-f %a) -f (%a *f %a)" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Imulsubf -> + fprintf ppf "%a -f (%a *f %a)" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Inegmulsubf -> + fprintf ppf "(-f %a) +f (%a *f %a)" + printreg arg.(0) + printreg arg.(1) + printreg arg.(2) + | Isqrtf -> + fprintf ppf "sqrtf %a" + printreg arg.(0) + | Ibswap n -> + fprintf ppf "bswap%i %a" n + printreg arg.(0) diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp new file mode 100644 index 00000000..734bd23e --- /dev/null +++ b/asmcomp/arm64/emit.mlp @@ -0,0 +1,736 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* Benedikt Meurer, University of Siegen *) +(* *) +(* Copyright 2013 Institut National de Recherche en Informatique *) +(* et en Automatique. Copyright 2012 Benedikt Meurer. All rights *) +(* reserved. This file is distributed under the terms of the Q *) +(* Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Emission of ARM assembly code, 64-bit mode *) + +open Misc +open Cmm +open Arch +open Proc +open Reg +open Mach +open Linearize +open Emitaux + +(* Tradeoff between code size and code speed *) + +let fastcode_flag = ref true + +(* Names for special regs *) + +let reg_trap_ptr = phys_reg 23 +let reg_alloc_ptr = phys_reg 24 +let reg_alloc_limit = phys_reg 25 +let reg_tmp1 = phys_reg 26 +let reg_tmp2 = phys_reg 27 +let reg_x15 = phys_reg 15 + +(* Output a label *) + +let emit_label lbl = + emit_string ".L"; emit_int lbl + +let emit_data_label lbl = + emit_string ".Ld"; emit_int lbl + +(* Symbols *) + +let emit_symbol s = + Emitaux.emit_symbol '$' s + +(* Output a pseudo-register *) + +let emit_reg = function + {loc = Reg r} -> emit_string (register_name r) + | _ -> fatal_error "Emit.emit_reg" + +(* Likewise, but with the 32-bit name of the register *) + +let int_reg_name_w = + [| "w0"; "w1"; "w2"; "w3"; "w4"; "w5"; "w6"; "w7"; + "w8"; "w9"; "w10"; "w11"; "w12"; "w13"; "w14"; "w15"; + "w19"; "w20"; "w21"; "w22"; "w23"; "w24"; "w25"; + "w26"; "w27"; "w28"; "w16"; "w17" |] + +let emit_wreg = function + {loc = Reg r} -> emit_string int_reg_name_w.(r) + | _ -> fatal_error "Emit.emit_wreg" + +(* Layout of the stack frame *) + +let stack_offset = ref 0 + +let frame_size () = + let sz = + !stack_offset + + 8 * num_stack_slots.(0) + + 8 * num_stack_slots.(1) + + (if !contains_calls then 8 else 0) + in Misc.align sz 16 + +let slot_offset loc cl = + match loc with + Incoming n -> + assert (n >= 0); + frame_size() + n + | Local n -> + !stack_offset + + (if cl = 0 + then n * 8 + else num_stack_slots.(0) * 8 + n * 8) + | Outgoing n -> + assert (n >= 0); + n + +(* Output a stack reference *) + +let emit_stack r = + match r.loc with + | Stack s -> + let ofs = slot_offset s (register_class r) in `[sp, #{emit_int ofs}]` + | _ -> fatal_error "Emit.emit_stack" + +(* Output an addressing mode *) + +let emit_symbol_offset s ofs = + emit_symbol s; + if ofs > 0 then `+{emit_int ofs}` + else if ofs < 0 then `-{emit_int (-ofs)}` + else () + +let emit_addressing addr r = + match addr with + | Iindexed ofs -> + `[{emit_reg r}, #{emit_int ofs}]` + | Ibased(s, ofs) -> + `[{emit_reg r}, #:lo12:{emit_symbol_offset s ofs}]` + +(* Record live pointers at call points *) + +let record_frame_label live dbg = + let lbl = new_label() in + let live_offset = ref [] in + Reg.Set.iter + (function + {typ = Addr; loc = Reg r} -> + live_offset := ((r lsl 1) + 1) :: !live_offset + | {typ = Addr; loc = Stack s} as reg -> + live_offset := slot_offset s (register_class reg) :: !live_offset + | _ -> ()) + live; + frame_descriptors := + { fd_lbl = lbl; + fd_frame_size = frame_size(); + fd_live_offset = !live_offset; + fd_debuginfo = dbg } :: !frame_descriptors; + lbl + +let record_frame live dbg = + let lbl = record_frame_label live dbg in `{emit_label lbl}:` + +(* Record calls to the GC -- we've moved them out of the way *) + +type gc_call = + { gc_lbl: label; (* Entry label *) + gc_return_lbl: label; (* Where to branch after GC *) + gc_frame_lbl: label } (* Label of frame descriptor *) + +let call_gc_sites = ref ([] : gc_call list) + +let emit_call_gc gc = + `{emit_label gc.gc_lbl}: bl {emit_symbol "caml_call_gc"}\n`; + `{emit_label gc.gc_frame_lbl}: b {emit_label gc.gc_return_lbl}\n` + +(* Record calls to caml_ml_array_bound_error. + In debug mode, we maintain one call to caml_ml_array_bound_error + per bound check site. Otherwise, we can share a single call. *) + +type bound_error_call = + { bd_lbl: label; (* Entry label *) + bd_frame_lbl: label } (* Label of frame descriptor *) + +let bound_error_sites = ref ([] : bound_error_call list) + +let bound_error_label dbg = + if !Clflags.debug || !bound_error_sites = [] then begin + let lbl_bound_error = new_label() in + let lbl_frame = record_frame_label Reg.Set.empty dbg in + bound_error_sites := + { bd_lbl = lbl_bound_error; + bd_frame_lbl = lbl_frame } :: !bound_error_sites; + lbl_bound_error + end else begin + let bd = List.hd !bound_error_sites in bd.bd_lbl + end + +let emit_call_bound_error bd = + `{emit_label bd.bd_lbl}: bl {emit_symbol "caml_ml_array_bound_error"}\n`; + `{emit_label bd.bd_frame_lbl}:\n` + +(* Names of various instructions *) + +let name_for_comparison = function + | Isigned Ceq -> "eq" | Isigned Cne -> "ne" | Isigned Cle -> "le" + | Isigned Cge -> "ge" | Isigned Clt -> "lt" | Isigned Cgt -> "gt" + | Iunsigned Ceq -> "eq" | Iunsigned Cne -> "ne" | Iunsigned Cle -> "ls" + | Iunsigned Cge -> "cs" | Iunsigned Clt -> "cc" | Iunsigned Cgt -> "hi" + +let name_for_int_operation = function + | Iadd -> "add" + | Isub -> "sub" + | Imul -> "mul" + | Idiv -> "sdiv" + | Iand -> "and" + | Ior -> "orr" + | Ixor -> "eor" + | Ilsl -> "lsl" + | Ilsr -> "lsr" + | Iasr -> "asr" + | _ -> assert false + +(* Load an integer constant into a register *) + +let emit_intconst dst n = + let rec emit_pos first shift = + if shift < 0 then begin + if first then ` mov {emit_reg dst}, xzr\n` + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0n then emit_pos first (shift - 16) else begin + if first then + ` movz {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n` + else + ` movk {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n`; + emit_pos false (shift - 16) + end + end + and emit_neg first shift = + if shift < 0 then begin + if first then ` movn {emit_reg dst}, #0\n` + end else begin + let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in + if s = 0xFFFFn then emit_neg first (shift - 16) else begin + if first then + ` movn {emit_reg dst}, #{emit_nativeint (Nativeint.logxor s 0xFFFFn)}, lsl #{emit_int shift}\n` + else + ` movk {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n`; + emit_neg false (shift - 16) + end + end + in + if n < 0n then emit_neg true 48 else emit_pos true 48 + +(* Recognize float constants appropriate for FMOV dst, #fpimm instruction: + "a normalized binary floating point encoding with 1 sign bit, 4 + bits of fraction and a 3-bit exponent" *) + +let is_immediate_float bits = + let exp = (Int64.(to_int (shift_right_logical bits 52)) land 0x7FF) - 1023 in + let mant = Int64.logand bits 0xF_FFFF_FFFF_FFFFL in + exp >= -3 && exp <= 4 && Int64.logand mant 0xF_0000_0000_0000L = mant + +(* Adjust sp (up or down) by the given byte amount *) + +let emit_stack_adjustment n = + let instr = if n < 0 then "sub" else "add" in + let m = abs n in + assert (m < 0x1_000_000); + let ml = m land 0xFFF and mh = m land 0xFFF_000 in + if mh <> 0 then ` {emit_string instr} sp, sp, #{emit_int mh}\n`; + if ml <> 0 then ` {emit_string instr} sp, sp, #{emit_int ml}\n`; + if n <> 0 then cfi_adjust_cfa_offset (-n) + +(* Deallocate the stack frame and reload the return address + before a return or tail call *) + +let output_epilogue f = + let n = frame_size() in + if !contains_calls then + ` ldr x30, [sp, #{emit_int (n-8)}]\n`; + if n > 0 then + emit_stack_adjustment n; + f(); + (* reset CFA back because function body may continue *) + if n > 0 then cfi_adjust_cfa_offset n + +(* Name of current function *) +let function_name = ref "" +(* Entry point for tail recursive calls *) +let tailrec_entry_point = ref 0 +(* Pending floating-point literals *) +let float_literals = ref ([] : (int64 * label) list) + +(* Label a floating-point literal *) +let float_literal f = + try + List.assoc f !float_literals + with Not_found -> + let lbl = new_label() in + float_literals := (f, lbl) :: !float_literals; + lbl + +(* Emit all pending literals *) +let emit_literals() = + if !float_literals <> [] then begin + ` .align 3\n`; + List.iter + (fun (f, lbl) -> + `{emit_label lbl}:`; emit_float64_directive ".quad" f) + !float_literals; + float_literals := [] + end + +(* Emit code to load the address of a symbol *) + +let emit_load_symbol_addr dst s = + if (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit s then begin + ` adrp {emit_reg dst}, {emit_symbol s}\n`; + ` add {emit_reg dst}, {emit_reg dst}, #:lo12:{emit_symbol s}\n` + end else begin + ` adrp {emit_reg dst}, :got:{emit_symbol s}\n`; + ` ldr {emit_reg dst}, [{emit_reg dst}, #:got_lo12:{emit_symbol s}]\n` + end + +(* Output the assembly code for an instruction *) + +let emit_instr i = + emit_debug_info i.dbg; + match i.desc with + | Lend -> () + | Lop(Imove | Ispill | Ireload) -> + let src = i.arg.(0) and dst = i.res.(0) in + if src.loc <> dst.loc then begin + match (src, dst) with + | {loc = Reg _; typ = Float}, {loc = Reg _} -> + ` fmov {emit_reg dst}, {emit_reg src}\n` + | {loc = Reg _}, {loc = Reg _} -> + ` mov {emit_reg dst}, {emit_reg src}\n` + | {loc = Reg _}, {loc = Stack _} -> + ` str {emit_reg src}, {emit_stack dst}\n` + | {loc = Stack _}, {loc = Reg _} -> + ` ldr {emit_reg dst}, {emit_stack src}\n` + | _ -> + assert false + end + | Lop(Iconst_int n | Iconst_blockheader n) -> + emit_intconst i.res.(0) n + | Lop(Iconst_float f) -> + let b = Int64.bits_of_float f in + if b = 0L then + ` fmov {emit_reg i.res.(0)}, xzr\n` + else if is_immediate_float b then + ` fmov {emit_reg i.res.(0)}, #{emit_printf "0x%Lx" b}\n` + else begin + let lbl = float_literal b in + ` adrp {emit_reg reg_tmp1}, {emit_label lbl}\n`; + ` ldr {emit_reg i.res.(0)}, [{emit_reg reg_tmp1}, #:lo12:{emit_label lbl}]\n` + end + | Lop(Iconst_symbol s) -> + emit_load_symbol_addr i.res.(0) s + | Lop(Icall_ind) -> + ` blr {emit_reg i.arg.(0)}\n`; + `{record_frame i.live i.dbg}\n` + | Lop(Icall_imm s) -> + ` bl {emit_symbol s}\n`; + `{record_frame i.live i.dbg}\n` + | Lop(Itailcall_ind) -> + output_epilogue (fun () -> ` br {emit_reg i.arg.(0)}\n`) + | Lop(Itailcall_imm s) -> + if s = !function_name then + ` b {emit_label !tailrec_entry_point}\n` + else + output_epilogue (fun () -> ` b {emit_symbol s}\n`) + | Lop(Iextcall(s, false)) -> + ` bl {emit_symbol s}\n` + | Lop(Iextcall(s, true)) -> + emit_load_symbol_addr reg_x15 s; + ` bl {emit_symbol "caml_c_call"}\n`; + `{record_frame i.live i.dbg}\n` + | Lop(Istackoffset n) -> + assert (n mod 16 = 0); + emit_stack_adjustment (-n); + stack_offset := !stack_offset + n + | Lop(Iload(size, addr)) -> + let dst = i.res.(0) in + let base = + match addr with + | Iindexed ofs -> i.arg.(0) + | Ibased(s, ofs) -> + ` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`; + reg_tmp1 in + begin match size with + | Byte_unsigned -> + ` ldrb {emit_wreg dst}, {emit_addressing addr base}\n` + | Byte_signed -> + ` ldrsb {emit_reg dst}, {emit_addressing addr base}\n` + | Sixteen_unsigned -> + ` ldrh {emit_wreg dst}, {emit_addressing addr base}\n` + | Sixteen_signed -> + ` ldrsh {emit_reg dst}, {emit_addressing addr base}\n` + | Thirtytwo_unsigned -> + ` ldr {emit_wreg dst}, {emit_addressing addr base}\n` + | Thirtytwo_signed -> + ` ldrsw {emit_reg dst}, {emit_addressing addr base}\n` + | Single -> + ` ldr s7, {emit_addressing addr base}\n`; + ` fcvt {emit_reg dst}, s7\n` + | Word | Double | Double_u -> + ` ldr {emit_reg dst}, {emit_addressing addr base}\n` + end + | Lop(Istore(size, addr, _)) -> + let src = i.arg.(0) in + let base = + match addr with + | Iindexed ofs -> i.arg.(1) + | Ibased(s, ofs) -> + ` adrp {emit_reg reg_tmp1}, {emit_symbol_offset s ofs}\n`; + reg_tmp1 in + begin match size with + | Byte_unsigned | Byte_signed -> + ` strb {emit_wreg src}, {emit_addressing addr base}\n` + | Sixteen_unsigned | Sixteen_signed -> + ` strh {emit_wreg src}, {emit_addressing addr base}\n` + | Thirtytwo_unsigned | Thirtytwo_signed -> + ` str {emit_wreg src}, {emit_addressing addr base}\n` + | Single -> + ` fcvt s7, {emit_reg src}\n`; + ` str s7, {emit_addressing addr base}\n`; + | Word | Double | Double_u -> + ` str {emit_reg src}, {emit_addressing addr base}\n` + end + | Lop(Ialloc n) -> + let lbl_frame = record_frame_label i.live i.dbg in + if !fastcode_flag then begin + let lbl_redo = new_label() in + let lbl_call_gc = new_label() in + `{emit_label lbl_redo}:`; + ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; + ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; + ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; + ` b.lo {emit_label lbl_call_gc}\n`; + call_gc_sites := + { gc_lbl = lbl_call_gc; + gc_return_lbl = lbl_redo; + gc_frame_lbl = lbl_frame } :: !call_gc_sites + end else begin + begin match n with + | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` + | 24 -> ` bl {emit_symbol "caml_alloc2"}\n` + | 32 -> ` bl {emit_symbol "caml_alloc3"}\n` + | _ -> emit_intconst reg_x15 (Nativeint.of_int n); + ` bl {emit_symbol "caml_allocN"}\n` + end; + `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` + end + | Lop(Iintop(Icomp cmp)) -> + ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` cset {emit_reg i.res.(0)}, {emit_string (name_for_comparison cmp)}\n` + | Lop(Iintop_imm(Icomp cmp, n)) -> + ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; + ` cset {emit_reg i.res.(0)}, {emit_string (name_for_comparison cmp)}\n` + | Lop(Iintop Icheckbound) -> + let lbl = bound_error_label i.dbg in + ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` b.ls {emit_label lbl}\n` + | Lop(Iintop_imm(Icheckbound, n)) -> + let lbl = bound_error_label i.dbg in + ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; + ` b.ls {emit_label lbl}\n` + | Lop(Ispecific(Ishiftcheckbound shift)) -> + let lbl = bound_error_label i.dbg in + ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; + ` b.cs {emit_label lbl}\n` + | Lop(Iintop Imod) -> + ` sdiv {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` msub {emit_reg i.res.(0)}, {emit_reg reg_tmp1}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` + | Lop(Iintop Imulh) -> + ` smulh {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` + | Lop(Iintop op) -> + let instr = name_for_int_operation op in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` + | Lop(Iintop_imm(op, n)) -> + let instr = name_for_int_operation op in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #{emit_int n}\n` + | Lop(Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf as op) -> + let instr = (match op with + | Ifloatofint -> "scvtf" + | Iintoffloat -> "fcvtzs" + | Iabsf -> "fabs" + | Inegf -> "fneg" + | Ispecific Isqrtf -> "fsqrt" + | _ -> assert false) in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` + | Lop(Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf as op) -> + let instr = (match op with + | Iaddf -> "fadd" + | Isubf -> "fsub" + | Imulf -> "fmul" + | Idivf -> "fdiv" + | Ispecific Inegmulf -> "fnmul" + | _ -> assert false) in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` + | Lop(Ispecific(Imuladdf | Inegmuladdf | Imulsubf | Inegmulsubf as op)) -> + let instr = (match op with + | Imuladdf -> "fmadd" + | Inegmuladdf -> "fnmadd" + | Imulsubf -> "fmsub" + | Inegmulsubf -> "fnmsub" + | _ -> assert false) in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}, {emit_reg i.arg.(0)}\n` + | Lop(Ispecific(Ishiftarith(op, shift))) -> + let instr = (match op with + Ishiftadd -> "add" + | Ishiftsub -> "sub") in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}`; + if shift >= 0 + then `, lsl #{emit_int shift}\n` + else `, asr #{emit_int (-shift)}\n` + | Lop(Ispecific(Imuladd | Imulsub as op)) -> + let instr = (match op with + Imuladd -> "madd" + | Imulsub -> "msub" + | _ -> assert false) in + ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` + | Lop(Ispecific(Ibswap size)) -> + begin match size with + | 16 -> + ` rev16 {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n`; + ` ubfm {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, #0, #16\n` + | 32 -> + ` rev {emit_wreg i.res.(0)}, {emit_wreg i.arg.(0)}\n` + | 64 -> + ` rev {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` + | _ -> + assert false + end + | Lreloadretaddr -> + () + | Lreturn -> + output_epilogue (fun () -> ` ret\n`) + | Llabel lbl -> + `{emit_label lbl}:\n` + | Lbranch lbl -> + ` b {emit_label lbl}\n` + | Lcondbranch(tst, lbl) -> + begin match tst with + | Itruetest -> + ` cbnz {emit_reg i.arg.(0)}, {emit_label lbl}\n` + | Ifalsetest -> + ` cbz {emit_reg i.arg.(0)}, {emit_label lbl}\n` + | Iinttest cmp -> + ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + let comp = name_for_comparison cmp in + ` b.{emit_string comp} {emit_label lbl}\n` + | Iinttest_imm(cmp, n) -> + ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; + let comp = name_for_comparison cmp in + ` b.{emit_string comp} {emit_label lbl}\n` + | Ifloattest(cmp, neg) -> + let comp = (match (cmp, neg) with + | (Ceq, false) | (Cne, true) -> "eq" + | (Cne, false) | (Ceq, true) -> "ne" + | (Clt, false) -> "cc" + | (Clt, true) -> "cs" + | (Cle, false) -> "ls" + | (Cle, true) -> "hi" + | (Cgt, false) -> "gt" + | (Cgt, true) -> "le" + | (Cge, false) -> "ge" + | (Cge, true) -> "lt") in + ` fcmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; + ` b.{emit_string comp} {emit_label lbl}\n` + | Ioddtest -> + ` tbnz {emit_reg i.arg.(0)}, #0, {emit_label lbl}\n` + | Ieventest -> + ` tbz {emit_reg i.arg.(0)}, #0, {emit_label lbl}\n` + end + | Lcondbranch3(lbl0, lbl1, lbl2) -> + ` cmp {emit_reg i.arg.(0)}, #1\n`; + begin match lbl0 with + None -> () + | Some lbl -> ` b.lt {emit_label lbl}\n` + end; + begin match lbl1 with + None -> () + | Some lbl -> ` b.eq {emit_label lbl}\n` + end; + begin match lbl2 with + None -> () + | Some lbl -> ` b.gt {emit_label lbl}\n` + end + | Lswitch jumptbl -> + let lbltbl = new_label() in + ` adr {emit_reg reg_tmp1}, {emit_label lbltbl}\n`; + ` add {emit_reg reg_tmp1}, {emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, lsl #2\n`; + ` br {emit_reg reg_tmp1}\n`; + `{emit_label lbltbl}:`; + for j = 0 to Array.length jumptbl - 1 do + ` b {emit_label jumptbl.(j)}\n` + done +(* Alternative: + let lbltbl = new_label() in + ` adr {emit_reg reg_tmp1}, {emit_label lbltbl}\n`; + ` ldr {emit_wreg reg_tmp2}, [{emit_reg reg_tmp1}, {emit_reg i.arg.(0)}, lsl #2]\n`; + ` add {emit_reg reg_tmp1}, {emit_wreg reg_tmp2}, sxtb\n`; + ` br {emit_reg reg_tmp1}\n`; + `{emit_label lbltbl}:\n`; + for j = 0 to Array.length jumptbl - 1 do + ` .word {emit_label jumptbl.(j)} - {emit_label lbltbl}\n` + done +*) + | Lsetuptrap lbl -> + let lblnext = new_label() in + ` adr {emit_reg reg_tmp1}, {emit_label lblnext}\n`; + ` b {emit_label lbl}\n`; + `{emit_label lblnext}:\n` + | Lpushtrap -> + stack_offset := !stack_offset + 16; + ` str {emit_reg reg_trap_ptr}, [sp, -16]!\n`; + ` str {emit_reg reg_tmp1}, [sp, #8]\n`; + cfi_adjust_cfa_offset 16; + ` mov {emit_reg reg_trap_ptr}, sp\n` + | Lpoptrap -> + ` ldr {emit_reg reg_trap_ptr}, [sp], 16\n`; + cfi_adjust_cfa_offset (-16); + stack_offset := !stack_offset - 16 + | Lraise k -> + begin match !Clflags.debug, k with + | true, (Lambda.Raise_regular | Lambda.Raise_reraise) -> + ` bl {emit_symbol "caml_raise_exn"}\n`; + `{record_frame Reg.Set.empty i.dbg}\n` + | false, _ + | true, Lambda.Raise_notrace -> + ` mov sp, {emit_reg reg_trap_ptr}\n`; + ` ldr {emit_reg reg_tmp1}, [sp, #8]\n`; + ` ldr {emit_reg reg_trap_ptr}, [sp], 16\n`; + ` br {emit_reg reg_tmp1}\n` + end + +(* Emission of an instruction sequence *) + +let rec emit_all i = + if i.desc = Lend then () else (emit_instr i; emit_all i.next) + +(* Emission of the profiling prelude *) + +let emit_profile() = () (* TODO *) +(* + match Config.system with + "linux_eabi" | "linux_eabihf" -> + ` push \{lr}\n`; + ` {emit_call "__gnu_mcount_nc"}\n` + | _ -> () +*) + +(* Emission of a function declaration *) + +let fundecl fundecl = + function_name := fundecl.fun_name; + fastcode_flag := fundecl.fun_fast; + tailrec_entry_point := new_label(); + float_literals := []; + stack_offset := 0; + call_gc_sites := []; + bound_error_sites := []; + ` .text\n`; + ` .align 3\n`; + ` .globl {emit_symbol fundecl.fun_name}\n`; + ` .type {emit_symbol fundecl.fun_name}, %function\n`; + `{emit_symbol fundecl.fun_name}:\n`; + emit_debug_info fundecl.fun_dbg; + cfi_startproc(); + if !Clflags.gprofile then emit_profile(); + let n = frame_size() in + if n > 0 then + emit_stack_adjustment (-n); + if !contains_calls then + ` str x30, [sp, #{emit_int (n-8)}]\n`; + `{emit_label !tailrec_entry_point}:\n`; + emit_all fundecl.fun_body; + List.iter emit_call_gc !call_gc_sites; + List.iter emit_call_bound_error !bound_error_sites; + cfi_endproc(); + ` .type {emit_symbol fundecl.fun_name}, %function\n`; + ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n`; + emit_literals() + +(* Emission of data *) + +let emit_item = function + | Cglobal_symbol s -> ` .globl {emit_symbol s}\n`; + | Cdefine_symbol s -> `{emit_symbol s}:\n` + | Cdefine_label lbl -> `{emit_data_label lbl}:\n` + | Cint8 n -> ` .byte {emit_int n}\n` + | Cint16 n -> ` .short {emit_int n}\n` + | Cint32 n -> ` .long {emit_nativeint n}\n` + | Cint n -> ` .quad {emit_nativeint n}\n` + | Csingle f -> emit_float32_directive ".long" (Int32.bits_of_float f) + | Cdouble f -> emit_float64_directive ".quad" (Int64.bits_of_float f) + | Csymbol_address s -> ` .quad {emit_symbol s}\n` + | Clabel_address lbl -> ` .quad {emit_data_label lbl}\n` + | Cstring s -> emit_string_directive " .ascii " s + | Cskip n -> if n > 0 then ` .space {emit_int n}\n` + | Calign n -> ` .align {emit_int(Misc.log2 n)}\n` + +let data l = + ` .data\n`; + ` .align 3\n`; + List.iter emit_item l + +(* Beginning / end of an assembly file *) + +let begin_assembly() = + reset_debug_info(); + let lbl_begin = Compilenv.make_symbol (Some "data_begin") in + ` .data\n`; + ` .globl {emit_symbol lbl_begin}\n`; + `{emit_symbol lbl_begin}:\n`; + let lbl_begin = Compilenv.make_symbol (Some "code_begin") in + ` .text\n`; + ` .globl {emit_symbol lbl_begin}\n`; + `{emit_symbol lbl_begin}:\n` + +let end_assembly () = + let lbl_end = Compilenv.make_symbol (Some "code_end") in + ` .text\n`; + ` .globl {emit_symbol lbl_end}\n`; + `{emit_symbol lbl_end}:\n`; + let lbl_end = Compilenv.make_symbol (Some "data_end") in + ` .data\n`; + ` .globl {emit_symbol lbl_end}\n`; + `{emit_symbol lbl_end}:\n`; + ` .long 0\n`; + let lbl = Compilenv.make_symbol (Some "frametable") in + ` .globl {emit_symbol lbl}\n`; + `{emit_symbol lbl}:\n`; + emit_frames + { efa_label = (fun lbl -> + ` .type {emit_label lbl}, %function\n`; + ` .quad {emit_label lbl}\n`); + efa_16 = (fun n -> ` .short {emit_int n}\n`); + efa_32 = (fun n -> ` .long {emit_int32 n}\n`); + efa_word = (fun n -> ` .quad {emit_int n}\n`); + efa_align = (fun n -> ` .align {emit_int(Misc.log2 n)}\n`); + efa_label_rel = (fun lbl ofs -> + ` .long {emit_label lbl} - . + {emit_int32 ofs}\n`); + efa_def_label = (fun lbl -> `{emit_label lbl}:\n`); + efa_string = (fun s -> emit_string_directive " .asciz " s) }; + ` .type {emit_symbol lbl}, %object\n`; + ` .size {emit_symbol lbl}, .-{emit_symbol lbl}\n`; + begin match Config.system with + | "linux" -> + (* Mark stack as non-executable *) + ` .section .note.GNU-stack,\"\",%progbits\n` + | _ -> () + end diff --git a/asmcomp/arm64/proc.ml b/asmcomp/arm64/proc.ml new file mode 100644 index 00000000..0222b72a --- /dev/null +++ b/asmcomp/arm64/proc.ml @@ -0,0 +1,226 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* Benedikt Meurer, University of Siegen *) +(* *) +(* Copyright 2013 Institut National de Recherche en Informatique *) +(* et en Automatique. Copyright 2012 Benedikt Meurer. All rights *) +(* reserved. This file is distributed under the terms of the Q *) +(* Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Description of the ARM processor in 64-bit mode *) + +open Misc +open Cmm +open Reg +open Arch +open Mach + +(* Instruction selection *) + +let word_addressed = false + +(* Registers available for register allocation *) + +(* Integer register map: + x0 - x15 general purpose (caller-save) + x16, x17 temporaries (used by call veeners) + x18 platform register (reserved) + x19 - x25 general purpose (callee-save) + x26 trap pointer + x27 alloc pointer + x28 alloc limit + x29 frame pointer + x30 return address + sp / xzr stack pointer / zero register + Floating-point register map: + d0 - d7 general purpose (caller-save) + d8 - d15 general purpose (callee-save) + d16 - d31 generat purpose (caller-save) +*) + +let int_reg_name = + [| "x0"; "x1"; "x2"; "x3"; "x4"; "x5"; "x6"; "x7"; + "x8"; "x9"; "x10"; "x11"; "x12"; "x13"; "x14"; "x15"; + "x19"; "x20"; "x21"; "x22"; "x23"; "x24"; "x25"; + "x26"; "x27"; "x28"; "x16"; "x17" |] + +let float_reg_name = + [| "d0"; "d1"; "d2"; "d3"; "d4"; "d5"; "d6"; "d7"; + "d8"; "d9"; "d10"; "d11"; "d12"; "d13"; "d14"; "d15"; + "d16"; "d17"; "d18"; "d19"; "d20"; "d21"; "d22"; "d23"; + "d24"; "d25"; "d26"; "d27"; "d28"; "d29"; "d30"; "d31" |] + +let num_register_classes = 2 + +let register_class r = + match r.typ with + | (Int | Addr) -> 0 + | Float -> 1 + +let num_available_registers = + [| 23; 32 |] (* first 23 int regs allocatable; all float regs allocatable *) + +let first_available_register = + [| 0; 100 |] + +let register_name r = + if r < 100 then int_reg_name.(r) else float_reg_name.(r - 100) + +let rotate_registers = true + +(* Representation of hard registers by pseudo-registers *) + +let hard_int_reg = + let v = Array.make 28 Reg.dummy in + for i = 0 to 27 do + v.(i) <- Reg.at_location Int (Reg i) + done; + v + +let hard_float_reg = + let v = Array.make 32 Reg.dummy in + for i = 0 to 31 do + v.(i) <- Reg.at_location Float (Reg(100 + i)) + done; + v + +let all_phys_regs = + Array.append hard_int_reg hard_float_reg + +let phys_reg n = + if n < 100 then hard_int_reg.(n) else hard_float_reg.(n - 100) + +let reg_x15 = phys_reg 15 +let reg_d7 = phys_reg 107 + +let stack_slot slot ty = + Reg.at_location ty (Stack slot) + +(* Calling conventions *) + +let calling_conventions + first_int last_int first_float last_float make_stack arg = + let loc = Array.make (Array.length arg) Reg.dummy in + let int = ref first_int in + let float = ref first_float in + let ofs = ref 0 in + for i = 0 to Array.length arg - 1 do + match arg.(i).typ with + Int | Addr as ty -> + if !int <= last_int then begin + loc.(i) <- phys_reg !int; + incr int + end else begin + loc.(i) <- stack_slot (make_stack !ofs) ty; + ofs := !ofs + size_int + end + | Float -> + if !float <= last_float then begin + loc.(i) <- phys_reg !float; + incr float + end else begin + loc.(i) <- stack_slot (make_stack !ofs) Float; + ofs := !ofs + size_float + end + done; + (loc, Misc.align !ofs 16) (* keep stack 16-aligned *) + +let incoming ofs = Incoming ofs +let outgoing ofs = Outgoing ofs +let not_supported ofs = fatal_error "Proc.loc_results: cannot call" + +(* OCaml calling convention: + first integer args in r0...r15 + first float args in d0...d15 + remaining args on stack. + Return values in r0...r15 or d0...d15. *) + +let loc_arguments arg = + calling_conventions 0 15 100 115 outgoing arg +let loc_parameters arg = + let (loc, _) = calling_conventions 0 15 100 115 incoming arg in loc +let loc_results res = + let (loc, _) = calling_conventions 0 15 100 115 not_supported res in loc + +(* C calling convention: + first integer args in r0...r7 + first float args in d0...d7 + remaining args on stack. + Return values in r0...r1 or d0. *) + +let loc_external_arguments arg = + calling_conventions 0 7 100 107 outgoing arg +let loc_external_results res = + let (loc, _) = calling_conventions 0 1 100 100 not_supported res in loc + +let loc_exn_bucket = phys_reg 0 + +(* Volatile registers: none *) + +let regs_are_volatile rs = false + +(* Registers destroyed by operations *) + +let destroyed_at_c_call = + (* x19-x28, d8-d15 preserved *) + Array.of_list (List.map phys_reg + [0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15; + 100;101;102;103;104;105;106;107; + 116;117;118;119;120;121;122;123; + 124;125;126;127;128;129;130;131]) + +let destroyed_at_oper = function + | Iop(Icall_ind | Icall_imm _) | Iop(Iextcall(_, true)) -> + all_phys_regs + | Iop(Iextcall(_, false)) -> + destroyed_at_c_call + | Iop(Ialloc _) -> + [| reg_x15 |] + | Iop(Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _, _)) -> + [| reg_d7 |] (* d7 / s7 destroyed *) + | _ -> [||] + +let destroyed_at_raise = all_phys_regs + +(* Maximal register pressure *) + +let safe_register_pressure = function + | Iextcall(_, _) -> 8 + | Ialloc _ -> 25 + | _ -> 26 + +let max_register_pressure = function + | Iextcall(_, _) -> [| 10; 8 |] + | Ialloc _ -> [| 25; 32 |] + | Iintoffloat | Ifloatofint + | Iload(Single, _) | Istore(Single, _, _) -> [| 26; 31 |] + | _ -> [| 26; 32 |] + +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) + | Ispecific(Ishiftcheckbound _) -> false + | _ -> true + +(* Layout of the stack *) + +let num_stack_slots = [| 0; 0 |] +let contains_calls = ref false + +(* Calling the assembler *) + +let assemble_file infile outfile = + Ccomp.command (Config.asm ^ " -o " ^ + Filename.quote outfile ^ " " ^ Filename.quote infile) + + +let init () = () diff --git a/testsuite/tests/regression/camlp4-class-type-plus/camlp4_class_type_plus_ok.ml b/asmcomp/arm64/reload.ml similarity index 71% rename from testsuite/tests/regression/camlp4-class-type-plus/camlp4_class_type_plus_ok.ml rename to asmcomp/arm64/reload.ml index 89d1b9ad..ff9214ef 100644 --- a/testsuite/tests/regression/camlp4-class-type-plus/camlp4_class_type_plus_ok.ml +++ b/asmcomp/arm64/reload.ml @@ -2,20 +2,15 @@ (* *) (* OCaml *) (* *) -(* Damien Doligez, projet Gallium, INRIA Rocquencourt *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) (* *) -(* Copyright 2011 Institut National de Recherche en Informatique et *) +(* Copyright 2013 Institut National de Recherche en Informatique et *) (* en Automatique. All rights reserved. This file is distributed *) (* under the terms of the Q Public License version 1.0. *) (* *) (***********************************************************************) -type t;; -type xdr_value;; +(* Reloading for the ARM 64 bits *) -class type [ 't ] engine = object -end;; - -module type T = sig -class unbound_async_call : t -> [xdr_value] engine;; -end;; +let fundecl f = + (new Reloadgen.reload_generic)#fundecl f diff --git a/asmcomp/arm64/scheduling.ml b/asmcomp/arm64/scheduling.ml new file mode 100644 index 00000000..cc244be7 --- /dev/null +++ b/asmcomp/arm64/scheduling.ml @@ -0,0 +1,18 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2013 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +let _ = let module M = Schedgen in () (* to create a dependency *) + +(* Scheduling is turned off because the processor schedules dynamically + much better than what we could do. *) + +let fundecl f = f diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml new file mode 100644 index 00000000..e7ded8fb --- /dev/null +++ b/asmcomp/arm64/selection.ml @@ -0,0 +1,243 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* Benedikt Meurer, University of Siegen *) +(* *) +(* Copyright 2013 Institut National de Recherche en Informatique *) +(* et en Automatique. Copyright 2012 Benedikt Meurer. All rights *) +(* reserved. This file is distributed under the terms of the Q *) +(* Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Instruction selection for the ARM processor *) + +open Arch +open Cmm +open Mach + +let is_offset chunk n = + (n >= -256 && n <= 255) (* 9 bits signed unscaled *) +|| (n >= 0 && + match chunk with (* 12 bits unsigned, scaled by chunk size *) + | Byte_unsigned | Byte_signed -> + n < 0x1000 + | Sixteen_unsigned | Sixteen_signed -> + n land 1 = 0 && n lsr 1 < 0x1000 + | Thirtytwo_unsigned | Thirtytwo_signed | Single -> + n land 3 = 0 && n lsr 2 < 0x1000 + | Word | Double | Double_u -> + n land 7 = 0 && n lsr 3 < 0x1000) + +(* An automaton to recognize ( 0+1+0* | 1+0+1* ) + + 0 1 0 + / \ / \ / \ + \ / \ / \ / + -0--> [1] --1--> [2] --0--> [3] + / + [0] + \ + -1--> [4] --0--> [5] --1--> [6] + / \ / \ / \ + \ / \ / \ / + 1 0 1 + +The accepting states are 2, 3, 5 and 6. *) + +let auto_table = [| (* accepting?, next on 0, next on 1 *) + (* state 0 *) (false, 1, 4); + (* state 1 *) (false, 1, 2); + (* state 2 *) (true, 3, 2); + (* state 3 *) (true, 3, 7); + (* state 4 *) (false, 5, 4); + (* state 5 *) (true, 5, 6); + (* state 6 *) (true, 7, 6); + (* state 7 *) (false, 7, 7) (* error state *) +|] + +let rec run_automata nbits state input = + let (acc, next0, next1) = auto_table.(state) in + if nbits <= 0 + then acc + else run_automata (nbits - 1) + (if input land 1 = 0 then next0 else next1) + (input asr 1) + +(* We are very conservative wrt what ARM64 supports: we don't support + repetitions of a 000111000 or 1110000111 pattern, just a single + pattern of this kind. *) + +let is_logical_immediate n = + n <> 0 && n <> -1 && run_automata 64 0 n + +let is_intconst = function + Cconst_int _ -> true + | _ -> false + +let inline_ops = + [ "sqrt"; "caml_bswap16_direct"; "caml_int32_direct_bswap"; + "caml_int64_direct_bswap"; "caml_nativeint_direct_bswap" ] + +let use_direct_addressing symb = + (not !Clflags.dlcode) || Compilenv.symbol_in_current_unit symb + +(* Instruction selection *) + +class selector = object(self) + +inherit Selectgen.selector_generic as super + +method is_immediate n = + let mn = -n in + n land 0xFFF = n || n land 0xFFF_000 = n + || mn land 0xFFF = mn || mn land 0xFFF_000 = mn + +method! is_simple_expr = function + (* inlined floating-point ops are simple if their arguments are *) + | Cop(Cextcall(fn, _, _, _), args) when List.mem fn inline_ops -> + List.for_all self#is_simple_expr args + | e -> super#is_simple_expr e + +method select_addressing chunk = function + | Cop(Cadda, [Cconst_symbol s; Cconst_int n]) + when use_direct_addressing s -> + (Ibased(s, n), Ctuple []) + | Cop(Cadda, [arg; Cconst_int n]) + when is_offset chunk n -> + (Iindexed n, arg) + | Cop(Cadda, [arg1; Cop(Caddi, [arg2; Cconst_int n])]) + when is_offset chunk n -> + (Iindexed n, Cop(Cadda, [arg1; arg2])) + | Cconst_symbol s + when use_direct_addressing s -> + (Ibased(s, 0), Ctuple []) + | arg -> + (Iindexed 0, arg) + +method! select_operation op args = + match op with + (* Integer addition *) + | Caddi | Cadda -> + begin match args with + (* Add immediate *) + | [arg; Cconst_int n] | [Cconst_int n; arg] when self#is_immediate n -> + ((if n >= 0 then Iintop_imm(Iadd, n) else Iintop_imm(Isub, -n)), + [arg]) + (* Shift-add *) + | [arg1; Cop(Clsl, [arg2; Cconst_int n])] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftadd, n)), [arg1; arg2]) + | [arg1; Cop(Casr, [arg2; Cconst_int n])] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftadd, -n)), [arg1; arg2]) + | [Cop(Clsl, [arg1; Cconst_int n]); arg2] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftadd, n)), [arg2; arg1]) + | [Cop(Casr, [arg1; Cconst_int n]); arg2] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftadd, -n)), [arg2; arg1]) + (* Multiply-add *) + | [arg1; Cop(Cmuli, args2)] | [Cop(Cmuli, args2); arg1] -> + begin match self#select_operation Cmuli args2 with + | (Iintop_imm(Ilsl, l), [arg3]) -> + (Ispecific(Ishiftarith(Ishiftadd, l)), [arg1; arg3]) + | (Iintop Imul, [arg3; arg4]) -> + (Ispecific Imuladd, [arg3; arg4; arg1]) + | _ -> + super#select_operation op args + end + | _ -> + super#select_operation op args + end + (* Integer subtraction *) + | Csubi | Csuba -> + begin match args with + (* Sub immediate *) + | [arg; Cconst_int n] when self#is_immediate n -> + ((if n >= 0 then Iintop_imm(Isub, n) else Iintop_imm(Iadd, -n)), + [arg]) + (* Shift-sub *) + | [arg1; Cop(Clsl, [arg2; Cconst_int n])] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftsub, n)), [arg1; arg2]) + | [arg1; Cop(Casr, [arg2; Cconst_int n])] when n > 0 && n < 64 -> + (Ispecific(Ishiftarith(Ishiftsub, -n)), [arg1; arg2]) + (* Multiply-sub *) + | [arg1; Cop(Cmuli, args2)] -> + begin match self#select_operation Cmuli args2 with + | (Iintop_imm(Ilsl, l), [arg3]) -> + (Ispecific(Ishiftarith(Ishiftsub, l)), [arg1; arg3]) + | (Iintop Imul, [arg3; arg4]) -> + (Ispecific Imulsub, [arg3; arg4; arg1]) + | _ -> + super#select_operation op args + end + | _ -> + super#select_operation op args + end + (* Checkbounds *) + | Ccheckbound _ -> + begin match args with + | [Cop(Clsr, [arg1; Cconst_int n]); arg2] when n > 0 && n < 64 -> + (Ispecific(Ishiftcheckbound n), [arg1; arg2]) + | _ -> + super#select_operation op args + end + (* Integer multiplication *) + (* ARM does not support immediate operands for multiplication *) + | Cmuli -> + (Iintop Imul, args) + | Cmulhi -> + (Iintop Imulh, args) + (* Bitwise logical operations have a different range of immediate + operands than the other instructions *) + | Cand -> self#select_logical Iand args + | Cor -> self#select_logical Ior args + | Cxor -> self#select_logical Ixor args + (* Recognize floating-point negate and multiply *) + | Cnegf -> + begin match args with + | [Cop(Cmulf, args)] -> (Ispecific Inegmulf, args) + | _ -> super#select_operation op args + end + (* Recognize floating-point multiply and add/sub *) + | Caddf -> + begin match args with + | [arg; Cop(Cmulf, args)] | [Cop(Cmulf, args); arg] -> + (Ispecific Imuladdf, arg :: args) + | _ -> + super#select_operation op args + end + | Csubf -> + begin match args with + | [arg; Cop(Cmulf, args)] -> + (Ispecific Imulsubf, arg :: args) + | [Cop(Cmulf, args); arg] -> + (Ispecific Inegmulsubf, arg :: args) + | _ -> + super#select_operation op args + end + (* Recognize floating-point square root *) + | Cextcall("sqrt", _, _, _) -> + (Ispecific Isqrtf, args) + (* Recognize bswap instructions *) + | Cextcall("caml_bswap16_direct", _, _, _) -> + (Ispecific(Ibswap 16), args) + | Cextcall("caml_int32_direct_bswap", _, _, _) -> + (Ispecific(Ibswap 32), args) + | Cextcall(("caml_int64_direct_bswap"|"caml_nativeint_direct_bswap"), + _, _, _) -> + (Ispecific (Ibswap 64), args) + (* Other operations are regular *) + | _ -> + super#select_operation op args + +method select_logical op = function + | [arg; Cconst_int n] when is_logical_immediate n -> + (Iintop_imm(op, n), [arg]) + | [Cconst_int n; arg] when is_logical_immediate n -> + (Iintop_imm(op, n), [arg]) + | args -> + (Iintop op, args) + +end + +let fundecl f = (new selector)#emit_fundecl f diff --git a/asmcomp/asmgen.ml b/asmcomp/asmgen.ml index 40f7dafb..311bb029 100644 --- a/asmcomp/asmgen.ml +++ b/asmcomp/asmgen.ml @@ -64,7 +64,10 @@ let compile_fundecl (ppf : formatter) fd_cmm = ++ pass_dump_if ppf dump_selection "After instruction selection" ++ Comballoc.fundecl ++ pass_dump_if ppf dump_combine "After allocation combining" + ++ CSE.fundecl + ++ pass_dump_if ppf dump_cse "After CSE" ++ liveness ppf + ++ Deadcode.fundecl ++ pass_dump_if ppf dump_live "Liveness analysis" ++ Spill.fundecl ++ liveness ppf @@ -140,3 +143,10 @@ let report_error ppf = function | Assembler_error file -> fprintf ppf "Assembler error, input left in file %a" Location.print_filename file + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) diff --git a/asmcomp/asmlibrarian.ml b/asmcomp/asmlibrarian.ml index 140791f2..968e1de7 100644 --- a/asmcomp/asmlibrarian.ml +++ b/asmcomp/asmlibrarian.ml @@ -69,3 +69,10 @@ let report_error ppf = function fprintf ppf "Cannot find file %s" name | Archiver_error name -> fprintf ppf "Error while creating the library %s" name + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index f6a85a94..153da7ca 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -33,31 +33,37 @@ exception Error of error (* Consistency check between interfaces and implementations *) let crc_interfaces = Consistbl.create () +let interfaces = ref ([] : string list) let crc_implementations = Consistbl.create () -let extra_implementations = ref ([] : string list) +let implementations = ref ([] : string list) let implementations_defined = ref ([] : (string * string) list) let cmx_required = ref ([] : string list) let check_consistency file_name unit crc = begin try List.iter - (fun (name, crc) -> - if name = unit.ui_name - then Consistbl.set crc_interfaces name crc file_name - else Consistbl.check crc_interfaces name crc file_name) + (fun (name, crco) -> + interfaces := name :: !interfaces; + match crco with + None -> () + | Some crc -> + if name = unit.ui_name + then Consistbl.set crc_interfaces name crc file_name + else Consistbl.check crc_interfaces name crc file_name) unit.ui_imports_cmi with Consistbl.Inconsistency(name, user, auth) -> raise(Error(Inconsistent_interface(name, user, auth))) end; begin try List.iter - (fun (name, crc) -> - if crc <> cmx_not_found_crc then - Consistbl.check crc_implementations name crc file_name - else if List.mem name !cmx_required then - raise(Error(Missing_cmx(file_name, name))) - else - extra_implementations := name :: !extra_implementations) + (fun (name, crco) -> + implementations := name :: !implementations; + match crco with + None -> + if List.mem name !cmx_required then + raise(Error(Missing_cmx(file_name, name))) + | Some crc -> + Consistbl.check crc_implementations name crc file_name) unit.ui_imports_cmx with Consistbl.Inconsistency(name, user, auth) -> raise(Error(Inconsistent_implementation(name, user, auth))) @@ -67,6 +73,7 @@ let check_consistency file_name unit crc = raise (Error(Multiple_definition(unit.ui_name, file_name, source))) with Not_found -> () end; + implementations := unit.ui_name :: !implementations; Consistbl.set crc_implementations unit.ui_name crc file_name; implementations_defined := (unit.ui_name, file_name) :: !implementations_defined; @@ -74,13 +81,9 @@ let check_consistency file_name unit crc = cmx_required := unit.ui_name :: !cmx_required let extract_crc_interfaces () = - Consistbl.extract crc_interfaces + Consistbl.extract !interfaces crc_interfaces let extract_crc_implementations () = - List.fold_left - (fun ncl n -> - if List.mem_assoc n ncl then ncl else (n, cmx_not_found_crc) :: ncl) - (Consistbl.extract crc_implementations) - !extra_implementations + Consistbl.extract !implementations crc_implementations (* Add C objects and options and "custom" info from a library descriptor. See bytecomp/bytelink.ml for comments on the order of C objects. *) @@ -206,18 +209,22 @@ let make_startup_file ppf filename units_list = compile_phrase (Cmmgen.entry_point name_list); let units = List.map (fun (info,_,_) -> info) units_list in List.iter compile_phrase (Cmmgen.generic_functions false units); - Array.iter - (fun name -> compile_phrase (Cmmgen.predef_exception name)) + Array.iteri + (fun i name -> compile_phrase (Cmmgen.predef_exception i name)) Runtimedef.builtin_exceptions; compile_phrase (Cmmgen.global_table name_list); compile_phrase (Cmmgen.globals_map (List.map (fun (unit,_,crc) -> - try (unit.ui_name, List.assoc unit.ui_name unit.ui_imports_cmi, - crc, - unit.ui_defines) - with Not_found -> assert false) + let intf_crc = + try + match List.assoc unit.ui_name unit.ui_imports_cmi with + None -> assert false + | Some crc -> crc + with Not_found -> assert false + in + (unit.ui_name, intf_crc, crc, unit.ui_defines)) units_list)); compile_phrase(Cmmgen.data_segment_table ("_startup" :: name_list)); compile_phrase(Cmmgen.code_segment_table ("_startup" :: name_list)); @@ -390,3 +397,18 @@ let report_error ppf = function Location.print_filename filename name Location.print_filename filename name + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let reset () = + Consistbl.clear crc_interfaces; + Consistbl.clear crc_implementations; + implementations_defined := []; + cmx_required := []; + interfaces := []; + implementations := [] diff --git a/asmcomp/asmlink.mli b/asmcomp/asmlink.mli index 1cf9e302..60a2111e 100644 --- a/asmcomp/asmlink.mli +++ b/asmcomp/asmlink.mli @@ -20,9 +20,10 @@ val link_shared: formatter -> string list -> string -> unit val call_linker_shared: string list -> string -> unit +val reset : unit -> unit val check_consistency: string -> Cmx_format.unit_infos -> Digest.t -> unit -val extract_crc_interfaces: unit -> (string * Digest.t) list -val extract_crc_implementations: unit -> (string * Digest.t) list +val extract_crc_interfaces: unit -> (string * Digest.t option) list +val extract_crc_implementations: unit -> (string * Digest.t option) list type error = File_not_found of string diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index 1a4fe902..d900df1e 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -130,7 +130,7 @@ let build_package_cmx members cmxfile = List.flatten (List.map (fun info -> info.ui_defines) units) @ [ui.ui_symbol]; ui_imports_cmi = - (ui.ui_name, Env.crc_of_unit ui.ui_name) :: + (ui.ui_name, Some (Env.crc_of_unit ui.ui_name)) :: filter(Asmlink.extract_crc_interfaces()); ui_imports_cmx = filter(Asmlink.extract_crc_implementations()); @@ -161,7 +161,7 @@ let package_object_files ppf files targetcmx (* The entry point *) -let package_files ppf files targetcmx = +let package_files ppf initial_env files targetcmx = let files = List.map (fun f -> @@ -177,7 +177,8 @@ let package_files ppf files targetcmx = (* Set the name of the current compunit *) Compilenv.reset ?packname:!Clflags.for_package targetname; try - let coercion = Typemod.package_units files targetcmi targetname in + let coercion = + Typemod.package_units initial_env files targetcmi targetname in package_object_files ppf files targetcmx targetobj targetname coercion with x -> remove_file targetcmx; remove_file targetobj; @@ -204,3 +205,10 @@ let report_error ppf = function fprintf ppf "Error while assembling %s" file | Linking_error -> fprintf ppf "Error during partial linking" + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) diff --git a/asmcomp/asmpackager.mli b/asmcomp/asmpackager.mli index 65272b7e..4d47f5c2 100644 --- a/asmcomp/asmpackager.mli +++ b/asmcomp/asmpackager.mli @@ -13,7 +13,7 @@ (* "Package" a set of .cmx/.o files into one .cmx/.o file having the original compilation units as sub-modules. *) -val package_files: Format.formatter -> string list -> string -> unit +val package_files: Format.formatter -> Env.t -> string list -> string -> unit type error = Illegal_renaming of string * string * string diff --git a/asmcomp/clambda.ml b/asmcomp/clambda.ml index dd53020d..ed96f218 100644 --- a/asmcomp/clambda.ml +++ b/asmcomp/clambda.ml @@ -18,9 +18,23 @@ open Lambda type function_label = string +type ustructured_constant = + | Uconst_float of float + | Uconst_int32 of int32 + | Uconst_int64 of int64 + | Uconst_nativeint of nativeint + | Uconst_block of int * uconstant list + | Uconst_float_array of float list + | Uconst_string of string + +and uconstant = + | Uconst_ref of string * ustructured_constant + | Uconst_int of int + | Uconst_ptr of int + type ulambda = Uvar of Ident.t - | Uconst of structured_constant * string option + | Uconst of uconstant | Udirect_apply of function_label * ulambda list * Debuginfo.t | Ugeneric_apply of ulambda * ulambda list * Debuginfo.t | Uclosure of ufunction list * ulambda list @@ -29,6 +43,7 @@ type ulambda = | Uletrec of (Ident.t * ulambda) list * ulambda | Uprim of primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch + | Ustringswitch of ulambda * (string * ulambda) list * ulambda option | Ustaticfail of int * ulambda list | Ucatch of int * Ident.t list * ulambda * ulambda | Utrywith of ulambda * Ident.t * ulambda @@ -59,7 +74,9 @@ type function_description = { fun_label: function_label; (* Label of direct entry point *) fun_arity: int; (* Number of arguments *) mutable fun_closed: bool; (* True if environment not used *) - mutable fun_inline: (Ident.t list * ulambda) option } + mutable fun_inline: (Ident.t list * ulambda) option; + mutable fun_float_const_prop: bool (* Can propagate FP consts *) + } (* Approximation of values *) @@ -67,5 +84,67 @@ type value_approximation = Value_closure of function_description * value_approximation | Value_tuple of value_approximation array | Value_unknown - | Value_integer of int - | Value_constptr of int + | Value_const of uconstant + | Value_global_field of string * int + +(* Comparison functions for constants. We must not use Pervasives.compare + because it compares "0.0" and "-0.0" equal. (PR#6442) *) + +let compare_floats x1 x2 = + Int64.compare (Int64.bits_of_float x1) (Int64.bits_of_float x2) + +let rec compare_float_lists l1 l2 = + match l1, l2 with + | [], [] -> 0 + | [], _::_ -> -1 + | _::_, [] -> 1 + | h1::t1, h2::t2 -> + let c = compare_floats h1 h2 in + if c <> 0 then c else compare_float_lists t1 t2 + +let compare_constants c1 c2 = + match c1, c2 with + | Uconst_ref(lbl1, c1), Uconst_ref(lbl2, c2) -> String.compare lbl1 lbl2 + (* Same labels -> same constants. + Different labels -> different constants, even if the contents + match, because of string constants that must not be + reshared. *) + | Uconst_int n1, Uconst_int n2 -> Pervasives.compare n1 n2 + | Uconst_ptr n1, Uconst_ptr n2 -> Pervasives.compare n1 n2 + | Uconst_ref _, _ -> -1 + | Uconst_int _, Uconst_ref _ -> 1 + | Uconst_int _, Uconst_ptr _ -> -1 + | Uconst_ptr _, _ -> 1 + +let rec compare_constant_lists l1 l2 = + match l1, l2 with + | [], [] -> 0 + | [], _::_ -> -1 + | _::_, [] -> 1 + | h1::t1, h2::t2 -> + let c = compare_constants h1 h2 in + if c <> 0 then c else compare_constant_lists t1 t2 + +let rank_structured_constant = function + | Uconst_float _ -> 0 + | Uconst_int32 _ -> 1 + | Uconst_int64 _ -> 2 + | Uconst_nativeint _ -> 3 + | Uconst_block _ -> 4 + | Uconst_float_array _ -> 5 + | Uconst_string _ -> 6 + +let compare_structured_constants c1 c2 = + match c1, c2 with + | Uconst_float x1, Uconst_float x2 -> compare_floats x1 x2 + | Uconst_int32 x1, Uconst_int32 x2 -> Int32.compare x1 x2 + | Uconst_int64 x1, Uconst_int64 x2 -> Int64.compare x1 x2 + | Uconst_nativeint x1, Uconst_nativeint x2 -> Nativeint.compare x1 x2 + | Uconst_block(t1, l1), Uconst_block(t2, l2) -> + let c = t1 - t2 (* no overflow possible here *) in + if c <> 0 then c else compare_constant_lists l1 l2 + | Uconst_float_array l1, Uconst_float_array l2 -> + compare_float_lists l1 l2 + | Uconst_string s1, Uconst_string s2 -> String.compare s1 s2 + | _, _ -> rank_structured_constant c1 - rank_structured_constant c2 + (* no overflow possible here *) diff --git a/asmcomp/clambda.mli b/asmcomp/clambda.mli index 737965db..fc7a14d1 100644 --- a/asmcomp/clambda.mli +++ b/asmcomp/clambda.mli @@ -18,9 +18,23 @@ open Lambda type function_label = string +type ustructured_constant = + | Uconst_float of float + | Uconst_int32 of int32 + | Uconst_int64 of int64 + | Uconst_nativeint of nativeint + | Uconst_block of int * uconstant list + | Uconst_float_array of float list + | Uconst_string of string + +and uconstant = + | Uconst_ref of string * ustructured_constant + | Uconst_int of int + | Uconst_ptr of int + type ulambda = Uvar of Ident.t - | Uconst of structured_constant * string option + | Uconst of uconstant | Udirect_apply of function_label * ulambda list * Debuginfo.t | Ugeneric_apply of ulambda * ulambda list * Debuginfo.t | Uclosure of ufunction list * ulambda list @@ -29,6 +43,7 @@ type ulambda = | Uletrec of (Ident.t * ulambda) list * ulambda | Uprim of primitive * ulambda list * Debuginfo.t | Uswitch of ulambda * ulambda_switch + | Ustringswitch of ulambda * (string * ulambda) list * ulambda option | Ustaticfail of int * ulambda list | Ucatch of int * Ident.t list * ulambda * ulambda | Utrywith of ulambda * Ident.t * ulambda @@ -59,7 +74,9 @@ type function_description = { fun_label: function_label; (* Label of direct entry point *) fun_arity: int; (* Number of arguments *) mutable fun_closed: bool; (* True if environment not used *) - mutable fun_inline: (Ident.t list * ulambda) option } + mutable fun_inline: (Ident.t list * ulambda) option; + mutable fun_float_const_prop: bool (* Can propagate FP consts *) + } (* Approximation of values *) @@ -67,5 +84,12 @@ type value_approximation = Value_closure of function_description * value_approximation | Value_tuple of value_approximation array | Value_unknown - | Value_integer of int - | Value_constptr of int + | Value_const of uconstant + | Value_global_field of string * int + +(* Comparison functions for constants *) + +val compare_structured_constants: + ustructured_constant -> ustructured_constant -> int +val compare_constants: + uconstant -> uconstant -> int diff --git a/asmcomp/closure.ml b/asmcomp/closure.ml index dc4c73ad..249e67c4 100644 --- a/asmcomp/closure.ml +++ b/asmcomp/closure.ml @@ -19,6 +19,14 @@ open Lambda open Switch open Clambda +module Storer = + Switch.Store + (struct + type t = lambda + type key = lambda + let make_key = Lambda.make_key + end) + (* Auxiliaries for compiling functions *) let rec split_list n l = @@ -48,7 +56,7 @@ let getglobal id = let occurs_var var u = let rec occurs = function Uvar v -> v = var - | Uconst (cst,_) -> false + | Uconst _ -> false | Udirect_apply(lbl, args, _) -> List.exists occurs args | Ugeneric_apply(funct, args, _) -> occurs funct || List.exists occurs args | Uclosure(fundecls, clos) -> List.exists occurs clos @@ -60,6 +68,10 @@ let occurs_var var u = | Uswitch(arg, s) -> occurs arg || occurs_array s.us_actions_consts || occurs_array s.us_actions_blocks + | Ustringswitch(arg,sw,d) -> + occurs arg || + List.exists (fun (_,e) -> occurs e) sw || + (match d with None -> false | Some d -> occurs d) | Ustaticfail (_, args) -> List.exists occurs args | Ucatch(_, _, body, hdlr) -> occurs body || occurs hdlr | Utrywith(body, exn, hdlr) -> occurs body || occurs hdlr @@ -81,6 +93,52 @@ let occurs_var var u = true in occurs u +(* Split a function with default parameters into a wrapper and an + inner function. The wrapper fills in missing optional parameters + with their default value and tail-calls the inner function. The + wrapper can then hopefully be inlined on most call sites to avoid + the overhead associated with boxing an optional argument with a + 'Some' constructor, only to deconstruct it immediately in the + function's body. *) + +let split_default_wrapper fun_id kind params body = + let rec aux map = function + | Llet(Strict, id, (Lifthenelse(Lvar optparam, _, _) as def), rest) when + Ident.name optparam = "*opt*" && List.mem optparam params + && not (List.mem_assoc optparam map) + -> + let wrapper_body, inner = aux ((optparam, id) :: map) rest in + Llet(Strict, id, def, wrapper_body), inner + | _ when map = [] -> raise Exit + | body -> + (* Check that those *opt* identifiers don't appear in the remaining + body. This should not appear, but let's be on the safe side. *) + let fv = Lambda.free_variables body in + List.iter (fun (id, _) -> if IdentSet.mem id fv then raise Exit) map; + + let inner_id = Ident.create (Ident.name fun_id ^ "_inner") in + let map_param p = try List.assoc p map with Not_found -> p in + let args = List.map (fun p -> Lvar (map_param p)) params in + let wrapper_body = Lapply (Lvar inner_id, args, Location.none) in + + let inner_params = List.map map_param params in + let new_ids = List.map Ident.rename inner_params in + let subst = List.fold_left2 + (fun s id new_id -> + Ident.add id (Lvar new_id) s) + Ident.empty inner_params new_ids + in + let body = Lambda.subst_lambda subst body in + let inner_fun = Lfunction(Curried, new_ids, body) in + (wrapper_body, (inner_id, inner_fun)) + in + try + let wrapper_body, inner = aux [] body in + [(fun_id, Lfunction(kind, params, wrapper_body)); inner] + with Exit -> + [(fun_id, Lfunction(kind, params, body))] + + (* Determine whether the estimated size of a clambda term is below some threshold *) @@ -96,7 +154,7 @@ let prim_size prim args = | Psetfloatfield f -> 1 | Pduprecord _ -> 10 + List.length args | Pccall p -> (if p.prim_alloc then 10 else 4) + List.length args - | Praise -> 4 + | Praise _ -> 4 | Pstringlength -> 5 | Pstringrefs | Pstringsets -> 6 | Pmakearray kind -> 5 + List.length args @@ -118,14 +176,7 @@ let lambda_smaller lam threshold = if !size > threshold then raise Exit; match lam with Uvar v -> () - | Uconst( - (Const_base(Const_int _ | Const_char _ | Const_float _ | - Const_int32 _ | Const_int64 _ | Const_nativeint _) | - Const_pointer _), _) -> incr size -(* Structured Constants are now emitted during closure conversion. *) - | Uconst (_, Some _) -> incr size - | Uconst _ -> - raise Exit (* avoid duplication of structured constants *) + | Uconst _ -> incr size | Udirect_apply(fn, args, _) -> size := !size + 4; lambda_list_size args | Ugeneric_apply(fn, args, _) -> @@ -147,6 +198,15 @@ let lambda_smaller lam threshold = lambda_size lam; lambda_array_size cases.us_actions_consts ; lambda_array_size cases.us_actions_blocks + | Ustringswitch (lam,sw,d) -> + lambda_size lam ; + (* as ifthenelse *) + List.iter + (fun (_,lam) -> + size := !size+2 ; + lambda_size lam) + sw ; + Misc.may lambda_size d | Ustaticfail (_,args) -> lambda_list_size args | Ucatch(_, _, body, handler) -> incr size; lambda_size body; lambda_size handler @@ -180,17 +240,20 @@ let rec is_pure_clambda = function Uvar v -> true | Uconst _ -> true | Uprim((Psetglobal _ | Psetfield _ | Psetfloatfield _ | Pduprecord _ | - Pccall _ | Praise | Poffsetref _ | Pstringsetu | Pstringsets | + Pccall _ | Praise _ | Poffsetref _ | Pstringsetu | Pstringsets | Parraysetu _ | Parraysets _ | Pbigarrayset _), _, _) -> false | Uprim(p, args, _) -> List.for_all is_pure_clambda args | _ -> false -(* Simplify primitive operations on integers *) +(* Simplify primitive operations on known arguments *) -let make_const_int n = (Uconst(Const_base(Const_int n), None), Value_integer n) -let make_const_ptr n = (Uconst(Const_pointer n, None), Value_constptr n) +let make_const c = (Uconst c, Value_const c) +let make_const_ref c = + make_const(Uconst_ref(Compilenv.new_structured_constant ~shared:true c, c)) +let make_const_int n = make_const (Uconst_int n) +let make_const_ptr n = make_const (Uconst_ptr n) let make_const_bool b = make_const_ptr(if b then 1 else 0) -let make_comparison cmp (x: int) (y: int) = +let make_comparison cmp x y = make_const_bool (match cmp with Ceq -> x = y @@ -199,75 +262,258 @@ let make_comparison cmp (x: int) (y: int) = | Cgt -> x > y | Cle -> x <= y | Cge -> x >= y) +let make_const_float n = make_const_ref (Uconst_float n) +let make_const_natint n = make_const_ref (Uconst_nativeint n) +let make_const_int32 n = make_const_ref (Uconst_int32 n) +let make_const_int64 n = make_const_ref (Uconst_int64 n) + +(* The [fpc] parameter is true if constant propagation of + floating-point computations is allowed *) -let simplif_prim_pure p (args, approxs) dbg = +let simplif_arith_prim_pure fpc p (args, approxs) dbg = + let default = (Uprim(p, args, dbg), Value_unknown) in match approxs with - [Value_integer x] -> + (* int (or enumerated type) *) + | [ Value_const(Uconst_int n1 | Uconst_ptr n1) ] -> begin match p with - Pidentity -> make_const_int x - | Pnegint -> make_const_int (-x) - | Pbswap16 -> - make_const_int (((x land 0xff) lsl 8) lor - ((x land 0xff00) lsr 8)) - | Poffsetint y -> make_const_int (x + y) - | _ -> (Uprim(p, args, dbg), Value_unknown) + | Pnot -> make_const_bool (n1 = 0) + | Pnegint -> make_const_int (- n1) + | Poffsetint n -> make_const_int (n + n1) + | Pfloatofint when fpc -> make_const_float (float_of_int n1) + | Pbintofint Pnativeint -> make_const_natint (Nativeint.of_int n1) + | Pbintofint Pint32 -> make_const_int32 (Int32.of_int n1) + | Pbintofint Pint64 -> make_const_int64 (Int64.of_int n1) + | Pbswap16 -> make_const_int (((n1 land 0xff) lsl 8) + lor ((n1 land 0xff00) lsr 8)) + | _ -> default end - | [Value_integer x; Value_integer y] -> + (* int (or enumerated type), int (or enumerated type) *) + | [ Value_const(Uconst_int n1 | Uconst_ptr n1); + Value_const(Uconst_int n2 | Uconst_ptr n2) ] -> begin match p with - Paddint -> make_const_int(x + y) - | Psubint -> make_const_int(x - y) - | Pmulint -> make_const_int(x * y) - | Pdivint when y <> 0 -> make_const_int(x / y) - | Pmodint when y <> 0 -> make_const_int(x mod y) - | Pandint -> make_const_int(x land y) - | Porint -> make_const_int(x lor y) - | Pxorint -> make_const_int(x lxor y) - | Plslint -> make_const_int(x lsl y) - | Plsrint -> make_const_int(x lsr y) - | Pasrint -> make_const_int(x asr y) - | Pintcomp cmp -> make_comparison cmp x y - | _ -> (Uprim(p, args, dbg), Value_unknown) + | Psequand -> make_const_bool (n1 <> 0 && n2 <> 0) + | Psequor -> make_const_bool (n1 <> 0 || n2 <> 0) + | Paddint -> make_const_int (n1 + n2) + | Psubint -> make_const_int (n1 - n2) + | Pmulint -> make_const_int (n1 * n2) + | Pdivint when n2 <> 0 -> make_const_int (n1 / n2) + | Pmodint when n2 <> 0 -> make_const_int (n1 mod n2) + | Pandint -> make_const_int (n1 land n2) + | Porint -> make_const_int (n1 lor n2) + | Pxorint -> make_const_int (n1 lxor n2) + | Plslint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_int (n1 lsl n2) + | Plsrint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_int (n1 lsr n2) + | Pasrint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_int (n1 asr n2) + | Pintcomp c -> make_comparison c n1 n2 + | _ -> default end - | [Value_constptr x] -> + (* float *) + | [Value_const(Uconst_ref(_, Uconst_float n1))] when fpc -> begin match p with - Pidentity -> make_const_ptr x - | Pnot -> make_const_bool(x = 0) - | Pisint -> make_const_bool true - | Pctconst c -> - begin - match c with - | Big_endian -> make_const_bool Arch.big_endian - | Word_size -> make_const_int (8*Arch.size_int) - | Ostype_unix -> make_const_bool (Sys.os_type = "Unix") - | Ostype_win32 -> make_const_bool (Sys.os_type = "Win32") - | Ostype_cygwin -> make_const_bool (Sys.os_type = "Cygwin") - end - | _ -> (Uprim(p, args, dbg), Value_unknown) + | Pintoffloat -> make_const_int (int_of_float n1) + | Pnegfloat -> make_const_float (-. n1) + | Pabsfloat -> make_const_float (abs_float n1) + | _ -> default end - | [Value_constptr x; Value_constptr y] -> + (* float, float *) + | [Value_const(Uconst_ref(_, Uconst_float n1)); + Value_const(Uconst_ref(_, Uconst_float n2))] when fpc -> begin match p with - Psequand -> make_const_bool(x <> 0 && y <> 0) - | Psequor -> make_const_bool(x <> 0 || y <> 0) - | Pintcomp cmp -> make_comparison cmp x y - | _ -> (Uprim(p, args, dbg), Value_unknown) + | Paddfloat -> make_const_float (n1 +. n2) + | Psubfloat -> make_const_float (n1 -. n2) + | Pmulfloat -> make_const_float (n1 *. n2) + | Pdivfloat -> make_const_float (n1 /. n2) + | Pfloatcomp c -> make_comparison c n1 n2 + | _ -> default end - | [Value_constptr x; Value_integer y] -> + (* nativeint *) + | [Value_const(Uconst_ref(_, Uconst_nativeint n))] -> begin match p with - | Pintcomp cmp -> make_comparison cmp x y - | _ -> (Uprim(p, args, dbg), Value_unknown) + | Pintofbint Pnativeint -> make_const_int (Nativeint.to_int n) + | Pcvtbint(Pnativeint, Pint32) -> make_const_int32 (Nativeint.to_int32 n) + | Pcvtbint(Pnativeint, Pint64) -> make_const_int64 (Int64.of_nativeint n) + | Pnegbint Pnativeint -> make_const_natint (Nativeint.neg n) + | _ -> default + end + (* nativeint, nativeint *) + | [Value_const(Uconst_ref(_, Uconst_nativeint n1)); + Value_const(Uconst_ref(_, Uconst_nativeint n2))] -> + begin match p with + | Paddbint Pnativeint -> make_const_natint (Nativeint.add n1 n2) + | Psubbint Pnativeint -> make_const_natint (Nativeint.sub n1 n2) + | Pmulbint Pnativeint -> make_const_natint (Nativeint.mul n1 n2) + | Pdivbint Pnativeint when n2 <> 0n -> + make_const_natint (Nativeint.div n1 n2) + | Pmodbint Pnativeint when n2 <> 0n -> + make_const_natint (Nativeint.rem n1 n2) + | Pandbint Pnativeint -> make_const_natint (Nativeint.logand n1 n2) + | Porbint Pnativeint -> make_const_natint (Nativeint.logor n1 n2) + | Pxorbint Pnativeint -> make_const_natint (Nativeint.logxor n1 n2) + | Pbintcomp(Pnativeint, c) -> make_comparison c n1 n2 + | _ -> default + end + (* nativeint, int *) + | [Value_const(Uconst_ref(_, Uconst_nativeint n1)); + Value_const(Uconst_int n2)] -> + begin match p with + | Plslbint Pnativeint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_natint (Nativeint.shift_left n1 n2) + | Plsrbint Pnativeint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_natint (Nativeint.shift_right_logical n1 n2) + | Pasrbint Pnativeint when 0 <= n2 && n2 < 8 * Arch.size_int -> + make_const_natint (Nativeint.shift_right n1 n2) + | _ -> default + end + (* int32 *) + | [Value_const(Uconst_ref(_, Uconst_int32 n))] -> + begin match p with + | Pintofbint Pint32 -> make_const_int (Int32.to_int n) + | Pcvtbint(Pint32, Pnativeint) -> make_const_natint (Nativeint.of_int32 n) + | Pcvtbint(Pint32, Pint64) -> make_const_int64 (Int64.of_int32 n) + | Pnegbint Pint32 -> make_const_int32 (Int32.neg n) + | _ -> default + end + (* int32, int32 *) + | [Value_const(Uconst_ref(_, Uconst_int32 n1)); + Value_const(Uconst_ref(_, Uconst_int32 n2))] -> + begin match p with + | Paddbint Pint32 -> make_const_int32 (Int32.add n1 n2) + | Psubbint Pint32 -> make_const_int32 (Int32.sub n1 n2) + | Pmulbint Pint32 -> make_const_int32 (Int32.mul n1 n2) + | Pdivbint Pint32 when n2 <> 0l -> make_const_int32 (Int32.div n1 n2) + | Pmodbint Pint32 when n2 <> 0l -> make_const_int32 (Int32.rem n1 n2) + | Pandbint Pint32 -> make_const_int32 (Int32.logand n1 n2) + | Porbint Pint32 -> make_const_int32 (Int32.logor n1 n2) + | Pxorbint Pint32 -> make_const_int32 (Int32.logxor n1 n2) + | Pbintcomp(Pint32, c) -> make_comparison c n1 n2 + | _ -> default + end + (* int32, int *) + | [Value_const(Uconst_ref(_, Uconst_int32 n1)); + Value_const(Uconst_int n2)] -> + begin match p with + | Plslbint Pint32 when 0 <= n2 && n2 < 32 -> + make_const_int32 (Int32.shift_left n1 n2) + | Plsrbint Pint32 when 0 <= n2 && n2 < 32 -> + make_const_int32 (Int32.shift_right_logical n1 n2) + | Pasrbint Pint32 when 0 <= n2 && n2 < 32 -> + make_const_int32 (Int32.shift_right n1 n2) + | _ -> default + end + (* int64 *) + | [Value_const(Uconst_ref(_, Uconst_int64 n))] -> + begin match p with + | Pintofbint Pint64 -> make_const_int (Int64.to_int n) + | Pcvtbint(Pint64, Pint32) -> make_const_int32 (Int64.to_int32 n) + | Pcvtbint(Pint64, Pnativeint) -> make_const_natint (Int64.to_nativeint n) + | Pnegbint Pint64 -> make_const_int64 (Int64.neg n) + | _ -> default + end + (* int64, int64 *) + | [Value_const(Uconst_ref(_, Uconst_int64 n1)); + Value_const(Uconst_ref(_, Uconst_int64 n2))] -> + begin match p with + | Paddbint Pint64 -> make_const_int64 (Int64.add n1 n2) + | Psubbint Pint64 -> make_const_int64 (Int64.sub n1 n2) + | Pmulbint Pint64 -> make_const_int64 (Int64.mul n1 n2) + | Pdivbint Pint64 when n2 <> 0L -> make_const_int64 (Int64.div n1 n2) + | Pmodbint Pint64 when n2 <> 0L -> make_const_int64 (Int64.rem n1 n2) + | Pandbint Pint64 -> make_const_int64 (Int64.logand n1 n2) + | Porbint Pint64 -> make_const_int64 (Int64.logor n1 n2) + | Pxorbint Pint64 -> make_const_int64 (Int64.logxor n1 n2) + | Pbintcomp(Pint64, c) -> make_comparison c n1 n2 + | _ -> default end - | [Value_integer x; Value_constptr y] -> + (* int64, int *) + | [Value_const(Uconst_ref(_, Uconst_int64 n1)); + Value_const(Uconst_int n2)] -> begin match p with - | Pintcomp cmp -> make_comparison cmp x y + | Plslbint Pint64 when 0 <= n2 && n2 < 64 -> + make_const_int64 (Int64.shift_left n1 n2) + | Plsrbint Pint64 when 0 <= n2 && n2 < 64 -> + make_const_int64 (Int64.shift_right_logical n1 n2) + | Pasrbint Pint64 when 0 <= n2 && n2 < 64 -> + make_const_int64 (Int64.shift_right n1 n2) + | _ -> default + end + (* TODO: Pbbswap *) + (* Catch-all *) + | _ -> + default + +let field_approx n = function + | Value_tuple a when n < Array.length a -> a.(n) + | Value_const (Uconst_ref(_, Uconst_block(_, l))) when n < List.length l -> + Value_const (List.nth l n) + | _ -> Value_unknown + +let simplif_prim_pure fpc p (args, approxs) dbg = + match p, args, approxs with + (* Block construction *) + | Pmakeblock(tag, Immutable), _, _ -> + let field = function + | Value_const c -> c + | _ -> raise Exit + in + begin try + let cst = Uconst_block (tag, List.map field approxs) in + let name = + Compilenv.new_structured_constant cst ~shared:true + in + make_const (Uconst_ref (name, cst)) + with Exit -> + (Uprim(p, args, dbg), Value_tuple (Array.of_list approxs)) + end + (* Field access *) + | Pfield n, _, [ Value_const(Uconst_ref(_, Uconst_block(_, l))) ] + when n < List.length l -> + make_const (List.nth l n) + | Pfield n, [ Uprim(Pmakeblock _, ul, _) ], [approx] + when n < List.length ul -> + (List.nth ul n, field_approx n approx) + (* Strings *) + | Pstringlength, _, [ Value_const(Uconst_ref(_, Uconst_string s)) ] -> + make_const_int (String.length s) + (* Identity *) + | Pidentity, [arg1], [app1] -> + (arg1, app1) + (* Kind test *) + | Pisint, _, [a1] -> + begin match a1 with + | Value_const(Uconst_int _ | Uconst_ptr _) -> make_const_bool true + | Value_const(Uconst_ref _) -> make_const_bool false + | Value_closure _ | Value_tuple _ -> make_const_bool false | _ -> (Uprim(p, args, dbg), Value_unknown) end + (* Compile-time constants *) + | Pctconst c, _, _ -> + begin match c with + | Big_endian -> make_const_bool Arch.big_endian + | Word_size -> make_const_int (8*Arch.size_int) + | Ostype_unix -> make_const_bool (Sys.os_type = "Unix") + | Ostype_win32 -> make_const_bool (Sys.os_type = "Win32") + | Ostype_cygwin -> make_const_bool (Sys.os_type = "Cygwin") + end + (* Catch-all *) | _ -> - (Uprim(p, args, dbg), Value_unknown) + simplif_arith_prim_pure fpc p (args, approxs) dbg -let simplif_prim p (args, approxs as args_approxs) dbg = +let simplif_prim fpc p (args, approxs as args_approxs) dbg = if List.for_all is_pure_clambda args - then simplif_prim_pure p args_approxs dbg - else (Uprim(p, args, dbg), Value_unknown) + then simplif_prim_pure fpc p args_approxs dbg + else + (* XXX : always return the same approxs as simplif_prim_pure? *) + let approx = + match p with + | Pmakeblock(_, Immutable) -> + Value_tuple (Array.of_list approxs) + | _ -> + Value_unknown + in + (Uprim(p, args, dbg), approx) (* Substitute variables in a [ulambda] term (a body of an inlined function) and perform some more simplifications on integer primitives. @@ -279,20 +525,19 @@ let simplif_prim p (args, approxs as args_approxs) dbg = over functions. *) let approx_ulam = function - Uconst(Const_base(Const_int n),_) -> Value_integer n - | Uconst(Const_base(Const_char c),_) -> Value_integer(Char.code c) - | Uconst(Const_pointer n,_) -> Value_constptr n + Uconst c -> Value_const c | _ -> Value_unknown -let rec substitute sb ulam = +let rec substitute fpc sb ulam = match ulam with Uvar v -> begin try Tbl.find v sb with Not_found -> ulam end | Uconst _ -> ulam | Udirect_apply(lbl, args, dbg) -> - Udirect_apply(lbl, List.map (substitute sb) args, dbg) + Udirect_apply(lbl, List.map (substitute fpc sb) args, dbg) | Ugeneric_apply(fn, args, dbg) -> - Ugeneric_apply(substitute sb fn, List.map (substitute sb) args, dbg) + Ugeneric_apply(substitute fpc sb fn, + List.map (substitute fpc sb) args, dbg) | Uclosure(defs, env) -> (* Question: should we rename function labels as well? Otherwise, there is a risk that function labels are not globally unique. @@ -302,11 +547,12 @@ let rec substitute sb ulam = - When we substitute offsets for idents bound by let rec in [close], case [Lletrec], we discard the original let rec body and use only the substituted term. *) - Uclosure(defs, List.map (substitute sb) env) - | Uoffset(u, ofs) -> Uoffset(substitute sb u, ofs) + Uclosure(defs, List.map (substitute fpc sb) env) + | Uoffset(u, ofs) -> Uoffset(substitute fpc sb u, ofs) | Ulet(id, u1, u2) -> let id' = Ident.rename id in - Ulet(id', substitute sb u1, substitute (Tbl.add id (Uvar id') sb) u2) + Ulet(id', substitute fpc sb u1, + substitute fpc (Tbl.add id (Uvar id') sb) u2) | Uletrec(bindings, body) -> let bindings1 = List.map (fun (id, rhs) -> (id, Ident.rename id, rhs)) bindings in @@ -315,86 +561,102 @@ let rec substitute sb ulam = (fun (id, id', _) s -> Tbl.add id (Uvar id') s) bindings1 sb in Uletrec( - List.map (fun (id, id', rhs) -> (id', substitute sb' rhs)) bindings1, - substitute sb' body) + List.map + (fun (id, id', rhs) -> (id', substitute fpc sb' rhs)) + bindings1, + substitute fpc sb' body) | Uprim(p, args, dbg) -> - let sargs = List.map (substitute sb) args in - let (res, _) = simplif_prim p (sargs, List.map approx_ulam sargs) dbg in + let sargs = + List.map (substitute fpc sb) args in + let (res, _) = + simplif_prim fpc p (sargs, List.map approx_ulam sargs) dbg in res | Uswitch(arg, sw) -> - Uswitch(substitute sb arg, + Uswitch(substitute fpc sb arg, { sw with us_actions_consts = - Array.map (substitute sb) sw.us_actions_consts; + Array.map (substitute fpc sb) sw.us_actions_consts; us_actions_blocks = - Array.map (substitute sb) sw.us_actions_blocks; + Array.map (substitute fpc sb) sw.us_actions_blocks; }) + | Ustringswitch(arg,sw,d) -> + Ustringswitch + (substitute fpc sb arg, + List.map (fun (s,act) -> s,substitute fpc sb act) sw, + Misc.may_map (substitute fpc sb) d) | Ustaticfail (nfail, args) -> - Ustaticfail (nfail, List.map (substitute sb) args) + Ustaticfail (nfail, List.map (substitute fpc sb) args) | Ucatch(nfail, ids, u1, u2) -> - Ucatch(nfail, ids, substitute sb u1, substitute sb u2) + Ucatch(nfail, ids, substitute fpc sb u1, substitute fpc sb u2) | Utrywith(u1, id, u2) -> let id' = Ident.rename id in - Utrywith(substitute sb u1, id', substitute (Tbl.add id (Uvar id') sb) u2) + Utrywith(substitute fpc sb u1, id', + substitute fpc (Tbl.add id (Uvar id') sb) u2) | Uifthenelse(u1, u2, u3) -> - begin match substitute sb u1 with - Uconst(Const_pointer n, _) -> - if n <> 0 then substitute sb u2 else substitute sb u3 + begin match substitute fpc sb u1 with + Uconst (Uconst_ptr n) -> + if n <> 0 then substitute fpc sb u2 else substitute fpc sb u3 + | Uprim(Pmakeblock _, _, _) -> + substitute fpc sb u2 | su1 -> - Uifthenelse(su1, substitute sb u2, substitute sb u3) + Uifthenelse(su1, substitute fpc sb u2, substitute fpc sb u3) end - | Usequence(u1, u2) -> Usequence(substitute sb u1, substitute sb u2) - | Uwhile(u1, u2) -> Uwhile(substitute sb u1, substitute sb u2) + | Usequence(u1, u2) -> + Usequence(substitute fpc sb u1, substitute fpc sb u2) + | Uwhile(u1, u2) -> + Uwhile(substitute fpc sb u1, substitute fpc sb u2) | Ufor(id, u1, u2, dir, u3) -> let id' = Ident.rename id in - Ufor(id', substitute sb u1, substitute sb u2, dir, - substitute (Tbl.add id (Uvar id') sb) u3) + Ufor(id', substitute fpc sb u1, substitute fpc sb u2, dir, + substitute fpc (Tbl.add id (Uvar id') sb) u3) | Uassign(id, u) -> let id' = try match Tbl.find id sb with Uvar i -> i | _ -> assert false with Not_found -> id in - Uassign(id', substitute sb u) + Uassign(id', substitute fpc sb u) | Usend(k, u1, u2, ul, dbg) -> - Usend(k, substitute sb u1, substitute sb u2, List.map (substitute sb) ul, - dbg) + Usend(k, substitute fpc sb u1, substitute fpc sb u2, + List.map (substitute fpc sb) ul, dbg) (* Perform an inline expansion *) let is_simple_argument = function - Uvar _ -> true - | Uconst(Const_base(Const_int _ | Const_char _ | Const_float _ | - Const_int32 _ | Const_int64 _ | Const_nativeint _),_) -> - true - | Uconst(Const_pointer _, _) -> true + | Uvar _ | Uconst _ -> true | _ -> false let no_effects = function - Uclosure _ -> true - | Uconst(Const_base(Const_string _),_) -> true + | Uclosure _ -> true | u -> is_simple_argument u -let rec bind_params_rec subst params args body = +let rec bind_params_rec fpc subst params args body = match (params, args) with - ([], []) -> substitute subst body + ([], []) -> substitute fpc subst body | (p1 :: pl, a1 :: al) -> if is_simple_argument a1 then - bind_params_rec (Tbl.add p1 a1 subst) pl al body + bind_params_rec fpc (Tbl.add p1 a1 subst) pl al body else begin let p1' = Ident.rename p1 in + let u1, u2 = + match Ident.name p1, a1 with + | "*opt*", Uprim(Pmakeblock(0, Immutable), [a], dbg) -> + a, Uprim(Pmakeblock(0, Immutable), [Uvar p1'], dbg) + | _ -> + a1, Uvar p1' + in let body' = - bind_params_rec (Tbl.add p1 (Uvar p1') subst) pl al body in - if occurs_var p1 body then Ulet(p1', a1, body') + bind_params_rec fpc (Tbl.add p1 u2 subst) pl al body in + if occurs_var p1 body then Ulet(p1', u1, body') else if no_effects a1 then body' else Usequence(a1, body') end | (_, _) -> assert false -let bind_params params args body = +let bind_params fpc params args body = (* Reverse parameters and arguments to preserve right-to-left evaluation order (PR#2910). *) - bind_params_rec Tbl.empty (List.rev params) (List.rev args) body + bind_params_rec fpc Tbl.empty (List.rev params) (List.rev args) body (* Check if a lambda term is ``pure'', that is without side-effects *and* not containing function definitions *) @@ -403,7 +665,7 @@ let rec is_pure = function Lvar v -> true | Lconst cst -> true | Lprim((Psetglobal _ | Psetfield _ | Psetfloatfield _ | Pduprecord _ | - Pccall _ | Praise | Poffsetref _ | Pstringsetu | Pstringsets | + Pccall _ | Praise _ | Poffsetref _ | Pstringsetu | Pstringsets | Parraysetu _ | Parraysets _ | Pbigarrayset _), _) -> false | Lprim(p, args) -> List.for_all is_pure args | Levent(lam, ev) -> is_pure lam @@ -416,8 +678,10 @@ let direct_apply fundesc funct ufunct uargs = if fundesc.fun_closed then uargs else uargs @ [ufunct] in let app = match fundesc.fun_inline with - None -> Udirect_apply(fundesc.fun_label, app_args, Debuginfo.none) - | Some(params, body) -> bind_params params app_args body in + | None -> + Udirect_apply(fundesc.fun_label, app_args, Debuginfo.none) + | Some(params, body) -> + bind_params fundesc.fun_float_const_prop params app_args body in (* If ufunct can contain side-effects or function definitions, we must make sure that it is evaluated exactly once. If the function is not closed, we evaluate ufunct as part of the @@ -432,7 +696,8 @@ let direct_apply fundesc funct ufunct uargs = let strengthen_approx appl approx = match approx_ulam appl with - (Value_integer _ | Value_constptr _) as intapprox -> intapprox + (Value_const _) as intapprox -> + intapprox | _ -> approx (* If a term has approximation Value_integer or Value_constptr and is pure, @@ -440,8 +705,16 @@ let strengthen_approx appl approx = let check_constant_result lam ulam approx = match approx with - Value_integer n when is_pure lam -> make_const_int n - | Value_constptr n when is_pure lam -> make_const_ptr n + Value_const c when is_pure lam -> make_const c + | Value_global_field (id, i) when is_pure lam -> + begin match ulam with + | Uprim(Pfield _, [Uprim(Pgetglobal _, _, _)], _) -> (ulam, approx) + | _ -> + let glb = + Uprim(Pgetglobal (Ident.create_persistent id), [], Debuginfo.none) + in + Uprim(Pfield i, [glb], Debuginfo.none), approx + end | _ -> (ulam, approx) (* Evaluate an expression with known value for its side effects only, @@ -473,8 +746,8 @@ let rec add_debug_info ev u = args2, Debuginfo.from_call ev) | Ugeneric_apply(fn, args, dinfo) -> Ugeneric_apply(fn, args, Debuginfo.from_call ev) - | Uprim(Praise, args, dinfo) -> - Uprim(Praise, args, Debuginfo.from_call ev) + | Uprim(Praise k, args, dinfo) -> + Uprim(Praise k, args, Debuginfo.from_call ev) | Uprim(p, args, dinfo) -> Uprim(p, args, Debuginfo.from_call ev) | Usend(kind, u1, u2, args, dinfo) -> @@ -492,13 +765,12 @@ let rec add_debug_info ev u = The closure environment [cenv] maps idents to [ulambda] terms. It is used to substitute environment accesses for free identifiers. *) +exception NotClosed + let close_approx_var fenv cenv id = let approx = try Tbl.find id fenv with Not_found -> Value_unknown in match approx with - Value_integer n -> - make_const_int n - | Value_constptr n -> - make_const_ptr n + Value_const c -> make_const c | approx -> let subst = try Tbl.find id cenv with Not_found -> Uvar id in (subst, approx) @@ -510,14 +782,33 @@ let rec close fenv cenv = function Lvar id -> close_approx_var fenv cenv id | Lconst cst -> - begin match cst with - Const_base(Const_int n) -> (Uconst (cst,None), Value_integer n) - | Const_base(Const_char c) -> (Uconst (cst,None), - Value_integer(Char.code c)) - | Const_pointer n -> (Uconst (cst, None), Value_constptr n) - | _ -> (Uconst (cst, Some (Compilenv.new_structured_constant cst true)), - Value_unknown) - end + let str ?(shared = true) cst = + let name = + Compilenv.new_structured_constant cst ~shared + in + Uconst_ref (name, cst) + in + let rec transl = function + | Const_base(Const_int n) -> Uconst_int n + | Const_base(Const_char c) -> Uconst_int (Char.code c) + | Const_pointer n -> Uconst_ptr n + | Const_block (tag, fields) -> + str (Uconst_block (tag, List.map transl fields)) + | Const_float_array sl -> + (* constant float arrays are really immutable *) + str (Uconst_float_array (List.map float_of_string sl)) + | Const_immstring s -> + str (Uconst_string s) + | Const_base (Const_string (s, _)) -> + (* strings (even literal ones) are mutable! *) + (* of course, the empty string is really immutable *) + str ~shared:false(*(String.length s = 0)*) (Uconst_string s) + | Const_base(Const_float x) -> str (Uconst_float (float_of_string x)) + | Const_base(Const_int32 x) -> str (Uconst_int32 x) + | Const_base(Const_int64 x) -> str (Uconst_int64 x) + | Const_base(Const_nativeint x) -> str (Uconst_nativeint x) + in + make_const (transl cst) | Lfunction(kind, params, body) as funct -> close_one_function fenv cenv (Ident.create "fun") funct @@ -581,7 +872,7 @@ let rec close fenv cenv = function (Variable, _) -> let (ubody, abody) = close fenv cenv body in (Ulet(id, ulam, ubody), abody) - | (_, (Value_integer _ | Value_constptr _)) + | (_, Value_const _) when str = Alias || is_pure lam -> close (Tbl.add id alam fenv) cenv body | (_, _) -> @@ -606,7 +897,7 @@ let rec close fenv cenv = function (fun (id, pos, approx) sb -> Tbl.add id (Uoffset(Uvar clos_ident, pos)) sb) infos Tbl.empty in - (Ulet(clos_ident, clos, substitute sb ubody), + (Ulet(clos_ident, clos, substitute !Clflags.float_const_prop sb ubody), approx) end else begin (* General case: recursive definition of values *) @@ -614,7 +905,7 @@ let rec close fenv cenv = function [] -> ([], fenv) | (id, lam) :: rem -> let (udefs, fenv_body) = clos_defs rem in - let (ulam, approx) = close fenv cenv lam in + let (ulam, approx) = close_named fenv cenv id lam in ((id, ulam) :: udefs, Tbl.add id approx fenv_body) in let (udefs, fenv_body) = clos_defs defs in let (ubody, approx) = close fenv_body cenv body in @@ -627,45 +918,67 @@ let rec close fenv cenv = function check_constant_result lam (getglobal id) (Compilenv.global_approx id) - | Lprim(Pmakeblock(tag, mut) as prim, lams) -> - let (ulams, approxs) = List.split (List.map (close fenv cenv) lams) in - (Uprim(prim, ulams, Debuginfo.none), - begin match mut with - Immutable -> Value_tuple(Array.of_list approxs) - | Mutable -> Value_unknown - end) | Lprim(Pfield n, [lam]) -> let (ulam, approx) = close fenv cenv lam in - let fieldapprox = - match approx with - Value_tuple a when n < Array.length a -> a.(n) - | _ -> Value_unknown in check_constant_result lam (Uprim(Pfield n, [ulam], Debuginfo.none)) - fieldapprox + (field_approx n approx) | Lprim(Psetfield(n, _), [Lprim(Pgetglobal id, []); lam]) -> let (ulam, approx) = close fenv cenv lam in - (!global_approx).(n) <- approx; + if approx <> Value_unknown then + (!global_approx).(n) <- approx; (Uprim(Psetfield(n, false), [getglobal id; ulam], Debuginfo.none), Value_unknown) - | Lprim(Praise, [Levent(arg, ev)]) -> + | Lprim(Praise k, [Levent(arg, ev)]) -> let (ulam, approx) = close fenv cenv arg in - (Uprim(Praise, [ulam], Debuginfo.from_raise ev), + (Uprim(Praise k, [ulam], Debuginfo.from_raise ev), Value_unknown) | Lprim(p, args) -> - simplif_prim p (close_list_approx fenv cenv args) Debuginfo.none + simplif_prim !Clflags.float_const_prop + p (close_list_approx fenv cenv args) Debuginfo.none | Lswitch(arg, sw) -> + let fn fail = + let (uarg, _) = close fenv cenv arg in + let const_index, const_actions, fconst = + close_switch arg fenv cenv sw.sw_consts sw.sw_numconsts fail + and block_index, block_actions, fblock = + close_switch arg fenv cenv sw.sw_blocks sw.sw_numblocks fail in + let ulam = + Uswitch + (uarg, + {us_index_consts = const_index; + us_actions_consts = const_actions; + us_index_blocks = block_index; + us_actions_blocks = block_actions}) in + (fconst (fblock ulam),Value_unknown) in (* NB: failaction might get copied, thus it should be some Lstaticraise *) - let (uarg, _) = close fenv cenv arg in - let const_index, const_actions = - close_switch fenv cenv sw.sw_consts sw.sw_numconsts sw.sw_failaction - and block_index, block_actions = - close_switch fenv cenv sw.sw_blocks sw.sw_numblocks sw.sw_failaction in - (Uswitch(uarg, - {us_index_consts = const_index; - us_actions_consts = const_actions; - us_index_blocks = block_index; - us_actions_blocks = block_actions}), - Value_unknown) + let fail = sw.sw_failaction in + begin match fail with + | None|Some (Lstaticraise (_,_)) -> fn fail + | Some lamfail -> + if + (sw.sw_numconsts - List.length sw.sw_consts) + + (sw.sw_numblocks - List.length sw.sw_blocks) > 1 + then + let i = next_raise_count () in + let ubody,_ = fn (Some (Lstaticraise (i,[]))) + and uhandler,_ = close fenv cenv lamfail in + Ucatch (i,[],ubody,uhandler),Value_unknown + else fn fail + end + | Lstringswitch(arg,sw,d) -> + let uarg,_ = close fenv cenv arg in + let usw = + List.map + (fun (s,act) -> + let uact,_ = close fenv cenv act in + s,uact) + sw in + let ud = + Misc.may_map + (fun d -> + let ud,_ = close fenv cenv d in + ud) d in + Ustringswitch (uarg,usw,ud),Value_unknown | Lstaticraise (i, args) -> (Ustaticfail (i, close_list fenv cenv args), Value_unknown) | Lstaticcatch(body, (i, vars), handler) -> @@ -678,7 +991,7 @@ let rec close fenv cenv = function (Utrywith(ubody, id, uhandler), Value_unknown) | Lifthenelse(arg, ifso, ifnot) -> begin match close fenv cenv arg with - (uarg, Value_constptr n) -> + (uarg, Value_const (Uconst_ptr n)) -> sequence_constant_expr arg uarg (close fenv cenv (if n = 0 then ifnot else ifso)) | (uarg, _ ) -> @@ -730,6 +1043,17 @@ and close_named fenv cenv id = function (* Build a shared closure for a set of mutually recursive functions *) and close_functions fenv cenv fun_defs = + let fun_defs = + List.flatten + (List.map + (function + | (id, Lfunction(kind, params, body)) -> + split_default_wrapper id kind params body + | _ -> assert false + ) + fun_defs) + in + (* Update and check nesting depth *) incr function_nesting_depth; let initially_closed = @@ -750,7 +1074,8 @@ and close_functions fenv cenv fun_defs = {fun_label = label; fun_arity = (if kind = Tupled then -arity else arity); fun_closed = initially_closed; - fun_inline = None } in + fun_inline = None; + fun_float_const_prop = !Clflags.float_const_prop } in (id, params, body, fundesc) | (_, _) -> fatal_error "Closure.close_functions") fun_defs in @@ -783,31 +1108,52 @@ and close_functions fenv cenv fun_defs = build_closure_env env_param (fv_pos - env_pos) fv in let cenv_body = List.fold_right2 - (fun (id, params, arity, body) pos env -> + (fun (id, params, body, fundesc) pos env -> Tbl.add id (Uoffset(Uvar env_param, pos - env_pos)) env) uncurried_defs clos_offsets cenv_fv in let (ubody, approx) = close fenv_rec cenv_body body in - if !useless_env && occurs_var env_param ubody then useless_env := false; + if !useless_env && occurs_var env_param ubody then raise NotClosed; let fun_params = if !useless_env then params else params @ [env_param] in - ({ label = fundesc.fun_label; - arity = fundesc.fun_arity; - params = fun_params; - body = ubody; - dbg }, - (id, env_pos, Value_closure(fundesc, approx))) in + let f = + { + label = fundesc.fun_label; + arity = fundesc.fun_arity; + params = fun_params; + body = ubody; + dbg; + } + in + (* give more chance of function with default parameters (i.e. + their wrapper functions) to be inlined *) + let n = + List.fold_left + (fun n id -> n + if Ident.name id = "*opt*" then 8 else 1) + 0 + fun_params + in + if lambda_smaller ubody + (!Clflags.inline_threshold + n) + then fundesc.fun_inline <- Some(fun_params, ubody); + + (f, (id, env_pos, Value_closure(fundesc, approx))) in (* Translate all function definitions. *) let clos_info_list = if initially_closed then begin - let cl = List.map2 clos_fundef uncurried_defs clos_offsets in + let snap = Compilenv.snapshot () in + try List.map2 clos_fundef uncurried_defs clos_offsets + with NotClosed -> (* If the hypothesis that the environment parameters are useless has been invalidated, then set [fun_closed] to false in all descriptions and recompile *) - if !useless_env then cl else begin + Compilenv.backtrack snap; (* PR#6337 *) List.iter - (fun (id, params, body, fundesc) -> fundesc.fun_closed <- false) + (fun (id, params, body, fundesc) -> + fundesc.fun_closed <- false; + fundesc.fun_inline <- None; + ) uncurried_defs; + useless_env := false; List.map2 clos_fundef uncurried_defs clos_offsets - end end else (* Excessive closure nesting: assume environment parameter is used *) List.map2 clos_fundef uncurried_defs clos_offsets @@ -817,31 +1163,27 @@ and close_functions fenv cenv fun_defs = (* Return the Uclosure node and the list of all identifiers defined, with offsets and approximations. *) let (clos, infos) = List.split clos_info_list in + let fv = if !useless_env then [] else fv in (Uclosure(clos, List.map (close_var fenv cenv) fv), infos) (* Same, for one non-recursive function *) and close_one_function fenv cenv id funct = match close_functions fenv cenv [id, funct] with - ((Uclosure([f], _) as clos), - [_, _, (Value_closure(fundesc, _) as approx)]) -> - (* See if the function can be inlined *) - if lambda_smaller f.body - (!Clflags.inline_threshold + List.length f.params) - then fundesc.fun_inline <- Some(f.params, f.body); - (clos, approx) - | _ -> fatal_error "Closure.close_one_function" + | (clos, (i, _, approx) :: _) when id = i -> (clos, approx) + | _ -> fatal_error "Closure.close_one_function" (* Close a switch *) -and close_switch fenv cenv cases num_keys default = - let index = Array.create num_keys 0 - and store = mk_store Lambda.same in +and close_switch arg fenv cenv cases num_keys default = + let ncases = List.length cases in + let index = Array.make num_keys 0 + and store = Storer.mk_store () in (* First default case *) begin match default with - | Some def when List.length cases < num_keys -> - ignore (store.act_store def) + | Some def when ncases < num_keys -> + assert (store.act_store def = 0) | _ -> () end ; (* Then all other cases *) @@ -849,24 +1191,108 @@ and close_switch fenv cenv cases num_keys default = (fun (key,lam) -> index.(key) <- store.act_store lam) cases ; - (* Compile action *) + + (* Explicit sharing with catch/exit, as switcher compilation may + later unshare *) + let acts = store.act_get_shared () in + let hs = ref (fun e -> e) in + + (* Compile actions *) let actions = Array.map - (fun lam -> - let ulam,_ = close fenv cenv lam in - ulam) - (store.act_get ()) in + (function + | Single lam|Shared (Lstaticraise (_,[]) as lam) -> + let ulam,_ = close fenv cenv lam in + ulam + | Shared lam -> + let ulam,_ = close fenv cenv lam in + let i = next_raise_count () in +(* + let string_of_lambda e = + Printlambda.lambda Format.str_formatter e ; + Format.flush_str_formatter () in + Printf.eprintf "SHARE CLOSURE %i [%s]\n%s\n" i + (string_of_lambda arg) + (string_of_lambda lam) ; +*) + let ohs = !hs in + hs := (fun e -> Ucatch (i,[],ohs e,ulam)) ; + Ustaticfail (i,[])) + acts in match actions with - | [| |] -> [| |], [| |] (* May happen when default is None *) - | _ -> index, actions + | [| |] -> [| |], [| |], !hs (* May happen when default is None *) + | _ -> index, actions, !hs + +(* Collect exported symbols for structured constants *) + +let collect_exported_structured_constants a = + let rec approx = function + | Value_closure (fd, a) -> + approx a; + begin match fd.fun_inline with + | Some (_, u) -> ulam u + | None -> () + end + | Value_tuple a -> Array.iter approx a + | Value_const c -> const c + | Value_unknown | Value_global_field _ -> () + and const = function + | Uconst_ref (s, c) -> + Compilenv.add_exported_constant s; + structured_constant c + | Uconst_int _ | Uconst_ptr _ -> () + and structured_constant = function + | Uconst_block (_, ul) -> List.iter const ul + | Uconst_float _ | Uconst_int32 _ + | Uconst_int64 _ | Uconst_nativeint _ + | Uconst_float_array _ | Uconst_string _ -> () + and ulam = function + | Uvar _ -> () + | Uconst c -> const c + | Udirect_apply (_, ul, _) -> List.iter ulam ul + | Ugeneric_apply (u, ul, _) -> ulam u; List.iter ulam ul + | Uclosure (fl, ul) -> + List.iter (fun f -> ulam f.body) fl; + List.iter ulam ul + | Uoffset(u, _) -> ulam u + | Ulet (_, u1, u2) -> ulam u1; ulam u2 + | Uletrec (l, u) -> List.iter (fun (_, u) -> ulam u) l; ulam u + | Uprim (_, ul, _) -> List.iter ulam ul + | Uswitch (u, sl) -> + ulam u; + Array.iter ulam sl.us_actions_consts; + Array.iter ulam sl.us_actions_blocks + | Ustringswitch (u,sw,d) -> + ulam u ; + List.iter (fun (_,act) -> ulam act) sw ; + Misc.may ulam d + | Ustaticfail (_, ul) -> List.iter ulam ul + | Ucatch (_, _, u1, u2) + | Utrywith (u1, _, u2) + | Usequence (u1, u2) + | Uwhile (u1, u2) -> ulam u1; ulam u2 + | Uifthenelse (u1, u2, u3) + | Ufor (_, u1, u2, _, u3) -> ulam u1; ulam u2; ulam u3 + | Uassign (_, u) -> ulam u + | Usend (_, u1, u2, ul, _) -> ulam u1; ulam u2; List.iter ulam ul + in + approx a + +let reset () = + global_approx := [||]; + function_nesting_depth := 0 (* The entry point *) let intro size lam = - function_nesting_depth := 0; - global_approx := Array.create size Value_unknown; + reset (); + let id = Compilenv.make_symbol None in + global_approx := Array.init size (fun i -> Value_global_field (id, i)); Compilenv.set_global_approx(Value_tuple !global_approx); let (ulam, approx) = close Tbl.empty Tbl.empty lam in + if !Clflags.opaque + then Compilenv.set_global_approx(Value_unknown) + else collect_exported_structured_constants (Value_tuple !global_approx); global_approx := [||]; ulam diff --git a/asmcomp/closure.mli b/asmcomp/closure.mli index e7bccbca..2db6e163 100644 --- a/asmcomp/closure.mli +++ b/asmcomp/closure.mli @@ -13,3 +13,4 @@ (* Introduction of closures, uncurrying, recognition of direct calls *) val intro: int -> Lambda.lambda -> Clambda.ulambda +val reset : unit -> unit diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index 941b0142..67ee3445 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -70,7 +70,7 @@ type operation = | Cload of memory_chunk | Calloc | Cstore of memory_chunk - | Caddi | Csubi | Cmuli | Cdivi | Cmodi + | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Ccmpi of comparison | Cadda | Csuba @@ -79,16 +79,17 @@ type operation = | Caddf | Csubf | Cmulf | Cdivf | Cfloatofint | Cintoffloat | Ccmpf of comparison - | Craise of Debuginfo.t + | Craise of Lambda.raise_kind * Debuginfo.t | Ccheckbound of Debuginfo.t type expression = Cconst_int of int | Cconst_natint of nativeint - | Cconst_float of string + | Cconst_float of float | Cconst_symbol of string | Cconst_pointer of int | Cconst_natpointer of nativeint + | Cconst_blockheader of nativeint | Cvar of Ident.t | Clet of Ident.t * expression * expression | Cassign of Ident.t * expression @@ -117,8 +118,8 @@ type data_item = | Cint16 of int | Cint32 of nativeint | Cint of nativeint - | Csingle of string - | Cdouble of string + | Csingle of float + | Cdouble of float | Csymbol_address of string | Clabel_address of int | Cstring of string diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index 202b6aec..97b8d409 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -56,7 +56,7 @@ type operation = | Cload of memory_chunk | Calloc | Cstore of memory_chunk - | Caddi | Csubi | Cmuli | Cdivi | Cmodi + | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Ccmpi of comparison | Cadda | Csuba @@ -65,16 +65,17 @@ type operation = | Caddf | Csubf | Cmulf | Cdivf | Cfloatofint | Cintoffloat | Ccmpf of comparison - | Craise of Debuginfo.t + | Craise of Lambda.raise_kind * Debuginfo.t | Ccheckbound of Debuginfo.t type expression = Cconst_int of int | Cconst_natint of nativeint - | Cconst_float of string + | Cconst_float of float | Cconst_symbol of string | Cconst_pointer of int | Cconst_natpointer of nativeint + | Cconst_blockheader of nativeint | Cvar of Ident.t | Clet of Ident.t * expression * expression | Cassign of Ident.t * expression @@ -103,8 +104,8 @@ type data_item = | Cint16 of int | Cint32 of nativeint | Cint of nativeint - | Csingle of string - | Cdouble of string + | Csingle of float + | Cdouble of float | Csymbol_address of string | Clabel_address of int | Cstring of string diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 23d47983..1f640b9b 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -27,24 +27,33 @@ open Cmx_format let bind name arg fn = match arg with Cvar _ | Cconst_int _ | Cconst_natint _ | Cconst_symbol _ - | Cconst_pointer _ | Cconst_natpointer _ -> fn arg + | Cconst_pointer _ | Cconst_natpointer _ + | Cconst_blockheader _ -> fn arg | _ -> let id = Ident.create name in Clet(id, arg, fn (Cvar id)) let bind_nonvar name arg fn = match arg with Cconst_int _ | Cconst_natint _ | Cconst_symbol _ - | Cconst_pointer _ | Cconst_natpointer _ -> fn arg + | Cconst_pointer _ | Cconst_natpointer _ + | Cconst_blockheader _ -> fn arg | _ -> let id = Ident.create name in Clet(id, arg, fn (Cvar id)) +let caml_black = Nativeint.shift_left (Nativeint.of_int 3) 8 + (* cf. byterun/gc.h *) + (* Block headers. Meaning of the tag field: see stdlib/obj.ml *) -let float_tag = Cconst_int Obj.double_tag let floatarray_tag = Cconst_int Obj.double_array_tag let block_header tag sz = Nativeint.add (Nativeint.shift_left (Nativeint.of_int sz) 10) (Nativeint.of_int tag) -let closure_header sz = block_header Obj.closure_tag sz +(* Static data corresponding to "value"s must be marked black in case we are + in no-naked-pointers mode. See [caml_darken] and the code below that emits + structured constants and static module definitions. *) +let black_block_header tag sz = Nativeint.logor (block_header tag sz) caml_black +let white_closure_header sz = block_header Obj.closure_tag sz +let black_closure_header sz = black_block_header Obj.closure_tag sz let infix_header ofs = block_header Obj.infix_tag ofs let float_header = block_header Obj.double_tag (size_float / size_addr) let floatarray_header len = @@ -55,14 +64,14 @@ let boxedint32_header = block_header Obj.custom_tag 2 let boxedint64_header = block_header Obj.custom_tag (1 + 8 / size_addr) let boxedintnat_header = block_header Obj.custom_tag 2 -let alloc_block_header tag sz = Cconst_natint(block_header tag sz) -let alloc_float_header = Cconst_natint(float_header) -let alloc_floatarray_header len = Cconst_natint(floatarray_header len) -let alloc_closure_header sz = Cconst_natint(closure_header sz) -let alloc_infix_header ofs = Cconst_natint(infix_header ofs) -let alloc_boxedint32_header = Cconst_natint(boxedint32_header) -let alloc_boxedint64_header = Cconst_natint(boxedint64_header) -let alloc_boxedintnat_header = Cconst_natint(boxedintnat_header) +let alloc_block_header tag sz = Cconst_blockheader(block_header tag sz) +let alloc_float_header = Cconst_blockheader(float_header) +let alloc_floatarray_header len = Cconst_blockheader(floatarray_header len) +let alloc_closure_header sz = Cconst_blockheader(white_closure_header sz) +let alloc_infix_header ofs = Cconst_blockheader(infix_header ofs) +let alloc_boxedint32_header = Cconst_blockheader(boxedint32_header) +let alloc_boxedint64_header = Cconst_blockheader(boxedint64_header) +let alloc_boxedintnat_header = Cconst_blockheader(boxedintnat_header) (* Integers *) @@ -75,10 +84,14 @@ let int_const n = else Cconst_natint (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) -let add_const c n = +let rec add_const c n = if n = 0 then c else match c with | Cconst_int x when no_overflow_add x n -> Cconst_int (x + n) + | Cop(Csubi, [Cconst_int x; c]) when no_overflow_add n x -> + Cop(Csubi, [Cconst_int (n + x); c]) + | Cop(Csubi, [c; Cconst_int x]) when no_overflow_sub n x -> + add_const c (n - x) | c -> Cop(Caddi, [c; Cconst_int n]) let incr_int = function @@ -121,31 +134,16 @@ let sub_int c1 c2 = let mul_int c1 c2 = match (c1, c2) with - (Cconst_int 0, _) -> c1 - | (Cconst_int 1, _) -> c2 - | (_, Cconst_int 0) -> c2 - | (_, Cconst_int 1) -> c1 - | (_, _) -> Cop(Cmuli, [c1; c2]) - -let tag_int = function - Cconst_int n -> int_const n - | c -> Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1]); Cconst_int 1]) - -let force_tag_int = function - Cconst_int n -> int_const n - | c -> Cop(Cor, [Cop(Clsl, [c; Cconst_int 1]); Cconst_int 1]) - -let untag_int = function - Cconst_int n -> Cconst_int(n asr 1) - | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1]); Cconst_int 1]) -> c - | Cop(Cor, [Cop(Casr, [c; Cconst_int n]); Cconst_int 1]) - when n > 0 && n < size_int * 8 -> - Cop(Casr, [c; Cconst_int (n+1)]) - | Cop(Cor, [Cop(Clsr, [c; Cconst_int n]); Cconst_int 1]) - when n > 0 && n < size_int * 8 -> - Cop(Clsr, [c; Cconst_int (n+1)]) - | Cop(Cor, [c; Cconst_int 1]) -> Cop(Casr, [c; Cconst_int 1]) - | c -> Cop(Casr, [c; Cconst_int 1]) + (c, Cconst_int 0) | (Cconst_int 0, c) -> + Cconst_int 0 + | (c, Cconst_int 1) | (Cconst_int 1, c) -> + c + | (c, Cconst_int(-1)) | (Cconst_int(-1), c) -> + sub_int (Cconst_int 0) c + | (c, Cconst_int n) | (Cconst_int n, c) when n = 1 lsl Misc.log2 n-> + Cop(Clsl, [c; Cconst_int(Misc.log2 n)]) + | (c1, c2) -> + Cop(Cmuli, [c1; c2]) let lsl_int c1 c2 = match (c1, c2) with @@ -163,64 +161,251 @@ let ignore_low_bit_int = function let lsr_int c1 c2 = match c2 with - (Cconst_int n) when n > 0 -> - Cop(Clsr, [ignore_low_bit_int c1; c2]) + Cconst_int 0 -> + c1 + | Cconst_int n when n > 0 -> + Cop(Clsr, [ignore_low_bit_int c1; c2]) | _ -> - Cop(Clsr, [c1; c2]) + Cop(Clsr, [c1; c2]) let asr_int c1 c2 = match c2 with - (Cconst_int n) when n > 0 -> - Cop(Casr, [ignore_low_bit_int c1; c2]) + Cconst_int 0 -> + c1 + | Cconst_int n when n > 0 -> + Cop(Casr, [ignore_low_bit_int c1; c2]) | _ -> - Cop(Casr, [c1; c2]) + Cop(Casr, [c1; c2]) -(* Division or modulo on tagged integers. The overflow case min_int / -1 - cannot occur, but we must guard against division by zero. *) +let tag_int = function + Cconst_int n -> + int_const n + | Cop(Casr, [c; Cconst_int n]) when n > 0 -> + Cop(Cor, [asr_int c (Cconst_int (n - 1)); Cconst_int 1]) + | c -> + incr_int (lsl_int c (Cconst_int 1)) -let is_different_from x = function - Cconst_int n -> n <> x - | Cconst_natint n -> n <> Nativeint.of_int x - | _ -> false +let force_tag_int = function + Cconst_int n -> + int_const n + | Cop(Casr, [c; Cconst_int n]) when n > 0 -> + Cop(Cor, [asr_int c (Cconst_int (n - 1)); Cconst_int 1]) + | c -> + Cop(Cor, [lsl_int c (Cconst_int 1); Cconst_int 1]) -let safe_divmod op c1 c2 dbg = - if !Clflags.fast || is_different_from 0 c2 then - Cop(op, [c1; c2]) - else - bind "divisor" c2 (fun c2 -> - Cifthenelse(c2, - Cop(op, [c1; c2]), - Cop(Craise dbg, - [Cconst_symbol "caml_bucket_Division_by_zero"]))) +let untag_int = function + Cconst_int n -> Cconst_int(n asr 1) + | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1]); Cconst_int 1]) -> c + | Cop(Cor, [Cop(Casr, [c; Cconst_int n]); Cconst_int 1]) + when n > 0 && n < size_int * 8 -> + Cop(Casr, [c; Cconst_int (n+1)]) + | Cop(Cor, [Cop(Clsr, [c; Cconst_int n]); Cconst_int 1]) + when n > 0 && n < size_int * 8 -> + Cop(Clsr, [c; Cconst_int (n+1)]) + | Cop(Cor, [c; Cconst_int 1]) -> Cop(Casr, [c; Cconst_int 1]) + | c -> Cop(Casr, [c; Cconst_int 1]) + +(* Turning integer divisions into multiply-high then shift. + The [division_parameters] function is used in module Emit for + those target platforms that support this optimization. *) + +(* Unsigned comparison between native integers. *) + +let ucompare x y = Nativeint.(compare (add x min_int) (add y min_int)) + +(* Unsigned division and modulus at type nativeint. + Algorithm: Hacker's Delight section 9.3 *) + +let udivmod n d = Nativeint.( + if d < 0n then + if ucompare n d < 0 then (0n, n) else (1n, sub n d) + else begin + let q = shift_left (div (shift_right_logical n 1) d) 1 in + let r = sub n (mul q d) in + if ucompare r d >= 0 then (succ q, sub r d) else (q, r) + end) + +(* Compute division parameters. + Algorithm: Hacker's Delight chapter 10, fig 10-1. *) + +let divimm_parameters d = Nativeint.( + assert (d > 0n); + let twopsm1 = min_int in (* 2^31 for 32-bit archs, 2^63 for 64-bit archs *) + let nc = sub (pred twopsm1) (snd (udivmod twopsm1 d)) in + let rec loop p (q1, r1) (q2, r2) = + let p = p + 1 in + let q1 = shift_left q1 1 and r1 = shift_left r1 1 in + let (q1, r1) = + if ucompare r1 nc >= 0 then (succ q1, sub r1 nc) else (q1, r1) in + let q2 = shift_left q2 1 and r2 = shift_left r2 1 in + let (q2, r2) = + if ucompare r2 d >= 0 then (succ q2, sub r2 d) else (q2, r2) in + let delta = sub d r2 in + if ucompare q1 delta < 0 || (q1 = delta && r1 = 0n) + then loop p (q1, r1) (q2, r2) + else (succ q2, p - size) + in loop (size - 1) (udivmod twopsm1 nc) (udivmod twopsm1 d)) + +(* The result [(m, p)] of [divimm_parameters d] satisfies the following + inequality: + + 2^(wordsize + p) < m * d <= 2^(wordsize + p) + 2^(p + 1) (i) + + from which it follows that + + floor(n / d) = floor(n * m / 2^(wordsize+p)) + if 0 <= n < 2^(wordsize-1) + ceil(n / d) = floor(n * m / 2^(wordsize+p)) + 1 + if -2^(wordsize-1) <= n < 0 + + The correctness condition (i) above can be checked by the code below. + It was exhaustively tested for values of d from 2 to 10^9 in the + wordsize = 64 case. + +let add2 (xh, xl) (yh, yl) = + let zl = add xl yl and zh = add xh yh in + ((if ucompare zl xl < 0 then succ zh else zh), zl) + +let shl2 (xh, xl) n = + assert (0 < n && n < size + size); + if n < size + then (logor (shift_left xh n) (shift_right_logical xl (size - n)), + shift_left xl n) + else (shift_left xl (n - size), 0n) + +let mul2 x y = + let halfsize = size / 2 in + let halfmask = pred (shift_left 1n halfsize) in + let xl = logand x halfmask and xh = shift_right_logical x halfsize in + let yl = logand y halfmask and yh = shift_right_logical y halfsize in + add2 (mul xh yh, 0n) + (add2 (shl2 (0n, mul xl yh) halfsize) + (add2 (shl2 (0n, mul xh yl) halfsize) + (0n, mul xl yl))) + +let ucompare2 (xh, xl) (yh, yl) = + let c = ucompare xh yh in if c = 0 then ucompare xl yl else c + +let validate d m p = + let md = mul2 m d in + let one2 = (0n, 1n) in + let twoszp = shl2 one2 (size + p) in + let twop1 = shl2 one2 (p + 1) in + ucompare2 twoszp md < 0 && ucompare2 md (add2 twoszp twop1) <= 0 +*) + +let rec div_int c1 c2 dbg = + match (c1, c2) with + (c1, Cconst_int 0) -> + Csequence(c1, Cop(Craise (Raise_regular, dbg), + [Cconst_symbol "caml_exn_Division_by_zero"])) + | (c1, Cconst_int 1) -> + c1 + | (Cconst_int 0 as c1, c2) -> + Csequence(c2, c1) + | (Cconst_int n1, Cconst_int n2) -> + Cconst_int (n1 / n2) + | (c1, Cconst_int n) when n <> min_int -> + let l = Misc.log2 n in + if n = 1 lsl l then + (* Algorithm: + t = shift-right-signed(c1, l - 1) + t = shift-right(t, W - l) + t = c1 + t + res = shift-right-signed(c1 + t, l) + *) + Cop(Casr, [bind "dividend" c1 (fun c1 -> + let t = asr_int c1 (Cconst_int (l - 1)) in + let t = lsr_int t (Cconst_int (Nativeint.size - l)) in + add_int c1 t); + Cconst_int l]) + else if n < 0 then + sub_int (Cconst_int 0) (div_int c1 (Cconst_int (-n)) dbg) + else begin + let (m, p) = divimm_parameters (Nativeint.of_int n) in + (* Algorithm: + t = multiply-high-signed(c1, m) + if m < 0, t = t + c1 + if p > 0, t = shift-right-signed(t, p) + res = t + sign-bit(c1) + *) + bind "dividend" c1 (fun c1 -> + let t = Cop(Cmulhi, [c1; Cconst_natint m]) in + let t = if m < 0n then Cop(Caddi, [t; c1]) else t in + let t = if p > 0 then Cop(Casr, [t; Cconst_int p]) else t in + add_int t (lsr_int c1 (Cconst_int (Nativeint.size - 1)))) + end + | (c1, c2) when !Clflags.fast -> + Cop(Cdivi, [c1; c2]) + | (c1, c2) -> + bind "divisor" c2 (fun c2 -> + Cifthenelse(c2, + Cop(Cdivi, [c1; c2]), + Cop(Craise (Raise_regular, dbg), + [Cconst_symbol "caml_exn_Division_by_zero"]))) + +let mod_int c1 c2 dbg = + match (c1, c2) with + (c1, Cconst_int 0) -> + Csequence(c1, Cop(Craise (Raise_regular, dbg), + [Cconst_symbol "caml_exn_Division_by_zero"])) + | (c1, Cconst_int 1) -> + c1 + | (Cconst_int(0 | 1) as c1, c2) -> + Csequence(c2, c1) + | (Cconst_int n1, Cconst_int n2) -> + Cconst_int (n1 mod n2) + | (c1, (Cconst_int n as c2)) when n <> min_int -> + let l = Misc.log2 n in + if n = 1 lsl l then + (* Algorithm: + t = shift-right-signed(c1, l - 1) + t = shift-right(t, W - l) + t = c1 + t + t = bit-and(t, -n) + res = c1 - t + *) + bind "dividend" c1 (fun c1 -> + let t = asr_int c1 (Cconst_int (l - 1)) in + let t = lsr_int t (Cconst_int (Nativeint.size - l)) in + let t = add_int c1 t in + let t = Cop(Cand, [t; Cconst_int (-n)]) in + sub_int c1 t) + else + bind "dividend" c1 (fun c1 -> + sub_int c1 (mul_int (div_int c1 c2 dbg) c2)) + | (c1, c2) when !Clflags.fast -> + Cop(Cmodi, [c1; c2]) + | (c1, c2) -> + bind "divisor" c2 (fun c2 -> + Cifthenelse(c2, + Cop(Cmodi, [c1; c2]), + Cop(Craise (Raise_regular, dbg), + [Cconst_symbol "caml_exn_Division_by_zero"]))) (* Division or modulo on boxed integers. The overflow case min_int / -1 can occur, in which case we force x / -1 = -x and x mod -1 = 0. (PR#5513). *) +let is_different_from x = function + Cconst_int n -> n <> x + | Cconst_natint n -> n <> Nativeint.of_int x + | _ -> false + let safe_divmod_bi mkop mkm1 c1 c2 bi dbg = bind "dividend" c1 (fun c1 -> bind "divisor" c2 (fun c2 -> - let c3 = - if Arch.division_crashes_on_overflow - && (size_int = 4 || bi <> Pint32) - && not (is_different_from (-1) c2) - then - Cifthenelse(Cop(Ccmpi Cne, [c2; Cconst_int(-1)]), mkop c1 c2, mkm1 c1) - else - mkop c1 c2 in - if !Clflags.fast || is_different_from 0 c2 then - c3 - else - Cifthenelse(c2, c3, - Cop(Craise dbg, - [Cconst_symbol "caml_bucket_Division_by_zero"])))) + let c = mkop c1 c2 dbg in + if Arch.division_crashes_on_overflow + && (size_int = 4 || bi <> Pint32) + && not (is_different_from (-1) c2) + then Cifthenelse(Cop(Ccmpi Cne, [c2; Cconst_int(-1)]), c, mkm1 c1) + else c)) let safe_div_bi = - safe_divmod_bi (fun c1 c2 -> Cop(Cdivi, [c1;c2])) - (fun c1 -> Cop(Csubi, [Cconst_int 0; c1])) + safe_divmod_bi div_int (fun c1 -> Cop(Csubi, [Cconst_int 0; c1])) let safe_mod_bi = - safe_divmod_bi (fun c1 c2 -> Cop(Cmodi, [c1;c2])) - (fun c1 -> Cconst_int 0) + safe_divmod_bi mod_int (fun c1 -> Cconst_int 0) (* Bool *) @@ -360,13 +545,15 @@ let float_array_set arr ofs newval = (* String length *) +(* Length of string block *) + let string_length exp = bind "str" exp (fun str -> let tmp_var = Ident.create "tmp" in Clet(tmp_var, Cop(Csubi, [Cop(Clsl, - [Cop(Clsr, [header str; Cconst_int 10]); + [get_size str; Cconst_int log2_size_addr]); Cconst_int 1]), Cop(Csubi, @@ -398,7 +585,7 @@ let call_cached_method obj tag cache pos args dbg = let make_alloc_generic set_fn tag wordsize args = if wordsize <= Config.max_young_wosize then - Cop(Calloc, Cconst_natint(block_header tag wordsize) :: args) + Cop(Calloc, Cconst_blockheader(block_header tag wordsize) :: args) else begin let id = Ident.create "alloc" in let rec fill_fields idx = function @@ -484,32 +671,20 @@ let transl_comparison = function (* Translate structured constants *) -(* Fabrice: moved to compilenv.ml ---- -let const_label = ref 0 - -let new_const_label () = - incr const_label; - !const_label - -let new_const_symbol () = - incr const_label; - Compilenv.make_symbol (Some (string_of_int !const_label)) - -let structured_constants = ref ([] : (string * structured_constant) list) -*) - let transl_constant = function - Const_base(Const_int n) -> + | Uconst_int n -> int_const n - | Const_base(Const_char c) -> - Cconst_int(((Char.code c) lsl 1) + 1) - | Const_pointer n -> + | Uconst_ptr n -> if n <= max_repr_int && n >= min_repr_int then Cconst_pointer((n lsl 1) + 1) else Cconst_natpointer (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) - | cst -> - Cconst_symbol (Compilenv.new_structured_constant cst false) + | Uconst_ref (label, _) -> + Cconst_symbol label + +let transl_structured_constant cst = + let label = Compilenv.new_structured_constant cst ~shared:true in + Cconst_symbol label (* Translate constant closures *) @@ -520,9 +695,9 @@ let constant_closures = let box_int_constant bi n = match bi with - Pnativeint -> Const_base(Const_nativeint n) - | Pint32 -> Const_base(Const_int32 (Nativeint.to_int32 n)) - | Pint64 -> Const_base(Const_int64 (Int64.of_nativeint n)) + Pnativeint -> Uconst_nativeint n + | Pint32 -> Uconst_int32 (Nativeint.to_int32 n) + | Pint64 -> Uconst_int64 (Int64.of_nativeint n) let operations_boxed_int bi = match bi with @@ -539,9 +714,9 @@ let alloc_header_boxed_int bi = let box_int bi arg = match arg with Cconst_int n -> - transl_constant (box_int_constant bi (Nativeint.of_int n)) + transl_structured_constant (box_int_constant bi (Nativeint.of_int n)) | Cconst_natint n -> - transl_constant (box_int_constant bi n) + transl_structured_constant (box_int_constant bi n) | _ -> let arg' = if bi = Pint32 && size_int = 8 && big_endian @@ -824,8 +999,22 @@ let unaligned_set_64 ptr idx newval = Cop(Cstore Byte_unsigned, [add_int (add_int ptr idx) (Cconst_int 7); b8])))) +let max_or_zero a = + bind "size" a (fun a -> + (* equivalent to + Cifthenelse(Cop(Ccmpi Cle, [a; Cconst_int 0]), Cconst_int 0, a) + + if a is positive, sign is 0 hence sign_negation is full of 1 + so sign_negation&a = a + if a is negative, sign is full of 1 hence sign_negation is 0 + so sign_negation&a = 0 *) + let sign = Cop(Casr, [a; Cconst_int (size_int * 8 - 1)]) in + let sign_negation = Cop(Cxor, [sign; Cconst_int (-1)]) in + Cop(Cand, [sign_negation; a])) + let check_bound unsafe dbg a1 a2 k = - if unsafe then k else Csequence(make_checkbound dbg [a1;a2], k) + if unsafe then k + else Csequence(make_checkbound dbg [max_or_zero a1;a2], k) (* Simplification of some primitives into C calls *) @@ -888,28 +1077,9 @@ let simplif_primitive p = (* Build switchers both for constants and blocks *) -(* constants first *) - let transl_isout h arg = tag_int (Cop(Ccmpa Clt, [h ; arg])) -let make_switch_gen arg cases acts = - let lcases = Array.length cases in - let new_cases = Array.create lcases 0 in - let store = Switch.mk_store (=) in - - for i = 0 to Array.length cases-1 do - let act = cases.(i) in - let new_act = store.Switch.act_store act in - new_cases.(i) <- new_act - done ; - Cswitch - (arg, new_cases, - Array.map - (fun n -> acts.(n)) - (store.Switch.act_get ())) - - -(* Then for blocks *) +(* Build an actual switch (ie jump table) *) module SArgBlocks = struct @@ -925,19 +1095,97 @@ struct type act = expression let default = Cexit (0,[]) + let make_const i = Cconst_int i let make_prim p args = Cop (p,args) let make_offset arg n = add_const arg n let make_isout h arg = Cop (Ccmpa Clt, [h ; arg]) let make_isin h arg = Cop (Ccmpa Cge, [h ; arg]) let make_if cond ifso ifnot = Cifthenelse (cond, ifso, ifnot) - let make_switch arg cases actions = - make_switch_gen arg cases actions + let make_switch arg cases actions = Cswitch (arg,cases,actions) let bind arg body = bind "switcher" arg body + let make_catch handler = match handler with + | Cexit (i,[]) -> i,fun e -> e + | _ -> + let i = next_raise_count () in +(* + Printf.eprintf "SHARE CMM: %i\n" i ; + Printcmm.expression Format.str_formatter handler ; + Printf.eprintf "%s\n" (Format.flush_str_formatter ()) ; +*) + i, + (fun body -> match body with + | Cexit (j,_) -> + if i=j then handler + else body + | _ -> Ccatch (i,[],body,handler)) + + let make_exit i = Cexit (i,[]) + end +(* cmm store, as sharing as normally been detected in previous + phases, we only share exits *) +module StoreExp = + Switch.Store + (struct + type t = expression + type key = int + let make_key = function + | Cexit (i,[]) -> Some i + | _ -> None + end) + module SwitcherBlocks = Switch.Make(SArgBlocks) +(* Int switcher, arg in [low..high], + cases is list of individual cases, and is sorted by first component *) + +let transl_int_switch arg low high cases default = match cases with +| [] -> assert false +| _::_ -> + let store = StoreExp.mk_store () in + assert (store.Switch.act_store default = 0) ; + let cases = + List.map + (fun (i,act) -> i,store.Switch.act_store act) + cases in + let rec inters plow phigh pact = function + | [] -> + if phigh = high then [plow,phigh,pact] + else [(plow,phigh,pact); (phigh+1,high,0) ] + | (i,act)::rem -> + if i = phigh+1 then + if pact = act then + inters plow i pact rem + else + (plow,phigh,pact)::inters i i act rem + else (* insert default *) + if pact = 0 then + if act = 0 then + inters plow i 0 rem + else + (plow,i-1,pact):: + inters i i act rem + else (* pact <> 0 *) + (plow,phigh,pact):: + begin + if act = 0 then inters (phigh+1) i 0 rem + else (phigh+1,i-1,0)::inters i i act rem + end in + let inters = match cases with + | [] -> assert false + | (k0,act0)::rem -> + if k0 = low then inters k0 k0 act0 rem + else inters low (k0-1) 0 cases in + bind "switcher" arg + (fun a -> + SwitcherBlocks.zyva + (low,high) + a + (Array.of_list inters) store) + + (* Auxiliary functions for optimizing "let" of boxed numbers (floats and boxed integers *) @@ -946,8 +1194,8 @@ type unboxed_number_kind = | Boxed_float | Boxed_integer of boxed_integer -let is_unboxed_number = function - Uconst(Const_base(Const_float f), _) -> +let rec is_unboxed_number = function + Uconst(Uconst_ref(_, Uconst_float _)) -> Boxed_float | Uprim(p, _, _) -> begin match simplif_primitive p with @@ -988,9 +1236,10 @@ let is_unboxed_number = function | Pbbswap bi -> Boxed_integer bi | _ -> No_unboxing end + | Ulet (_, _, e) | Usequence (_, e) -> is_unboxed_number e | _ -> No_unboxing -let subst_boxed_number unbox_fn boxed_id unboxed_id exp = +let subst_boxed_number unbox_fn boxed_id unboxed_id box_chunk box_offset exp = let need_boxed = ref false in let assigned = ref false in let rec subst = function @@ -1004,10 +1253,14 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id exp = end else Cassign(id, subst arg) | Ctuple argv -> Ctuple(List.map subst argv) - | Cop(Cload _, [Cvar id]) as e -> - if Ident.same id boxed_id then Cvar unboxed_id else e - | Cop(Cload _, [Cop(Cadda, [Cvar id; _])]) as e -> - if Ident.same id boxed_id then Cvar unboxed_id else e + | Cop(Cload chunk, [Cvar id]) as e -> + if Ident.same id boxed_id && chunk = box_chunk && box_offset = 0 + then Cvar unboxed_id + else e + | Cop(Cload chunk, [Cop(Cadda, [Cvar id; Cconst_int ofs])]) as e -> + if Ident.same id boxed_id && chunk = box_chunk && ofs = box_offset + then Cvar unboxed_id + else e | Cop(op, argv) -> Cop(op, List.map subst argv) | Csequence(e1, e2) -> Csequence(subst e1, subst e2) | Cifthenelse(e1, e2, e3) -> Cifthenelse(subst e1, subst e2, subst e3) @@ -1025,12 +1278,19 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id exp = let functions = (Queue.create() : ufunction Queue.t) +let strmatch_compile = + let module S = + Strmatch.Make + (struct + let string_block_length = get_size + let transl_switch = transl_int_switch + end) in + S.compile + let rec transl = function Uvar id -> Cvar id - | Uconst (sc, Some const_label) -> - Cconst_symbol const_label - | Uconst (sc, None) -> + | Uconst sc -> transl_constant sc | Uclosure(fundecls, []) -> let lbl = Compilenv.new_const_symbol() in @@ -1098,9 +1358,12 @@ let rec transl = function Clet(id, transl exp, transl body) | Boxed_float -> transl_unbox_let box_float unbox_float transl_unbox_float + Double_u 0 id exp body | Boxed_integer bi -> transl_unbox_let (box_int bi) (unbox_int bi) (transl_unbox_int bi) + (if bi = Pint32 then Thirtytwo_signed else Word) + size_addr id exp body end | Uletrec(bindings, body) -> @@ -1112,7 +1375,7 @@ let rec transl = function (Pgetglobal id, []) -> Cconst_symbol (Ident.name id) | (Pmakeblock(tag, mut), []) -> - transl_constant(Const_block(tag, [])) + assert false | (Pmakeblock(tag, mut), args) -> make_alloc tag (List.map transl args) | (Pccall prim, args) -> @@ -1125,7 +1388,7 @@ let rec transl = function dbg), List.map transl args) | (Pmakearray kind, []) -> - transl_constant(Const_block(0, [])) + transl_structured_constant (Uconst_block(0, [])) | (Pmakearray kind, args) -> begin match kind with Pgenarray -> @@ -1197,6 +1460,11 @@ let rec transl = function (untag_int arg) s.us_index_consts s.us_actions_consts, transl_switch (get_tag arg) s.us_index_blocks s.us_actions_blocks)) + | Ustringswitch(arg,sw,d) -> + bind "switch" (transl arg) + (fun arg -> + strmatch_compile arg (Misc.may_map transl d) + (List.map (fun (s,act) -> s,transl act) sw)) | Ustaticfail (nfail, args) -> Cexit (nfail, List.map transl args) | Ucatch(nfail, [], body, handler) -> @@ -1289,9 +1557,11 @@ and transl_prim_1 p arg dbg = Cop(Cload Double_u, [if n = 0 then ptr else Cop(Cadda, [ptr; Cconst_int(n * size_float)])])) + | Pint_as_pointer -> + Cop(Cadda, [transl arg; Cconst_int (-1)]) (* Exceptions *) - | Praise -> - Cop(Craise dbg, [transl arg]) + | Praise k -> + Cop(Craise (k, dbg), [transl arg]) (* Integer operations *) | Pnegint -> Cop(Csubi, [Cconst_int 2; transl arg]) @@ -1309,7 +1579,7 @@ and transl_prim_1 p arg dbg = if no_overflow_lsl n then add_const (transl arg) (n lsl 1) else - transl_prim_2 Paddint arg (Uconst (Const_base(Const_int n), None)) + transl_prim_2 Paddint arg (Uconst (Uconst_int n)) Debuginfo.none | Poffsetref n -> return_unit @@ -1408,13 +1678,11 @@ and transl_prim_2 p arg1 arg2 dbg = | Psubint -> incr_int(sub_int (transl arg1) (transl arg2)) | Pmulint -> - incr_int(Cop(Cmuli, [decr_int(transl arg1); untag_int(transl arg2)])) + incr_int(mul_int (decr_int(transl arg1)) (untag_int(transl arg2))) | Pdivint -> - tag_int(safe_divmod Cdivi (untag_int(transl arg1)) - (untag_int(transl arg2)) dbg) + tag_int(div_int (untag_int(transl arg1)) (untag_int(transl arg2)) dbg) | Pmodint -> - tag_int(safe_divmod Cmodi (untag_int(transl arg1)) - (untag_int(transl arg2)) dbg) + tag_int(mod_int (untag_int(transl arg1)) (untag_int(transl arg2)) dbg) | Pandint -> Cop(Cand, [transl arg1; transl arg2]) | Porint -> @@ -1741,25 +2009,26 @@ and transl_prim_3 p arg1 arg2 arg3 dbg = fatal_error "Cmmgen.transl_prim_3" and transl_unbox_float = function - Uconst(Const_base(Const_float f), _) -> Cconst_float f + Uconst(Uconst_ref(_, Uconst_float f)) -> Cconst_float f | exp -> unbox_float(transl exp) and transl_unbox_int bi = function - Uconst(Const_base(Const_int32 n), _) -> + Uconst(Uconst_ref(_, Uconst_int32 n)) -> Cconst_natint (Nativeint.of_int32 n) - | Uconst(Const_base(Const_nativeint n), _) -> + | Uconst(Uconst_ref(_, Uconst_nativeint n)) -> Cconst_natint n - | Uconst(Const_base(Const_int64 n), _) -> + | Uconst(Uconst_ref(_, Uconst_int64 n)) -> assert (size_int = 8); Cconst_natint (Int64.to_nativeint n) - | Uprim(Pbintofint bi',[Uconst(Const_base(Const_int i),_)],_) when bi = bi' -> + | Uprim(Pbintofint bi',[Uconst(Uconst_int i)],_) when bi = bi' -> Cconst_int i | exp -> unbox_int bi (transl exp) -and transl_unbox_let box_fn unbox_fn transl_unbox_fn id exp body = +and transl_unbox_let box_fn unbox_fn transl_unbox_fn box_chunk box_offset + id exp body = let unboxed_id = Ident.create (Ident.name id) in let trbody1 = transl body in let (trbody2, need_boxed, is_assigned) = - subst_boxed_number unbox_fn id unboxed_id trbody1 in + subst_boxed_number unbox_fn id unboxed_id box_chunk box_offset trbody1 in if need_boxed && is_assigned then Clet(id, transl exp, trbody1) else @@ -1784,8 +2053,8 @@ and make_catch2 mk_body handler = match handler with and exit_if_true cond nfail otherwise = match cond with - | Uconst (Const_pointer 0, _) -> otherwise - | Uconst (Const_pointer 1, _) -> Cexit (nfail,[]) + | Uconst (Uconst_ptr 0) -> otherwise + | Uconst (Uconst_ptr 1) -> Cexit (nfail,[]) | Uprim(Psequor, [arg1; arg2], _) -> exit_if_true arg1 nfail (exit_if_true arg2 nfail otherwise) | Uprim(Psequand, _, _) -> @@ -1814,8 +2083,8 @@ and exit_if_true cond nfail otherwise = and exit_if_false cond otherwise nfail = match cond with - | Uconst (Const_pointer 0, _) -> Cexit (nfail,[]) - | Uconst (Const_pointer 1, _) -> otherwise + | Uconst (Uconst_ptr 0) -> Cexit (nfail,[]) + | Uconst (Uconst_ptr 1) -> otherwise | Uprim(Psequand, [arg1; arg2], _) -> exit_if_false arg1 (exit_if_false arg2 otherwise nfail) nfail | Uprim(Psequor, _, _) -> @@ -1846,9 +2115,13 @@ and transl_switch arg index cases = match Array.length cases with | 0 -> fatal_error "Cmmgen.transl_switch" | 1 -> transl cases.(0) | _ -> + let cases = Array.map transl cases in + let store = StoreExp.mk_store () in + let index = + Array.map + (fun j -> store.Switch.act_store cases.(j)) + index in let n_index = Array.length index in - let actions = Array.map transl cases in - let inters = ref [] and this_high = ref (n_index-1) and this_low = ref (n_index-1) @@ -1865,13 +2138,15 @@ and transl_switch arg index cases = match Array.length cases with end done ; inters := (0, !this_high, !this_act) :: !inters ; - bind "switcher" arg - (fun a -> - SwitcherBlocks.zyva - (0,n_index-1) - (fun i -> Cconst_int i) - a - (Array.of_list !inters) actions) + match !inters with + | [_] -> cases.(0) + | inters -> + bind "switcher" arg + (fun a -> + SwitcherBlocks.zyva + (0,n_index-1) + a + (Array.of_list inters) store) and transl_letrec bindings cont = let bsz = @@ -1935,99 +2210,42 @@ let rec transl_all_functions already_translated cont = (* Emit structured constants *) -let immstrings = Hashtbl.create 17 - -let rec emit_constant symb cst cont = +let rec emit_structured_constant symb cst cont = + let emit_block white_header symb cont = + (* Headers for structured constants must be marked black in case we + are in no-naked-pointers mode. See [caml_darken]. *) + let black_header = Nativeint.logor white_header caml_black in + Cint black_header :: Cdefine_symbol symb :: cont + in match cst with - Const_base(Const_float s) -> - Cint(float_header) :: Cdefine_symbol symb :: Cdouble s :: cont - | Const_base(Const_string s) | Const_immstring s -> - Cint(string_header (String.length s)) :: - Cdefine_symbol symb :: - emit_string_constant s cont - | Const_base(Const_int32 n) -> - Cint(boxedint32_header) :: Cdefine_symbol symb :: - emit_boxed_int32_constant n cont - | Const_base(Const_int64 n) -> - Cint(boxedint64_header) :: Cdefine_symbol symb :: - emit_boxed_int64_constant n cont - | Const_base(Const_nativeint n) -> - Cint(boxedintnat_header) :: Cdefine_symbol symb :: - emit_boxed_nativeint_constant n cont - | Const_block(tag, fields) -> - let (emit_fields, cont1) = emit_constant_fields fields cont in - Cint(block_header tag (List.length fields)) :: - Cdefine_symbol symb :: - emit_fields @ cont1 - | Const_float_array(fields) -> - Cint(floatarray_header (List.length fields)) :: - Cdefine_symbol symb :: - Misc.map_end (fun f -> Cdouble f) fields cont - | _ -> fatal_error "gencmm.emit_constant" - -and emit_constant_fields fields cont = - match fields with - [] -> ([], cont) - | f1 :: fl -> - let (data1, cont1) = emit_constant_field f1 cont in - let (datal, contl) = emit_constant_fields fl cont1 in - (data1 :: datal, contl) - -and emit_constant_field field cont = - match field with - Const_base(Const_int n) -> - (Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n), - cont) - | Const_base(Const_char c) -> - (Cint(Nativeint.of_int(((Char.code c) lsl 1) + 1)), cont) - | Const_base(Const_float s) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(float_header) :: Cdefine_label lbl :: Cdouble s :: cont) - | Const_base(Const_string s) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(string_header (String.length s)) :: Cdefine_label lbl :: - emit_string_constant s cont) - | Const_immstring s -> - begin try - (Clabel_address (Hashtbl.find immstrings s), cont) - with Not_found -> - let lbl = Compilenv.new_const_label() in - Hashtbl.add immstrings s lbl; - (Clabel_address lbl, - Cint(string_header (String.length s)) :: Cdefine_label lbl :: - emit_string_constant s cont) - end - | Const_base(Const_int32 n) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(boxedint32_header) :: Cdefine_label lbl :: - emit_boxed_int32_constant n cont) - | Const_base(Const_int64 n) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(boxedint64_header) :: Cdefine_label lbl :: - emit_boxed_int64_constant n cont) - | Const_base(Const_nativeint n) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(boxedintnat_header) :: Cdefine_label lbl :: - emit_boxed_nativeint_constant n cont) - | Const_pointer n -> - (Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n), - cont) - | Const_block(tag, fields) -> - let lbl = Compilenv.new_const_label() in - let (emit_fields, cont1) = emit_constant_fields fields cont in - (Clabel_address lbl, - Cint(block_header tag (List.length fields)) :: Cdefine_label lbl :: - emit_fields @ cont1) - | Const_float_array(fields) -> - let lbl = Compilenv.new_const_label() in - (Clabel_address lbl, - Cint(floatarray_header (List.length fields)) :: Cdefine_label lbl :: - Misc.map_end (fun f -> Cdouble f) fields cont) + | Uconst_float s-> + emit_block float_header symb (Cdouble s :: cont) + | Uconst_string s -> + emit_block (string_header (String.length s)) symb + (emit_string_constant s cont) + | Uconst_int32 n -> + emit_block boxedint32_header symb + (emit_boxed_int32_constant n cont) + | Uconst_int64 n -> + emit_block boxedint64_header symb + (emit_boxed_int64_constant n cont) + | Uconst_nativeint n -> + emit_block boxedintnat_header symb + (emit_boxed_nativeint_constant n cont) + | Uconst_block (tag, csts) -> + let cont = List.fold_right emit_constant csts cont in + emit_block (block_header tag (List.length csts)) symb cont + | Uconst_float_array fields -> + emit_block (floatarray_header (List.length fields)) symb + (Misc.map_end (fun f -> Cdouble f) fields cont) + +and emit_constant cst cont = + match cst with + | Uconst_int n | Uconst_ptr n -> + Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) + :: cont + | Uconst_ref (label, _) -> + Csymbol_address label :: cont and emit_string_constant s cont = let n = size_int - 1 - (String.length s) mod size_int in @@ -2075,7 +2293,7 @@ let emit_constant_closure symb fundecls cont = Cint(Nativeint.of_int (f2.arity lsl 1 + 1)) :: Csymbol_address f2.label :: emit_others (pos + 4) rem in - Cint(closure_header (fundecls_size fundecls)) :: + Cint(black_closure_header (fundecls_size fundecls)) :: Cdefine_symbol symb :: if f1.arity = 1 then Csymbol_address f1.label :: @@ -2093,14 +2311,12 @@ let emit_all_constants cont = let c = ref cont in List.iter (fun (lbl, global, cst) -> - let cst = emit_constant lbl cst [] in + let cst = emit_structured_constant lbl cst [] in let cst = if global then Cglobal_symbol lbl :: cst else cst in c:= Cdata(cst):: !c) (Compilenv.structured_constants()); -(* structured_constants := []; done in Compilenv.reset() *) - Hashtbl.clear immstrings; (* PR#3979 *) List.iter (fun (symb, fundecls) -> c := Cdata(emit_constant_closure symb fundecls []) :: !c) @@ -2119,10 +2335,18 @@ let compunit size ulam = fun_dbg = Debuginfo.none }] in let c2 = transl_all_functions StringSet.empty c1 in let c3 = emit_all_constants c2 in - Cdata [Cint(block_header 0 size); + let space = + (* These words will be registered as roots and as such must contain + valid values, in case we are in no-naked-pointers mode. Likewise + the block header must be black, below (see [caml_darken]), since + the overall record may be referenced. *) + Array.to_list + (Array.init size (fun _index -> + Cint (Nativeint.of_int 1 (* Val_unit *)))) + in + Cdata ([Cint(black_block_header 0 size); Cglobal_symbol glob; - Cdefine_symbol glob; - Cskip(size * size_addr)] :: c3 + Cdefine_symbol glob] @ space) :: c3 (* CAMLprim value caml_cache_public_method (value meths, value tag, value *cache) @@ -2186,7 +2410,7 @@ let cache_public_method meths tag cache = *) let apply_function_body arity = - let arg = Array.create arity (Ident.create "arg") in + let arg = Array.make arity (Ident.create "arg") in for i = 1 to arity - 1 do arg.(i) <- Ident.create "arg" done; let clos = Ident.create "clos" in let rec app_fun clos n = @@ -2466,8 +2690,8 @@ let reference_symbols namelist = let global_data name v = Cdata(Cglobal_symbol name :: - emit_constant name - (Const_base (Const_string (Marshal.to_string v []))) []) + emit_structured_constant name + (Uconst_string (Marshal.to_string v [])) []) let globals_map v = global_data "caml_globals_map" v @@ -2502,15 +2726,18 @@ let code_segment_table namelist = (* Initialize a predefined exception *) -let predef_exception name = - let bucketname = "caml_bucket_" ^ name in +let predef_exception i name = let symname = "caml_exn_" ^ name in + let cst = Uconst_string name in + let label = Compilenv.new_const_symbol () in + let cont = emit_structured_constant label cst [] in Cdata(Cglobal_symbol symname :: - emit_constant symname (Const_block(0,[Const_base(Const_string name)])) - [ Cglobal_symbol bucketname; - Cint(block_header 0 1); - Cdefine_symbol bucketname; - Csymbol_address symname ]) + emit_structured_constant symname + (Uconst_block(Obj.object_tag, + [ + Uconst_ref(label, cst); + Uconst_int (-i-1); + ])) cont) (* Header for a plugin *) diff --git a/asmcomp/cmmgen.mli b/asmcomp/cmmgen.mli index 84db405f..46f94966 100644 --- a/asmcomp/cmmgen.mli +++ b/asmcomp/cmmgen.mli @@ -26,5 +26,5 @@ val globals_map: (string * Digest.t * Digest.t * string list) list -> val frame_table: string list -> Cmm.phrase val data_segment_table: string list -> Cmm.phrase val code_segment_table: string list -> Cmm.phrase -val predef_exception: string -> Cmm.phrase +val predef_exception: int -> string -> Cmm.phrase val plugin_header: (Cmx_format.unit_infos * Digest.t) list -> Cmm.phrase diff --git a/asmcomp/cmx_format.mli b/asmcomp/cmx_format.mli index c4e55796..51aa0440 100644 --- a/asmcomp/cmx_format.mli +++ b/asmcomp/cmx_format.mli @@ -26,8 +26,9 @@ type unit_infos = { mutable ui_name: string; (* Name of unit implemented *) mutable ui_symbol: string; (* Prefix for symbols *) mutable ui_defines: string list; (* Unit and sub-units implemented *) - mutable ui_imports_cmi: (string * Digest.t) list; (* Interfaces imported *) - mutable ui_imports_cmx: (string * Digest.t) list; (* Infos imported *) + mutable ui_imports_cmi: + (string * Digest.t option) list; (* Interfaces imported *) + mutable ui_imports_cmx:(string * Digest.t option) list; (* Infos imported *) mutable ui_approx: Clambda.value_approximation; (* Approx of the structure*) mutable ui_curry_fun: int list; (* Currying functions needed *) mutable ui_apply_fun: int list; (* Apply functions needed *) @@ -49,8 +50,8 @@ type library_infos = type dynunit = { dynu_name: string; dynu_crc: Digest.t; - dynu_imports_cmi: (string * Digest.t) list; - dynu_imports_cmx: (string * Digest.t) list; + dynu_imports_cmi: (string * Digest.t option) list; + dynu_imports_cmx: (string * Digest.t option) list; dynu_defines: string list; } diff --git a/asmcomp/coloring.ml b/asmcomp/coloring.ml index 67ed8729..aff4ad62 100644 --- a/asmcomp/coloring.ml +++ b/asmcomp/coloring.ml @@ -47,7 +47,7 @@ let allocate_registers() = if reg.spill then begin (* Preallocate the registers in the stack *) let nslots = Proc.num_stack_slots.(cl) in - let conflict = Array.create nslots false in + let conflict = Array.make nslots false in List.iter (fun r -> match r.loc with @@ -84,14 +84,14 @@ let allocate_registers() = (* Where to start the search for a suitable register. Used to introduce some "randomness" in the choice between registers with equal scores. This offers more opportunities for scheduling. *) - let start_register = Array.create Proc.num_register_classes 0 in + let start_register = Array.make Proc.num_register_classes 0 in (* Assign a location to a register, the best we can. *) let assign_location reg = let cl = Proc.register_class reg in let first_reg = Proc.first_available_register.(cl) in let num_regs = Proc.num_available_registers.(cl) in - let score = Array.create num_regs 0 in + let score = Array.make num_regs 0 in let best_score = ref (-1000000) and best_reg = ref (-1) in let start = start_register.(cl) in if num_regs <> 0 then begin @@ -161,7 +161,7 @@ let allocate_registers() = end else begin (* Sorry, we must put the pseudoreg in a stack location *) let nslots = Proc.num_stack_slots.(cl) in - let score = Array.create nslots 0 in + let score = Array.make nslots 0 in (* Compute the scores as for registers *) List.iter (fun (r, w) -> diff --git a/asmcomp/comballoc.ml b/asmcomp/comballoc.ml index 6192f1e8..820b1b3f 100644 --- a/asmcomp/comballoc.ml +++ b/asmcomp/comballoc.ml @@ -27,7 +27,7 @@ let allocated_size = function let rec combine i allocstate = match i.desc with - Iend | Ireturn | Iexit _ | Iraise -> + Iend | Ireturn | Iexit _ | Iraise _ -> (i, allocated_size allocstate) | Iop(Ialloc sz) -> begin match allocstate with diff --git a/asmcomp/compilenv.ml b/asmcomp/compilenv.ml index 17870c93..a313b972 100644 --- a/asmcomp/compilenv.ml +++ b/asmcomp/compilenv.ml @@ -27,8 +27,30 @@ exception Error of error let global_infos_table = (Hashtbl.create 17 : (string, unit_infos option) Hashtbl.t) -let structured_constants = - ref ([] : (string * bool * Lambda.structured_constant) list) +module CstMap = + Map.Make(struct + type t = Clambda.ustructured_constant + let compare = Clambda.compare_structured_constants + (* PR#6442: it is incorrect to use Pervasives.compare on values of type t + because it compares "0.0" and "-0.0" equal. *) + end) + +type structured_constants = + { + strcst_shared: string CstMap.t; + strcst_all: (string * Clambda.ustructured_constant) list; + } + +let structured_constants_empty = + { + strcst_shared = CstMap.empty; + strcst_all = []; + } + +let structured_constants = ref structured_constants_empty + + +let exported_constants = Hashtbl.create 17 let current_unit = { ui_name = ""; @@ -69,7 +91,8 @@ let reset ?packname name = current_unit.ui_apply_fun <- []; current_unit.ui_send_fun <- []; current_unit.ui_force_link <- false; - structured_constants := [] + Hashtbl.clear exported_constants; + structured_constants := structured_constants_empty let current_unit_infos () = current_unit @@ -83,10 +106,19 @@ let make_symbol ?(unitname = current_unit.ui_symbol) idopt = | None -> prefix | Some id -> prefix ^ "__" ^ id +let symbol_in_current_unit name = + let prefix = "caml" ^ current_unit.ui_symbol in + name = prefix || + (let lp = String.length prefix in + String.length name >= 2 + lp + && String.sub name 0 lp = prefix + && name.[lp] = '_' + && name.[lp + 1] = '_') + let read_unit_info filename = let ic = open_in_bin filename in try - let buffer = input_bytes ic (String.length cmx_magic_number) in + let buffer = really_input_string ic (String.length cmx_magic_number) in if buffer <> cmx_magic_number then begin close_in ic; raise(Error(Not_a_unit_info filename)) @@ -101,7 +133,7 @@ let read_unit_info filename = let read_library_info filename = let ic = open_in_bin filename in - let buffer = input_bytes ic (String.length cmxa_magic_number) in + let buffer = really_input_string ic (String.length cmxa_magic_number) in if buffer <> cmxa_magic_number then raise(Error(Not_a_unit_info filename)); let infos = (input_value ic : library_infos) in @@ -111,9 +143,6 @@ let read_library_info filename = (* Read and cache info on global identifiers *) -let cmx_not_found_crc = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - let get_global_info global_ident = ( let modname = Ident.name global_ident in if modname = current_unit.ui_name then @@ -129,9 +158,9 @@ let get_global_info global_ident = ( let (ui, crc) = read_unit_info filename in if ui.ui_name <> modname then raise(Error(Illegal_renaming(modname, ui.ui_name, filename))); - (Some ui, crc) + (Some ui, Some crc) with Not_found -> - (None, cmx_not_found_crc) in + (None, None) in current_unit.ui_imports_cmx <- (modname, crc) :: current_unit.ui_imports_cmx; Hashtbl.add global_infos_table modname infos; @@ -199,7 +228,7 @@ let write_unit_info info filename = close_out oc let save_unit_info filename = - current_unit.ui_imports_cmi <- Env.imported_units(); + current_unit.ui_imports_cmi <- Env.imports(); write_unit_info current_unit filename @@ -214,12 +243,39 @@ let new_const_symbol () = incr const_label; make_symbol (Some (string_of_int !const_label)) -let new_structured_constant cst global = - let lbl = new_const_symbol() in - structured_constants := (lbl, global, cst) :: !structured_constants; - lbl +let snapshot () = !structured_constants +let backtrack s = structured_constants := s -let structured_constants () = !structured_constants +let new_structured_constant cst ~shared = + let {strcst_shared; strcst_all} = !structured_constants in + if shared then + try + CstMap.find cst strcst_shared + with Not_found -> + let lbl = new_const_symbol() in + structured_constants := + { + strcst_shared = CstMap.add cst lbl strcst_shared; + strcst_all = (lbl, cst) :: strcst_all; + }; + lbl + else + let lbl = new_const_symbol() in + structured_constants := + { + strcst_shared; + strcst_all = (lbl, cst) :: strcst_all; + }; + lbl + +let add_exported_constant s = + Hashtbl.replace exported_constants s () + +let structured_constants () = + List.map + (fun (lbl, cst) -> + (lbl, Hashtbl.mem exported_constants lbl, cst) + ) (!structured_constants).strcst_all (* Error report *) @@ -236,3 +292,10 @@ let report_error ppf = function fprintf ppf "%a@ contains the description for unit\ @ %s when %s was expected" Location.print_filename filename name modname + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) diff --git a/asmcomp/compilenv.mli b/asmcomp/compilenv.mli index 51cb8c64..7fae3bad 100644 --- a/asmcomp/compilenv.mli +++ b/asmcomp/compilenv.mli @@ -31,6 +31,10 @@ val make_symbol: ?unitname:string -> string option -> string corresponds to symbol [id] in the compilation unit [u] (or the current unit). *) +val symbol_in_current_unit: string -> bool + (* Return true if the given asm symbol belongs to the + current compilation unit, false otherwise. *) + val symbol_for_global: Ident.t -> string (* Return the asm symbol that refers to the given global identifier *) @@ -50,9 +54,19 @@ val need_send_fun: int -> unit val new_const_symbol : unit -> string val new_const_label : unit -> int -val new_structured_constant : Lambda.structured_constant -> bool -> string -val structured_constants : - unit -> (string * bool * Lambda.structured_constant) list + +val new_structured_constant: + Clambda.ustructured_constant -> + shared:bool -> (* can be shared with another structually equal constant *) + string +val structured_constants: + unit -> (string * bool * Clambda.ustructured_constant) list +val add_exported_constant: string -> unit + +type structured_constants +val snapshot: unit -> structured_constants +val backtrack: structured_constants -> unit + val read_unit_info: string -> unit_infos * Digest.t (* Read infos and MD5 from a [.cmx] file. *) @@ -65,10 +79,6 @@ val cache_unit_info: unit_infos -> unit honored by [symbol_for_global] and [global_approx] without looking at the corresponding .cmx file. *) -val cmx_not_found_crc: Digest.t - (* Special digest used in the [ui_imports_cmx] list to signal - that no [.cmx] file was found and used for the imported unit *) - val read_library_info: string -> library_infos type error = diff --git a/asmcomp/deadcode.ml b/asmcomp/deadcode.ml new file mode 100644 index 00000000..cb93c286 --- /dev/null +++ b/asmcomp/deadcode.ml @@ -0,0 +1,67 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Dead code elimination: remove pure instructions whose results are + not used. *) + +open Mach + +(* [deadcode i] returns a pair of an optimized instruction [i'] + and a set of registers live "before" instruction [i]. *) + +let rec deadcode i = + match i.desc with + | Iend | Ireturn | Iop(Itailcall_ind) | Iop(Itailcall_imm _) | Iraise _ -> + (i, Reg.add_set_array i.live i.arg) + | Iop op -> + let (s, before) = deadcode i.next in + if Proc.op_is_pure op (* no side effects *) + && Reg.disjoint_set_array before i.res (* results are not used after *) + && not (Proc.regs_are_volatile i.arg) (* no stack-like hard reg *) + && not (Proc.regs_are_volatile i.res) (* is involved *) + then begin + assert (Array.length i.res > 0); (* sanity check *) + (s, before) + end else begin + ({i with next = s}, Reg.add_set_array i.live i.arg) + end + | Iifthenelse(test, ifso, ifnot) -> + let (ifso', _) = deadcode ifso in + let (ifnot', _) = deadcode ifnot in + let (s, _) = deadcode i.next in + ({i with desc = Iifthenelse(test, ifso', ifnot'); next = s}, + Reg.add_set_array i.live i.arg) + | Iswitch(index, cases) -> + let cases' = Array.map (fun c -> fst (deadcode c)) cases in + let (s, _) = deadcode i.next in + ({i with desc = Iswitch(index, cases'); next = s}, + Reg.add_set_array i.live i.arg) + | Iloop(body) -> + let (body', _) = deadcode body in + let (s, _) = deadcode i.next in + ({i with desc = Iloop body'; next = s}, i.live) + | Icatch(nfail, body, handler) -> + let (body', _) = deadcode body in + let (handler', _) = deadcode handler in + let (s, _) = deadcode i.next in + ({i with desc = Icatch(nfail, body', handler'); next = s}, i.live) + | Iexit nfail -> + (i, i.live) + | Itrywith(body, handler) -> + let (body', _) = deadcode body in + let (handler', _) = deadcode handler in + let (s, _) = deadcode i.next in + ({i with desc = Itrywith(body', handler'); next = s}, i.live) + +let fundecl f = + let (new_body, _) = deadcode f.fun_body in + {f with fun_body = new_body} diff --git a/asmcomp/deadcode.mli b/asmcomp/deadcode.mli new file mode 100644 index 00000000..6aafae05 --- /dev/null +++ b/asmcomp/deadcode.mli @@ -0,0 +1,16 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Dead code elimination: remove pure instructions whose results are + not used. *) + +val fundecl: Mach.fundecl -> Mach.fundecl diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 3ad467cb..24a621b3 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -88,16 +88,10 @@ let emit_bytes_directive directive s = done; if !pos > 0 then emit_char '\n' -(* PR#4813: assemblers do strange things with float literals indeed, - so we convert to IEEE representation ourselves and emit float - literals as 32- or 64-bit integers. *) - -let emit_float64_directive directive f = - let x = Int64.bits_of_float (float_of_string f) in +let emit_float64_directive directive x = emit_printf "\t%s\t0x%Lx\n" directive x -let emit_float64_split_directive directive f = - let x = Int64.bits_of_float (float_of_string f) in +let emit_float64_split_directive directive x = let lo = Int64.logand x 0xFFFF_FFFFL and hi = Int64.shift_right_logical x 32 in emit_printf "\t%s\t0x%Lx, 0x%Lx\n" @@ -105,8 +99,7 @@ let emit_float64_split_directive directive f = (if Arch.big_endian then hi else lo) (if Arch.big_endian then lo else hi) -let emit_float32_directive directive f = - let x = Int32.bits_of_float (float_of_string f) in +let emit_float32_directive directive x = emit_printf "\t%s\t0x%lx\n" directive x (* Record live pointers at call points *) @@ -221,9 +214,9 @@ let reset_debug_info () = let emit_debug_info dbg = if is_cfi_enabled () && (!Clflags.debug || Config.with_frame_pointers) - && not (Debuginfo.is_none dbg) then begin + && dbg.Debuginfo.dinfo_line > 0 (* PR#6243 *) + then begin let line = dbg.Debuginfo.dinfo_line in - assert (line <> 0); (* clang errors out on zero line numbers *) let file_name = dbg.Debuginfo.dinfo_file in let file_num = try List.assoc file_name !file_pos_nums @@ -239,3 +232,7 @@ let emit_debug_info dbg = emit_int file_num; emit_char '\t'; emit_int line; emit_char '\n' end + +let reset () = + reset_debug_info (); + frame_descriptors := [] diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index cc479d8c..486a5839 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -23,10 +23,11 @@ val emit_char: char -> unit val emit_string_literal: string -> unit val emit_string_directive: string -> string -> unit val emit_bytes_directive: string -> string -> unit -val emit_float64_directive: string -> string -> unit -val emit_float64_split_directive: string -> string -> unit -val emit_float32_directive: string -> string -> unit +val emit_float64_directive: string -> int64 -> unit +val emit_float64_split_directive: string -> int64 -> unit +val emit_float32_directive: string -> int32 -> unit +val reset : unit -> unit val reset_debug_info: unit -> unit val emit_debug_info: Debuginfo.t -> unit diff --git a/asmcomp/i386/CSE.ml b/asmcomp/i386/CSE.ml new file mode 100644 index 00000000..6bea76f1 --- /dev/null +++ b/asmcomp/i386/CSE.ml @@ -0,0 +1,47 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for the i386 *) + +open Cmm +open Arch +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic as super + +method! class_of_operation op = + match op with + (* Operations that affect the floating-point stack cannot be factored *) + | Iconst_float _ | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf + | Iintoffloat | Ifloatofint + | Iload((Single | Double | Double_u), _) -> Op_other + (* Specific ops *) + | Ispecific(Ilea _) -> Op_pure + | Ispecific(Istore_int(_, _, is_asg)) -> Op_store is_asg + | Ispecific(Istore_symbol(_, _, is_asg)) -> Op_store is_asg + | Ispecific(Ioffset_loc(_, _)) -> Op_store true + | Ispecific _ -> Op_other + | _ -> super#class_of_operation op + +method! is_cheap_operation op = + match op with + | Iconst_int _ | Iconst_blockheader _ -> true + | Iconst_symbol _ -> true + | _ -> false + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/i386/arch.ml b/asmcomp/i386/arch.ml index d2f9fd61..1d486db3 100644 --- a/asmcomp/i386/arch.ml +++ b/asmcomp/i386/arch.ml @@ -31,11 +31,12 @@ type addressing_mode = type specific_operation = Ilea of addressing_mode (* Lea gives scaled adds *) - | Istore_int of nativeint * addressing_mode (* Store an integer constant *) - | Istore_symbol of string * addressing_mode (* Store a symbol *) + | Istore_int of nativeint * addressing_mode * bool + (* Store an integer constant *) + | Istore_symbol of string * addressing_mode * bool (* Store a symbol *) | Ioffset_loc of int * addressing_mode (* Add a constant to a location *) | Ipush (* Push regs on stack *) - | Ipush_int of nativeint (* Push an integer constant *) + | Ipush_int of nativeint (* Push an integer constant *) | Ipush_symbol of string (* Push a symbol *) | Ipush_load of addressing_mode (* Load a scalar and push *) | Ipush_load_float of addressing_mode (* Load a float and push *) @@ -105,11 +106,14 @@ let print_addressing printreg addr ppf arg = let print_specific_operation printreg op ppf arg = match op with | Ilea addr -> print_addressing printreg addr ppf arg - | Istore_int(n, addr) -> - fprintf ppf "[%a] := %s" (print_addressing printreg addr) arg - (Nativeint.to_string n) - | Istore_symbol(lbl, addr) -> - fprintf ppf "[%a] := \"%s\"" (print_addressing printreg addr) arg lbl + | Istore_int(n, addr, is_assign) -> + fprintf ppf "[%a] := %nd %s" + (print_addressing printreg addr) arg n + (if is_assign then "(assign)" else "(init)") + | Istore_symbol(lbl, addr, is_assign) -> + fprintf ppf "[%a] := \"%s\" %s" + (print_addressing printreg addr) arg lbl + (if is_assign then "(assign)" else "(init)") | Ioffset_loc(n, addr) -> fprintf ppf "[%a] +:= %i" (print_addressing printreg addr) arg n | Ipush -> @@ -152,5 +156,7 @@ let print_specific_operation printreg op ppf arg = let stack_alignment = match Config.system with - | "macosx" -> 16 - | _ -> 4 + | "win32" -> 4 (* MSVC *) + | _ -> 16 +(* PR#6038: GCC and Clang seem to require 16-byte alignment nowadays, + even if only MacOS X's ABI formally requires it *) diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index ec8ec5d8..98df5f95 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -412,15 +412,16 @@ let emit_floatspecial = function (* Floating-point constants *) -let float_constants = ref ([] : (string * int) list) +let float_constants = ref ([] : (int64 * int) list) let add_float_constant cst = + let repr = Int64.bits_of_float cst in try - List.assoc cst !float_constants + List.assoc repr !float_constants with Not_found -> let lbl = new_label() in - float_constants := (cst, lbl) :: !float_constants; + float_constants := (repr, lbl) :: !float_constants; lbl let emit_float_constant (cst, lbl) = @@ -458,15 +459,15 @@ let emit_instr fallthrough i = else ` movl {emit_reg src}, {emit_reg dst}\n` end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if n = 0n then begin match i.res.(0).loc with Reg n -> ` xorl {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` | _ -> ` movl $0, {emit_reg i.res.(0)}\n` end else ` movl ${emit_nativeint n}, {emit_reg i.res.(0)}\n` - | Lop(Iconst_float s) -> - begin match Int64.bits_of_float (float_of_string s) with + | Lop(Iconst_float f) -> + begin match Int64.bits_of_float f with | 0x0000_0000_0000_0000L -> (* +0.0 *) ` fldz\n` | 0x8000_0000_0000_0000L -> (* -0.0 *) @@ -476,7 +477,7 @@ let emit_instr fallthrough i = | 0xBFF0_0000_0000_0000L -> (* -1.0 *) ` fld1\n fchs\n` | _ -> - let lbl = add_float_constant s in + let lbl = add_float_constant f in ` fldl {emit_label lbl}\n` end | Lop(Iconst_symbol s) -> @@ -543,7 +544,7 @@ let emit_instr fallthrough i = | Double | Double_u -> ` fldl {emit_addressing addr i.arg 0}\n` end - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> begin match chunk with | Word | Thirtytwo_signed | Thirtytwo_unsigned -> ` movl {emit_reg i.arg.(0)}, {emit_addressing addr i.arg 1}\n` @@ -615,6 +616,8 @@ let emit_instr fallthrough i = | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> (* We have i.arg.(0) = i.res.(0) and i.arg.(1) = %ecx *) ` {emit_string(instr_for_intop op)} %cl, {emit_reg i.res.(0)}\n` + | Lop(Iintop Imulh) -> + ` imull {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.arg.(1)}, {emit_reg i.res.(0)}\n` @@ -624,21 +627,6 @@ let emit_instr fallthrough i = ` incl {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Iadd, -1) | Iintop_imm(Isub, 1)) -> ` decl {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Idiv, n)) -> - let l = Misc.log2 n in - let lbl = new_label() in - output_test_zero i.arg.(0); - ` jge {emit_label lbl}\n`; - ` addl ${emit_int(n-1)}, {emit_reg i.arg.(0)}\n`; - `{emit_label lbl}: sarl ${emit_int l}, {emit_reg i.arg.(0)}\n` - | Lop(Iintop_imm(Imod, n)) -> - let lbl = new_label() in - ` movl {emit_reg i.arg.(0)}, %eax\n`; - ` testl %eax, %eax\n`; - ` jge {emit_label lbl}\n`; - ` addl ${emit_int(n-1)}, %eax\n`; - `{emit_label lbl}: andl ${emit_int(-n)}, %eax\n`; - ` subl %eax, {emit_reg i.arg.(0)}\n` | Lop(Iintop_imm(op, n)) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} ${emit_int n}, {emit_reg i.res.(0)}\n` @@ -696,9 +684,9 @@ let emit_instr fallthrough i = stack_offset := !stack_offset + 8 | Lop(Ispecific(Ilea addr)) -> ` lea {emit_addressing addr i.arg 0}, {emit_reg i.res.(0)}\n` - | Lop(Ispecific(Istore_int(n, addr))) -> + | Lop(Ispecific(Istore_int(n, addr, _))) -> ` movl ${emit_nativeint n}, {emit_addressing addr i.arg 0}\n` - | Lop(Ispecific(Istore_symbol(s, addr))) -> + | Lop(Ispecific(Istore_symbol(s, addr, _))) -> ` movl ${emit_symbol s}, {emit_addressing addr i.arg 0}\n` | Lop(Ispecific(Ioffset_loc(n, addr))) -> ` addl ${emit_int n}, {emit_addressing addr i.arg 0}\n` @@ -830,11 +818,16 @@ let emit_instr fallthrough i = ` addl ${emit_int (trap_frame_size - 4)}, %esp\n`; cfi_adjust_cfa_offset (-trap_frame_size); stack_offset := !stack_offset - trap_frame_size - | Lraise -> - if !Clflags.debug then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, Lambda.Raise_regular -> ` call {emit_symbol "caml_raise_exn"}\n`; record_frame Reg.Set.empty i.dbg - end else begin + | true, Lambda.Raise_reraise -> + ` call {emit_symbol "caml_reraise_exn"}\n`; + record_frame Reg.Set.empty i.dbg + | false, _ + | true, Lambda.Raise_notrace -> ` movl {emit_symbol "caml_exception_pointer"}, %esp\n`; ` popl {emit_symbol "caml_exception_pointer"}\n`; if trap_frame_size > 8 then @@ -968,9 +961,9 @@ let emit_item = function | Cint n -> ` .long {emit_nativeint n}\n` | Csingle f -> - emit_float32_directive ".long" f + emit_float32_directive ".long" (Int32.bits_of_float f) | Cdouble f -> - emit_float64_split_directive ".long" f + emit_float64_split_directive ".long" (Int64.bits_of_float f) | Csymbol_address s -> ` .long {emit_symbol s}\n` | Clabel_address lbl -> diff --git a/asmcomp/i386/emit_nt.mlp b/asmcomp/i386/emit_nt.mlp index b233f818..ef5205ef 100644 --- a/asmcomp/i386/emit_nt.mlp +++ b/asmcomp/i386/emit_nt.mlp @@ -62,7 +62,10 @@ let add_used_symbol s = let emit_symbol s = emit_string "_"; Emitaux.emit_symbol '$' s +(* Output a 32 or 64 bit integer in hex *) + let emit_int32 n = emit_printf "0%lxh" n +let emit_int64 n = emit_printf "0%Lxh" n (* Output a label *) @@ -361,36 +364,20 @@ let emit_floatspecial = function (* Floating-point constants *) -let float_constants = ref ([] : (string * int) list) +let float_constants = ref ([] : (int64 * int) list) let add_float_constant cst = + let repr = Int64.bits_of_float cst in try - List.assoc cst !float_constants + List.assoc repr !float_constants with Not_found -> let lbl = new_label() in - float_constants := (cst, lbl) :: !float_constants; + float_constants := (repr, lbl) :: !float_constants; lbl -let emit_float s = - (* MASM doesn't like floating-point constants such as 2e9. - Turn them into 2.0e9. *) - let pos_e = ref (-1) and pos_dot = ref (-1) in - for i = 0 to String.length s - 1 do - match s.[i] with - 'e'|'E' -> pos_e := i - | '.' -> pos_dot := i - | _ -> () - done; - if !pos_dot < 0 && !pos_e >= 0 then begin - emit_string (String.sub s 0 !pos_e); - emit_string ".0"; - emit_string (String.sub s !pos_e (String.length s - !pos_e)) - end else - emit_string s - let emit_float_constant (cst, lbl) = - `{emit_label lbl} REAL8 {emit_float cst}\n` + `{emit_label lbl} QWORD {emit_int64 cst}\n` (* Output the assembly code for an instruction *) @@ -419,15 +406,15 @@ let emit_instr i = else ` mov {emit_reg dst}, {emit_reg src}\n` end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if n = 0n then begin match i.res.(0).loc with Reg n -> ` xor {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` | _ -> ` mov {emit_reg i.res.(0)}, 0\n` end else ` mov {emit_reg i.res.(0)}, {emit_nativeint n}\n` - | Lop(Iconst_float s) -> - begin match Int64.bits_of_float (float_of_string s) with + | Lop(Iconst_float f) -> + begin match Int64.bits_of_float f with | 0x0000_0000_0000_0000L -> (* +0.0 *) ` fldz\n` | 0x8000_0000_0000_0000L -> (* -0.0 *) @@ -437,7 +424,7 @@ let emit_instr i = | 0xBFF0_0000_0000_0000L -> (* -1.0 *) ` fld1\n fchs\n` | _ -> - let lbl = add_float_constant s in + let lbl = add_float_constant f in ` fld {emit_label lbl}\n` end | Lop(Iconst_symbol s) -> @@ -493,7 +480,7 @@ let emit_instr i = | Double | Double_u -> ` fld REAL8 PTR {emit_addressing addr i.arg 0}\n` end - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> begin match chunk with | Word | Thirtytwo_signed | Thirtytwo_unsigned -> ` mov DWORD PTR {emit_addressing addr i.arg 1}, {emit_reg i.arg.(0)}\n` @@ -565,6 +552,8 @@ let emit_instr i = | Lop(Iintop(Ilsl | Ilsr | Iasr as op)) -> (* We have i.arg.(0) = i.res.(0) and i.arg.(1) = %ecx *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, cl\n` + | Lop(Iintop Imulh) -> + ` imul {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}\n` @@ -574,21 +563,6 @@ let emit_instr i = ` inc {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Iadd, -1) | Iintop_imm(Isub, 1)) -> ` dec {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Idiv, n)) -> - let l = Misc.log2 n in - let lbl = new_label() in - output_test_zero i.arg.(0); - ` jge {emit_label lbl}\n`; - ` add {emit_reg i.arg.(0)}, {emit_int(n-1)}\n`; - `{emit_label lbl}: sar {emit_reg i.arg.(0)}, {emit_int l}\n` - | Lop(Iintop_imm(Imod, n)) -> - let lbl = new_label() in - ` mov eax, {emit_reg i.arg.(0)}\n`; - ` test eax, eax\n`; - ` jge {emit_label lbl}\n`; - ` add eax, {emit_int(n-1)}\n`; - `{emit_label lbl}: and eax, {emit_int(-n)}\n`; - ` sub {emit_reg i.arg.(0)}, eax\n` | Lop(Iintop_imm(op, n)) -> (* We have i.arg.(0) = i.res.(0) *) ` {emit_string(instr_for_intop op)} {emit_reg i.res.(0)}, {emit_int n}\n` @@ -644,9 +618,9 @@ let emit_instr i = stack_offset := !stack_offset + 8 | Lop(Ispecific(Ilea addr)) -> ` lea {emit_reg i.res.(0)}, DWORD PTR {emit_addressing addr i.arg 0}\n` - | Lop(Ispecific(Istore_int(n, addr))) -> + | Lop(Ispecific(Istore_int(n, addr, _))) -> ` mov DWORD PTR {emit_addressing addr i.arg 0},{emit_nativeint n}\n` - | Lop(Ispecific(Istore_symbol(s, addr))) -> + | Lop(Ispecific(Istore_symbol(s, addr, _))) -> add_used_symbol s ; ` mov DWORD PTR {emit_addressing addr i.arg 0},OFFSET {emit_symbol s}\n` | Lop(Ispecific(Ioffset_loc(n, addr))) -> @@ -769,11 +743,16 @@ let emit_instr i = ` pop _caml_exception_pointer\n`; ` add esp, 4\n`; stack_offset := !stack_offset - 8 - | Lraise -> - if !Clflags.debug then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, Lambda.Raise_regular -> ` call _caml_raise_exn\n`; record_frame Reg.Set.empty i.dbg - end else begin + | true, Lambda.Raise_reraise -> + ` call _caml_reraise_exn\n`; + record_frame Reg.Set.empty i.dbg + | false, _ + | true, Lambda.Raise_notrace -> ` mov esp, _caml_exception_pointer\n`; ` pop _caml_exception_pointer\n`; ` ret\n` @@ -824,9 +803,9 @@ let emit_item = function | Cint32 n -> ` DWORD {emit_nativeint n}\n` | Csingle f -> - ` REAL4 {emit_float f}\n` + ` DWORD {emit_int32 (Int32.bits_of_float f)}\n` | Cdouble f -> - ` REAL8 {emit_float f}\n` + ` QWORD {emit_int64 (Int64.bits_of_float f)}\n` | Csymbol_address s -> add_used_symbol s ; ` DWORD {emit_symbol s}\n` @@ -861,6 +840,7 @@ let begin_assembly() = ` EXTERN _caml_alloc3: PROC\n`; ` EXTERN _caml_ml_array_bound_error: PROC\n`; ` EXTERN _caml_raise_exn: PROC\n`; + ` EXTERN _caml_reraise_exn: PROC\n`; ` .DATA\n`; let lbl_begin = Compilenv.make_symbol (Some "data_begin") in add_def_symbol lbl_begin; diff --git a/asmcomp/i386/proc.ml b/asmcomp/i386/proc.ml index e946f699..0b010d24 100644 --- a/asmcomp/i386/proc.ml +++ b/asmcomp/i386/proc.ml @@ -72,7 +72,7 @@ let rotate_registers = false (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 7 Reg.dummy in + let v = Array.make 7 Reg.dummy in for i = 0 to 6 do v.(i) <- Reg.at_location Int (Reg i) done; v @@ -111,7 +111,7 @@ let word_addressed = false let calling_conventions first_int last_int first_float last_float make_stack arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref (-64) in @@ -154,6 +154,21 @@ let loc_external_results res = let loc_exn_bucket = eax +(* Volatile registers: the x87 top of FP stack is *) + +let reg_is_volatile = function + | { typ = Float; loc = Reg _ } -> true + | _ -> false + +let regs_are_volatile rs = + try + for i = 0 to Array.length rs - 1 do + if reg_is_volatile rs.(i) then raise Exit + done; + false + with Exit -> + true + (* Registers destroyed by operations *) let destroyed_at_c_call = (* ebx, esi, edi, ebp preserved *) @@ -163,8 +178,7 @@ let destroyed_at_oper = function Iop(Icall_ind | Icall_imm _ | Iextcall(_, true)) -> all_phys_regs | Iop(Iextcall(_, false)) -> destroyed_at_c_call | Iop(Iintop(Idiv | Imod)) -> [| eax; edx |] - | Iop(Iintop_imm(Imod, _)) -> [| eax |] - | Iop(Ialloc _) -> [| eax |] + | Iop(Ialloc _ | Iintop Imulh) -> [| eax |] | Iop(Iintop(Icomp _) | Iintop_imm(Icomp _, _)) -> [| eax |] | Iop(Iintoffloat) -> [| eax |] | Iifthenelse(Ifloattest(_, _), _, _) -> [| eax |] @@ -183,6 +197,17 @@ let max_register_pressure = function Iintoffloat -> [| 6; max_int |] | _ -> [|7; max_int |] +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Ispecific(Ilea _) -> true + | Ispecific _ -> false + | _ -> true + (* Layout of the stack frame *) let num_stack_slots = [| 0; 0 |] diff --git a/asmcomp/i386/reload.ml b/asmcomp/i386/reload.ml index 623d12a8..bc1b08f5 100644 --- a/asmcomp/i386/reload.ml +++ b/asmcomp/i386/reload.ml @@ -57,9 +57,11 @@ method! reload_operation op arg res = if stackp arg.(0) then let r = self#makereg arg.(0) in ([|r|], [|r|]) else (arg, res) - | Iintop(Ilsl|Ilsr|Iasr) | Iintop_imm(_, _) | Ifloatofint | Iintoffloat | - Ispecific(Ipush) -> + | Iintop(Imulh | Ilsl | Ilsr | Iasr) | Iintop_imm(_, _) + | Ifloatofint | Iintoffloat | Ispecific(Ipush) -> (* The argument(s) can be either in register or on stack *) + (* Note: Imulh: arg(0 and res(0) already forced in regs + Ilsl, Ilsr, Iasr: arg(1) already forced in regs *) (arg, res) | _ -> (* Other operations: all args and results in registers *) super#reload_operation op arg res diff --git a/asmcomp/i386/selection.ml b/asmcomp/i386/selection.ml index cdf7fdfc..10d2d40e 100644 --- a/asmcomp/i386/selection.ml +++ b/asmcomp/i386/selection.ml @@ -110,8 +110,12 @@ let pseudoregs_for_operation op arg res = Iintop(Iadd|Isub|Imul|Iand|Ior|Ixor) -> ([|res.(0); arg.(1)|], res, false) (* Two-address unary operations *) - | Iintop_imm((Iadd|Isub|Imul|Idiv|Iand|Ior|Ixor|Ilsl|Ilsr|Iasr), _) -> + | Iintop_imm((Iadd|Isub|Imul|Iand|Ior|Ixor|Ilsl|Ilsr|Iasr), _) -> (res, res, false) + (* For imull, first arg must be in eax, eax is clobbered, and result is in + edx. *) + | Iintop(Imulh) -> + ([| eax; arg.(1) |], [| edx |], true) (* For shifts with variable shift count, second arg must be in ecx *) | Iintop(Ilsl|Ilsr|Iasr) -> ([|res.(0); ecx|], res, false) @@ -122,10 +126,6 @@ let pseudoregs_for_operation op arg res = ([| eax; ecx |], [| eax |], true) | Iintop(Imod) -> ([| eax; ecx |], [| edx |], true) - (* For mod with immediate operand, arg must not be in eax. - Keep it simple, force it in edx. *) - | Iintop_imm(Imod, _) -> - ([| edx |], [| edx |], true) (* For floating-point operations and floating-point loads, the result is always left at the top of the floating-point stack *) | Iconst_float _ | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf @@ -135,7 +135,7 @@ let pseudoregs_for_operation op arg res = (* For storing a byte, the argument must be in eax...edx. (But for a short, any reg will do!) Keep it simple, just force the argument to be in edx. *) - | Istore((Byte_unsigned | Byte_signed), addr) -> + | Istore((Byte_unsigned | Byte_signed), addr, _) -> let newarg = Array.copy arg in newarg.(0) <- edx; (newarg, res, false) @@ -178,20 +178,20 @@ method select_addressing chunk exp = | (Ascaledadd(e1, e2, scale), d) -> (Iindexed2scaled(scale, d), Ctuple[e1; e2]) -method! select_store addr exp = +method! select_store is_assign addr exp = match exp with Cconst_int n -> - (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) - | Cconst_natint n -> - (Ispecific(Istore_int(n, addr)), Ctuple []) + (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) + | (Cconst_natint n | Cconst_blockheader n) -> + (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | Cconst_pointer n -> - (Ispecific(Istore_int(Nativeint.of_int n, addr)), Ctuple []) + (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) | Cconst_natpointer n -> - (Ispecific(Istore_int(n, addr)), Ctuple []) + (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | Cconst_symbol s -> - (Ispecific(Istore_symbol(s, addr)), Ctuple []) + (Ispecific(Istore_symbol(s, addr, is_assign)), Ctuple []) | _ -> - super#select_store addr exp + super#select_store is_assign addr exp method! select_operation op args = match op with @@ -202,19 +202,6 @@ method! select_operation op args = | (Iindexed2 0, _) -> super#select_operation op args | (addr, arg) -> (Ispecific(Ilea addr), [arg]) end - (* Recognize (x / cst) and (x % cst) only if cst is a power of 2. *) - | Cdivi -> - begin match args with - [arg1; Cconst_int n] when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Idiv, n), [arg1]) - | _ -> (Iintop Idiv, args) - end - | Cmodi -> - begin match args with - [arg1; Cconst_int n] when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Imod, n), [arg1]) - | _ -> (Iintop Imod, args) - end (* Recognize float arithmetic with memory. In passing, apply Ershov's algorithm to reduce stack usage *) | Caddf -> @@ -241,6 +228,9 @@ method! select_operation op args = | Cextcall(fn, ty_res, false, dbg) when !fast_math && List.mem fn inline_float_ops -> (Ispecific(Ifloatspecial fn), args) + (* i386 does not support immediate operands for multiply high signed *) + | Cmulhi -> + (Iintop Imulh, args) (* Default *) | _ -> super#select_operation op args @@ -298,6 +288,9 @@ method select_push exp = (Ispecific(Ipush_load_float addr), arg) | _ -> (Ispecific(Ipush), exp) +method! mark_c_tailcall = + Proc.contains_calls := true + method! emit_extcall_args env args = let rec size_pushes = function | [] -> 0 diff --git a/asmcomp/interf.ml b/asmcomp/interf.ml index 77acb78a..2d541eee 100644 --- a/asmcomp/interf.ml +++ b/asmcomp/interf.ml @@ -111,17 +111,21 @@ let build_graph fundecl = | Itrywith(body, handler) -> add_interf_set Proc.destroyed_at_raise handler.live; interf body; interf handler; interf i.next - | Iraise -> () in + | Iraise _ -> () in (* Add a preference from one reg to another. Do not add anything if the two registers conflict, - or if the source register already has a location. *) + or if the source register already has a location, + or if the two registers belong to different classes. + (The last case can occur e.g. on Sparc when passing + float arguments in integer registers, PR#6227.) *) let add_pref weight r1 r2 = if weight > 0 then begin let i = r1.stamp and j = r2.stamp in if i <> j && r1.loc = Unknown + && Proc.register_class r1 = Proc.register_class r2 && (let p = if i < j then (i, j) else (j, i) in not (IntPairSet.mem p !mat)) then r1.prefer <- (r2, weight) :: r1.prefer @@ -178,7 +182,7 @@ let build_graph fundecl = () | Itrywith(body, handler) -> prefer weight body; prefer weight handler; prefer weight i.next - | Iraise -> () + | Iraise _ -> () in interf fundecl.fun_body; prefer 8 fundecl.fun_body diff --git a/asmcomp/linearize.ml b/asmcomp/linearize.ml index 963ffe9a..64678c1d 100644 --- a/asmcomp/linearize.ml +++ b/asmcomp/linearize.ml @@ -42,10 +42,10 @@ and instruction_desc = | Lsetuptrap of label | Lpushtrap | Lpoptrap - | Lraise + | Lraise of Lambda.raise_kind let has_fallthrough = function - | Lreturn | Lbranch _ | Lswitch _ | Lraise + | Lreturn | Lbranch _ | Lswitch _ | Lraise _ | Lop Itailcall_ind | Lop (Itailcall_imm _) -> false | _ -> true @@ -126,9 +126,9 @@ let rec discard_dead_code n = match n.desc with Lend -> n | Llabel _ -> n -(* Do not discard Lpoptrap or Istackoffset instructions, +(* Do not discard Lpoptrap/Lpushtrap or Istackoffset instructions, as this may cause a stack imbalance later during assembler generation. *) - | Lpoptrap -> n + | Lpoptrap | Lpushtrap -> n | Lop(Istackoffset _) -> n | _ -> discard_dead_code n.next @@ -148,20 +148,30 @@ let add_branch lbl n = else discard_dead_code n -(* Current labels for exit handler *) +let try_depth = ref 0 + +(* Association list: exit handler -> (handler label, try-nesting factor) *) let exit_label = ref [] -let find_exit_label k = +let find_exit_label_try_depth k = try List.assoc k !exit_label with | Not_found -> Misc.fatal_error "Linearize.find_exit_label" +let find_exit_label k = + let (label, t) = find_exit_label_try_depth k in + assert(t = !try_depth); + label + let is_next_catch n = match !exit_label with -| (n0,_)::_ when n0=n -> true +| (n0,(_,t))::_ when n0=n && t = !try_depth -> true | _ -> false +let local_exit k = + snd (find_exit_label_try_depth k) = !try_depth + (* Linearize an instruction [i]: add it in front of the continuation [n] *) let rec linear i n = @@ -187,15 +197,15 @@ let rec linear i n = | _, Iend, Lbranch lbl -> copy_instr (Lcondbranch(invert_test test, lbl)) i (linear ifso n1) | Iexit nfail1, Iexit nfail2, _ - when is_next_catch nfail1 -> + when is_next_catch nfail1 && local_exit nfail2 -> let lbl2 = find_exit_label nfail2 in copy_instr (Lcondbranch (invert_test test, lbl2)) i (linear ifso n1) - | Iexit nfail, _, _ -> + | Iexit nfail, _, _ when local_exit nfail -> let n2 = linear ifnot n1 and lbl = find_exit_label nfail in copy_instr (Lcondbranch(test, lbl)) i n2 - | _, Iexit nfail, _ -> + | _, Iexit nfail, _ when local_exit nfail -> let n2 = linear ifso n1 in let lbl = find_exit_label nfail in copy_instr (Lcondbranch(invert_test test, lbl)) i n2 @@ -214,7 +224,7 @@ let rec linear i n = (linear ifso (add_branch lbl_end nelse)) end | Iswitch(index, cases) -> - let lbl_cases = Array.create (Array.length cases) 0 in + let lbl_cases = Array.make (Array.length cases) 0 in let (lbl_end, n1) = get_label(linear i.Mach.next n) in let n2 = ref (discard_dead_code n1) in for i = Array.length cases - 1 downto 0 do @@ -242,23 +252,43 @@ let rec linear i n = | Icatch(io, body, handler) -> let (lbl_end, n1) = get_label(linear i.Mach.next n) in let (lbl_handler, n2) = get_label(linear handler n1) in - exit_label := (io, lbl_handler) :: !exit_label ; + exit_label := (io, (lbl_handler, !try_depth)) :: !exit_label ; let n3 = linear body (add_branch lbl_end n2) in exit_label := List.tl !exit_label; n3 | Iexit nfail -> - let n1 = linear i.Mach.next n in - let lbl = find_exit_label nfail in - add_branch lbl n1 + let lbl, t = find_exit_label_try_depth nfail in + (* We need to re-insert dummy pushtrap (which won't be executed), + so as to preserve stack offset during assembler generation. + It would make sense to have a special pseudo-instruction + only to inform the later pass about this stack offset + (corresponding to N traps). + *) + let rec loop i tt = + if t = tt then i + else loop (cons_instr Lpushtrap i) (tt - 1) + in + let n1 = loop (linear i.Mach.next n) !try_depth in + let rec loop i tt = + if t = tt then i + else loop (cons_instr Lpoptrap i) (tt - 1) + in + loop (add_branch lbl n1) !try_depth | Itrywith(body, handler) -> let (lbl_join, n1) = get_label (linear i.Mach.next n) in + incr try_depth; let (lbl_body, n2) = get_label (cons_instr Lpushtrap (linear body (cons_instr Lpoptrap n1))) in + decr try_depth; cons_instr (Lsetuptrap lbl_body) (linear handler (add_branch lbl_join n2)) - | Iraise -> - copy_instr Lraise i (discard_dead_code n) + | Iraise k -> + copy_instr (Lraise k) i (discard_dead_code n) + +let reset () = + label_counter := 99; + exit_label := [] let fundecl f = { fun_name = f.Mach.fun_name; diff --git a/asmcomp/linearize.mli b/asmcomp/linearize.mli index ad5dc3a9..2996a29b 100644 --- a/asmcomp/linearize.mli +++ b/asmcomp/linearize.mli @@ -36,7 +36,7 @@ and instruction_desc = | Lsetuptrap of label | Lpushtrap | Lpoptrap - | Lraise + | Lraise of Lambda.raise_kind val has_fallthrough : instruction_desc -> bool val end_instr: instruction @@ -50,4 +50,5 @@ type fundecl = fun_fast: bool; fun_dbg : Debuginfo.t } +val reset : unit -> unit val fundecl: Mach.fundecl -> fundecl diff --git a/asmcomp/liveness.ml b/asmcomp/liveness.ml index b3085b6c..2ef322ef 100644 --- a/asmcomp/liveness.ml +++ b/asmcomp/liveness.ml @@ -16,13 +16,13 @@ open Mach let live_at_exit = ref [] + let find_live_at_exit k = try List.assoc k !live_at_exit with - | Not_found -> Misc.fatal_error "Spill.find_live_at_exit" + | Not_found -> Misc.fatal_error "Liveness.find_live_at_exit" -let live_at_break = ref Reg.Set.empty let live_at_raise = ref Reg.Set.empty let rec live i finally = @@ -37,8 +37,34 @@ let rec live i finally = i.live <- finally; finally | Ireturn | Iop(Itailcall_ind) | Iop(Itailcall_imm _) -> - (* i.live remains empty since no regs are live across *) + i.live <- Reg.Set.empty; (* no regs are live across *) Reg.set_of_array i.arg + | Iop op -> + let after = live i.next finally in + if Proc.op_is_pure op (* no side effects *) + && Reg.disjoint_set_array after i.res (* results are not used after *) + && not (Proc.regs_are_volatile i.arg) (* no stack-like hard reg *) + && not (Proc.regs_are_volatile i.res) (* is involved *) + then begin + (* This operation is dead code. Ignore its arguments. *) + i.live <- after; + after + end else begin + let across_after = Reg.diff_set_array after i.res in + let across = + match op with + | Icall_ind | Icall_imm _ | Iextcall _ + | Iintop Icheckbound | Iintop_imm(Icheckbound, _) -> + (* The function call may raise an exception, branching to the + nearest enclosing try ... with. Similarly for bounds checks. + Hence, everything that must be live at the beginning of + the exception handler must also be live across this instr. *) + Reg.Set.union across_after !live_at_raise + | _ -> + across_after in + i.live <- across; + Reg.add_set_array across i.arg + end | Iifthenelse(test, ifso, ifnot) -> let at_join = live i.next finally in let at_fork = Reg.Set.union (live ifso at_join) (live ifnot at_join) in @@ -89,24 +115,13 @@ let rec live i finally = live_at_raise := saved_live_at_raise; i.live <- before_body; before_body - | Iraise -> - (* i.live remains empty since no regs are live across *) + | Iraise _ -> + i.live <- !live_at_raise; Reg.add_set_array !live_at_raise i.arg - | _ -> - let across_after = Reg.diff_set_array (live i.next finally) i.res in - let across = - match i.desc with - Iop Icall_ind | Iop(Icall_imm _) | Iop(Iextcall _) - | Iop(Iintop Icheckbound) | Iop(Iintop_imm(Icheckbound, _)) -> - (* The function call may raise an exception, branching to the - nearest enclosing try ... with. Similarly for bounds checks. - Hence, everything that must be live at the beginning of - the exception handler must also be live across this instr. *) - Reg.Set.union across_after !live_at_raise - | _ -> - across_after in - i.live <- across; - Reg.add_set_array across i.arg + +let reset () = + live_at_raise := Reg.Set.empty; + live_at_exit := [] let fundecl ppf f = let initially_live = live f.fun_body Reg.Set.empty in diff --git a/asmcomp/liveness.mli b/asmcomp/liveness.mli index b52ec5a2..ed2f1a8a 100644 --- a/asmcomp/liveness.mli +++ b/asmcomp/liveness.mli @@ -15,4 +15,5 @@ open Format +val reset : unit -> unit val fundecl: formatter -> Mach.fundecl -> unit diff --git a/asmcomp/mach.ml b/asmcomp/mach.ml index 3e7160b5..3a717476 100644 --- a/asmcomp/mach.ml +++ b/asmcomp/mach.ml @@ -17,7 +17,7 @@ type integer_comparison = | Iunsigned of Cmm.comparison type integer_operation = - Iadd | Isub | Imul | Idiv | Imod + Iadd | Isub | Imul | Imulh | Idiv | Imod | Iand | Ior | Ixor | Ilsl | Ilsr | Iasr | Icomp of integer_comparison | Icheckbound @@ -36,8 +36,9 @@ type operation = | Ispill | Ireload | Iconst_int of nativeint - | Iconst_float of string + | Iconst_float of float | Iconst_symbol of string + | Iconst_blockheader of nativeint | Icall_ind | Icall_imm of string | Itailcall_ind @@ -45,7 +46,7 @@ type operation = | Iextcall of string * bool | Istackoffset of int | Iload of Cmm.memory_chunk * Arch.addressing_mode - | Istore of Cmm.memory_chunk * Arch.addressing_mode + | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool | Ialloc of int | Iintop of integer_operation | Iintop_imm of integer_operation * int @@ -71,7 +72,7 @@ and instruction_desc = | Icatch of int * instruction * instruction | Iexit of int | Itrywith of instruction * instruction - | Iraise + | Iraise of Lambda.raise_kind type fundecl = { fun_name: string; @@ -125,6 +126,6 @@ let rec instr_iter f i = | Iexit _ -> () | Itrywith(body, handler) -> instr_iter f body; instr_iter f handler; instr_iter f i.next - | Iraise -> () + | Iraise _ -> () | _ -> instr_iter f i.next diff --git a/asmcomp/mach.mli b/asmcomp/mach.mli index 06fe1c33..618e5e4c 100644 --- a/asmcomp/mach.mli +++ b/asmcomp/mach.mli @@ -17,7 +17,7 @@ type integer_comparison = | Iunsigned of Cmm.comparison type integer_operation = - Iadd | Isub | Imul | Idiv | Imod + Iadd | Isub | Imul | Imulh | Idiv | Imod | Iand | Ior | Ixor | Ilsl | Ilsr | Iasr | Icomp of integer_comparison | Icheckbound @@ -36,16 +36,18 @@ type operation = | Ispill | Ireload | Iconst_int of nativeint - | Iconst_float of string + | Iconst_float of float | Iconst_symbol of string + | Iconst_blockheader of nativeint | Icall_ind | Icall_imm of string | Itailcall_ind | Itailcall_imm of string - | Iextcall of string * bool + | Iextcall of string * bool (* false = noalloc, true = alloc *) | Istackoffset of int | Iload of Cmm.memory_chunk * Arch.addressing_mode - | Istore of Cmm.memory_chunk * Arch.addressing_mode + | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool + (* false = initialization, true = assignment *) | Ialloc of int | Iintop of integer_operation | Iintop_imm of integer_operation * int @@ -71,7 +73,7 @@ and instruction_desc = | Icatch of int * instruction * instruction | Iexit of int | Itrywith of instruction * instruction - | Iraise + | Iraise of Lambda.raise_kind type fundecl = { fun_name: string; diff --git a/asmcomp/power/CSE.ml b/asmcomp/power/CSE.ml new file mode 100644 index 00000000..ec10d2df --- /dev/null +++ b/asmcomp/power/CSE.ml @@ -0,0 +1,37 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for the PowerPC *) + +open Arch +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic as super + +method! class_of_operation op = + match op with + | Ispecific(Imultaddf | Imultsubf) -> Op_pure + | Ispecific(Ialloc_far _) -> Op_other + | _ -> super#class_of_operation op + +method! is_cheap_operation op = + match op with + | Iconst_int n | Iconst_blockheader n -> n <= 32767n && n >= -32768n + | _ -> false + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 283312e7..0a26ed14 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -45,13 +45,6 @@ let slot_offset loc cls = | Incoming n -> frame_size() + n | Outgoing n -> n -(* Whether stack backtraces are supported *) - -let supports_backtraces = - match Config.system with - | "rhapsody" -> true - | _ -> false - (* Output a symbol *) let emit_symbol = @@ -236,7 +229,7 @@ let record_frame live dbg = (* Record floating-point and large integer literals *) -let float_literals = ref ([] : (string * int) list) +let float_literals = ref ([] : (int64 * int) list) let int_literals = ref ([] : (nativeint * int) list) (* Record external C functions to be called in a position-independent way @@ -266,15 +259,16 @@ let name_for_int_comparison = function (* Names for various instructions *) let name_for_intop = function - Iadd -> "add" - | Imul -> if ppc64 then "mulld" else "mullw" - | Idiv -> if ppc64 then "divd" else "divw" - | Iand -> "and" - | Ior -> "or" - | Ixor -> "xor" - | Ilsl -> if ppc64 then "sld" else "slw" - | Ilsr -> if ppc64 then "srd" else "srw" - | Iasr -> if ppc64 then "srad" else "sraw" + Iadd -> "add" + | Imul -> if ppc64 then "mulld" else "mullw" + | Imulh -> if ppc64 then "mulhd" else "mulhw" + | Idiv -> if ppc64 then "divd" else "divw" + | Iand -> "and" + | Ior -> "or" + | Ixor -> "xor" + | Ilsl -> if ppc64 then "sld" else "slw" + | Ilsr -> if ppc64 then "srd" else "srw" + | Iasr -> if ppc64 then "srad" else "sraw" | _ -> Misc.fatal_error "Emit.Intop" let name_for_intop_imm = function @@ -324,7 +318,8 @@ let load_store_size = function let instr_size = function Lend -> 0 | Lop(Imove | Ispill | Ireload) -> 1 - | Lop(Iconst_int n) -> if is_native_immediate n then 1 else 2 + | Lop(Iconst_int n | Iconst_blockheader n) -> + if is_native_immediate n then 1 else 2 | Lop(Iconst_float s) -> 2 | Lop(Iconst_symbol s) -> 2 | Lop(Icall_ind) -> 2 @@ -338,14 +333,12 @@ let instr_size = function if chunk = Byte_signed then load_store_size addr + 1 else load_store_size addr - | Lop(Istore(chunk, addr)) -> load_store_size addr + | Lop(Istore(chunk, addr, _)) -> load_store_size addr | Lop(Ialloc n) -> 4 | Lop(Ispecific(Ialloc_far n)) -> 5 | Lop(Iintop Imod) -> 3 | Lop(Iintop(Icomp cmp)) -> 4 | Lop(Iintop op) -> 1 - | Lop(Iintop_imm(Idiv, n)) -> 2 - | Lop(Iintop_imm(Imod, n)) -> 4 | Lop(Iintop_imm(Icomp cmp, n)) -> 4 | Lop(Iintop_imm(op, n)) -> 1 | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 @@ -365,7 +358,7 @@ let instr_size = function | Lsetuptrap lbl -> 1 | Lpushtrap -> 4 | Lpoptrap -> 2 - | Lraise -> 6 + | Lraise _ -> 6 let label_map code = let map = Hashtbl.create 37 in @@ -460,7 +453,7 @@ let rec emit_instr i dslot = | (_, _) -> fatal_error "Emit: Imove" end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if is_native_immediate n then ` li {emit_reg i.res.(0)}, {emit_nativeint n}\n` else if n >= -0x8000_0000n && n <= 0x7FFF_FFFFn then begin @@ -473,9 +466,9 @@ let rec emit_instr i dslot = ` addis {emit_gpr 11}, 0, {emit_upper emit_label lbl}\n`; ` {emit_string lg} {emit_reg i.res.(0)}, {emit_lower emit_label lbl}({emit_gpr 11})\n` end - | Lop(Iconst_float s) -> + | Lop(Iconst_float f) -> let lbl = new_label() in - float_literals := (s, lbl) :: !float_literals; + float_literals := (Int64.bits_of_float f, lbl) :: !float_literals; ` addis {emit_gpr 11}, 0, {emit_upper emit_label lbl}\n`; ` lfd {emit_reg i.res.(0)}, {emit_lower emit_label lbl}({emit_gpr 11})\n` | Lop(Iconst_symbol s) -> @@ -555,7 +548,7 @@ let rec emit_instr i dslot = emit_load_store loadinstr addr i.arg 0 i.res.(0); if chunk = Byte_signed then ` extsb {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> let storeinstr = match chunk with Byte_unsigned | Byte_signed -> "stb" @@ -597,7 +590,7 @@ let rec emit_instr i dslot = emit_set_comp c i.res.(0) end | Lop(Iintop Icheckbound) -> - if !Clflags.debug && supports_backtraces then + if !Clflags.debug then record_frame Reg.Set.empty i.dbg; ` {emit_string tglle} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> @@ -605,16 +598,6 @@ let rec emit_instr i dslot = ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` | Lop(Iintop_imm(Isub, n)) -> ` addi {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int(-n)}\n` - | Lop(Iintop_imm(Idiv, n)) -> (* n is guaranteed to be a power of 2 *) - let l = Misc.log2 n in - ` {emit_string sragi} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int l}\n`; - ` addze {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Imod, n)) -> (* n is guaranteed to be a power of 2 *) - let l = Misc.log2 n in - ` {emit_string sragi} {emit_gpr 0}, {emit_reg i.arg.(0)}, {emit_int l}\n`; - ` addze {emit_gpr 0}, {emit_gpr 0}\n`; - ` {emit_string slgi} {emit_gpr 0}, {emit_gpr 0}, {emit_int l}\n`; - ` subfc {emit_reg i.res.(0)}, {emit_gpr 0}, {emit_reg i.arg.(0)}\n` | Lop(Iintop_imm(Icomp cmp, n)) -> begin match cmp with Isigned c -> @@ -625,7 +608,7 @@ let rec emit_instr i dslot = emit_set_comp c i.res.(0) end | Lop(Iintop_imm(Icheckbound, n)) -> - if !Clflags.debug && supports_backtraces then + if !Clflags.debug then record_frame Reg.Set.empty i.dbg; ` {emit_string tglle}i {emit_reg i.arg.(0)}, {emit_int n}\n` | Lop(Iintop_imm(op, n)) -> @@ -645,8 +628,7 @@ let rec emit_instr i dslot = ` fcfid {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` end else begin let lbl = new_label() in - float_literals := ("4.503601774854144e15", lbl) :: !float_literals; - (* That float above represents 0x4330000080000000 *) + float_literals := (0x4330000080000000L, lbl) :: !float_literals; ` addis {emit_gpr 11}, 0, {emit_upper emit_label lbl}\n`; ` lfd {emit_fpr 0}, {emit_lower emit_label lbl}({emit_gpr 11})\n`; ` lis {emit_gpr 0}, 0x4330\n`; @@ -767,17 +749,22 @@ let rec emit_instr i dslot = ` {emit_string lg} {emit_gpr 29}, {emit_int size_addr}({emit_gpr 1})\n`; ` addi {emit_gpr 1}, {emit_gpr 1}, 16\n`; stack_offset := !stack_offset - 16 - | Lraise -> - if !Clflags.debug && supports_backtraces then begin + | Lraise k -> + begin match !Clflags.debug, k with + | true, Lambda.Raise_regular -> ` bl {emit_symbol "caml_raise_exn"}\n`; record_frame Reg.Set.empty i.dbg - end else begin + | true, Lambda.Raise_reraise -> + ` bl {emit_symbol "caml_reraise_exn"}\n`; + record_frame Reg.Set.empty i.dbg + | false, _ + | true, Lambda.Raise_notrace -> ` {emit_string lg} {emit_gpr 0}, 0({emit_gpr 29})\n`; ` mr {emit_gpr 1}, {emit_gpr 29}\n`; - ` mtlr {emit_gpr 0}\n`; + ` mtctr {emit_gpr 0}\n`; ` {emit_string lg} {emit_gpr 29}, {emit_int size_addr}({emit_gpr 1})\n`; ` addi {emit_gpr 1}, {emit_gpr 1}, 16\n`; - ` blr\n` + ` bctr\n` end and emit_delay = function @@ -911,11 +898,11 @@ let emit_item = function | Cint n -> ` {emit_string datag} {emit_nativeint n}\n` | Csingle f -> - emit_float32_directive ".long" f + emit_float32_directive ".long" (Int32.bits_of_float f) | Cdouble f -> if ppc64 - then emit_float64_directive ".quad" f - else emit_float64_split_directive ".long" f + then emit_float64_directive ".quad" (Int64.bits_of_float f) + else emit_float64_split_directive ".long" (Int64.bits_of_float f) | Csymbol_address s -> ` {emit_string datag} {emit_symbol s}\n` | Clabel_address lbl -> diff --git a/asmcomp/power/proc.ml b/asmcomp/power/proc.ml index 203e8a9e..934d2cbf 100644 --- a/asmcomp/power/proc.ml +++ b/asmcomp/power/proc.ml @@ -83,11 +83,11 @@ let rotate_registers = true (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 23 Reg.dummy in + let v = Array.make 23 Reg.dummy in for i = 0 to 22 do v.(i) <- Reg.at_location Int (Reg i) done; v let hard_float_reg = - let v = Array.create 31 Reg.dummy in + let v = Array.make 31 Reg.dummy in for i = 0 to 30 do v.(i) <- Reg.at_location Float (Reg(100 + i)) done; v let all_phys_regs = @@ -103,7 +103,7 @@ let stack_slot slot ty = let calling_conventions first_int last_int first_float last_float make_stack stack_ofs arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref stack_ofs in @@ -157,7 +157,7 @@ let loc_results res = let poweropen_external_conventions first_int last_int first_float last_float arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref (14 * size_addr) in @@ -200,6 +200,10 @@ let loc_external_results res = let loc_exn_bucket = phys_reg 0 +(* Volatile registers: none *) + +let regs_are_volatile rs = false + (* Registers destroyed by operations *) let destroyed_at_c_call = @@ -224,6 +228,17 @@ let max_register_pressure = function Iextcall(_, _) -> [| 15; 18 |] | _ -> [| 23; 30 |] +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | Ispecific(Imultaddf | Imultsubf) -> true + | Ispecific _ -> false + | _ -> true + (* Layout of the stack *) let num_stack_slots = [| 0; 0 |] diff --git a/asmcomp/power/scheduling.ml b/asmcomp/power/scheduling.ml index e4a575e0..7adaa2ee 100644 --- a/asmcomp/power/scheduling.ml +++ b/asmcomp/power/scheduling.ml @@ -26,7 +26,7 @@ method oper_latency = function | Iload(_, _) -> 2 | Iconst_float _ -> 2 (* turned into a load *) | Iconst_symbol _ -> 1 - | Iintop Imul -> 9 + | Iintop(Imul | Imulh) -> 9 | Iintop_imm(Imul, _) -> 5 | Iintop(Idiv | Imod) -> 36 | Iaddf | Isubf -> 4 @@ -44,12 +44,10 @@ method reload_retaddr_latency = 12 method oper_issue_cycles = function Iconst_float _ | Iconst_symbol _ -> 2 | Iload(_, Ibased(_, _)) -> 2 - | Istore(_, Ibased(_, _)) -> 2 + | Istore(_, Ibased(_, _), _) -> 2 | Ialloc _ -> 4 | Iintop(Imod) -> 40 (* assuming full stall *) | Iintop(Icomp _) -> 4 - | Iintop_imm(Idiv, _) -> 2 - | Iintop_imm(Imod, _) -> 4 | Iintop_imm(Icomp _, _) -> 4 | Ifloatofint -> 9 | Iintoffloat -> 4 diff --git a/asmcomp/power/selection.ml b/asmcomp/power/selection.ml index a68c63fc..86aea05f 100644 --- a/asmcomp/power/selection.ml +++ b/asmcomp/power/selection.ml @@ -61,16 +61,8 @@ method select_addressing chunk exp = method! select_operation op args = match (op, args) with - (* Prevent the recognition of (x / cst) and (x % cst) when cst is not - a power of 2, which do not correspond to an instruction. *) - (Cdivi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Idiv, n), [arg]) - | (Cdivi, _) -> - (Iintop Idiv, args) - | (Cmodi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Imod, n), [arg]) - | (Cmodi, _) -> - (Iintop Imod, args) + (* PowerPC does not support immediate operands for multiply high *) + (Cmulhi, _) -> (Iintop Imulh, args) (* The and, or and xor instructions have a different range of immediate operands than the other instructions *) | (Cand, _) -> self#select_logical Iand args diff --git a/asmcomp/printclambda.ml b/asmcomp/printclambda.ml index a5081fc4..b28d749e 100644 --- a/asmcomp/printclambda.ml +++ b/asmcomp/printclambda.ml @@ -15,15 +15,33 @@ open Format open Asttypes open Clambda -let rec pr_idents ppf = function - | [] -> () - | h::t -> fprintf ppf "%a %a" Ident.print h pr_idents t +let rec structured_constant ppf = function + | Uconst_float x -> fprintf ppf "%F" x + | Uconst_int32 x -> fprintf ppf "%ldl" x + | Uconst_int64 x -> fprintf ppf "%LdL" x + | Uconst_nativeint x -> fprintf ppf "%ndn" x + | Uconst_block (tag, l) -> + fprintf ppf "block(%i" tag; + List.iter (fun u -> fprintf ppf ",%a" uconstant u) l; + fprintf ppf ")" + | Uconst_float_array [] -> + fprintf ppf "floatarray()" + | Uconst_float_array (f1 :: fl) -> + fprintf ppf "floatarray(%F" f1; + List.iter (fun f -> fprintf ppf ",%F" f) fl; + fprintf ppf ")" + | Uconst_string s -> fprintf ppf "%S" s + +and uconstant ppf = function + | Uconst_ref (s, c) -> + fprintf ppf "%S=%a" s structured_constant c + | Uconst_int i -> fprintf ppf "%i" i + | Uconst_ptr i -> fprintf ppf "%ia" i let rec lam ppf = function | Uvar id -> Ident.print ppf id - | Uconst (cst,_) -> - Printlambda.structured_constant ppf cst + | Uconst c -> uconstant ppf c | Udirect_apply(f, largs, _) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in @@ -36,7 +54,7 @@ let rec lam ppf = function let idents ppf = List.iter (fprintf ppf "@ %a" Ident.print)in let one_fun ppf f = - fprintf ppf "(fun@ %s@ %d @[<2>%a@] @[<2>%a@])" + fprintf ppf "@[<2>(fun@ %s@ %d @[<2>%a@]@ @[<2>%a@]@])" f.label f.arity idents f.params lam f.body in let funs ppf = List.iter (fprintf ppf "@ %a" one_fun) in @@ -68,23 +86,38 @@ let rec lam ppf = function List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in fprintf ppf "@[<2>(%a%a)@]" Printlambda.primitive prim lams largs | Uswitch(larg, sw) -> - let switch ppf sw = - let spc = ref false in - for i = 0 to Array.length sw.us_index_consts - 1 do - let n = sw.us_index_consts.(i) in - let l = sw.us_actions_consts.(n) in - if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[case int %i:@ %a@]" i lam l; - done; - for i = 0 to Array.length sw.us_index_blocks - 1 do - let n = sw.us_index_blocks.(i) in - let l = sw.us_actions_blocks.(n) in - if !spc then fprintf ppf "@ " else spc := true; - fprintf ppf "@[case tag %i:@ %a@]" i lam l; + let print_case tag index i ppf = + for j = 0 to Array.length index - 1 do + if index.(j) = i then fprintf ppf "case %s %i:" tag j + done in + let print_cases tag index cases ppf = + for i = 0 to Array.length cases - 1 do + fprintf ppf "@ @[<2>%t@ %a@]" + (print_case tag index i) sequence cases.(i) done in + let switch ppf sw = + print_cases "int" sw.us_index_consts sw.us_actions_consts ppf ; + print_cases "tag" sw.us_index_blocks sw.us_actions_blocks ppf in fprintf ppf - "@[<1>(switch %a@ @[%a@])@]" + "@[@[<2>(switch@ %a@ @]%a)@]" lam larg switch sw + | Ustringswitch(larg,sw,d) -> + let switch ppf sw = + let spc = ref false in + List.iter + (fun (s,l) -> + if !spc then fprintf ppf "@ " else spc := true; + fprintf ppf "@[case \"%s\":@ %a@]" + (String.escaped s) lam l) + sw ; + begin match d with + | Some d -> + if !spc then fprintf ppf "@ " else spc := true; + fprintf ppf "@[default:@ %a@]" lam d + | None -> () + end in + fprintf ppf + "@[<1>(switch %a@ @[%a@])@]" lam larg switch sw | Ustaticfail (i, ls) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in @@ -132,3 +165,29 @@ and sequence ppf ulam = match ulam with let clambda ppf ulam = fprintf ppf "%a@." lam ulam + + +let rec approx ppf = function + Value_closure(fundesc, a) -> + Format.fprintf ppf "@[<2>function %s@ arity %i" + fundesc.fun_label fundesc.fun_arity; + if fundesc.fun_closed then begin + Format.fprintf ppf "@ (closed)" + end; + if fundesc.fun_inline <> None then begin + Format.fprintf ppf "@ (inline)" + end; + Format.fprintf ppf "@ -> @ %a@]" approx a + | Value_tuple a -> + let tuple ppf a = + for i = 0 to Array.length a - 1 do + if i > 0 then Format.fprintf ppf ";@ "; + Format.fprintf ppf "%i: %a" i approx a.(i) + done in + Format.fprintf ppf "@[(%a)@]" tuple a + | Value_unknown -> + Format.fprintf ppf "_" + | Value_const c -> + fprintf ppf "@[const(%a)@]" uconstant c + | Value_global_field (s, i) -> + fprintf ppf "@[global(%s,%i)@]" s i diff --git a/asmcomp/printclambda.mli b/asmcomp/printclambda.mli index ddc233af..d138b958 100644 --- a/asmcomp/printclambda.mli +++ b/asmcomp/printclambda.mli @@ -14,3 +14,5 @@ open Clambda open Format val clambda: formatter -> ulambda -> unit +val approx: formatter -> value_approximation -> unit +val structured_constant: formatter -> ustructured_constant -> unit diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index f29bcbc4..89c8582a 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -60,6 +60,7 @@ let operation = function | Caddi -> "+" | Csubi -> "-" | Cmuli -> "*" + | Cmulhi -> "*h" | Cdivi -> "/" | Cmodi -> "mod" | Cand -> "and" @@ -81,13 +82,14 @@ let operation = function | Cfloatofint -> "floatofint" | Cintoffloat -> "intoffloat" | Ccmpf c -> Printf.sprintf "%sf" (comparison c) - | Craise d -> "raise" ^ Debuginfo.to_string d + | Craise (k, d) -> Lambda.raise_kind k ^ Debuginfo.to_string d | Ccheckbound d -> "checkbound" ^ Debuginfo.to_string d let rec expr ppf = function | Cconst_int n -> fprintf ppf "%i" n - | Cconst_natint n -> fprintf ppf "%s" (Nativeint.to_string n) - | Cconst_float s -> fprintf ppf "%s" s + | Cconst_natint n | Cconst_blockheader n -> + fprintf ppf "%s" (Nativeint.to_string n) + | Cconst_float n -> fprintf ppf "%F" n | Cconst_symbol s -> fprintf ppf "\"%s\"" s | Cconst_pointer n -> fprintf ppf "%ia" n | Cconst_natpointer n -> fprintf ppf "%sa" (Nativeint.to_string n) @@ -186,8 +188,8 @@ let data_item ppf = function | Cint16 n -> fprintf ppf "int16 %i" n | Cint32 n -> fprintf ppf "int32 %s" (Nativeint.to_string n) | Cint n -> fprintf ppf "int %s" (Nativeint.to_string n) - | Csingle f -> fprintf ppf "single %s" f - | Cdouble f -> fprintf ppf "double %s" f + | Csingle f -> fprintf ppf "single %F" f + | Cdouble f -> fprintf ppf "double %F" f | Csymbol_address s -> fprintf ppf "addr \"%s\"" s | Clabel_address l -> fprintf ppf "addr L%i" l | Cstring s -> fprintf ppf "string \"%s\"" s diff --git a/asmcomp/printlinear.ml b/asmcomp/printlinear.ml index 6e177070..df58c5cc 100644 --- a/asmcomp/printlinear.ml +++ b/asmcomp/printlinear.ml @@ -60,8 +60,8 @@ let instr ppf i = fprintf ppf "push trap" | Lpoptrap -> fprintf ppf "pop trap" - | Lraise -> - fprintf ppf "raise %a" reg i.arg.(0) + | Lraise k -> + fprintf ppf "%s %a" (Lambda.raise_kind k) reg i.arg.(0) end; if not (Debuginfo.is_none i.dbg) then fprintf ppf " %s" (Debuginfo.to_string i.dbg) diff --git a/asmcomp/printmach.ml b/asmcomp/printmach.ml index 6407f4f7..a39160d2 100644 --- a/asmcomp/printmach.ml +++ b/asmcomp/printmach.ml @@ -18,8 +18,8 @@ open Reg open Mach let reg ppf r = - if String.length r.name > 0 then - fprintf ppf "%s" r.name + if not (Reg.anonymous r) then + fprintf ppf "%s" (Reg.name r) else fprintf ppf "%s" (match r.typ with Addr -> "A" | Int -> "I" | Float -> "F"); fprintf ppf "/%i" r.stamp; @@ -70,6 +70,7 @@ let intop = function | Iadd -> " + " | Isub -> " - " | Imul -> " * " + | Imulh -> " *h " | Idiv -> " div " | Imod -> " mod " | Iand -> " & " @@ -102,8 +103,9 @@ let operation op arg ppf res = | Imove -> regs ppf arg | Ispill -> fprintf ppf "%a (spill)" regs arg | Ireload -> fprintf ppf "%a (reload)" regs arg - | Iconst_int n -> fprintf ppf "%s" (Nativeint.to_string n) - | Iconst_float s -> fprintf ppf "%s" s + | Iconst_int n + | Iconst_blockheader n -> fprintf ppf "%s" (Nativeint.to_string n) + | Iconst_float f -> fprintf ppf "%F" f | Iconst_symbol s -> fprintf ppf "\"%s\"" s | Icall_ind -> fprintf ppf "call %a" regs arg | Icall_imm lbl -> fprintf ppf "call \"%s\" %a" lbl regs arg @@ -111,18 +113,19 @@ let operation op arg ppf res = | Itailcall_imm lbl -> fprintf ppf "tailcall \"%s\" %a" lbl regs arg | Iextcall(lbl, alloc) -> fprintf ppf "extcall \"%s\" %a%s" lbl regs arg - (if not alloc then "" else " (noalloc)") + (if alloc then "" else " (noalloc)") | Istackoffset n -> fprintf ppf "offset stack %i" n | Iload(chunk, addr) -> fprintf ppf "%s[%a]" (Printcmm.chunk chunk) (Arch.print_addressing reg addr) arg - | Istore(chunk, addr) -> - fprintf ppf "%s[%a] := %a" + | Istore(chunk, addr, is_assign) -> + fprintf ppf "%s[%a] := %a %s" (Printcmm.chunk chunk) (Arch.print_addressing reg addr) (Array.sub arg 1 (Array.length arg - 1)) reg arg.(0) + (if is_assign then "(assign)" else "(init)") | Ialloc n -> fprintf ppf "alloc %i" n | Iintop(op) -> fprintf ppf "%a%s%a" reg arg.(0) (intop op) reg arg.(1) | Iintop_imm(op, n) -> fprintf ppf "%a%s%i" reg arg.(0) (intop op) n @@ -177,8 +180,8 @@ let rec instr ppf i = | Itrywith(body, handler) -> fprintf ppf "@[try@,%a@;<0 -2>with@,%a@;<0 -2>endtry@]" instr body instr handler - | Iraise -> - fprintf ppf "raise %a" reg i.arg.(0) + | Iraise k -> + fprintf ppf "%s %a" (Lambda.raise_kind k) reg i.arg.(0) end; if not (Debuginfo.is_none i.dbg) then fprintf ppf "%s" (Debuginfo.to_string i.dbg); diff --git a/asmcomp/proc.mli b/asmcomp/proc.mli index 6cc6aedc..cabac4db 100644 --- a/asmcomp/proc.mli +++ b/asmcomp/proc.mli @@ -40,6 +40,12 @@ val max_register_pressure: Mach.operation -> int array val destroyed_at_oper: Mach.instruction_desc -> Reg.t array val destroyed_at_raise: Reg.t array +(* Volatile registers: those that change value when read *) +val regs_are_volatile: Reg.t array -> bool + +(* Pure operations *) +val op_is_pure: Mach.operation -> bool + (* Info for laying out the stack frame *) val num_stack_slots: int array val contains_calls: bool ref diff --git a/asmcomp/reg.ml b/asmcomp/reg.ml index 1ec0bf9e..8f0298a9 100644 --- a/asmcomp/reg.ml +++ b/asmcomp/reg.ml @@ -12,12 +12,30 @@ open Cmm +module Raw_name = struct + type t = + | Anon + | R + | Ident of Ident.t + + let create_from_ident ident = Ident ident + + let to_string t = + match t with + | Anon -> None + | R -> Some "R" + | Ident ident -> + let name = Ident.name ident in + if String.length name <= 0 then None else Some name +end + type t = - { mutable name: string; + { mutable raw_name: Raw_name.t; stamp: int; typ: Cmm.machtype_component; mutable loc: location; mutable spill: bool; + mutable part: int option; mutable interf: t list; mutable prefer: (t * int) list; mutable degree: int; @@ -37,44 +55,65 @@ and stack_location = type reg = t let dummy = - { name = ""; stamp = 0; typ = Int; loc = Unknown; spill = false; - interf = []; prefer = []; degree = 0; spill_cost = 0; visited = false } + { raw_name = Raw_name.Anon; stamp = 0; typ = Int; loc = Unknown; + spill = false; interf = []; prefer = []; degree = 0; spill_cost = 0; + visited = false; part = None; + } let currstamp = ref 0 let reg_list = ref([] : t list) let create ty = - let r = { name = ""; stamp = !currstamp; typ = ty; loc = Unknown; - spill = false; interf = []; prefer = []; degree = 0; - spill_cost = 0; visited = false } in + let r = { raw_name = Raw_name.Anon; stamp = !currstamp; typ = ty; + loc = Unknown; spill = false; interf = []; prefer = []; degree = 0; + spill_cost = 0; visited = false; part = None; } in reg_list := r :: !reg_list; incr currstamp; r let createv tyv = let n = Array.length tyv in - let rv = Array.create n dummy in + let rv = Array.make n dummy in for i = 0 to n-1 do rv.(i) <- create tyv.(i) done; rv let createv_like rv = let n = Array.length rv in - let rv' = Array.create n dummy in + let rv' = Array.make n dummy in for i = 0 to n-1 do rv'.(i) <- create rv.(i).typ done; rv' let clone r = let nr = create r.typ in - nr.name <- r.name; + nr.raw_name <- r.raw_name; nr let at_location ty loc = - let r = { name = "R"; stamp = !currstamp; typ = ty; loc = loc; spill = false; - interf = []; prefer = []; degree = 0; spill_cost = 0; - visited = false } in + let r = { raw_name = Raw_name.R; stamp = !currstamp; typ = ty; loc; + spill = false; interf = []; prefer = []; degree = 0; + spill_cost = 0; visited = false; part = None; } in incr currstamp; r +let anonymous t = + match Raw_name.to_string t.raw_name with + | None -> true + | Some _raw_name -> false + +let name t = + match Raw_name.to_string t.raw_name with + | None -> "" + | Some raw_name -> + let with_spilled = + if t.spill then + "spilled-" ^ raw_name + else + raw_name + in + match t.part with + | None -> with_spilled + | Some part -> with_spilled ^ "#" ^ string_of_int part + let first_virtual_reg_stamp = ref (-1) let reset() = @@ -139,6 +178,16 @@ let inter_set_array s v = else inter_all(i+1) in inter_all 0 +let disjoint_set_array s v = + match Array.length v with + 0 -> true + | 1 -> not (Set.mem v.(0) s) + | n -> let rec disjoint_all i = + if i >= n then true + else if Set.mem v.(i) s then false + else disjoint_all (i+1) + in disjoint_all 0 + let set_of_array v = match Array.length v with 0 -> Set.empty diff --git a/asmcomp/reg.mli b/asmcomp/reg.mli index 889e026f..e3cb2d95 100644 --- a/asmcomp/reg.mli +++ b/asmcomp/reg.mli @@ -12,12 +12,18 @@ (* Pseudo-registers *) +module Raw_name : sig + type t + val create_from_ident : Ident.t -> t +end + type t = - { mutable name: string; (* Name (for printing) *) + { mutable raw_name: Raw_name.t; (* Name *) stamp: int; (* Unique stamp *) typ: Cmm.machtype_component; (* Type of contents *) mutable loc: location; (* Actual location *) mutable spill: bool; (* "true" to force stack allocation *) + mutable part: int option; (* Zero-based index of part of value *) mutable interf: t list; (* Other regs live simultaneously *) mutable prefer: (t * int) list; (* Preferences for other regs *) mutable degree: int; (* Number of other regs live sim. *) @@ -41,12 +47,18 @@ val createv_like: t array -> t array val clone: t -> t val at_location: Cmm.machtype_component -> location -> t +val anonymous : t -> bool + +(* Name for printing *) +val name : t -> string + module Set: Set.S with type elt = t module Map: Map.S with type key = t val add_set_array: Set.t -> t array -> Set.t val diff_set_array: Set.t -> t array -> Set.t val inter_set_array: Set.t -> t array -> Set.t +val disjoint_set_array: Set.t -> t array -> bool val set_of_array: t array -> Set.t val reset: unit -> unit diff --git a/asmcomp/reloadgen.ml b/asmcomp/reloadgen.ml index 8f40ad01..30f23a82 100644 --- a/asmcomp/reloadgen.ml +++ b/asmcomp/reloadgen.ml @@ -54,7 +54,7 @@ method makereg r = method private makeregs rv = let n = Array.length rv in - let newv = Array.create n Reg.dummy in + let newv = Array.make n Reg.dummy in for i = 0 to n-1 do newv.(i) <- self#makereg rv.(i) done; newv @@ -88,7 +88,7 @@ method private reload i = already at the correct position (e.g. on stack for some arguments). However, something needs to be done for the function pointer in indirect calls. *) - Iend | Ireturn | Iop(Itailcall_imm _) | Iraise -> i + Iend | Ireturn | Iop(Itailcall_imm _) | Iraise _ -> i | Iop(Itailcall_ind) -> let newarg = self#makereg1 i.arg in insert_moves i.arg newarg diff --git a/asmcomp/schedgen.ml b/asmcomp/schedgen.ml index 885c9454..f7af4436 100644 --- a/asmcomp/schedgen.ml +++ b/asmcomp/schedgen.ml @@ -138,6 +138,8 @@ let some_load = (Iload(Cmm.Word, Arch.identity_addressing)) class virtual scheduler_generic = object (self) +val mutable trywith_nesting = 0 + (* Determine whether an operation ends a basic block or not. Can be overridden for some processors to signal specific instructions that terminate a basic block. *) @@ -154,9 +156,16 @@ method oper_in_basic_block = function (* Determine whether an instruction ends a basic block or not *) -method private instr_in_basic_block instr = +(* PR#2719: it is generally incorrect to schedule checkbound instructions + within a try ... with Invalid_argument _ -> ... + Hence, a checkbound instruction within a try...with block ends the + current basic block. *) + +method private instr_in_basic_block instr try_nesting = match instr.desc with - Lop op -> self#oper_in_basic_block op + Lop op -> + self#oper_in_basic_block op && + not (try_nesting > 0 && self#is_checkbound op) | Lreloadretaddr -> true | _ -> false @@ -165,7 +174,7 @@ method private instr_in_basic_block instr = load or store instructions (e.g. on the I386). *) method is_store = function - Istore(_, _) -> true + Istore(_, _, _) -> true | _ -> false method is_load = function @@ -336,8 +345,8 @@ method private reschedule ready_queue date cont = if son.emitted_ancestors = son.ancestors then new_queue := son :: !new_queue) node.sons; - instr_cons node.instr.desc node.instr.arg node.instr.res - (self#reschedule !new_queue (date + issue_cycles) cont) + { node.instr with next = + self#reschedule !new_queue (date + issue_cycles) cont } end (* Entry point *) @@ -345,19 +354,21 @@ method private reschedule ready_queue date cont = method schedule_fundecl f = - let rec schedule i = + let rec schedule i try_nesting = match i.desc with - Lend -> i + | Lend -> i + | Lpushtrap -> { i with next = schedule i.next (try_nesting + 1) } + | Lpoptrap -> { i with next = schedule i.next (try_nesting - 1) } | _ -> - if self#instr_in_basic_block i then begin + if self#instr_in_basic_block i try_nesting then begin clear_code_dag(); - schedule_block [] i + schedule_block [] i try_nesting end else - { i with next = schedule i.next } + { i with next = schedule i.next try_nesting } - and schedule_block ready_queue i = - if self#instr_in_basic_block i then - schedule_block (self#add_instruction ready_queue i) i.next + and schedule_block ready_queue i try_nesting = + if self#instr_in_basic_block i try_nesting then + schedule_block (self#add_instruction ready_queue i) i.next try_nesting else begin let critical_outputs = match i.desc with @@ -366,11 +377,11 @@ method schedule_fundecl f = | Lreturn -> [||] | _ -> i.arg in List.iter (fun x -> ignore (longest_path critical_outputs x)) ready_queue; - self#reschedule ready_queue 0 (schedule i) + self#reschedule ready_queue 0 (schedule i try_nesting) end in if f.fun_fast then begin - let new_body = schedule f.fun_body in + let new_body = schedule f.fun_body 0 in clear_code_dag(); { fun_name = f.fun_name; fun_body = new_body; @@ -380,3 +391,5 @@ method schedule_fundecl f = f end + +let reset () = clear_code_dag () diff --git a/asmcomp/schedgen.mli b/asmcomp/schedgen.mli index 6019d96f..911330f8 100644 --- a/asmcomp/schedgen.mli +++ b/asmcomp/schedgen.mli @@ -42,3 +42,5 @@ class virtual scheduler_generic : object (* Entry point *) method schedule_fundecl : Linearize.fundecl -> Linearize.fundecl end + +val reset : unit -> unit diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 1d2bf96d..8871bf49 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -33,7 +33,7 @@ let oper_result_type = function end | Calloc -> typ_addr | Cstore c -> typ_void - | Caddi | Csubi | Cmuli | Cdivi | Cmodi | + | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Ccmpi _ | Ccmpa _ | Ccmpf _ -> typ_int | Cadda | Csuba -> typ_addr @@ -47,7 +47,8 @@ let oper_result_type = function let size_expr env exp = let rec size localenv = function - Cconst_int _ | Cconst_natint _ -> Arch.size_int + Cconst_int _ | Cconst_natint _ + | Cconst_blockheader _ -> Arch.size_int | Cconst_symbol _ | Cconst_pointer _ | Cconst_natpointer _ -> Arch.size_addr | Cconst_float _ -> Arch.size_float @@ -85,7 +86,7 @@ let swap_intcomp = function let all_regs_anonymous rv = try for i = 0 to Array.length rv - 1 do - if String.length rv.(i).name > 0 then raise Exit + if not (Reg.anonymous rv.(i)) then raise Exit done; true with Exit -> @@ -93,10 +94,11 @@ let all_regs_anonymous rv = let name_regs id rv = if Array.length rv = 1 then - rv.(0).name <- Ident.name id + rv.(0).raw_name <- Raw_name.create_from_ident id else for i = 0 to Array.length rv - 1 do - rv.(i).name <- Ident.name id ^ "#" ^ string_of_int i + rv.(i).raw_name <- Raw_name.create_from_ident id; + rv.(i).part <- Some i done (* "Join" two instruction sequences, making sure they return their results @@ -109,12 +111,12 @@ let join opt_r1 seq1 opt_r2 seq2 = | (Some r1, Some r2) -> let l1 = Array.length r1 in assert (l1 = Array.length r2); - let r = Array.create l1 Reg.dummy in + let r = Array.make l1 Reg.dummy in for i = 0 to l1-1 do - if String.length r1.(i).name = 0 then begin + if Reg.anonymous r1.(i) then begin r.(i) <- r1.(i); seq2#insert_move r2.(i) r1.(i) - end else if String.length r2.(i).name = 0 then begin + end else if Reg.anonymous r2.(i) then begin r.(i) <- r2.(i); seq1#insert_move r1.(i) r2.(i) end else begin @@ -137,7 +139,7 @@ let join_array rs = None -> None | Some template -> let size_res = Array.length template in - let res = Array.create size_res Reg.dummy in + let res = Array.make size_res Reg.dummy in for i = 0 to size_res - 1 do res.(i) <- Reg.create template.(i).typ done; @@ -153,7 +155,7 @@ let join_array rs = let debuginfo_op = function | Capply(_, dbg) -> dbg | Cextcall(_, _, _, dbg) -> dbg - | Craise dbg -> dbg + | Craise (_, dbg) -> dbg | Ccheckbound dbg -> dbg | _ -> Debuginfo.none @@ -177,6 +179,7 @@ class virtual selector_generic = object (self) method is_simple_expr = function Cconst_int _ -> true | Cconst_natint _ -> true + | Cconst_blockheader _ -> true | Cconst_float _ -> true | Cconst_symbol _ -> true | Cconst_pointer _ -> true @@ -206,8 +209,39 @@ method virtual select_addressing : (* Default instruction selection for stores (of words) *) -method select_store addr arg = - (Istore(Word, addr), arg) +method select_store is_assign addr arg = + (Istore(Word, addr, is_assign), arg) + +(* call marking methods, documented in selectgen.mli *) + +method mark_call = + Proc.contains_calls := true + +method mark_tailcall = () + +method mark_c_tailcall = () + +method mark_instr = function + | Iop (Icall_ind | Icall_imm _ | Iextcall _) -> + self#mark_call + | Iop (Itailcall_ind | Itailcall_imm _) -> + self#mark_tailcall + | Iop (Ialloc _) -> + self#mark_call (* caml_alloc*, caml_garbage_collection *) + | Iop (Iintop Icheckbound | Iintop_imm(Icheckbound, _)) -> + self#mark_c_tailcall (* caml_ml_array_bound_error *) + | Iraise raise_kind -> + begin match raise_kind with + | Lambda.Raise_notrace -> () + | Lambda.Raise_regular | Lambda.Raise_reraise -> + if !Clflags.debug then (* PR#6239 *) + (* caml_stash_backtrace; we #mark_call rather than + #mark_c_tailcall to get a good stack backtrace *) + self#mark_call + end + | Itrywith _ -> + self#mark_call + | _ -> () (* Default instruction selection for operators *) @@ -222,28 +256,19 @@ method select_operation op args = | (Cstore chunk, [arg1; arg2]) -> let (addr, eloc) = self#select_addressing chunk arg1 in if chunk = Word then begin - let (op, newarg2) = self#select_store addr arg2 in + let (op, newarg2) = self#select_store true addr arg2 in (op, [newarg2; eloc]) end else begin - (Istore(chunk, addr), [arg2; eloc]) + (Istore(chunk, addr, true), [arg2; eloc]) (* Inversion addr/datum in Istore *) end | (Calloc, _) -> (Ialloc 0, args) | (Caddi, _) -> self#select_arith_comm Iadd args | (Csubi, _) -> self#select_arith Isub args - | (Cmuli, [arg1; Cconst_int n]) -> - let l = Misc.log2 n in - if n = 1 lsl l - then (Iintop_imm(Ilsl, l), [arg1]) - else self#select_arith_comm Imul args - | (Cmuli, [Cconst_int n; arg1]) -> - let l = Misc.log2 n in - if n = 1 lsl l - then (Iintop_imm(Ilsl, l), [arg1]) - else self#select_arith_comm Imul args | (Cmuli, _) -> self#select_arith_comm Imul args - | (Cdivi, _) -> self#select_arith Idiv args - | (Cmodi, _) -> self#select_arith_comm Imod args + | (Cmulhi, _) -> self#select_arith_comm Imulh args + | (Cdivi, _) -> (Iintop Idiv, args) + | (Cmodi, _) -> (Iintop Imod, args) | (Cand, _) -> self#select_arith_comm Iand args | (Cor, _) -> self#select_arith_comm Ior args | (Cxor, _) -> self#select_arith_comm Ixor args @@ -400,6 +425,9 @@ method emit_expr env exp = | Cconst_natint n -> let r = self#regs_for typ_int in Some(self#insert_op (Iconst_int n) [||] r) + | Cconst_blockheader n -> + let r = self#regs_for typ_int in + Some(self#insert_op (Iconst_blockheader n) [||] r) | Cconst_float n -> let r = self#regs_for typ_float in Some(self#insert_op (Iconst_float n) [||] r) @@ -441,13 +469,13 @@ method emit_expr env exp = | Some(simple_list, ext_env) -> Some(self#emit_tuple ext_env simple_list) end - | Cop(Craise dbg, [arg]) -> + | Cop(Craise (k, dbg), [arg]) -> begin match self#emit_expr env arg with None -> None | Some r1 -> let rd = [|Proc.loc_exn_bucket|] in self#insert (Iop Imove) r1 rd; - self#insert_debug Iraise dbg rd [||]; + self#insert_debug (Iraise k) dbg rd [||]; None end | Cop(Ccmpf comp, args) -> @@ -461,7 +489,6 @@ method emit_expr env exp = let dbg = debuginfo_op op in match new_op with Icall_ind -> - Proc.contains_calls := true; let r1 = self#emit_tuple env new_args in let rarg = Array.sub r1 1 (Array.length r1 - 1) in let rd = self#regs_for ty in @@ -473,7 +500,6 @@ method emit_expr env exp = self#insert_move_results loc_res rd stack_ofs; Some rd | Icall_imm lbl -> - Proc.contains_calls := true; let r1 = self#emit_tuple env new_args in let rd = self#regs_for ty in let (loc_arg, stack_ofs) = Proc.loc_arguments r1 in @@ -483,7 +509,6 @@ method emit_expr env exp = self#insert_move_results loc_res rd stack_ofs; Some rd | Iextcall(lbl, alloc) -> - Proc.contains_calls := true; let (loc_arg, stack_ofs) = self#emit_extcall_args env new_args in let rd = self#regs_for ty in @@ -492,7 +517,6 @@ method emit_expr env exp = self#insert_move_results loc_res rd stack_ofs; Some rd | Ialloc _ -> - Proc.contains_calls := true; let rd = self#regs_for typ_addr in let size = size_expr env (Ctuple new_args) in self#insert (Iop(Ialloc size)) [||] rd; @@ -567,7 +591,6 @@ method emit_expr env exp = None end | Ctrywith(e1, v, e2) -> - Proc.contains_calls := true; let (r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_addr in let (r2, s2) = self#emit_sequence (Tbl.add v rv env) e2 in @@ -654,16 +677,16 @@ method emit_stores env data regs_addr = ref (Arch.offset_addressing Arch.identity_addressing (-Arch.size_int)) in List.iter (fun e -> - let (op, arg) = self#select_store !a e in + let (op, arg) = self#select_store false !a e in match self#emit_expr env arg with None -> assert false | Some regs -> match op with - Istore(_, _) -> + Istore(_, _, _) -> for i = 0 to Array.length regs - 1 do let r = regs.(i) in let kind = if r.typ = Float then Double_u else Word in - self#insert (Iop(Istore(kind, !a))) + self#insert (Iop(Istore(kind, !a, false))) (Array.append [|r|] regs_addr) [||]; a := Arch.offset_addressing !a (size_component r.typ) done @@ -704,7 +727,6 @@ method emit_tail env exp = self#insert (Iop Itailcall_ind) (Array.append [|r1.(0)|] loc_arg) [||] end else begin - Proc.contains_calls := true; let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in self#insert_move_args rarg loc_arg stack_ofs; @@ -724,7 +746,6 @@ method emit_tail env exp = self#insert_moves r1 loc_arg'; self#insert (Iop(Itailcall_imm lbl)) loc_arg' [||] end else begin - Proc.contains_calls := true; let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in self#insert_move_args r1 loc_arg stack_ofs; @@ -774,7 +795,6 @@ method emit_tail env exp = let s2 = self#emit_tail_sequence new_env e2 in self#insert (Icatch(nfail, s1, s2)) [||] [||] | Ctrywith(e1, v, e2) -> - Proc.contains_calls := true; let (opt_r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_addr in let s2 = self#emit_tail_sequence (Tbl.add v rv env) e2 in @@ -814,9 +834,11 @@ method emit_fundecl f = f.Cmm.fun_args rargs Tbl.empty in self#insert_moves loc_arg rarg; self#emit_tail env f.Cmm.fun_body; + let body = self#extract in + instr_iter (fun instr -> self#mark_instr instr.Mach.desc) body; { fun_name = f.Cmm.fun_name; fun_args = loc_arg; - fun_body = self#extract; + fun_body = body; fun_fast = f.Cmm.fun_fast; fun_dbg = f.Cmm.fun_dbg } @@ -835,3 +857,7 @@ let is_tail_call nargs = let _ = Simplif.is_tail_native_heuristic := is_tail_call + +let reset () = + catch_regs := []; + current_function_name := "" diff --git a/asmcomp/selectgen.mli b/asmcomp/selectgen.mli index 11af7c1f..0de90382 100644 --- a/asmcomp/selectgen.mli +++ b/asmcomp/selectgen.mli @@ -35,7 +35,8 @@ class virtual selector_generic : object method select_condition : Cmm.expression -> Mach.test * Cmm.expression (* Can be overridden to deal with special test instructions *) method select_store : - Arch.addressing_mode -> Cmm.expression -> Mach.operation * Cmm.expression + bool -> Arch.addressing_mode -> Cmm.expression -> + Mach.operation * Cmm.expression (* Can be overridden to deal with special store constant instructions *) method regs_for : Cmm.machtype -> Reg.t array (* Return an array of fresh registers of the given type. @@ -58,6 +59,30 @@ class virtual selector_generic : object (* Fill a freshly allocated block. Can be overridden for architectures that do not provide Arch.offset_addressing. *) + method mark_call : unit + (* informs the code emitter that the current function is non-leaf: + it may perform a (non-tail) call; by default, sets + [Proc.contains_calls := true] *) + + method mark_tailcall : unit + (* informs the code emitter that the current function may end with + a tail-call; by default, does nothing *) + + method mark_c_tailcall : unit + (* informs the code emitter that the current function may call + a C function that never returns; by default, does nothing. + + It is unecessary to save the stack pointer in this situation + (which is the main purpose of tracking leaf functions) but some + architectures still need to ensure that the stack is properly + aligned when the C function is called. This is achieved by + overloading this method to set [Proc.contains_calls := true] *) + + method mark_instr : Mach.instruction_desc -> unit + (* dispatches on instructions to call one of the marking function + above; overloading this is useful if Ispecific instructions need + marking *) + (* The following method is the entry point and should not be overridden *) method emit_fundecl : Cmm.fundecl -> Mach.fundecl @@ -76,3 +101,5 @@ class virtual selector_generic : object (Ident.t, Reg.t array) Tbl.t -> Cmm.expression -> Reg.t array option method emit_tail : (Ident.t, Reg.t array) Tbl.t -> Cmm.expression -> unit end + +val reset : unit -> unit diff --git a/asmcomp/sparc/CSE.ml b/asmcomp/sparc/CSE.ml new file mode 100644 index 00000000..e48d6043 --- /dev/null +++ b/asmcomp/sparc/CSE.ml @@ -0,0 +1,30 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2014 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* CSE for Sparc *) + +open Mach +open CSEgen + +class cse = object (self) + +inherit cse_generic (* as super *) + +method! is_cheap_operation op = + match op with + | Iconst_int n | Iconst_blockheader n -> n <= 4095n && n >= -4096n + | _ -> false + +end + +let fundecl f = + (new cse)#fundecl f diff --git a/asmcomp/sparc/emit.mlp b/asmcomp/sparc/emit.mlp index b8387cd7..877a3d52 100644 --- a/asmcomp/sparc/emit.mlp +++ b/asmcomp/sparc/emit.mlp @@ -64,7 +64,7 @@ let symbol_prefix = if Config.system = "sunos" then "_" else "" let emit_symbol s = - if String.length s >= 1 & s.[0] = '.' + if String.length s >= 1 && s.[0] = '.' then emit_string s else begin emit_string symbol_prefix; Emitaux.emit_symbol '$' s end @@ -190,7 +190,7 @@ let emit_frame fd = (* Record floating-point constants *) -let float_constants = ref ([] : (int * string) list) +let float_constants = ref ([] : (int * int64) list) let emit_float_constant (lbl, cst) = rodata (); @@ -302,18 +302,18 @@ let rec emit_instr i dslot = | (_, _) -> fatal_error "Emit: Imove" end - | Lop(Iconst_int n) -> + | Lop(Iconst_int n | Iconst_blockheader n) -> if is_native_immediate n then ` mov {emit_nativeint n}, {emit_reg i.res.(0)}\n` else begin ` sethi %hi({emit_nativeint n}), %g1\n`; ` or %g1, %lo({emit_nativeint n}), {emit_reg i.res.(0)}\n` end - | Lop(Iconst_float s) -> + | Lop(Iconst_float f) -> (* On UltraSPARC, the fzero instruction could be used to set a floating point register pair to zero. *) let lbl = new_label() in - float_constants := (lbl, s) :: !float_constants; + float_constants := (lbl, Int64.bits_of_float f) :: !float_constants; ` sethi %hi({emit_label lbl}), %g1\n`; ` ldd [%g1 + %lo({emit_label lbl})], {emit_reg i.res.(0)}\n` | Lop(Iconst_symbol s) -> @@ -375,7 +375,7 @@ let rec emit_instr i dslot = | _ -> "ld" in emit_load loadinstr addr i.arg dest end - | Lop(Istore(chunk, addr)) -> + | Lop(Istore(chunk, addr, _)) -> let src = i.arg.(0) in begin match chunk with Double_u -> @@ -443,36 +443,15 @@ let rec emit_instr i dslot = ` sra {emit_reg i.arg.(0)}, 31, %g1\n`; ` wr %g1, %y\n`; ` sdiv {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.res.(0)}\n` + | Lop(Iintop Imulh) -> + ` smul {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, %g1\n`; + ` rd %y, {emit_reg i.res.(0)}\n` | Lop(Iintop op) -> let instr = name_for_int_operation op in ` {emit_string instr} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(Ilsl, 1)) -> (* UltraSPARC has two add units but only one shifter. *) ` add {emit_reg i.arg.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.res.(0)}\n` - | Lop(Iintop_imm(Idiv, n)) -> - let l = Misc.log2 n in - if n = 1 lsl l then begin - let lbl = new_label() in - ` cmp {emit_reg i.arg.(0)}, 0\n`; - ` bge {emit_label lbl}\n`; - ` mov {emit_reg i.arg.(0)}, %g1\n`; (* in delay slot *) - ` add %g1, {emit_int (n-1)}, %g1\n`; - `{emit_label lbl}:\n`; - ` sra %g1, {emit_int l}, {emit_reg i.res.(0)}\n` - end else begin - ` sra {emit_reg i.arg.(0)}, 31, %g1\n`; - ` wr %g1, %y\n`; - ` sdiv {emit_reg i.arg.(0)}, {emit_int n}, {emit_reg i.res.(0)}\n` - end - | Lop(Iintop_imm(Imod, n)) -> (* n is a power of 2 *) - let lbl = new_label() in - ` tst {emit_reg i.arg.(0)}\n`; - ` bge {emit_label lbl}\n`; - ` andcc {emit_reg i.arg.(0)}, {emit_int (n-1)}, {emit_reg i.res.(0)}\n`; (* in delay slot *) - ` be {emit_label lbl}\n`; - ` nop\n`; - ` sub {emit_reg i.res.(0)}, {emit_int n}, {emit_reg i.res.(0)}\n`; - `{emit_label lbl}:\n` | Lop(Iintop_imm(Icomp cmp, n)) -> ` cmp {emit_reg i.arg.(0)}, {emit_int n}\n`; if !arch_version = SPARC_V9 then begin @@ -496,6 +475,9 @@ let rec emit_instr i dslot = ` bleu {emit_label !range_check_trap}\n`; ` nop\n` (* delay slot *) end + | Lop(Iintop_imm(Imulh, n)) -> + ` smul {emit_reg i.arg.(0)}, {emit_int n}, %g1\n`; + ` rd %y, {emit_reg i.res.(0)}\n` | Lop(Iintop_imm(op, n)) -> let instr = name_for_int_operation op in ` {emit_string instr} {emit_reg i.arg.(0)}, {emit_int n}, {emit_reg i.res.(0)}\n` @@ -603,7 +585,7 @@ let rec emit_instr i dslot = ` ld [%sp + 100], %l5\n`; ` add %sp, 8, %sp\n`; stack_offset := !stack_offset - 8 - | Lraise -> + | Lraise _ -> ` ld [%l5 + 96], %g1\n`; ` mov %l5, %sp\n`; ` ld [%sp + 100], %l5\n`; @@ -618,7 +600,7 @@ and fill_delay_slot = function that does not branch. *) let is_one_instr_op = function - Idiv | Imod | Icomp _ | Icheckbound -> false + Imulh | Idiv | Imod | Icomp _ | Icheckbound -> false | _ -> true let is_one_instr i = @@ -627,10 +609,10 @@ let is_one_instr i = begin match op with Imove | Ispill | Ireload -> i.arg.(0).typ <> Float && i.res.(0).typ <> Float - | Iconst_int n -> is_native_immediate n + | Iconst_int n | Iconst_blockheader n -> is_native_immediate n | Istackoffset _ -> true - | Iload(_, Iindexed n) -> i.res.(0).typ <> Float & is_immediate n - | Istore(_, Iindexed n) -> i.arg.(0).typ <> Float & is_immediate n + | Iload(_, Iindexed n) -> i.res.(0).typ <> Float && is_immediate n + | Istore(_, Iindexed n, _) -> i.arg.(0).typ <> Float && is_immediate n | Iintop(op) -> is_one_instr_op op | Iintop_imm(op, _) -> is_one_instr_op op | Iaddf | Isubf | Imulf | Idivf -> true @@ -660,15 +642,15 @@ let rec emit_all i = emit_instr i.next (Some i); emit_all i.next.next | {next = {desc = Lop(Itailcall_imm s)}} - when s = !function_name & is_one_instr i -> + when s = !function_name && is_one_instr i -> emit_instr i.next (Some i); emit_all i.next.next | {next = {desc = Lop(Icall_ind)}} - when is_one_instr i & no_interference i.res i.next.arg -> + when is_one_instr i && no_interference i.res i.next.arg -> emit_instr i.next (Some i); emit_all i.next.next | {next = {desc = Lcondbranch(_, _)}} - when is_one_instr i & no_interference i.res i.next.arg -> + when is_one_instr i && no_interference i.res i.next.arg -> emit_instr i.next (Some i); emit_all i.next.next | _ -> @@ -724,9 +706,9 @@ let emit_item = function | Cint n -> ` .word {emit_nativeint n}\n` | Csingle f -> - emit_float32_directive ".word" f + emit_float32_directive ".word" (Int32.bits_of_float f) | Cdouble f -> - emit_float64_split_directive ".word" f + emit_float64_split_directive ".word" (Int64.bits_of_float f) | Csymbol_address s -> ` .word {emit_symbol s}\n` | Clabel_address lbl -> diff --git a/asmcomp/sparc/proc.ml b/asmcomp/sparc/proc.ml index ed107a82..625f517f 100644 --- a/asmcomp/sparc/proc.ml +++ b/asmcomp/sparc/proc.ml @@ -81,12 +81,12 @@ let rotate_registers = true (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.create 19 Reg.dummy in + let v = Array.make 19 Reg.dummy in for i = 0 to 18 do v.(i) <- Reg.at_location Int (Reg i) done; v let hard_float_reg = - let v = Array.create 32 Reg.dummy in + let v = Array.make 32 Reg.dummy in for i = 0 to 31 do v.(i) <- Reg.at_location Float (Reg(100 + i)) done; v @@ -105,7 +105,7 @@ let stack_slot slot ty = let calling_conventions first_int last_int first_float last_float make_stack arg = - let loc = Array.create (Array.length arg) Reg.dummy in + let loc = Array.make (Array.length arg) Reg.dummy in let int = ref first_int in let float = ref first_float in let ofs = ref 0 in @@ -171,6 +171,10 @@ let loc_external_results res = let loc_exn_bucket = phys_reg 0 (* $o0 *) +(* Volatile registers: none *) + +let regs_are_volatile rs = false + (* Registers destroyed by operations *) let destroyed_at_c_call = (* %l0-%l4, %i0-%i5 preserved *) @@ -196,6 +200,15 @@ let max_register_pressure = function Iextcall(_, _) -> [| 11; 0 |] | _ -> [| 19; 15 |] +(* Pure operations (without any side effect besides updating their result + registers). *) + +let op_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false + | _ -> true + (* Layout of the stack *) let num_stack_slots = [| 0; 0 |] diff --git a/asmcomp/sparc/scheduling.ml b/asmcomp/sparc/scheduling.ml index 048880ab..497722bb 100644 --- a/asmcomp/sparc/scheduling.ml +++ b/asmcomp/sparc/scheduling.ml @@ -47,8 +47,6 @@ method oper_issue_cycles = function | Ialloc _ -> 6 | Iintop(Icomp _) -> 4 | Iintop(Icheckbound) -> 2 - | Iintop_imm(Idiv, _) -> 5 - | Iintop_imm(Imod, _) -> 5 | Iintop_imm(Icomp _, _) -> 4 | Iintop_imm(Icheckbound, _) -> 2 | Inegf -> 2 diff --git a/asmcomp/sparc/selection.ml b/asmcomp/sparc/selection.ml index 055b78f1..d938c1ef 100644 --- a/asmcomp/sparc/selection.ml +++ b/asmcomp/sparc/selection.ml @@ -38,23 +38,13 @@ method select_addressing chunk = function method! select_operation op args = match (op, args) with (* For SPARC V7 multiplication, division and modulus are turned into - calls to C library routines, except if the dividend is a power of 2. + calls to C library routines. For SPARC V8 and V9, use hardware multiplication and division, but C library routine for modulus. *) - (Cmuli, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Ilsl, Misc.log2 n), [arg]) - | (Cmuli, [Cconst_int n; arg]) when n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Ilsl, Misc.log2 n), [arg]) - | (Cmuli, _) when !arch_version = SPARC_V7 -> + (Cmuli, _) when !arch_version = SPARC_V7 -> (Iextcall(".umul", false), args) - | (Cdivi, [arg; Cconst_int n]) - when self#is_immediate n && n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Idiv, n), [arg]) | (Cdivi, _) when !arch_version = SPARC_V7 -> (Iextcall(".div", false), args) - | (Cmodi, [arg; Cconst_int n]) - when self#is_immediate n && n = 1 lsl (Misc.log2 n) -> - (Iintop_imm(Imod, n), [arg]) | (Cmodi, _) -> (Iextcall(".rem", false), args) | _ -> diff --git a/asmcomp/spill.ml b/asmcomp/spill.ml index f52b09fc..105550d0 100644 --- a/asmcomp/spill.ml +++ b/asmcomp/spill.ml @@ -40,7 +40,7 @@ let spill_reg r = with Not_found -> let spill_r = Reg.create r.typ in spill_r.spill <- true; - if String.length r.name > 0 then spill_r.name <- "spilled-" ^ r.name; + if not (Reg.anonymous r) then spill_r.raw_name <- r.raw_name; spill_env := Reg.Map.add r spill_r !spill_env; spill_r @@ -64,7 +64,7 @@ let add_superpressure_regs op live_regs res_regs spilled = let max_pressure = Proc.max_register_pressure op in let regs = Reg.add_set_array live_regs res_regs in (* Compute the pressure in each register class *) - let pressure = Array.create Proc.num_register_classes 0 in + let pressure = Array.make Proc.num_register_classes 0 in Reg.Set.iter (fun r -> if Reg.Set.mem r spilled then () else begin @@ -233,12 +233,17 @@ let rec reload i before = (i, Reg.Set.empty) | Itrywith(body, handler) -> let (new_body, after_body) = reload body before in - let (new_handler, after_handler) = reload handler handler.live in + (* All registers live at the beginning of the handler are destroyed, + except the exception bucket *) + let before_handler = + Reg.Set.remove Proc.loc_exn_bucket + (Reg.add_set_array handler.live handler.arg) in + let (new_handler, after_handler) = reload handler before_handler in let (new_next, finally) = reload i.next (Reg.Set.union after_body after_handler) in (instr_cons (Itrywith(new_body, new_handler)) i.arg i.res new_next, finally) - | Iraise -> + | Iraise _ -> (add_reloads (Reg.inter_set_array before i.arg) i, Reg.Set.empty) (* Second pass: add spill instructions based on what we've decided to reload. @@ -379,15 +384,19 @@ let rec spill i finally = spill_at_raise := saved_spill_at_raise; (instr_cons (Itrywith(new_body, new_handler)) i.arg i.res new_next, before_body) - | Iraise -> + | Iraise _ -> (i, !spill_at_raise) (* Entry point *) -let fundecl f = +let reset () = spill_env := Reg.Map.empty; use_date := Reg.Map.empty; - current_date := 0; + current_date := 0 + +let fundecl f = + reset (); + let (body1, _) = reload f.fun_body Reg.Set.empty in let (body2, tospill_at_entry) = spill body1 Reg.Set.empty in let new_body = diff --git a/asmcomp/spill.mli b/asmcomp/spill.mli index 66954aef..598a1755 100644 --- a/asmcomp/spill.mli +++ b/asmcomp/spill.mli @@ -14,3 +14,4 @@ before register allocation. *) val fundecl: Mach.fundecl -> Mach.fundecl +val reset : unit -> unit diff --git a/asmcomp/split.ml b/asmcomp/split.ml index 96e9e376..8c553ab9 100644 --- a/asmcomp/split.ml +++ b/asmcomp/split.ml @@ -30,7 +30,7 @@ let subst_regs rv sub = None -> rv | Some s -> let n = Array.length rv in - let nv = Array.create n Reg.dummy in + let nv = Array.make n Reg.dummy in for i = 0 to n-1 do nv.(i) <- subst_reg rv.(i) s done; nv @@ -184,8 +184,8 @@ let rec rename i sub = rename i.next (merge_substs sub_body sub_handler i.next) in (instr_cons (Itrywith(new_body, new_handler)) [||] [||] new_next, sub_next) - | Iraise -> - (instr_cons_debug Iraise (subst_regs i.arg sub) [||] i.dbg i.next, + | Iraise k -> + (instr_cons_debug (Iraise k) (subst_regs i.arg sub) [||] i.dbg i.next, None) (* Second pass: replace registers by their final representatives *) @@ -195,8 +195,13 @@ let set_repres i = (* Entry point *) -let fundecl f = +let reset () = equiv_classes := Reg.Map.empty; + exit_subst := [] + +let fundecl f = + reset (); + let new_args = Array.copy f.fun_args in let (new_body, sub_body) = rename f.fun_body (Some Reg.Map.empty) in repres_regs new_args; diff --git a/asmcomp/split.mli b/asmcomp/split.mli index f794fec1..1924a5ad 100644 --- a/asmcomp/split.mli +++ b/asmcomp/split.mli @@ -13,3 +13,5 @@ (* Renaming of registers at reload points to split live ranges. *) val fundecl: Mach.fundecl -> Mach.fundecl + +val reset : unit -> unit diff --git a/asmcomp/strmatch.ml b/asmcomp/strmatch.ml new file mode 100644 index 00000000..d63e92bf --- /dev/null +++ b/asmcomp/strmatch.ml @@ -0,0 +1,389 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Translation of string matching from closed lambda to C-- *) + +open Lambda +open Cmm + +module type I = sig + val string_block_length : Cmm.expression -> Cmm.expression + val transl_switch : + Cmm.expression -> int -> int -> + (int * Cmm.expression) list -> Cmm.expression -> + Cmm.expression +end + +module Make(I:I) = struct + +(* Debug *) + + let dbg = false + + let mask = + let open Nativeint in + sub (shift_left one 8) one + + let pat_as_string p = + let rec digits k n p = + if n <= 0 then k + else + let d = Nativeint.to_int (Nativeint.logand mask p) in + let d = Char.escaped (Char.chr d) in + digits (d::k) (n-1) (Nativeint.shift_right_logical p 8) in + let ds = digits [] Arch.size_addr p in + let ds = + if Arch.big_endian then ds else List.rev ds in + String.concat "" ds + + let do_pp_cases chan cases = + List.iter + (fun (ps,_) -> + Printf.fprintf chan " [%s]\n" + (String.concat "; " (List.map pat_as_string ps))) + cases + + let pp_cases chan tag cases = + Printf.eprintf "%s:\n" tag ; + do_pp_cases chan cases + + let pp_match chan tag idxs cases = + Printf.eprintf + "%s: idx=[%s]\n" tag + (String.concat "; " (List.map string_of_int idxs)) ; + do_pp_cases chan cases + +(* Utilities *) + + let gen_cell_id () = Ident.create "cell" + let gen_size_id () = Ident.create "size" + + let mk_let_cell id str ind body = + let cell = + Cop(Cload Word,[Cop(Cadda,[str;Cconst_int(Arch.size_int*ind)])]) in + Clet(id, cell, body) + + let mk_let_size id str body = + let size = I.string_block_length str in + Clet(id, size, body) + + let mk_cmp_gen cmp_op id nat ifso ifnot = + let test = Cop (Ccmpi cmp_op, [ Cvar id; Cconst_natpointer nat ]) in + Cifthenelse (test, ifso, ifnot) + + let mk_lt = mk_cmp_gen Clt + let mk_eq = mk_cmp_gen Ceq + + module IntArg = + struct + type t = int + let compare (x:int) (y:int) = + if x < y then -1 + else if x > y then 1 + else 0 + end + + let interval m0 n = + let rec do_rec m = + if m >= n then [] + else m::do_rec (m+1) in + do_rec m0 + + +(*****************************************************) +(* Compile strings to a lists of words [native ints] *) +(*****************************************************) + + let pat_of_string str = + let len = String.length str in + let n = len / Arch.size_addr + 1 in + let get_byte i = + if i < len then int_of_char str.[i] + else if i < n * Arch.size_addr - 1 then 0 + else n * Arch.size_addr - 1 - len in + let mk_word ind = + let w = ref 0n in + let imin = ind * Arch.size_addr + and imax = (ind + 1) * Arch.size_addr - 1 in + if Arch.big_endian then + for i = imin to imax do + w := Nativeint.logor (Nativeint.shift_left !w 8) + (Nativeint.of_int (get_byte i)); + done + else + for i = imax downto imin do + w := Nativeint.logor (Nativeint.shift_left !w 8) + (Nativeint.of_int (get_byte i)); + done; + !w in + let rec mk_words ind = + if ind >= n then [] + else mk_word ind::mk_words (ind+1) in + mk_words 0 + +(*****************************) +(* Discriminating heuristics *) +(*****************************) + + module IntSet = Set.Make(IntArg) + module NativeSet = Set.Make(Nativeint) + + let rec add_one sets ps = match sets,ps with + | [],[] -> [] + | set::sets,p::ps -> + let sets = add_one sets ps in + NativeSet.add p set::sets + | _,_ -> assert false + + let count_arities cases = match cases with + | [] -> assert false + | (ps,_)::_ -> + let sets = + List.fold_left + (fun sets (ps,_) -> add_one sets ps) + (List.map (fun _ -> NativeSet.empty) ps) cases in + List.map NativeSet.cardinal sets + + let count_arities_first cases = + let set = + List.fold_left + (fun set case -> match case with + | (p::_,_) -> NativeSet.add p set + | _ -> assert false) + NativeSet.empty cases in + NativeSet.cardinal set + + let count_arities_length cases = + let set = + List.fold_left + (fun set (ps,_) -> IntSet.add (List.length ps) set) + IntSet.empty cases in + IntSet.cardinal set + + let best_col = + let rec do_rec kbest best k = function + | [] -> kbest + | x::xs -> + if x < best then + do_rec k x (k+1) xs + else + do_rec kbest best (k+1) xs in + let smallest = do_rec (-1) max_int 0 in + fun cases -> + let ars = count_arities cases in + smallest ars + + let swap_list = + let rec do_rec k xs = match xs with + | [] -> assert false + | x::xs -> + if k <= 0 then [],x,xs + else + let xs,mid,ys = do_rec (k-1) xs in + x::xs,mid,ys in + fun k xs -> + let xs,x,ys = do_rec k xs in + x::xs @ ys + + let swap k idxs cases = + if k = 0 then idxs,cases + else + let idxs = swap_list k idxs + and cases = + List.map + (fun (ps,act) -> swap_list k ps,act) + cases in + if dbg then begin + pp_match stderr "SWAP" idxs cases + end ; + idxs,cases + + let best_first idxs cases = match idxs with + | []|[_] -> idxs,cases (* optimisation: one column only *) + | _ -> + let k = best_col cases in + swap k idxs cases + +(************************************) +(* Divide according to first column *) +(************************************) + + module Divide(O:Set.OrderedType) = struct + + module OMap = Map.Make(O) + + let do_find key env = + try OMap.find key env + with Not_found -> assert false + + let divide cases = + let env = + List.fold_left + (fun env (p,psact) -> + let old = + try OMap.find p env + with Not_found -> [] in + OMap.add p ((psact)::old) env) + OMap.empty cases in + let r = OMap.fold (fun key v k -> (key,v)::k) env [] in + List.rev r (* Now sorted *) + end + +(***************) +(* Compilation *) +(***************) + +(* Group by cell *) + + module DivideNative = Divide(Nativeint) + + let by_cell cases = + DivideNative.divide + (List.map + (fun case -> match case with + | (p::ps),act -> p,(ps,act) + | [],_ -> assert false) + cases) + +(* Split into two halves *) + + let rec do_split idx env = match env with + | [] -> assert false + | (midkey,_ as x)::rem -> + if idx <= 0 then [],midkey,env + else + let lt,midkey,ge = do_split (idx-1) rem in + x::lt,midkey,ge + + let split_env len env = do_split (len/2) env + +(* Switch according to one cell *) + +(* + Emit the switch, here as a comparison tree. + Argument compile_rec is to be called to compile the rest of patterns, + as match_on_cell can be called in two different contexts : + from do_compile_pats and top_compile below. + *) + let match_oncell compile_rec str default idx env = + let id = gen_cell_id () in + let rec comp_rec env = + let len = List.length env in + if len <= 3 then + List.fold_right + (fun (key,cases) ifnot -> + mk_eq id key + (compile_rec str default cases) + ifnot) + env default + else + let lt,midkey,ge = split_env len env in + mk_lt id midkey (comp_rec lt) (comp_rec ge) in + mk_let_cell id str idx (comp_rec env) + +(* + Recursive 'list of cells' compile function: + - choose the matched cell and switch on it + - notice: patterns (and idx) all have the same length + *) + + let rec do_compile_pats idxs str default cases = + if dbg then begin + pp_match stderr "COMPILE" idxs cases + end ; + match idxs with + | [] -> + begin match cases with + | [] -> default + | (_,e)::_ -> e + end + | _::_ -> + let idxs,cases = best_first idxs cases in + begin match idxs with + | [] -> assert false + | idx::idxs -> + match_oncell + (do_compile_pats idxs) str default idx (by_cell cases) + end + + +(* Group by size *) + + module DivideInt = Divide(IntArg) + + + let by_size cases = + DivideInt.divide + (List.map + (fun (ps,_ as case) -> List.length ps,case) + cases) +(* + Switch according to pattern size + Argument from_ind is the starting index, it can be zero + or one (when the swicth on the cell 0 has already been performed. + In that latter case pattern len is string length-1 and is corrected. + *) + + let compile_by_size from_ind str default cases = + let size_cases = + List.map + (fun (len,cases) -> + let len = len+from_ind in + let act = + do_compile_pats + (interval from_ind len) + str default cases in + (len,act)) + (by_size cases) in + let id = gen_size_id () in + let switch = I.transl_switch (Cvar id) 1 max_int size_cases default in + mk_let_size id str switch + +(* + Compilation entry point: we choose to switch + either on size or on first cell, using the + 'least discriminant' heuristics. + *) + let top_compile str default cases = + let a_len = count_arities_length cases + and a_fst = count_arities_first cases in + if a_len <= a_fst then begin + if dbg then pp_cases stderr "SIZE" cases ; + compile_by_size 0 str default cases + end else begin + if dbg then pp_cases stderr "FIRST COL" cases ; + let compile_size_rest str default cases = + compile_by_size 1 str default cases in + match_oncell compile_size_rest str default 0 (by_cell cases) + end + +(* Module entry point *) + + let catch arg k = match arg with + | Cexit (e,[]) -> k arg + | _ -> + let e = next_raise_count () in + Ccatch (e,[],k (Cexit (e,[])),arg) + + let compile str default cases = +(* We do not attempt to really optimise default=None *) + let cases,default = match cases,default with + | (_,e)::cases,None + | cases,Some e -> cases,e + | [],None -> assert false in + let cases = + List.rev_map + (fun (s,act) -> pat_of_string s,act) + cases in + catch default (fun default -> top_compile str default cases) + + end diff --git a/asmcomp/strmatch.mli b/asmcomp/strmatch.mli new file mode 100644 index 00000000..143dae5c --- /dev/null +++ b/asmcomp/strmatch.mli @@ -0,0 +1,28 @@ +(***********************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* Translation of string matching from closed lambda to C-- *) + +module type I = sig + val string_block_length : Cmm.expression -> Cmm.expression + val transl_switch : + Cmm.expression -> int -> int -> + (int * Cmm.expression) list -> Cmm.expression -> + Cmm.expression +end + +module Make(I:I) : sig + (* Compile stringswitch (arg,cases,d) + Note: cases should not contain string duplicates *) + val compile : Cmm.expression (* arg *) -> Cmm.expression option (* d *) -> + (string * Cmm.expression) list (* cases *)-> Cmm.expression +end diff --git a/asmrun/.depend b/asmrun/.depend index c8e6f5c7..1088ad8e 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -60,7 +60,8 @@ fail.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ @@ -97,7 +98,7 @@ hash.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h ../byterun/int64_native.h + ../byterun/minor_gc.h ../byterun/hash.h intern.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ @@ -110,7 +111,7 @@ ints.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.h + ../byterun/misc.h ../byterun/mlvalues.h io.o: io.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ @@ -226,8 +227,7 @@ startup.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/printexc.h stack.h ../byterun/sys.h str.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/int64_native.h + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ @@ -311,7 +311,8 @@ fail.d.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.d.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ @@ -348,7 +349,7 @@ hash.d.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h ../byterun/int64_native.h + ../byterun/minor_gc.h ../byterun/hash.h intern.d.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ @@ -361,7 +362,7 @@ ints.d.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.h + ../byterun/misc.h ../byterun/mlvalues.h io.d.o: io.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ @@ -477,8 +478,7 @@ startup.d.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/printexc.h stack.h ../byterun/sys.h str.d.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/int64_native.h + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.d.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ @@ -562,7 +562,8 @@ fail.p.o: fail.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/fail.h ../byterun/io.h ../byterun/gc.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ ../byterun/minor_gc.h ../byterun/mlvalues.h ../byterun/printexc.h \ - ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h + ../byterun/signals.h stack.h ../byterun/roots.h ../byterun/memory.h \ + ../byterun/callback.h finalise.p.o: finalise.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/misc.h ../byterun/fail.h ../byterun/mlvalues.h \ @@ -599,7 +600,7 @@ hash.p.o: hash.c ../byterun/mlvalues.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/misc.h \ ../byterun/custom.h ../byterun/mlvalues.h ../byterun/memory.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/minor_gc.h ../byterun/hash.h ../byterun/int64_native.h + ../byterun/minor_gc.h ../byterun/hash.h intern.p.o: intern.c ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/../config/m.h ../byterun/../config/s.h \ ../byterun/mlvalues.h ../byterun/callback.h ../byterun/custom.h \ @@ -612,7 +613,7 @@ ints.p.o: ints.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/custom.h ../byterun/fail.h ../byterun/intext.h \ ../byterun/io.h ../byterun/memory.h ../byterun/gc.h \ ../byterun/major_gc.h ../byterun/freelist.h ../byterun/minor_gc.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/int64_native.h + ../byterun/misc.h ../byterun/mlvalues.h io.p.o: io.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/custom.h \ @@ -728,8 +729,7 @@ startup.p.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/printexc.h stack.h ../byterun/sys.h str.p.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ - ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/int64_native.h + ../byterun/fail.h ../byterun/mlvalues.h ../byterun/misc.h sys.p.o: sys.c ../byterun/config.h ../byterun/../config/m.h \ ../byterun/../config/s.h ../byterun/alloc.h ../byterun/misc.h \ ../byterun/config.h ../byterun/mlvalues.h ../byterun/debugger.h \ diff --git a/asmrun/Makefile b/asmrun/Makefile index 5ebf7aad..63ff80c6 100644 --- a/asmrun/Makefile +++ b/asmrun/Makefile @@ -24,8 +24,8 @@ COBJS=startup.o main.o fail.o roots.o globroots.o signals.o signals_asm.o \ misc.o freelist.o major_gc.o minor_gc.o memory.o alloc.o compare.o ints.o \ floats.o str.o array.o io.o extern.o intern.o hash.o sys.o parsing.o \ gc_ctrl.o terminfo.o md5.o obj.o lexing.o printexc.o callback.o weak.o \ - compact.o finalise.o custom.o unix.o backtrace.o natdynlink.o debugger.o \ - meta.o dynlink.o + compact.o finalise.o custom.o $(UNIX_OR_WIN32).o backtrace.o natdynlink.o\ + debugger.o meta.o dynlink.o ASMOBJS=$(ARCH).o @@ -60,26 +60,29 @@ libasmrunp.a: $(POBJS) ar rc libasmrunp.a $(POBJS) $(RANLIB) libasmrunp.a +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) + install: install-default install-$(RUNTIMED) install-$(PROFILING) install-default: - cp libasmrun.a $(LIBDIR)/libasmrun.a - cd $(LIBDIR); $(RANLIB) libasmrun.a + cp libasmrun.a $(INSTALL_LIBDIR)/libasmrun.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrun.a install-noruntimed: .PHONY: install-noruntimed install-runtimed: - cp libasmrund.a $(LIBDIR)/libasmrund.a - cd $(LIBDIR); $(RANLIB) libasmrund.a + cp libasmrund.a $(INSTALL_LIBDIR)/libasmrund.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrund.a .PHONY: install-runtimed install-noprof: - rm -f $(LIBDIR)/libasmrunp.a; ln -s libasmrun.a $(LIBDIR)/libasmrunp.a + rm -f $(INSTALL_LIBDIR)/libasmrunp.a + ln -s libasmrun.a $(INSTALL_LIBDIR)/libasmrunp.a install-prof: - cp libasmrunp.a $(LIBDIR)/libasmrunp.a - cd $(LIBDIR); $(RANLIB) libasmrunp.a + cp libasmrunp.a $(INSTALL_LIBDIR)/libasmrunp.a + cd $(INSTALL_LIBDIR); $(RANLIB) libasmrunp.a power-bsd_elf.S: power-elf.S cp power-elf.S power-bsd_elf.S @@ -152,8 +155,8 @@ meta.c: ../byterun/meta.c ln -s ../byterun/meta.c meta.c globroots.c: ../byterun/globroots.c ln -s ../byterun/globroots.c globroots.c -unix.c: ../byterun/unix.c - ln -s ../byterun/unix.c unix.c +$(UNIX_OR_WIN32).c: ../byterun/$(UNIX_OR_WIN32).c + ln -s ../byterun/$(UNIX_OR_WIN32).c $(UNIX_OR_WIN32).c dynlink.c: ../byterun/dynlink.c ln -s ../byterun/dynlink.c dynlink.c signals.c: ../byterun/signals.c @@ -164,8 +167,8 @@ debugger.c: ../byterun/debugger.c LINKEDFILES=misc.c freelist.c major_gc.c minor_gc.c memory.c alloc.c array.c \ compare.c ints.c floats.c str.c io.c extern.c intern.c hash.c sys.c \ parsing.c gc_ctrl.c terminfo.c md5.c obj.c lexing.c printexc.c callback.c \ - weak.c compact.c finalise.c meta.c custom.c main.c globroots.c unix.c \ - dynlink.c signals.c debugger.c + weak.c compact.c finalise.c meta.c custom.c main.c globroots.c \ + $(UNIX_OR_WIN32).c dynlink.c signals.c debugger.c clean:: rm -f $(LINKEDFILES) @@ -180,7 +183,7 @@ clean:: exit 2; } .S.p.o: - $(ASPP) -DSYS_$(SYSTEM) $(ASPPPROFFLAGS) -o $*.p.o $*.S + $(ASPP) -DSYS_$(SYSTEM) -DMODEL_$(MODEL) $(ASPPPROFFLAGS) -o $*.p.o $*.S .c.d.o: ln -s -f $*.c $*.d.c diff --git a/asmrun/Makefile.nt b/asmrun/Makefile.nt index 876fe602..77c2002d 100644 --- a/asmrun/Makefile.nt +++ b/asmrun/Makefile.nt @@ -56,8 +56,10 @@ i386.o: i386.S amd64.o: amd64.S $(ASPP) -DSYS_$(SYSTEM) amd64.S +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) + install: - cp libasmrun.$(A) $(LIBDIR) + cp libasmrun.$(A) $(INSTALL_LIBDIR) $(LINKEDFILES): %.c: ../byterun/%.c cp ../byterun/$*.c $*.c diff --git a/asmrun/amd64.S b/asmrun/amd64.S index aed5a964..d2e00752 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -32,7 +32,7 @@ .align FUNCTION_ALIGN; \ name: -#elif defined(SYS_mingw64) +#elif defined(SYS_mingw64) || defined(SYS_cygwin) #define LBL(x) .L##x #define G(r) r @@ -90,7 +90,7 @@ #endif -#if defined(__PIC__) && !defined(SYS_mingw64) +#if defined(__PIC__) && !defined(SYS_mingw64) && !defined(SYS_cygwin) /* Position-independent operations on global variables. */ @@ -99,6 +99,10 @@ movq GREL(dstlabel)(%rip), %r11 ; \ movq srcreg, (%r11) +#define STORE_VAR32(srcreg,dstlabel) \ + movq GREL(dstlabel)(%rip), %r11 ; \ + movl srcreg, (%r11) + /* Load global [srclabel] in register [dstreg]. Clobbers %r11. */ #define LOAD_VAR(srclabel,dstreg) \ movq GREL(srclabel)(%rip), %r11 ; \ @@ -144,6 +148,9 @@ #define STORE_VAR(srcreg,dstlabel) \ movq srcreg, G(dstlabel)(%rip) +#define STORE_VAR32(srcreg,dstlabel) \ + movl srcreg, G(dstlabel)(%rip) + #define LOAD_VAR(srclabel,dstreg) \ movq G(srclabel)(%rip), dstreg @@ -172,7 +179,7 @@ /* Save and restore all callee-save registers on stack. Keep the stack 16-aligned. */ -#if defined(SYS_mingw64) +#if defined(SYS_mingw64) || defined(SYS_cygwin) /* Win64 API: callee-save regs are rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15 */ @@ -242,7 +249,7 @@ #endif -#ifdef SYS_mingw64 +#if defined(SYS_mingw64) || defined (SYS_cygwin) /* Calls from OCaml to C must reserve 32 bytes of extra stack space */ # define PREPARE_FOR_C_CALL subq $32, %rsp; CFI_ADJUST(32) # define CLEANUP_AFTER_C_CALL addq $32, %rsp; CFI_ADJUST(-32) @@ -264,7 +271,7 @@ FUNCTION(G(caml_call_gc)) CFI_STARTPROC RECORD_STACK_FRAME(0) LBL(caml_call_gc): -#ifndef SYS_mingw64 +#if !defined(SYS_mingw64) && !defined(SYS_cygwin) /* Touch the stack to trigger a recoverable segfault if insufficient space remains */ subq $32768, %rsp @@ -441,7 +448,7 @@ LBL(caml_c_call): STORE_VAR(%r12, caml_last_return_address) STORE_VAR(%rsp, caml_bottom_of_stack) subq $8, %rsp; CFI_ADJUST(8) /* equivalent to pushq %r12 */ -#ifndef SYS_mingw64 +#if !defined(SYS_mingw64) && !defined(SYS_cygwin) /* Touch the stack to trigger a recoverable segfault if insufficient space remains */ subq $32768, %rsp @@ -510,7 +517,7 @@ CFI_ENDPROC /* Registers holding arguments of C functions. */ -#ifdef SYS_mingw64 +#if defined(SYS_mingw64) || defined(SYS_cygwin) #define C_ARG_1 %rcx #define C_ARG_2 %rdx #define C_ARG_3 %r8 @@ -532,6 +539,8 @@ CFI_STARTPROC popq %r14 ret LBL(110): + STORE_VAR32($0, caml_backtrace_pos) +LBL(111): movq %rax, %r12 /* Save exception bucket */ movq %rax, C_ARG_1 /* arg 1: exception bucket */ #ifdef WITH_FRAME_POINTERS @@ -553,18 +562,27 @@ LBL(110): ret CFI_ENDPROC +FUNCTION(G(caml_reraise_exn)) +CFI_STARTPROC + TESTL_VAR($1, caml_backtrace_active) + jne LBL(111) + movq %r14, %rsp + popq %r14 + ret +CFI_ENDPROC + /* Raise an exception from C */ FUNCTION(G(caml_raise_exception)) CFI_STARTPROC TESTL_VAR($1, caml_backtrace_active) - jne LBL(111) + jne LBL(112) movq C_ARG_1, %rax LOAD_VAR(caml_exception_pointer, %rsp) /* Cut stack */ popq %r14 /* Recover previous exception handler */ LOAD_VAR(caml_young_ptr, %r15) /* Reload alloc ptr */ ret -LBL(111): +LBL(112): #ifdef WITH_FRAME_POINTERS ENTER_FUNCTION ; #endif @@ -592,7 +610,7 @@ CFI_ENDPROC backtrace anyway. */ FUNCTION(G(caml_stack_overflow)) - LEA_VAR(caml_bucket_Stack_overflow, %rax) + LEA_VAR(caml_exn_Stack_overflow, %rax) movq %r14, %rsp /* cut the stack */ popq %r14 /* recover previous exn handler */ ret /* jump to handler's code */ @@ -656,7 +674,7 @@ G(caml_system__frametable): #if defined(SYS_macosx) .literal16 -#elif defined(SYS_mingw64) +#elif defined(SYS_mingw64) || defined(SYS_cygwin) .section .rdata,"dr" #else .section .rodata.cst8,"a",@progbits diff --git a/asmrun/amd64nt.asm b/asmrun/amd64nt.asm index e86ee72c..4883ba97 100644 --- a/asmrun/amd64nt.asm +++ b/asmrun/amd64nt.asm @@ -29,6 +29,7 @@ EXTRN caml_last_return_address: QWORD EXTRN caml_gc_regs: QWORD EXTRN caml_exception_pointer: QWORD + EXTRN caml_backtrace_pos: DWORD EXTRN caml_backtrace_active: DWORD EXTRN caml_stash_backtrace: NEAR @@ -306,6 +307,8 @@ caml_raise_exn: pop r14 ; Recover previous exception handler ret ; Branch to handler L110: + mov caml_backtrace_pos, 0 +L111: mov r12, rax ; Save exception bucket in r12 mov rcx, rax ; Arg 1: exception bucket mov rdx, [rsp] ; Arg 2: PC of raise @@ -318,19 +321,28 @@ L110: pop r14 ; Recover previous exception handler ret ; Branch to handler + PUBLIC caml_reraise_exn + ALIGN 16 +caml_reraise_exn: + test caml_backtrace_active, 1 + jne L111 + mov rsp, r14 ; Cut stack + pop r14 ; Recover previous exception handler + ret ; Branch to handler + ; Raise an exception from C PUBLIC caml_raise_exception ALIGN 16 caml_raise_exception: test caml_backtrace_active, 1 - jne L111 + jne L112 mov rax, rcx ; First argument is exn bucket mov rsp, caml_exception_pointer pop r14 ; Recover previous exception handler mov r15, caml_young_ptr ; Reload alloc ptr ret -L111: +L112: mov r12, rcx ; Save exception bucket in r12 ; Arg 1: exception bucket mov rdx, caml_last_return_address ; Arg 2: PC of raise diff --git a/asmrun/arm.S b/asmrun/arm.S index 2ce244a1..9720665a 100644 --- a/asmrun/arm.S +++ b/asmrun/arm.S @@ -44,6 +44,15 @@ cmp \reg, #0 beq \lbl .endm +#elif defined(SYS_freebsd) + .arch armv6 + .arm + + /* Compatibility macros */ + .macro cbz reg, lbl + cmp \reg, #0 + beq \lbl + .endm #endif trap_ptr .req r8 diff --git a/asmrun/arm64.S b/asmrun/arm64.S new file mode 100644 index 00000000..9b4b9ab7 --- /dev/null +++ b/asmrun/arm64.S @@ -0,0 +1,551 @@ +/***********************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Gallium, INRIA Rocquencourt */ +/* */ +/* Copyright 2013 Institut National de Recherche en Informatique et */ +/* en Automatique. All rights reserved. This file is distributed */ +/* under the terms of the GNU Library General Public License, with */ +/* the special exception on linking described in file ../LICENSE. */ +/* */ +/***********************************************************************/ + +/* Asm part of the runtime system, ARM processor, 64-bit mode */ +/* Must be preprocessed by cpp */ + +/* Special registers */ + +#define TRAP_PTR x26 +#define ALLOC_PTR x27 +#define ALLOC_LIMIT x28 +#define ARG x15 +#define TMP x16 +#define TMP2 x17 + +/* Support for CFI directives */ + +#if defined(ASM_CFI_SUPPORTED) +#define CFI_STARTPROC .cfi_startproc +#define CFI_ENDPROC .cfi_endproc +#define CFI_ADJUST(n) .cfi_adjust_cfa_offset n +#else +#define CFI_STARTPROC +#define CFI_ENDPROC +#define CFI_ADJUST(n) +#endif + +/* Support for profiling with gprof */ + +#define PROFILE + +/* Macros to load and store global variables. Destroy TMP2 */ + +#if defined(__PIC__) + +#define ADDRGLOBAL(reg,symb) \ + adrp TMP2, :got:symb; \ + ldr reg, [TMP2, #:got_lo12:symb] + +#define LOADGLOBAL(reg,symb) \ + ADDRGLOBAL(TMP2,symb); \ + ldr reg, [TMP2] + +#define STOREGLOBAL(reg,symb) \ + ADDRGLOBAL(TMP2,symb); \ + str reg, [TMP2] + +#else + +#define ADDRGLOBAL(reg,symb) \ + adrp reg, symb; \ + add reg, reg, #:lo12:symb + +#define LOADGLOBAL(reg,symb) \ + adrp TMP2, symb; \ + ldr reg, [TMP2, #:lo12:symb] + +#define STOREGLOBAL(reg,symb) \ + adrp TMP2, symb; \ + str reg, [TMP2, #:lo12:symb] + +#endif + +/* Allocation functions and GC interface */ + + .globl caml_system__code_begin +caml_system__code_begin: + + .align 2 + .globl caml_call_gc +caml_call_gc: + CFI_STARTPROC + PROFILE + /* Record return address */ + STOREGLOBAL(x30, caml_last_return_address) + /* Record lowest stack address */ + mov TMP, sp + STOREGLOBAL(TMP, caml_bottom_of_stack) +.Lcaml_call_gc: + /* Set up stack space, saving return address and frame pointer */ + /* (2 regs RA/GP, 24 allocatable int regs, 24 caller-save float regs) * 8 */ + stp x29, x30, [sp, -400]! + CFI_ADJUST(400) + add x29, sp, #0 + /* Save allocatable integer registers on the stack, in the order + given in proc.ml */ + stp x0, x1, [sp, 16] + stp x2, x3, [sp, 32] + stp x4, x5, [sp, 48] + stp x6, x7, [sp, 64] + stp x8, x9, [sp, 80] + stp x10, x11, [sp, 96] + stp x12, x13, [sp, 112] + stp x14, x15, [sp, 128] + stp x19, x20, [sp, 144] + stp x21, x22, [sp, 160] + stp x23, x24, [sp, 176] + str x25, [sp, 192] + /* Save caller-save floating-point registers on the stack + (callee-saves are preserved by caml_garbage_collection) */ + stp d0, d1, [sp, 208] + stp d2, d3, [sp, 224] + stp d4, d5, [sp, 240] + stp d6, d7, [sp, 256] + stp d16, d17, [sp, 272] + stp d18, d19, [sp, 288] + stp d20, d21, [sp, 304] + stp d22, d23, [sp, 320] + stp d24, d25, [sp, 336] + stp d26, d27, [sp, 352] + stp d28, d29, [sp, 368] + stp d30, d31, [sp, 384] + /* Store pointer to saved integer registers in caml_gc_regs */ + add TMP, sp, #16 + STOREGLOBAL(TMP, caml_gc_regs) + /* Save current allocation pointer for debugging purposes */ + STOREGLOBAL(ALLOC_PTR, caml_young_ptr) + /* Save trap pointer in case an exception is raised during GC */ + STOREGLOBAL(TRAP_PTR, caml_exception_pointer) + /* Call the garbage collector */ + bl caml_garbage_collection + /* Restore registers */ + ldp x0, x1, [sp, 16] + ldp x2, x3, [sp, 32] + ldp x4, x5, [sp, 48] + ldp x6, x7, [sp, 64] + ldp x8, x9, [sp, 80] + ldp x10, x11, [sp, 96] + ldp x12, x13, [sp, 112] + ldp x14, x15, [sp, 128] + ldp x19, x20, [sp, 144] + ldp x21, x22, [sp, 160] + ldp x23, x24, [sp, 176] + ldr x25, [sp, 192] + ldp d0, d1, [sp, 208] + ldp d2, d3, [sp, 224] + ldp d4, d5, [sp, 240] + ldp d6, d7, [sp, 256] + ldp d16, d17, [sp, 272] + ldp d18, d19, [sp, 288] + ldp d20, d21, [sp, 304] + ldp d22, d23, [sp, 320] + ldp d24, d25, [sp, 336] + ldp d26, d27, [sp, 352] + ldp d28, d29, [sp, 368] + ldp d30, d31, [sp, 384] + /* Reload new allocation pointer and allocation limit */ + LOADGLOBAL(ALLOC_PTR, caml_young_ptr) + LOADGLOBAL(ALLOC_LIMIT, caml_young_limit) + /* Free stack space and return to caller */ + ldp x29, x30, [sp], 400 + ret + CFI_ENDPROC + .type caml_call_gc, %function + .size caml_call_gc, .-caml_call_gc + + .align 2 + .globl caml_alloc1 +caml_alloc1: + CFI_STARTPROC + PROFILE +1: sub ALLOC_PTR, ALLOC_PTR, #16 + cmp ALLOC_PTR, ALLOC_LIMIT + b.lo 2f + ret +2: stp x29, x30, [sp, -16]! + CFI_ADJUST(16) + /* Record the lowest address of the caller's stack frame. This is the address + immediately above the pair of words (x29 and x30) we just pushed. Those must + not be included since otherwise the distance from [caml_bottom_of_stack] to the + highest address in the caller's stack frame won't match the frame size contained + in the relevant frame descriptor. */ + add x29, sp, #16 + STOREGLOBAL(x29, caml_bottom_of_stack) + add x29, sp, #0 + /* Record return address */ + STOREGLOBAL(x30, caml_last_return_address) + /* Call GC */ + bl .Lcaml_call_gc + /* Restore return address */ + ldp x29, x30, [sp], 16 + CFI_ADJUST(-16) + /* Try again */ + b 1b + CFI_ENDPROC + .type caml_alloc1, %function + .size caml_alloc1, .-caml_alloc1 + + .align 2 + .globl caml_alloc2 +caml_alloc2: + CFI_STARTPROC + PROFILE +1: sub ALLOC_PTR, ALLOC_PTR, #24 + cmp ALLOC_PTR, ALLOC_LIMIT + b.lo 2f + ret +2: stp x29, x30, [sp, -16]! + CFI_ADJUST(16) + /* Record the lowest address of the caller's stack frame. See comment above. */ + add x29, sp, #16 + STOREGLOBAL(x29, caml_bottom_of_stack) + add x29, sp, #0 + /* Record return address */ + STOREGLOBAL(x30, caml_last_return_address) + /* Call GC */ + bl .Lcaml_call_gc + /* Restore return address */ + ldp x29, x30, [sp], 16 + CFI_ADJUST(-16) + /* Try again */ + b 1b + CFI_ENDPROC + .type caml_alloc2, %function + .size caml_alloc2, .-caml_alloc2 + + .align 2 + .globl caml_alloc3 +caml_alloc3: + CFI_STARTPROC + PROFILE +1: sub ALLOC_PTR, ALLOC_PTR, #32 + cmp ALLOC_PTR, ALLOC_LIMIT + b.lo 2f + ret +2: stp x29, x30, [sp, -16]! + CFI_ADJUST(16) + /* Record the lowest address of the caller's stack frame. See comment above. */ + add x29, sp, #16 + STOREGLOBAL(x29, caml_bottom_of_stack) + add x29, sp, #0 + /* Record return address */ + STOREGLOBAL(x30, caml_last_return_address) + /* Call GC */ + bl .Lcaml_call_gc + /* Restore return address */ + ldp x29, x30, [sp], 16 + CFI_ADJUST(-16) + /* Try again */ + b 1b + CFI_ENDPROC + .type caml_alloc2, %function + .size caml_alloc2, .-caml_alloc2 + + .align 2 + .globl caml_allocN +caml_allocN: + CFI_STARTPROC + PROFILE +1: sub ALLOC_PTR, ALLOC_PTR, ARG + cmp ALLOC_PTR, ALLOC_LIMIT + b.lo 2f + ret +2: stp x29, x30, [sp, -16]! + CFI_ADJUST(16) + /* Record the lowest address of the caller's stack frame. See comment above. */ + add x29, sp, #16 + STOREGLOBAL(x29, caml_bottom_of_stack) + add x29, sp, #0 + /* Record return address */ + STOREGLOBAL(x30, caml_last_return_address) + /* Call GC. This preserves ARG */ + bl .Lcaml_call_gc + /* Restore return address */ + ldp x29, x30, [sp], 16 + CFI_ADJUST(-16) + /* Try again */ + b 1b + CFI_ENDPROC + .type caml_allocN, %function + .size caml_allocN, .-caml_allocN + +/* Call a C function from OCaml */ +/* Function to call is in ARG */ + + .align 2 + .globl caml_c_call +caml_c_call: + CFI_STARTPROC + PROFILE + /* Preserve return address in callee-save register x19 */ + mov x19, x30 + /* Record lowest stack address and return address */ + STOREGLOBAL(x30, caml_last_return_address) + add TMP, sp, #0 + STOREGLOBAL(TMP, caml_bottom_of_stack) + /* Make the exception handler alloc ptr available to the C code */ + STOREGLOBAL(ALLOC_PTR, caml_young_ptr) + STOREGLOBAL(TRAP_PTR, caml_exception_pointer) + /* Call the function */ + blr ARG + /* Reload alloc ptr and alloc limit */ + LOADGLOBAL(ALLOC_PTR, caml_young_ptr) + LOADGLOBAL(ALLOC_LIMIT, caml_young_limit) + /* Return */ + ret x19 + CFI_ENDPROC + .type caml_c_call, %function + .size caml_c_call, .-caml_c_call + +/* Start the OCaml program */ + + .align 2 + .globl caml_start_program +caml_start_program: + CFI_STARTPROC + PROFILE + ADDRGLOBAL(ARG, caml_program) + +/* Code shared with caml_callback* */ +/* Address of OCaml code to call is in ARG */ +/* Arguments to the OCaml code are in x0...x7 */ + +.Ljump_to_caml: + /* Set up stack frame and save callee-save registers */ + stp x29, x30, [sp, -160]! + CFI_ADJUST(160) + add x29, sp, #0 + stp x19, x20, [sp, 16] + stp x21, x22, [sp, 32] + stp x23, x24, [sp, 48] + stp x25, x26, [sp, 64] + stp x27, x28, [sp, 80] + stp d8, d9, [sp, 96] + stp d10, d11, [sp, 112] + stp d12, d13, [sp, 128] + stp d14, d15, [sp, 144] + /* Setup a callback link on the stack */ + LOADGLOBAL(x8, caml_bottom_of_stack) + LOADGLOBAL(x9, caml_last_return_address) + LOADGLOBAL(x10, caml_gc_regs) + stp x8, x9, [sp, -32]! /* 16-byte alignment */ + CFI_ADJUST(32) + str x10, [sp, 16] + /* Setup a trap frame to catch exceptions escaping the OCaml code */ + LOADGLOBAL(x8, caml_exception_pointer) + adr x9, .Ltrap_handler + stp x8, x9, [sp, -16]! + CFI_ADJUST(16) + add TRAP_PTR, sp, #0 + /* Reload allocation pointers */ + LOADGLOBAL(ALLOC_PTR, caml_young_ptr) + LOADGLOBAL(ALLOC_LIMIT, caml_young_limit) + /* Call the OCaml code */ + blr ARG +.Lcaml_retaddr: + /* Pop the trap frame, restoring caml_exception_pointer */ + ldr x8, [sp], 16 + CFI_ADJUST(-16) + STOREGLOBAL(x8, caml_exception_pointer) + /* Pop the callback link, restoring the global variables */ +.Lreturn_result: + ldr x10, [sp, 16] + ldp x8, x9, [sp], 32 + CFI_ADJUST(-32) + STOREGLOBAL(x8, caml_bottom_of_stack) + STOREGLOBAL(x9, caml_last_return_address) + STOREGLOBAL(x10, caml_gc_regs) + /* Update allocation pointer */ + STOREGLOBAL(ALLOC_PTR, caml_young_ptr) + /* Reload callee-save registers and return address */ + ldp x19, x20, [sp, 16] + ldp x21, x22, [sp, 32] + ldp x23, x24, [sp, 48] + ldp x25, x26, [sp, 64] + ldp x27, x28, [sp, 80] + ldp d8, d9, [sp, 96] + ldp d10, d11, [sp, 112] + ldp d12, d13, [sp, 128] + ldp d14, d15, [sp, 144] + ldp x29, x30, [sp], 160 + CFI_ADJUST(-160) + /* Return to C caller */ + ret + CFI_ENDPROC + .type .Lcaml_retaddr, %function + .size .Lcaml_retaddr, .-.Lcaml_retaddr + .type caml_start_program, %function + .size caml_start_program, .-caml_start_program + +/* The trap handler */ + + .align 2 +.Ltrap_handler: + CFI_STARTPROC + /* Save exception pointer */ + STOREGLOBAL(TRAP_PTR, caml_exception_pointer) + /* Encode exception bucket as an exception result */ + orr x0, x0, #2 + /* Return it */ + b .Lreturn_result + CFI_ENDPROC + .type .Ltrap_handler, %function + .size .Ltrap_handler, .-.Ltrap_handler + +/* Raise an exception from OCaml */ + + .align 2 + .globl caml_raise_exn +caml_raise_exn: + CFI_STARTPROC + PROFILE + /* Test if backtrace is active */ + LOADGLOBAL(TMP, caml_backtrace_active) + cbnz TMP, 2f +1: /* Cut stack at current trap handler */ + mov sp, TRAP_PTR + /* Pop previous handler and jump to it */ + ldr TMP, [sp, 8] + ldr TRAP_PTR, [sp], 16 + br TMP +2: /* Preserve exception bucket in callee-save register x19 */ + mov x19, x0 + /* Stash the backtrace */ + /* arg1: exn bucket, already in x0 */ + mov x1, x30 /* arg2: pc of raise */ + add x2, sp, #0 /* arg3: sp of raise */ + mov x3, TRAP_PTR /* arg4: sp of handler */ + bl caml_stash_backtrace + /* Restore exception bucket and raise */ + mov x0, x19 + b 1b + CFI_ENDPROC + .type caml_raise_exn, %function + .size caml_raise_exn, .-caml_raise_exn + +/* Raise an exception from C */ + + .align 2 + .globl caml_raise_exception +caml_raise_exception: + CFI_STARTPROC + PROFILE + /* Reload trap ptr, alloc ptr and alloc limit */ + LOADGLOBAL(TRAP_PTR, caml_exception_pointer) + LOADGLOBAL(ALLOC_PTR, caml_young_ptr) + LOADGLOBAL(ALLOC_LIMIT, caml_young_limit) + /* Test if backtrace is active */ + LOADGLOBAL(TMP, caml_backtrace_active) + cbnz TMP, 2f +1: /* Cut stack at current trap handler */ + mov sp, TRAP_PTR + /* Pop previous handler and jump to it */ + ldr TMP, [sp, 8] + ldr TRAP_PTR, [sp], 16 + br TMP +2: /* Preserve exception bucket in callee-save register x19 */ + mov x19, x0 + /* Stash the backtrace */ + /* arg1: exn bucket, already in x0 */ + LOADGLOBAL(x1, caml_last_return_address) /* arg2: pc of raise */ + LOADGLOBAL(x2, caml_bottom_of_stack) /* arg3: sp of raise */ + mov x3, TRAP_PTR /* arg4: sp of handler */ + bl caml_stash_backtrace + /* Restore exception bucket and raise */ + mov x0, x19 + b 1b + CFI_ENDPROC + .type caml_raise_exception, %function + .size caml_raise_exception, .-caml_raise_exception + +/* Callback from C to OCaml */ + + .align 2 + .globl caml_callback_exn +caml_callback_exn: + CFI_STARTPROC + PROFILE + /* Initial shuffling of arguments (x0 = closure, x1 = first arg) */ + mov TMP, x0 + mov x0, x1 /* x0 = first arg */ + mov x1, TMP /* x1 = closure environment */ + ldr ARG, [TMP] /* code pointer */ + b .Ljump_to_caml + CFI_ENDPROC + .type caml_callback_exn, %function + .size caml_callback_exn, .-caml_callback_exn + + .align 2 + .globl caml_callback2_exn +caml_callback2_exn: + CFI_STARTPROC + PROFILE + /* Initial shuffling of arguments (x0 = closure, x1 = arg1, x2 = arg2) */ + mov TMP, x0 + mov x0, x1 /* x0 = first arg */ + mov x1, x2 /* x1 = second arg */ + mov x2, TMP /* x2 = closure environment */ + ADDRGLOBAL(ARG, caml_apply2) + b .Ljump_to_caml + CFI_ENDPROC + .type caml_callback2_exn, %function + .size caml_callback2_exn, .-caml_callback2_exn + + .align 2 + .globl caml_callback3_exn +caml_callback3_exn: + CFI_STARTPROC + PROFILE + /* Initial shuffling of arguments */ + /* (x0 = closure, x1 = arg1, x2 = arg2, x3 = arg3) */ + mov TMP, x0 + mov x0, x1 /* x0 = first arg */ + mov x1, x2 /* x1 = second arg */ + mov x2, x3 /* x2 = third arg */ + mov x3, TMP /* x3 = closure environment */ + ADDRGLOBAL(ARG, caml_apply3) + b .Ljump_to_caml + CFI_ENDPROC + .type caml_callback3_exn, %function + .size caml_callback3_exn, .-caml_callback3_exn + + .align 2 + .globl caml_ml_array_bound_error +caml_ml_array_bound_error: + CFI_STARTPROC + PROFILE + /* Load address of [caml_array_bound_error] in ARG */ + ADDRGLOBAL(ARG, caml_array_bound_error) + /* Call that function */ + b caml_c_call + CFI_ENDPROC + .type caml_ml_array_bound_error, %function + .size caml_ml_array_bound_error, .-caml_ml_array_bound_error + + .globl caml_system__code_end +caml_system__code_end: + +/* GC roots for callback */ + + .data + .align 3 + .globl caml_system__frametable +caml_system__frametable: + .quad 1 /* one descriptor */ + .quad .Lcaml_retaddr /* return address into callback */ + .short -1 /* negative frame size => use callback link */ + .short 0 /* no roots */ + .align 3 + .type caml_system__frametable, %object + .size caml_system__frametable, .-caml_system__frametable diff --git a/asmrun/backtrace.c b/asmrun/backtrace.c index 3854967c..c72a2373 100644 --- a/asmrun/backtrace.c +++ b/asmrun/backtrace.c @@ -30,6 +30,17 @@ code_t * caml_backtrace_buffer = NULL; value caml_backtrace_last_exn = Val_unit; #define BACKTRACE_BUFFER_SIZE 1024 +/* In order to prevent the GC from walking through the debug information + (which have no headers), we transform frame_descr pointers into + 31/63 bits ocaml integers by shifting them by 1 to the right. We do + not lose information as descr pointers are aligned. + + In particular, we do not need to use [caml_initialize] when setting + an array element with such a value. +*/ +#define Val_Descrptr(descr) Val_long((uintnat)descr>>1) +#define Descrptr_Val(v) ((frame_descr *) (Long_val(v)<<1)) + /* Start or stop the backtrace machinery */ CAMLprim value caml_record_backtrace(value vflag) @@ -112,6 +123,7 @@ void caml_stash_backtrace(value exn, uintnat pc, char * sp, char * trapsp) caml_backtrace_last_exn = exn; } if (caml_backtrace_buffer == NULL) { + Assert(caml_backtrace_pos == 0); caml_backtrace_buffer = malloc(BACKTRACE_BUFFER_SIZE * sizeof(code_t)); if (caml_backtrace_buffer == NULL) return; } @@ -172,7 +184,7 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { } } - trace = caml_alloc((mlsize_t) trace_size, Abstract_tag); + trace = caml_alloc((mlsize_t) trace_size, 0); /* then collect the trace */ { @@ -183,11 +195,7 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { for (trace_pos = 0; trace_pos < trace_size; trace_pos++) { frame_descr * descr = caml_next_frame_descriptor(&pc, &sp); Assert(descr != NULL); - /* The assignment below is safe without [caml_initialize], even - if the trace is large and allocated on the old heap, because - we assign values that are outside the OCaml heap. */ - Assert(!(Is_block((value) descr) && Is_in_heap((value) descr))); - Field(trace, trace_pos) = (value) descr; + Field(trace, trace_pos) = Val_Descrptr(descr); } } @@ -295,31 +303,27 @@ void caml_print_exception_backtrace(void) /* Convert the raw backtrace to a data structure usable from OCaml */ -CAMLprim value caml_convert_raw_backtrace(value backtrace) { - CAMLparam1(backtrace); - CAMLlocal4(res, arr, p, fname); - int i; +CAMLprim value caml_convert_raw_backtrace_slot(value backtrace_slot) { + CAMLparam1(backtrace_slot); + CAMLlocal2(p, fname); struct loc_info li; - arr = caml_alloc(Wosize_val(backtrace), 0); - for (i = 0; i < Wosize_val(backtrace); i++) { - extract_location_info((frame_descr *) Field(backtrace, i), &li); - if (li.loc_valid) { - fname = caml_copy_string(li.loc_filename); - p = caml_alloc_small(5, 0); - Field(p, 0) = Val_bool(li.loc_is_raise); - Field(p, 1) = fname; - Field(p, 2) = Val_int(li.loc_lnum); - Field(p, 3) = Val_int(li.loc_startchr); - Field(p, 4) = Val_int(li.loc_endchr); - } else { - p = caml_alloc_small(1, 1); - Field(p, 0) = Val_bool(li.loc_is_raise); - } - caml_modify(&Field(arr, i), p); + extract_location_info(Descrptr_Val(backtrace_slot), &li); + + if (li.loc_valid) { + fname = caml_copy_string(li.loc_filename); + p = caml_alloc_small(5, 0); + Field(p, 0) = Val_bool(li.loc_is_raise); + Field(p, 1) = fname; + Field(p, 2) = Val_int(li.loc_lnum); + Field(p, 3) = Val_int(li.loc_startchr); + Field(p, 4) = Val_int(li.loc_endchr); + } else { + p = caml_alloc_small(1, 1); + Field(p, 0) = Val_bool(li.loc_is_raise); } - res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ - CAMLreturn(res); + + CAMLreturn(p); } /* Get a copy of the latest backtrace */ @@ -328,10 +332,13 @@ CAMLprim value caml_get_exception_raw_backtrace(value unit) { CAMLparam0(); CAMLlocal1(res); - res = caml_alloc(caml_backtrace_pos, Abstract_tag); - if(caml_backtrace_buffer != NULL) - memcpy(&Field(res, 0), caml_backtrace_buffer, - caml_backtrace_pos * sizeof(code_t)); + + res = caml_alloc(caml_backtrace_pos, 0); + if(caml_backtrace_buffer != NULL) { + intnat i; + for(i = 0; i < caml_backtrace_pos; i++) + Field(res, i) = Val_Descrptr(caml_backtrace_buffer[i]); + } CAMLreturn(res); } @@ -348,8 +355,19 @@ CAMLprim value caml_get_exception_raw_backtrace(value unit) CAMLprim value caml_get_exception_backtrace(value unit) { CAMLparam0(); - CAMLlocal2(raw,res); - raw = caml_get_exception_raw_backtrace(unit); - res = caml_convert_raw_backtrace(raw); + CAMLlocal4(arr, raw_slot, slot, res); + + arr = caml_alloc(caml_backtrace_pos, 0); + if (caml_backtrace_buffer == NULL) { + Assert(caml_backtrace_pos == 0); + } else { + intnat i; + for(i = 0; i < caml_backtrace_pos; i++) { + raw_slot = Val_Descrptr(caml_backtrace_buffer[i]); + slot = caml_convert_raw_backtrace_slot(raw_slot); + caml_modify(&Field(arr, i), slot); + } + } + res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ CAMLreturn(res); } diff --git a/asmrun/fail.c b/asmrun/fail.c index 09a9af96..cb2c1cbd 100644 --- a/asmrun/fail.c +++ b/asmrun/fail.c @@ -13,6 +13,7 @@ /* Raising exceptions from C. */ +#include #include #include "alloc.h" #include "fail.h" @@ -24,6 +25,7 @@ #include "signals.h" #include "stack.h" #include "roots.h" +#include "callback.h" /* The globals holding predefined exceptions */ @@ -42,9 +44,6 @@ extern caml_generated_constant caml_exn_Stack_overflow, caml_exn_Assert_failure, caml_exn_Undefined_recursive_module; -extern caml_generated_constant - caml_bucket_Out_of_memory, - caml_bucket_Stack_overflow; /* Exception raising */ @@ -73,13 +72,7 @@ void caml_raise(value v) void caml_raise_constant(value tag) { - CAMLparam1 (tag); - CAMLlocal1 (bucket); - - bucket = caml_alloc_small (1, 0); - Field(bucket, 0) = tag; - caml_raise(bucket); - CAMLnoreturn; + caml_raise(tag); } void caml_raise_with_arg(value tag, value arg) @@ -111,7 +104,10 @@ void caml_raise_with_args(value tag, int nargs, value args[]) void caml_raise_with_string(value tag, char const *msg) { - caml_raise_with_arg(tag, caml_copy_string(msg)); + CAMLparam1(tag); + value v_msg = caml_copy_string(msg); + caml_raise_with_arg(tag, v_msg); + CAMLnoreturn; } void caml_failwith (char const *msg) @@ -124,22 +120,14 @@ void caml_invalid_argument (char const *msg) caml_raise_with_string((value) caml_exn_Invalid_argument, msg); } -/* To raise [Out_of_memory], we can't use [caml_raise_constant], - because it allocates and we're out of memory... - We therefore use a statically-allocated bucket constructed - by the ocamlopt linker. - This works OK because the exception value for [Out_of_memory] is also - statically allocated out of the heap. - The same applies to Stack_overflow. */ - void caml_raise_out_of_memory(void) { - caml_raise((value) &caml_bucket_Out_of_memory); + caml_raise_constant((value) caml_exn_Out_of_memory); } void caml_raise_stack_overflow(void) { - caml_raise((value) &caml_bucket_Stack_overflow); + caml_raise_constant((value) caml_exn_Stack_overflow); } void caml_raise_sys_error(value msg) @@ -167,43 +155,24 @@ void caml_raise_sys_blocked_io(void) caml_raise_constant((value) caml_exn_Sys_blocked_io); } -/* We allocate statically the bucket for the exception because we can't +/* We use a pre-allocated exception because we can't do a GC before the exception is raised (lack of stack descriptors - for the ccall to [caml_array_bound_error]. */ - -#define BOUND_MSG "index out of bounds" -#define BOUND_MSG_LEN (sizeof(BOUND_MSG) - 1) - -static struct { - header_t hdr; - value exn; - value arg; -} array_bound_error_bucket; - -static struct { - header_t hdr; - char data[BOUND_MSG_LEN + sizeof(value)]; -} array_bound_error_msg = { 0, BOUND_MSG }; + for the ccall to [caml_array_bound_error]). */ -static int array_bound_error_bucket_inited = 0; +static value * caml_array_bound_error_exn = NULL; void caml_array_bound_error(void) { - if (! array_bound_error_bucket_inited) { - mlsize_t wosize = (BOUND_MSG_LEN + sizeof(value)) / sizeof(value); - mlsize_t offset_index = Bsize_wsize(wosize) - 1; - array_bound_error_msg.hdr = Make_header(wosize, String_tag, Caml_white); - array_bound_error_msg.data[offset_index] = offset_index - BOUND_MSG_LEN; - array_bound_error_bucket.hdr = Make_header(2, 0, Caml_white); - array_bound_error_bucket.exn = (value) caml_exn_Invalid_argument; - array_bound_error_bucket.arg = (value) array_bound_error_msg.data; - array_bound_error_bucket_inited = 1; - caml_page_table_add(In_static_data, - &array_bound_error_msg, - &array_bound_error_msg + 1); - array_bound_error_bucket_inited = 1; + if (caml_array_bound_error_exn == NULL) { + caml_array_bound_error_exn = + caml_named_value("Pervasives.array_bound_error"); + if (caml_array_bound_error_exn == NULL) { + fprintf(stderr, "Fatal error: exception " + "Invalid_argument(\"index out of bounds\")\n"); + exit(2); + } } - caml_raise((value) &array_bound_error_bucket.exn); + caml_raise(*caml_array_bound_error_exn); } int caml_is_special_exception(value exn) { diff --git a/asmrun/i386.S b/asmrun/i386.S index 306c9a58..347e967c 100644 --- a/asmrun/i386.S +++ b/asmrun/i386.S @@ -115,13 +115,10 @@ #define PROFILE_C #endif -#ifdef SYS_macosx +/* PR#6038: GCC and Clang seem to require 16-byte alignment nowadays, + even if only MacOS X's ABI formally requires it. */ #define ALIGN_STACK(amount) subl $ amount, %esp ; CFI_ADJUST(amount) #define UNDO_ALIGN_STACK(amount) addl $ amount, %esp ; CFI_ADJUST(-amount) -#else -#define ALIGN_STACK(amount) -#define UNDO_ALIGN_STACK(amount) -#endif /* Allocation */ @@ -304,11 +301,7 @@ LBL(106): LBL(107): /* Pop the exception handler */ popl G(caml_exception_pointer); CFI_ADJUST(-4) -#ifdef SYS_macosx addl $12, %esp ; CFI_ADJUST(-12) -#else - addl $4, %esp ; CFI_ADJUST(-4) -#endif LBL(109): /* Pop the callback link, restoring the global variables */ popl G(caml_bottom_of_stack); CFI_ADJUST(-4) @@ -339,6 +332,8 @@ FUNCTION(caml_raise_exn) UNDO_ALIGN_STACK(8) ret LBL(110): + movl $0, G(caml_backtrace_pos) +LBL(111): movl %eax, %esi /* Save exception bucket in esi */ movl G(caml_exception_pointer), %edi /* SP of handler */ movl 0(%esp), %eax /* PC of raise */ @@ -356,19 +351,29 @@ LBL(110): ret CFI_ENDPROC +FUNCTION(caml_reraise_exn) + CFI_STARTPROC + testl $1, G(caml_backtrace_active) + jne LBL(111) + movl G(caml_exception_pointer), %esp + popl G(caml_exception_pointer); CFI_ADJUST(-4) + UNDO_ALIGN_STACK(8) + ret + CFI_ENDPROC + /* Raise an exception from C */ FUNCTION(caml_raise_exception) CFI_STARTPROC PROFILE_C testl $1, G(caml_backtrace_active) - jne LBL(111) + jne LBL(112) movl 4(%esp), %eax movl G(caml_exception_pointer), %esp popl G(caml_exception_pointer); CFI_ADJUST(-4) UNDO_ALIGN_STACK(8) ret -LBL(111): +LBL(112): movl 4(%esp), %esi /* Save exception bucket in esi */ ALIGN_STACK(12) pushl G(caml_exception_pointer); CFI_ADJUST(4) /* 4: sp of handler */ @@ -449,10 +454,8 @@ FUNCTION(caml_ml_array_bound_error) movl %edx, G(caml_last_return_address) leal 4(%esp), %edx movl %edx, G(caml_bottom_of_stack) - /* For MacOS X: re-align the stack */ -#ifdef SYS_macosx + /* Re-align the stack */ andl $-16, %esp -#endif /* Branch to [caml_array_bound_error] (never returns) */ call G(caml_array_bound_error) CFI_ENDPROC diff --git a/asmrun/i386nt.asm b/asmrun/i386nt.asm index d7449741..61ec3416 100644 --- a/asmrun/i386nt.asm +++ b/asmrun/i386nt.asm @@ -27,6 +27,7 @@ EXTERN _caml_last_return_address: DWORD EXTERN _caml_gc_regs: DWORD EXTERN _caml_exception_pointer: DWORD + EXTERN _caml_backtrace_pos: DWORD EXTERN _caml_backtrace_active: DWORD EXTERN _caml_stash_backtrace: PROC @@ -205,6 +206,8 @@ _caml_raise_exn: pop _caml_exception_pointer ret L110: + mov _caml_backtrace_pos, 0 +L111: mov esi, eax ; Save exception bucket in esi mov edi, _caml_exception_pointer ; SP of handler mov eax, [esp] ; PC of raise @@ -219,18 +222,27 @@ L110: pop _caml_exception_pointer ret -; Raise an exception from C + PUBLIC _caml_reraise_exn + ALIGN 4 +_caml_reraise_exn: + test _caml_backtrace_active, 1 + jne L111 + mov esp, _caml_exception_pointer + pop _caml_exception_pointer + ret + + ; Raise an exception from C PUBLIC _caml_raise_exception ALIGN 4 _caml_raise_exception: test _caml_backtrace_active, 1 - jne L111 + jne L112 mov eax, [esp+4] mov esp, _caml_exception_pointer pop _caml_exception_pointer ret -L111: +L112: mov esi, [esp+4] ; Save exception bucket in esi push _caml_exception_pointer ; arg 4: SP of handler push _caml_bottom_of_stack ; arg 3: SP of raise diff --git a/asmrun/natdynlink.c b/asmrun/natdynlink.c index edb389db..86c4f3e6 100644 --- a/asmrun/natdynlink.c +++ b/asmrun/natdynlink.c @@ -25,12 +25,11 @@ #include static void *getsym(void *handle, char *module, char *name){ - char *fullname = malloc(strlen(module) + strlen(name) + 5); + char *fullname = caml_strconcat(3, "caml", module, name); void *sym; - sprintf(fullname, "caml%s%s", module, name); sym = caml_dlsym (handle, fullname); /* printf("%s => %lx\n", fullname, (uintnat) sym); */ - free(fullname); + caml_stat_free(fullname); return sym; } diff --git a/asmrun/power-elf.S b/asmrun/power-elf.S index 94f4a29d..facbfbf0 100644 --- a/asmrun/power-elf.S +++ b/asmrun/power-elf.S @@ -200,31 +200,87 @@ caml_c_call: /* Reload allocation pointer and allocation limit*/ Loadglobal(31, caml_young_ptr, 11) Loadglobal(30, caml_young_limit, 11) - /* Say we are back into OCaml code */ - li 12, 0 - Storeglobal(12, caml_last_return_address, 11) /* Return to caller */ blr +/* Raise an exception from OCaml */ + .globl caml_raise_exn + .type caml_raise_exn, @function +caml_raise_exn: + Loadglobal(0, caml_backtrace_active, 11) + cmpwi 0, 0 + bne .L111 +.L110: + /* Pop trap frame */ + lwz 0, 0(29) + mr 1, 29 + mtctr 0 + lwz 29, 4(29) + addi 1, 1, 16 + /* Branch to handler */ + bctr +.L111: + li 0, 0 + Storeglobal(0, caml_backtrace_pos, 11) +.L112: + mr 28, 3 /* preserve exn bucket in callee-save reg */ + /* arg1: exception bucket, already in r3 */ + mflr 4 /* arg2: PC of raise */ + mr 5, 1 /* arg3: SP of raise */ + mr 6, 29 /* arg4: SP of handler */ + addi 1, 1, -16 /* reserve stack space for C call */ + bl caml_stash_backtrace + mr 3, 28 /* restore exn bucket */ + b .L110 /* raise the exn */ + + .globl caml_reraise_exn + .type caml_reraise_exn, @function +caml_reraise_exn: + Loadglobal(0, caml_backtrace_active, 11) + cmpwi 0, 0 + bne- .L112 + /* Pop trap frame */ + lwz 0, 0(29) + mr 1, 29 + mtctr 0 + lwz 29, 4(29) + addi 1, 1, 16 + /* Branch to handler */ + bctr + /* Raise an exception from C */ .globl caml_raise_exception .type caml_raise_exception, @function caml_raise_exception: + Loadglobal(0, caml_backtrace_active, 11) + cmpwi 0, 0 + bne .L121 +.L120: /* Reload OCaml global registers */ Loadglobal(1, caml_exception_pointer, 11) Loadglobal(31, caml_young_ptr, 11) Loadglobal(30, caml_young_limit, 11) - /* Say we are back into OCaml code */ - li 0, 0 - Storeglobal(0, caml_last_return_address, 11) /* Pop trap frame */ lwz 0, 0(1) lwz 29, 4(1) - mtlr 0 + mtctr 0 addi 1, 1, 16 /* Branch to handler */ - blr + bctr +.L121: + li 0, 0 + Storeglobal(0, caml_backtrace_pos, 11) + mr 28, 3 /* preserve exn bucket in callee-save reg */ + /* arg1: exception bucket, already in r3 */ + Loadglobal(4, caml_last_return_address, 11) /* arg2: PC of raise */ + Loadglobal(5, caml_bottom_of_stack, 11) /* arg3: SP of raise */ + Loadglobal(6, caml_exception_pointer, 11) /* arg4: SP of handler */ + addi 1, 1, -16 /* reserve stack space for C call */ + bl caml_stash_backtrace + mr 3, 28 /* restore exn bucket */ + b .L120 /* raise the exn */ + /* Start the OCaml program */ diff --git a/asmrun/power-rhapsody.S b/asmrun/power-rhapsody.S index 309c955b..6fcb43cc 100644 --- a/asmrun/power-rhapsody.S +++ b/asmrun/power-rhapsody.S @@ -36,6 +36,14 @@ addis $2, 0, ha16($1) stg $0, lo16($1)($2) .endmacro +.macro Loadglobal32 /* reg,glob,tmp */ + addis $2, 0, ha16($1) + lwz $0, lo16($1)($2) +.endmacro +.macro Storeglobal32 /* reg,glob,tmp */ + addis $2, 0, ha16($1) + stw $0, lo16($1)($2) +.endmacro .text @@ -234,21 +242,22 @@ _caml_c_call: /* Raise an exception from OCaml */ .globl _caml_raise_exn _caml_raise_exn: - addis r11, 0, ha16(_caml_backtrace_active) - lwz r11, lo16(_caml_backtrace_active)(r11) + Loadglobal32 r11, _caml_backtrace_active, r11 cmpwi r11, 0 bne L110 L111: /* Pop trap frame */ lg r0, 0(r29) mr r1, r29 - mtlr r0 + mtctr r0 lg r29, WORD(r1) addi r1, r1, 16 /* Branch to handler */ - blr - + bctr L110: + li r0, 0 + Storeglobal32 r0, _caml_backtrace_pos, r11 +L114: mr r28, r3 /* preserve exn bucket in callee-save */ /* arg 1: exception bucket (already in r3) */ mflr r4 /* arg 2: PC of raise */ @@ -259,12 +268,25 @@ L110: mr r3, r28 b L111 -/* Raise an exception from C */ + .globl _caml_reraise_exn +_caml_reraise_exn: + Loadglobal32 r11, _caml_backtrace_active, r11 + cmpwi r11, 0 + bne- L114 + /* Pop trap frame */ + lg r0, 0(r29) + mr r1, r29 + mtctr r0 + lg r29, WORD(r1) + addi r1, r1, 16 + /* Branch to handler */ + bctr + + /* Raise an exception from C */ .globl _caml_raise_exception _caml_raise_exception: - addis r11, 0, ha16(_caml_backtrace_active) - lwz r11, lo16(_caml_backtrace_active)(r11) + Loadglobal32 r11, _caml_backtrace_active, r11 cmpwi r11, 0 bne L112 L113: @@ -278,10 +300,10 @@ L113: /* Pop trap frame */ lg r0, 0(r1) lg r29, WORD(r1) - mtlr r0 + mtctr r0 addi r1, r1, 16 /* Branch to handler */ - blr + bctr L112: mr r28, r3 /* preserve exn bucket in callee-save */ /* arg 1: exception bucket (already in r3) */ diff --git a/asmrun/signals_asm.c b/asmrun/signals_asm.c index 4f62bd38..df76c501 100644 --- a/asmrun/signals_asm.c +++ b/asmrun/signals_asm.c @@ -166,10 +166,8 @@ DECLARE_SIGNAL_HANDLER(trap_handler) #endif caml_exception_pointer = (char *) CONTEXT_EXCEPTION_POINTER; caml_young_ptr = (char *) CONTEXT_YOUNG_PTR; -#if defined(SYS_rhapsody) caml_bottom_of_stack = (char *) CONTEXT_SP; caml_last_return_address = (uintnat) CONTEXT_PC; -#endif caml_array_bound_error(); } #endif diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index ff198475..23165ad6 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -92,6 +92,25 @@ #define CONTEXT_YOUNG_PTR (context->uc_mcontext.arm_r8) #define CONTEXT_FAULTING_ADDRESS ((char *) context->uc_mcontext.fault_address) +/****************** ARM64, Linux */ + +#elif defined(TARGET_arm64) && defined(SYS_linux) + + #include + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, ucontext_t * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (void (*)(int,siginfo_t *,void *)) (name); \ + sigact.sa_flags = SA_SIGINFO + + typedef unsigned long context_reg; + #define CONTEXT_PC (context->uc_mcontext.pc) + #define CONTEXT_EXCEPTION_POINTER (context->uc_mcontext.regs[26]) + #define CONTEXT_YOUNG_PTR (context->uc_mcontext.regs[27]) + #define CONTEXT_FAULTING_ADDRESS ((char *) context->uc_mcontext.fault_address) + /****************** AMD64, Solaris x86 */ #elif defined(TARGET_amd64) && defined (SYS_solaris) @@ -234,6 +253,7 @@ #define CONTEXT_EXCEPTION_POINTER (context->regs->gpr[29]) #define CONTEXT_YOUNG_LIMIT (context->regs->gpr[30]) #define CONTEXT_YOUNG_PTR (context->regs->gpr[31]) + #define CONTEXT_SP (context->regs->gpr[1]) /****************** PowerPC, BSD */ @@ -247,9 +267,11 @@ sigact.sa_flags = 0 typedef unsigned long context_reg; + #define CONTEXT_PC (context->sc_frame.srr0) #define CONTEXT_EXCEPTION_POINTER (context->sc_frame.fixreg[29]) #define CONTEXT_YOUNG_LIMIT (context->sc_frame.fixreg[30]) #define CONTEXT_YOUNG_PTR (context->sc_frame.fixreg[31]) + #define CONTEXT_SP (context->sc_frame.fixreg[1]) /****************** SPARC, Solaris */ @@ -268,6 +290,7 @@ #define CONTEXT_PC (context->uc_mcontext.gregs[REG_PC]) /* Local register number N is saved on the stack N words after the stack pointer */ + #define CONTEXT_SP (context->uc_mcontext.gregs[REG_SP]) #define SPARC_L_REG(n) ((long *)(context->uc_mcontext.gregs[REG_SP]))[n] #define CONTEXT_EXCEPTION_POINTER (SPARC_L_REG(5)) #define CONTEXT_YOUNG_LIMIT (SPARC_L_REG(7)) diff --git a/asmrun/stack.h b/asmrun/stack.h index 57c87fa9..92b3c28a 100644 --- a/asmrun/stack.h +++ b/asmrun/stack.h @@ -25,7 +25,7 @@ #ifdef TARGET_i386 #define Saved_return_address(sp) *((intnat *)((sp) - 4)) -#ifdef SYS_macosx +#ifndef SYS_win32 #define Callback_link(sp) ((struct caml_context *)((sp) + 16)) #else #define Callback_link(sp) ((struct caml_context *)((sp) + 8)) @@ -56,6 +56,11 @@ #define Callback_link(sp) ((struct caml_context *)((sp) + 16)) #endif +#ifdef TARGET_arm64 +#define Saved_return_address(sp) *((intnat *)((sp) - 8)) +#define Callback_link(sp) ((struct caml_context *)((sp) + 16)) +#endif + /* Structure of OCaml callback contexts */ struct caml_context { diff --git a/asmrun/startup.c b/asmrun/startup.c index 1ccd4eca..9a00f2d7 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -158,9 +158,7 @@ extern void caml_install_invalid_parameter_handler(); void caml_main(char **argv) { char * exe_name; -#ifdef __linux__ static char proc_self_exe[256]; -#endif value res; char tos; @@ -181,14 +179,10 @@ void caml_main(char **argv) caml_debugger_init (); /* force debugger.o stub to be linked */ exe_name = argv[0]; if (exe_name == NULL) exe_name = ""; -#ifdef __linux__ if (caml_executable_name(proc_self_exe, sizeof(proc_self_exe)) == 0) exe_name = proc_self_exe; else exe_name = caml_search_exe_in_path(exe_name); -#else - exe_name = caml_search_exe_in_path(exe_name); -#endif caml_sys_init(exe_name, argv); if (sigsetjmp(caml_termination_jmpbuf.buf, 0)) { if (caml_termination_hook != NULL) caml_termination_hook(NULL); diff --git a/boot/.ignore b/boot/.ignore index 8165156d..30c5866b 100644 --- a/boot/.ignore +++ b/boot/.ignore @@ -4,5 +4,3 @@ ocamlrun.exe ocamlyacc ocamlyacc.exe camlheader -myocamlbuild -myocamlbuild.native diff --git a/boot/myocamlbuild.boot b/boot/myocamlbuild.boot deleted file mode 100755 index ab7ae0929b3b73a0fe0250da0827a6ab276d1a5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2314135 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�L1 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

?4AjbL2t( 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 z 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

tVdOKwHKtnjy4UJ5b9>SS8K(h@S!s&Ft7&d6L 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

?-tf#xaEZ{rM_lvZI<*1t?D$>K`ddl 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%0A5#$^H-6P01|Cf&-<3ixT zKfBeIR^VN5yvo^yBFhO&O>uUTv0smH5CFU4B9`^fkIS1mM zqeS3OysHN#?`o9R@d95Lj$TnwU);nzAI+d!OJ!g1e5}z!i07O9)mZI@_Hmg}hP$Z) z-}o>eEAjTHoPtN$IX>s|pavIV<3}@n={pRsduiwK=KsSRclYd8TfPjh5ml}nQG#U( zis-+N!Cp9gJCq++rV`pn`oGOb<4O9<@UOgu4b$N}oPl`m~5twcCaVpRj?@N+a67yI{TR4G#Reg04#&lj}Nh1W;F_hC(1UQW8) zZGOJFCNSmZ|M?WDRn_%Y*#)d@Y^hK|d{8z{qk~D=4_$|HxNdBrs|G*#DxhmS>+)v! ze2a{ZCFcJs(p6brS69EVv;4ufa0P5;BdNHZ{DSxO=vsW|q(M>pk zpL{E!@Lg6o%Tu_@C_2&nzov0_FAkiI$yYgaXU-Gq5`0j%L8ExK81L%kAF9=T*-{-| ze8q&#$vKygzEiX!;j;(neW%ll>L!d<>zAzc%5tHe!3V8Pj0SzAb#M2w>Ls`n zk83t1Xw#Wjn+abd7;yRq>lq?S%8^4cD6m@XX@1|?*5#bW-95S)fg`Xg%;PNoo%2Od z;DhSBG}@n3|5C7|0*g-22=Q*WnE=e2Lvx<v=2ll%!Xv$2eIkqBuZCX${vP7{ zGa717;{9EVwD9w>h$iAr`fH?d3pr*x$2W=2bM!k_=ld4W<7>)9haUj3QXy+$83!LB&NjtsSDQF_f}Voz%jKV zbR<4#KUSlsP|#(5H7&+1t3gJBPix zmV*8e2YqRs2%U-#%4;=x2Ps$it5<8~FOyuigUa^{DSv|;r#WT66FtMxe;J*^Z;?Pt zk%!*%#0m-WLq~?J@CXU7Dqm1h#X0H|7QO{f z-bs8Aez8WehK<)W^VeW8oB{!(<+n~+6yy(%v|9s3nwq+bdF56074<7A!(#duGOx$0 zdwuZ%y+NZhNPM`kuA!`q72ruf#0qvmTQjqXR*ufIKeXX|0e?CG{xEB}7Y{hj#0L%c zX%yWDA+ri=YRl(o4V_40j+5AyXm{n1=wLN;CJp4zXlTnCo<2c@*W!bQXEb^(X^3>y zG34jh-wU1iE{HZizy99SIr3}rIJRe16x^dptP~caHst9^vQ#R^>p84B~v(FxTiF&ANX+QG{Q`2iV4`t4$!Z#E5&MFOC??%Y8Y+!$>=xOfWE@Y{ z1@Qq*Xmk+ij(0`0kea0=cD@r^LXOMGaj|n8MRb*;$6DQ{gDnJl*xkF$t5{}qFJ;{Y zc&=|SKIksgDDn~BTP#>oZ8Fq)671IY#01j5ksRI5LUAO~ZhlluvD%Na$aD^QwN3H$ zto>kLvB)aN2lYb?jy|f8$%4|kSUBQ_*nhfih#5i+EvV`GRba~__Mc;?CSWN;^wWW3 zr~o(b^IBAPL8Yna{m+o-olf*B z(vNmjiN~Gei9|o?XuG#ooND#2qvpH1)~J7m)vv*uhFM?ZgZh&+9_d8k&nc{2VfBAN zqTNv-aT@9WlpNo3`pzKQZQK@TS+({WQ*kbZA3}`*AFu(NePcwVGd>t_fx#z{0l9_L z6R^quzDa)Qz-ojQeJR+4z>ZkJ%?vkz4?Mp*o{QQ2JnIFM_F%>U68dhUN6e;($aLV_ z49+K@S`}2*p?ia122v2`�WQCdWK-j5rMF0QshJi-Egp~ty=7|TGwuLh5j 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 Rgc;L2_wL<$WO;e7{{f@>`Go)g diff --git a/boot/ocamlc b/boot/ocamlc index 72164e97a35b2d18ae1afe7bb4816a17880e4fba..f6b63f10c387a411a6e9ffb9e84421eb88130dc5 100755 GIT binary patch literal 1707956 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÷?PX&FMQWbNO0m);@1oBgY;Y=;{8a;l17S$zIuN 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

;4agIN>w-@N^vg3l)uU#v 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 Ghd(jDu0z#xm>BTgHRgV{@RTr0;GK%E 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 Pa0N-|t&%k|AUI?CJY? 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 R&u?kU~4a?ZN%Le_CZmVfG{ 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 HUETi$S@9^& literal 1398746 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�GxmTctL_))>ptPTKD7M*q4f6! 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⪙L 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�fQI>T+`P@ly~{K$x>z5KDh9*nlC*B)G~jq7s2 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%0AZyq=>yuQTx9 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 RHHlcDeCEuV$Ljh~{|5{IG*AEl diff --git a/boot/ocamldep b/boot/ocamldep index cdfd1dc7d2e55202aff8dec6c04adb027a07c374..d6901318d22369efaf192f57e71eb9c1ff03ae9e 100755 GIT binary patch literal 526023 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 literal 362050 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 z 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 diff --git a/boot/ocamllex b/boot/ocamllex index 31beb4108a3aaa47fbfcd29b057cad277cb64761..02854fa1891ba87b8558d95ab13d7ca91b9756a9 100755 GIT binary patch literal 251568 zcmeF)37n-@SttIG?j+SFh=hI6bSAQ+GY!%_`&AS5gTvL#@e zBnpCp1EQkh0&cjCh~kP1jxe|{e?%A+XB7o^!+5=bv@Xd1sw-_S3Gv@xa3KUwGr^ zeCZKK9P#}}=Ks>35ZvpC&pqNk>5mT{5Nrv~40Z>X1P>1$8(b4SBX~jZ^5E6M>w@KA zdvLEnTM9lWI4@WX$k5OXYDa1CuSSD^HJWvE(5#<>=BPPnj-G?&n2u&o=Enx&q^~#` zPlAPjkNnUs3ue(Dm%U4a4MEE@mIFCiEq3&*MnmUnH1}?3c4WLWsQTz@?hCTFEjTB* zC=j173BD|NT5wZvOYqgf8-uq7W3|Grisz<`+q$b*ipv;X$y<%C>TfkV`+Yvf^j00N zCa-F7HM*+D)#$1wi>|Fnxnrxk6vw_U*{oGv;zhp{d~Sfhc&$TQqkPfO+v{^yby~K~ zqN`e6jgF3aa#1x)-gwQPbi~Qob4P9s&JMmfxFY!S;CaETgSQ0l4Bj2QH~6*S!@i zWQgxl;8~+isz$6AF3y+?AWuDOcUPX8JDl?BoEO3AUc?+Gt;yzYK8wR?nk6Cp6 znUqiYMK5<`S3a#z0)1N(^YD<<@~9tj@Y5-FYXvx=$`ON#i%4FAUU?ci^)Vtp1*VeAd-~Hjka?D(-dHx<5-U zo$%^Fi^_xV%f|M~R{c|gw*}7I{y;-_!O&l8Ax-_=6gV5kHwNqm=Wt7a&-vCopS~?% zD?7_RV<6|c;Cll!tq+Gn^L=y3`O$_Z!>NrwIIPjBvHM$s)$IPUfri~0zV8T%Z>6>G z9HG0aS(_EBA0B90oj=gbhG5QKFy-}&x4%Sh97EVm%g_)YqMni$cU_W zHhg2Umb3Wz!J^GHabK6@RorWTDeGGUcGemm<9eU6=dM7j{+-iZf%X4==bd-bb44(# zKKEn~4}QJ5Gi9##c~(!(rT|Tit($-0(9?-#5@>YRvzgp_9-`wz#eo0k2fhD%wRcCe z=Z>@HT=LuJpo-BmGp2*wI+tjQzT{_VN+X8sT`M2E@YZLrbs1~r&#XP`+k%#UY^`iB zd)I0ong2KV^~Bie9nPIAN6z;(LHWIJ7^{~$f5zaMbILGoYgYcrdRJiVj`lv`-goDd zsefuv{5_3l!Rf(7?f*j*Ji{I$u(kX-oHp=#B^#cS{kH|;P%#m&-GQ@&SN-;T70cQy+r>^U)Cd2c9DGg|d|URe3A}gG#Rl)BWc9Qw-5nvH>LO307d^dXm7T`Rfjj~`KNO(jL(v`1TpS;{ ztL5T*1{=iSp0Gho55)%Y0`XMy@>6yEl#I*nHg;>_iHPahai3{>0yVT0YzX=qSgBs< zb;me&;waDZYQ65243GHOaIf&`9RYoKoKFPqtlNWg0({zS!9{`CI&)~W z{lS?5IdvA<#Ln{NmW_Prr{yC%K~iw1n7wdV zFI&`yRyiq~tvx5GdFun-ivJ@s7RQ#q>IJXyEZ*18!5flkov5RUN!qmsy6HOklVNUM z?oJDK2Q82J#y~y&aiIQp1=?RFHtpQ~urKR)7K2If$w00?7PPeQ?|9$c&EL_@-aBhiss~w=H8jNGCq~>n)p=ozmhqbX9RR;*MI83yB#~f+dMFSd+@Ag+}iSeo!qx( zer#w<&({xn%(Yv)`4hYO!!zf|2$8_>99C*pnws!Mx{+9##?w`HV_jSXX z_eQpOzStvw|FGx&vFFaNy|3){+)ZdIe$L>&fyO$xC-oI~G+#E*cu%qCzAhb0!(Oea zq4P)9b_{DL4l*9t$avte$M#k?|L)uEu^mn2gMIfJXv)8h1C6uCPBed;{NOA9+#Th^ z9}au9#)l6MYZY_ny4U+Np=oR9M>9WmkW0opGFO`y1#OLf%OLyQhW2H{8al_9H@{yu|D10AZ~uJf zofk*P(Sg>={zUfJApY(8pJctAf2f=PMmPVZZvLKb{v+M|dorh29q7Gd>AjQHyw(5a zfnJR5d!FeZ9JF+=9_YSk*ndd3|KiS$8@u__2L6Y3e2?qsE+6PFAM`wY=&x-0)~<60 z`bT$iw+`#xE&21fp}%_Q)lBcN`Gv!J>!)?~tG{&Umxlhbp?}!WUorG$@1uq}`|v+@ z=*yn#hxxOI-a8Pwn}*&q+59Vp{zXIol|%p1p?~?%-#qlM9Qv;s`u#(H+tA-J^sgQI z*9`sF4*k~+{Tqh<8;1T(L;sehcLp9GX!i@mLL7Gl;{V>GKJ%Rny|eBt?-|C&rN3oZ zJ1@QaFs#$&{JT3f&+TIZYxwEe8MqTYW84GcQ97*OyTPd$uMgZy`i0=>0Y33&m-|Ex zHU#cxb8__ZVg1HojQ_sFxYpUfF(4oRvBQ`Sw0J#V$im;!<3T4L`l7*u*Sir|FMU2w z@JC$ux+AEVEN4uP*yhz~djF99iokhzc<`h^Eb-FAw(A16p{37y$+#qAjea?17a7`8 zfWG+oZVfLTXrCNd*IpU0%RO4OH)kw=bmOUYyd~FjZ&UEMS};A=}irc;foC3NgB zniHCJ=SpneGsxVYG5ad6a=<9oJ=CHB`Rz zc8e8yv6y8yfBE0rT=~FTc~_^U%h-9Ar#dfch%9*{?~DL1zrH&8X0N(H*VY?;d;D#4 zfrh?{rE%FsZrMfGu0WoCJ9^jz*2MUPtd*@~u&->BFQ04lj~@2K`Q?GSVXw9?V2_@i zY{EnC(*r!u8|HN16re5NDqrY~zcC>Dw15n<(6g_2^yoJR_KQ|c6rK7lJuR*Cil2_6 zk!wDHJ?s3CA3jxV>kN}8AI>0JbFnL5#NFNIld7c&?KB$$V7l%&_^hIm! zA)&3BY-#^7wC<)y2hR@JRsOmsjKezpj!|vX$8Ya9Ck9Un*m-<_x9%u(?qcisHV5d8 zOXk=+(_co{a%k#3E5n2I&&s&BVQbcA*`Pk@XG_^7w$}7d4%n=rEqfO--V}(Jo-J&j z$NrCu*nfR^t5$rcvp1-?lwD=3vs!ET(6O<%wO=nAw})1Yb_6>Exra*vO)TWPazHQo zvAp728urA3U1|-)MGUV9=84N#Udd*!^V8Z(UfIh&d1-Afd+ReuTZgTk?4x5Pd+D0D z4#(`p5AHzk9L9SB@kB45>~I$4uxPBw0s8ZTZGrp7eI+JhuaV0?ja;?R$`v27^tnz6su^zi?#(bP7*6!J{SgS4eiPLIv{+k(bmV3B8(7ZE~S95oPeeqQPHwEHR z_Z}P6e$lf7z4fA3AN7v5knshh8gdzQt3AJ@ND2i^p??-quz+-C3+Wyo!M@tqnV-X12YHe+Gz&vtJhd)=_SKf&ovimR(5}0?%^xuI zrw#q7>Dzezw}1Nd&-T!78R)!|nXB8219h&^>lt}raCY#e!Run=j`TYNIR6#6_b=JX$%{$q_G&oMVHfz?$(S(8w;C?oE12W`QEb-0(y+0 zjq~Qrd!1rbI@e`9<`+GDoaL82G;Q2VCR!J zga1(R*_3hRq~y{oAH7`bY)5b0#=}~h-_4oRV_p3m6R>5LT=7Fs{uczAvGc0YWq&C^ zYfiQ~z4nd|#HD;fXKh0uH)Yc#V~s89Q@c7?A1nvf)#3%gIYFI;3=h7OwK)}w*8Yqpj8cb>ZPx`NV$tv8K(k_uTBQWG}h$Aa)h+vXQ;+MQtT}`C7TI7+3uD;@rl4 zOXgxrr&hMJMXa4cvF2lMySk}Zqwix~_Og93&{nctEvPAZS1bH*Z`E_doE;kjHkYsE zj~rOj$`7^D`thL5SMq}oz~zX>{Au-X%DVcS1X|Io=JTu?>wT`=9&Y{awy`+K^I}kXGo1QV z_0>NM+FC}7ukPYK8P|E~&rivrtKY-p%uE8UpHHT%2kffzv^#5J&!_fGA+7s?ZQ`yO z*ZW6nC%eq+9nT!Ux|ZvjPcqgf)BpdpEvD`{@v0gy7AL<4**_PYkFr;e*-rI-m&Cr6(jO5o~|5-uN-Of z#8>TX3g{{y#7}I+jgCp6sb%%V-u6B2w#+rOV|?OGR?l0s)+d2RN71)>#Lgbu+>W%{@e^$n-YPss_*4Qe3|0}SkKAfY)fl%F@I*hBXt^G-$wQC=0<)E#l?U|FSRgIF1PR&dLZH%Xv)zXj2eQe~c zW@G7Y_4Rj8Z?FB8>>cA5!x0YUrXQ8w7jLy`{$8??@~QO>V4GQ zXF1LJJa;;}>-pR{tSzON1HD+ntT@z}Lq7>Lwk%9XpZ0w$Z(}_CZP(j8mE7`)3bfY; zZ2ZcA9&0xRc#XZoZ3@KE+JlBUo_4-3^IGHY(Sc_izIv9-x*z{CH0}NP`OW=!(#ZYz zhoRTn`|-CAEUkDyjy+M`{>ZG zWM9=rE0ZsiKpT^3e`wmof;d3?{*fh2;|I0yJ2WTgO*2Z>w z=IWWeS^7#|E2EV?CXfD>zNKk-*P_4WYvr|iT6xx2icc$}l|3epKP`Pr)AE-7_E~Ud zc4q_X>W*)1YHejxJulkzmcD4p&ag~%U!NY&zvp}I zYofnBYd@H|CRX1+9o_Y;y=-Ld`NLWp)Bdd0{d>ni`=Io7&iXw$R}*dS+jzEdu9~Pb zHcM8^-^v}6MR!Zz(zLwu>TY>jS*?y%mi1YFwEV5yF06qXw{*AX>WuJKy*gKD zG85q%Z1nF;`R@n_#+fX1Ai?1Hv7>b+*6p=s*~eNR*GeR5ypNyeHwS{Kwi z9=#g6HeP;zklp(Ru*tit_r;bMKOg)qyfHu7H|FPtfrhNs2ljiHB%2KT?OLW&`_w(# zwcg%8jJ?ZQ=X24Oo%|@d_St(%pjD2H*>0chY%mw!nzQ-%KrXyr+GEG2U=nDR3$$AO zyoU{9ufDwFTp0L1iH#bY+t{Ml&Is5JAB>OuXPdm}<;3%^d@WjjpkW^xdV3na^8-(t zH@sx?0smq!3A8>hd}3=W8(nL+zdMD7J!H!Dm_1`QS5Dc1kN>?cez+^OK8O1cEKffh z8M1eMKu-Ovh)u0u@^ev8`4J!a>2+JbEzlMMd|wn4Uxo+yDjwE;bBG7MZ9MGpMIC5- zaW_*IpY>MOTRK_$I@_KwBKvzg8Sm+2>>S~Ff5-EO-TV`o zSA32e;Xm;o?rQhN-TeA){^oA}1Ks?+-Tbe*`6>T+SAFMp^UJ&W)4KV~yZM{C`8&J$ z2fF#6W$uhTFc25D`?@@H)wes<=Ym?lChL8k|E807pHJS^p9gpI8#9l{sciQK9qNP* z=lHMloQSVu!_srLefxhTY z9_G~--R5E4-Gkmet}i>;Xny9OV20EG zcIc_;Jx8=Vf|myOHA%ZY_@kiR|A)-gm1h5wff~?W9sFBRcduuIzw<&T8?<(e|I(n9 ze@*7C{-5vme=qY^|NobHtN){!xB53`-s)_}w`TA3;H*G1e^Q{5mK4 zmxlMq>FB`Uo%CGy-+7?FArOz2=b4$4NyhU6H0tlh;QF9sqmvi=dgmMc^MjV>S(*1d z<~`lB8@ddqcCRx?Q%71`M=q{~K#VU7zA$hmw5>t;%zw4%9?<-^jOwfAFY4x3b@Q{j z`R2^|%LjE(_Z(ZC&$7|EHFj<<51iZAW`T`61HQ3K+-?r!Q*QWkbZ~8e#y(wF1uqGT zj(>c^Q*_Q_$;5YFuq8mlzS4~s-ED!^>$Okkm|lGJ(phx$CM?sxoj|8E#|I599<9b@ zhjmcL*9E5rXvi&^vbAbpA$yt{epkT8il064dsxud10UV3bg@m|z`5NVEC+i7_Y)iV zw>vD{^4`<9D5goma{8t}!Hr)esZVA}W_ukfhS>sRHi?`*eywi1gAO`lg1$1e(XWs7h zx=P3XDc1p;#B6&|dBVRKu!}8M1?;Oec=Nm@PmJs1X{(n>Sk7)(U)!FDbD;ogkVA00e1kSBAwdwM{gT;pE~ZXCu}q_@6WJ^W%9 zM?4iP_LEu92R7SxzP1MI0u2qG%|XSR{^fvOC2v;j|2#Amd-YJUNB_~-Cl9X)E($gV zTFJ8a+Q9uG2VzwDV3###L;PMDuwU$~xBHcoIv3_Xb5wlI$<}TUylaU^yU$;ZZEA#V z_1>+9R>JYw-yEFZ&|Q{sYtNOL&*LAOrv+m^l0UDEub3f&o%702k7IW5cU~FKpCLmo zEB@8X)8&CC{_S~k&NO$Y-0L3~;CXPM-4Lu+KkRlcosZ`Qc+LsNd~NFvADhtYj|=eg zZ>=)uUX8C}()a7a`^rH4V6{8qlGh(d-}5=GD}~*r?vW=%U)kSU+5d-$J6h*FW6>X zZt=O#JQGe2jtM-^w+HJ34Sl}an%;4*&DeT93vSK$q@cfN$gG@-FevXS@*9euh(9*efoj zN8ZIw+{pI4DV{Mp_Taf9&}PXIr;;;9*UG6F(f7)LFIvfF8yoQ$(_K7mEb*ytwQ9U4 z5D&b3s~T>{@~d9OZdV|uo`aro7Y7>x&lmE@QA27SU)lHEjH~9^Xnk`)X3@}DxoPvZ zuAwRWTASpN4QxaE^)qY}kA?uFUw*HFX>VQ6X2!G|!S+#FmalnHg z%?SZr#`WGi>+dR|nb!_6>g^EE#ekgEY-s;}kaJ$KFoxR$O+ArUb9aD!`K(yolyMs) zv5<@6aaQrP`No4zT-Bu9To7Cts4ezrTLX6ne)KJ#nz^$rx6bWniw}>CEqB)k@oVGG zZ*|nh)O=PR+L%5nbiF;|MTeXeo|5s|fq05{#giV8W2n5}m@&w&wao!pw*{J167x2$d=q~$f$|~4gE=#1uXBT6>*p22HgDov z^7Z1?%NOVJpYK}PSG@Dwn`~bU_#!8d3&@j$dG1Z`59QnTj90R&YLh`fmXb` z4or`5FSDWM@5>xt`PlCLVD`ihE!*Foxfs^`TRT}V=;)u(?QiSmcMd;yEL+~+&Hqz3 ze{MH_MCNL}wdvpTbH>((cXabxhMz+gpI#lXL5#O&-V|J#TMQpvnK1;KJb1 zfoH_$uOq=%00rh48vSDxAK*}Xy4c011U!8;G{FXWlQKej9efK6O@SqSrGLQp%{??AV^5$~ z@$&7GKx@b1D6Y=*u0S1rG-pj-FAg>Y@6+;apv({5Ii>69`LJTWen_r{%jtdHTG96ug_TP>DaRv z6kV%Byg*#aHuFtE(c>?h#^|&C8T5R5bl`h){l=i=FJ?@iSdsS^$s_-2{s+TcZCYcm ze{WWv#JtwtJ>;K!aV+`A4s÷?PX&FMQWbNO0m);@PwBgY;Y=;{8a;l17S$zIuN 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

#6TfknYOZydxjB28R?>EoJi(%EO1aeqjGA zrnM%3Q?R{$IS4n>T@6M}XH&=QT%2W3l$ED&dE1F+R;?ilm5X23B;1qEWjRRvi`8IK zz5y3qtX2p+OjfAtxrhW&*^U+Qm1(EVk>;>k)omnQ&4$q>ts~TRmAjBtZgF|eg%wZS z=Bdeb_v`VC(EXK-_qXfX=U|w-zg z38H6sm0k*ey^N{c1CTT3$R{l=F2jFZ2{NJ!BP#Q84t-JnDiKeITEgY)dLwjmxFYiu zh;-}XezGQPy^Z2atH`P~&CT5RSAIk{5awMST#_or>`#ie6{&Yl3bxd9kG3y* z0#_Ru_u`jPy>dwJPnW1UglQh>qCT&koo=fP7b40ay4e!vvux>IyUvLy=nadW#M(&{ zU&H!)5lvRdhx(*DXJ5x^l0=03Jry5yR_LRd5ZO37q$6+VNLY*ai>HuM7^=5a)uoKQ z+kIQ{4(?=P=j=IHNl;}{v5RFDx+ts>wLBWX{*bGXL53lFU6Q1K2{W<#wn z<_Yk8!FArk9sdo3*zew1>4Ii43)}Rq#z?FFR4S+Q%=`wuM6dEbG(Cb}dC^X{*6$6^ z`GowO%%@{Rk6uyfzYS5Ed!Ac!Ez9ZX^B#?hUoP-m55oDif)#qdv|PE- z(|x+!O|AR%_PE`=+=hil@A%SpOoeeN8DAOLI|!TFrY7z z-^_nJ72SV7tpD0WW=>>R-P6<_Y>I3O_A2G|IwrjYH~g_y19Fe?xW6!u=AE)>6wXQlm z5{A*+nHyfIFVTNNXXf7%ymBU;dHqwageSvRy``luogNGOPKG&mqrR^cZaWz+-{#J* zed*MDo)TGZ8?T1#OYNr7OPqK)5U<{hUP2@hTf@F>{U^iAXLoMXi-rd$`mT{qargKH zytq?3-j4bQ~zt(r1bm%A#J?ILycdJlrE2693#Xe zy&a??Z{ZN)-5}bp)KkEd`$yD%l{mKV(1>>NA3gP@ijh?`*In9|nsknkp9|w6{+q}a zHIsOOCT+@8pns zW3y~{o#Wl>o>J~h?SXaqUbnVN(yxhIereU)hWk=CL~3*H4wpLrR-D(@zKy&83T52O zYF`!JA4=w)S#JXG?`Lo)_u3o7`?opq`>OBz?%yc|H&kCS-rpzTH~Oy*@88aFZqmz! zYF{1RzeAiiC*BF(eN~;vcZu}Y?%G#^_g^K-+va&Ac>mQnX8VpSqFLFv zSF`d@H6wphuxVyS@4a>JVxI1~`@SzOd)LRep0WO+U;oCReD7~=o0+LI<)(Xn|L)rs zZ2i0Uzhi03$e*o!-Q&M9GZW8)>7IZ4t=%{O=GCt*ed@^O-+uFfCGVJ-X=AEQ_x#h_ z_xB&DE`_#M^vlDU@X>XP78Dw<{73b;?3(VmD`w#DZ_uoA`{;oe=`Ki$l%*-%trhAT_ znQ#5v&NIKX?Qa&Gb?zU(Z?BAq@@=}O;YXkTsXy#p^6>}0`u@rL7Hs&YSd_QZJy+iI zmcRJev+ucf&(}Zt*jWD0zab?q?WTLOpM3bsGk1OAEnjbVaP`fDXMImSZbh5!xu(D8 z+?hwe^2ATw_`5&%vhH1vs>dyZ(>;Iu_32L?UNZB#H-B-9{LAV!-E-HE-ul7PHyb|qy^aU(`@y57b8x(thv}Z5c{F&{ z&$Rcw@#)Wg=WT!T<<(Q_V5ykydFbvV>prykYkPMd{ni_Q=b!%M%^GJkMW=hdwCf#5 zcKq?bt@_wo`G;DaBR5!HoCQM&xxb2t9(x6WJrt}6=f|KjupsdMYH&VK)y zUu!(@2d{mm<5NGp?7^qsuC8cxo9=0UM-wQsrl3u8ZXdEcjJX68J-PWSxk z>mPgSYr8*j=tIBz-fv#9=%P1;{kymCNHq*B+J4RT?)jeW*IdJrle&J-u50z=`rEhn p?d#Kj-SGCkw_LkTZzFnh|DJyJHy#wpLQc|a)~{cGbI+PJ{~wPxXQluE literal 176611 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" - exit 1 -} - -logfile="buildbot.log" - -finish() { - curl -s -0 -F "log=@$logfile" \ - -F "host=`hostname`" \ - -F "mode=$mode-$opt_win-$opt_win2" \ - http://buildbot.feydakins.org/dropbox || : -} - -rm -f buildbot.failed -rm -f $logfile - -bad() { - touch buildbot.failed -} - -finish_if_bad() { - if [ -f buildbot.failed ]; then - finish - exit 2 - fi -} - -if figlet "test" > /dev/null 2> /dev/null; then - draw="figlet" -else - draw="echo ----------- " -fi - -if echo | tee -a tee.log > /dev/null 2> /dev/null; then - tee="tee -a $logfile" -else - tee=: -fi - -rm -f tee.log - -log() { - $draw $@ - $tee -} - -mode=$1 -shift 1 - -case "$mode" in - make|ocb|ocamlbuild) : ;; - *) usage;; -esac - -case "$1" in - win) - opt_win=win - opt_win2=$2 - shift 2 - Makefile=Makefile.nt;; - *) Makefile=Makefile;; -esac - -( [ -f config/Makefile ] && make -f $Makefile clean || : ) 2>&1 | log clean - -( ./build/distclean.sh || : ) 2>&1 | log distclean - -(cvs -q up -dP -r release311 || bad) 2>&1 | log cvs up -finish_if_bad - -case "$opt_win" in -win) - - # FIXME - sed -e 's/\(OTHERLIBRARIES=.*\) labltk/\1/' \ - < "config/Makefile.$opt_win2" > config/Makefile || bad - finish_if_bad - - cp config/m-nt.h config/m.h || bad - finish_if_bad - cp config/s-nt.h config/s.h || bad - finish_if_bad - ;; - -*) - (./configure --prefix `pwd`/_install $@ || bad) 2>&1 | log configure - finish_if_bad - ;; -esac - -case "$mode" in - make) - (make -f $Makefile world opt opt.opt install || bad) 2>&1 | log build install - finish_if_bad - ;; - ocb|ocamlbuild) - (./build/fastworld.sh || bad) 2>&1 | log build - finish_if_bad - (./build/install.sh || bad) 2>&1 | log install - finish_if_bad - ;; -esac - -(cat _build/not_installed || bad) 2>&1 | log not_installed - -finish diff --git a/build/camlp4-bootstrap-recipe.txt b/build/camlp4-bootstrap-recipe.txt deleted file mode 100644 index 3be13199..00000000 --- a/build/camlp4-bootstrap-recipe.txt +++ /dev/null @@ -1,181 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2010 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -=== Initial setup === - make clean - ./build/distclean.sh - ./configure -prefix `pwd`/_install - (cd otherlibs/labltk/browser; make help.ml) - ./build/fastworld.sh - # Go to "Bootstrap camlp4" - -=== Install the bootstrapping camlp4 processor === - ./build/install.sh - -=== Build camlp4 === - # This step is not needed right after a "./build/world.sh byte" - ./build/camlp4-byte-only.sh - -=== Bootstrap camlp4 === - # First "Build camlp4" - # Then "Install the bootstrapping camlp4 processor" - # Indeed the following bootstrapping script - # does use the installed version! - ./build/camlp4-bootstrap.sh - # If the fixpoint not is reached yet - # Go to "Bootstrap camlp4" - # Otherwise - # Have a look at the changes in - # camlp4/boot it may be a good idea to commit them - -=== Generate Camlp4Ast.ml === - # First "Install the bootstrapping camlp4 processor" - # Indeed the following bootstrapping script - # does use the installed version! - ./build/camlp4-mkCamlp4Ast.sh - -=== Case study "let open M in e" === - - Open the revised parser - Camlp4Parsers/Camlp4OCamlRevisedParser.ml - - Look for similar constructs, indeed rules - that start by the same prefix should in - the same entry. It is simpler to stick - them close to each other. - - [ "let"; r = opt_rec; ... - | "let"; "module"; m = a_UIDENT; ... - - So we naturally add something like - - | "let"; "open"; ... - - Then have a look to the "open" construct: - - | "open"; i = module_longident -> - - So we need a module_longident, it becomes: - - | "let"; "open"; i = module_longident; "in"; e = SELF -> - - Then we leave a dummy action but very close to what we want - in the end: - - | "let"; "open"; i = module_longident; "in"; e = SELF -> - <:expr< open_in $id:i$ $e$ >> - - Here it is just calling a (non-existing) function called open_in. - - Check that there is no other place where we have to duplicate this - rule (yuk!). In our case it is! The sequence entry have the "let" - rules again. - - Then go into Camlp4Parsers/Camlp4OCamlParser.ml and look for other - occurences. - - When copy/pasting the rule take care of SELF occurences, you may - have to replace it by expr and expr LEVEL ";" in our case. - - The return type of the production might be different from expr in - our case an action become <:str_item<...>> instead of <:expr<...> - - Watch the DELETE_RULE as well, in our case I'm searching for the - literal string "let" in the source: - - DELETE_RULE Gram expr: "let"; "open"; module_longident; "in"; SELF END; - - Then build and bootstrap. - - Then you can at last extend the AST, go in: - - Camlp4/Camlp4Ast.partial.ml - - And add the "open in" constructor (at the end). - - (* let open i in e *) - | ExOpI of loc and ident and expr - - Then "Generate Camlp4Ast.ml" and build. - - We get a single warning in Camlp4/Struct/Camlp4Ast2OCamlAst.ml but - don't fix it now. Notice that you may need to disable '-warn-error' - in order to be able to successfully compile, despite of the warning. - - Then I hacked the camlp4/boot/camlp4boot.ml to generate: - Ast.ExOpI(_loc, i, e) - instead of - Ast.ExApp(_loc .... "open_in" ... i ... e ...) - - Build. Bootstrap once and build again. - - Then change the parsers again and replace the - open_in $id:i$ $e$ - by - let open $i$ in $e$ - - Then change the Parsetree generation in - Camlp4/Struct/Camlp4Ast2OCamlAst.ml - - | <:expr@loc< let open $i$ in $e$ >> -> - mkexp loc (Pexp_open (long_uident i) (expr e)) - - Change the pretty-printers as well (drawing inspiration in - "let module" in this case): - - In Camlp4/Printers/OCaml.ml: - | <:expr< let open $i$ in $e$ >> -> - pp f "@[<2>let open %a@]@ @[<2>in@ %a@]" - o#ident i o#reset_semi#expr e - And at the end of #simple_expr: - <:expr< let open $_$ in $_$ >> - - Have a look in Camlp4/Printers/OCamlr.ml as well. - -=== Second case study "with t := ..." === - -1/ Change the revised parser first. -Add new parsing rules for := but keep the old actions for now. - -2/ Change Camlp4Ast.partial.ml, add: - (* type t := t *) - | WcTyS of loc and ctyp and ctyp - (* module i := i *) - | WcMoS of loc and ident and ident - -3/ "Generate Camlp4Ast.ml" and build. - -4/ Change the generated camlp4/boot/camlp4boot.ml: - Look for ":=" and change occurences of - WcMod by WcMoS and WcTyp by WcTyS - -5/ Build (DO NOT bootstrap) - "Install the bootstrapping camlp4 processor" - -6/ Change the required files: - Camlp4/Printers/OCaml.ml: - just copy/paste&adapt what is done for - "... with type t = u" and - "... with module M = N" - Camlp4/Struct/Camlp4Ast2OCamlAst.ml: - I've factored out a common part under - another function and then copy/pasted. - Camlp4Parsers/Camlp4OCamlRevisedParser.ml: - Change the <:with_constr< type $...$ = $...$ >> - we've introduced earlier by replacing the '=' - by ':='. - Camlp4Parsers/Camlp4OCamlParser.ml: - Copy paste what we have done in Camlp4OCamlRevisedParser - and but we need to call opt_private_ctyp instead of - ctyp (just like the "type =" construct). - -7/ Build & Bootstrap diff --git a/build/camlp4-bootstrap.sh b/build/camlp4-bootstrap.sh deleted file mode 100755 index 612e060e..00000000 --- a/build/camlp4-bootstrap.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -# README: to bootstrap camlp4 have a look at build/camlp4-bootstrap-recipe.txt - -set -e -cd `dirname $0`/.. - -. config/config.sh -export PATH=$BINDIR:$PATH - -TMPTARGETS="\ - camlp4/boot/Lexer.ml" - -TARGETS="\ - camlp4/Camlp4/Struct/Camlp4Ast.ml \ - camlp4/boot/Camlp4.ml \ - camlp4/boot/camlp4boot.ml" - -for target in $TARGETS camlp4/boot/Camlp4Ast.ml; do - [ -f "$target" ] && mv "$target" "$target.old" - rm -f "_build/$target" -done - -if [ -x ./boot/myocamlbuild.native ]; then - OCAMLBUILD=./boot/myocamlbuild.native -else - OCAMLBUILD="./boot/ocamlrun boot/myocamlbuild" -fi -$OCAMLBUILD $TMPTARGETS $TARGETS - -for t in $TARGETS; do - echo promote $t - cp _build/$t camlp4/boot/`basename $t` - if cmp _build/$t camlp4/boot/`basename $t`.old; then - echo fixpoint for $t - else - echo $t is different, you should rebootstrap it by cleaning, building and call this script - fi -done diff --git a/build/camlp4-mkCamlp4Ast.sh b/build/camlp4-mkCamlp4Ast.sh deleted file mode 100755 index 0ff20e8b..00000000 --- a/build/camlp4-mkCamlp4Ast.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2010 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. - -. config/config.sh -export PATH=$BINDIR:$PATH - -CAMLP4AST=camlp4/Camlp4/Struct/Camlp4Ast.ml -BOOTP4AST=camlp4/boot/Camlp4Ast.ml - -[ -f "$BOOTP4AST" ] && mv "$BOOTP4AST" "$BOOTP4AST.old" -rm -f "_build/$BOOTP4AST" -rm -f "_build/$CAMLP4AST" - -if [ -x ./boot/myocamlbuild.native ]; then - OCAMLBUILD=./boot/myocamlbuild.native -else - OCAMLBUILD="./boot/ocamlrun boot/myocamlbuild" -fi -$OCAMLBUILD $CAMLP4AST - -echo promote $CAMLP4AST -cp _build/$CAMLP4AST camlp4/boot/`basename $CAMLP4AST` diff --git a/build/camlp4-native-only.sh b/build/camlp4-native-only.sh deleted file mode 100755 index d53395c2..00000000 --- a/build/camlp4-native-only.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2008 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. -. build/targets.sh -set -x - -# If you modify this list, modify it also in boot.sh -STDLIB_MODULES='Pervasives,Arg,Array,Buffer,Char,Digest,Filename,Format,Hashtbl,Lazy,Lexing,List,Map,Printexc,Printf,Scanf,Set,String,Sys,Parsing,Int32,Int64,Nativeint,Obj,Queue,Sort,Stream,Stack' - -$OCAMLBUILD -ignore "$STDLIB_MODULES" $@ native_stdlib_mixed_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $CAMLP4_NATIVE diff --git a/build/camlp4-targets.sh b/build/camlp4-targets.sh deleted file mode 100644 index 8fbaafb5..00000000 --- a/build/camlp4-targets.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -CAMLP4_COMMON="\ - camlp4/Camlp4/Camlp4Ast.partial.ml \ - camlp4/boot/camlp4boot.byte" -CAMLP4_BYTE="$CAMLP4_COMMON \ - camlp4/Camlp4.cmo \ - camlp4/Camlp4Top.cmo \ - camlp4/camlp4prof.byte$EXE \ - camlp4/mkcamlp4.byte$EXE \ - camlp4/camlp4.byte$EXE \ - camlp4/camlp4fulllib.cma" -CAMLP4_NATIVE="$CAMLP4_COMMON \ - camlp4/Camlp4.cmx \ - camlp4/Camlp4Top.cmx \ - camlp4/camlp4prof.native$EXE \ - camlp4/mkcamlp4.native$EXE \ - camlp4/camlp4.native$EXE \ - camlp4/camlp4fulllib.cmxa" - -for i in camlp4boot camlp4r camlp4rf camlp4o camlp4of camlp4oof camlp4orf; do - CAMLP4_BYTE="$CAMLP4_BYTE camlp4/$i.byte$EXE camlp4/$i.cma" - CAMLP4_NATIVE="$CAMLP4_NATIVE camlp4/$i.native$EXE" -done - -cd camlp4 -for dir in Camlp4Parsers Camlp4Printers Camlp4Filters; do - for file in $dir/*.ml; do - base=camlp4/$dir/`basename $file .ml` - CAMLP4_BYTE="$CAMLP4_BYTE $base.cmo" - CAMLP4_NATIVE="$CAMLP4_NATIVE $base.cmx $base.$O" - done -done -cd .. diff --git a/build/distclean.sh b/build/distclean.sh deleted file mode 100755 index aa8b2f31..00000000 --- a/build/distclean.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0`/.. -set -ex -(cd byterun && make clean) || : -(cd asmrun && make clean) || : -(cd yacc && make clean) || : -rm -f build/ocamlbuild_mixed_mode -rm -rf _build -rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader \ - boot/myocamlbuild boot/myocamlbuild.native boot/myocamlbuild.native.exe \ - myocamlbuild_config.ml config/config.sh config/Makefile \ - boot/ocamlyacc tools/cvt_emit.bak tools/*.bak \ - config/s.h config/m.h boot/*.cm* _log _*_log* - -# from partial boot -rm -f driver/main.byte driver/optmain.byte lex/main.byte \ - tools/ocamlmklib.byte camlp4/build/location.ml \ - camlp4/build/location.mli \ - tools/myocamlbuild_config.ml camlp4/build/linenum.mli \ - camlp4/build/linenum.mll \ - camlp4/build/terminfo.mli camlp4/build/terminfo.ml - -# from ocamlbuild bootstrap -rm -f ocamlbuild/_log ocamlbuild/,ocamlbuild.byte.start \ - ocamlbuild/boot/ocamlbuild ocamlbuild/myocamlbuild_config.ml \ - ocamlbuild/myocamlbuild_config.mli -rm -rf ocamlbuild/_build ocamlbuild/_start - -# from the old build system -rm -f camlp4/build/camlp4_config.ml camlp4/**/*.cm* diff --git a/build/fastworld.sh b/build/fastworld.sh deleted file mode 100755 index 0e3302ef..00000000 --- a/build/fastworld.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2008 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0` -set -e -if [ -e ocamlbuild_mixed_mode ]; then - echo ocamlbuild mixed mode detected - echo 'please cleanup and re-launch (make clean ; ./build/distclean.sh)' - exit 1 -fi -./mkconfig.sh -./mkmyocamlbuild_config.sh -./boot-c-parts.sh -./boot.sh $@ - -cd .. -. build/targets.sh -OCAMLMKLIB_BYTE="tools/ocamlmklib.byte" -set -x -$OCAMLBUILD $@ -log _boot_fast_log \ - $STDLIB_BYTE $OCAMLOPT_BYTE $STDLIB_NATIVE \ - $OCAMLOPT_NATIVE $OCAMLMKLIB_BYTE $OTHERLIBS_UNIX_NATIVE $OCAMLBUILD_NATIVE - -rm -f _build/myocamlbuild -boot/ocamlrun boot/myocamlbuild \ - -just-plugin -install-lib-dir _build/ocamlbuild \ - -ocamlopt "../_build/ocamlopt.opt -nostdlib -I boot -I stdlib -I $UNIXDIR" -cp _build/myocamlbuild boot/myocamlbuild.native - -./boot/myocamlbuild.native $@ \ - $OCAMLC_NATIVE $TOPLEVEL $OTHERLIBS_BYTE $OTHERLIBS_NATIVE $OCAMLLEX_BYTE \ - $OCAMLLEX_NATIVE $TOOLS_BYTE $TOOLS_NATIVE $DEBUGGER \ - $OCAMLDOC_BYTE $OCAMLDOC_NATIVE $OCAMLBUILD_BYTE $CAMLP4_BYTE $CAMLP4_NATIVE - -cd tools -make objinfo_helper -cd .. diff --git a/build/install.sh b/build/install.sh deleted file mode 100755 index d092d664..00000000 --- a/build/install.sh +++ /dev/null @@ -1,573 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e - -cd `dirname $0`/.. - -. config/config.sh - -not_installed=$PWD/_build/not_installed - -rm -f "$not_installed" -touch "$not_installed" - -wontinstall() { - echo "$1" >> "$not_installed" - echo " don't install $1" -} - -installbin() { - if [ -f "$1" ]; then - echo " install binary $2" - cp -f "$1" "$2" - [ -x "$2" ] || chmod +x "$2" - else - wontinstall "$1" - fi -} - -installbestbin() { - if [ -f "$1" ]; then - echo " install binary $3 (with `basename $1`)" - cp -f "$1" "$3" - else - if [ -f "$2" ]; then - echo " install binary $3 (with `basename $2`)" - cp -f "$2" "$3" - else - echo "None of $1, $2 exists" - exit 3 - fi - fi - [ -x "$3" ] || chmod +x "$3" -} - -installlib() { - if [ -f "$1" ]; then - dest="$2/`basename $1`" - echo " install library $dest" - cp -f "$1" "$2" - if [ "$RANLIB" != "" ]; then - "$RANLIB" "$dest" - fi - else - wontinstall "$1" - fi -} - -installdir() { - args="" - while [ $# -gt 1 ]; do - if [ -f "$1" ]; then - args="$args $1" - else - wontinstall "$1" - fi - shift - done - last="$1" - for file in $args; do - echo " install $last/`basename $file`" - cp -f "$file" "$last" - done -} - -installlibdir() { - args="" - while [ $# -gt 1 ]; do - args="$args $1" - shift - done - last="$1" - for file in $args; do - installlib "$file" "$last" - done -} - -mkdir -p $BINDIR -mkdir -p $LIBDIR -mkdir -p $LIBDIR/caml -mkdir -p $LIBDIR/camlp4 -mkdir -p $LIBDIR/vmthreads -mkdir -p $LIBDIR/threads -mkdir -p $LIBDIR/labltk -mkdir -p $LIBDIR/ocamlbuild -mkdir -p $LIBDIR/ocamldoc -mkdir -p $LIBDIR/ocamldoc/custom -mkdir -p $STUBLIBDIR -mkdir -p $MANDIR/man1 -mkdir -p $MANDIR/man3 -mkdir -p $MANDIR/man$MANEXT - -echo "Installing core libraries..." -installlibdir byterun/libcamlrun.$A asmrun/libasmrun.$A asmrun/libasmrunp.$A \ - $LIBDIR -installdir byterun/libcamlrun_shared$EXT_DLL $LIBDIR - -PUBLIC_INCLUDES="\ - alloc.h callback.h config.h custom.h fail.h intext.h \ - memory.h misc.h mlvalues.h printexc.h signals.h compatibility.h" - -cd byterun -for i in $PUBLIC_INCLUDES; do - echo " install caml/$i" - sed -f ../tools/cleanup-header $i > $LIBDIR/caml/$i -done -cd .. - -WIN32="" -if [ "x$EXE" = "x.exe" ]; then - installbin win32caml/ocamlwin.exe $PREFIX/OCamlWin.exe - WIN32=win32 -fi - -installdir otherlibs/"$WIN32"unix/unixsupport.h \ - otherlibs/bigarray/bigarray.h \ - $LIBDIR/caml - -installdir yacc/ocamlyacc$EXE byterun/ocamlrun$EXE $BINDIR - -installdir config/Makefile $LIBDIR/Makefile.config -installdir byterun/ld.conf $LIBDIR - -cd _build - -echo "Installing the toplevel and compilers..." -installbin ocaml$EXE $BINDIR/ocaml$EXE -installbin ocamlc$EXE $BINDIR/ocamlc$EXE -installbin ocamlopt$EXE $BINDIR/ocamlopt$EXE -installbin ocamlc.opt$EXE $BINDIR/ocamlc.opt$EXE -installbin ocamlopt.opt$EXE $BINDIR/ocamlopt.opt$EXE - -set=set # coloration workaround - -echo "Installing the standard library..." -installdir \ - stdlib/stdlib.cma \ - stdlib/stdlib.cmxa stdlib/stdlib.p.cmxa \ - stdlib/camlheader \ - stdlib/camlheader_ur \ - stdlib/std_exit.cm[io] stdlib/std_exit.ml \ - stdlib/arg.cmi stdlib/arg.ml stdlib/arg.mli \ - stdlib/array.cmi stdlib/array.ml stdlib/array.mli \ - stdlib/arrayLabels.cmi stdlib/arrayLabels.ml stdlib/arrayLabels.mli \ - stdlib/buffer.cmi stdlib/buffer.ml stdlib/buffer.mli \ - stdlib/callback.cmi stdlib/callback.ml stdlib/callback.mli \ - stdlib/camlinternalLazy.cmi stdlib/camlinternalLazy.ml stdlib/camlinternalLazy.mli \ - stdlib/camlinternalMod.cmi stdlib/camlinternalMod.ml stdlib/camlinternalMod.mli \ - stdlib/camlinternalOO.cmi stdlib/camlinternalOO.ml stdlib/camlinternalOO.mli \ - stdlib/char.cmi stdlib/char.ml stdlib/char.mli \ - stdlib/complex.cmi stdlib/complex.ml stdlib/complex.mli \ - stdlib/digest.cmi stdlib/digest.ml stdlib/digest.mli \ - stdlib/filename.cmi stdlib/filename.ml stdlib/filename.mli \ - stdlib/format.cmi stdlib/format.ml stdlib/format.mli \ - stdlib/gc.cmi stdlib/gc.ml stdlib/gc.mli \ - stdlib/genlex.cmi stdlib/genlex.ml stdlib/genlex.mli \ - stdlib/hashtbl.cmi stdlib/hashtbl.ml stdlib/hashtbl.mli \ - stdlib/int32.cmi stdlib/int32.ml stdlib/int32.mli \ - stdlib/int64.cmi stdlib/int64.ml stdlib/int64.mli \ - stdlib/lazy.cmi stdlib/lazy.ml stdlib/lazy.mli \ - stdlib/lexing.cmi stdlib/lexing.ml stdlib/lexing.mli \ - stdlib/list.cmi stdlib/list.ml stdlib/list.mli \ - stdlib/listLabels.cmi stdlib/listLabels.ml stdlib/listLabels.mli \ - stdlib/map.cmi stdlib/map.ml stdlib/map.mli \ - stdlib/marshal.cmi stdlib/marshal.ml stdlib/marshal.mli \ - stdlib/moreLabels.cmi stdlib/moreLabels.ml stdlib/moreLabels.mli \ - stdlib/nativeint.cmi stdlib/nativeint.ml stdlib/nativeint.mli \ - stdlib/obj.cmi stdlib/obj.ml stdlib/obj.mli \ - stdlib/oo.cmi stdlib/oo.ml stdlib/oo.mli \ - stdlib/parsing.cmi stdlib/parsing.ml stdlib/parsing.mli \ - stdlib/pervasives.cmi stdlib/pervasives.ml stdlib/pervasives.mli \ - stdlib/printexc.cmi stdlib/printexc.ml stdlib/printexc.mli \ - stdlib/printf.cmi stdlib/printf.ml stdlib/printf.mli \ - stdlib/queue.cmi stdlib/queue.ml stdlib/queue.mli \ - stdlib/random.cmi stdlib/random.ml stdlib/random.mli \ - stdlib/scanf.cmi stdlib/scanf.ml stdlib/scanf.mli \ - stdlib/sort.cmi stdlib/sort.ml stdlib/sort.mli \ - stdlib/stack.cmi stdlib/stack.ml stdlib/stack.mli \ - stdlib/stdLabels.cmi stdlib/stdLabels.ml stdlib/stdLabels.mli \ - stdlib/stream.cmi stdlib/stream.ml stdlib/stream.mli \ - stdlib/string.cmi stdlib/string.ml stdlib/string.mli \ - stdlib/stringLabels.cmi stdlib/stringLabels.ml stdlib/stringLabels.mli \ - stdlib/sys.cmi stdlib/sys.ml stdlib/sys.mli \ - stdlib/weak.cmi stdlib/weak.ml stdlib/weak.mli \ - stdlib/$set.cmi stdlib/$set.ml stdlib/$set.mli \ - stdlib/arg.cmx stdlib/arg.p.cmx \ - stdlib/array.cmx stdlib/array.p.cmx \ - stdlib/arrayLabels.cmx stdlib/arrayLabels.p.cmx \ - stdlib/buffer.cmx stdlib/buffer.p.cmx \ - stdlib/callback.cmx stdlib/callback.p.cmx \ - stdlib/camlinternalLazy.cmx stdlib/camlinternalLazy.p.cmx \ - stdlib/camlinternalMod.cmx stdlib/camlinternalMod.p.cmx \ - stdlib/camlinternalOO.cmx stdlib/camlinternalOO.p.cmx \ - stdlib/char.cmx stdlib/char.p.cmx \ - stdlib/complex.cmx stdlib/complex.p.cmx \ - stdlib/digest.cmx stdlib/digest.p.cmx \ - stdlib/filename.cmx stdlib/filename.p.cmx \ - stdlib/format.cmx stdlib/format.p.cmx \ - stdlib/gc.cmx stdlib/gc.p.cmx \ - stdlib/genlex.cmx stdlib/genlex.p.cmx \ - stdlib/hashtbl.cmx stdlib/hashtbl.p.cmx \ - stdlib/int32.cmx stdlib/int32.p.cmx \ - stdlib/int64.cmx stdlib/int64.p.cmx \ - stdlib/lazy.cmx stdlib/lazy.p.cmx \ - stdlib/lexing.cmx stdlib/lexing.p.cmx \ - stdlib/list.cmx stdlib/list.p.cmx \ - stdlib/listLabels.cmx stdlib/listLabels.p.cmx \ - stdlib/map.cmx stdlib/map.p.cmx \ - stdlib/marshal.cmx stdlib/marshal.p.cmx \ - stdlib/moreLabels.cmx stdlib/moreLabels.p.cmx \ - stdlib/nativeint.cmx stdlib/nativeint.p.cmx \ - stdlib/obj.cmx stdlib/obj.p.cmx \ - stdlib/oo.cmx stdlib/oo.p.cmx \ - stdlib/parsing.cmx stdlib/parsing.p.cmx \ - stdlib/pervasives.cmx stdlib/pervasives.p.cmx \ - stdlib/printexc.cmx stdlib/printexc.p.cmx \ - stdlib/printf.cmx stdlib/printf.p.cmx \ - stdlib/queue.cmx stdlib/queue.p.cmx \ - stdlib/random.cmx stdlib/random.p.cmx \ - stdlib/scanf.cmx stdlib/scanf.p.cmx \ - stdlib/sort.cmx stdlib/sort.p.cmx \ - stdlib/stack.cmx stdlib/stack.p.cmx \ - stdlib/stdLabels.cmx stdlib/stdLabels.p.cmx \ - stdlib/std_exit.cmx stdlib/std_exit.p.cmx stdlib/std_exit.$O stdlib/std_exit.p.$O \ - stdlib/stream.cmx stdlib/stream.p.cmx \ - stdlib/string.cmx stdlib/string.p.cmx \ - stdlib/stringLabels.cmx stdlib/stringLabels.p.cmx \ - stdlib/sys.cmx stdlib/sys.p.cmx \ - stdlib/weak.cmx stdlib/weak.p.cmx \ - stdlib/$set.cmx stdlib/$set.p.cmx \ - $LIBDIR - -installlibdir \ - stdlib/stdlib.$A stdlib/stdlib.p.$A \ - $LIBDIR - -echo "Installing ocamllex, ocamldebug..." -installbin lex/ocamllex$EXE $BINDIR/ocamllex$EXE -installbin debugger/ocamldebug$EXE $BINDIR/ocamldebug$EXE -installbin lex/ocamllex.opt$EXE $BINDIR/ocamllex.opt$EXE -installbin tools/ocamldep.native$EXE $BINDIR/ocamldep.opt$EXE - -echo "Installing some tools..." -installbin tools/objinfo.byte$EXE $BINDIR/ocamlobjinfo$EXE -installbin ../tools/objinfo_helper$EXE $LIBDIR/objinfo_helper$EXE -installbin tools/ocamlcp.byte$EXE $BINDIR/ocamlcp$EXE -installbin tools/ocamldep.byte$EXE $BINDIR/ocamldep$EXE -installbin tools/ocamlmklib.byte$EXE $BINDIR/ocamlmklib$EXE -installbin tools/ocamlmktop.byte$EXE $BINDIR/ocamlmktop$EXE -installbin tools/ocamlprof.byte$EXE $BINDIR/ocamlprof$EXE -installbin toplevel/expunge.byte$EXE $LIBDIR/expunge$EXE -installbin tools/addlabels.byte $LIBDIR/addlabels -installbin tools/scrapelabels.byte $LIBDIR/scrapelabels -installbin otherlibs/dynlink/extract_crc.byte $LIBDIR/extract_crc -installbin otherlibs/labltk/lib/labltk$EXE $BINDIR/labltk$EXE -installbin otherlibs/labltk/browser/ocamlbrowser$EXE $BINDIR/ocamlbrowser$EXE -installbin otherlibs/labltk/compiler/pp$EXE $LIBDIR/labltk/pp$EXE -installbin otherlibs/labltk/lib/labltktop$EXE $LIBDIR/labltk/labltktop$EXE - -echo "Installing libraries..." -installdir \ - otherlibs/bigarray/bigarray.cma \ - otherlibs/dbm/dbm.cma \ - otherlibs/dynlink/dynlink.cma \ - otherlibs/"$WIN32"graph/graphics.cma \ - otherlibs/num/nums.cma \ - otherlibs/str/str.cma \ - otherlibs/"$WIN32"unix/unix.cma \ - otherlibs/bigarray/bigarray.cmxa \ - otherlibs/dbm/dbm.cmxa \ - otherlibs/dynlink/dynlink.cmxa \ - otherlibs/"$WIN32"graph/graphics.cmxa \ - otherlibs/num/nums.cmxa \ - otherlibs/str/str.cmxa \ - otherlibs/"$WIN32"unix/unix.cmxa \ - toplevel/toplevellib.cma \ - otherlibs/systhreads/thread.mli \ - otherlibs/systhreads/mutex.mli \ - otherlibs/systhreads/condition.mli \ - otherlibs/systhreads/event.mli \ - otherlibs/systhreads/threadUnix.mli \ - $LIBDIR - -installdir \ - otherlibs/labltk/support/fileevent.mli \ - otherlibs/labltk/support/fileevent.cmi \ - otherlibs/labltk/support/fileevent.cmx \ - otherlibs/labltk/support/protocol.mli \ - otherlibs/labltk/support/protocol.cmi \ - otherlibs/labltk/support/protocol.cmx \ - otherlibs/labltk/support/textvariable.mli \ - otherlibs/labltk/support/textvariable.cmi \ - otherlibs/labltk/support/textvariable.cmx \ - otherlibs/labltk/support/timer.mli \ - otherlibs/labltk/support/timer.cmi \ - otherlibs/labltk/support/timer.cmx \ - otherlibs/labltk/support/rawwidget.mli \ - otherlibs/labltk/support/rawwidget.cmi \ - otherlibs/labltk/support/rawwidget.cmx \ - otherlibs/labltk/support/widget.mli \ - otherlibs/labltk/support/widget.cmi \ - otherlibs/labltk/support/widget.cmx \ - otherlibs/labltk/support/tkthread.mli \ - otherlibs/labltk/support/tkthread.cmi \ - otherlibs/labltk/support/tkthread.cmo \ - otherlibs/labltk/support/tkthread.$O \ - otherlibs/labltk/support/tkthread.cmx \ - otherlibs/labltk/labltk/[^_]*.mli \ - otherlibs/labltk/labltk/*.cmi \ - otherlibs/labltk/labltk/*.cmx \ - otherlibs/labltk/camltk/[^_]*.mli \ - otherlibs/labltk/camltk/*.cmi \ - otherlibs/labltk/camltk/*.cmx \ - otherlibs/labltk/frx/frxlib.cma \ - otherlibs/labltk/frx/frxlib.cmxa \ - ../otherlibs/labltk/frx/*.mli \ - otherlibs/labltk/frx/*.cmi \ - otherlibs/labltk/jpf/jpflib.cma \ - otherlibs/labltk/jpf/jpflib.cmxa \ - otherlibs/labltk/jpf/*.mli \ - otherlibs/labltk/jpf/*.cmi \ - otherlibs/labltk/jpf/*.cmx \ - otherlibs/labltk/lib/labltk.cma \ - otherlibs/labltk/lib/labltk.cmxa \ - otherlibs/labltk/lib/labltk.cmx \ - otherlibs/labltk/compiler/tkcompiler \ - $LIBDIR/labltk - -installdir \ - otherlibs/systhreads/threads.cma \ - otherlibs/systhreads/threads.cmxa \ - otherlibs/systhreads/thread.cmi \ - otherlibs/systhreads/thread.cmx \ - otherlibs/systhreads/mutex.cmi \ - otherlibs/systhreads/mutex.cmx \ - otherlibs/systhreads/condition.cmi \ - otherlibs/systhreads/condition.cmx \ - otherlibs/systhreads/event.cmi \ - otherlibs/systhreads/event.cmx \ - otherlibs/systhreads/threadUnix.cmi \ - otherlibs/systhreads/threadUnix.cmx \ - $LIBDIR/threads - -installdir \ - otherlibs/bigarray/dllbigarray$EXT_DLL \ - otherlibs/dbm/dllmldbm$EXT_DLL \ - otherlibs/"$WIN32"graph/dllgraphics$EXT_DLL \ - otherlibs/num/dllnums$EXT_DLL \ - otherlibs/str/dllstr$EXT_DLL \ - otherlibs/systhreads/dllthreads$EXT_DLL \ - otherlibs/"$WIN32"unix/dllunix$EXT_DLL \ - otherlibs/threads/dllvmthreads$EXT_DLL \ - otherlibs/labltk/support/dlllabltk$EXT_DLL \ - $STUBLIBDIR - -installlibdir \ - otherlibs/threads/libvmthreads.$A \ - $LIBDIR/vmthreads - -installdir \ - otherlibs/threads/thread.cmi \ - otherlibs/threads/thread.mli \ - otherlibs/threads/mutex.cmi \ - otherlibs/threads/mutex.mli \ - otherlibs/threads/condition.cmi \ - otherlibs/threads/condition.mli \ - otherlibs/threads/event.cmi \ - otherlibs/threads/event.mli \ - otherlibs/threads/threadUnix.cmi \ - otherlibs/threads/threadUnix.mli \ - otherlibs/threads/threads.cma \ - otherlibs/threads/stdlib.cma \ - otherlibs/threads/unix.cma \ - $LIBDIR/vmthreads - -installlibdir \ - otherlibs/labltk/support/liblabltk.$A \ - otherlibs/labltk/lib/labltk.$A \ - otherlibs/labltk/jpf/jpflib.$A \ - otherlibs/labltk/frx/frxlib.$A \ - $LIBDIR/labltk - -installlibdir \ - otherlibs/bigarray/libbigarray.$A \ - otherlibs/dbm/libmldbm.$A \ - otherlibs/"$WIN32"graph/libgraphics.$A \ - otherlibs/num/libnums.$A \ - otherlibs/str/libstr.$A \ - otherlibs/systhreads/libthreads.$A \ - otherlibs/systhreads/libthreadsnat.$A \ - otherlibs/"$WIN32"unix/libunix.$A \ - $LIBDIR - -echo "Installing object files and interfaces..." -installdir \ - tools/profiling.cm[oi] \ - toplevel/topstart.cmo \ - toplevel/toploop.cmi \ - toplevel/topdirs.cmi \ - toplevel/topmain.cmi \ - typing/outcometree.cmi \ - typing/outcometree.mli \ - otherlibs/graph/graphicsX11.cmi \ - otherlibs/graph/graphicsX11.mli \ - otherlibs/dynlink/dynlink.cmi \ - otherlibs/dynlink/dynlink.mli \ - otherlibs/num/arith_status.cmi \ - otherlibs/num/arith_status.mli \ - otherlibs/num/big_int.cmi \ - otherlibs/num/big_int.mli \ - otherlibs/num/nat.cmi \ - otherlibs/num/nat.mli \ - otherlibs/num/num.cmi \ - otherlibs/num/num.mli \ - otherlibs/num/ratio.cmi \ - otherlibs/num/ratio.mli \ - otherlibs/bigarray/bigarray.cmi \ - otherlibs/bigarray/bigarray.mli \ - otherlibs/dbm/dbm.cmi \ - otherlibs/dbm/dbm.mli \ - otherlibs/dynlink/dynlink.cmx \ - otherlibs/"$WIN32"graph/graphics.cmi \ - otherlibs/"$WIN32"graph/graphics.mli \ - otherlibs/str/str.cmi \ - otherlibs/str/str.mli \ - otherlibs/"$WIN32"unix/unix.cmi \ - otherlibs/"$WIN32"unix/unix.mli \ - otherlibs/"$WIN32"unix/unixLabels.cmi \ - otherlibs/"$WIN32"unix/unixLabels.mli \ - otherlibs/num/arith_flags.cmx \ - otherlibs/num/int_misc.cmx \ - otherlibs/num/arith_status.cmx \ - otherlibs/num/big_int.cmx \ - otherlibs/num/nat.cmx \ - otherlibs/num/num.cmx \ - otherlibs/num/ratio.cmx \ - otherlibs/bigarray/bigarray.cmx \ - otherlibs/dbm/dbm.cmx \ - otherlibs/"$WIN32"graph/graphics.cmx \ - otherlibs/graph/graphicsX11.cmx \ - otherlibs/str/str.cmx \ - otherlibs/"$WIN32"unix/unix.cmx \ - otherlibs/"$WIN32"unix/unixLabels.cmx \ - $LIBDIR - -installlibdir \ - otherlibs/bigarray/bigarray.$A \ - otherlibs/dbm/dbm.$A \ - otherlibs/dynlink/dynlink.$A \ - otherlibs/"$WIN32"graph/graphics.$A \ - otherlibs/num/nums.$A \ - otherlibs/str/str.$A \ - otherlibs/"$WIN32"unix/unix.$A \ - stdlib/stdlib.$A \ - $LIBDIR - -installlibdir \ - otherlibs/systhreads/threads.$A \ - $LIBDIR/threads - -echo "Installing manuals..." -(cd ../man && make install) - -echo "Installing ocamldoc..." -installbin ocamldoc/ocamldoc $BINDIR/ocamldoc$EXE -installbin ocamldoc/ocamldoc.opt $BINDIR/ocamldoc.opt$EXE - -installdir \ - ../ocamldoc/ocamldoc.hva \ - ocamldoc/*.cmi \ - ocamldoc/odoc_info.mli ocamldoc/odoc_info.cm[ia] ocamldoc/odoc_info.cmxa \ - ocamldoc/odoc_info.$A \ - $LIBDIR/ocamldoc - -installdir \ - ocamldoc/stdlib_man/* \ - $MANDIR/man3 - -echo "Installing camlp4..." -installbin camlp4/camlp4prof.byte$EXE $BINDIR/camlp4prof$EXE -installbin camlp4/mkcamlp4.byte$EXE $BINDIR/mkcamlp4$EXE -installbin camlp4/camlp4.byte$EXE $BINDIR/camlp4$EXE -installbin camlp4/camlp4boot.byte$EXE $BINDIR/camlp4boot$EXE -installbin camlp4/camlp4o.byte$EXE $BINDIR/camlp4o$EXE -installbin camlp4/camlp4of.byte$EXE $BINDIR/camlp4of$EXE -installbin camlp4/camlp4oof.byte$EXE $BINDIR/camlp4oof$EXE -installbin camlp4/camlp4orf.byte$EXE $BINDIR/camlp4orf$EXE -installbin camlp4/camlp4r.byte$EXE $BINDIR/camlp4r$EXE -installbin camlp4/camlp4rf.byte$EXE $BINDIR/camlp4rf$EXE -installbin camlp4/camlp4o.native$EXE $BINDIR/camlp4o.opt$EXE -installbin camlp4/camlp4of.native$EXE $BINDIR/camlp4of.opt$EXE -installbin camlp4/camlp4oof.native$EXE $BINDIR/camlp4oof.opt$EXE -installbin camlp4/camlp4orf.native$EXE $BINDIR/camlp4orf.opt$EXE -installbin camlp4/camlp4r.native$EXE $BINDIR/camlp4r.opt$EXE -installbin camlp4/camlp4rf.native$EXE $BINDIR/camlp4rf.opt$EXE - -cd camlp4 -CAMLP4DIR=$LIBDIR/camlp4 -for dir in Camlp4Parsers Camlp4Printers Camlp4Filters Camlp4Top; do - echo "Installing $dir..." - mkdir -p $CAMLP4DIR/$dir - installdir \ - $dir/*.cm* \ - $dir/*.$O \ - $CAMLP4DIR/$dir -done -installdir \ - camlp4lib.cma camlp4lib.cmxa Camlp4.cmi \ - camlp4fulllib.cma camlp4fulllib.cmxa \ - camlp4o.cma camlp4of.cma camlp4oof.cma \ - camlp4orf.cma camlp4r.cma camlp4rf.cma \ - Camlp4Bin.cm[iox] Camlp4Bin.$O Camlp4Top.cm[io] \ - Camlp4_config.cmi camlp4prof.cm[iox] camlp4prof.$O Camlp4_import.cmi \ - $CAMLP4DIR -installlibdir camlp4lib.$A camlp4fulllib.$A $CAMLP4DIR -cd .. - -echo "Installing ocamlbuild..." - -cd ocamlbuild -installbin ocamlbuild.byte$EXE $BINDIR/ocamlbuild.byte$EXE -installbin ocamlbuild.native$EXE $BINDIR/ocamlbuild.native$EXE -installbestbin ocamlbuild.native$EXE ocamlbuild.byte$EXE $BINDIR/ocamlbuild$EXE - -installlibdir \ - ocamlbuildlib.$A \ - $LIBDIR/ocamlbuild - -installdir \ - ocamlbuildlib.cmxa \ - ocamlbuildlib.cma \ - ocamlbuild_plugin.cmi \ - ocamlbuild_plugin.cmo \ - ocamlbuild_plugin.cmx \ - ocamlbuild_pack.cmi \ - ocamlbuild_unix_plugin.cmi \ - ocamlbuild_unix_plugin.cmo \ - ocamlbuild_unix_plugin.cmx \ - ocamlbuild_unix_plugin.$O \ - ocamlbuild_executor.cmi \ - ocamlbuild_executor.cmo \ - ocamlbuild_executor.cmx \ - ocamlbuild_executor.$O \ - ocamlbuild.cmo \ - ocamlbuild.cmx \ - ocamlbuild.$O \ - $LIBDIR/ocamlbuild -cd .. - -installdir \ - ../ocamlbuild/man/ocamlbuild.1 \ - $MANDIR/man1 diff --git a/build/mixed-boot.sh b/build/mixed-boot.sh deleted file mode 100755 index 133f8cff..00000000 --- a/build/mixed-boot.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -ex -cd `dirname $0`/.. -touch build/ocamlbuild_mixed_mode -mkdir -p _build -cp -rf boot _build/ -./build/mkconfig.sh -./build/mkmyocamlbuild_config.sh -./build/boot.sh diff --git a/build/mkconfig.sh b/build/mkconfig.sh deleted file mode 100755 index 8cf1773d..00000000 --- a/build/mkconfig.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0`/.. - -sed -e 's/^\(.*\$([0-9]).*\)$/# \1/' \ - -e 's/\$(\([^)]*\))/${\1}/g' \ - -e 's/^FLEX.*$//g' \ - -e 's/^\([^#=]*\)=\([^"]*\)$/if [ "x$\1" = "x" ]; then \1="\2"; fi/' \ - config/Makefile > config/config.sh - -if [ "x$EXE" = "x.exe" -a "x$SYSTEM" != "xcygwin" ]; then - echo "WINDOWS=true" >> config/config.sh -else - echo "WINDOWS=false" >> config/config.sh -fi diff --git a/build/mkmyocamlbuild_config.sh b/build/mkmyocamlbuild_config.sh deleted file mode 100755 index 75d6e9ca..00000000 --- a/build/mkmyocamlbuild_config.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0`/.. - -sed \ - -e 's/^.*FLEXDIR.*$//g' \ - -e '/^SET_LD_PATH/d' \ - -e 's/^#ml \(.*\)/\1/' \ - -e 's/^\([^"][^"]*\("[^"]*"[^"]*\)*\)#.*$/\1/' \ - -e 's/^\(#.*\)$/(* \1 *)/' \ - -e 's/^\(.*\$([0-9]).*\)$/(* \1 *)/' \ - -e 's/^\([^(=]*\)=\([^"]*\)$/let <:lower<\1>> = "\2";;/' \ - -e 's/\$(AS)/as/g' \ - -e 's/\$(\([^)]*\))/"\^<:lower<\1>>\^"/g' \ - -e 's/""\^//g' \ - -e 's/\^""//g' \ - -e 's/^let <:lower myocamlbuild_config.ml diff --git a/build/mkruntimedef.sh b/build/mkruntimedef.sh deleted file mode 100755 index a1bf141e..00000000 --- a/build/mkruntimedef.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -echo 'let builtin_exceptions = [|'; \ -sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$| \1;|p' byterun/fail.h | \ -sed -e '$s/;$//'; \ -echo '|]'; \ -echo 'let builtin_primitives = [|'; \ -sed -e 's/.*/ "&";/' -e '$s/;$//' byterun/primitives; \ -echo '|]' diff --git a/build/myocamlbuild.sh b/build/myocamlbuild.sh deleted file mode 100755 index 34ad894f..00000000 --- a/build/myocamlbuild.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, Berke Durak, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0`/.. -set -xe -if [ ! -x _build/ocamlbuild/ocamlbuildlight.byte ]; then - if [ ! -x ocamlbuild/_build/ocamlbuildlight.byte ]; then - (cd ocamlbuild && ${GNUMAKE:-make}) - fi - mkdir -p _build/ocamlbuild - for i in "light.cmo" "light.byte" "lightlib.cma" "_plugin.cmi" "_pack.cmi" - do - cp ocamlbuild/_build/ocamlbuild$i _build/ocamlbuild - done -fi -rm -f ocamlbuild/myocamlbuild_config.ml ocamlbuild/myocamlbuild_config.mli -rm -rf _build/myocamlbuild boot/myocamlbuild boot/myocamlbuild.native -./boot/ocamlrun _build/ocamlbuild/ocamlbuildlight.byte -no-hygiene \ - -tag debug -install-lib-dir _build/ocamlbuild -byte-plugin -just-plugin -cp _build/myocamlbuild boot/myocamlbuild.boot diff --git a/build/new-build-system b/build/new-build-system deleted file mode 100644 index acd7125d..00000000 --- a/build/new-build-system +++ /dev/null @@ -1,52 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -_tags # Defines tags to setup exceptions -myocamlbuild.ml # Contains all needed rules that are differents -boot/ocamldep -myocamlbuild_config.mli -utils/config.mlbuild # Should be renamed as utils/config.ml - -# Files that just contain module names of object files. -**/*.mllib # Files that describe the contents of an OCaml library -**/*.mlpack # Files that describe the contents of an OCaml package -**/*.cilb # Files that describe the contents of an C static library -**/*.dilb # Files that describe the contents of an C dynamic library - -build/ - world.sh # Build all the OCaml world - world.byte.sh # Build the bytecode world - world.native.sh # Build the native world - world.all.sh # Build all the world the don't bootstrap - fastworld.sh # Same as above but faster - boot-c-parts.sh # Compile byterun, ocamlyacc and asmrun with the Makefiles - boot.sh # Compile the stdlib and ocamlc - camlp4-targets.sh # Setup camlp4 targets - otherlibs-targets.sh # Setup otherlibs targets - targets.sh # All targets of the OCaml distribution - - - install.sh # Install all needed files - distclean.sh # Clean all generated files - - myocamlbuild.sh # Regenerate the boot/myocamlbuild program - mkconfig.sh # Generate config/config.sh - mkmyocamlbuild_config.sh # Generate myocamlbuild_config.ml - - camlp4-bootstrap.sh - - # Partial stuffs (just camlp4 and ocamlbuild) - mixed-boot.sh - camlp4-byte-only.sh - camlp4-native-only.sh - ocamlbuild-byte-only.sh - ocamlbuild-native-only.sh diff --git a/build/ocamlbuildlib-native-only.sh b/build/ocamlbuildlib-native-only.sh deleted file mode 100755 index 285c561a..00000000 --- a/build/ocamlbuildlib-native-only.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2008 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. -. build/targets.sh -set -x -$OCAMLBUILD $@ native_stdlib_mixed_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $OCAMLBUILDLIB_NATIVE diff --git a/build/otherlibs-targets.sh b/build/otherlibs-targets.sh deleted file mode 100644 index bd28a0dc..00000000 --- a/build/otherlibs-targets.sh +++ /dev/null @@ -1,120 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2008 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -OTHERLIBS_BYTE="" -OTHERLIBS_NATIVE="" -OTHERLIBS_UNIX_NATIVE="" -UNIXDIR="otherlibs/unix" - -add_native() { - for native_file in $@; do - OTHERLIBS_NATIVE="$OTHERLIBS_NATIVE otherlibs/$lib/$native_file" - case $lib in - unix|win32unix) - OTHERLIBS_UNIX_NATIVE="$OTHERLIBS_UNIX_NATIVE otherlibs/$lib/$native_file";; - esac - done -} - -add_byte() { - for byte_file in $@; do - OTHERLIBS_BYTE="$OTHERLIBS_BYTE otherlibs/$lib/$byte_file" - done -} - -add_file() { - add_byte $@ - add_native $@ -} - -add_bin() { - for bin_file in $@; do - add_byte $bin_file.byte$EXE - add_native $bin_file.native$EXE - done -} - -add_c_lib() { - add_file "lib$1.$A" -} - -add_ocaml_lib() { - add_native "$1.cmxa" - add_native "$1.$A" - add_byte "$1.cma" -} - -add_dll() { - add_file "dll$1$EXT_DLL" -} - -add() { - add_c_lib $1 - add_ocaml_lib $1 - add_dll $1 -} - -THREADS_CMIS="thread.cmi mutex.cmi condition.cmi event.cmi threadUnix.cmi" - -for lib in $OTHERLIBRARIES; do - case $lib in - num) - add nums;; - systhreads) - add_ocaml_lib threads - add_dll threads - add_file $THREADS_CMIS - add_byte libthreads.$A - add_native libthreadsnat.$A;; - graph|win32graph) - add graphics;; - threads) - add_byte pervasives.cmi pervasives.mli \ - $THREADS_CMIS marshal.cmi marshal.mli \ - stdlib.cma unix.cma threads.cma libvmthreads.$A;; - labltk) - add_file support/camltk.h - add_byte support/byte.otarget - add_native support/native.otarget - add_file support/liblabltk.$A - add_byte compiler/tkcompiler$EXE compiler/pp$EXE - add_file labltk/tk.ml labltk/labltk.ml - add_byte labltk/byte.otarget - add_native labltk/native.otarget - add_byte camltk/byte.otarget - add_native camltk/native.otarget - add_ocaml_lib lib/labltk - add_byte lib/labltktop$EXE lib/labltk$EXE - add_ocaml_lib jpf/jpflib - add_ocaml_lib frx/frxlib - add_byte browser/ocamlbrowser$EXE - ;; - dbm) - add_ocaml_lib dbm - add_c_lib mldbm;; - dynlink) - add_ocaml_lib dynlink - add_native dynlink.cmx dynlink.$O - add_file $lib.cmi extract_crc;; - win32unix) - UNIXDIR="otherlibs/win32unix" - add_file unixsupport.h cst2constr.h socketaddr.h - add unix;; - unix) - add_file unixsupport.h - add unix;; - *) - add $lib - esac -done diff --git a/build/partial-install.sh b/build/partial-install.sh deleted file mode 100755 index c06154a8..00000000 --- a/build/partial-install.sh +++ /dev/null @@ -1,188 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -###################################### -######### Copied from build/install.sh -###################################### - -set -e - -cd `dirname $0`/.. - -. config/config.sh - -not_installed=$PWD/_build/not_installed - -rm -f "$not_installed" -touch "$not_installed" - -wontinstall() { - echo "$1" >> "$not_installed" - echo " don't install $1" -} - -installbin() { - if [ -f "$1" ]; then - echo " install binary $2" - cp -f "$1" "$2" - [ -x "$2" ] || chmod +x "$2" - else - wontinstall "$1" - fi -} - -installbestbin() { - if [ -f "$1" ]; then - echo " install binary $3 (with `basename $1`)" - cp -f "$1" "$3" - else - if [ -f "$2" ]; then - echo " install binary $3 (with `basename $2`)" - cp -f "$2" "$3" - else - echo "None of $1, $2 exists" - exit 3 - fi - fi - [ -x "$3" ] || chmod +x "$3" -} - -installlib() { - if [ -f "$1" ]; then - dest="$2/`basename $1`" - echo " install library $dest" - cp -f "$1" "$2" - if [ "$RANLIB" != "" ]; then - "$RANLIB" "$dest" - fi - else - wontinstall "$1" - fi -} - -installdir() { - args="" - while [ $# -gt 1 ]; do - if [ -f "$1" ]; then - args="$args $1" - else - wontinstall "$1" - fi - shift - done - last="$1" - for file in $args; do - echo " install $last/`basename $file`" - cp -f "$file" "$last" - done -} - -installlibdir() { - args="" - while [ $# -gt 1 ]; do - args="$args $1" - shift - done - last="$1" - for file in $args; do - installlib "$file" "$last" - done -} - -mkdir -p $BINDIR -mkdir -p $LIBDIR -mkdir -p $LIBDIR/camlp4 -mkdir -p $LIBDIR/ocamlbuild -mkdir -p $STUBLIBDIR -mkdir -p $MANDIR/man1 -mkdir -p $MANDIR/man3 -mkdir -p $MANDIR/man$MANEXT - -cd _build - -echo "Installing camlp4..." -installbin camlp4/camlp4prof.byte$EXE $BINDIR/camlp4prof$EXE -installbin camlp4/mkcamlp4.byte$EXE $BINDIR/mkcamlp4$EXE -installbin camlp4/camlp4.byte$EXE $BINDIR/camlp4$EXE -installbin camlp4/camlp4boot.byte$EXE $BINDIR/camlp4boot$EXE -installbin camlp4/camlp4o.byte$EXE $BINDIR/camlp4o$EXE -installbin camlp4/camlp4of.byte$EXE $BINDIR/camlp4of$EXE -installbin camlp4/camlp4oof.byte$EXE $BINDIR/camlp4oof$EXE -installbin camlp4/camlp4orf.byte$EXE $BINDIR/camlp4orf$EXE -installbin camlp4/camlp4r.byte$EXE $BINDIR/camlp4r$EXE -installbin camlp4/camlp4rf.byte$EXE $BINDIR/camlp4rf$EXE -installbin camlp4/camlp4o.native$EXE $BINDIR/camlp4o.opt$EXE -installbin camlp4/camlp4of.native$EXE $BINDIR/camlp4of.opt$EXE -installbin camlp4/camlp4oof.native$EXE $BINDIR/camlp4oof.opt$EXE -installbin camlp4/camlp4orf.native$EXE $BINDIR/camlp4orf.opt$EXE -installbin camlp4/camlp4r.native$EXE $BINDIR/camlp4r.opt$EXE -installbin camlp4/camlp4rf.native$EXE $BINDIR/camlp4rf.opt$EXE - -if test -d camlp4; then - cd camlp4 - CAMLP4DIR=$LIBDIR/camlp4 - for dir in Camlp4Parsers Camlp4Printers Camlp4Filters Camlp4Top; do - echo "Installing $dir..." - mkdir -p $CAMLP4DIR/$dir - installdir \ - $dir/*.cm* \ - $dir/*.$O \ - $CAMLP4DIR/$dir - done - installdir \ - camlp4lib.cma camlp4lib.cmxa Camlp4.cmi \ - camlp4fulllib.cma camlp4fulllib.cmxa \ - camlp4o.cma camlp4of.cma camlp4oof.cma \ - camlp4orf.cma camlp4r.cma camlp4rf.cma \ - Camlp4Bin.cm[iox] Camlp4Bin.$O Camlp4Top.cm[io] \ - Camlp4_config.cmi camlp4prof.cm[iox] camlp4prof.$O Camlp4_import.cmi \ - $CAMLP4DIR - installlibdir camlp4lib.$A camlp4fulllib.$A $CAMLP4DIR - cd .. -fi - -echo "Installing ocamlbuild..." -cd ocamlbuild -installbin ocamlbuild.byte$EXE $BINDIR/ocamlbuild.byte$EXE -installbin ocamlbuild.native$EXE $BINDIR/ocamlbuild.native$EXE -installbestbin ocamlbuild.native$EXE ocamlbuild.byte$EXE $BINDIR/ocamlbuild$EXE - -installlibdir \ - ocamlbuildlib.$A \ - $LIBDIR/ocamlbuild - -installdir \ - ocamlbuildlib.cmxa \ - ocamlbuildlib.cma \ - ocamlbuild_plugin.cmi \ - ocamlbuild_plugin.cmo \ - ocamlbuild_plugin.cmx \ - ocamlbuild_pack.cmi \ - ocamlbuild_unix_plugin.cmi \ - ocamlbuild_unix_plugin.cmo \ - ocamlbuild_unix_plugin.cmx \ - ocamlbuild_unix_plugin.$O \ - ocamlbuild_executor.cmi \ - ocamlbuild_executor.cmo \ - ocamlbuild_executor.cmx \ - ocamlbuild_executor.$O \ - ocamlbuild.cmo \ - ocamlbuild.cmx \ - ocamlbuild.$O \ - $LIBDIR/ocamlbuild -cd .. - -installdir \ - ../ocamlbuild/man/ocamlbuild.1 \ - $MANDIR/man1 diff --git a/build/targets.sh b/build/targets.sh deleted file mode 100644 index 219f73cd..00000000 --- a/build/targets.sh +++ /dev/null @@ -1,62 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -. config/config.sh -. build/otherlibs-targets.sh -. build/camlp4-targets.sh - -INSTALL_BIN="$BINDIR" -export INSTALL_BIN - -STDLIB_BYTE="stdlib/libcamlrun.$A stdlib/stdlib.cma \ - stdlib/std_exit.cmo stdlib/camlheader stdlib/camlheader_ur" -OCAMLLEX_BYTE=lex/ocamllex$EXE -OCAMLC_BYTE=ocamlc$EXE -OCAMLOPT_BYTE=ocamlopt$EXE -OCAMLBUILD_BYTE="ocamlbuild/ocamlbuildlib.cma \ - ocamlbuild/ocamlbuildlightlib.cma \ - ocamlbuild/ocamlbuild.byte$EXE \ - ocamlbuild/ocamlbuildlight.byte$EXE" -TOPLEVEL=ocaml$EXE -TOOLS_BYTE="tools/objinfo.byte$EXE \ - tools/ocamldep.byte$EXE tools/profiling.cmo \ - tools/ocamlprof.byte$EXE tools/ocamlcp.byte$EXE \ - tools/ocamlmktop.byte$EXE tools/ocamlmklib$EXE \ - tools/scrapelabels.byte tools/addlabels.byte \ - tools/dumpobj.byte$EXE" -if [ ! -z "$DEBUGGER" ]; then - DEBUGGER=debugger/ocamldebug$EXE -fi -OCAMLDOC_BYTE="ocamldoc/ocamldoc$EXE ocamldoc/odoc_info.cma" -STDLIB_NATIVE="stdlib/stdlib.cmxa stdlib/std_exit.cmx asmrun/libasmrun.$A" -case $PROFILING in -prof) - STDLIB_NATIVE="$STDLIB_NATIVE asmrun/libasmrunp.$A \ - stdlib/stdlib.p.cmxa stdlib/std_exit.p.cmx";; -noprof) ;; -*) echo "unexpected PROFILING value $PROFILING"; exit 1;; -esac -OCAMLC_NATIVE=ocamlc.opt$EXE -OCAMLOPT_NATIVE=ocamlopt.opt$EXE -OCAMLLEX_NATIVE=lex/ocamllex.opt$EXE -TOOLS_NATIVE=tools/ocamldep.native$EXE -OCAMLDOC_NATIVE="ocamldoc/ocamldoc.opt$EXE ocamldoc/odoc_info.cmxa ocamldoc/stdlib_man/Pervasives.3o" -OCAMLBUILDLIB_NATIVE="ocamlbuild/ocamlbuildlib.cmxa \ - ocamlbuild/ocamlbuildlightlib.cmxa" -OCAMLBUILD_NATIVE="$OCAMLBUILDLIB_NATIVE \ - ocamlbuild/ocamlbuild.native$EXE \ - ocamlbuild/ocamlbuildlight.native$EXE" -if [ -x boot/myocamlbuild.native ]; then - OCAMLBUILD=./boot/myocamlbuild.native -else - OCAMLBUILD="./boot/ocamlrun boot/myocamlbuild" -fi diff --git a/build/tolower.sed b/build/tolower.sed deleted file mode 100644 index ce0eb165..00000000 --- a/build/tolower.sed +++ /dev/null @@ -1,23 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -# tolower.sed expands one ...<:lower>... to ...foo... per line -h -s/.*<:lower<\(.*\)>>.*/\1/ -t cont -b end -:cont -y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ -s/$/|/ -G -s/\(.*\)|\n\(.*\)<:lower<\(.*\)>>/\2\1/ -:end diff --git a/build/world.all.sh b/build/world.all.sh deleted file mode 100755 index 45c053cd..00000000 --- a/build/world.all.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. -. build/targets.sh -set -x -$OCAMLBUILD $@ \ - $STDLIB_BYTE $OCAMLC_BYTE $OCAMLLEX_BYTE $OCAMLOPT_BYTE $TOPLEVEL \ - $TOOLS_BYTE $OTHERLIBS_BYTE $OCAMLBUILD_BYTE $DEBUGGER $OCAMLDOC_BYTE \ - $CAMLP4_BYTE $STDLIB_NATIVE $OCAMLC_NATIVE $OCAMLOPT_NATIVE \ - $OCAMLLEX_NATIVE $TOOLS_NATIVE $OTHERLIBS_NATIVE \ - $OCAMLBUILD_NATIVE $OCAMLDOC_NATIVE $CAMLP4_NATIVE diff --git a/build/world.byte.sh b/build/world.byte.sh deleted file mode 100755 index 5a520b99..00000000 --- a/build/world.byte.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. -. build/targets.sh -set -x -$OCAMLBUILD $@ \ - $STDLIB_BYTE $OCAMLC_BYTE $OCAMLLEX_BYTE $OCAMLOPT_BYTE $TOPLEVEL $TOOLS_BYTE \ - $OTHERLIBS_BYTE $OCAMLBUILD_BYTE $DEBUGGER $OCAMLDOC_BYTE $CAMLP4_BYTE diff --git a/build/world.native.sh b/build/world.native.sh deleted file mode 100755 index 4f99467b..00000000 --- a/build/world.native.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -set -e -cd `dirname $0`/.. -. build/targets.sh -set -x -$OCAMLBUILD $@ \ - $STDLIB_NATIVE $OCAMLC_NATIVE $OCAMLOPT_NATIVE \ - $OCAMLLEX_NATIVE $TOOLS_NATIVE $OTHERLIBS_NATIVE \ - $OCAMLBUILD_NATIVE $OCAMLDOC_NATIVE $CAMLP4_NATIVE diff --git a/build/world.sh b/build/world.sh deleted file mode 100755 index 3b08dc78..00000000 --- a/build/world.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/sh - -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2008 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the Q Public License version 1.0. # -# # -######################################################################### - -cd `dirname $0` -set -e -if [ -e ocamlbuild_mixed_mode ]; then - echo ocamlbuild mixed mode detected - echo 'please cleanup and re-launch (make clean ; ./build/distclean.sh)' - exit 1 -fi -case "$1" in - all|a|al) mode=all;; - byte|b|by|byt) mode=byte;; - native|na|nat|nati|nativ) mode=native;; - *) echo 'Unexpected target. Expected targets are: all,byte,native' \ - >/dev/stderr - exit 1;; -esac -shift -./mkconfig.sh -./mkmyocamlbuild_config.sh -./boot-c-parts.sh -./boot.sh "$@" -./world."$mode".sh "$@" diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index e933df53..af5f0a3f 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -74,7 +74,7 @@ let make_branch cont = match cont with (Kbranch _ as branch) :: _ -> (branch, cont) | (Kreturn _ as return) :: _ -> (return, cont) - | Kraise :: _ -> (Kraise, cont) + | Kraise k :: _ -> (Kraise k, cont) | Klabel lbl :: _ -> make_branch_2 (Some lbl) 0 cont cont | _ -> make_branch_2 (None) 0 cont cont @@ -108,7 +108,7 @@ let rec add_pop n cont = match cont with Kpop m :: cont -> add_pop (n + m) cont | Kreturn m :: cont -> Kreturn(n + m) :: cont - | Kraise :: _ -> cont + | Kraise _ :: _ -> cont | _ -> Kpop n :: cont (* Add the constant "unit" in front of a continuation *) @@ -233,9 +233,15 @@ let add_event ev = (**** Compilation of a lambda expression ****) -(* association staticraise numbers -> (lbl,size of stack *) +let try_blocks = ref [] (* list of stack size for each nested try block *) + +(* association staticraise numbers -> (lbl,size of stack, try_blocks *) let sz_static_raises = ref [] + +let push_static_raise i lbl_handler sz = + sz_static_raises := (i, (lbl_handler, sz, !try_blocks)) :: !sz_static_raises + let find_raise_label i = try List.assoc i !sz_static_raises @@ -247,8 +253,8 @@ let find_raise_label i = (* Will the translation of l lead to a jump to label ? *) let code_as_jump l sz = match l with | Lstaticraise (i,[]) -> - let label,size = find_raise_label i in - if sz = size then + let label,size,tb = find_raise_label i in + if sz = size && tb == !try_blocks then Some label else None @@ -275,6 +281,10 @@ let compunit_name = ref "" let max_stack_used = ref 0 + +(* Sequence of string tests *) + + (* Translate a primitive to a bytecode instruction (possibly a call to a C function) *) @@ -397,10 +407,15 @@ let comp_primitive p args = | Pbigstring_set_64(_) -> Kccall("caml_ba_uint8_set64", 3) | Pbswap16 -> Kccall("caml_bswap16", 1) | Pbbswap(bi) -> comp_bint_primitive bi "bswap" args + | Pint_as_pointer -> Kccall("caml_int_as_pointer", 1) | _ -> fatal_error "Bytegen.comp_primitive" let is_immed n = immed_min <= n && n <= immed_max +module Storer = + Switch.Store + (struct type t = lambda type key = lambda + let make_key = Lambda.make_key end) (* Compile an expression. The value of the expression is left in the accumulator. @@ -584,8 +599,8 @@ let rec comp_expr env exp sz cont = comp_expr env exp1 sz (Kstrictbranchif lbl :: comp_expr env exp2 sz cont1) end - | Lprim(Praise, [arg]) -> - comp_expr env arg sz (Kraise :: discard_dead_code cont) + | Lprim(Praise k, [arg]) -> + comp_expr env arg sz (Kraise k :: discard_dead_code cont) | Lprim(Paddint, [arg; Lconst(Const_base(Const_int n))]) when is_immed n -> comp_expr env arg sz (Koffsetint n :: cont) @@ -618,7 +633,7 @@ let rec comp_expr env exp sz cont = comp_args env args sz (comp_primitive p args :: cont) | Lprim(p, args) -> comp_args env args sz (comp_primitive p args :: cont) - | Lstaticcatch (body, (i, vars) , handler) -> + | Lstaticcatch (body, (i, vars) , handler) -> let nvars = List.length vars in let branch1, cont1 = make_branch cont in let r = @@ -628,8 +643,7 @@ let rec comp_expr env exp sz cont = (comp_expr (add_vars vars (sz+1) env) handler (sz+nvars) (add_pop nvars cont1)) in - sz_static_raises := - (i, (lbl_handler, sz+nvars)) :: !sz_static_raises ; + push_static_raise i lbl_handler (sz+nvars); push_dummies nvars (comp_expr env body (sz+nvars) (add_pop nvars (branch1 :: cont2))) @@ -640,30 +654,39 @@ let rec comp_expr env exp sz cont = (Kpush::comp_expr (add_var var (sz+1) env) handler (sz+1) (add_pop 1 cont1)) in - sz_static_raises := - (i, (lbl_handler, sz)) :: !sz_static_raises ; + push_static_raise i lbl_handler sz; comp_expr env body sz (branch1 :: cont2) end in sz_static_raises := List.tl !sz_static_raises ; r | Lstaticraise (i, args) -> let cont = discard_dead_code cont in - let label,size = find_raise_label i in + let label,size,tb = find_raise_label i in + let cont = branch_to label cont in + let rec loop sz tbb = + if tb == tbb then add_pop (sz-size) cont + else match tbb with + | [] -> assert false + | try_sz :: tbb -> add_pop (sz-try_sz-4) (Kpoptrap :: loop try_sz tbb) + in + let cont = loop sz !try_blocks in begin match args with | [arg] -> (* optim, argument passed in accumulator *) - comp_expr env arg sz - (add_pop (sz-size) (branch_to label cont)) - | _ -> - comp_exit_args env args sz size - (add_pop (sz-size) (branch_to label cont)) + comp_expr env arg sz cont + | _ -> comp_exit_args env args sz size cont end | Ltrywith(body, id, handler) -> let (branch1, cont1) = make_branch cont in let lbl_handler = new_label() in - Kpushtrap lbl_handler :: - comp_expr env body (sz+4) (Kpoptrap :: branch1 :: - Klabel lbl_handler :: Kpush :: - comp_expr (add_var id (sz+1) env) handler (sz+1) (add_pop 1 cont1)) + let body_cont = + Kpoptrap :: branch1 :: + Klabel lbl_handler :: Kpush :: + comp_expr (add_var id (sz+1) env) handler (sz+1) (add_pop 1 cont1) + in + try_blocks := sz :: !try_blocks; + let l = comp_expr env body (sz+4) body_cont in + try_blocks := List.tl !try_blocks; + Kpushtrap lbl_handler :: l | Lifthenelse(cond, ifso, ifnot) -> comp_binary_test env cond ifso ifnot sz cont | Lsequence(exp1, exp2) -> @@ -691,10 +714,11 @@ let rec comp_expr env exp sz cont = | Lswitch(arg, sw) -> let (branch, cont1) = make_branch cont in let c = ref (discard_dead_code cont1) in + (* Build indirection vectors *) - let store = mk_store Lambda.same in - let act_consts = Array.create sw.sw_numconsts 0 - and act_blocks = Array.create sw.sw_numblocks 0 in + let store = Storer.mk_store () in + let act_consts = Array.make sw.sw_numconsts 0 + and act_blocks = Array.make sw.sw_numblocks 0 in begin match sw.sw_failaction with (* default is index 0 *) | Some fail -> ignore (store.act_store fail) | None -> () @@ -703,10 +727,20 @@ let rec comp_expr env exp sz cont = (fun (n, act) -> act_consts.(n) <- store.act_store act) sw.sw_consts; List.iter (fun (n, act) -> act_blocks.(n) <- store.act_store act) sw.sw_blocks; - (* Compile and label actions *) let acts = store.act_get () in - let lbls = Array.create (Array.length acts) 0 in +(* + let a = store.act_get_shared () in + Array.iter + (function + | Switch.Shared (Lstaticraise _) -> () + | Switch.Shared act -> + Printlambda.lambda Format.str_formatter act ; + Printf.eprintf "SHARE BYTE:\n%s\n" (Format.flush_str_formatter ()) + | _ -> ()) + a ; +*) + let lbls = Array.make (Array.length acts) 0 in for i = Array.length acts-1 downto 0 do let lbl,c1 = label_code (comp_expr env acts.(i) sz (branch :: !c)) in lbls.(i) <- lbl ; @@ -714,15 +748,17 @@ let rec comp_expr env exp sz cont = done ; (* Build label vectors *) - let lbl_blocks = Array.create sw.sw_numblocks 0 in + let lbl_blocks = Array.make sw.sw_numblocks 0 in for i = sw.sw_numblocks - 1 downto 0 do lbl_blocks.(i) <- lbls.(act_blocks.(i)) done; - let lbl_consts = Array.create sw.sw_numconsts 0 in + let lbl_consts = Array.make sw.sw_numconsts 0 in for i = sw.sw_numconsts - 1 downto 0 do lbl_consts.(i) <- lbls.(act_consts.(i)) done; comp_expr env arg sz (Kswitch(lbl_consts, lbl_blocks) :: !c) + | Lstringswitch (arg,sw,d) -> + comp_expr env (Matching.expand_stringswitch arg sw d) sz cont | Lassign(id, expr) -> begin try let pos = Ident.find_same id env.ce_stack in @@ -827,6 +863,10 @@ and comp_binary_test env cond ifso ifnot sz cont = comp_expr env cond sz cont_cond +(* Compile string switch *) + +and comp_string_switch env arg cases default sz cont = () + (**** Compilation of a code block (with tracking of stack usage) ****) let comp_block env exp sz cont = @@ -890,3 +930,10 @@ let compile_phrase expr = let init_code = comp_block empty_env expr 1 [Kreturn 1] in let fun_code = comp_remainder [] in (init_code, fun_code) + +let reset () = + label_counter := 0; + sz_static_raises := []; + compunit_name := ""; + Stack.clear functions_to_compile; + max_stack_used := 0 diff --git a/bytecomp/bytegen.mli b/bytecomp/bytegen.mli index 3c24cc8e..24f1d64f 100644 --- a/bytecomp/bytegen.mli +++ b/bytecomp/bytegen.mli @@ -17,3 +17,4 @@ open Instruct val compile_implementation: string -> lambda -> instruction list val compile_phrase: lambda -> instruction list * instruction list +val reset: unit -> unit diff --git a/bytecomp/bytelibrarian.ml b/bytecomp/bytelibrarian.ml index fdcb0d88..7c96dfd0 100644 --- a/bytecomp/bytelibrarian.ml +++ b/bytecomp/bytelibrarian.ml @@ -60,7 +60,7 @@ let copy_object_file ppf oc name = raise(Error(File_not_found name)) in let ic = open_in_bin file_name in try - let buffer = input_bytes ic (String.length cmo_magic_number) in + let buffer = really_input_string ic (String.length cmo_magic_number) in if buffer = cmo_magic_number then begin let compunit_pos = input_binary_int ic in seek_in ic compunit_pos; @@ -117,3 +117,15 @@ let report_error ppf = function | Not_an_object_file name -> fprintf ppf "The file %a is not a bytecode object file" Location.print_filename name + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let reset () = + lib_ccobjs := []; + lib_ccopts := []; + lib_dllibs := [] diff --git a/bytecomp/bytelibrarian.mli b/bytecomp/bytelibrarian.mli index 757874cb..b9a4ced8 100644 --- a/bytecomp/bytelibrarian.mli +++ b/bytecomp/bytelibrarian.mli @@ -30,3 +30,5 @@ exception Error of error open Format val report_error: formatter -> error -> unit + +val reset: unit -> unit diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index 20983668..c0f8f6a9 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -113,7 +113,7 @@ let scan_file obj_name tolink = raise(Error(File_not_found obj_name)) in let ic = open_in_bin file_name in try - let buffer = input_bytes ic (String.length cmo_magic_number) in + let buffer = really_input_string ic (String.length cmo_magic_number) in if buffer = cmo_magic_number then begin (* This is a .cmo file. It must be linked in any case. Read the relocation information to see which modules it @@ -158,15 +158,20 @@ let scan_file obj_name tolink = (* Consistency check between interfaces *) let crc_interfaces = Consistbl.create () +let interfaces = ref ([] : string list) let implementations_defined = ref ([] : (string * string) list) let check_consistency ppf file_name cu = begin try List.iter - (fun (name, crc) -> - if name = cu.cu_name - then Consistbl.set crc_interfaces name crc file_name - else Consistbl.check crc_interfaces name crc file_name) + (fun (name, crco) -> + interfaces := name :: !interfaces; + match crco with + None -> () + | Some crc -> + if name = cu.cu_name + then Consistbl.set crc_interfaces name crc file_name + else Consistbl.check crc_interfaces name crc file_name) cu.cu_imports with Consistbl.Inconsistency(name, user, auth) -> raise(Error(Inconsistent_import(name, user, auth))) @@ -183,7 +188,11 @@ let check_consistency ppf file_name cu = (cu.cu_name, file_name) :: !implementations_defined let extract_crc_interfaces () = - Consistbl.extract crc_interfaces + Consistbl.extract !interfaces crc_interfaces + +let clear_crc_interfaces () = + Consistbl.clear crc_interfaces; + interfaces := [] (* Record compilation events *) @@ -256,7 +265,7 @@ let output_debug_info oc = List.iter (fun (ofs, evl) -> output_binary_int oc ofs; - Array.iter (output_string oc) evl) + Array.iter (output_bytes oc) evl) !debug_info; debug_info := [] @@ -307,19 +316,20 @@ let link_bytecode ppf tolink exec_name standalone = (* The bytecode *) let start_code = pos_out outchan in Symtable.init(); - Consistbl.clear crc_interfaces; + clear_crc_interfaces (); let sharedobjs = List.map Dll.extract_dll_name !Clflags.dllibs in - if standalone then begin + let check_dlls = standalone && Config.target = Config.host in + if check_dlls then begin (* Initialize the DLL machinery *) Dll.init_compile !Clflags.no_std_include; Dll.add_path !load_path; try Dll.open_dlls Dll.For_checking sharedobjs with Failure reason -> raise(Error(Cannot_open_dll reason)) end; - let output_fun = output_string outchan + let output_fun = output_bytes outchan and currpos_fun () = pos_out outchan - start_code in List.iter (link_file ppf output_fun currpos_fun) tolink; - if standalone then Dll.close_all_dlls(); + if check_dlls then Dll.close_all_dlls(); (* The final STOP instruction *) output_byte outchan Opcodes.opSTOP; output_byte outchan 0; output_byte outchan 0; output_byte outchan 0; @@ -370,12 +380,12 @@ let output_code_string_counter = ref 0 let output_code_string outchan code = let pos = ref 0 in - let len = String.length code in + let len = Bytes.length code in while !pos < len do - let c1 = Char.code(code.[!pos]) in - let c2 = Char.code(code.[!pos + 1]) in - let c3 = Char.code(code.[!pos + 2]) in - let c4 = Char.code(code.[!pos + 3]) in + let c1 = Char.code(Bytes.get code !pos) in + let c2 = Char.code(Bytes.get code (!pos + 1)) in + let c3 = Char.code(Bytes.get code (!pos + 2)) in + let c4 = Char.code(Bytes.get code (!pos + 3)) in pos := !pos + 4; Printf.fprintf outchan "0x%02x%02x%02x%02x, " c4 c3 c2 c1; incr output_code_string_counter; @@ -439,11 +449,11 @@ let link_bytecode_as_c ppf tolink outfile = \n char **argv);\n"; output_string outchan "static int caml_code[] = {\n"; Symtable.init(); - Consistbl.clear crc_interfaces; + clear_crc_interfaces (); let currpos = ref 0 in let output_fun code = output_code_string outchan code; - currpos := !currpos + String.length code + currpos := !currpos + Bytes.length code and currpos_fun () = !currpos in List.iter (link_file ppf output_fun currpos_fun) tolink; (* The final STOP instruction *) @@ -621,3 +631,20 @@ let report_error ppf = function | Not_compatible_32 -> fprintf ppf "Generated bytecode executable cannot be run\ \ on a 32-bit platform" + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let reset () = + lib_ccobjs := []; + lib_ccopts := []; + lib_dllibs := []; + missing_globals := IdentSet.empty; + Consistbl.clear crc_interfaces; + implementations_defined := []; + debug_info := []; + output_code_string_counter := 0 diff --git a/bytecomp/bytelink.mli b/bytecomp/bytelink.mli index 6e123c3f..37dad2b5 100644 --- a/bytecomp/bytelink.mli +++ b/bytecomp/bytelink.mli @@ -13,11 +13,12 @@ (* Link .cmo files and produce a bytecode executable. *) val link : Format.formatter -> string list -> string -> unit +val reset : unit -> unit val check_consistency: Format.formatter -> string -> Cmo_format.compilation_unit -> unit -val extract_crc_interfaces: unit -> (string * Digest.t) list +val extract_crc_interfaces: unit -> (string * Digest.t option) list type error = File_not_found of string diff --git a/bytecomp/bytepackager.ml b/bytecomp/bytepackager.ml index f548c771..3348f46d 100644 --- a/bytecomp/bytepackager.ml +++ b/bytecomp/bytepackager.ml @@ -17,6 +17,8 @@ open Misc open Instruct open Cmo_format +module StringSet = Set.Make(String) + type error = Forward_reference of string * Ident.t | Multiple_definition of string * Ident.t @@ -30,6 +32,7 @@ exception Error of error let relocs = ref ([] : (reloc_info * int) list) let events = ref ([] : debug_event list) +let debug_dirs = ref StringSet.empty let primitives = ref ([] : string list) let force_link = ref false @@ -98,7 +101,9 @@ let read_member_info file = ( if Filename.check_suffix file ".cmo" then begin let ic = open_in_bin file in try - let buffer = input_bytes ic (String.length Config.cmo_magic_number) in + let buffer = + really_input_string ic (String.length Config.cmo_magic_number) + in if buffer <> Config.cmo_magic_number then raise(Error(Not_an_object_file file)); let compunit_pos = input_binary_int ic in @@ -137,6 +142,10 @@ let rename_append_bytecode ppf packagename oc mapping defined ofs prefix subst if !Clflags.debug && compunit.cu_debug > 0 then begin seek_in ic compunit.cu_debug; List.iter (relocate_debug ofs prefix subst) (input_value ic); + debug_dirs := List.fold_left + (fun s e -> StringSet.add e s) + !debug_dirs + (input_value ic); end; close_in ic; compunit.cu_codesize @@ -182,6 +191,8 @@ let build_global_target oc target_name members mapping pos coercion = let lam = Translmod.transl_package components (Ident.create_persistent target_name) coercion in + if !Clflags.dump_lambda then + Format.printf "%a@." Printlambda.lambda lam; let instrs = Bytegen.compile_implementation target_name lam in let rel = @@ -213,6 +224,7 @@ let package_object_files ppf files targetfile targetname coercion = let pos_debug = pos_out oc in if !Clflags.debug && !events <> [] then output_value oc (List.rev !events); + output_value oc (StringSet.elements !debug_dirs); let pos_final = pos_out oc in let imports = List.filter @@ -223,7 +235,8 @@ let package_object_files ppf files targetfile targetname coercion = cu_pos = pos_code; cu_codesize = pos_debug - pos_code; cu_reloc = List.rev !relocs; - cu_imports = (targetname, Env.crc_of_unit targetname) :: imports; + cu_imports = + (targetname, Some (Env.crc_of_unit targetname)) :: imports; cu_primitives = !primitives; cu_force_link = !force_link; cu_debug = if pos_final > pos_debug then pos_debug else 0; @@ -238,7 +251,7 @@ let package_object_files ppf files targetfile targetname coercion = (* The entry point *) -let package_files ppf files targetfile = +let package_files ppf initial_env files targetfile = let files = List.map (fun f -> @@ -249,11 +262,12 @@ let package_files ppf files targetfile = let targetcmi = prefix ^ ".cmi" in let targetname = String.capitalize(Filename.basename prefix) in try - let coercion = Typemod.package_units files targetcmi targetname in - let ret = package_object_files ppf files targetfile targetname coercion in - ret - with x -> - remove_file targetfile; raise x + let coercion = + Typemod.package_units initial_env files targetcmi targetname in + let ret = package_object_files ppf files targetfile targetname coercion in + ret + with x -> + remove_file targetfile; raise x (* Error report *) @@ -276,3 +290,16 @@ let report_error ppf = function Location.print_filename file name id | File_not_found file -> fprintf ppf "File %s not found" file + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let reset () = + relocs := []; + events := []; + primitives := []; + force_link := false diff --git a/bytecomp/bytepackager.mli b/bytecomp/bytepackager.mli index 04de0726..69e3c77a 100644 --- a/bytecomp/bytepackager.mli +++ b/bytecomp/bytepackager.mli @@ -13,7 +13,7 @@ (* "Package" a set of .cmo files into one .cmo file having the original compilation units as sub-modules. *) -val package_files: Format.formatter -> string list -> string -> unit +val package_files: Format.formatter -> Env.t -> string list -> string -> unit type error = Forward_reference of string * Ident.t @@ -25,3 +25,4 @@ type error = exception Error of error val report_error: Format.formatter -> error -> unit +val reset: unit -> unit diff --git a/bytecomp/bytesections.ml b/bytecomp/bytesections.ml index 5af3bc52..759bde3b 100644 --- a/bytecomp/bytesections.ml +++ b/bytecomp/bytesections.ml @@ -46,12 +46,14 @@ let read_toc ic = let pos_trailer = in_channel_length ic - 16 in seek_in ic pos_trailer; let num_sections = input_binary_int ic in - let header = Misc.input_bytes ic (String.length Config.exec_magic_number) in + let header = + really_input_string ic (String.length Config.exec_magic_number) + in if header <> Config.exec_magic_number then raise Bad_magic_number; seek_in ic (pos_trailer - 8 * num_sections); section_table := []; for _i = 1 to num_sections do - let name = Misc.input_bytes ic 4 in + let name = really_input_string ic 4 in let len = input_binary_int ic in section_table := (name, len) :: !section_table done @@ -77,7 +79,7 @@ let seek_section ic name = (* Return the contents of a section, as a string *) let read_section_string ic name = - Misc.input_bytes ic (seek_section ic name) + really_input_string ic (seek_section ic name) (* Return the contents of a section, as marshalled data *) @@ -90,3 +92,7 @@ let read_section_struct ic name = let pos_first_section ic = in_channel_length ic - 16 - 8 * List.length !section_table - List.fold_left (fun total (name, len) -> total + len) 0 !section_table + +let reset () = + section_table := []; + section_beginning := 0 diff --git a/bytecomp/bytesections.mli b/bytecomp/bytesections.mli index b9639c1f..12e679d7 100644 --- a/bytecomp/bytesections.mli +++ b/bytecomp/bytesections.mli @@ -50,3 +50,5 @@ val read_section_struct: in_channel -> string -> 'a val pos_first_section: in_channel -> int (* Return the position of the beginning of the first section *) + +val reset: unit -> unit diff --git a/bytecomp/cmo_format.mli b/bytecomp/cmo_format.mli index abf4f1af..0c0f08f0 100644 --- a/bytecomp/cmo_format.mli +++ b/bytecomp/cmo_format.mli @@ -27,7 +27,8 @@ type compilation_unit = mutable cu_pos: int; (* Absolute position in file *) cu_codesize: int; (* Size of code block *) cu_reloc: (reloc_info * int) list; (* Relocation information *) - cu_imports: (string * Digest.t) list; (* Names and CRC of intfs imported *) + cu_imports: + (string * Digest.t option) list; (* Names and CRC of intfs imported *) cu_primitives: string list; (* Primitives declared inside *) mutable cu_force_link: bool; (* Must be linked even if unref'ed *) mutable cu_debug: int; (* Position of debugging info, or 0 *) diff --git a/bytecomp/dll.ml b/bytecomp/dll.ml index 5c62b9ed..21688e08 100644 --- a/bytecomp/dll.ml +++ b/bytecomp/dll.ml @@ -173,3 +173,9 @@ let init_toplevel dllpath = opened_dlls := Array.to_list (get_current_dlls()); names_of_opened_dlls := []; linking_in_core := true + +let reset () = + search_path := []; + opened_dlls :=[]; + names_of_opened_dlls := []; + linking_in_core := false diff --git a/bytecomp/dll.mli b/bytecomp/dll.mli index 975315e2..878ffb91 100644 --- a/bytecomp/dll.mli +++ b/bytecomp/dll.mli @@ -59,3 +59,5 @@ val init_compile: bool -> unit contents of ld.conf file). Take note of the DLLs that were opened when starting the running program. *) val init_toplevel: string -> unit + +val reset: unit -> unit diff --git a/bytecomp/emitcode.ml b/bytecomp/emitcode.ml index 2f1d5859..77df4611 100644 --- a/bytecomp/emitcode.ml +++ b/bytecomp/emitcode.ml @@ -20,6 +20,8 @@ open Instruct open Opcodes open Cmo_format +module StringSet = Set.Make(String) + (* Buffering of bytecode *) let out_buffer = ref(LongString.create 1024) @@ -80,7 +82,7 @@ let label_table = ref ([| |] : label_definition array) let extend_label_table needed = let new_size = ref(Array.length !label_table) in while needed >= !new_size do new_size := 2 * !new_size done; - let new_table = Array.create !new_size (Label_undefined []) in + let new_table = Array.make !new_size (Label_undefined []) in Array.blit !label_table 0 new_table 0 (Array.length !label_table); label_table := new_table @@ -135,8 +137,12 @@ and slot_for_c_prim name = (* Debugging events *) let events = ref ([] : debug_event list) +let debug_dirs = ref StringSet.empty let record_event ev = + let path = ev.ev_loc.Location.loc_start.Lexing.pos_fname in + let abspath = Location.absolute_path path in + debug_dirs := StringSet.add (Filename.dirname abspath) !debug_dirs; ev.ev_pos <- !out_position; events := ev :: !events @@ -144,8 +150,9 @@ let record_event ev = let init () = out_position := 0; - label_table := Array.create 16 (Label_undefined []); + label_table := Array.make 16 (Label_undefined []); reloc_info := []; + debug_dirs := StringSet.empty; events := [] (* Emission of one instruction *) @@ -243,7 +250,9 @@ let emit_instr = function | Kboolnot -> out opBOOLNOT | Kpushtrap lbl -> out opPUSHTRAP; out_label lbl | Kpoptrap -> out opPOPTRAP - | Kraise -> out opRAISE + | Kraise Raise_regular -> out opRAISE + | Kraise Raise_reraise -> out opRERAISE + | Kraise Raise_notrace -> out opRAISE_NOTRACE | Kcheck_signals -> out opCHECK_SIGNALS | Kccall(name, n) -> if n <= 5 @@ -351,7 +360,7 @@ let rec emit = function (* Emission to a file *) -let to_file outchan unit_name code = +let to_file outchan unit_name objfile code = init(); output_string outchan cmo_magic_number; let pos_depl = pos_out outchan in @@ -361,8 +370,12 @@ let to_file outchan unit_name code = LongString.output outchan !out_buffer 0 !out_position; let (pos_debug, size_debug) = if !Clflags.debug then begin + debug_dirs := StringSet.add + (Filename.dirname (Location.absolute_path objfile)) + !debug_dirs; let p = pos_out outchan in output_value outchan !events; + output_value outchan (StringSet.elements !debug_dirs); (p, pos_out outchan - p) end else (0, 0) in @@ -371,7 +384,7 @@ let to_file outchan unit_name code = cu_pos = pos_code; cu_codesize = !out_position; cu_reloc = List.rev !reloc_info; - cu_imports = Env.imported_units(); + cu_imports = Env.imports(); cu_primitives = List.map Primitive.byte_name !Translmod.primitive_declarations; cu_force_link = false; @@ -392,7 +405,7 @@ let to_memory init_code fun_code = emit init_code; emit fun_code; let code = Meta.static_alloc !out_position in - LongString.unsafe_blit_to_string !out_buffer 0 code 0 !out_position; + LongString.unsafe_blit_to_bytes !out_buffer 0 code 0 !out_position; let reloc = List.rev !reloc_info and code_size = !out_position in init(); @@ -407,3 +420,9 @@ let to_packed_file outchan code = let reloc = !reloc_info in init(); reloc + +let reset () = + out_buffer := LongString.create 1024; + out_position := 0; + label_table := [| |]; + reloc_info := [] diff --git a/bytecomp/emitcode.mli b/bytecomp/emitcode.mli index 60d79143..e2fdb815 100644 --- a/bytecomp/emitcode.mli +++ b/bytecomp/emitcode.mli @@ -15,13 +15,14 @@ open Cmo_format open Instruct -val to_file: out_channel -> string -> instruction list -> unit +val to_file: out_channel -> string -> string -> instruction list -> unit (* Arguments: channel on output file name of compilation unit implemented + path of cmo file being written list of instructions to emit *) val to_memory: instruction list -> instruction list -> - string * int * (reloc_info * int) list + bytes * int * (reloc_info * int) list (* Arguments: initialization code (terminated by STOP) function code @@ -36,3 +37,5 @@ val to_packed_file: list of instructions to emit Result: relocation information (reversed) *) + +val reset: unit -> unit diff --git a/bytecomp/instruct.ml b/bytecomp/instruct.ml index 5edcacd2..70d62229 100644 --- a/bytecomp/instruct.ml +++ b/bytecomp/instruct.ml @@ -85,7 +85,7 @@ type instruction = | Kboolnot | Kpushtrap of label | Kpoptrap - | Kraise + | Kraise of raise_kind | Kcheck_signals | Kccall of string * int | Knegint | Kaddint | Ksubint | Kmulint | Kdivint | Kmodint diff --git a/bytecomp/instruct.mli b/bytecomp/instruct.mli index d81228ac..024dba13 100644 --- a/bytecomp/instruct.mli +++ b/bytecomp/instruct.mli @@ -105,7 +105,7 @@ type instruction = | Kboolnot | Kpushtrap of label | Kpoptrap - | Kraise + | Kraise of raise_kind | Kcheck_signals | Kccall of string * int | Knegint | Kaddint | Ksubint | Kmulint | Kdivint | Kmodint diff --git a/bytecomp/lambda.ml b/bytecomp/lambda.ml index cfced858..4ad8e9b4 100644 --- a/bytecomp/lambda.ml +++ b/bytecomp/lambda.ml @@ -21,11 +21,19 @@ type compile_time_constant = | Ostype_win32 | Ostype_cygwin +type loc_kind = + | Loc_FILE + | Loc_LINE + | Loc_MODULE + | Loc_LOC + | Loc_POS + type primitive = Pidentity | Pignore | Prevapply of Location.t | Pdirapply of Location.t + | Ploc of loc_kind (* Globals *) | Pgetglobal of Ident.t | Psetglobal of Ident.t @@ -41,7 +49,7 @@ type primitive = (* External call *) | Pccall of Primitive.description (* Exceptions *) - | Praise + | Praise of raise_kind (* Boolean operations *) | Psequand | Psequor | Pnot (* Integer operations *) @@ -113,6 +121,8 @@ type primitive = (* byte swap *) | Pbswap16 | Pbbswap of boxed_integer + (* Integer to external pointer *) + | Pint_as_pointer and comparison = Ceq | Cneq | Clt | Cgt | Cle | Cge @@ -137,6 +147,11 @@ and bigarray_layout = | Pbigarray_c_layout | Pbigarray_fortran_layout +and raise_kind = + | Raise_regular + | Raise_reraise + | Raise_notrace + type structured_constant = Const_base of constant | Const_pointer of int @@ -161,6 +176,7 @@ type lambda = | Lletrec of (Ident.t * lambda) list * lambda | Lprim of primitive * lambda list | Lswitch of lambda * lambda_switch + | Lstringswitch of lambda * (string * lambda) list * lambda option | Lstaticraise of int * lambda list | Lstaticcatch of lambda * (int * Ident.t list) * lambda | Ltrywith of lambda * Ident.t * lambda @@ -195,68 +211,96 @@ let const_unit = Const_pointer 0 let lambda_unit = Lconst const_unit -let rec same l1 l2 = - match (l1, l2) with - | Lvar v1, Lvar v2 -> - Ident.same v1 v2 - | Lconst c1, Lconst c2 -> - c1 = c2 - | Lapply(a1, bl1, _), Lapply(a2, bl2, _) -> - same a1 a2 && samelist same bl1 bl2 - | Lfunction(k1, idl1, a1), Lfunction(k2, idl2, a2) -> - k1 = k2 && samelist Ident.same idl1 idl2 && same a1 a2 - | Llet(k1, id1, a1, b1), Llet(k2, id2, a2, b2) -> - k1 = k2 && Ident.same id1 id2 && same a1 a2 && same b1 b2 - | Lletrec (bl1, a1), Lletrec (bl2, a2) -> - samelist samebinding bl1 bl2 && same a1 a2 - | Lprim(p1, al1), Lprim(p2, al2) -> - p1 = p2 && samelist same al1 al2 - | Lswitch(a1, s1), Lswitch(a2, s2) -> - same a1 a2 && sameswitch s1 s2 - | Lstaticraise(n1, al1), Lstaticraise(n2, al2) -> - n1 = n2 && samelist same al1 al2 - | Lstaticcatch(a1, (n1, idl1), b1), Lstaticcatch(a2, (n2, idl2), b2) -> - same a1 a2 && n1 = n2 && samelist Ident.same idl1 idl2 && same b1 b2 - | Ltrywith(a1, id1, b1), Ltrywith(a2, id2, b2) -> - same a1 a2 && Ident.same id1 id2 && same b1 b2 - | Lifthenelse(a1, b1, c1), Lifthenelse(a2, b2, c2) -> - same a1 a2 && same b1 b2 && same c1 c2 - | Lsequence(a1, b1), Lsequence(a2, b2) -> - same a1 a2 && same b1 b2 - | Lwhile(a1, b1), Lwhile(a2, b2) -> - same a1 a2 && same b1 b2 - | Lfor(id1, a1, b1, df1, c1), Lfor(id2, a2, b2, df2, c2) -> - Ident.same id1 id2 && same a1 a2 && - same b1 b2 && df1 = df2 && same c1 c2 - | Lassign(id1, a1), Lassign(id2, a2) -> - Ident.same id1 id2 && same a1 a2 - | Lsend(k1, a1, b1, cl1, _), Lsend(k2, a2, b2, cl2, _) -> - k1 = k2 && same a1 a2 && same b1 b2 && samelist same cl1 cl2 - | Levent(a1, ev1), Levent(a2, ev2) -> - same a1 a2 && ev1.lev_loc = ev2.lev_loc - | Lifused(id1, a1), Lifused(id2, a2) -> - Ident.same id1 id2 && same a1 a2 - | _, _ -> - false - -and samebinding (id1, c1) (id2, c2) = - Ident.same id1 id2 && same c1 c2 - -and sameswitch sw1 sw2 = - let samecase (n1, a1) (n2, a2) = n1 = n2 && same a1 a2 in - sw1.sw_numconsts = sw2.sw_numconsts && - sw1.sw_numblocks = sw2.sw_numblocks && - samelist samecase sw1.sw_consts sw2.sw_consts && - samelist samecase sw1.sw_blocks sw2.sw_blocks && - (match (sw1.sw_failaction, sw2.sw_failaction) with - | (None, None) -> true - | (Some a1, Some a2) -> same a1 a2 - | _ -> false) - -let name_lambda arg fn = +(* Build sharing keys *) +(* + Those keys are later compared with Pervasives.compare. + For that reason, they should not include cycles. +*) + +exception Not_simple + +let max_raw = 32 + +let make_key e = + let count = ref 0 (* Used for controling size *) + and make_key = Ident.make_key_generator () in + (* make_key is used for normalizing let-bound variables *) + let rec tr_rec env e = + incr count ; + if !count > max_raw then raise Not_simple ; (* Too big ! *) + match e with + | Lvar id -> + begin + try Ident.find_same id env + with Not_found -> e + end + | Lconst (Const_base (Const_string _)|Const_float_array _) -> + (* Mutable constants are not shared *) + raise Not_simple + | Lconst _ -> e + | Lapply (e,es,loc) -> + Lapply (tr_rec env e,tr_recs env es,Location.none) + | Llet (Alias,x,ex,e) -> (* Ignore aliases -> substitute *) + let ex = tr_rec env ex in + tr_rec (Ident.add x ex env) e + | Llet (str,x,ex,e) -> + (* Because of side effects, keep other lets with normalized names *) + let ex = tr_rec env ex in + let y = make_key x in + Llet (str,y,ex,tr_rec (Ident.add x (Lvar y) env) e) + | Lprim (p,es) -> + Lprim (p,tr_recs env es) + | Lswitch (e,sw) -> + Lswitch (tr_rec env e,tr_sw env sw) + | Lstringswitch (e,sw,d) -> + Lstringswitch + (tr_rec env e, + List.map (fun (s,e) -> s,tr_rec env e) sw, + tr_opt env d) + | Lstaticraise (i,es) -> + Lstaticraise (i,tr_recs env es) + | Lstaticcatch (e1,xs,e2) -> + Lstaticcatch (tr_rec env e1,xs,tr_rec env e2) + | Ltrywith (e1,x,e2) -> + Ltrywith (tr_rec env e1,x,tr_rec env e2) + | Lifthenelse (cond,ifso,ifnot) -> + Lifthenelse (tr_rec env cond,tr_rec env ifso,tr_rec env ifnot) + | Lsequence (e1,e2) -> + Lsequence (tr_rec env e1,tr_rec env e2) + | Lassign (x,e) -> + Lassign (x,tr_rec env e) + | Lsend (m,e1,e2,es,loc) -> + Lsend (m,tr_rec env e1,tr_rec env e2,tr_recs env es,Location.none) + | Lifused (id,e) -> Lifused (id,tr_rec env e) + | Lletrec _|Lfunction _ + | Lfor _ | Lwhile _ +(* Beware: (PR#6412) the event argument to Levent + may include cyclic structure of type Type.typexpr *) + | Levent _ -> + raise Not_simple + + and tr_recs env es = List.map (tr_rec env) es + + and tr_sw env sw = + { sw with + sw_consts = List.map (fun (i,e) -> i,tr_rec env e) sw.sw_consts ; + sw_blocks = List.map (fun (i,e) -> i,tr_rec env e) sw.sw_blocks ; + sw_failaction = tr_opt env sw.sw_failaction ; } + + and tr_opt env = function + | None -> None + | Some e -> Some (tr_rec env e) in + + try + Some (tr_rec Ident.empty e) + with Not_simple -> None + +(***************) + +let name_lambda strict arg fn = match arg with Lvar id -> fn id - | _ -> let id = Ident.create "let" in Llet(Strict, id, arg, fn id) + | _ -> let id = Ident.create "let" in Llet(strict, id, arg, fn id) let name_lambda_list args fn = let rec name_list names = function @@ -268,6 +312,11 @@ let name_lambda_list args fn = Llet(Strict, id, arg, name_list (Lvar id :: names) rem) in name_list [] args + +let iter_opt f = function + | None -> () + | Some e -> f e + let iter f = function Lvar _ | Lconst _ -> () @@ -286,10 +335,11 @@ let iter f = function f arg; List.iter (fun (key, case) -> f case) sw.sw_consts; List.iter (fun (key, case) -> f case) sw.sw_blocks; - begin match sw.sw_failaction with - | None -> () - | Some l -> f l - end + iter_opt f sw.sw_failaction + | Lstringswitch (arg,cases,default) -> + f arg ; + List.iter (fun (_,act) -> f act) cases ; + iter_opt f default | Lstaticraise (_,args) -> List.iter f args | Lstaticcatch(e1, (_,vars), e2) -> @@ -313,6 +363,7 @@ let iter f = function | Lifused (v, e) -> f e + module IdentSet = Set.Make(struct type t = Ident.t @@ -340,7 +391,7 @@ let free_ids get l = | Lassign(id, e) -> fv := IdentSet.add id !fv | Lvar _ | Lconst _ | Lapply _ - | Lprim _ | Lswitch _ | Lstaticraise _ + | Lprim _ | Lswitch _ | Lstringswitch _ | Lstaticraise _ | Lifthenelse _ | Lsequence _ | Lwhile _ | Lsend _ | Levent _ | Lifused _ -> () in free l; !fv @@ -358,6 +409,12 @@ let next_raise_count () = incr raise_count ; !raise_count +let negative_raise_count = ref 0 + +let next_negative_raise_count () = + decr negative_raise_count ; + !negative_raise_count + (* Anticipated staticraise, for guards *) let staticfail = Lstaticraise (0,[]) @@ -378,14 +435,19 @@ let rec patch_guarded patch = function (* Translate an access path *) -let rec transl_path = function +let rec transl_normal_path = function Pident id -> if Ident.global id then Lprim(Pgetglobal id, []) else Lvar id | Pdot(p, s, pos) -> - Lprim(Pfield pos, [transl_path p]) + Lprim(Pfield pos, [transl_normal_path p]) | Papply(p1, p2) -> fatal_error "Lambda.transl_path" +(* Translation of value identifiers *) + +let transl_path ?(loc=Location.none) env path = + transl_normal_path (Env.normalize_path (Some loc) env path) + (* Compile a sequence of expressions *) let rec make_sequence fn = function @@ -414,11 +476,10 @@ let subst_lambda s lam = Lswitch(subst arg, {sw with sw_consts = List.map subst_case sw.sw_consts; sw_blocks = List.map subst_case sw.sw_blocks; - sw_failaction = - match sw.sw_failaction with - | None -> None - | Some l -> Some (subst l)}) - + sw_failaction = subst_opt sw.sw_failaction; }) + | Lstringswitch (arg,cases,default) -> + Lstringswitch + (subst arg,List.map subst_strcase cases,subst_opt default) | Lstaticraise (i,args) -> Lstaticraise (i, List.map subst args) | Lstaticcatch(e1, io, e2) -> Lstaticcatch(subst e1, io, subst e2) | Ltrywith(e1, exn, e2) -> Ltrywith(subst e1, exn, subst e2) @@ -433,6 +494,10 @@ let subst_lambda s lam = | Lifused (v, e) -> Lifused (v, subst e) and subst_decl (id, exp) = (id, subst exp) and subst_case (key, case) = (key, subst case) + and subst_strcase (key, case) = (key, subst case) + and subst_opt = function + | None -> None + | Some e -> Some (subst e) in subst lam @@ -452,3 +517,34 @@ and negate_comparison = function | Ceq -> Cneq| Cneq -> Ceq | Clt -> Cge | Cle -> Cgt | Cgt -> Cle | Cge -> Clt + +let raise_kind = function + | Raise_regular -> "raise" + | Raise_reraise -> "reraise" + | Raise_notrace -> "raise_notrace" + +let lam_of_loc kind loc = + let loc_start = loc.Location.loc_start in + let (file, lnum, cnum) = Location.get_pos_info loc_start in + let enum = loc.Location.loc_end.Lexing.pos_cnum - + loc_start.Lexing.pos_cnum + cnum in + match kind with + | Loc_POS -> + Lconst (Const_block (0, [ + Const_immstring file; + Const_base (Const_int lnum); + Const_base (Const_int cnum); + Const_base (Const_int enum); + ])) + | Loc_FILE -> Lconst (Const_immstring file) + | Loc_MODULE -> Lconst (Const_immstring + (String.capitalize + (Filename.chop_extension (Filename.basename file)))) + | Loc_LOC -> + let loc = Printf.sprintf "File %S, line %d, characters %d-%d" + file lnum cnum enum in + Lconst (Const_immstring loc) + | Loc_LINE -> Lconst (Const_base (Const_int lnum)) + +let reset () = + raise_count := 0 diff --git a/bytecomp/lambda.mli b/bytecomp/lambda.mli index 17da073c..0e038d93 100644 --- a/bytecomp/lambda.mli +++ b/bytecomp/lambda.mli @@ -21,11 +21,19 @@ type compile_time_constant = | Ostype_win32 | Ostype_cygwin +type loc_kind = + | Loc_FILE + | Loc_LINE + | Loc_MODULE + | Loc_LOC + | Loc_POS + type primitive = Pidentity | Pignore | Prevapply of Location.t | Pdirapply of Location.t + | Ploc of loc_kind (* Globals *) | Pgetglobal of Ident.t | Psetglobal of Ident.t @@ -41,7 +49,7 @@ type primitive = (* External call *) | Pccall of Primitive.description (* Exceptions *) - | Praise + | Praise of raise_kind (* Boolean operations *) | Psequand | Psequor | Pnot (* Integer operations *) @@ -113,6 +121,8 @@ type primitive = (* byte swap *) | Pbswap16 | Pbbswap of boxed_integer + (* Integer to external pointer *) + | Pint_as_pointer and comparison = Ceq | Cneq | Clt | Cgt | Cle | Cge @@ -137,6 +147,11 @@ and bigarray_layout = | Pbigarray_c_layout | Pbigarray_fortran_layout +and raise_kind = + | Raise_regular + | Raise_reraise + | Raise_notrace + type structured_constant = Const_base of constant | Const_pointer of int @@ -170,6 +185,9 @@ type lambda = | Lletrec of (Ident.t * lambda) list * lambda | Lprim of primitive * lambda list | Lswitch of lambda * lambda_switch +(* switch on strings, clauses are sorted by string order, + strings are pairwise distinct *) + | Lstringswitch of lambda * (string * lambda) list * lambda option | Lstaticraise of int * lambda list | Lstaticcatch of lambda * (int * Ident.t list) * lambda | Ltrywith of lambda * Ident.t * lambda @@ -199,10 +217,12 @@ and lambda_event_kind = | Lev_after of Types.type_expr | Lev_function -val same: lambda -> lambda -> bool +(* Sharing key *) +val make_key: lambda -> lambda option + val const_unit: structured_constant val lambda_unit: lambda -val name_lambda: lambda -> (Ident.t -> lambda) -> lambda +val name_lambda: let_kind -> lambda -> (Ident.t -> lambda) -> lambda val name_lambda_list: lambda list -> (lambda list -> lambda) -> lambda val iter: (lambda -> unit) -> lambda -> unit @@ -210,7 +230,8 @@ module IdentSet: Set.S with type elt = Ident.t val free_variables: lambda -> IdentSet.t val free_methods: lambda -> IdentSet.t -val transl_path: Path.t -> lambda +val transl_normal_path: Path.t -> lambda (* Path.t is already normal *) +val transl_path: ?loc:Location.t -> Env.t -> Path.t -> lambda val make_sequence: ('a -> lambda) -> 'a list -> lambda val subst_lambda: lambda Ident.tbl -> lambda -> lambda @@ -225,10 +246,19 @@ val negate_comparison : comparison -> comparison (* Get a new static failure ident *) val next_raise_count : unit -> int - +val next_negative_raise_count : unit -> int + (* Negative raise counts are used to compile 'match ... with + exception x -> ...'. This disabled some simplifications + performed by the Simplif module that assume that static raises + are in tail position in their handler. *) val staticfail : lambda (* Anticipated static failure *) (* Check anticipated failure, substitute its final value *) val is_guarded: lambda -> bool val patch_guarded : lambda -> lambda -> lambda + +val raise_kind: raise_kind -> string +val lam_of_loc : loc_kind -> Location.t -> lambda + +val reset: unit -> unit diff --git a/bytecomp/matching.ml b/bytecomp/matching.ml index 5c1d8726..8ab6cec8 100644 --- a/bytecomp/matching.ml +++ b/bytecomp/matching.ml @@ -21,6 +21,9 @@ open Lambda open Parmatch open Printf + +let dbg = false + (* See Peyton-Jones, ``The Implementation of functional programming languages'', chapter 5. *) (* @@ -38,6 +41,10 @@ open Printf - Jump summaries: mapping from exit numbers to contexts *) +let string_of_lam lam = + Printlambda.lambda Format.str_formatter lam ; + Format.flush_str_formatter () + type matrix = pattern list list let add_omega_column pss = List.map (fun ps -> omega::ps) pss @@ -160,12 +167,24 @@ let make_default matcher env = let ctx_matcher p = let p = normalize_pat p in match p.pat_desc with - | Tpat_construct (_, cstr,omegas,_) -> - (fun q rem -> match q.pat_desc with - | Tpat_construct (_, cstr',args,_) when cstr.cstr_tag=cstr'.cstr_tag -> - p,args @ rem - | Tpat_any -> p,omegas @ rem - | _ -> raise NoMatch) + | Tpat_construct (_, cstr,omegas) -> + begin match cstr.cstr_tag with + | Cstr_extension _ -> + let nargs = List.length omegas in + (fun q rem -> match q.pat_desc with + | Tpat_construct (_, cstr',args) + when List.length args = nargs -> + p,args @ rem + | Tpat_any -> p,omegas @ rem + | _ -> raise NoMatch) + | _ -> + (fun q rem -> match q.pat_desc with + | Tpat_construct (_, cstr',args) + when cstr.cstr_tag=cstr'.cstr_tag -> + p,args @ rem + | Tpat_any -> p,omegas @ rem + | _ -> raise NoMatch) + end | Tpat_constant cst -> (fun q rem -> match q.pat_desc with | Tpat_constant cst' when const_compare cst cst' = 0 -> @@ -412,6 +431,7 @@ let rec pretty_precompiled = function | PmOr x -> prerr_endline "++++ OR ++++" ; pretty_pm x.body ; + pretty_matrix x.or_matrix ; List.iter (fun (_,i,_,pm) -> eprintf "++ Handler %d ++\n" i ; @@ -428,67 +448,123 @@ let pretty_precompiled_res first nexts = -(* A slight attempt to identify semantically equivalent lambda-expressions *) -exception Not_simple +(* Identifing some semantically equivalent lambda-expressions, + Our goal here is also to + find alpha-equivalent (simple) terms *) -let rec raw_rec env : lambda -> lambda = function - | Llet(Alias,x,ex, body) -> raw_rec ((x,raw_rec env ex)::env) body - | Lvar id as l -> - begin try List.assoc id env with - | Not_found -> l - end - | Lprim (Pfield i,args) -> - Lprim (Pfield i, List.map (raw_rec env) args) - | Lconst _ as l -> l - | Lstaticraise (i,args) -> - Lstaticraise (i, List.map (raw_rec env) args) - | _ -> raise Not_simple +(* However, as shown by PR#6359 such sharing may hinders the + lambda-code invariant that all bound idents are unique, + when switchs are compiled to test sequences. + The definitive fix is the systematic introduction of exit/catch + in case action sharing is present. +*) + + +module StoreExp = + Switch.Store + (struct + type t = lambda + type key = lambda + let make_key = Lambda.make_key + end) + + +let make_exit i = Lstaticraise (i,[]) + +(* Introduce a catch, if worth it *) +let make_catch d k = match d with +| Lstaticraise (_,[]) -> k d +| _ -> + let e = next_raise_count () in + Lstaticcatch (k (make_exit e),(e,[]),d) -let raw_action l = try raw_rec [] l with Not_simple -> l +(* Introduce a catch, if worth it, delayed version *) +let rec as_simple_exit = function + | Lstaticraise (i,[]) -> Some i + | Llet (Alias,_,_,e) -> as_simple_exit e + | _ -> None + + +let make_catch_delayed handler = match as_simple_exit handler with +| Some i -> i,(fun act -> act) +| None -> + let i = next_raise_count () in +(* + Printf.eprintf "SHARE LAMBDA: %i\n%s\n" i (string_of_lam handler); +*) + i, + (fun body -> match body with + | Lstaticraise (j,_) -> + if i=j then handler else body + | _ -> Lstaticcatch (body,(i,[]),handler)) + + +let raw_action l = + match make_key l with | Some l -> l | None -> l + + +let tr_raw act = match make_key act with +| Some act -> act +| None -> raise Exit let same_actions = function | [] -> None | [_,act] -> Some act | (_,act0) :: rem -> try - let raw_act0 = raw_rec [] act0 in + let raw_act0 = tr_raw act0 in let rec s_rec = function | [] -> Some act0 | (_,act)::rem -> - if raw_act0 = raw_rec [] act then + if raw_act0 = tr_raw act then s_rec rem else None in s_rec rem with - | Not_simple -> None + | Exit -> None -let equal_action act1 act2 = - try - let raw1 = raw_rec [] act1 - and raw2 = raw_rec [] act2 in - raw1 = raw2 - with - | Not_simple -> false (* Test for swapping two clauses *) let up_ok_action act1 act2 = try - let raw1 = raw_rec [] act1 - and raw2 = raw_rec [] act2 in - match raw1, raw2 with - | Lstaticraise (i1,[]), Lstaticraise (i2,[]) -> i1=i2 - | _,_ -> raw1 = raw2 + let raw1 = tr_raw act1 + and raw2 = tr_raw act2 in + raw1 = raw2 with - | Not_simple -> false + | Exit -> false + +(* Nothing is kown about exception/extension patterns, + because of potential rebind *) +let rec exc_inside p = match p.pat_desc with + | Tpat_construct (_,{cstr_tag=Cstr_extension _},_) -> true + | Tpat_any|Tpat_constant _|Tpat_var _ + | Tpat_construct (_,_,[]) + | Tpat_variant (_,None,_) + -> false + | Tpat_construct (_,_,ps) + | Tpat_tuple ps + | Tpat_array ps + -> exc_insides ps + | Tpat_variant (_, Some q,_) + | Tpat_alias (q,_,_) + | Tpat_lazy q + -> exc_inside q + | Tpat_record (lps,_) -> + List.exists (fun (_,_,p) -> exc_inside p) lps + | Tpat_or (p1,p2,_) -> exc_inside p1 || exc_inside p2 + +and exc_insides ps = List.exists exc_inside ps let up_ok (ps,act_p) l = - List.for_all - (fun (qs,act_q) -> - up_ok_action act_p act_q || - not (Parmatch.compats ps qs)) - l + if exc_insides ps then match l with [] -> true | _::_ -> false + else + List.for_all + (fun (qs,act_q) -> + up_ok_action act_p act_q || + not (Parmatch.compats ps qs)) + l (* @@ -584,6 +660,16 @@ let rec what_is_cases cases = match cases with (* A few operation on default environments *) let as_matrix cases = get_mins le_pats (List.map (fun (ps,_) -> ps) cases) +(* For extension matching, record no imformation in matrix *) +let as_matrix_omega cases = + get_mins le_pats + (List.map + (fun (ps,_) -> + match ps with + | [] -> assert false + | _::ps -> omega::ps) + cases) + let cons_default matrix raise_num default = match matrix with | [] -> default @@ -614,7 +700,7 @@ let rec extract_vars r p = match p.pat_desc with List.fold_left (fun r (_, _, p) -> extract_vars r p) r lpats -| Tpat_construct (_, _, pats,_) -> +| Tpat_construct (_, _, pats) -> List.fold_left extract_vars r pats | Tpat_array pats -> List.fold_left extract_vars r pats @@ -658,13 +744,16 @@ let pm_free_variables {cases=cases} = (* Basic grouping predicates *) +let pat_as_constr = function + | {pat_desc=Tpat_construct (_, cstr,_)} -> cstr + | _ -> fatal_error "Matching.pat_as_constr" let group_constant = function | {pat_desc= Tpat_constant _} -> true | _ -> false and group_constructor = function - | {pat_desc = Tpat_construct _} -> true + | {pat_desc = Tpat_construct (_,_,_)} -> true | _ -> false and group_variant = function @@ -847,10 +936,74 @@ let rec split_or argo cls args def = do_split [] [] [] cls +(* Ultra-naive spliting, close to semantics, used for extension, + as potential rebind prevents any kind of optimisation *) + +and split_naive cls args def k = + + let rec split_exc cstr0 yes = function + | [] -> + let yes = List.rev yes in + { me = Pm {cases=yes; args=args; default=def;} ; + matrix = as_matrix_omega yes ; + top_default=def}, + k + | (p::_,_ as cl)::rem -> + if group_constructor p then + let cstr = pat_as_constr p in + if cstr = cstr0 then split_exc cstr0 (cl::yes) rem + else + let yes = List.rev yes in + let {me=next ; matrix=matrix ; top_default=def}, nexts = + split_exc cstr [cl] rem in + let idef = next_raise_count () in + let def = cons_default matrix idef def in + { me = Pm {cases=yes; args=args; default=def} ; + matrix = as_matrix_omega yes ; + top_default = def; }, + (idef,next)::nexts + else + let yes = List.rev yes in + let {me=next ; matrix=matrix ; top_default=def}, nexts = + split_noexc [cl] rem in + let idef = next_raise_count () in + let def = cons_default matrix idef def in + { me = Pm {cases=yes; args=args; default=def} ; + matrix = as_matrix_omega yes ; + top_default = def; }, + (idef,next)::nexts + | _ -> assert false + + and split_noexc yes = function + | [] -> precompile_var args (List.rev yes) def k + | (p::_,_ as cl)::rem -> + if group_constructor p then + let yes= List.rev yes in + let {me=next; matrix=matrix; top_default=def;},nexts = + split_exc (pat_as_constr p) [cl] rem in + let idef = next_raise_count () in + precompile_var + args yes + (cons_default matrix idef def) + ((idef,next)::nexts) + else split_noexc (cl::yes) rem + | _ -> assert false in + + match cls with + | [] -> assert false + | (p::_,_ as cl)::rem -> + if group_constructor p then + split_exc (pat_as_constr p) [cl] rem + else + split_noexc [cl] rem + | _ -> assert false + and split_constr cls args def k = let ex_pat = what_is_cases cls in match ex_pat.pat_desc with | Tpat_any -> precompile_var args cls def k + | Tpat_construct (_,{cstr_tag=Cstr_extension _},_) -> + split_naive cls args def k | _ -> let group = get_group ex_pat in @@ -956,12 +1109,21 @@ and dont_precompile_var args cls def k = matrix=as_matrix cls ; top_default=def},k +and is_exc p = match p.pat_desc with +| Tpat_or (p1,p2,_) -> is_exc p1 || is_exc p2 +| Tpat_alias (p,v,_) -> is_exc p +| Tpat_construct (_,{cstr_tag=Cstr_extension _},_) -> true +| _ -> false + and precompile_or argo cls ors args def k = match ors with | [] -> split_constr cls args def k | _ -> let rec do_cases = function | ({pat_desc=Tpat_or _} as orp::patl, action)::rem -> - let others,rem = get_equiv orp rem in + let do_opt = not (is_exc orp) in + let others,rem = + if do_opt then get_equiv orp rem + else [],rem in let orpm = {cases = (patl, action):: @@ -971,7 +1133,7 @@ and precompile_or argo cls ors args def k = match ors with | _ -> assert false) others ; args = (match args with _::r -> r | _ -> assert false) ; - default = default_compat orp def} in + default = default_compat (if do_opt then orp else omega) def} in let vars = IdentSet.elements (IdentSet.inter @@ -984,17 +1146,19 @@ and precompile_or argo cls ors args def k = match ors with Lstaticraise (or_num, List.map (fun v -> Lvar v) vs) in - let body,handlers = do_cases rem in + let do_optrec,body,handlers = do_cases rem in + do_opt && do_optrec, explode_or_pat argo new_patl mk_new_action body vars [] orp, - (([[orp]], or_num, vars , orpm):: handlers) + let mat = if do_opt then [[orp]] else [[omega]] in + ((mat, or_num, vars , orpm):: handlers) | cl::rem -> - let new_ord,new_to_catch = do_cases rem in - cl::new_ord,new_to_catch - | [] -> [],[] in + let b,new_ord,new_to_catch = do_cases rem in + b,cl::new_ord,new_to_catch + | [] -> true,[],[] in - let end_body, handlers = do_cases ors in - let matrix = as_matrix (cls@ors) + let do_opt,end_body, handlers = do_cases ors in + let matrix = (if do_opt then as_matrix else as_matrix_omega) (cls@ors) and body = {cases=cls@end_body ; args=args ; default=def} in {me = PmOr {body=body ; handlers=handlers ; or_matrix=matrix} ; matrix=matrix ; @@ -1003,13 +1167,12 @@ and precompile_or argo cls ors args def k = match ors with let split_precompile argo pm = let {me=next}, nexts = split_or argo pm.cases pm.args pm.default in -(* - if nexts <> [] || (match next with PmOr _ -> true | _ -> false) then begin + if dbg && (nexts <> [] || (match next with PmOr _ -> true | _ -> false)) + then begin prerr_endline "** SPLIT **" ; pretty_pm pm ; pretty_precompiled_res next nexts end ; -*) next, nexts @@ -1129,18 +1292,13 @@ let make_field_args binding_kind arg first_pos last_pos argl = in make_args first_pos let get_key_constr = function - | {pat_desc=Tpat_construct (_, cstr,_,_)} -> cstr.cstr_tag + | {pat_desc=Tpat_construct (_, cstr,_)} -> cstr.cstr_tag | _ -> assert false let get_args_constr p rem = match p with -| {pat_desc=Tpat_construct (_, _, args, _)} -> args @ rem +| {pat_desc=Tpat_construct (_, _, args)} -> args @ rem | _ -> assert false -let pat_as_constr = function - | {pat_desc=Tpat_construct (_, cstr,_,_)} -> cstr - | _ -> fatal_error "Matching.pat_as_constr" - - let matcher_constr cstr = match cstr.cstr_arity with | 0 -> let rec matcher_rec q rem = match q.pat_desc with @@ -1151,7 +1309,7 @@ let matcher_constr cstr = match cstr.cstr_arity with with | NoMatch -> matcher_rec p2 rem end - | Tpat_construct (_, cstr1, [],_) when cstr.cstr_tag = cstr1.cstr_tag -> + | Tpat_construct (_, cstr1, []) when cstr.cstr_tag = cstr1.cstr_tag -> rem | Tpat_any -> rem | _ -> raise NoMatch in @@ -1172,7 +1330,7 @@ let matcher_constr cstr = match cstr.cstr_arity with rem | _, _ -> assert false end - | Tpat_construct (_, cstr1, [arg],_) + | Tpat_construct (_, cstr1, [arg]) when cstr.cstr_tag = cstr1.cstr_tag -> arg::rem | Tpat_any -> omega::rem | _ -> raise NoMatch in @@ -1180,7 +1338,7 @@ let matcher_constr cstr = match cstr.cstr_arity with | _ -> fun q rem -> match q.pat_desc with | Tpat_or (_,_,_) -> raise OrPat - | Tpat_construct (_, cstr1, args,_) + | Tpat_construct (_, cstr1, args) when cstr.cstr_tag = cstr1.cstr_tag -> args @ rem | Tpat_any -> Parmatch.omegas cstr.cstr_arity @ rem | _ -> raise NoMatch @@ -1193,7 +1351,7 @@ let make_constr_matching p def ctx = function match cstr.cstr_tag with Cstr_constant _ | Cstr_block _ -> make_field_args Alias arg 0 (cstr.cstr_arity - 1) argl - | Cstr_exception _ -> + | Cstr_extension _ -> make_field_args Alias arg 1 cstr.cstr_arity argl in {pm= {cases = []; args = newargs; @@ -1324,7 +1482,7 @@ let get_mod_field modname field = lazy ( try let mod_ident = Ident.create_persistent modname in - let env = Env.open_pers_signature modname Env.initial in + let env = Env.open_pers_signature modname Env.initial_safe_string in let p = try match Env.lookup_value (Longident.Lident field) env with | (Path.Pdot(_,_,i), _) -> i @@ -1446,7 +1604,7 @@ let divide_tuple arity p ctx pm = let record_matching_line num_fields lbl_pat_list = - let patv = Array.create num_fields omega in + let patv = Array.make num_fields omega in List.iter (fun (_, lbl, pat) -> patv.(lbl.lbl_pos) <- pat) lbl_pat_list; Array.to_list patv @@ -1527,10 +1685,161 @@ let divide_array kind ctx pm = (make_array_matching kind) (=) get_key_array get_args_array ctx pm -(* To combine sub-matchings together *) + +(* + Specific string test sequence + Will be called by the bytecode compiler, from bytegen.ml. + The strategy is first dichotomic search (we perform 3-way tests + with compare_string), then sequence of equality tests + when there are less then T=strings_test_threshold static strings to match. + + Increasing T entails (slightly) less code, decreasing T + (slightly) favors runtime speed. + T=8 looks a decent tradeoff. +*) + +(* Utilities *) + +let strings_test_threshold = 8 + +let prim_string_notequal = + Pccall{prim_name = "caml_string_notequal"; + prim_arity = 2; prim_alloc = false; + prim_native_name = ""; prim_native_float = false} + +let prim_string_compare = + Pccall{prim_name = "caml_string_compare"; + prim_arity = 2; prim_alloc = false; + prim_native_name = ""; prim_native_float = false} + +let bind_sw arg k = match arg with +| Lvar _ -> k arg +| _ -> + let id = Ident.create "switch" in + Llet (Strict,id,arg,k (Lvar id)) + + +(* Sequential equality tests *) + +let make_string_test_sequence arg sw d = + let d,sw = match d with + | None -> + begin match sw with + | (_,d)::sw -> d,sw + | [] -> assert false + end + | Some d -> d,sw in + bind_sw arg + (fun arg -> + List.fold_right + (fun (s,lam) k -> + Lifthenelse + (Lprim + (prim_string_notequal, + [arg; Lconst (Const_immstring s)]), + k,lam)) + sw d) + +let rec split k xs = match xs with +| [] -> assert false +| x0::xs -> + if k <= 1 then [],x0,xs + else + let xs,y0,ys = split (k-2) xs in + x0::xs,y0,ys + +let zero_lam = Lconst (Const_base (Const_int 0)) + +let tree_way_test arg lt eq gt = + Lifthenelse + (Lprim (Pintcomp Clt,[arg;zero_lam]),lt, + Lifthenelse(Lprim (Pintcomp Clt,[zero_lam;arg]),gt,eq)) + +(* Dichotomic tree *) + + +let rec do_make_string_test_tree arg sw delta d = + let len = List.length sw in + if len <= strings_test_threshold+delta then + make_string_test_sequence arg sw d + else + let lt,(s,act),gt = split len sw in + bind_sw + (Lprim + (prim_string_compare, + [arg; Lconst (Const_immstring s)];)) + (fun r -> + tree_way_test r + (do_make_string_test_tree arg lt delta d) + act + (do_make_string_test_tree arg gt delta d)) + +(* Entry point *) +let expand_stringswitch arg sw d = match d with +| None -> + bind_sw arg + (fun arg -> do_make_string_test_tree arg sw 0 None) +| Some e -> + bind_sw arg + (fun arg -> + make_catch e + (fun d -> do_make_string_test_tree arg sw 1 (Some d))) + +(**********************) +(* Generic test trees *) +(**********************) + +(* Sharing *) + +(* Add handler, if shared *) +let handle_shared () = + let hs = ref (fun x -> x) in + let handle_shared act = match act with + | Switch.Single act -> act + | Switch.Shared act -> + let i,h = make_catch_delayed act in + let ohs = !hs in + hs := (fun act -> h (ohs act)) ; + make_exit i in + hs,handle_shared + + +let share_actions_tree sw d = + let store = StoreExp.mk_store () in +(* Default action is always shared *) + let d = + match d with + | None -> None + | Some d -> Some (store.Switch.act_store_shared d) in +(* Store all other actions *) + let sw = + List.map (fun (cst,act) -> cst,store.Switch.act_store act) sw in + +(* Retrieve all actions, includint potentiel default *) + let acts = store.Switch.act_get_shared () in + +(* Array of actual actions *) + let hs,handle_shared = handle_shared () in + let acts = Array.map handle_shared acts in + +(* Recontruct default and switch list *) + let d = match d with + | None -> None + | Some d -> Some (acts.(d)) in + let sw = List.map (fun (cst,j) -> cst,acts.(j)) sw in + !hs,sw,d + +(* Note: dichotomic search requires sorted input with no duplicates *) +let rec uniq_lambda_list sw = match sw with + | []|[_] -> sw + | (c1,_ as p1)::((c2,_)::sw2 as sw1) -> + if const_compare c1 c2 = 0 then uniq_lambda_list (p1::sw2) + else p1::uniq_lambda_list sw1 let sort_lambda_list l = - List.sort (fun (x,_) (y,_) -> const_compare x y) l + let l = + List.stable_sort (fun (x,_) (y,_) -> const_compare x y) l in + uniq_lambda_list l let rec cut n l = if n = 0 then [],l @@ -1556,8 +1865,12 @@ let rec do_tests_nofail tst arg = function act) let make_test_sequence fail tst lt_tst arg const_lambda_list = + let const_lambda_list = sort_lambda_list const_lambda_list in + let hs,const_lambda_list,fail = + share_actions_tree const_lambda_list fail in + let rec make_test_sequence const_lambda_list = - if List.length const_lambda_list >= 4 && lt_tst <> Praise then + if List.length const_lambda_list >= 4 && lt_tst <> Pignore then split_sequence const_lambda_list else match fail with | None -> do_tests_nofail tst arg const_lambda_list @@ -1568,18 +1881,10 @@ let make_test_sequence fail tst lt_tst arg const_lambda_list = cut (List.length const_lambda_list / 2) const_lambda_list in Lifthenelse(Lprim(lt_tst,[arg; Lconst(Const_base (fst(List.hd list2)))]), make_test_sequence list1, make_test_sequence list2) - in make_test_sequence (sort_lambda_list const_lambda_list) - - -let make_offset x arg = if x=0 then arg else Lprim(Poffsetint(x), [arg]) - + in + hs (make_test_sequence const_lambda_list) -let prim_string_notequal = - Pccall{prim_name = "caml_string_notequal"; - prim_arity = 2; prim_alloc = false; - prim_native_name = ""; prim_native_float = false} - let rec explode_inter offset i j act k = if i <= j then explode_inter offset i (j-1) act ((j-offset,act)::k) @@ -1587,7 +1892,7 @@ let rec explode_inter offset i j act k = k let max_vals cases acts = - let vals = Array.create (Array.length acts) 0 in + let vals = Array.make (Array.length acts) 0 in for i=Array.length cases-1 downto 0 do let l,h,act = cases.(i) in vals.(act) <- h - l + 1 + vals.(act) @@ -1620,65 +1925,6 @@ let as_int_list cases acts = (if default >= 0 then Some acts.(default) else None) -let make_switch_offset arg min_key max_key int_lambda_list default = - let numcases = max_key - min_key + 1 in - let cases = - List.map (fun (key, l) -> (key - min_key, l)) int_lambda_list in - let offsetarg = make_offset (-min_key) arg in - Lswitch(offsetarg, - {sw_numconsts = numcases; sw_consts = cases; - sw_numblocks = 0; sw_blocks = []; - sw_failaction = default}) - -let make_switch_switcher arg cases acts = - let l = ref [] in - for i = Array.length cases-1 downto 0 do - l := (i,acts.(cases.(i))) :: !l - done ; - Lswitch(arg, - {sw_numconsts = Array.length cases ; sw_consts = !l ; - sw_numblocks = 0 ; sw_blocks = [] ; - sw_failaction = None}) - -let full sw = - List.length sw.sw_consts = sw.sw_numconsts && - List.length sw.sw_blocks = sw.sw_numblocks - -let make_switch (arg,sw) = match sw.sw_failaction with -| None -> - let t = Hashtbl.create 17 in - let seen l = match l with - | Lstaticraise (i,[]) -> - let old = try Hashtbl.find t i with Not_found -> 0 in - Hashtbl.replace t i (old+1) - | _ -> () in - List.iter (fun (_,lam) -> seen lam) sw.sw_consts ; - List.iter (fun (_,lam) -> seen lam) sw.sw_blocks ; - let i_max = ref (-1) - and max = ref (-1) in - Hashtbl.iter - (fun i c -> - if c > !max then begin - i_max := i ; - max := c - end) t ; - if !i_max >= 0 then - let default = !i_max in - let rec remove = function - | [] -> [] - | (_,Lstaticraise (j,[]))::rem when j=default -> - remove rem - | x::rem -> x::remove rem in - Lswitch - (arg, - {sw with -sw_consts = remove sw.sw_consts ; -sw_blocks = remove sw.sw_blocks ; -sw_failaction = Some (Lstaticraise (default,[]))}) - else - Lswitch (arg,sw) -| _ -> Lswitch (arg,sw) - module SArg = struct type primitive = Lambda.primitive @@ -1695,6 +1941,7 @@ module SArg = struct let make_offset arg n = match n with | 0 -> arg | _ -> Lprim (Poffsetint n,[arg]) + let bind arg body = let newvar,newarg = match arg with | Lvar v -> v,arg @@ -1702,13 +1949,89 @@ module SArg = struct let newvar = Ident.create "switcher" in newvar,Lvar newvar in bind Alias newvar arg (body newarg) - + let make_const i = Lconst (Const_base (Const_int i)) let make_isout h arg = Lprim (Pisout, [h ; arg]) let make_isin h arg = Lprim (Pnot,[make_isout h arg]) let make_if cond ifso ifnot = Lifthenelse (cond, ifso, ifnot) - let make_switch = make_switch_switcher + let make_switch arg cases acts = + let l = ref [] in + for i = Array.length cases-1 downto 0 do + l := (i,acts.(cases.(i))) :: !l + done ; + Lswitch(arg, + {sw_numconsts = Array.length cases ; sw_consts = !l ; + sw_numblocks = 0 ; sw_blocks = [] ; + sw_failaction = None}) + let make_catch = make_catch_delayed + let make_exit = make_exit + end +(* Action sharing for Lswitch argument *) +let share_actions_sw sw = +(* Attempt sharing on all actions *) + let store = StoreExp.mk_store () in + let fail = match sw.sw_failaction with + | None -> None + | Some fail -> + (* Fail is translated to exit, whatever happens *) + Some (store.Switch.act_store_shared fail) in + let consts = + List.map + (fun (i,e) -> i,store.Switch.act_store e) + sw.sw_consts + and blocks = + List.map + (fun (i,e) -> i,store.Switch.act_store e) + sw.sw_blocks in + let acts = store.Switch.act_get_shared () in + let hs,handle_shared = handle_shared () in + let acts = Array.map handle_shared acts in + let fail = match fail with + | None -> None + | Some fail -> Some (acts.(fail)) in + !hs, + { sw with + sw_consts = List.map (fun (i,j) -> i,acts.(j)) consts ; + sw_blocks = List.map (fun (i,j) -> i,acts.(j)) blocks ; + sw_failaction = fail; } + +(* Reintroduce fail action in switch argument, + for the sake of avoiding carrying over huge switches *) + +let reintroduce_fail sw = match sw.sw_failaction with +| None -> + let t = Hashtbl.create 17 in + let seen (_,l) = match as_simple_exit l with + | Some i -> + let old = try Hashtbl.find t i with Not_found -> 0 in + Hashtbl.replace t i (old+1) + | None -> () in + List.iter seen sw.sw_consts ; + List.iter seen sw.sw_blocks ; + let i_max = ref (-1) + and max = ref (-1) in + Hashtbl.iter + (fun i c -> + if c > !max then begin + i_max := i ; + max := c + end) t ; + if !max >= 3 then + let default = !i_max in + let remove = + List.filter + (fun (_,lam) -> match as_simple_exit lam with + | Some j -> j <> default + | None -> true) in + {sw with + sw_consts = remove sw.sw_consts ; + sw_blocks = remove sw.sw_blocks ; + sw_failaction = Some (make_exit default)} + else sw +| Some _ -> sw + + module Switcher = Switch.Make(SArg) open Switch @@ -1725,7 +2048,16 @@ let get_edges low high l = match l with let as_interval_canfail fail low high l = - let store = mk_store equal_action in + let store = StoreExp.mk_store () in + + let do_store tag act = + let i = store.act_store act in +(* + Printlambda.lambda Format.str_formatter act ; + eprintf "STORE [%s] %i %s\n" tag i (Format.flush_str_formatter ()) ; +*) + i in + let rec nofail_rec cur_low cur_high cur_act = function | [] -> if cur_high = high then @@ -1733,7 +2065,7 @@ let as_interval_canfail fail low high l = else [(cur_low,cur_high,cur_act) ; (cur_high+1,high, 0)] | ((i,act_i)::rem) as all -> - let act_index = store.act_store act_i in + let act_index = do_store "NO" act_i in if cur_high+1= i then if act_index=cur_act then nofail_rec cur_low i cur_act rem @@ -1741,14 +2073,18 @@ let as_interval_canfail fail low high l = (cur_low,i-1, cur_act)::fail_rec i i rem else (cur_low, i-1, cur_act)::nofail_rec i i act_index rem + else if act_index = 0 then + (cur_low, cur_high, cur_act):: + fail_rec (cur_high+1) (cur_high+1) all else (cur_low, cur_high, cur_act):: - fail_rec ((cur_high+1)) (cur_high+1) all + (cur_high+1,i-1,0):: + nofail_rec i i act_index rem and fail_rec cur_low cur_high = function | [] -> [(cur_low, cur_high, 0)] | (i,act_i)::rem -> - let index = store.act_store act_i in + let index = do_store "YES" act_i in if index=0 then fail_rec cur_low i rem else (cur_low,i-1,0):: @@ -1757,7 +2093,7 @@ let as_interval_canfail fail low high l = let init_rec = function | [] -> [] | (i,act_i)::rem -> - let index = store.act_store act_i in + let index = do_store "INIT" act_i in if index=0 then fail_rec low i rem else @@ -1766,12 +2102,12 @@ let as_interval_canfail fail low high l = else nofail_rec i i index rem in - ignore (store.act_store fail) ; (* fail has action index 0 *) + assert (do_store "FAIL" fail = 0) ; (* fail has action index 0 *) let r = init_rec l in - Array.of_list r, store.act_get () + Array.of_list r, store let as_interval_nofail l = - let store = mk_store equal_action in + let store = StoreExp.mk_store () in let rec i_rec cur_low cur_high cur_act = function | [] -> @@ -1789,7 +2125,7 @@ let as_interval_nofail l = i_rec i i act_index rem | _ -> assert false in - Array.of_list inters, store.act_get () + Array.of_list inters, store let sort_int_lambda_list l = @@ -1807,10 +2143,10 @@ let as_interval fail low high l = | None -> as_interval_nofail l | Some act -> as_interval_canfail act low high l) -let call_switcher konst fail arg low high int_lambda_list = +let call_switcher fail arg low high int_lambda_list = let edges, (cases, actions) = as_interval fail low high int_lambda_list in - Switcher.zyva edges konst arg cases actions + Switcher.zyva edges arg cases actions let exists_ctx ok ctx = @@ -1920,6 +2256,11 @@ let mk_failaction_neg partial ctx def = match partial with (* Conforme a l'article et plus simple qu'avant *) and mk_failaction_pos partial seen ctx defs = + if dbg then begin + prerr_endline "**POS**" ; + pretty_def defs ; + () + end ; let rec scan_def env to_test defs = match to_test,defs with | ([],_)|(_,[]) -> List.fold_left @@ -1960,19 +2301,27 @@ let combine_constant arg cst partial ctx def let int_lambda_list = List.map (function Const_int n, l -> n,l | _ -> assert false) const_lambda_list in - call_switcher - lambda_of_int fail arg min_int max_int int_lambda_list + call_switcher fail arg min_int max_int int_lambda_list | Const_char _ -> let int_lambda_list = List.map (function Const_char c, l -> (Char.code c, l) | _ -> assert false) const_lambda_list in - call_switcher - (fun i -> Lconst (Const_base (Const_int i))) - fail arg 0 255 int_lambda_list + call_switcher fail arg 0 255 int_lambda_list | Const_string _ -> - make_test_sequence - fail prim_string_notequal Praise arg const_lambda_list +(* Note as the bytecode compiler may resort to dichotmic search, + the clauses of strinswitch are sorted with duplicate removed. + This partly applies to the native code compiler, which requires + no duplicates *) + let const_lambda_list = sort_lambda_list const_lambda_list in + let sw = + List.map + (fun (c,act) -> match c with + | Const_string (s,_) -> s,act + | _ -> assert false) + const_lambda_list in + let hs,sw,fail = share_actions_tree sw fail in + hs (Lstringswitch (arg,sw,fail)) | Const_float _ -> make_test_sequence fail @@ -2010,32 +2359,61 @@ let split_cases tag_lambda_list = sort_int_lambda_list const, sort_int_lambda_list nonconst +let split_extension_cases tag_lambda_list = + let rec split_rec = function + [] -> ([], []) + | (cstr, act) :: rem -> + let (consts, nonconsts) = split_rec rem in + match cstr with + Cstr_extension(path, true) -> ((path, act) :: consts, nonconsts) + | Cstr_extension(path, false) -> (consts, (path, act) :: nonconsts) + | _ -> assert false in + split_rec tag_lambda_list + let combine_constructor arg ex_pat cstr partial ctx def (tag_lambda_list, total1, pats) = if cstr.cstr_consts < 0 then begin - (* Special cases for exceptions *) + (* Special cases for extensions *) let fail, to_add, local_jumps = mk_failaction_neg partial ctx def in let tag_lambda_list = to_add@tag_lambda_list in let lambda1 = - let default, tests = + let consts, nonconsts = split_extension_cases tag_lambda_list in + let default, consts, nonconsts = match fail with | None -> - begin match tag_lambda_list with - | (_, act)::rem -> act,rem + begin match consts, nonconsts with + | _, (_, act)::rem -> act, consts, rem + | (_, act)::rem, _ -> act, rem, nonconsts | _ -> assert false end - | Some fail -> fail, tag_lambda_list in - List.fold_right - (fun (ex, act) rem -> - match ex with - | Cstr_exception (path, _) -> - Lifthenelse(Lprim(Pintcomp Ceq, - [Lprim(Pfield 0, [arg]); transl_path path]), - act, rem) - | _ -> assert false) - tests default in + | Some fail -> fail, consts, nonconsts in + let nonconst_lambda = + match nonconsts with + [] -> default + | _ -> + let tag = Ident.create "tag" in + let tests = + List.fold_right + (fun (path, act) rem -> + Lifthenelse(Lprim(Pintcomp Ceq, + [Lvar tag; + transl_path ex_pat.pat_env path]), + act, rem)) + nonconsts + default + in + Llet(Alias, tag, Lprim(Pfield 0, [arg]), tests) + in + List.fold_right + (fun (path, act) rem -> + Lifthenelse(Lprim(Pintcomp Ceq, + [arg; transl_path ex_pat.pat_env path]), + act, rem)) + consts + nonconst_lambda + in lambda1, jumps_union local_jumps total1 end else begin (* Regular concrete type *) @@ -2059,22 +2437,22 @@ let combine_constructor arg ex_pat cstr partial ctx def | (1, 1, [0, act1], [0, act2]) -> Lifthenelse(arg, act2, act1) | (n,_,_,[]) -> - call_switcher - (fun i -> Lconst (Const_base (Const_int i))) - None arg 0 (n-1) consts + call_switcher None arg 0 (n-1) consts | (n, _, _, _) -> match same_actions nonconsts with | None -> - make_switch(arg, {sw_numconsts = cstr.cstr_consts; - sw_consts = consts; - sw_numblocks = cstr.cstr_nonconsts; - sw_blocks = nonconsts; - sw_failaction = None}) +(* Emit a switch, as bytecode implements this sophisticated instruction *) + let sw = + {sw_numconsts = cstr.cstr_consts; sw_consts = consts; + sw_numblocks = cstr.cstr_nonconsts; sw_blocks = nonconsts; + sw_failaction = None} in + let hs,sw = share_actions_sw sw in + let sw = reintroduce_fail sw in + hs (Lswitch (arg,sw)) | Some act -> Lifthenelse (Lprim (Pisint, [arg]), call_switcher - (fun i -> Lconst (Const_base (Const_int i))) None arg 0 (n-1) consts, act) in @@ -2084,20 +2462,16 @@ let combine_constructor arg ex_pat cstr partial ctx def let make_test_sequence_variant_constant fail arg int_lambda_list = let _, (cases, actions) = as_interval fail min_int max_int int_lambda_list in - Switcher.test_sequence - (fun i -> Lconst (Const_base (Const_int i))) arg cases actions + Switcher.test_sequence arg cases actions let call_switcher_variant_constant fail arg int_lambda_list = - call_switcher - (fun i -> Lconst (Const_base (Const_int i))) - fail arg min_int max_int int_lambda_list + call_switcher fail arg min_int max_int int_lambda_list let call_switcher_variant_constr fail arg int_lambda_list = let v = Ident.create "variant" in Llet(Alias, v, Lprim(Pfield 0, [arg]), call_switcher - (fun i -> Lconst (Const_base (Const_int i))) fail (Lvar v) min_int max_int int_lambda_list) let combine_variant row arg partial ctx def (tag_lambda_list, total1, pats) = @@ -2161,7 +2535,6 @@ let combine_array arg kind partial ctx def let newvar = Ident.create "len" in let switch = call_switcher - lambda_of_int fail (Lvar newvar) 0 max_int len_lambda_list in bind @@ -2280,10 +2653,6 @@ let rec approx_present v = function | Lvar vv -> Ident.same v vv | _ -> true -let string_of_lam lam = - Printlambda.lambda Format.str_formatter lam ; - Format.flush_str_formatter () - let rec lower_bind v arg lam = match lam with | Lifthenelse (cond, ifso, ifnot) -> let pcond = approx_present v cond @@ -2385,8 +2754,6 @@ let arg_to_var arg cls = match arg with Output: a lambda term, a jump summary {..., exit number -> context, .. } *) -let dbg = false - let rec compile_match repr partial ctx m = match m with | { cases = [] } -> comp_exit ctx m | { cases = ([], action) :: rem } -> @@ -2444,7 +2811,7 @@ and do_compile_matching repr partial ctx arg pmh = match pmh with divide_constant (combine_constant arg cst partial) ctx pm - | Tpat_construct (_, cstr, _, _) -> + | Tpat_construct (_, cstr, _) -> compile_test (compile_match repr partial) partial divide_constructor (combine_constructor arg pat cstr partial) @@ -2507,7 +2874,7 @@ let find_in_pat pred = begin match p.pat_desc with | Tpat_alias (p,_,_) | Tpat_variant (_,Some p,_) | Tpat_lazy p -> find_rec p - | Tpat_tuple ps|Tpat_construct (_,_,ps,_) | Tpat_array ps -> + | Tpat_tuple ps|Tpat_construct (_,_,ps) | Tpat_array ps -> List.exists find_rec ps | Tpat_record (lpats,_) -> List.exists @@ -2604,10 +2971,10 @@ let compile_matching loc repr handler_fun arg pat_act_list partial = let partial_function loc () = (* [Location.get_pos_info] is too expensive *) let (fname, line, char) = Location.get_pos_info loc.Location.loc_start in - Lprim(Praise, [Lprim(Pmakeblock(0, Immutable), - [transl_path Predef.path_match_failure; + Lprim(Praise Raise_regular, [Lprim(Pmakeblock(0, Immutable), + [transl_normal_path Predef.path_match_failure; Lconst(Const_block(0, - [Const_base(Const_string fname); + [Const_base(Const_string (fname, None)); Const_base(Const_int line); Const_base(Const_int char)]))])]) @@ -2616,7 +2983,8 @@ let for_function loc repr param pat_act_list partial = (* In the following two cases, exhaustiveness info is not available! *) let for_trywith param pat_act_list = - compile_matching Location.none None (fun () -> Lprim(Praise, [param])) + compile_matching Location.none None + (fun () -> Lprim(Praise Raise_reraise, [param])) param pat_act_list Partial let for_let loc param pat body = diff --git a/bytecomp/matching.mli b/bytecomp/matching.mli index 5c8577b2..88002e05 100644 --- a/bytecomp/matching.mli +++ b/bytecomp/matching.mli @@ -15,6 +15,8 @@ open Typedtree open Lambda + +(* Entry points to match compiler *) val for_function: Location.t -> int ref option -> lambda -> (pattern * lambda) list -> partial -> lambda @@ -34,8 +36,8 @@ exception Cannot_flatten val flatten_pattern: int -> pattern -> pattern list -val make_test_sequence: - lambda option -> primitive -> primitive -> lambda -> - (Asttypes.constant * lambda) list -> lambda +(* Expand stringswitch to string test tree *) +val expand_stringswitch: + lambda -> (string * lambda) list -> lambda option -> lambda val inline_lazy_force : lambda -> Location.t -> lambda diff --git a/bytecomp/meta.ml b/bytecomp/meta.ml index 35d87766..f7711ff1 100644 --- a/bytecomp/meta.ml +++ b/bytecomp/meta.ml @@ -12,13 +12,13 @@ external global_data : unit -> Obj.t array = "caml_get_global_data" external realloc_global_data : int -> unit = "caml_realloc_global" -external static_alloc : int -> string = "caml_static_alloc" -external static_free : string -> unit = "caml_static_free" -external static_resize : string -> int -> string = "caml_static_resize" -external static_release_bytecode : string -> int -> unit +external static_alloc : int -> bytes = "caml_static_alloc" +external static_free : bytes -> unit = "caml_static_free" +external static_resize : bytes -> int -> bytes = "caml_static_resize" +external static_release_bytecode : bytes -> int -> unit = "caml_static_release_bytecode" type closure = unit -> Obj.t -external reify_bytecode : string -> int -> closure = "caml_reify_bytecode" +external reify_bytecode : bytes -> int -> closure = "caml_reify_bytecode" external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t = "caml_invoke_traced_function" external get_section_table : unit -> (string * Obj.t) list diff --git a/bytecomp/meta.mli b/bytecomp/meta.mli index a8ef5272..cb3565dc 100644 --- a/bytecomp/meta.mli +++ b/bytecomp/meta.mli @@ -14,13 +14,13 @@ external global_data : unit -> Obj.t array = "caml_get_global_data" external realloc_global_data : int -> unit = "caml_realloc_global" -external static_alloc : int -> string = "caml_static_alloc" -external static_free : string -> unit = "caml_static_free" -external static_release_bytecode : string -> int -> unit +external static_alloc : int -> bytes = "caml_static_alloc" +external static_free : bytes -> unit = "caml_static_free" +external static_release_bytecode : bytes -> int -> unit = "caml_static_release_bytecode" -external static_resize : string -> int -> string = "caml_static_resize" +external static_resize : bytes -> int -> bytes = "caml_static_resize" type closure = unit -> Obj.t -external reify_bytecode : string -> int -> closure = "caml_reify_bytecode" +external reify_bytecode : bytes -> int -> closure = "caml_reify_bytecode" external invoke_traced_function : Obj.t -> Obj.t -> Obj.t -> Obj.t = "caml_invoke_traced_function" external get_section_table : unit -> (string * Obj.t) list diff --git a/bytecomp/printinstr.ml b/bytecomp/printinstr.ml index a5cd7e05..43d8d360 100644 --- a/bytecomp/printinstr.ml +++ b/bytecomp/printinstr.ml @@ -67,7 +67,7 @@ let instruction ppf = function | Kboolnot -> fprintf ppf "\tboolnot" | Kpushtrap lbl -> fprintf ppf "\tpushtrap L%i" lbl | Kpoptrap -> fprintf ppf "\tpoptrap" - | Kraise -> fprintf ppf "\traise" + | Kraise k-> fprintf ppf "\t%s" (Lambda.raise_kind k) | Kcheck_signals -> fprintf ppf "\tcheck_signals" | Kccall(s, n) -> fprintf ppf "\tccall %s, %i" s n diff --git a/bytecomp/printlambda.ml b/bytecomp/printlambda.ml index 65316700..d528a357 100644 --- a/bytecomp/printlambda.ml +++ b/bytecomp/printlambda.ml @@ -20,7 +20,7 @@ open Lambda let rec struct_const ppf = function | Const_base(Const_int n) -> fprintf ppf "%i" n | Const_base(Const_char c) -> fprintf ppf "%C" c - | Const_base(Const_string s) -> fprintf ppf "%S" s + | Const_base(Const_string (s, _)) -> fprintf ppf "%S" s | Const_immstring s -> fprintf ppf "#%S" s | Const_base(Const_float f) -> fprintf ppf "%s" f | Const_base(Const_int32 n) -> fprintf ppf "%lil" n @@ -87,11 +87,19 @@ let record_rep ppf r = | Record_float -> fprintf ppf "float" ;; +let string_of_loc_kind = function + | Loc_FILE -> "loc_FILE" + | Loc_LINE -> "loc_LINE" + | Loc_MODULE -> "loc_MODULE" + | Loc_POS -> "loc_POS" + | Loc_LOC -> "loc_LOC" + let primitive ppf = function | Pidentity -> fprintf ppf "id" | Pignore -> fprintf ppf "ignore" | Prevapply _ -> fprintf ppf "revapply" | Pdirapply _ -> fprintf ppf "dirapply" + | Ploc kind -> fprintf ppf "%s" (string_of_loc_kind kind) | Pgetglobal id -> fprintf ppf "global %a" Ident.print id | Psetglobal id -> fprintf ppf "setglobal %a" Ident.print id | Pmakeblock(tag, Immutable) -> fprintf ppf "makeblock %i" tag @@ -105,7 +113,7 @@ let primitive ppf = function | Pduprecord (rep, size) -> fprintf ppf "duprecord %a %i" record_rep rep size | Plazyforce -> fprintf ppf "force" | Pccall p -> fprintf ppf "%s" p.prim_name - | Praise -> fprintf ppf "raise" + | Praise k -> fprintf ppf "%s" (Lambda.raise_kind k) | Psequand -> fprintf ppf "&&" | Psequor -> fprintf ppf "||" | Pnot -> fprintf ppf "not" @@ -229,6 +237,7 @@ let primitive ppf = function else fprintf ppf "bigarray.array1.set64" | Pbswap16 -> fprintf ppf "bswap16" | Pbbswap(bi) -> print_boxed_integer "bswap" ppf bi + | Pint_as_pointer -> fprintf ppf "int_as_pointer" let rec lam ppf = function | Lvar id -> @@ -255,12 +264,15 @@ let rec lam ppf = function fprintf ppf ")" in fprintf ppf "@[<2>(function%a@ %a)@]" pr_params params lam body | Llet(str, id, arg, body) -> + let kind = function + Alias -> "a" | Strict -> "" | StrictOpt -> "o" | Variable -> "v" in let rec letbody = function | Llet(str, id, arg, body) -> - fprintf ppf "@ @[<2>%a@ %a@]" Ident.print id lam arg; + fprintf ppf "@ @[<2>%a =%s@ %a@]" Ident.print id (kind str) lam arg; letbody body | expr -> expr in - fprintf ppf "@[<2>(let@ @[(@[<2>%a@ %a@]" Ident.print id lam arg; + fprintf ppf "@[<2>(let@ @[(@[<2>%a =%s@ %a@]" + Ident.print id (kind str) lam arg; let expr = letbody body in fprintf ppf ")@]@ %a)@]" lam expr | Lletrec(id_arg_list, body) -> @@ -296,11 +308,26 @@ let rec lam ppf = function if !spc then fprintf ppf "@ " else spc := true; fprintf ppf "@[default:@ %a@]" lam l end in - fprintf ppf "@[<1>(%s %a@ @[%a@])@]" (match sw.sw_failaction with None -> "switch*" | _ -> "switch") lam larg switch sw + | Lstringswitch(arg, cases, default) -> + let switch ppf cases = + let spc = ref false in + List.iter + (fun (s, l) -> + if !spc then fprintf ppf "@ " else spc := true; + fprintf ppf "@[case \"%s\":@ %a@]" (String.escaped s) lam l) + cases; + begin match default with + | Some default -> + if !spc then fprintf ppf "@ " else spc := true; + fprintf ppf "@[default:@ %a@]" lam default + | None -> () + end in + fprintf ppf + "@[<1>(stringswitch %a@ @[%a@])@]" lam arg switch cases | Lstaticraise (i, ls) -> let lams ppf largs = List.iter (fun l -> fprintf ppf "@ %a" lam l) largs in diff --git a/bytecomp/simplif.ml b/bytecomp/simplif.ml index e60bb6d1..fd3d21c1 100644 --- a/bytecomp/simplif.ml +++ b/bytecomp/simplif.ml @@ -51,9 +51,13 @@ let rec eliminate_ref id = function sw_numblocks = sw.sw_numblocks; sw_blocks = List.map (fun (n, e) -> (n, eliminate_ref id e)) sw.sw_blocks; - sw_failaction = match sw.sw_failaction with - | None -> None - | Some l -> Some (eliminate_ref id l)}) + sw_failaction = + Misc.may_map (eliminate_ref id) sw.sw_failaction; }) + | Lstringswitch(e, sw, default) -> + Lstringswitch + (eliminate_ref id e, + List.map (fun (s, e) -> (s, eliminate_ref id e)) sw, + Misc.may_map (eliminate_ref id) default) | Lstaticraise (i,args) -> Lstaticraise (i,List.map (eliminate_ref id) args) | Lstaticcatch(e1, i, e2) -> @@ -115,6 +119,15 @@ let simplify_exits lam = count l; List.iter (fun (_, l) -> count l) sw.sw_consts; List.iter (fun (_, l) -> count l) sw.sw_blocks + | Lstringswitch(l, sw, d) -> + count l; + List.iter (fun (_, l) -> count l) sw; + begin match d with + | None -> () + | Some d -> match sw with + | []|[_] -> count d + | _ -> count d; count d (* default will get replicated *) + end | Lstaticraise (i,ls) -> incr_exit i ; List.iter count ls | Lstaticcatch (l1,(i,[]),Lstaticraise (j,[])) -> (* i will be replaced by j in l1, so each occurence of i in l1 @@ -138,10 +151,7 @@ let simplify_exits lam = | Lsequence(l1, l2) -> count l1; count l2 | Lwhile(l1, l2) -> count l1; count l2 | Lfor(_, l1, l2, dir, l3) -> count l1; count l2; count l3 - | Lassign(v, l) -> - (* Lalias-bound variables are never assigned, so don't increase - v's refcount *) - count l + | Lassign(v, l) -> count l | Lsend(k, m, o, ll, _) -> List.iter count (m::o::ll) | Levent(l, _) -> count l | Lifused(v, l) -> count l @@ -209,13 +219,15 @@ let simplify_exits lam = let new_l = simplif l and new_consts = List.map (fun (n, e) -> (n, simplif e)) sw.sw_consts and new_blocks = List.map (fun (n, e) -> (n, simplif e)) sw.sw_blocks - and new_fail = match sw.sw_failaction with - | None -> None - | Some l -> Some (simplif l) in + and new_fail = Misc.may_map simplif sw.sw_failaction in Lswitch (new_l, {sw with sw_consts = new_consts ; sw_blocks = new_blocks; sw_failaction = new_fail}) + | Lstringswitch(l,sw,d) -> + Lstringswitch + (simplif l,List.map (fun (s,l) -> s,simplif l) sw, + Misc.may_map simplif d) | Lstaticraise (i,[]) as l -> begin try let _,handler = Hashtbl.find subst i in @@ -241,17 +253,10 @@ let simplify_exits lam = | Lstaticcatch (l1,(i,[]),(Lstaticraise (j,[]) as l2)) -> Hashtbl.add subst i ([],simplif l2) ; simplif l1 - | Lstaticcatch (l1,(i,xs), (Lvar _ as l2)) -> - begin match count_exit i with - | 0 -> simplif l1 - | _ -> - Hashtbl.add subst i (xs,l2) ; - simplif l1 - end | Lstaticcatch (l1,(i,xs),l2) -> begin match count_exit i with | 0 -> simplif l1 - | 1 -> + | 1 when i >= 0 -> Hashtbl.add subst i (xs,simplif l2) ; simplif l1 | _ -> @@ -361,6 +366,17 @@ let simplify_lets lam = count bv l; List.iter (fun (_, l) -> count bv l) sw.sw_consts; List.iter (fun (_, l) -> count bv l) sw.sw_blocks + | Lstringswitch(l, sw, d) -> + count bv l ; + List.iter (fun (_, l) -> count bv l) sw ; + begin match d with + | Some d -> + begin match sw with + | []|[_] -> count bv d + | _ -> count bv d ; count bv d + end + | None -> () + end | Lstaticraise (i,ls) -> List.iter (count bv) ls | Lstaticcatch(l1, (i,_), l2) -> count bv l1; count bv l2 | Ltrywith(l1, v, l2) -> count bv l1; count bv l2 @@ -453,13 +469,15 @@ let simplify_lets lam = let new_l = simplif l and new_consts = List.map (fun (n, e) -> (n, simplif e)) sw.sw_consts and new_blocks = List.map (fun (n, e) -> (n, simplif e)) sw.sw_blocks - and new_fail = match sw.sw_failaction with - | None -> None - | Some l -> Some (simplif l) in + and new_fail = Misc.may_map simplif sw.sw_failaction in Lswitch (new_l, {sw with sw_consts = new_consts ; sw_blocks = new_blocks; sw_failaction = new_fail}) + | Lstringswitch (l,sw,d) -> + Lstringswitch + (simplif l,List.map (fun (s,l) -> s,simplif l) sw, + Misc.may_map simplif d) | Lstaticraise (i,ls) -> Lstaticraise (i, List.map simplif ls) | Lstaticcatch(l1, (i,args), l2) -> @@ -520,7 +538,14 @@ let rec emit_tail_infos is_tail lambda = | Lswitch (lam, sw) -> emit_tail_infos false lam; list_emit_tail_infos_fun snd is_tail sw.sw_consts; - list_emit_tail_infos_fun snd is_tail sw.sw_blocks + list_emit_tail_infos_fun snd is_tail sw.sw_blocks; + Misc.may (emit_tail_infos is_tail) sw.sw_failaction + | Lstringswitch (lam, sw, d) -> + emit_tail_infos false lam; + List.iter + (fun (_,lam) -> emit_tail_infos is_tail lam) + sw ; + Misc.may (emit_tail_infos is_tail) d | Lstaticraise (_, l) -> list_emit_tail_infos false l | Lstaticcatch (body, _, handler) -> diff --git a/bytecomp/switch.ml b/bytecomp/switch.ml index ff193ee1..da9a48f1 100644 --- a/bytecomp/switch.ml +++ b/bytecomp/switch.ml @@ -10,31 +10,81 @@ (* *) (***********************************************************************) -(* Store for actions in object style *) -exception Found of int + +type 'a shared = Shared of 'a | Single of 'a + +let share_out = function + | Shared act|Single act -> act + type 'a t_store = - {act_get : unit -> 'a array ; act_store : 'a -> int} - -let mk_store same = - let r_acts = ref [] in - let store act = - let rec store_rec i = function - | [] -> i,[act] - | act0::rem -> - if same act0 act then raise (Found i) - else - let i,rem = store_rec (i+1) rem in - i,act0::rem in - try - let i,acts = store_rec 0 !r_acts in - r_acts := acts ; - i - with - | Found i -> i + {act_get : unit -> 'a array ; + act_get_shared : unit -> 'a shared array ; + act_store : 'a -> int ; + act_store_shared : 'a -> int ; } - and get () = Array.of_list !r_acts in - {act_store=store ; act_get=get} +exception Not_simple + +module type Stored = sig + type t + type key + val make_key : t -> key option +end + +module Store(A:Stored) = struct + module AMap = + Map.Make(struct type t = A.key let compare = Pervasives.compare end) + + type intern = + { mutable map : (bool * int) AMap.t ; + mutable next : int ; + mutable acts : (bool * A.t) list; } + + let mk_store () = + let st = + { map = AMap.empty ; + next = 0 ; + acts = [] ; } in + + let add mustshare act = + let i = st.next in + st.acts <- (mustshare,act) :: st.acts ; + st.next <- i+1 ; + i in + + let store mustshare act = match A.make_key act with + | Some key -> + begin try + let (shared,i) = AMap.find key st.map in + if not shared then st.map <- AMap.add key (true,i) st.map ; + i + with Not_found -> + let i = add mustshare act in + st.map <- AMap.add key (mustshare,i) st.map ; + i + end + | None -> + add mustshare act + + and get () = Array.of_list (List.rev_map (fun (_,act) -> act) st.acts) + + and get_shared () = + let acts = + Array.of_list + (List.rev_map + (fun (shared,act) -> + if shared then Shared act else Single act) + st.acts) in + AMap.iter + (fun _ (shared,i) -> + if shared then match acts.(i) with + | Single act -> acts.(i) <- Shared act + | Shared _ -> ()) + st.map ; + acts in + {act_store = store false ; act_store_shared = store true ; + act_get = get; act_get_shared = get_shared; } +end @@ -50,13 +100,15 @@ module type S = type act val bind : act -> (act -> act) -> act + val make_const : int -> act val make_offset : act -> int -> act val make_prim : primitive -> act list -> act val make_isout : act -> act -> act val make_isin : act -> act -> act val make_if : act -> act -> act -> act - val make_switch : - act -> int array -> act array -> act + val make_switch : act -> int array -> act array -> act + val make_catch : act -> int * (act -> act) + val make_exit : int -> act end (* The module will ``produce good code for the case statement'' *) @@ -196,7 +248,7 @@ let case_append c1 c2 = let l1,h1,act1 = c1.(Array.length c1-1) and l2,h2,act2 = c2.(0) in if act1 = act2 then - let r = Array.create (len1+len2-1) c1.(0) in + let r = Array.make (len1+len2-1) c1.(0) in for i = 0 to len1-2 do r.(i) <- c1.(i) done ; @@ -225,7 +277,7 @@ let case_append c1 c2 = done ; r else if h1 > l1 then - let r = Array.create (len1+len2) c1.(0) in + let r = Array.make (len1+len2) c1.(0) in for i = 0 to len1-2 do r.(i) <- c1.(i) done ; @@ -235,7 +287,7 @@ let case_append c1 c2 = done ; r else if h2 > l2 then - let r = Array.create (len1+len2) c1.(0) in + let r = Array.make (len1+len2) c1.(0) in for i = 0 to len1-1 do r.(i) <- c1.(i) done ; @@ -489,77 +541,77 @@ and enum top cases = end ; !r, !rc - let make_if_test konst test arg i ifso ifnot = + let make_if_test test arg i ifso ifnot = Arg.make_if - (Arg.make_prim test [arg ; konst i]) + (Arg.make_prim test [arg ; Arg.make_const i]) ifso ifnot - let make_if_lt konst arg i ifso ifnot = match i with + let make_if_lt arg i ifso ifnot = match i with | 1 -> - make_if_test konst Arg.leint arg 0 ifso ifnot + make_if_test Arg.leint arg 0 ifso ifnot | _ -> - make_if_test konst Arg.ltint arg i ifso ifnot + make_if_test Arg.ltint arg i ifso ifnot - and make_if_le konst arg i ifso ifnot = match i with + and make_if_le arg i ifso ifnot = match i with | -1 -> - make_if_test konst Arg.ltint arg 0 ifso ifnot + make_if_test Arg.ltint arg 0 ifso ifnot | _ -> - make_if_test konst Arg.leint arg i ifso ifnot + make_if_test Arg.leint arg i ifso ifnot - and make_if_gt konst arg i ifso ifnot = match i with + and make_if_gt arg i ifso ifnot = match i with | -1 -> - make_if_test konst Arg.geint arg 0 ifso ifnot + make_if_test Arg.geint arg 0 ifso ifnot | _ -> - make_if_test konst Arg.gtint arg i ifso ifnot + make_if_test Arg.gtint arg i ifso ifnot - and make_if_ge konst arg i ifso ifnot = match i with + and make_if_ge arg i ifso ifnot = match i with | 1 -> - make_if_test konst Arg.gtint arg 0 ifso ifnot + make_if_test Arg.gtint arg 0 ifso ifnot | _ -> - make_if_test konst Arg.geint arg i ifso ifnot + make_if_test Arg.geint arg i ifso ifnot - and make_if_eq konst arg i ifso ifnot = - make_if_test konst Arg.eqint arg i ifso ifnot + and make_if_eq arg i ifso ifnot = + make_if_test Arg.eqint arg i ifso ifnot - and make_if_ne konst arg i ifso ifnot = - make_if_test konst Arg.neint arg i ifso ifnot + and make_if_ne arg i ifso ifnot = + make_if_test Arg.neint arg i ifso ifnot let do_make_if_out h arg ifso ifno = Arg.make_if (Arg.make_isout h arg) ifso ifno - let make_if_out konst ctx l d mk_ifso mk_ifno = match l with + let make_if_out ctx l d mk_ifso mk_ifno = match l with | 0 -> do_make_if_out - (konst d) ctx.arg (mk_ifso ctx) (mk_ifno ctx) + (Arg.make_const d) ctx.arg (mk_ifso ctx) (mk_ifno ctx) | _ -> Arg.bind (Arg.make_offset ctx.arg (-l)) (fun arg -> let ctx = {off= (-l+ctx.off) ; arg=arg} in do_make_if_out - (konst d) arg (mk_ifso ctx) (mk_ifno ctx)) + (Arg.make_const d) arg (mk_ifso ctx) (mk_ifno ctx)) let do_make_if_in h arg ifso ifno = Arg.make_if (Arg.make_isin h arg) ifso ifno - let make_if_in konst ctx l d mk_ifso mk_ifno = match l with + let make_if_in ctx l d mk_ifso mk_ifno = match l with | 0 -> do_make_if_in - (konst d) ctx.arg (mk_ifso ctx) (mk_ifno ctx) + (Arg.make_const d) ctx.arg (mk_ifso ctx) (mk_ifno ctx) | _ -> Arg.bind (Arg.make_offset ctx.arg (-l)) (fun arg -> let ctx = {off= (-l+ctx.off) ; arg=arg} in do_make_if_in - (konst d) arg (mk_ifso ctx) (mk_ifno ctx)) - + (Arg.make_const d) arg (mk_ifso ctx) (mk_ifno ctx)) - let rec c_test konst ctx ({cases=cases ; actions=actions} as s) = + let rec c_test ctx ({cases=cases ; actions=actions} as s) = let lcases = Array.length cases in assert(lcases > 0) ; if lcases = 1 then actions.(get_act cases 0) ctx + else begin let w,c = opt_count false cases in @@ -579,31 +631,31 @@ and enum top cases = if low=high then begin if less_tests coutside cinside then make_if_eq - konst ctx.arg + ctx.arg (low+ctx.off) - (c_test konst ctx {s with cases=inside}) - (c_test konst ctx {s with cases=outside}) + (c_test ctx {s with cases=inside}) + (c_test ctx {s with cases=outside}) else make_if_ne - konst ctx.arg + ctx.arg (low+ctx.off) - (c_test konst ctx {s with cases=outside}) - (c_test konst ctx {s with cases=inside}) + (c_test ctx {s with cases=outside}) + (c_test ctx {s with cases=inside}) end else begin if less_tests coutside cinside then make_if_in - konst ctx + ctx (low+ctx.off) (high-low) - (fun ctx -> c_test konst ctx {s with cases=inside}) - (fun ctx -> c_test konst ctx {s with cases=outside}) + (fun ctx -> c_test ctx {s with cases=inside}) + (fun ctx -> c_test ctx {s with cases=outside}) else make_if_out - konst ctx + ctx (low+ctx.off) (high-low) - (fun ctx -> c_test konst ctx {s with cases=outside}) - (fun ctx -> c_test konst ctx {s with cases=inside}) + (fun ctx -> c_test ctx {s with cases=outside}) + (fun ctx -> c_test ctx {s with cases=inside}) end | Sep i -> let lim,left,right = coupe cases i in @@ -613,17 +665,17 @@ and enum top cases = and right = {s with cases=right} in if i=1 && (lim+ctx.off)=1 && get_low cases 0+ctx.off=0 then - make_if_ne konst + make_if_ne ctx.arg 0 - (c_test konst ctx right) (c_test konst ctx left) + (c_test ctx right) (c_test ctx left) else if less_tests cright cleft then - make_if_lt konst + make_if_lt ctx.arg (lim+ctx.off) - (c_test konst ctx left) (c_test konst ctx right) + (c_test ctx left) (c_test ctx right) else - make_if_ge konst + make_if_ge ctx.arg (lim+ctx.off) - (c_test konst ctx right) (c_test konst ctx left) + (c_test ctx right) (c_test ctx left) end @@ -676,8 +728,8 @@ let dense {cases=cases ; actions=actions} i j = let comp_clusters ({cases=cases ; actions=actions} as s) = let len = Array.length cases in - let min_clusters = Array.create len max_int - and k = Array.create len 0 in + let min_clusters = Array.make len max_int + and k = Array.make len 0 in let get_min i = if i < 0 then 0 else min_clusters.(i) in for i = 0 to len-1 do @@ -697,7 +749,7 @@ let comp_clusters ({cases=cases ; actions=actions} as s) = let make_switch {cases=cases ; actions=actions} i j = let ll,_,_ = cases.(i) and _,hh,_ = cases.(j) in - let tbl = Array.create (hh-ll+1) 0 + let tbl = Array.make (hh-ll+1) 0 and t = Hashtbl.create 17 and index = ref 0 in let get_index act = @@ -717,7 +769,7 @@ let make_switch {cases=cases ; actions=actions} i j = tbl.(kk) <- index done done ; - let acts = Array.create !index actions.(0) in + let acts = Array.make !index actions.(0) in Hashtbl.iter (fun act i -> acts.(i) <- actions.(act)) t ; @@ -732,7 +784,7 @@ let make_switch {cases=cases ; actions=actions} i j = let make_clusters ({cases=cases ; actions=actions} as s) n_clusters k = let len = Array.length cases in - let r = Array.create n_clusters (0,0,0) + let r = Array.make n_clusters (0,0,0) and t = Hashtbl.create 17 and index = ref 0 and bidon = ref (Array.length actions) in @@ -768,13 +820,13 @@ let make_clusters ({cases=cases ; actions=actions} as s) n_clusters k = if i > 0 then zyva (i-1) (ir-1) in zyva (len-1) (n_clusters-1) ; - let acts = Array.create !index (fun _ -> assert false) in + let acts = Array.make !index (fun _ -> assert false) in Hashtbl.iter (fun _ (i,act) -> acts.(i) <- act) t ; {cases = r ; actions = acts} ;; -let zyva (low,high) konst arg cases actions = +let do_zyva (low,high) arg cases actions = let old_ok = !ok_inter in ok_inter := (abs low <= inter_limit && abs high <= inter_limit) ; if !ok_inter <> old_ok then Hashtbl.clear t ; @@ -787,12 +839,31 @@ let zyva (low,high) konst arg cases actions = *) let n_clusters,k = comp_clusters s in let clusters = make_clusters s n_clusters k in - let r = c_test konst {arg=arg ; off=0} clusters in + let r = c_test {arg=arg ; off=0} clusters in r - - -and test_sequence konst arg cases actions = +let abstract_shared actions = + let handlers = ref (fun x -> x) in + let actions = + Array.map + (fun act -> match act with + | Single act -> act + | Shared act -> + let i,h = Arg.make_catch act in + let oh = !handlers in + handlers := (fun act -> h (oh act)) ; + Arg.make_exit i) + actions in + !handlers,actions + +let zyva lh arg cases actions = + let actions = actions.act_get_shared () in + let hs,actions = abstract_shared actions in + hs (do_zyva lh arg cases actions) + +and test_sequence arg cases actions = + let actions = actions.act_get_shared () in + let hs,actions = abstract_shared actions in let old_ok = !ok_inter in ok_inter := false ; if !ok_inter <> old_ok then Hashtbl.clear t ; @@ -804,8 +875,7 @@ and test_sequence konst arg cases actions = pcases stderr cases ; prerr_endline "" ; *) - let r = c_test konst {arg=arg ; off=0} s in - r + hs (c_test {arg=arg ; off=0} s) ;; end diff --git a/bytecomp/switch.mli b/bytecomp/switch.mli index 69fc800d..53fd9974 100644 --- a/bytecomp/switch.mli +++ b/bytecomp/switch.mli @@ -17,9 +17,35 @@ (* For detecting action sharing, object style *) +(* Store for actions in object style: + act_store : store an action, returns index in table + In case an action with equal key exists, returns index + of the stored action. Otherwise add entry in table. + act_store_shared : This stored action will always be shared. + act_get : retrieve table + act_get_shared : retrieve table, with sharing explicit +*) + +type 'a shared = Shared of 'a | Single of 'a + type 'a t_store = - {act_get : unit -> 'a array ; act_store : 'a -> int} -val mk_store : ('a -> 'a -> bool) -> 'a t_store + {act_get : unit -> 'a array ; + act_get_shared : unit -> 'a shared array ; + act_store : 'a -> int ; + act_store_shared : 'a -> int ; } + +exception Not_simple + +module type Stored = sig + type t + type key + val make_key : t -> key option +end + +module Store(A:Stored) : + sig + val mk_store : unit -> A.t t_store + end (* Arguments to the Make functor *) module type S = @@ -39,6 +65,7 @@ module type S = (* Various constructors, for making a binder, adding one integer, etc. *) val bind : act -> (act -> act) -> act + val make_const : int -> act val make_offset : act -> int -> act val make_prim : primitive -> act list -> act val make_isout : act -> act -> act @@ -49,12 +76,15 @@ module type S = NB: cases is in the value form *) val make_switch : act -> int array -> act array -> act + (* Build last minute sharing of action stuff *) + val make_catch : act -> int * (act -> act) + val make_exit : int -> act + end (* - Make.zyva mk_const arg low high cases actions where - - mk_const takes an integer sends a constant action. + Make.zyva arg low high cases actions where - arg is the argument of the switch. - low, high are the interval limits. - cases is a list of sub-interval and action indices @@ -66,17 +96,18 @@ module type S = module Make : functor (Arg : S) -> sig +(* Standard entry point, sharing is tracked *) val zyva : (int * int) -> - (int -> Arg.act) -> Arg.act -> (int * int * int) array -> - Arg.act array -> + Arg.act t_store -> Arg.act + +(* Output test sequence, sharing tracked *) val test_sequence : - (int -> Arg.act) -> Arg.act -> (int * int * int) array -> - Arg.act array -> + Arg.act t_store -> Arg.act end diff --git a/bytecomp/symtable.ml b/bytecomp/symtable.ml index 63374f82..1cc3a531 100644 --- a/bytecomp/symtable.ml +++ b/bytecomp/symtable.ml @@ -96,7 +96,7 @@ let require_primitive name = if name.[0] <> '%' then ignore(num_of_prim name) let all_primitives () = - let prim = Array.create !c_prim_table.num_cnt "" in + let prim = Array.make !c_prim_table.num_cnt "" in Tbl.iter (fun name number -> prim.(number) <- name) !c_prim_table.num_tbl; prim @@ -134,13 +134,17 @@ let output_primitive_table outchan = let init () = (* Enter the predefined exceptions *) - Array.iter - (fun name -> + Array.iteri + (fun i name -> let id = try List.assoc name Predef.builtin_values with Not_found -> fatal_error "Symtable.init" in let c = slot_for_setglobal id in - let cst = Const_block(0, [Const_base(Const_string name)]) in + let cst = Const_block(Obj.object_tag, + [Const_base(Const_string (name, None)); + Const_base(Const_int (-i-1)) + ]) + in literal_table := (c, cst) :: !literal_table) Runtimedef.builtin_exceptions; (* Initialize the known C primitives *) @@ -194,7 +198,7 @@ let gen_patch_object str_set buff patchlist = gen_patch_int str_set buff pos (num_of_prim name)) patchlist -let patch_object = gen_patch_object String.unsafe_set +let patch_object = gen_patch_object Bytes.unsafe_set let ls_patch_object = gen_patch_object LongString.set (* Translate structured constants *) @@ -202,7 +206,7 @@ let ls_patch_object = gen_patch_object LongString.set let rec transl_const = function Const_base(Const_int i) -> Obj.repr i | Const_base(Const_char c) -> Obj.repr c - | Const_base(Const_string s) -> Obj.repr s + | Const_base(Const_string (s, _)) -> Obj.repr s | Const_base(Const_float f) -> Obj.repr (float_of_string f) | Const_base(Const_int32 i) -> Obj.repr i | Const_base(Const_int64 i) -> Obj.repr i @@ -222,7 +226,7 @@ let rec transl_const = function (* Build the initial table of globals *) let initial_global_table () = - let glob = Array.create !global_table.num_cnt (Obj.repr 0) in + let glob = Array.make !global_table.num_cnt (Obj.repr 0) in List.iter (fun (slot, cst) -> glob.(slot) <- transl_const cst) !literal_table; @@ -296,7 +300,8 @@ let init_toplevel () = Dll.init_toplevel dllpath; (* Recover CRC infos for interfaces *) let crcintfs = - try (Obj.magic (sect.read_struct "CRCS") : (string * Digest.t) list) + try + (Obj.magic (sect.read_struct "CRCS") : (string * Digest.t option) list) with Not_found -> [] in (* Done *) sect.close_reader(); @@ -372,3 +377,15 @@ let report_error ppf = function fprintf ppf "Cannot find or execute the runtime system %s" s | Uninitialized_global s -> fprintf ppf "The value of the global `%s' is not yet computed" s + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let reset () = + global_table := empty_numtable; + literal_table := []; + c_prim_table := empty_numtable diff --git a/bytecomp/symtable.mli b/bytecomp/symtable.mli index e3c33d23..ffc878bf 100644 --- a/bytecomp/symtable.mli +++ b/bytecomp/symtable.mli @@ -17,7 +17,7 @@ open Cmo_format (* Functions for batch linking *) val init: unit -> unit -val patch_object: string -> (reloc_info * int) list -> unit +val patch_object: bytes -> (reloc_info * int) list -> unit val ls_patch_object: Misc.LongString.t -> (reloc_info * int) list -> unit val require_primitive: string -> unit val initial_global_table: unit -> Obj.t array @@ -29,7 +29,7 @@ val data_primitive_names: unit -> string (* Functions for the toplevel *) -val init_toplevel: unit -> (string * Digest.t) list +val init_toplevel: unit -> (string * Digest.t option) list val update_global_table: unit -> unit val get_global_value: Ident.t -> Obj.t val is_global_defined: Ident.t -> bool @@ -57,3 +57,5 @@ exception Error of error open Format val report_error: formatter -> error -> unit + +val reset: unit -> unit diff --git a/bytecomp/translclass.ml b/bytecomp/translclass.ml index ec40912c..0fb68457 100644 --- a/bytecomp/translclass.ml +++ b/bytecomp/translclass.ml @@ -109,6 +109,15 @@ let create_object cl obj init = [obj; Lvar obj'; Lvar cl])))) end +let name_pattern default p = + match p.pat_desc with + | Tpat_var (id, _) -> id + | Tpat_alias(p, id, _) -> id + | _ -> Ident.create default + +let normalize_cl_path cl path = + Env.normalize_path (Some cl.cl_loc) cl.cl_env path + let rec build_object_init cl_table obj params inh_init obj_init cl = match cl.cl_desc with Tcl_ident ( path, _, _) -> @@ -118,7 +127,8 @@ let rec build_object_init cl_table obj params inh_init obj_init cl = match envs with None -> [] | Some envs -> [Lprim(Pfield (List.length inh_init + 1), [Lvar envs])] in - ((envs, (obj_init, path)::inh_init), + ((envs, (obj_init, normalize_cl_path cl path) + ::inh_init), mkappl(Lvar obj_init, env @ [obj])) | Tcl_structure str -> create_object cl_table obj (fun obj -> @@ -126,18 +136,18 @@ let rec build_object_init cl_table obj params inh_init obj_init cl = List.fold_right (fun field (inh_init, obj_init, has_init) -> match field.cf_desc with - Tcf_inher (_, cl, _, _, _) -> + Tcf_inherit (_, cl, _, _, _) -> let (inh_init, obj_init') = build_object_init cl_table (Lvar obj) [] inh_init (fun _ -> lambda_unit) cl in (inh_init, lsequence obj_init' obj_init, true) - | Tcf_val (_, _, _, id, Tcfk_concrete exp, _) -> + | Tcf_val (_, _, id, Tcfk_concrete (_, exp), _) -> (inh_init, lsequence (set_inst_var obj id exp) obj_init, has_init) - | Tcf_meth _ | Tcf_val _ | Tcf_constr _ -> + | Tcf_method _ | Tcf_val _ | Tcf_constraint _ | Tcf_attribute _-> (inh_init, obj_init, has_init) - | Tcf_init _ -> + | Tcf_initializer _ -> (inh_init, obj_init, true) ) str.cstr_fields @@ -156,7 +166,7 @@ let rec build_object_init cl_table obj params inh_init obj_init cl = in (inh_init, let build params rem = - let param = name_pattern "param" [pat, ()] in + let param = name_pattern "param" pat in Lfunction (Curried, param::params, Matching.for_function pat.pat_loc None (Lvar param) [pat, rem] partial) @@ -247,7 +257,7 @@ let rec build_class_init cla cstr super inh_init cl_init msubst top cl = Tcl_ident ( path, _, _) -> begin match inh_init with (obj_init, path')::inh_init -> - let lpath = transl_path path in + let lpath = transl_path ~loc:cl.cl_loc cl.cl_env path in (inh_init, Llet (Strict, obj_init, mkappl(Lprim(Pfield 1, [lpath]), Lvar cla :: @@ -262,38 +272,42 @@ let rec build_class_init cla cstr super inh_init cl_init msubst top cl = List.fold_right (fun field (inh_init, cl_init, methods, values) -> match field.cf_desc with - Tcf_inher (_, cl, _, vals, meths) -> + Tcf_inherit (_, cl, _, vals, meths) -> let cl_init = output_methods cla methods cl_init in let inh_init, cl_init = build_class_init cla false (vals, meths_super cla str.cstr_meths meths) inh_init cl_init msubst top cl in (inh_init, cl_init, [], values) - | Tcf_val (name, _, _, id, exp, over) -> - let values = if over then values else (name, id) :: values in + | Tcf_val (name, _, id, _, over) -> + let values = + if over then values else (name.txt, id) :: values + in (inh_init, cl_init, methods, values) - | Tcf_meth (_, _, _, Tcfk_virtual _, _) - | Tcf_constr _ + | Tcf_method (_, _, Tcfk_virtual _) + | Tcf_constraint _ -> (inh_init, cl_init, methods, values) - | Tcf_meth (name, _, _, Tcfk_concrete exp, over) -> + | Tcf_method (name, _, Tcfk_concrete (_, exp)) -> let met_code = msubst true (transl_exp exp) in let met_code = if !Clflags.native_code && List.length met_code = 1 then (* Force correct naming of method for profiles *) - let met = Ident.create ("method_" ^ name) in + let met = Ident.create ("method_" ^ name.txt) in [Llet(Strict, met, List.hd met_code, Lvar met)] else met_code in (inh_init, cl_init, - Lvar (Meths.find name str.cstr_meths) :: met_code @ methods, + Lvar(Meths.find name.txt str.cstr_meths) :: met_code @ methods, values) - | Tcf_init exp -> + | Tcf_initializer exp -> (inh_init, Lsequence(mkappl (oo_prim "add_initializer", Lvar cla :: msubst false (transl_exp exp)), cl_init), - methods, values)) + methods, values) + | Tcf_attribute _ -> + (inh_init, cl_init, methods, values)) str.cstr_fields (inh_init, cl_init, [], []) in @@ -325,8 +339,8 @@ let rec build_class_init cla cstr super inh_init cl_init msubst top cl = let cl = ignore_cstrs cl in begin match cl.cl_desc, inh_init with Tcl_ident (path, _, _), (obj_init, path')::inh_init -> - assert (Path.same path path'); - let lpath = transl_path path in + assert (Path.same (normalize_cl_path cl path) path'); + let lpath = transl_normal_path path' in let inh = Ident.create "inh" and ofs = List.length vals + 1 and valids, methids = super in @@ -392,11 +406,11 @@ let rec transl_class_rebind obj_init cl vf = try if (Env.find_class path cl.cl_env).cty_new = None then raise Exit with Not_found -> raise Exit end; - (path, obj_init) + (normalize_cl_path cl path, obj_init) | Tcl_fun (_, pat, _, cl, partial) -> let path, obj_init = transl_class_rebind obj_init cl vf in let build params rem = - let param = name_pattern "param" [pat, ()] in + let param = name_pattern "param" pat in Lfunction (Curried, param::params, Matching.for_function pat.pat_loc None (Lvar param) [pat, rem] partial) @@ -416,7 +430,7 @@ let rec transl_class_rebind obj_init cl vf = let path, obj_init = transl_class_rebind obj_init cl' vf in let rec check_constraint = function Cty_constr(path', _, _) when Path.same path path' -> () - | Cty_fun (_, _, cty) -> check_constraint cty + | Cty_arrow (_, _, cty) -> check_constraint cty | _ -> raise Exit in check_constraint cl.cl_type; @@ -440,7 +454,7 @@ let transl_class_rebind ids cl vf = if not (Translcore.check_recursive_lambda ids obj_init') then raise(Error(cl.cl_loc, Illegal_class_expr)); let id = (obj_init' = lfunction [self] obj_init0) in - if id then transl_path path else + if id then transl_normal_path path else let cla = Ident.create "class" and new_init = Ident.create "new_init" @@ -450,7 +464,7 @@ let transl_class_rebind ids cl vf = Llet( Strict, new_init, lfunction [obj_init] obj_init', Llet( - Alias, cla, transl_path path, + Alias, cla, transl_normal_path path, Lprim(Pmakeblock(0, Immutable), [mkappl(Lvar new_init, [lfield cla 0]); lfunction [table] @@ -735,7 +749,7 @@ let transl_class ids cl_id pub_meths cl vflag = Lprim(Pmakeblock(0, Immutable), menv :: List.map (fun id -> Lvar id) !new_ids_init) and linh_envs = - List.map (fun (_, p) -> Lprim(Pfield 3, [transl_path p])) + List.map (fun (_, p) -> Lprim(Pfield 3, [transl_normal_path p])) (List.rev inh_init) in let make_envs lam = @@ -752,7 +766,7 @@ let transl_class ids cl_id pub_meths cl vflag = List.filter (fun (_,path) -> List.mem (Path.head path) new_ids) inh_init in let inh_keys = - List.map (fun (_,p) -> Lprim(Pfield 1, [transl_path p])) inh_paths in + List.map (fun (_,p) -> Lprim(Pfield 1, [transl_normal_path p])) inh_paths in let lclass lam = Llet(Strict, class_init, Lfunction(Curried, [cla], def_ids cla cl_init), lam) @@ -798,7 +812,7 @@ let transl_class ids cl_id pub_meths cl vflag = (* let cl_id = ci.ci_id_class in (* TODO: cl_id is used somewhere else as typesharp ? *) - let _arity = List.length (fst ci.ci_params) in + let _arity = List.length ci.ci_params in let pub_meths = m in let cl = ci.ci_expr in let vflag = vf in @@ -820,3 +834,12 @@ let report_error ppf = function | Tags (lab1, lab2) -> fprintf ppf "Method labels `%s' and `%s' are incompatible.@ %s" lab1 lab2 "Change one of them." + +let () = + Location.register_error_of_exn + (function + | Error (loc, err) -> + Some (Location.error_of_printer loc report_error err) + | _ -> + None + ) diff --git a/bytecomp/translcore.ml b/bytecomp/translcore.ml index 36b79daa..876abaa9 100644 --- a/bytecomp/translcore.ml +++ b/bytecomp/translcore.ml @@ -146,7 +146,9 @@ let primitives_table = create_hashtable 57 [ "%setfield0", Psetfield(0, true); "%makeblock", Pmakeblock(0, Immutable); "%makemutable", Pmakeblock(0, Mutable); - "%raise", Praise; + "%raise", Praise Raise_regular; + "%reraise", Praise Raise_reraise; + "%raise_notrace", Praise Raise_notrace; "%sequand", Psequand; "%sequor", Psequor; "%boolnot", Pnot; @@ -309,6 +311,7 @@ let primitives_table = create_hashtable 57 [ "%bswap_int32", Pbbswap(Pint32); "%bswap_int64", Pbbswap(Pint64); "%bswap_native", Pbbswap(Pnativeint); + "%int_as_pointer", Pint_as_pointer; ] let prim_makearray = @@ -323,6 +326,11 @@ let find_primitive loc prim_name = match prim_name with "%revapply" -> Prevapply loc | "%apply" -> Pdirapply loc + | "%loc_LOC" -> Ploc Loc_LOC + | "%loc_FILE" -> Ploc Loc_FILE + | "%loc_LINE" -> Ploc Loc_LINE + | "%loc_POS" -> Ploc Loc_POS + | "%loc_MODULE" -> Ploc Loc_MODULE | name -> Hashtbl.find primitives_table name let transl_prim loc prim args = @@ -333,10 +341,10 @@ let transl_prim loc prim args = simplify_constant_constructor) = Hashtbl.find comparisons_table prim_name in begin match args with - [arg1; {exp_desc = Texp_construct(_, {cstr_tag = Cstr_constant _}, _, _)}] + [arg1; {exp_desc = Texp_construct(_, {cstr_tag = Cstr_constant _}, _)}] when simplify_constant_constructor -> intcomp - | [{exp_desc = Texp_construct(_, {cstr_tag = Cstr_constant _}, _, _)}; arg2] + | [{exp_desc = Texp_construct(_, {cstr_tag = Cstr_constant _}, _)}; arg2] when simplify_constant_constructor -> intcomp | [arg1; {exp_desc = Texp_variant(_, None)}] @@ -402,10 +410,20 @@ let transl_primitive loc p = with Not_found -> Pccall p in match prim with - Plazyforce -> + | Plazyforce -> let parm = Ident.create "prim" in Lfunction(Curried, [parm], Matching.inline_lazy_force (Lvar parm) Location.none) + | Ploc kind -> + let lam = lam_of_loc kind loc in + begin match p.prim_arity with + | 0 -> lam + | 1 -> (* TODO: we should issue a warning ? *) + let param = Ident.create "prim" in + Lfunction(Curried, [param], + Lprim(Pmakeblock(0, Immutable), [lam; Lvar param])) + | _ -> assert false + end | _ -> let rec make_params n = if n <= 0 then [] else Ident.create "prim" :: make_params (n-1) in @@ -495,7 +513,7 @@ let extract_float = function let rec name_pattern default = function [] -> Ident.create default - | (p, e) :: rem -> + | {c_lhs=p; _} :: rem -> match p.pat_desc with Tpat_var (id, _) -> id | Tpat_alias(p, id, _) -> id @@ -503,24 +521,29 @@ let rec name_pattern default = function (* Push the default values under the functional abstractions *) -let rec push_defaults loc bindings pat_expr_list partial = - match pat_expr_list with - [pat, ({exp_desc = Texp_function(l, pl,partial)} as exp)] -> +let rec push_defaults loc bindings cases partial = + match cases with + [{c_lhs=pat; c_guard=None; + c_rhs={exp_desc = Texp_function(l, pl,partial)} as exp}] -> let pl = push_defaults exp.exp_loc bindings pl partial in - [pat, {exp with exp_desc = Texp_function(l, pl, partial)}] - | [pat, {exp_desc = Texp_let - (Default, cases, ({exp_desc = Texp_function _} as e2))}] -> - push_defaults loc (cases :: bindings) [pat, e2] partial - | [pat, exp] -> + [{c_lhs=pat; c_guard=None; + c_rhs={exp with exp_desc = Texp_function(l, pl, partial)}}] + | [{c_lhs=pat; c_guard=None; + c_rhs={exp_attributes=[{txt="#default"},_]; + exp_desc = Texp_let + (Nonrecursive, binds, ({exp_desc = Texp_function _} as e2))}}] -> + push_defaults loc (binds :: bindings) [{c_lhs=pat;c_guard=None;c_rhs=e2}] + partial + | [case] -> let exp = List.fold_left - (fun exp cases -> - {exp with exp_desc = Texp_let(Nonrecursive, cases, exp)}) - exp bindings + (fun exp binds -> + {exp with exp_desc = Texp_let(Nonrecursive, binds, exp)}) + case.c_rhs bindings in - [pat, exp] - | (pat, exp) :: _ when bindings <> [] -> - let param = name_pattern "param" pat_expr_list in + [{case with c_rhs=exp}] + | {c_lhs=pat; c_rhs=exp; c_guard=_} :: _ when bindings <> [] -> + let param = name_pattern "param" cases in let name = Ident.name param in let exp = { exp with exp_loc = loc; exp_desc = @@ -528,14 +551,17 @@ let rec push_defaults loc bindings pat_expr_list partial = ({exp with exp_type = pat.pat_type; exp_desc = Texp_ident (Path.Pident param, mknoloc (Longident.Lident name), {val_type = pat.pat_type; val_kind = Val_reg; + val_attributes = []; Types.val_loc = Location.none; })}, - pat_expr_list, partial) } + cases, [], partial) } in push_defaults loc bindings - [{pat with pat_desc = Tpat_var (param, mknoloc name)}, exp] Total + [{c_lhs={pat with pat_desc = Tpat_var (param, mknoloc name)}; + c_guard=None; c_rhs=exp}] + Total | _ -> - pat_expr_list + cases (* Insertion of debugging events *) @@ -581,11 +607,11 @@ let primitive_is_ccall = function let assert_failed exp = let (fname, line, char) = Location.get_pos_info exp.exp_loc.Location.loc_start in - Lprim(Praise, [event_after exp + Lprim(Praise Raise_regular, [event_after exp (Lprim(Pmakeblock(0, Immutable), - [transl_path Predef.path_assert_failure; + [transl_normal_path Predef.path_assert_failure; Lconst(Const_block(0, - [Const_base(Const_string fname); + [Const_base(Const_string (fname, None)); Const_base(Const_int line); Const_base(Const_int char)]))]))]) ;; @@ -597,6 +623,8 @@ let rec cut n l = (* Translation of expressions *) +let try_ids = Hashtbl.create 8 + let rec transl_exp e = let eval_once = (* Whether classes for immediate objects must be cached *) @@ -627,7 +655,7 @@ and transl_exp0 e = | Texp_ident(path, _, {val_kind = Val_anc _}) -> raise(Error(e.exp_loc, Free_super_var)) | Texp_ident(path, _, {val_kind = Val_reg | Val_self _}) -> - transl_path path + transl_path ~loc:e.exp_loc e.exp_env path | Texp_ident _ -> fatal_error "Translcore.transl_exp: bad Texp_ident" | Texp_constant cst -> Lconst(Const_base cst) @@ -675,8 +703,23 @@ and transl_exp0 e = (Warnings.Deprecated "operator (or); you should use (||) instead"); let prim = transl_prim e.exp_loc p args in match (prim, args) with - (Praise, [arg1]) -> - wrap0 (Lprim(Praise, [event_after arg1 (List.hd argl)])) + (Praise k, [arg1]) -> + let targ = List.hd argl in + let k = + match k, targ with + | Raise_regular, Lvar id + when Hashtbl.mem try_ids id -> + Raise_reraise + | _ -> + k + in + wrap0 (Lprim(Praise k, [event_after arg1 targ])) + | (Ploc kind, []) -> + lam_of_loc kind e.exp_loc + | (Ploc kind, [arg1]) -> + let lam = lam_of_loc kind arg1.exp_loc in + Lprim(Pmakeblock(0, Immutable), lam :: argl) + | (Ploc _, _) -> assert false | (_, _) -> begin match (prim, argl) with | (Plazyforce, [a]) -> @@ -688,16 +731,12 @@ and transl_exp0 e = end | Texp_apply(funct, oargs) -> event_after e (transl_apply (transl_exp funct) oargs e.exp_loc) - | Texp_match({exp_desc = Texp_tuple argl}, pat_expr_list, partial) -> - Matching.for_multiple_match e.exp_loc - (transl_list argl) (transl_cases pat_expr_list) partial - | Texp_match(arg, pat_expr_list, partial) -> - Matching.for_function e.exp_loc None - (transl_exp arg) (transl_cases pat_expr_list) partial + | Texp_match(arg, pat_expr_list, exn_pat_expr_list, partial) -> + transl_match e arg pat_expr_list exn_pat_expr_list partial | Texp_try(body, pat_expr_list) -> let id = name_pattern "exn" pat_expr_list in Ltrywith(transl_exp body, id, - Matching.for_trywith (Lvar id) (transl_cases pat_expr_list)) + Matching.for_trywith (Lvar id) (transl_cases_try pat_expr_list)) | Texp_tuple el -> let ll = transl_list el in begin try @@ -705,7 +744,7 @@ and transl_exp0 e = with Not_constant -> Lprim(Pmakeblock(0, Immutable), ll) end - | Texp_construct(_, cstr, args, _) -> + | Texp_construct(_, cstr, args) -> let ll = transl_list args in begin match cstr.cstr_tag with Cstr_constant n -> @@ -716,8 +755,12 @@ and transl_exp0 e = with Not_constant -> Lprim(Pmakeblock(n, Immutable), ll) end - | Cstr_exception (path, _) -> - Lprim(Pmakeblock(0, Immutable), transl_path path :: ll) + | Cstr_extension(path, is_const) -> + if is_const then + transl_path e.exp_env path + else + Lprim(Pmakeblock(0, Immutable), + transl_path e.exp_env path :: ll) end | Texp_variant(l, arg) -> let tag = Btype.hash_variant l in @@ -782,10 +825,6 @@ and transl_exp0 e = | Texp_for(param, _, low, high, dir, body) -> Lfor(param, transl_exp low, transl_exp high, dir, event_before body (transl_exp body)) - | Texp_when(cond, body) -> - event_before cond - (Lifthenelse(transl_exp cond, event_before body (transl_exp body), - staticfail)) | Texp_send(_, _, Some exp) -> transl_exp exp | Texp_send(expr, met, None) -> let obj = transl_exp expr in @@ -798,16 +837,18 @@ and transl_exp0 e = Lsend (kind, tag, obj, cache, e.exp_loc) in event_after e lam - | Texp_new (cl, _, _) -> - Lapply(Lprim(Pfield 0, [transl_path cl]), [lambda_unit], Location.none) + | Texp_new (cl, {Location.loc=loc}, _) -> + Lapply(Lprim(Pfield 0, [transl_path ~loc e.exp_env cl]), + [lambda_unit], Location.none) | Texp_instvar(path_self, path, _) -> - Lprim(Parrayrefu Paddrarray, [transl_path path_self; transl_path path]) + Lprim(Parrayrefu Paddrarray, + [transl_normal_path path_self; transl_normal_path path]) | Texp_setinstvar(path_self, path, _, expr) -> - transl_setinstvar (transl_path path_self) path expr + transl_setinstvar (transl_normal_path path_self) path expr | Texp_override(path_self, modifs) -> let cpy = Ident.create "copy" in Llet(Strict, cpy, - Lapply(Translobj.oo_prim "copy", [transl_path path_self], + Lapply(Translobj.oo_prim "copy", [transl_normal_path path_self], Location.none), List.fold_right (fun (path, _, expr) rem -> @@ -818,11 +859,12 @@ and transl_exp0 e = Llet(Strict, id, !transl_module Tcoerce_none None modl, transl_exp body) | Texp_pack modl -> !transl_module Tcoerce_none None modl + | Texp_assert {exp_desc=Texp_construct(_, {cstr_name="false"}, _)} -> + assert_failed e | Texp_assert (cond) -> if !Clflags.noassert then lambda_unit else Lifthenelse (transl_exp cond, lambda_unit, assert_failed e) - | Texp_assertfalse -> assert_failed e | Texp_lazy e -> (* when e needs no computation (constants, identifiers, ...), we optimize the translation just as Lazy.lazy_from_val would @@ -833,7 +875,7 @@ and transl_exp0 e = ( Const_int _ | Const_char _ | Const_string _ | Const_int32 _ | Const_int64 _ | Const_nativeint _ ) | Texp_function(_, _, _) - | Texp_construct (_, {cstr_arity = 0}, _, _) + | Texp_construct (_, {cstr_arity = 0}, _) -> transl_exp e | Texp_constant(Const_float _) -> Lprim(Pmakeblock(Obj.forward_tag, Immutable), [transl_exp e]) @@ -859,7 +901,6 @@ and transl_exp0 e = || has_base_type e Predef.path_exn || has_base_type e Predef.path_array || has_base_type e Predef.path_list - || has_base_type e Predef.path_format6 || has_base_type e Predef.path_option || has_base_type e Predef.path_nativeint || has_base_type e Predef.path_int32 @@ -871,7 +912,7 @@ and transl_exp0 e = (* other cases compile to a lazy block holding a function *) | _ -> let fn = Lfunction (Curried, [Ident.create "param"], transl_exp e) in - Lprim(Pmakeblock(Config.lazy_tag, Immutable), [fn]) + Lprim(Pmakeblock(Config.lazy_tag, Mutable), [fn]) end | Texp_object (cs, meths) -> let cty = cs.cstr_type in @@ -880,18 +921,43 @@ and transl_exp0 e = { cl_desc = Tcl_structure cs; cl_loc = e.exp_loc; cl_type = Cty_signature cty; - cl_env = e.exp_env } + cl_env = e.exp_env; + cl_attributes = []; + } and transl_list expr_list = List.map transl_exp expr_list -and transl_cases pat_expr_list = - List.map - (fun (pat, expr) -> (pat, event_before expr (transl_exp expr))) - pat_expr_list +and transl_guard guard rhs = + let expr = event_before rhs (transl_exp rhs) in + match guard with + | None -> expr + | Some cond -> + event_before cond (Lifthenelse(transl_exp cond, expr, staticfail)) + +and transl_case {c_lhs; c_guard; c_rhs} = + c_lhs, transl_guard c_guard c_rhs + +and transl_cases cases = + List.map transl_case cases + +and transl_case_try {c_lhs; c_guard; c_rhs} = + match c_lhs.pat_desc with + | Tpat_var (id, _) + | Tpat_alias (_, id, _) -> + Hashtbl.replace try_ids id (); + Misc.try_finally + (fun () -> c_lhs, transl_guard c_guard c_rhs) + (fun () -> Hashtbl.remove try_ids id) + | _ -> + c_lhs, transl_guard c_guard c_rhs + +and transl_cases_try cases = + List.map transl_case_try cases and transl_tupled_cases patl_expr_list = - List.map (fun (patl, expr) -> (patl, transl_exp expr)) patl_expr_list + List.map (fun (patl, guard, expr) -> (patl, transl_guard guard expr)) + patl_expr_list and transl_apply lam sargs loc = let lapply funct args = @@ -943,56 +1009,58 @@ and transl_apply lam sargs loc = in build_apply lam [] (List.map (fun (l, x,o) -> may_map transl_exp x, o) sargs) -and transl_function loc untuplify_fn repr partial pat_expr_list = - match pat_expr_list with - [pat, ({exp_desc = Texp_function(_, pl,partial')} as exp)] +and transl_function loc untuplify_fn repr partial cases = + match cases with + [{c_lhs=pat; c_guard=None; + c_rhs={exp_desc = Texp_function(_, pl,partial')} as exp}] when Parmatch.fluid pat -> - let param = name_pattern "param" pat_expr_list in + let param = name_pattern "param" cases in let ((_, params), body) = transl_function exp.exp_loc false repr partial' pl in ((Curried, param :: params), Matching.for_function loc None (Lvar param) [pat, body] partial) - | ({pat_desc = Tpat_tuple pl}, _) :: _ when untuplify_fn -> + | {c_lhs={pat_desc = Tpat_tuple pl}} :: _ when untuplify_fn -> begin try let size = List.length pl in let pats_expr_list = List.map - (fun (pat, expr) -> (Matching.flatten_pattern size pat, expr)) - pat_expr_list in + (fun {c_lhs; c_guard; c_rhs} -> + (Matching.flatten_pattern size c_lhs, c_guard, c_rhs)) + cases in let params = List.map (fun p -> Ident.create "param") pl in ((Tupled, params), Matching.for_tupled_function loc params (transl_tupled_cases pats_expr_list) partial) with Matching.Cannot_flatten -> - let param = name_pattern "param" pat_expr_list in + let param = name_pattern "param" cases in ((Curried, [param]), Matching.for_function loc repr (Lvar param) - (transl_cases pat_expr_list) partial) + (transl_cases cases) partial) end | _ -> - let param = name_pattern "param" pat_expr_list in + let param = name_pattern "param" cases in ((Curried, [param]), Matching.for_function loc repr (Lvar param) - (transl_cases pat_expr_list) partial) + (transl_cases cases) partial) and transl_let rec_flag pat_expr_list body = match rec_flag with - Nonrecursive | Default -> + Nonrecursive -> let rec transl = function [] -> body - | (pat, expr) :: rem -> + | {vb_pat=pat; vb_expr=expr} :: rem -> Matching.for_let pat.pat_loc (transl_exp expr) pat (transl rem) in transl pat_expr_list | Recursive -> let idlist = List.map - (fun (pat, expr) -> match pat.pat_desc with + (fun {vb_pat=pat} -> match pat.pat_desc with Tpat_var (id,_) -> id | Tpat_alias ({pat_desc=Tpat_any}, id,_) -> id | _ -> raise(Error(pat.pat_loc, Illegal_letrec_pat))) pat_expr_list in - let transl_case (pat, expr) id = + let transl_case {vb_pat=pat; vb_expr=expr} id = let lam = transl_exp expr in if not (check_recursive_lambda idlist lam) then raise(Error(expr.exp_loc, Illegal_letrec_expr)); @@ -1001,7 +1069,7 @@ and transl_let rec_flag pat_expr_list body = and transl_setinstvar self var expr = Lprim(Parraysetu (if maybe_pointer expr then Paddrarray else Pintarray), - [self; transl_path var; transl_exp expr]) + [self; transl_normal_path var; transl_exp expr]) and transl_record all_labels repres lbl_expr_list opt_init_expr = let size = Array.length all_labels in @@ -1010,7 +1078,7 @@ and transl_record all_labels repres lbl_expr_list opt_init_expr = then begin (* Allocate new record with given fields (and remaining fields taken from init_expr if any *) - let lv = Array.create (Array.length all_labels) staticfail in + let lv = Array.make (Array.length all_labels) staticfail in let init_id = Ident.create "init" in begin match opt_init_expr with None -> () @@ -1068,6 +1136,34 @@ and transl_record all_labels repres lbl_expr_list opt_init_expr = end end +and transl_match e arg pat_expr_list exn_pat_expr_list partial = + let id = name_pattern "exn" exn_pat_expr_list + and cases = transl_cases pat_expr_list + and exn_cases = transl_cases exn_pat_expr_list in + let static_catch body val_ids handler = + let static_exception_id = next_negative_raise_count () in + Lstaticcatch + (Ltrywith (Lstaticraise (static_exception_id, body), id, + Matching.for_trywith (Lvar id) exn_cases), + (static_exception_id, val_ids), + handler) + in + match arg, exn_cases with + | {exp_desc = Texp_tuple argl}, [] -> + Matching.for_multiple_match e.exp_loc (transl_list argl) cases partial + | {exp_desc = Texp_tuple argl}, _ :: _ -> + let val_ids = List.map (fun _ -> name_pattern "val" []) argl in + let lvars = List.map (fun id -> Lvar id) val_ids in + static_catch (transl_list argl) val_ids + (Matching.for_multiple_match e.exp_loc lvars cases partial) + | arg, [] -> + Matching.for_function e.exp_loc None (transl_exp arg) cases partial + | arg, _ :: _ -> + let val_id = name_pattern "val" pat_expr_list in + static_catch [transl_exp arg] [val_id] + (Matching.for_function e.exp_loc None (Lvar val_id) cases partial) + + (* Wrapper for class compilation *) (* @@ -1081,15 +1177,6 @@ let transl_let rec_flag pat_expr_list body = (transl_let rec_flag pat_expr_list) body *) -(* Compile an exception definition *) - -let transl_exception id path decl = - let name = - match path with - None -> Ident.name id - | Some p -> Path.name p in - Lprim(Pmakeblock(0, Immutable), [Lconst(Const_base(Const_string name))]) - (* Error report *) open Format @@ -1106,3 +1193,12 @@ let report_error ppf = function "Ancestor names can only be used to select inherited methods" | Unknown_builtin_primitive prim_name -> fprintf ppf "Unknown builtin primitive \"%s\"" prim_name + +let () = + Location.register_error_of_exn + (function + | Error (loc, err) -> + Some (Location.error_of_printer loc report_error err) + | _ -> + None + ) diff --git a/bytecomp/translcore.mli b/bytecomp/translcore.mli index f766cdcf..70f700fc 100644 --- a/bytecomp/translcore.mli +++ b/bytecomp/translcore.mli @@ -17,16 +17,11 @@ open Asttypes open Typedtree open Lambda -val name_pattern: string -> (pattern * 'a) list -> Ident.t - val transl_exp: expression -> lambda val transl_apply: lambda -> (label * expression option * optional) list -> Location.t -> lambda -val transl_let: - rec_flag -> (pattern * expression) list -> lambda -> lambda +val transl_let: rec_flag -> value_binding list -> lambda -> lambda val transl_primitive: Location.t -> Primitive.description -> lambda -val transl_exception: - Ident.t -> Path.t option -> exception_declaration -> lambda val check_recursive_lambda: Ident.t list -> lambda -> bool diff --git a/bytecomp/translmod.ml b/bytecomp/translmod.ml index 3b94a915..dc7d2d7a 100644 --- a/bytecomp/translmod.ml +++ b/bytecomp/translmod.ml @@ -27,30 +27,92 @@ open Translclass type error = Circular_dependency of Ident.t + exception Error of Location.t * error +(* Keep track of the root path (from the root of the namespace to the + currently compiled module expression). Useful for naming extensions. *) + +let global_path glob = Some(Pident glob) +let functor_path path param = + match path with + None -> None + | Some p -> Some(Papply(p, Pident param)) +let field_path path field = + match path with + None -> None + | Some p -> Some(Pdot(p, Ident.name field, Path.nopos)) + +(* Compile type extensions *) + +let prim_set_oo_id = + Pccall {Primitive.prim_name = "caml_set_oo_id"; prim_arity = 1; + prim_alloc = false; prim_native_name = ""; + prim_native_float = false} + +let transl_extension_constructor env path ext = + let name = + match path with + None -> Ident.name ext.ext_id + | Some p -> Path.name p + in + match ext.ext_kind with + Text_decl(args, ret) -> + Lprim(prim_set_oo_id, + [Lprim(Pmakeblock(Obj.object_tag, Mutable), + [Lconst(Const_base(Const_string (name,None))); + Lconst(Const_base(Const_int 0))])]) + | Text_rebind(path, lid) -> + transl_path ~loc:ext.ext_loc env path + +let transl_type_extension env rootpath tyext body = + List.fold_right + (fun ext body -> + let lam = + transl_extension_constructor env (field_path rootpath ext.ext_id) ext + in + Llet(Strict, ext.ext_id, lam, body)) + tyext.tyext_constructors + body + (* Compile a coercion *) -let rec apply_coercion restr arg = +let rec apply_coercion strict restr arg = match restr with Tcoerce_none -> arg - | Tcoerce_structure pos_cc_list -> - name_lambda arg (fun id -> - Lprim(Pmakeblock(0, Immutable), - List.map (apply_coercion_field id) pos_cc_list)) + | Tcoerce_structure(pos_cc_list, id_pos_list) -> + name_lambda strict arg (fun id -> + let lam = + Lprim(Pmakeblock(0, Immutable), + List.map (apply_coercion_field id) pos_cc_list) in + let fv = free_variables lam in + let (lam,s) = + List.fold_left (fun (lam,s) (id',pos,c) -> + if IdentSet.mem id' fv then + let id'' = Ident.create (Ident.name id') in + (Llet(Alias,id'', + apply_coercion Alias c (Lprim(Pfield pos,[Lvar id])),lam), + Ident.add id' (Lvar id'') s) + else (lam,s)) + (lam, Ident.empty) id_pos_list + in + if s == Ident.empty then lam else subst_lambda s lam) | Tcoerce_functor(cc_arg, cc_res) -> let param = Ident.create "funarg" in - name_lambda arg (fun id -> + name_lambda strict arg (fun id -> Lfunction(Curried, [param], - apply_coercion cc_res - (Lapply(Lvar id, [apply_coercion cc_arg (Lvar param)], + apply_coercion Strict cc_res + (Lapply(Lvar id, [apply_coercion Alias cc_arg (Lvar param)], Location.none)))) | Tcoerce_primitive p -> transl_primitive Location.none p + | Tcoerce_alias (path, cc) -> + name_lambda strict arg + (fun id -> apply_coercion Alias cc (transl_normal_path path)) and apply_coercion_field id (pos, cc) = - apply_coercion cc (Lprim(Pfield pos, [Lvar id])) + apply_coercion Alias cc (Lprim(Pfield pos, [Lvar id])) (* Compose two coercions apply_coercion c1 (apply_coercion c2 e) behaves like @@ -60,21 +122,42 @@ let rec compose_coercions c1 c2 = match (c1, c2) with (Tcoerce_none, c2) -> c2 | (c1, Tcoerce_none) -> c1 - | (Tcoerce_structure pc1, Tcoerce_structure pc2) -> + | (Tcoerce_structure (pc1, ids1), Tcoerce_structure (pc2, ids2)) -> let v2 = Array.of_list pc2 in + let ids1 = + List.map (fun (id,pos1,c1) -> + let (pos2,c2) = v2.(pos1) in (id, pos2, compose_coercions c1 c2)) + ids1 + in Tcoerce_structure (List.map (function (p1, Tcoerce_primitive p) -> (p1, Tcoerce_primitive p) | (p1, c1) -> let (p2, c2) = v2.(p1) in (p2, compose_coercions c1 c2)) - pc1) + pc1, + ids1 @ ids2) | (Tcoerce_functor(arg1, res1), Tcoerce_functor(arg2, res2)) -> Tcoerce_functor(compose_coercions arg2 arg1, compose_coercions res1 res2) + | (c1, Tcoerce_alias (path, c2)) -> + Tcoerce_alias (path, compose_coercions c1 c2) | (_, _) -> fatal_error "Translmod.compose_coercions" +(* +let apply_coercion a b c = + Format.eprintf "@[<2>apply_coercion@ %a@]@." Includemod.print_coercion b; + apply_coercion a b c + +let compose_coercions c1 c2 = + let c3 = compose_coercions c1 c2 in + let open Includemod in + Format.eprintf "@[<2>compose_coercions@ (%a)@ (%a) =@ %a@]@." + print_coercion c1 print_coercion c2 print_coercion c2; + c3 +*) + (* Record the primitive declarations occuring in the module compiled *) let primitive_declarations = ref ([] : Primitive.description list) @@ -83,24 +166,11 @@ let record_primitive = function primitive_declarations := p :: !primitive_declarations | _ -> () -(* Keep track of the root path (from the root of the namespace to the - currently compiled module expression). Useful for naming exceptions. *) - -let global_path glob = Some(Pident glob) -let functor_path path param = - match path with - None -> None - | Some p -> Some(Papply(p, Pident param)) -let field_path path field = - match path with - None -> None - | Some p -> Some(Pdot(p, Ident.name field, Path.nopos)) - (* Utilities for compiling "module rec" definitions *) let mod_prim name = try - transl_path + transl_normal_path (fst (Env.lookup_value (Ldot (Lident "CamlinternalMod", name)) Env.empty)) with Not_found -> @@ -109,7 +179,7 @@ let mod_prim name = let undefined_location loc = let (fname, line, char) = Location.get_pos_info loc.Location.loc_start in Lconst(Const_block(0, - [Const_base(Const_string fname); + [Const_base(Const_string (fname, None)); Const_base(Const_int line); Const_base(Const_int char)])) @@ -118,6 +188,8 @@ let init_shape modl = match Mtype.scrape env mty with Mty_ident _ -> raise Not_found + | Mty_alias _ -> + Const_block (1, [Const_pointer 0]) | Mty_signature sg -> Const_block(0, [Const_block(0, init_shape_struct env sg)]) | Mty_functor(id, arg, res) -> @@ -135,12 +207,12 @@ let init_shape modl = | _ -> raise Not_found in init_v :: init_shape_struct env rem | Sig_type(id, tdecl, _) :: rem -> - init_shape_struct (Env.add_type id tdecl env) rem - | Sig_exception(id, edecl) :: rem -> + init_shape_struct (Env.add_type ~check:false id tdecl env) rem + | Sig_typext(id, ext, _) :: rem -> raise Not_found - | Sig_module(id, mty, _) :: rem -> - init_shape_mod env mty :: - init_shape_struct (Env.add_module id mty env) rem + | Sig_module(id, md, _) :: rem -> + init_shape_mod env md.md_type :: + init_shape_struct (Env.add_module_declaration id md env) rem | Sig_modtype(id, minfo) :: rem -> init_shape_struct (Env.add_modtype id minfo env) rem | Sig_class(id, cdecl, _) :: rem -> @@ -166,7 +238,7 @@ let reorder_rec_bindings bindings = and rhs = Array.of_list (List.map (fun (_,_,_,rhs) -> rhs) bindings) in let fv = Array.map Lambda.free_variables rhs in let num_bindings = Array.length id in - let status = Array.create num_bindings Undefined in + let status = Array.make num_bindings Undefined in let res = ref [] in let rec emit_binding i = match status.(i) with @@ -222,22 +294,22 @@ let eval_rec_bindings bindings cont = let compile_recmodule compile_rhs bindings cont = eval_rec_bindings (reorder_rec_bindings - (List.map - (fun ( id, _, _, modl) -> - (id, modl.mod_loc, init_shape modl, compile_rhs id modl)) - bindings)) + (List.map + (fun {mb_id=id; mb_expr=modl; _} -> + (id, modl.mod_loc, init_shape modl, compile_rhs id modl)) + bindings)) cont (* Extract the list of "value" identifiers bound by a signature. "Value" identifiers are identifiers for signature components that - correspond to a run-time value: values, exceptions, modules, classes. + correspond to a run-time value: values, extensions, modules, classes. Note: manifest primitives do not correspond to a run-time value! *) let rec bound_value_identifiers = function [] -> [] | Sig_value(id, {val_kind = Val_reg}) :: rem -> id :: bound_value_identifiers rem - | Sig_exception(id, decl) :: rem -> id :: bound_value_identifiers rem + | Sig_typext(id, ext, _) :: rem -> id :: bound_value_identifiers rem | Sig_module(id, mty, _) :: rem -> id :: bound_value_identifiers rem | Sig_class(id, decl, _) :: rem -> id :: bound_value_identifiers rem | _ :: rem -> bound_value_identifiers rem @@ -245,9 +317,13 @@ let rec bound_value_identifiers = function (* Compile a module expression *) let rec transl_module cc rootpath mexp = + match mexp.mod_type with + Mty_alias _ -> apply_coercion Alias cc lambda_unit + | _ -> match mexp.mod_desc with Tmod_ident (path,_) -> - apply_coercion cc (transl_path path) + apply_coercion StrictOpt cc + (transl_path ~loc:mexp.mod_loc mexp.mod_env path) | Tmod_structure str -> transl_struct [] cc rootpath str | Tmod_functor( param, _, mty, body) -> @@ -260,20 +336,21 @@ let rec transl_module cc rootpath mexp = | Tcoerce_functor(ccarg, ccres) -> let param' = Ident.create "funarg" in Lfunction(Curried, [param'], - Llet(Alias, param, apply_coercion ccarg (Lvar param'), + Llet(Alias, param, + apply_coercion Alias ccarg (Lvar param'), transl_module ccres bodypath body)) | _ -> fatal_error "Translmod.transl_module") cc | Tmod_apply(funct, arg, ccarg) -> oo_wrap mexp.mod_env true - (apply_coercion cc) + (apply_coercion Strict cc) (Lapply(transl_module Tcoerce_none None funct, [transl_module ccarg None arg], mexp.mod_loc)) | Tmod_constraint(arg, mty, _, ccarg) -> transl_module (compose_coercions cc ccarg) rootpath arg | Tmod_unpack(arg, _) -> - apply_coercion cc (Translcore.transl_exp arg) + apply_coercion Strict cc (Translcore.transl_exp arg) and transl_struct fields cc rootpath str = transl_structure fields cc rootpath str.str_items @@ -284,53 +361,58 @@ and transl_structure fields cc rootpath = function Tcoerce_none -> Lprim(Pmakeblock(0, Immutable), List.map (fun id -> Lvar id) (List.rev fields)) - | Tcoerce_structure pos_cc_list -> + | Tcoerce_structure(pos_cc_list, id_pos_list) -> + (* ignore id_pos_list as the ids are already bound *) let v = Array.of_list (List.rev fields) in - Lprim(Pmakeblock(0, Immutable), + (*List.fold_left + (fun lam (id, pos) -> Llet(Alias, id, Lvar v.(pos), lam))*) + (Lprim(Pmakeblock(0, Immutable), List.map (fun (pos, cc) -> match cc with Tcoerce_primitive p -> transl_primitive Location.none p - | _ -> apply_coercion cc (Lvar v.(pos))) - pos_cc_list) + | _ -> apply_coercion Strict cc (Lvar v.(pos))) + pos_cc_list)) + (*id_pos_list*) | _ -> fatal_error "Translmod.transl_structure" end | item :: rem -> match item.str_desc with - | Tstr_eval expr -> + | Tstr_eval (expr, _) -> Lsequence(transl_exp expr, transl_structure fields cc rootpath rem) | Tstr_value(rec_flag, pat_expr_list) -> let ext_fields = rev_let_bound_idents pat_expr_list @ fields in transl_let rec_flag pat_expr_list (transl_structure ext_fields cc rootpath rem) - | Tstr_primitive(id, _, descr) -> + | Tstr_primitive descr -> record_primitive descr.val_val; transl_structure fields cc rootpath rem | Tstr_type(decls) -> transl_structure fields cc rootpath rem - | Tstr_exception( id, _, decl) -> - Llet(Strict, id, transl_exception id (field_path rootpath id) decl, - transl_structure (id :: fields) cc rootpath rem) - | Tstr_exn_rebind( id, _, path, _) -> - Llet(Strict, id, transl_path path, + | Tstr_typext(tyext) -> + let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in + transl_type_extension item.str_env rootpath tyext + (transl_structure (List.rev_append ids fields) cc rootpath rem) + | Tstr_exception ext -> + let id = ext.ext_id in + let path = field_path rootpath id in + Llet(Strict, id, transl_extension_constructor item.str_env path ext, transl_structure (id :: fields) cc rootpath rem) - | Tstr_module( id, _, modl) -> - Llet(Strict, id, - transl_module Tcoerce_none (field_path rootpath id) modl, + | Tstr_module mb -> + let id = mb.mb_id in + Llet(pure_module mb.mb_expr, id, + transl_module Tcoerce_none (field_path rootpath id) mb.mb_expr, transl_structure (id :: fields) cc rootpath rem) | Tstr_recmodule bindings -> let ext_fields = - List.rev_append (List.map (fun (id, _,_,_) -> id) bindings) fields in + List.rev_append (List.map (fun mb -> mb.mb_id) bindings) fields + in compile_recmodule (fun id modl -> transl_module Tcoerce_none (field_path rootpath id) modl) bindings (transl_structure ext_fields cc rootpath rem) - | Tstr_modtype(id, _, decl) -> - transl_structure fields cc rootpath rem - | Tstr_open _ -> - transl_structure fields cc rootpath rem | Tstr_class cl_list -> let ids = List.map (fun (ci,_,_) -> ci.ci_id_class) cl_list in Lletrec(List.map @@ -339,11 +421,10 @@ and transl_structure fields cc rootpath = function let cl = ci.ci_expr in (id, transl_class ids id meths cl vf )) cl_list, - transl_structure (List.rev ids @ fields) cc rootpath rem) - | Tstr_class_type cl_list -> - transl_structure fields cc rootpath rem - | Tstr_include(modl, sg) -> - let ids = bound_value_identifiers sg in + transl_structure (List.rev_append ids fields) cc rootpath rem) + | Tstr_include incl -> + let ids = bound_value_identifiers incl.incl_type in + let modl = incl.incl_mod in let mid = Ident.create "include" in let rec rebind_idents pos newfields = function [] -> @@ -351,9 +432,21 @@ and transl_structure fields cc rootpath = function | id :: ids -> Llet(Alias, id, Lprim(Pfield pos, [Lvar mid]), rebind_idents (pos + 1) (id :: newfields) ids) in - Llet(Strict, mid, transl_module Tcoerce_none None modl, + Llet(pure_module modl, mid, transl_module Tcoerce_none None modl, rebind_idents 0 fields ids) + | Tstr_modtype _ + | Tstr_open _ + | Tstr_class_type _ + | Tstr_attribute _ -> + transl_structure fields cc rootpath rem + +and pure_module m = + match m.mod_desc with + Tmod_ident _ -> Alias + | Tmod_constraint (m,_,_,_) -> pure_module m + | _ -> Strict + (* Update forward declaration in Translcore *) let _ = Translcore.transl_module := transl_module @@ -376,22 +469,26 @@ let rec defined_idents = function [] -> [] | item :: rem -> match item.str_desc with - | Tstr_eval expr -> defined_idents rem + | Tstr_eval (expr, _) -> defined_idents rem | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ defined_idents rem - | Tstr_primitive(id, _, descr) -> defined_idents rem + | Tstr_primitive desc -> defined_idents rem | Tstr_type decls -> defined_idents rem - | Tstr_exception(id, _, decl) -> id :: defined_idents rem - | Tstr_exn_rebind(id, _, path, _) -> id :: defined_idents rem - | Tstr_module(id, _, modl) -> id :: defined_idents rem + | Tstr_typext tyext -> + List.map (fun ext -> ext.ext_id) tyext.tyext_constructors + @ defined_idents rem + | Tstr_exception ext -> ext.ext_id :: defined_idents rem + | Tstr_module mb -> mb.mb_id :: defined_idents rem | Tstr_recmodule decls -> - List.map (fun (id, _, _, _) -> id) decls @ defined_idents rem - | Tstr_modtype(id, _, decl) -> defined_idents rem + List.map (fun mb -> mb.mb_id) decls @ defined_idents rem + | Tstr_modtype _ -> defined_idents rem | Tstr_open _ -> defined_idents rem | Tstr_class cl_list -> List.map (fun (ci, _, _) -> ci.ci_id_class) cl_list @ defined_idents rem | Tstr_class_type cl_list -> defined_idents rem - | Tstr_include(modl, sg) -> bound_value_identifiers sg @ defined_idents rem + | Tstr_include incl -> + bound_value_identifiers incl.incl_type @ defined_idents rem + | Tstr_attribute _ -> defined_idents rem (* second level idents (module M = struct ... let id = ... end), and all sub-levels idents *) @@ -399,44 +496,49 @@ let rec more_idents = function [] -> [] | item :: rem -> match item.str_desc with - | Tstr_eval expr -> more_idents rem + | Tstr_eval (expr, _attrs) -> more_idents rem | Tstr_value(rec_flag, pat_expr_list) -> more_idents rem - | Tstr_primitive(id, _, descr) -> more_idents rem + | Tstr_primitive _ -> more_idents rem | Tstr_type decls -> more_idents rem - | Tstr_exception(id, _, decl) -> more_idents rem - | Tstr_exn_rebind(id, _, path, _) -> more_idents rem + | Tstr_typext tyext -> more_idents rem + | Tstr_exception _ -> more_idents rem | Tstr_recmodule decls -> more_idents rem - | Tstr_modtype(id, _, decl) -> more_idents rem + | Tstr_modtype _ -> more_idents rem | Tstr_open _ -> more_idents rem | Tstr_class cl_list -> more_idents rem | Tstr_class_type cl_list -> more_idents rem - | Tstr_include(modl, _) -> more_idents rem - | Tstr_module(id, _, { mod_desc = Tmod_structure str }) -> - all_idents str.str_items @ more_idents rem - | Tstr_module(id, _, _) -> more_idents rem + | Tstr_include _ -> more_idents rem + | Tstr_module {mb_expr={mod_desc = Tmod_structure str}} -> + all_idents str.str_items @ more_idents rem + | Tstr_module _ -> more_idents rem + | Tstr_attribute _ -> more_idents rem and all_idents = function [] -> [] | item :: rem -> match item.str_desc with - | Tstr_eval expr -> all_idents rem + | Tstr_eval (expr, _attrs) -> all_idents rem | Tstr_value(rec_flag, pat_expr_list) -> let_bound_idents pat_expr_list @ all_idents rem - | Tstr_primitive(id, _, descr) -> all_idents rem + | Tstr_primitive _ -> all_idents rem | Tstr_type decls -> all_idents rem - | Tstr_exception(id, _, decl) -> id :: all_idents rem - | Tstr_exn_rebind(id, _, path, _) -> id :: all_idents rem + | Tstr_typext tyext -> + List.map (fun ext -> ext.ext_id) tyext.tyext_constructors + @ all_idents rem + | Tstr_exception ext -> ext.ext_id :: all_idents rem | Tstr_recmodule decls -> - List.map (fun (id, _, _, _) -> id) decls @ all_idents rem - | Tstr_modtype(id, _, decl) -> all_idents rem + List.map (fun mb -> mb.mb_id) decls @ all_idents rem + | Tstr_modtype _ -> all_idents rem | Tstr_open _ -> all_idents rem | Tstr_class cl_list -> List.map (fun (ci, _, _) -> ci.ci_id_class) cl_list @ all_idents rem | Tstr_class_type cl_list -> all_idents rem - | Tstr_include(modl, sg) -> bound_value_identifiers sg @ all_idents rem - | Tstr_module(id, _, { mod_desc = Tmod_structure str }) -> - id :: all_idents str.str_items @ all_idents rem - | Tstr_module(id, _, _) -> id :: all_idents rem + | Tstr_include incl -> + bound_value_identifiers incl.incl_type @ all_idents rem + | Tstr_module {mb_id;mb_expr={mod_desc = Tmod_structure str}} -> + mb_id :: all_idents str.str_items @ all_idents rem + | Tstr_module mb -> mb.mb_id :: all_idents rem + | Tstr_attribute _ -> all_idents rem (* A variant of transl_structure used to compile toplevel structure definitions @@ -466,7 +568,7 @@ let transl_store_structure glob map prims str = lambda_unit | item :: rem -> match item.str_desc with - | Tstr_eval expr -> + | Tstr_eval (expr, _attrs) -> Lsequence(subst_lambda subst (transl_exp expr), transl_store rootpath subst rem) | Tstr_value(rec_flag, pat_expr_list) -> @@ -474,20 +576,25 @@ let transl_store_structure glob map prims str = let lam = transl_let rec_flag pat_expr_list (store_idents ids) in Lsequence(subst_lambda subst lam, transl_store rootpath (add_idents false ids subst) rem) - | Tstr_primitive(id, _, descr) -> + | Tstr_primitive descr -> record_primitive descr.val_val; transl_store rootpath subst rem | Tstr_type(decls) -> transl_store rootpath subst rem - | Tstr_exception( id, _, decl) -> - let lam = transl_exception id (field_path rootpath id) decl in - Lsequence(Llet(Strict, id, lam, store_ident id), - transl_store rootpath (add_ident false id subst) rem) - | Tstr_exn_rebind( id, _, path, _) -> - let lam = subst_lambda subst (transl_path path) in - Lsequence(Llet(Strict, id, lam, store_ident id), + | Tstr_typext(tyext) -> + let ids = List.map (fun ext -> ext.ext_id) tyext.tyext_constructors in + let lam = + transl_type_extension item.str_env rootpath tyext (store_idents ids) + in + Lsequence(subst_lambda subst lam, + transl_store rootpath (add_idents false ids subst) rem) + | Tstr_exception ext -> + let id = ext.ext_id in + let path = field_path rootpath id in + let lam = transl_extension_constructor item.str_env path ext in + Lsequence(Llet(Strict, id, subst_lambda subst lam, store_ident id), transl_store rootpath (add_ident false id subst) rem) - | Tstr_module(id, _, { mod_desc = Tmod_structure str }) -> + | Tstr_module{mb_id=id; mb_expr={mod_desc = Tmod_structure str}} -> let lam = transl_store (field_path rootpath id) subst str.str_items in (* Careful: see next case *) let subst = !transl_store_subst in @@ -500,9 +607,8 @@ let transl_store_structure glob map prims str = Lsequence(store_ident id, transl_store rootpath (add_ident true id subst) rem))) - | Tstr_module( id, _, modl) -> - let lam = - transl_module Tcoerce_none (field_path rootpath id) modl in + | Tstr_module{mb_id=id; mb_expr=modl} -> + let lam = transl_module Tcoerce_none (field_path rootpath id) modl in (* Careful: the module value stored in the global may be different from the local module value, in case a coercion is applied. If so, keep using the local module value (id) in the remainder of @@ -513,7 +619,7 @@ let transl_store_structure glob map prims str = Lsequence(store_ident id, transl_store rootpath (add_ident true id subst) rem)) | Tstr_recmodule bindings -> - let ids = List.map fst4 bindings in + let ids = List.map (fun mb -> mb.mb_id) bindings in compile_recmodule (fun id modl -> subst_lambda subst @@ -522,10 +628,6 @@ let transl_store_structure glob map prims str = bindings (Lsequence(store_idents ids, transl_store rootpath (add_idents true ids subst) rem)) - | Tstr_modtype(id, _, decl) -> - transl_store rootpath subst rem - | Tstr_open _ -> - transl_store rootpath subst rem | Tstr_class cl_list -> let ids = List.map (fun (ci, _, _) -> ci.ci_id_class) cl_list in let lam = @@ -538,10 +640,9 @@ let transl_store_structure glob map prims str = store_idents ids) in Lsequence(subst_lambda subst lam, transl_store rootpath (add_idents false ids subst) rem) - | Tstr_class_type cl_list -> - transl_store rootpath subst rem - | Tstr_include(modl, sg) -> - let ids = bound_value_identifiers sg in + | Tstr_include incl -> + let ids = bound_value_identifiers incl.incl_type in + let modl = incl.incl_mod in let mid = Ident.create "include" in let rec store_idents pos = function [] -> transl_store rootpath (add_idents true ids subst) rem @@ -551,11 +652,16 @@ let transl_store_structure glob map prims str = Llet(Strict, mid, subst_lambda subst (transl_module Tcoerce_none None modl), store_idents 0 ids) + | Tstr_modtype _ + | Tstr_open _ + | Tstr_class_type _ + | Tstr_attribute _ -> + transl_store rootpath subst rem and store_ident id = try let (pos, cc) = Ident.find_same id map in - let init_val = apply_coercion cc (Lvar id) in + let init_val = apply_coercion Alias cc (Lvar id) in Lprim(Psetfield(pos, false), [Lprim(Pgetglobal glob, []); init_val]) with Not_found -> fatal_error("Translmod.store_ident: " ^ Ident.unique_name id) @@ -608,7 +714,8 @@ let build_ident_map restr idlist more_ids = match restr with Tcoerce_none -> natural_map 0 Ident.empty [] idlist - | Tcoerce_structure pos_cc_list -> + | Tcoerce_structure (pos_cc_list, _id_pos_list) -> + (* ignore _id_pos_list as the ids are already bound *) let idarray = Array.of_list idlist in let rec export_map pos map prims undef = function [] -> @@ -635,7 +742,7 @@ let transl_store_gen module_name ({ str_items = str }, restr) topl = let (map, prims, size) = build_ident_map restr (defined_idents str) (more_idents str) in let f = function - | [ { str_desc = Tstr_eval expr } ] when topl -> + | [ { str_desc = Tstr_eval (expr, _attrs) } ] when topl -> assert (size = 0); subst_lambda !transl_store_subst (transl_exp expr) | str -> transl_store_structure module_id map prims str in @@ -671,13 +778,13 @@ let toplevel_name id = let toploop_getvalue id = Lapply(Lprim(Pfield toploop_getvalue_pos, [Lprim(Pgetglobal toploop_ident, [])]), - [Lconst(Const_base(Const_string (toplevel_name id)))], + [Lconst(Const_base(Const_string (toplevel_name id, None)))], Location.none) let toploop_setvalue id lam = Lapply(Lprim(Pfield toploop_setvalue_pos, [Lprim(Pgetglobal toploop_ident, [])]), - [Lconst(Const_base(Const_string (toplevel_name id))); lam], + [Lconst(Const_base(Const_string (toplevel_name id, None))); lam], Location.none) let toploop_setvalue_id id = toploop_setvalue id (Lvar id) @@ -688,36 +795,33 @@ let close_toplevel_term lam = let transl_toplevel_item item = match item.str_desc with - Tstr_eval expr -> + Tstr_eval (expr, _attrs) -> transl_exp expr | Tstr_value(rec_flag, pat_expr_list) -> let idents = let_bound_idents pat_expr_list in transl_let rec_flag pat_expr_list (make_sequence toploop_setvalue_id idents) - | Tstr_primitive(id, _, descr) -> - lambda_unit - | Tstr_type(decls) -> - lambda_unit - | Tstr_exception(id, _, decl) -> - toploop_setvalue id (transl_exception id None decl) - | Tstr_exn_rebind(id, _, path, _) -> - toploop_setvalue id (transl_path path) - | Tstr_module(id, _, modl) -> + | Tstr_typext(tyext) -> + let idents = + List.map (fun ext -> ext.ext_id) tyext.tyext_constructors + in + transl_type_extension item.str_env None tyext + (make_sequence toploop_setvalue_id idents) + | Tstr_exception ext -> + toploop_setvalue ext.ext_id + (transl_extension_constructor item.str_env None ext) + | Tstr_module {mb_id=id; mb_expr=modl} -> (* we need to use the unique name for the module because of issues with "open" (PR#1672) *) set_toplevel_unique_name id; - toploop_setvalue id - (transl_module Tcoerce_none (Some(Pident id)) modl) + let lam = transl_module Tcoerce_none (Some(Pident id)) modl in + toploop_setvalue id lam | Tstr_recmodule bindings -> - let idents = List.map fst4 bindings in + let idents = List.map (fun mb -> mb.mb_id) bindings in compile_recmodule (fun id modl -> transl_module Tcoerce_none (Some(Pident id)) modl) bindings (make_sequence toploop_setvalue_id idents) - | Tstr_modtype(id, _, decl) -> - lambda_unit - | Tstr_open _ -> - lambda_unit | Tstr_class cl_list -> (* we need to use unique names for the classes because there might be a value named identically *) @@ -732,10 +836,9 @@ let transl_toplevel_item item = make_sequence (fun (ci, _, _) -> toploop_setvalue_id ci.ci_id_class) cl_list) - | Tstr_class_type cl_list -> - lambda_unit - | Tstr_include(modl, sg) -> - let ids = bound_value_identifiers sg in + | Tstr_include incl -> + let ids = bound_value_identifiers incl.incl_type in + let modl = incl.incl_mod in let mid = Ident.create "include" in let rec set_idents pos = function [] -> @@ -744,6 +847,13 @@ let transl_toplevel_item item = Lsequence(toploop_setvalue id (Lprim(Pfield pos, [Lvar mid])), set_idents (pos + 1) ids) in Llet(Strict, mid, transl_module Tcoerce_none None modl, set_idents 0 ids) + | Tstr_modtype _ + | Tstr_open _ + | Tstr_primitive _ + | Tstr_type _ + | Tstr_class_type _ + | Tstr_attribute _ -> + lambda_unit let transl_toplevel_item_and_close itm = close_toplevel_term (transl_label_init (transl_toplevel_item itm)) @@ -759,18 +869,24 @@ let get_component = function | Some id -> Lprim(Pgetglobal id, []) let transl_package component_names target_name coercion = + let components = + Lprim(Pmakeblock(0, Immutable), List.map get_component component_names) in + Lprim(Psetglobal target_name, [apply_coercion Strict coercion components]) + (* let components = match coercion with Tcoerce_none -> List.map get_component component_names - | Tcoerce_structure pos_cc_list -> + | Tcoerce_structure (pos_cc_list, id_pos_list) -> + (* ignore id_pos_list as the ids are already bound *) let g = Array.of_list component_names in List.map - (fun (pos, cc) -> apply_coercion cc (get_component g.(pos))) + (fun (pos, cc) -> apply_coercion Strict cc (get_component g.(pos))) pos_cc_list | _ -> assert false in Lprim(Psetglobal target_name, [Lprim(Pmakeblock(0, Immutable), components)]) + *) let transl_store_package component_names target_name coercion = let rec make_sequence fn pos arg = @@ -786,15 +902,30 @@ let transl_store_package component_names target_name coercion = [Lprim(Pgetglobal target_name, []); get_component id])) 0 component_names) - | Tcoerce_structure pos_cc_list -> + | Tcoerce_structure (pos_cc_list, id_pos_list) -> + let components = + Lprim(Pmakeblock(0, Immutable), List.map get_component component_names) + in + let blk = Ident.create "block" in + (List.length pos_cc_list, + Llet (Strict, blk, apply_coercion Strict coercion components, + make_sequence + (fun pos id -> + Lprim(Psetfield(pos, false), + [Lprim(Pgetglobal target_name, []); + Lprim(Pfield pos, [Lvar blk])])) + 0 pos_cc_list)) + (* + (* ignore id_pos_list as the ids are already bound *) let id = Array.of_list component_names in (List.length pos_cc_list, make_sequence (fun dst (src, cc) -> Lprim(Psetfield(dst, false), [Lprim(Pgetglobal target_name, []); - apply_coercion cc (get_component id.(src))])) + apply_coercion Strict cc (get_component id.(src))])) 0 pos_cc_list) + *) | _ -> assert false (* Error report *) @@ -807,3 +938,18 @@ let report_error ppf = function "@[Cannot safely evaluate the definition@ \ of the recursively-defined module %a@]" Printtyp.ident id + +let () = + Location.register_error_of_exn + (function + | Error (loc, err) -> + Some (Location.error_of_printer loc report_error err) + | _ -> + None + ) + +let reset () = + primitive_declarations := []; + transl_store_subst := Ident.empty; + toploop_ident.Ident.flags <- 0; + aliased_idents := Ident.empty diff --git a/bytecomp/translmod.mli b/bytecomp/translmod.mli index 8e500554..1d84aaab 100644 --- a/bytecomp/translmod.mli +++ b/bytecomp/translmod.mli @@ -37,3 +37,5 @@ type error = exception Error of Location.t * error val report_error: Format.formatter -> error -> unit + +val reset: unit -> unit diff --git a/bytecomp/translobj.ml b/bytecomp/translobj.ml index 97fdeb5d..02731ec6 100644 --- a/bytecomp/translobj.ml +++ b/bytecomp/translobj.ml @@ -20,7 +20,7 @@ open Lambda let oo_prim name = try - transl_path + transl_normal_path (fst (Env.lookup_value (Ldot (Lident "CamlinternalOO", name)) Env.empty)) with Not_found -> fatal_error ("Primitive " ^ name ^ " not found.") @@ -86,19 +86,26 @@ let reset_labels () = (* Insert labels *) -let string s = Lconst (Const_base (Const_string s)) +let string s = Lconst (Const_base (Const_string (s, None))) let int n = Lconst (Const_base (Const_int n)) let prim_makearray = { prim_name = "caml_make_vect"; prim_arity = 2; prim_alloc = true; prim_native_name = ""; prim_native_float = false } +(* Also use it for required globals *) let transl_label_init expr = let expr = Hashtbl.fold (fun c id expr -> Llet(Alias, id, Lconst c, expr)) consts expr in + let expr = + List.fold_right + (fun id expr -> Lsequence(Lprim(Pgetglobal id, []), expr)) + (Env.get_required_globals ()) expr + in + Env.reset_required_globals (); reset_labels (); expr @@ -155,3 +162,14 @@ let oo_wrap env req f x = wrapping := false; top_env := Env.empty; raise exn + +let reset () = + Hashtbl.clear consts; + cache_required := false; + method_cache := lambda_unit; + method_count := 0; + method_table := []; + wrapping := false; + top_env := Env.empty; + classes := []; + method_ids := IdentSet.empty diff --git a/bytecomp/translobj.mli b/bytecomp/translobj.mli index 55c16343..a44ac683 100644 --- a/bytecomp/translobj.mli +++ b/bytecomp/translobj.mli @@ -26,3 +26,5 @@ val method_ids: IdentSet.t ref (* reset when starting a new wrapper *) val oo_wrap: Env.t -> bool -> ('a -> lambda) -> 'a -> lambda val oo_add_class: Ident.t -> Env.t * bool + +val reset: unit -> unit diff --git a/bytecomp/typeopt.ml b/bytecomp/typeopt.ml index e9b7405f..c96e32b6 100644 --- a/bytecomp/typeopt.ml +++ b/bytecomp/typeopt.ml @@ -34,7 +34,7 @@ let maybe_pointer exp = match Env.find_type p exp.exp_env with | {type_kind = Type_variant []} -> true (* type exn *) | {type_kind = Type_variant cstrs} -> - List.exists (fun (name, args,_) -> args <> []) cstrs + List.exists (fun c -> c.Types.cd_args <> []) cstrs | _ -> true with Not_found -> true (* This can happen due to e.g. missing -I options, @@ -64,7 +64,7 @@ let array_element_kind env ty = {type_kind = Type_abstract} -> Pgenarray | {type_kind = Type_variant cstrs} - when List.for_all (fun (name, args,_) -> args = []) cstrs -> + when List.for_all (fun c -> c.Types.cd_args = []) cstrs -> Pintarray | {type_kind = _} -> Paddrarray diff --git a/byterun/.depend b/byterun/.depend index 2f1780db..743737d0 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -7,7 +7,7 @@ array.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ backtrace.o: backtrace.c config.h ../config/m.h ../config/s.h \ compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + startup.h stacks.h sys.h backtrace.h fail.h callback.o: callback.c callback.h compatibility.h mlvalues.h config.h \ ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h @@ -55,7 +55,7 @@ globroots.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ roots.h globroots.h hash.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h int64_native.h + minor_gc.h hash.h instrtrace.o: instrtrace.c intern.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ @@ -66,7 +66,7 @@ interp.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h ints.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h int64_native.h + major_gc.h freelist.h minor_gc.h io.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h signals.h sys.h @@ -123,7 +123,7 @@ startup.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h int64_native.h + ../config/s.h mlvalues.h fail.h sys.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h @@ -147,7 +147,7 @@ array.d.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ backtrace.d.o: backtrace.c config.h ../config/m.h ../config/s.h \ compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + startup.h stacks.h sys.h backtrace.h fail.h callback.d.o: callback.c callback.h compatibility.h mlvalues.h config.h \ ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h @@ -195,7 +195,7 @@ globroots.d.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ roots.h globroots.h hash.d.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h int64_native.h + minor_gc.h hash.h instrtrace.d.o: instrtrace.c instruct.h misc.h compatibility.h config.h \ ../config/m.h ../config/s.h mlvalues.h opnames.h prims.h stacks.h \ memory.h gc.h major_gc.h freelist.h minor_gc.h @@ -208,7 +208,7 @@ interp.d.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ memory.h gc.h minor_gc.h prims.h signals.h stacks.h ints.d.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h int64_native.h + major_gc.h freelist.h minor_gc.h io.d.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h signals.h sys.h @@ -265,7 +265,7 @@ startup.d.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.d.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h int64_native.h + ../config/s.h mlvalues.h fail.h sys.d.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h @@ -289,7 +289,7 @@ array.pic.o: array.c alloc.h compatibility.h misc.h config.h ../config/m.h \ backtrace.pic.o: backtrace.c config.h ../config/m.h ../config/s.h \ compatibility.h mlvalues.h misc.h alloc.h io.h instruct.h intext.h \ exec.h fix_code.h memory.h gc.h major_gc.h freelist.h minor_gc.h \ - startup.h stacks.h sys.h backtrace.h + startup.h stacks.h sys.h backtrace.h fail.h callback.pic.o: callback.c callback.h compatibility.h mlvalues.h config.h \ ../config/m.h ../config/s.h misc.h fail.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h interp.h instruct.h fix_code.h stacks.h @@ -337,7 +337,7 @@ globroots.pic.o: globroots.c memory.h compatibility.h config.h ../config/m.h \ roots.h globroots.h hash.pic.o: hash.c mlvalues.h compatibility.h config.h ../config/m.h \ ../config/s.h misc.h custom.h memory.h gc.h major_gc.h freelist.h \ - minor_gc.h hash.h int64_native.h + minor_gc.h hash.h instrtrace.pic.o: instrtrace.c intern.pic.o: intern.c alloc.h compatibility.h misc.h config.h ../config/m.h \ ../config/s.h mlvalues.h callback.h custom.h fail.h gc.h intext.h io.h \ @@ -348,7 +348,7 @@ interp.pic.o: interp.c alloc.h compatibility.h misc.h config.h ../config/m.h \ memory.h gc.h minor_gc.h prims.h signals.h stacks.h jumptbl.h ints.pic.o: ints.c alloc.h compatibility.h misc.h config.h ../config/m.h \ ../config/s.h mlvalues.h custom.h fail.h intext.h io.h memory.h gc.h \ - major_gc.h freelist.h minor_gc.h int64_native.h + major_gc.h freelist.h minor_gc.h io.pic.o: io.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h custom.h fail.h io.h memory.h gc.h major_gc.h \ freelist.h minor_gc.h signals.h sys.h @@ -405,7 +405,7 @@ startup.pic.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.pic.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ - ../config/s.h mlvalues.h fail.h int64_native.h + ../config/s.h mlvalues.h fail.h sys.pic.o: sys.c config.h ../config/m.h ../config/s.h compatibility.h alloc.h \ misc.h mlvalues.h debugger.h fail.h instruct.h osdeps.h signals.h \ stacks.h memory.h gc.h major_gc.h freelist.h minor_gc.h sys.h diff --git a/byterun/Makefile b/byterun/Makefile index c5fa41bd..816dd75e 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -16,7 +16,7 @@ include Makefile.common CFLAGS=-DCAML_NAME_SPACE -O $(BYTECCCOMPOPTS) $(IFLEXDIR) DFLAGS=-DCAML_NAME_SPACE -g -DDEBUG $(BYTECCCOMPOPTS) $(IFLEXDIR) -OBJS=$(COMMONOBJS) unix.o main.o +OBJS=$(COMMONOBJS) $(UNIX_OR_WIN32).o main.o DOBJS=$(OBJS:.o=.d.o) instrtrace.d.o PICOBJS=$(OBJS:.o=.pic.o) @@ -46,7 +46,7 @@ libcamlrun_shared.so: $(PICOBJS) install:: if test -f libcamlrun_shared.so; then \ - cp libcamlrun_shared.so $(LIBDIR)/libcamlrun_shared.so; fi + cp libcamlrun_shared.so $(INSTALL_LIBDIR)/libcamlrun_shared.so; fi clean:: rm -f libcamlrun_shared.so diff --git a/byterun/Makefile.common b/byterun/Makefile.common index 35e66506..b6bff219 100755 --- a/byterun/Makefile.common +++ b/byterun/Makefile.common @@ -32,7 +32,8 @@ PRIMS=\ PUBLIC_INCLUDES=\ alloc.h callback.h config.h custom.h fail.h hash.h intext.h \ - memory.h misc.h mlvalues.h printexc.h signals.h compatibility.h + memory.h misc.h mlvalues.h printexc.h signals.h compatibility.h \ + version.h all:: ocamlrun$(EXE) ld.conf libcamlrun.$(A) all-$(RUNTIMED) @@ -48,15 +49,22 @@ ld.conf: ../config/Makefile echo "$(STUBLIBDIR)" > ld.conf echo "$(LIBDIR)" >> ld.conf +# Installation + +INSTALL_BINDIR=$(DESTDIR)$(BINDIR) +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR) + + install:: - cp ocamlrun$(EXE) $(BINDIR)/ocamlrun$(EXE) - cp libcamlrun.$(A) $(LIBDIR)/libcamlrun.$(A) - cd $(LIBDIR); $(RANLIB) libcamlrun.$(A) - if test -d $(LIBDIR)/caml; then : ; else mkdir $(LIBDIR)/caml; fi + cp ocamlrun$(EXE) $(INSTALL_BINDIR)/ocamlrun$(EXE) + cp libcamlrun.$(A) $(INSTALL_LIBDIR)/libcamlrun.$(A) + cd $(INSTALL_LIBDIR); $(RANLIB) libcamlrun.$(A) + if test -d $(INSTALL_LIBDIR)/caml; then : ; \ + else mkdir $(INSTALL_LIBDIR)/caml; fi for i in $(PUBLIC_INCLUDES); do \ - sed -f ../tools/cleanup-header $$i > $(LIBDIR)/caml/$$i; \ + sed -f ../tools/cleanup-header $$i > $(INSTALL_LIBDIR)/caml/$$i; \ done - cp ld.conf $(LIBDIR)/ld.conf + cp ld.conf $(INSTALL_LIBDIR)/ld.conf .PHONY: install install:: install-$(RUNTIMED) @@ -65,8 +73,8 @@ install-noruntimed: .PHONY: install-noruntimed install-runtimed: - cp ocamlrund$(EXE) $(BINDIR)/ocamlrund$(EXE) - cp libcamlrund.$(A) $(LIBDIR)/libcamlrund.$(A) + cp ocamlrund$(EXE) $(INSTALL_BINDIR)/ocamlrund$(EXE) + cp libcamlrund.$(A) $(INSTALL_LIBDIR)/libcamlrund.$(A) .PHONY: install-runtimed # If primitives contain duplicated lines (e.g. because the code is defined @@ -110,8 +118,8 @@ jumptbl.h : instruct.h sed -n -e '/^ /s/ \([A-Z]\)/ \&\&lbl_\1/gp' \ -e '/^}/q' instruct.h > jumptbl.h -version.h : ../VERSION - echo "#define OCAML_VERSION \"`sed -e 1q ../VERSION`\"" > version.h +version.h : ../VERSION ../tools/make-version-header.sh + ../tools/make-version-header.sh ../VERSION > version.h clean :: rm -f ocamlrun$(EXE) ocamlrund$(EXE) *.$(O) *.$(A) *.$(SO) diff --git a/byterun/alloc.c b/byterun/alloc.c index a1fd2f03..1fc33b55 100644 --- a/byterun/alloc.c +++ b/byterun/alloc.c @@ -39,11 +39,13 @@ CAMLexport value caml_alloc (mlsize_t wosize, tag_t tag) }else if (wosize <= Max_young_wosize){ Alloc_small (result, wosize, tag); if (tag < No_scan_tag){ - for (i = 0; i < wosize; i++) Field (result, i) = 0; + for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; } }else{ result = caml_alloc_shr (wosize, tag); - if (tag < No_scan_tag) memset (Bp_val (result), 0, Bsize_wsize (wosize)); + if (tag < No_scan_tag){ + for (i = 0; i < wosize; i++) Field (result, i) = Val_unit; + } result = caml_check_urgent_gc (result); } return result; diff --git a/byterun/alloc.h b/byterun/alloc.h index a0cd41b6..f00a7ef0 100644 --- a/byterun/alloc.h +++ b/byterun/alloc.h @@ -37,6 +37,7 @@ CAMLextern value caml_copy_int64 (int64); /* defined in [ints.c] */ CAMLextern value caml_copy_nativeint (intnat); /* defined in [ints.c] */ CAMLextern value caml_alloc_array (value (*funct) (char const *), char const ** array); +CAMLextern value caml_alloc_sprintf(const char * format, ...); typedef void (*final_fun)(value); CAMLextern value caml_alloc_final (mlsize_t, /*size in words*/ diff --git a/byterun/array.c b/byterun/array.c index c9d991ed..ba6fd701 100644 --- a/byterun/array.c +++ b/byterun/array.c @@ -135,6 +135,27 @@ CAMLprim value caml_array_unsafe_set(value array, value index, value newval) return caml_array_unsafe_set_addr(array, index, newval); } +CAMLprim value caml_make_float_vect(value len) +{ + mlsize_t wosize = Long_val(len) * Double_wosize; + value result; + if (wosize == 0) + return Atom(0); + else if (wosize <= Max_young_wosize){ +#define Setup_for_gc +#define Restore_after_gc + Alloc_small (result, wosize, Double_array_tag); +#undef Setup_for_gc +#undef Restore_after_gc + }else if (wosize > Max_wosize) + caml_invalid_argument("Array.make_float"); + else { + result = caml_alloc_shr (wosize, Double_array_tag); + result = caml_check_urgent_gc (result); + } + return result; +} + CAMLprim value caml_make_vect(value len, value init) { CAMLparam2 (len, init); @@ -193,9 +214,13 @@ CAMLprim value caml_make_array(value init) || Tag_val(v) != Double_tag) { CAMLreturn (init); } else { - Assert(size < Max_young_wosize); wsize = size * Double_wosize; - res = caml_alloc_small(wsize, Double_array_tag); + if (wsize <= Max_young_wosize) { + res = caml_alloc_small(wsize, Double_array_tag); + } else { + res = caml_alloc_shr(wsize, Double_array_tag); + res = caml_check_urgent_gc(res); + } for (i = 0; i < size; i++) { Store_double_field(res, i, Double_val(Field(init, i))); } diff --git a/byterun/backtrace.c b/byterun/backtrace.c index 4098e47e..76e3ddf5 100644 --- a/byterun/backtrace.c +++ b/byterun/backtrace.c @@ -35,6 +35,7 @@ #include "stacks.h" #include "sys.h" #include "backtrace.h" +#include "fail.h" CAMLexport int caml_backtrace_active = 0; CAMLexport int caml_backtrace_pos = 0; @@ -93,15 +94,16 @@ CAMLprim value caml_backtrace_status(value vunit) /* Store the return addresses contained in the given stack fragment into the backtrace array */ -void caml_stash_backtrace(value exn, code_t pc, value * sp) +void caml_stash_backtrace(value exn, code_t pc, value * sp, int reraise) { code_t end_code = (code_t) ((char *) caml_start_code + caml_code_size); if (pc != NULL) pc = pc - 1; - if (exn != caml_backtrace_last_exn) { + if (exn != caml_backtrace_last_exn || !reraise) { caml_backtrace_pos = 0; caml_backtrace_last_exn = exn; } if (caml_backtrace_buffer == NULL) { + Assert(caml_backtrace_pos == 0); caml_backtrace_buffer = malloc(BACKTRACE_BUFFER_SIZE * sizeof(code_t)); if (caml_backtrace_buffer == NULL) return; } @@ -119,6 +121,17 @@ void caml_stash_backtrace(value exn, code_t pc, value * sp) } } +/* In order to prevent the GC from walking through the debug + information (which have no headers), we transform code pointers to + 31/63 bits ocaml integers by shifting them by 1 to the right. We do + not lose information as code pointers are aligned. + + In particular, we do not need to use [caml_initialize] when setting + an array element with such a value. +*/ +#define Val_Codet(p) Val_long((uintnat)p>>1) +#define Codet_Val(v) ((code_t)(Long_val(v)<<1)) + /* returns the next frame pointer (or NULL if none is available); updates *sp to point to the following one, and *trapsp to the next trap frame, which we will skip when we reach it */ @@ -165,7 +178,7 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { } } - trace = caml_alloc(trace_size, Abstract_tag); + trace = caml_alloc(trace_size, 0); /* then collect the trace */ { @@ -176,36 +189,52 @@ CAMLprim value caml_get_current_callstack(value max_frames_value) { for (trace_pos = 0; trace_pos < trace_size; trace_pos++) { code_t p = caml_next_frame_pointer(&sp, &trapsp); Assert(p != NULL); - /* The assignment below is safe without [caml_initialize], even - if the trace is large and allocated on the old heap, because - we assign values that are outside the OCaml heap. */ - Assert(!(Is_block((value) p) && Is_in_heap((value) p))); - Field(trace, trace_pos) = (value) p; + Field(trace, trace_pos) = Val_Codet(p); } } CAMLreturn(trace); } -/* Read the debugging info contained in the current bytecode executable. - Return an OCaml array of OCaml lists of debug_event records in "events", - or Val_false on failure. */ +/* Read the debugging info contained in the current bytecode executable. */ #ifndef O_BINARY #define O_BINARY 0 #endif +struct ev_info { + code_t ev_pc; + char * ev_filename; + int ev_lnum; + int ev_startchr; + int ev_endchr; +}; + +static int cmp_ev_info(const void *a, const void *b) { + code_t pc_a = ((const struct ev_info*)a)->ev_pc; + code_t pc_b = ((const struct ev_info*)b)->ev_pc; + if (pc_a > pc_b) return 1; + if (pc_a < pc_b) return -1; + return 0; +} + static char *read_debug_info_error = ""; -static value read_debug_info(void) +static uintnat n_events; +static struct ev_info *events = NULL; +static void read_debug_info(void) { CAMLparam0(); - CAMLlocal1(events); + CAMLlocal1(events_heap); char * exec_name; int fd; struct exec_trailer trail; struct channel * chan; uint32 num_events, orig, i; - value evl, l; + intnat j; + value evl, l, ev_start; + + if(events != NULL) + CAMLreturn0; if (caml_cds_file != NULL) { exec_name = caml_cds_file; @@ -215,54 +244,103 @@ static value read_debug_info(void) fd = caml_attempt_open(&exec_name, &trail, 1); if (fd < 0){ read_debug_info_error = "executable program file not found"; - CAMLreturn(Val_false); + CAMLreturn0; } caml_read_section_descriptors(fd, &trail); if (caml_seek_optional_section(fd, &trail, "DBUG") == -1) { close(fd); read_debug_info_error = "program not linked with -g"; - CAMLreturn(Val_false); + CAMLreturn0; } chan = caml_open_descriptor_in(fd); num_events = caml_getword(chan); - events = caml_alloc(num_events, 0); + n_events = 0; + events_heap = caml_alloc(num_events, 0); for (i = 0; i < num_events; i++) { orig = caml_getword(chan); evl = caml_input_val(chan); + caml_input_val(chan); // Skip the list of absolute directory names /* Relocate events in event list */ for (l = evl; l != Val_int(0); l = Field(l, 1)) { value ev = Field(l, 0); Field(ev, EV_POS) = Val_long(Long_val(Field(ev, EV_POS)) + orig); + n_events++; } /* Record event list */ - Store_field(events, i, evl); + Store_field(events_heap, i, evl); } caml_close_channel(chan); - CAMLreturn(events); + + events = (struct ev_info*)malloc(n_events * sizeof(struct ev_info)); + if(events == NULL) { + read_debug_info_error = "out of memory"; + CAMLreturn0; + } + + j = 0; + for (i = 0; i < num_events; i++) { + for (l = Field(events_heap, i); l != Val_int(0); l = Field(l, 1)) { + uintnat fnsz; + value ev = Field(l, 0); + + events[j].ev_pc = + (code_t)((char*)caml_start_code + Long_val(Field(ev, EV_POS))); + + ev_start = Field (Field (ev, EV_LOC), LOC_START); + + fnsz = caml_string_length(Field (ev_start, POS_FNAME))+1; + events[j].ev_filename = (char*)malloc(fnsz); + if(events[j].ev_filename == NULL) { + for(j--; j >= 0; j--) + free(events[j].ev_filename); + free(events); + events = NULL; + read_debug_info_error = "out of memory"; + CAMLreturn0; + } + memcpy(events[j].ev_filename, String_val (Field (ev_start, POS_FNAME)), + fnsz); + + events[j].ev_lnum = Int_val (Field (ev_start, POS_LNUM)); + events[j].ev_startchr = + Int_val (Field (ev_start, POS_CNUM)) + - Int_val (Field (ev_start, POS_BOL)); + events[j].ev_endchr = + Int_val (Field (Field (Field (ev, EV_LOC), LOC_END), POS_CNUM)) + - Int_val (Field (ev_start, POS_BOL)); + + j++; + } + } + + Assert(j == n_events); + + qsort(events, n_events, sizeof(struct ev_info), cmp_ev_info); + + CAMLreturn0; } -/* Search the event for the given PC. Return Val_false if not found. */ +/* Search the event index for the given PC. Return -1 if not found. */ -static value event_for_location(value events, code_t pc) +static intnat event_for_location(code_t pc) { - mlsize_t i; - value pos, l, ev, ev_pos, best_ev; - - best_ev = 0; + uintnat low = 0, high = n_events; Assert(pc >= caml_start_code && pc < caml_start_code + caml_code_size); - pos = Val_long((char *) pc - (char *) caml_start_code); - for (i = 0; i < Wosize_val(events); i++) { - for (l = Field(events, i); l != Val_int(0); l = Field(l, 1)) { - ev = Field(l, 0); - ev_pos = Field(ev, EV_POS); - if (ev_pos == pos) return ev; - /* ocamlc sometimes moves an event past a following PUSH instruction; - allow mismatch by 1 instruction. */ - if (ev_pos == pos + 8) best_ev = ev; - } + Assert(events != NULL); + while(low+1 < high) { + uintnat m = (low+high)/2; + if(pc < events[m].ev_pc) high = m; + else low = m; } - if (best_ev != 0) return best_ev; - return Val_false; + if(events[low].ev_pc == pc) + return low; + /* ocamlc sometimes moves an event past a following PUSH instruction; + allow mismatch by 1 instruction. */ + if(events[low].ev_pc == pc + 1) + return low; + if(low+1 < n_events && events[low+1].ev_pc == pc + 1) + return low+1; + return -1; } /* Extract location information for the given PC */ @@ -276,27 +354,21 @@ struct loc_info { int loc_endchr; }; -static void extract_location_info(value events, code_t pc, +static void extract_location_info(code_t pc, /*out*/ struct loc_info * li) { - value ev, ev_start; - - ev = event_for_location(events, pc); - li->loc_is_raise = caml_is_instruction(*pc, RAISE); - if (ev == Val_false) { + intnat ev = event_for_location(pc); + li->loc_is_raise = caml_is_instruction(*pc, RAISE) || + caml_is_instruction(*pc, RERAISE); + if (ev == -1) { li->loc_valid = 0; return; } li->loc_valid = 1; - ev_start = Field (Field (ev, EV_LOC), LOC_START); - li->loc_filename = String_val (Field (ev_start, POS_FNAME)); - li->loc_lnum = Int_val (Field (ev_start, POS_LNUM)); - li->loc_startchr = - Int_val (Field (ev_start, POS_CNUM)) - - Int_val (Field (ev_start, POS_BOL)); - li->loc_endchr = - Int_val (Field (Field (Field (ev, EV_LOC), LOC_END), POS_CNUM)) - - Int_val (Field (ev_start, POS_BOL)); + li->loc_filename = events[ev].ev_filename; + li->loc_lnum = events[ev].ev_lnum; + li->loc_startchr = events[ev].ev_startchr; + li->loc_endchr = events[ev].ev_endchr; } /* Print location information -- same behavior as in Printexc */ @@ -333,55 +405,47 @@ static void print_location(struct loc_info * li, int index) CAMLexport void caml_print_exception_backtrace(void) { - value events; int i; struct loc_info li; - events = read_debug_info(); - if (events == Val_false) { + read_debug_info(); + if (events == NULL) { fprintf(stderr, "(Cannot print stack backtrace: %s)\n", read_debug_info_error); return; } for (i = 0; i < caml_backtrace_pos; i++) { - extract_location_info(events, caml_backtrace_buffer[i], &li); + extract_location_info(caml_backtrace_buffer[i], &li); print_location(&li, i); } } /* Convert the backtrace to a data structure usable from OCaml */ -CAMLprim value caml_convert_raw_backtrace(value backtrace) -{ - CAMLparam1(backtrace); - CAMLlocal5(events, res, arr, p, fname); - int i; +CAMLprim value caml_convert_raw_backtrace_slot(value backtrace_slot) { + CAMLparam1(backtrace_slot); + CAMLlocal2(p, fname); struct loc_info li; - events = read_debug_info(); - if (events == Val_false) { - res = Val_int(0); /* None */ + read_debug_info(); + if (events == NULL) + caml_failwith(read_debug_info_error); + + extract_location_info(Codet_Val(backtrace_slot), &li); + + if (li.loc_valid) { + fname = caml_copy_string(li.loc_filename); + p = caml_alloc_small(5, 0); + Field(p, 0) = Val_bool(li.loc_is_raise); + Field(p, 1) = fname; + Field(p, 2) = Val_int(li.loc_lnum); + Field(p, 3) = Val_int(li.loc_startchr); + Field(p, 4) = Val_int(li.loc_endchr); } else { - arr = caml_alloc(Wosize_val(backtrace), 0); - for (i = 0; i < Wosize_val(backtrace); i++) { - extract_location_info(events, (code_t)Field(backtrace, i), &li); - if (li.loc_valid) { - fname = caml_copy_string(li.loc_filename); - p = caml_alloc_small(5, 0); - Field(p, 0) = Val_bool(li.loc_is_raise); - Field(p, 1) = fname; - Field(p, 2) = Val_int(li.loc_lnum); - Field(p, 3) = Val_int(li.loc_startchr); - Field(p, 4) = Val_int(li.loc_endchr); - } else { - p = caml_alloc_small(1, 1); - Field(p, 0) = Val_bool(li.loc_is_raise); - } - caml_modify(&Field(arr, i), p); - } - res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ + p = caml_alloc_small(1, 1); + Field(p, 0) = Val_bool(li.loc_is_raise); } - CAMLreturn(res); + CAMLreturn(p); } /* Get a copy of the latest backtrace */ @@ -390,20 +454,49 @@ CAMLprim value caml_get_exception_raw_backtrace(value unit) { CAMLparam0(); CAMLlocal1(res); - res = caml_alloc(caml_backtrace_pos, Abstract_tag); - if(caml_backtrace_buffer != NULL) - memcpy(&Field(res, 0), caml_backtrace_buffer, - caml_backtrace_pos * sizeof(code_t)); + + res = caml_alloc(caml_backtrace_pos, 0); + if(caml_backtrace_buffer != NULL) { + intnat i; + for(i = 0; i < caml_backtrace_pos; i++) + Field(res, i) = Val_Codet(caml_backtrace_buffer[i]); + } CAMLreturn(res); } -/* the function below is deprecated: see asmrun/backtrace.c */ +/* the function below is deprecated: we previously returned directly + the OCaml-usable representation, instead of the raw backtrace as an + abstract type, but this has a large performance overhead if you + store a lot of backtraces and print only some of them. + + It is not used by the Printexc library anymore, or anywhere else in + the compiler, but we have kept it in case some user still depends + on it as an external. +*/ CAMLprim value caml_get_exception_backtrace(value unit) { CAMLparam0(); - CAMLlocal2(raw, res); - raw = caml_get_exception_raw_backtrace(unit); - res = caml_convert_raw_backtrace(raw); + CAMLlocal4(arr, raw_slot, slot, res); + + read_debug_info(); + if (events == NULL) { + res = Val_int(0); /* None */ + } else { + arr = caml_alloc(caml_backtrace_pos, 0); + if(caml_backtrace_buffer == NULL) { + Assert(caml_backtrace_pos == 0); + } else { + intnat i; + for(i = 0; i < caml_backtrace_pos; i++) { + raw_slot = Val_Codet(caml_backtrace_buffer[i]); + /* caml_convert_raw_backtrace_slot will not fail with + caml_failwith as we checked (events != NULL) already */ + slot = caml_convert_raw_backtrace_slot(raw_slot); + caml_modify(&Field(arr, i), slot); + } + } + res = caml_alloc_small(1, 0); Field(res, 0) = arr; /* Some */ + } CAMLreturn(res); } diff --git a/byterun/backtrace.h b/byterun/backtrace.h index 158ca285..ec499919 100644 --- a/byterun/backtrace.h +++ b/byterun/backtrace.h @@ -24,7 +24,7 @@ CAMLextern char * caml_cds_file; CAMLprim value caml_record_backtrace(value vflag); #ifndef NATIVE_CODE -extern void caml_stash_backtrace(value exn, code_t pc, value * sp); +extern void caml_stash_backtrace(value exn, code_t pc, value * sp, int reraise); #endif CAMLextern void caml_print_exception_backtrace(void); diff --git a/byterun/callback.c b/byterun/callback.c index 3bd7ea45..5da37ec9 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -216,6 +216,7 @@ CAMLprim value caml_register_named_value(value vname, value val) { struct named_value * nv; char * name = String_val(vname); + size_t namelen = strlen(name); unsigned int h = hash_value_name(name); for (nv = named_value_table[h]; nv != NULL; nv = nv->next) { @@ -225,8 +226,8 @@ CAMLprim value caml_register_named_value(value vname, value val) } } nv = (struct named_value *) - caml_stat_alloc(sizeof(struct named_value) + strlen(name)); - strcpy(nv->name, name); + caml_stat_alloc(sizeof(struct named_value) + namelen); + memcpy(nv->name, name, namelen + 1); nv->val = val; nv->next = named_value_table[h]; named_value_table[h] = nv; diff --git a/byterun/compact.c b/byterun/compact.c index bf803017..0afbd9dc 100644 --- a/byterun/compact.c +++ b/byterun/compact.c @@ -40,7 +40,7 @@ extern void caml_shrink_heap (char *); /* memory.c */ XXX Should be fixed: XXX The above assumes that all roots are aligned on a 4-byte boundary, XXX which is not always guaranteed by C. - XXX (see [caml_register_global_roots] and [caml_init_exceptions]) + XXX (see [caml_register_global_roots]) XXX Should be able to fix it to only assume 2-byte alignment. */ #define Make_ehd(s,t,c) (((s) << 10) | (t) << 2 | (c)) diff --git a/byterun/compatibility.h b/byterun/compatibility.h index 58bf2834..11181176 100644 --- a/byterun/compatibility.h +++ b/byterun/compatibility.h @@ -112,7 +112,6 @@ #define raise_zero_divide caml_raise_zero_divide #define raise_not_found caml_raise_not_found #define raise_sys_blocked_io caml_raise_sys_blocked_io -#define init_exceptions caml_init_exceptions /* **** asmrun/fail.c */ /* **** asmrun/.s */ diff --git a/byterun/config.h b/byterun/config.h index 24f4e593..f7759885 100644 --- a/byterun/config.h +++ b/byterun/config.h @@ -25,30 +25,9 @@ #include "compatibility.h" #endif -/* Types for signed chars, 32-bit integers, 64-bit integers, +/* Types for 32-bit integers, 64-bit integers, native integers (as wide as a pointer type) */ -typedef signed char schar; - -#if SIZEOF_PTR == SIZEOF_LONG -/* Standard models: ILP32 or I32LP64 */ -typedef long intnat; -typedef unsigned long uintnat; -#define ARCH_INTNAT_PRINTF_FORMAT "l" -#elif SIZEOF_PTR == SIZEOF_INT -/* Hypothetical IP32L64 model */ -typedef int intnat; -typedef unsigned int uintnat; -#define ARCH_INTNAT_PRINTF_FORMAT "" -#elif SIZEOF_PTR == 8 && defined(ARCH_INT64_TYPE) -/* Win64 model: IL32LLP64 */ -typedef ARCH_INT64_TYPE intnat; -typedef ARCH_UINT64_TYPE uintnat; -#define ARCH_INTNAT_PRINTF_FORMAT ARCH_INT64_PRINTF_FORMAT -#else -#error "No integer type available to represent pointers" -#endif - #if SIZEOF_INT == 4 typedef int int32; typedef unsigned int uint32; @@ -65,15 +44,40 @@ typedef unsigned short uint32; #error "No 32-bit integer type available" #endif -#if defined(ARCH_INT64_TYPE) +#ifndef ARCH_INT64_TYPE +#if SIZEOF_LONGLONG == 8 +#define ARCH_INT64_TYPE long long +#define ARCH_UINT64_TYPE unsigned long long +#define ARCH_INT64_PRINTF_FORMAT "ll" +#elif SIZEOF_LONG == 8 +#define ARCH_INT64_TYPE long +#define ARCH_UINT64_TYPE unsigned long +#define ARCH_INT64_PRINTF_FORMAT "l" +#else +#error "No 64-bit integer type available" +#endif +#endif + typedef ARCH_INT64_TYPE int64; typedef ARCH_UINT64_TYPE uint64; + +#if SIZEOF_PTR == SIZEOF_LONG +/* Standard models: ILP32 or I32LP64 */ +typedef long intnat; +typedef unsigned long uintnat; +#define ARCH_INTNAT_PRINTF_FORMAT "l" +#elif SIZEOF_PTR == SIZEOF_INT +/* Hypothetical IP32L64 model */ +typedef int intnat; +typedef unsigned int uintnat; +#define ARCH_INTNAT_PRINTF_FORMAT "" +#elif SIZEOF_PTR == 8 +/* Win64 model: IL32LLP64 */ +typedef int64 intnat; +typedef uint64 uintnat; +#define ARCH_INTNAT_PRINTF_FORMAT ARCH_INT64_PRINTF_FORMAT #else -# ifdef ARCH_BIG_ENDIAN -typedef struct { uint32 h, l; } uint64, int64; -# else -typedef struct { uint32 l, h; } uint64, int64; -# endif +#error "No integer type available to represent pointers" #endif /* Endianness of floats */ @@ -139,16 +143,17 @@ typedef struct { uint32 l, h; } uint64, int64; /* Minimum size increment when growing the heap (words). Must be a multiple of [Page_size / sizeof (value)]. */ -#define Heap_chunk_min (2 * Page_size / sizeof (value)) +#define Heap_chunk_min (15 * Page_size) -/* Default size increment when growing the heap. (words) - Must be a multiple of [Page_size / sizeof (value)]. - (Approx 512 Kb for a 32-bit platform, 1 Mb for a 64-bit platform.) */ -#define Heap_chunk_def (31 * Page_size) +/* Default size increment when growing the heap. + If this is <= 1000, it's a percentage of the current heap size. + If it is > 1000, it's a number of words. */ +#define Heap_chunk_def 15 /* Default initial size of the major heap (words); - same constraints as for Heap_chunk_def. */ + Must be a multiple of [Page_size / sizeof (value)]. */ #define Init_heap_def (31 * Page_size) +/* (about 512 kB for a 32-bit platform, 1 MB for a 64-bit platform.) */ /* Default speed setting for the major GC. The heap will grow until diff --git a/byterun/debugger.c b/byterun/debugger.c index d64583f2..6024ed92 100644 --- a/byterun/debugger.c +++ b/byterun/debugger.c @@ -250,7 +250,6 @@ static void safe_output_value(struct channel *chan, value val) void caml_debugger(enum event_kind event) { - int frame_number; value * frame; intnat i, pos; value val; @@ -258,7 +257,6 @@ void caml_debugger(enum event_kind event) if (dbg_socket == -1) return; /* Not connected to a debugger. */ /* Reset current frame */ - frame_number = 0; frame = caml_extern_sp + 1; /* Report the event to the debugger */ diff --git a/byterun/dynlink.c b/byterun/dynlink.c index f07cf91e..8b4498b9 100644 --- a/byterun/dynlink.c +++ b/byterun/dynlink.c @@ -79,9 +79,7 @@ static char * parse_ld_conf(void) stdlib = getenv("OCAMLLIB"); if (stdlib == NULL) stdlib = getenv("CAMLLIB"); if (stdlib == NULL) stdlib = OCAML_STDLIB_DIR; - ldconfname = caml_stat_alloc(strlen(stdlib) + 2 + sizeof(LD_CONF_NAME)); - strcpy(ldconfname, stdlib); - strcat(ldconfname, "/" LD_CONF_NAME); + ldconfname = caml_strconcat(3, stdlib, "/", LD_CONF_NAME); if (stat(ldconfname, &st) == -1) { caml_stat_free(ldconfname); return NULL; diff --git a/byterun/exec.h b/byterun/exec.h index 8b50484d..a58bcf8b 100644 --- a/byterun/exec.h +++ b/byterun/exec.h @@ -54,7 +54,7 @@ struct exec_trailer { /* Magic number for this release */ -#define EXEC_MAGIC "Caml1999X008" +#define EXEC_MAGIC "Caml1999X011" #endif /* CAML_EXEC_H */ diff --git a/byterun/fail.c b/byterun/fail.c index d721d5c9..148e47a9 100644 --- a/byterun/fail.c +++ b/byterun/fail.c @@ -39,13 +39,7 @@ CAMLexport void caml_raise(value v) CAMLexport void caml_raise_constant(value tag) { - CAMLparam1 (tag); - CAMLlocal1 (bucket); - - bucket = caml_alloc_small (1, 0); - Field(bucket, 0) = tag; - caml_raise(bucket); - CAMLnoreturn; + caml_raise(tag); } CAMLexport void caml_raise_with_arg(value tag, value arg) @@ -77,11 +71,9 @@ CAMLexport void caml_raise_with_args(value tag, int nargs, value args[]) CAMLexport void caml_raise_with_string(value tag, char const *msg) { - CAMLparam1 (tag); - CAMLlocal1 (vmsg); - - vmsg = caml_copy_string(msg); - caml_raise_with_arg(tag, vmsg); + CAMLparam1(tag); + value v_msg = caml_copy_string(msg); + caml_raise_with_arg(tag, v_msg); CAMLnoreturn; } @@ -111,21 +103,9 @@ CAMLexport void caml_array_bound_error(void) caml_invalid_argument("index out of bounds"); } -/* Problem: we can't use [caml_raise_constant], because it allocates and - we're out of memory... Here, we allocate statically the exn bucket - for [Out_of_memory]. */ - -static struct { - header_t hdr; - value exn; -} out_of_memory_bucket = { 0, 0 }; - CAMLexport void caml_raise_out_of_memory(void) { - if (out_of_memory_bucket.exn == 0) - caml_fatal_error - ("Fatal error: out of memory while raising Out_of_memory\n"); - caml_raise((value) &(out_of_memory_bucket.exn)); + caml_raise_constant(Field(caml_global_data, OUT_OF_MEMORY_EXN)); } CAMLexport void caml_raise_stack_overflow(void) @@ -158,15 +138,6 @@ CAMLexport void caml_raise_sys_blocked_io(void) caml_raise_constant(Field(caml_global_data, SYS_BLOCKED_IO)); } -/* Initialization of statically-allocated exception buckets */ - -void caml_init_exceptions(void) -{ - out_of_memory_bucket.hdr = Make_header(1, 0, Caml_white); - out_of_memory_bucket.exn = Field(caml_global_data, OUT_OF_MEMORY_EXN); - caml_register_global_root(&out_of_memory_bucket.exn); -} - int caml_is_special_exception(value exn) { return exn == Field(caml_global_data, MATCH_FAILURE_EXN) || exn == Field(caml_global_data, ASSERT_FAILURE_EXN) diff --git a/byterun/fail.h b/byterun/fail.h index 68322741..da72c780 100644 --- a/byterun/fail.h +++ b/byterun/fail.h @@ -74,7 +74,6 @@ CAMLextern void caml_raise_sys_error (value) Noreturn; CAMLextern void caml_raise_end_of_file (void) Noreturn; CAMLextern void caml_raise_zero_divide (void) Noreturn; CAMLextern void caml_raise_not_found (void) Noreturn; -CAMLextern void caml_init_exceptions (void); CAMLextern void caml_array_bound_error (void) Noreturn; CAMLextern void caml_raise_sys_blocked_io (void) Noreturn; diff --git a/byterun/fix_code.c b/byterun/fix_code.c index 746f8b75..3380dc91 100644 --- a/byterun/fix_code.c +++ b/byterun/fix_code.c @@ -98,10 +98,10 @@ char * caml_instr_base; void caml_thread_code (code_t code, asize_t len) { code_t p; - int l [STOP + 1]; + int l [FIRST_UNIMPLEMENTED_OP]; int i; - for (i = 0; i <= STOP; i++) { + for (i = 0; i < FIRST_UNIMPLEMENTED_OP; i++) { l [i] = 0; } /* Instructions with one operand */ @@ -125,7 +125,7 @@ void caml_thread_code (code_t code, asize_t len) len /= sizeof(opcode_t); for (p = code; p < code + len; /*nothing*/) { opcode_t instr = *p; - if (instr < 0 || instr > STOP){ + if (instr < 0 || instr >= FIRST_UNIMPLEMENTED_OP){ /* FIXME -- should Assert(false) ? caml_fatal_error_arg ("Fatal error in fix_code: bad opcode (%lx)\n", (char *)(long)instr); diff --git a/byterun/floats.c b/byterun/floats.c index 9071106f..7ff6d89d 100644 --- a/byterun/floats.c +++ b/byterun/floats.c @@ -71,68 +71,29 @@ CAMLexport value caml_copy_double(double d) CAMLprim value caml_format_float(value fmt, value arg) { -#define MAX_DIGITS 350 -/* Max number of decimal digits in a "natural" (not artificially padded) - representation of a float. Can be quite big for %f format. - Max exponent for IEEE format is 308 decimal digits. - Rounded up for good measure. */ - char format_buffer[MAX_DIGITS + 20]; - int prec, i; - char * p; - char * dest; value res; double d = Double_val(arg); #ifdef HAS_BROKEN_PRINTF if (isfinite(d)) { #endif - prec = MAX_DIGITS; - for (p = String_val(fmt); *p != 0; p++) { - if (*p >= '0' && *p <= '9') { - i = atoi(p) + MAX_DIGITS; - if (i > prec) prec = i; - break; - } - } - for( ; *p != 0; p++) { - if (*p == '.') { - i = atoi(p+1) + MAX_DIGITS; - if (i > prec) prec = i; - break; - } - } - if (prec < sizeof(format_buffer)) { - dest = format_buffer; - } else { - dest = caml_stat_alloc(prec); - } - sprintf(dest, String_val(fmt), d); - res = caml_copy_string(dest); - if (dest != format_buffer) { - caml_stat_free(dest); - } + res = caml_alloc_sprintf(String_val(fmt), d); #ifdef HAS_BROKEN_PRINTF } else { - if (isnan(d)) - { + if (isnan(d)) { res = caml_copy_string("nan"); - } - else - { + } else { if (d > 0) - { res = caml_copy_string("inf"); - } else - { res = caml_copy_string("-inf"); - } } } #endif return res; } +#if 0 /*CAMLprim*/ value caml_float_of_substring(value vs, value idx, value l) { char parse_buffer[64]; @@ -163,6 +124,7 @@ CAMLprim value caml_format_float(value fmt, value arg) if (buf != parse_buffer) caml_stat_free(buf); caml_failwith("float_of_string"); } +#endif CAMLprim value caml_float_of_string(value vs) { diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index 84327fa2..7e61f0c1 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -43,10 +43,10 @@ intnat caml_stat_minor_collections = 0, caml_stat_compactions = 0, caml_stat_heap_chunks = 0; -extern uintnat caml_major_heap_increment; /* bytes; see major_gc.c */ -extern uintnat caml_percent_free; /* see major_gc.c */ -extern uintnat caml_percent_max; /* see compact.c */ -extern uintnat caml_allocation_policy; /* see freelist.c */ +extern uintnat caml_major_heap_increment; /* percent or words; see major_gc.c */ +extern uintnat caml_percent_free; /* see major_gc.c */ +extern uintnat caml_percent_max; /* see compact.c */ +extern uintnat caml_allocation_policy; /* see freelist.c */ #define Next(hp) ((hp) + Bhsize_hp (hp)) @@ -346,14 +346,6 @@ static uintnat norm_pmax (uintnat p) return p; } -static intnat norm_heapincr (uintnat i) -{ -#define Psv (Wsize_bsize (Page_size)) - i = ((i + Psv - 1) / Psv) * Psv; - if (i < Heap_chunk_min) i = Heap_chunk_min; - return i; -} - static intnat norm_minsize (intnat s) { if (s < Minor_heap_min) s = Minor_heap_min; @@ -386,11 +378,16 @@ CAMLprim value caml_gc_set(value v) caml_gc_message (0x20, "New max overhead: %d%%\n", caml_percent_max); } - newheapincr = Bsize_wsize (norm_heapincr (Long_val (Field (v, 1)))); + newheapincr = Long_val (Field (v, 1)); if (newheapincr != caml_major_heap_increment){ caml_major_heap_increment = newheapincr; - caml_gc_message (0x20, "New heap increment size: %luk bytes\n", - caml_major_heap_increment/1024); + if (newheapincr > 1000){ + caml_gc_message (0x20, "New heap increment size: %luk words\n", + caml_major_heap_increment/1024); + }else{ + caml_gc_message (0x20, "New heap increment size: %lu%%\n", + caml_major_heap_increment); + } } oldpolicy = caml_allocation_policy; caml_set_allocation_policy (Long_val (Field (v, 6))); @@ -475,17 +472,26 @@ CAMLprim value caml_gc_compaction(value v) return Val_unit; } +uintnat caml_normalize_heap_increment (uintnat i) +{ + if (i < Bsize_wsize (Heap_chunk_min)){ + i = Bsize_wsize (Heap_chunk_min); + } + return ((i + Page_size - 1) >> Page_log) << Page_log; +} + void caml_init_gc (uintnat minor_size, uintnat major_size, uintnat major_incr, uintnat percent_fr, uintnat percent_m) { - uintnat major_heap_size = Bsize_wsize (norm_heapincr (major_size)); + uintnat major_heap_size = + Bsize_wsize (caml_normalize_heap_increment (major_size)); if (caml_page_table_initialize(Bsize_wsize(minor_size) + major_heap_size)){ caml_fatal_error ("OCaml runtime error: cannot initialize page table\n"); } caml_set_minor_heap_size (Bsize_wsize (norm_minsize (minor_size))); - caml_major_heap_increment = Bsize_wsize (norm_heapincr (major_incr)); + caml_major_heap_increment = major_incr; caml_percent_free = norm_pfree (percent_fr); caml_percent_max = norm_pmax (percent_m); caml_init_major_heap (major_heap_size); @@ -495,8 +501,13 @@ void caml_init_gc (uintnat minor_size, uintnat major_size, major_heap_size / 1024); caml_gc_message (0x20, "Initial space overhead: %lu%%\n", caml_percent_free); caml_gc_message (0x20, "Initial max overhead: %lu%%\n", caml_percent_max); - caml_gc_message (0x20, "Initial heap increment: %luk bytes\n", - caml_major_heap_increment / 1024); + if (caml_major_heap_increment > 1000){ + caml_gc_message (0x20, "Initial heap increment: %luk words\n", + caml_major_heap_increment / 1024); + }else{ + caml_gc_message (0x20, "Initial heap increment: %lu%%\n", + caml_major_heap_increment); + } caml_gc_message (0x20, "Initial allocation policy: %d\n", caml_allocation_policy); } diff --git a/byterun/gc_ctrl.h b/byterun/gc_ctrl.h index 5f9d8735..de6933e8 100644 --- a/byterun/gc_ctrl.h +++ b/byterun/gc_ctrl.h @@ -29,6 +29,8 @@ extern intnat caml_stat_compactions, caml_stat_heap_chunks; +uintnat caml_normalize_heap_increment (uintnat); + void caml_init_gc (uintnat, uintnat, uintnat, uintnat, uintnat); diff --git a/byterun/hash.c b/byterun/hash.c index 61bee20c..f8964265 100644 --- a/byterun/hash.c +++ b/byterun/hash.c @@ -21,12 +21,6 @@ #include "memory.h" #include "hash.h" -#ifdef ARCH_INT64_TYPE -#include "int64_native.h" -#else -#include "int64_emul.h" -#endif - /* The new implementation, based on MurmurHash 3, http://code.google.com/p/smhasher/ */ @@ -77,9 +71,7 @@ CAMLexport uint32 caml_hash_mix_intnat(uint32 h, intnat d) CAMLexport uint32 caml_hash_mix_int64(uint32 h, int64 d) { - uint32 hi, lo; - - I64_split(d, hi, lo); + uint32 hi = (uint32) (d >> 32), lo = (uint32) d; MIX(h, lo); MIX(h, hi); return h; @@ -180,6 +172,8 @@ CAMLexport uint32 caml_hash_mix_string(uint32 h, value s) /* Maximal size of the queue used for breadth-first traversal. */ #define HASH_QUEUE_SIZE 256 +/* Maximal number of Forward_tag links followed in one step */ +#define MAX_FORWARD_DEREFERENCE 1000 /* The generic hash function */ @@ -221,7 +215,7 @@ CAMLprim value caml_hash(value count, value limit, value seed, value obj) for (i = 0, len = Wosize_val(v) / Double_wosize; i < len; i++) { h = caml_hash_mix_double(h, Double_field(v, i)); num--; - if (num < 0) break; + if (num <= 0) break; } break; case Abstract_tag: @@ -234,8 +228,15 @@ CAMLprim value caml_hash(value count, value limit, value seed, value obj) v = v - Infix_offset_val(v); goto again; case Forward_tag: - v = Forward_val(v); - goto again; + /* PR#6361: we can have a loop here, so limit the number of + Forward_tag links being followed */ + for (i = MAX_FORWARD_DEREFERENCE; i > 0; i--) { + v = Forward_val(v); + if (Is_long(v) || !Is_in_value_area(v) || Tag_val(v) != Forward_tag) + goto again; + } + /* Give up on this object and move to the next */ + break; case Object_tag: h = caml_hash_mix_intnat(h, Oid_val(v)); num--; diff --git a/byterun/instrtrace.c b/byterun/instrtrace.c index 2934984d..0a19fd2f 100644 --- a/byterun/instrtrace.c +++ b/byterun/instrtrace.c @@ -84,7 +84,7 @@ char * caml_instr_string (code_t pc) char *nam; nam = (instr < 0 || instr > STOP) - ? (sprintf (nambuf, "???%d", instr), nambuf) + ? (snprintf (nambuf, sizeof(nambuf), "???%d", instr), nambuf) : names_of_instructions[instr]; pc++; switch (instr) { @@ -125,7 +125,7 @@ char * caml_instr_string (code_t pc) case OFFSETREF: case OFFSETCLOSURE: case PUSHOFFSETCLOSURE: - sprintf(buf, "%s %d", nam, pc[0]); + snprintf(buf, sizeof(buf), "%s %d", nam, pc[0]); break; /* Instructions with two operands */ case APPTERM: @@ -142,16 +142,16 @@ char * caml_instr_string (code_t pc) case BGEINT: case BULTINT: case BUGEINT: - sprintf(buf, "%s %d, %d", nam, pc[0], pc[1]); + snprintf(buf, sizeof(buf), "%s %d, %d", nam, pc[0], pc[1]); break; case SWITCH: - sprintf(buf, "SWITCH sz%#lx=%ld::ntag%ld nint%ld", + snprintf(buf, sizeof(buf), "SWITCH sz%#lx=%ld::ntag%ld nint%ld", (long) pc[0], (long) pc[0], (unsigned long) pc[0] >> 16, (unsigned long) pc[0] & 0xffff); break; /* Instructions with a C primitive as operand */ case C_CALLN: - sprintf(buf, "%s %d,", nam, pc[0]); + snprintf(buf, sizeof(buf), "%s %d,", nam, pc[0]); pc++; /* fallthrough */ case C_CALL1: @@ -160,12 +160,13 @@ char * caml_instr_string (code_t pc) case C_CALL4: case C_CALL5: if (pc[0] < 0 || pc[0] >= caml_prim_name_table.size) - sprintf(buf, "%s unknown primitive %d", nam, pc[0]); + snprintf(buf, sizeof(buf), "%s unknown primitive %d", nam, pc[0]); else - sprintf(buf, "%s %s", nam, (char *) caml_prim_name_table.contents[pc[0]]); + snprintf(buf, sizeof(buf), "%s %s", + nam, (char *) caml_prim_name_table.contents[pc[0]]); break; default: - sprintf(buf, "%s", nam); + snprintf(buf, sizeof(buf), "%s", nam); break; }; return buf; diff --git a/byterun/instruct.h b/byterun/instruct.h index 56860500..f9cc80ee 100644 --- a/byterun/instruct.h +++ b/byterun/instruct.h @@ -39,7 +39,8 @@ enum instructions { VECTLENGTH, GETVECTITEM, SETVECTITEM, GETSTRINGCHAR, SETSTRINGCHAR, BRANCH, BRANCHIF, BRANCHIFNOT, SWITCH, BOOLNOT, - PUSHTRAP, POPTRAP, RAISE, CHECK_SIGNALS, + PUSHTRAP, POPTRAP, RAISE, + CHECK_SIGNALS, C_CALL1, C_CALL2, C_CALL3, C_CALL4, C_CALL5, C_CALLN, CONST0, CONST1, CONST2, CONST3, CONSTINT, PUSHCONST0, PUSHCONST1, PUSHCONST2, PUSHCONST3, PUSHCONSTINT, @@ -53,7 +54,9 @@ enum instructions { BULTINT, BUGEINT, GETPUBMET, GETDYNMET, STOP, - EVENT, BREAK -}; + EVENT, BREAK, + RERAISE, RAISE_NOTRACE, +FIRST_UNIMPLEMENTED_OP}; + #endif /* CAML_INSTRUCT_H */ diff --git a/byterun/intern.c b/byterun/intern.c index bfe18b1a..e0fcc5db 100644 --- a/byterun/intern.c +++ b/byterun/intern.c @@ -64,10 +64,6 @@ static value intern_block; /* Point to the heap block allocated as destination block. Meaningful only if intern_extra_block is NULL. */ -static value * camlinternaloo_last_id = NULL; -/* Pointer to a reference holding the last object id. - -1 means not available (CamlinternalOO not loaded). */ - static char * intern_resolve_code_pointer(unsigned char digest[16], asize_t offset); static void intern_bad_code_pointer(unsigned char digest[16]) Noreturn; @@ -290,16 +286,9 @@ static void intern_rec(value *dest) switch (sp->op) { case OFreshOID: /* Refresh the object ID */ - if (camlinternaloo_last_id == NULL) { - camlinternaloo_last_id = caml_named_value("CamlinternalOO.last_id"); - if (camlinternaloo_last_id == NULL) - camlinternaloo_last_id = (value*) (-1); - } - if (camlinternaloo_last_id != (value*) (-1)) { - value id = Field(*camlinternaloo_last_id,0); - Field(dest, 0) = id; - Field(*camlinternaloo_last_id,0) = id + 2; - } + /* but do not do it for predefined exception slots */ + if (Int_val(Field((value)dest, 1)) >= 0) + caml_set_oo_id((value)dest); /* Pop item and iterate */ sp--; break; @@ -336,7 +325,7 @@ static void intern_rec(value *dest) /* Request freshing OID */ PushItem(); sp->op = OFreshOID; - sp->dest = &Field(v, 1); + sp->dest = (value*) v; sp->arg = 1; /* Finally read first two block elements: method table and old OID */ ReadItems(&Field(v, 0), 2); @@ -503,8 +492,6 @@ static void intern_alloc(mlsize_t whsize, mlsize_t num_objects) { mlsize_t wosize; - if (camlinternaloo_last_id == (value*)-1) - camlinternaloo_last_id = NULL; /* Reset ignore flag */ if (whsize == 0) { intern_obj_table = NULL; intern_extra_block = NULL; @@ -751,7 +738,8 @@ static char * intern_resolve_code_pointer(unsigned char digest[16], static void intern_bad_code_pointer(unsigned char digest[16]) { char msg[256]; - sprintf(msg, "input_value: unknown code module " + snprintf(msg, sizeof(msg), + "input_value: unknown code module " "%02X%02X%02X%02X%02X%02X%02X%02X" "%02X%02X%02X%02X%02X%02X%02X%02X", digest[0], digest[1], digest[2], digest[3], diff --git a/byterun/interp.c b/byterun/interp.c index b99ed2f8..9b682ba6 100644 --- a/byterun/interp.c +++ b/byterun/interp.c @@ -173,16 +173,14 @@ sp is a local copy of the global variable caml_extern_sp. */ #define SP_REG asm("%r14") #define ACCU_REG asm("%r13") #endif +#ifdef __aarch64__ +#define PC_REG asm("%x19") +#define SP_REG asm("%x20") +#define ACCU_REG asm("%x21") +#define JUMPTBL_BASE_REG asm("%x22") #endif - -/* Division and modulus madness */ - -#ifdef NONSTANDARD_DIV_MOD -extern intnat caml_safe_div(intnat p, intnat q); -extern intnat caml_safe_mod(intnat p, intnat q); #endif - #ifdef DEBUG static intnat caml_bcodcount; #endif @@ -525,10 +523,21 @@ value caml_interprete(code_t prog, asize_t prog_size) int nvars = *pc++; int i; if (nvars > 0) *--sp = accu; - Alloc_small(accu, 1 + nvars, Closure_tag); + if (nvars < Max_young_wosize) { + /* nvars + 1 <= Max_young_wosize, can allocate in minor heap */ + Alloc_small(accu, 1 + nvars, Closure_tag); + for (i = 0; i < nvars; i++) Field(accu, i + 1) = sp[i]; + } else { + /* PR#6385: must allocate in major heap */ + /* caml_alloc_shr and caml_initialize never trigger a GC, + so no need to Setup_for_gc */ + accu = caml_alloc_shr(1 + nvars, Closure_tag); + for (i = 0; i < nvars; i++) caml_initialize(&Field(accu, i + 1), sp[i]); + } + /* The code pointer is not in the heap, so no need to go through + caml_initialize. */ Code_val(accu) = pc + *pc; pc++; - for (i = 0; i < nvars; i++) Field(accu, i + 1) = sp[i]; sp += nvars; Next; } @@ -536,15 +545,25 @@ value caml_interprete(code_t prog, asize_t prog_size) Instruct(CLOSUREREC): { int nfuncs = *pc++; int nvars = *pc++; + mlsize_t blksize = nfuncs * 2 - 1 + nvars; int i; value * p; if (nvars > 0) *--sp = accu; - Alloc_small(accu, nfuncs * 2 - 1 + nvars, Closure_tag); - p = &Field(accu, nfuncs * 2 - 1); - for (i = 0; i < nvars; i++) { - *p++ = sp[i]; + if (blksize <= Max_young_wosize) { + Alloc_small(accu, blksize, Closure_tag); + p = &Field(accu, nfuncs * 2 - 1); + for (i = 0; i < nvars; i++, p++) *p = sp[i]; + } else { + /* PR#6385: must allocate in major heap */ + /* caml_alloc_shr and caml_initialize never trigger a GC, + so no need to Setup_for_gc */ + accu = caml_alloc_shr(blksize, Closure_tag); + p = &Field(accu, nfuncs * 2 - 1); + for (i = 0; i < nvars; i++, p++) caml_initialize(p, sp[i]); } sp += nvars; + /* The code pointers and infix headers are not in the heap, + so no need to go through caml_initialize. */ p = &Field(accu, 0); *p = (value) (pc + pc[0]); *--sp = accu; @@ -814,10 +833,20 @@ value caml_interprete(code_t prog, asize_t prog_size) sp += 4; Next; + Instruct(RAISE_NOTRACE): + if (caml_trapsp >= caml_trap_barrier) caml_debugger(TRAP_BARRIER); + goto raise_notrace; + + Instruct(RERAISE): + if (caml_trapsp >= caml_trap_barrier) caml_debugger(TRAP_BARRIER); + if (caml_backtrace_active) caml_stash_backtrace(accu, pc, sp, 1); + goto raise_notrace; + Instruct(RAISE): raise_exception: if (caml_trapsp >= caml_trap_barrier) caml_debugger(TRAP_BARRIER); - if (caml_backtrace_active) caml_stash_backtrace(accu, pc, sp); + if (caml_backtrace_active) caml_stash_backtrace(accu, pc, sp, 0); + raise_notrace: if ((char *) caml_trapsp >= (char *) caml_stack_high - initial_sp_offset) { caml_external_raise = initial_external_raise; @@ -946,21 +975,13 @@ value caml_interprete(code_t prog, asize_t prog_size) Instruct(DIVINT): { intnat divisor = Long_val(*sp++); if (divisor == 0) { Setup_for_c_call; caml_raise_zero_divide(); } -#ifdef NONSTANDARD_DIV_MOD - accu = Val_long(caml_safe_div(Long_val(accu), divisor)); -#else accu = Val_long(Long_val(accu) / divisor); -#endif Next; } Instruct(MODINT): { intnat divisor = Long_val(*sp++); if (divisor == 0) { Setup_for_c_call; caml_raise_zero_divide(); } -#ifdef NONSTANDARD_DIV_MOD - accu = Val_long(caml_safe_mod(Long_val(accu), divisor)); -#else accu = Val_long(Long_val(accu) % divisor); -#endif Next; } Instruct(ANDINT): diff --git a/byterun/ints.c b/byterun/ints.c index 4bf1d332..d762c761 100644 --- a/byterun/ints.c +++ b/byterun/ints.c @@ -96,24 +96,6 @@ static intnat parse_intnat(value s, int nbits) return sign < 0 ? -((intnat) res) : (intnat) res; } -#ifdef NONSTANDARD_DIV_MOD -intnat caml_safe_div(intnat p, intnat q) -{ - uintnat ap = p >= 0 ? p : -p; - uintnat aq = q >= 0 ? q : -q; - uintnat ar = ap / aq; - return (p ^ q) >= 0 ? ar : -ar; -} - -intnat caml_safe_mod(intnat p, intnat q) -{ - uintnat ap = p >= 0 ? p : -p; - uintnat aq = q >= 0 ? q : -q; - uintnat ar = ap % aq; - return p >= 0 ? ar : -ar; -} -#endif - value caml_bswap16_direct(value x) { return ((((x & 0x00FF) << 8) | @@ -142,13 +124,10 @@ CAMLprim value caml_int_of_string(value s) #define FORMAT_BUFFER_SIZE 32 -static char * parse_format(value fmt, - char * suffix, - char format_string[], - char default_format_buffer[], - char *conv) +static char parse_format(value fmt, + char * suffix, + char format_string[FORMAT_BUFFER_SIZE]) { - int prec; char * p; char lastletter; mlsize_t len, len_suffix; @@ -167,41 +146,25 @@ static char * parse_format(value fmt, memmove(p, suffix, len_suffix); p += len_suffix; *p++ = lastletter; *p = 0; - /* Determine space needed for result and allocate it dynamically if needed */ - prec = 22 + 5; /* 22 digits for 64-bit number in octal + 5 extra */ - for (p = String_val(fmt); *p != 0; p++) { - if (*p >= '0' && *p <= '9') { - prec = atoi(p) + 5; - break; - } - } - *conv = lastletter; - if (prec < FORMAT_BUFFER_SIZE) - return default_format_buffer; - else - return caml_stat_alloc(prec + 1); + /* Return the conversion type (last letter) */ + return lastletter; } CAMLprim value caml_format_int(value fmt, value arg) { char format_string[FORMAT_BUFFER_SIZE]; - char default_format_buffer[FORMAT_BUFFER_SIZE]; - char * buffer; char conv; value res; - buffer = parse_format(fmt, ARCH_INTNAT_PRINTF_FORMAT, - format_string, default_format_buffer, &conv); + conv = parse_format(fmt, ARCH_INTNAT_PRINTF_FORMAT, format_string); switch (conv) { case 'u': case 'x': case 'X': case 'o': - sprintf(buffer, format_string, Unsigned_long_val(arg)); + res = caml_alloc_sprintf(format_string, Unsigned_long_val(arg)); break; default: - sprintf(buffer, format_string, Long_val(arg)); + res = caml_alloc_sprintf(format_string, Long_val(arg)); break; } - res = caml_copy_string(buffer); - if (buffer != default_format_buffer) caml_stat_free(buffer); return res; } @@ -269,11 +232,7 @@ CAMLprim value caml_int32_div(value v1, value v2) /* PR#4740: on some processors, division crashes on overflow. Implement the same behavior as for type "int". */ if (dividend == (1<<31) && divisor == -1) return v1; -#ifdef NONSTANDARD_DIV_MOD - return caml_copy_int32(caml_safe_div(dividend, divisor)); -#else return caml_copy_int32(dividend / divisor); -#endif } CAMLprim value caml_int32_mod(value v1, value v2) @@ -284,11 +243,7 @@ CAMLprim value caml_int32_mod(value v1, value v2) /* PR#4740: on some processors, modulus crashes if division overflows. Implement the same behavior as for type "int". */ if (dividend == (1<<31) && divisor == -1) return caml_copy_int32(0); -#ifdef NONSTANDARD_DIV_MOD - return caml_copy_int32(caml_safe_mod(dividend, divisor)); -#else return caml_copy_int32(dividend % divisor); -#endif } CAMLprim value caml_int32_and(value v1, value v2) @@ -346,17 +301,9 @@ CAMLprim value caml_int32_compare(value v1, value v2) CAMLprim value caml_int32_format(value fmt, value arg) { char format_string[FORMAT_BUFFER_SIZE]; - char default_format_buffer[FORMAT_BUFFER_SIZE]; - char * buffer; - char conv; - value res; - buffer = parse_format(fmt, ARCH_INT32_PRINTF_FORMAT, - format_string, default_format_buffer, &conv); - sprintf(buffer, format_string, Int32_val(arg)); - res = caml_copy_string(buffer); - if (buffer != default_format_buffer) caml_stat_free(buffer); - return res; + parse_format(fmt, ARCH_INT32_PRINTF_FORMAT, format_string); + return caml_alloc_sprintf(format_string, Int32_val(arg)); } CAMLprim value caml_int32_of_string(value s) @@ -380,12 +327,6 @@ CAMLprim value caml_int32_float_of_bits(value vi) /* 64-bit integers */ -#ifdef ARCH_INT64_TYPE -#include "int64_native.h" -#else -#include "int64_emul.h" -#endif - #ifdef ARCH_ALIGN_INT64 CAMLexport int64 caml_Int64_val(value v) @@ -402,15 +343,13 @@ static int int64_cmp(value v1, value v2) { int64 i1 = Int64_val(v1); int64 i2 = Int64_val(v2); - return I64_compare(i1, i2); + return (i1 > i2) - (i1 < i2); } static intnat int64_hash(value v) { int64 x = Int64_val(v); - uint32 lo, hi; - - I64_split(x, hi, lo); + uint32 lo = (uint32) x, hi = (uint32) (x >> 32); return hi ^ lo; } @@ -459,59 +398,58 @@ CAMLexport value caml_copy_int64(int64 i) } CAMLprim value caml_int64_neg(value v) -{ return caml_copy_int64(I64_neg(Int64_val(v))); } +{ return caml_copy_int64(- Int64_val(v)); } CAMLprim value caml_int64_add(value v1, value v2) -{ return caml_copy_int64(I64_add(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) + Int64_val(v2)); } CAMLprim value caml_int64_sub(value v1, value v2) -{ return caml_copy_int64(I64_sub(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) - Int64_val(v2)); } CAMLprim value caml_int64_mul(value v1, value v2) -{ return caml_copy_int64(I64_mul(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) * Int64_val(v2)); } + +#define Int64_min_int ((intnat) 1 << (sizeof(intnat) * 8 - 1)) CAMLprim value caml_int64_div(value v1, value v2) { int64 dividend = Int64_val(v1); int64 divisor = Int64_val(v2); - if (I64_is_zero(divisor)) caml_raise_zero_divide(); + if (divisor == 0) caml_raise_zero_divide(); /* PR#4740: on some processors, division crashes on overflow. Implement the same behavior as for type "int". */ - if (I64_is_min_int(dividend) && I64_is_minus_one(divisor)) return v1; - return caml_copy_int64(I64_div(Int64_val(v1), divisor)); + if (dividend == ((int64)1 << 63) && divisor == -1) return v1; + return caml_copy_int64(Int64_val(v1) / divisor); } CAMLprim value caml_int64_mod(value v1, value v2) { int64 dividend = Int64_val(v1); int64 divisor = Int64_val(v2); - if (I64_is_zero(divisor)) caml_raise_zero_divide(); + if (divisor == 0) caml_raise_zero_divide(); /* PR#4740: on some processors, division crashes on overflow. Implement the same behavior as for type "int". */ - if (I64_is_min_int(dividend) && I64_is_minus_one(divisor)) { - int64 zero = I64_literal(0,0); - return caml_copy_int64(zero); - } - return caml_copy_int64(I64_mod(Int64_val(v1), divisor)); + if (dividend == ((int64)1 << 63) && divisor == -1) return caml_copy_int64(0); + return caml_copy_int64(Int64_val(v1) % divisor); } CAMLprim value caml_int64_and(value v1, value v2) -{ return caml_copy_int64(I64_and(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) & Int64_val(v2)); } CAMLprim value caml_int64_or(value v1, value v2) -{ return caml_copy_int64(I64_or(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) | Int64_val(v2)); } CAMLprim value caml_int64_xor(value v1, value v2) -{ return caml_copy_int64(I64_xor(Int64_val(v1), Int64_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) ^ Int64_val(v2)); } CAMLprim value caml_int64_shift_left(value v1, value v2) -{ return caml_copy_int64(I64_lsl(Int64_val(v1), Int_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) << Int_val(v2)); } CAMLprim value caml_int64_shift_right(value v1, value v2) -{ return caml_copy_int64(I64_asr(Int64_val(v1), Int_val(v2))); } +{ return caml_copy_int64(Int64_val(v1) >> Int_val(v2)); } CAMLprim value caml_int64_shift_right_unsigned(value v1, value v2) -{ return caml_copy_int64(I64_lsr(Int64_val(v1), Int_val(v2))); } +{ return caml_copy_int64((uint64) (Int64_val(v1)) >> Int_val(v2)); } #ifdef ARCH_SIXTYFOUR static value caml_swap64(value x) @@ -531,98 +469,92 @@ value caml_int64_direct_bswap(value v) #endif CAMLprim value caml_int64_bswap(value v) -{ return caml_copy_int64(I64_bswap(Int64_val(v))); } +{ + int64 x = Int64_val(v); + return caml_copy_int64 + (((x & 0x00000000000000FFULL) << 56) | + ((x & 0x000000000000FF00ULL) << 40) | + ((x & 0x0000000000FF0000ULL) << 24) | + ((x & 0x00000000FF000000ULL) << 8) | + ((x & 0x000000FF00000000ULL) >> 8) | + ((x & 0x0000FF0000000000ULL) >> 24) | + ((x & 0x00FF000000000000ULL) >> 40) | + ((x & 0xFF00000000000000ULL) >> 56)); +} CAMLprim value caml_int64_of_int(value v) -{ return caml_copy_int64(I64_of_intnat(Long_val(v))); } +{ return caml_copy_int64((int64) (Long_val(v))); } CAMLprim value caml_int64_to_int(value v) -{ return Val_long(I64_to_intnat(Int64_val(v))); } +{ return Val_long((intnat) (Int64_val(v))); } CAMLprim value caml_int64_of_float(value v) -{ return caml_copy_int64(I64_of_double(Double_val(v))); } +{ return caml_copy_int64((int64) (Double_val(v))); } CAMLprim value caml_int64_to_float(value v) -{ - int64 i = Int64_val(v); - return caml_copy_double(I64_to_double(i)); -} +{ return caml_copy_double((double) (Int64_val(v))); } CAMLprim value caml_int64_of_int32(value v) -{ return caml_copy_int64(I64_of_int32(Int32_val(v))); } +{ return caml_copy_int64((int64) (Int32_val(v))); } CAMLprim value caml_int64_to_int32(value v) -{ return caml_copy_int32(I64_to_int32(Int64_val(v))); } +{ return caml_copy_int32((int32) (Int64_val(v))); } CAMLprim value caml_int64_of_nativeint(value v) -{ return caml_copy_int64(I64_of_intnat(Nativeint_val(v))); } +{ return caml_copy_int64((int64) (Nativeint_val(v))); } CAMLprim value caml_int64_to_nativeint(value v) -{ return caml_copy_nativeint(I64_to_intnat(Int64_val(v))); } +{ return caml_copy_nativeint((intnat) (Int64_val(v))); } CAMLprim value caml_int64_compare(value v1, value v2) { int64 i1 = Int64_val(v1); int64 i2 = Int64_val(v2); - return Val_int(I64_compare(i1, i2)); + return Val_int((i1 > i2) - (i1 < i2)); } -#ifdef ARCH_INT64_PRINTF_FORMAT -#define I64_format(buf,fmt,x) sprintf(buf,fmt,x) -#else -#include "int64_format.h" -#define ARCH_INT64_PRINTF_FORMAT "" -#endif - CAMLprim value caml_int64_format(value fmt, value arg) { char format_string[FORMAT_BUFFER_SIZE]; - char default_format_buffer[FORMAT_BUFFER_SIZE]; - char * buffer; - char conv; - value res; - buffer = parse_format(fmt, ARCH_INT64_PRINTF_FORMAT, - format_string, default_format_buffer, &conv); - I64_format(buffer, format_string, Int64_val(arg)); - res = caml_copy_string(buffer); - if (buffer != default_format_buffer) caml_stat_free(buffer); - return res; + parse_format(fmt, ARCH_INT64_PRINTF_FORMAT, format_string); + return caml_alloc_sprintf(format_string, Int64_val(arg)); } CAMLprim value caml_int64_of_string(value s) { char * p; - uint64 max_uint64 = I64_literal(0xFFFFFFFF, 0xFFFFFFFF); - uint64 max_int64_pos = I64_literal(0x7FFFFFFF, 0xFFFFFFFF); - uint64 max_int64_neg = I64_literal(0x80000000, 0x00000000); uint64 res, threshold; int sign, base, d; p = parse_sign_and_base(String_val(s), &base, &sign); - I64_udivmod(max_uint64, I64_of_int32(base), &threshold, &res); + threshold = ((uint64) -1) / base; d = parse_digit(*p); if (d < 0 || d >= base) caml_failwith("int_of_string"); - res = I64_of_int32(d); + res = d; for (p++; /*nothing*/; p++) { char c = *p; if (c == '_') continue; d = parse_digit(c); if (d < 0 || d >= base) break; /* Detect overflow in multiplication base * res */ - if (I64_ult(threshold, res)) caml_failwith("int_of_string"); - res = I64_add(I64_mul(I64_of_int32(base), res), I64_of_int32(d)); + if (res > threshold) caml_failwith("int_of_string"); + res = base * res + d; /* Detect overflow in addition (base * res) + d */ - if (I64_ult(res, I64_of_int32(d))) caml_failwith("int_of_string"); + if (res < (uint64) d) caml_failwith("int_of_string"); } if (p != String_val(s) + caml_string_length(s)){ caml_failwith("int_of_string"); } if (base == 10) { - if (I64_ult((sign >= 0 ? max_int64_pos : max_int64_neg), res)) - caml_failwith("int_of_string"); + /* Signed representation expected, allow -2^63 to 2^63 - 1 only */ + if (sign >= 0) { + if (res >= (uint64)1 << 63) caml_failwith("int_of_string"); + } else { + if (res > (uint64)1 << 63) caml_failwith("int_of_string"); + } } - if (sign < 0) res = I64_neg(res); + if (sign < 0) res = - res; return caml_copy_int64(res); } @@ -745,11 +677,7 @@ CAMLprim value caml_nativeint_div(value v1, value v2) /* PR#4740: on some processors, modulus crashes if division overflows. Implement the same behavior as for type "int". */ if (dividend == Nativeint_min_int && divisor == -1) return v1; -#ifdef NONSTANDARD_DIV_MOD - return caml_copy_nativeint(caml_safe_div(dividend, divisor)); -#else return caml_copy_nativeint(dividend / divisor); -#endif } CAMLprim value caml_nativeint_mod(value v1, value v2) @@ -762,11 +690,7 @@ CAMLprim value caml_nativeint_mod(value v1, value v2) if (dividend == Nativeint_min_int && divisor == -1){ return caml_copy_nativeint(0); } -#ifdef NONSTANDARD_DIV_MOD - return caml_copy_nativeint(caml_safe_mod(dividend, divisor)); -#else return caml_copy_nativeint(dividend % divisor); -#endif } CAMLprim value caml_nativeint_and(value v1, value v2) @@ -834,17 +758,9 @@ CAMLprim value caml_nativeint_compare(value v1, value v2) CAMLprim value caml_nativeint_format(value fmt, value arg) { char format_string[FORMAT_BUFFER_SIZE]; - char default_format_buffer[FORMAT_BUFFER_SIZE]; - char * buffer; - char conv; - value res; - buffer = parse_format(fmt, ARCH_INTNAT_PRINTF_FORMAT, - format_string, default_format_buffer, &conv); - sprintf(buffer, format_string, Nativeint_val(arg)); - res = caml_copy_string(buffer); - if (buffer != default_format_buffer) caml_stat_free(buffer); - return res; + parse_format(fmt, ARCH_INTNAT_PRINTF_FORMAT, format_string); + return caml_alloc_sprintf(format_string, Nativeint_val(arg)); } CAMLprim value caml_nativeint_of_string(value s) diff --git a/byterun/io.c b/byterun/io.c index 676cb5b2..5f04a966 100644 --- a/byterun/io.c +++ b/byterun/io.c @@ -22,6 +22,9 @@ #ifdef HAS_UNISTD #include #endif +#ifdef __CYGWIN__ +#include +#endif #include "alloc.h" #include "custom.h" #include "fail.h" @@ -788,21 +791,3 @@ CAMLprim value caml_ml_input_scan_line(value vchannel) Unlock(channel); CAMLreturn (Val_long(res)); } - -/* Conversion between file_offset and int64 */ - -#ifndef ARCH_INT64_TYPE -CAMLexport value caml_Val_file_offset(file_offset fofs) -{ - int64 ofs; - ofs.l = fofs; - ofs.h = 0; - return caml_copy_int64(ofs); -} - -CAMLexport file_offset caml_File_offset_val(value v) -{ - int64 ofs = Int64_val(v); - return (file_offset) ofs.l; -} -#endif diff --git a/byterun/io.h b/byterun/io.h index 8420d159..64a8bf50 100644 --- a/byterun/io.h +++ b/byterun/io.h @@ -25,8 +25,6 @@ #if defined(_WIN32) typedef __int64 file_offset; -extern __int64 _lseeki64(int, __int64, int); -#define lseek(fd,d,m) _lseeki64(fd,d,m) #elif defined(HAS_OFF_T) #include typedef off_t file_offset; @@ -111,14 +109,7 @@ CAMLextern struct channel * caml_all_opened_channels; /* Conversion between file_offset and int64 */ -#ifdef ARCH_INT64_TYPE #define Val_file_offset(fofs) caml_copy_int64(fofs) #define File_offset_val(v) ((file_offset) Int64_val(v)) -#else -CAMLextern value caml_Val_file_offset(file_offset fofs); -CAMLextern file_offset caml_File_offset_val(value v); -#define Val_file_offset caml_Val_file_offset -#define File_offset_val caml_File_offset_val -#endif #endif /* CAML_IO_H */ diff --git a/byterun/lexing.c b/byterun/lexing.c index 8242cc7a..22ef6acd 100644 --- a/byterun/lexing.c +++ b/byterun/lexing.c @@ -49,7 +49,7 @@ struct lexing_table { #if defined(ARCH_BIG_ENDIAN) || SIZEOF_SHORT != 2 #define Short(tbl,n) \ (*((unsigned char *)((tbl) + (n) * 2)) + \ - (*((schar *)((tbl) + (n) * 2 + 1)) << 8)) + (*((signed char *)((tbl) + (n) * 2 + 1)) << 8)) #else #define Short(tbl,n) (((short *)(tbl))[(n)]) #endif diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 14a248f0..a44c8d90 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -27,6 +27,12 @@ #include "roots.h" #include "weak.h" +#if defined (NATIVE_CODE) && defined (NO_NAKED_POINTERS) +#define NATIVE_CODE_AND_NO_NAKED_POINTERS +#else +#undef NATIVE_CODE_AND_NO_NAKED_POINTERS +#endif + uintnat caml_percent_free; uintnat caml_major_heap_increment; CAMLexport char *caml_heap_start; @@ -82,7 +88,18 @@ static void realloc_gray_vals (void) void caml_darken (value v, value *p /* not used */) { +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + if (Is_block (v) && Wosize_val (v) > 0) { + /* We insist that naked pointers to outside the heap point to things that + look like values with headers coloured black. This isn't always + strictly necessary but is essential in certain cases---in particular + when the value is allocated in a read-only section. (For the values + where it would be safe it is a performance improvement since we avoid + putting them on the grey list.) */ + CAMLassert (Is_in_heap (v) || Is_black_hd (Hd_val (v))); +#else if (Is_block (v) && Is_in_heap (v)) { +#endif header_t h = Hd_val (v); tag_t t = Tag_hd (h); if (t == Infix_tag){ @@ -124,6 +141,9 @@ static void mark_slice (intnat work) value v, child; header_t hd; mlsize_t size, i; +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + int marking_closure = 0; +#endif caml_gc_message (0x40, "Marking %ld words\n", work); caml_gc_message (0x40, "Subphase = %ld\n", caml_gc_subphase); @@ -132,13 +152,28 @@ static void mark_slice (intnat work) if (gray_vals_ptr > gray_vals){ v = *--gray_vals_ptr; hd = Hd_val(v); +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + marking_closure = + (Tag_hd (hd) == Closure_tag || Tag_hd (hd) == Infix_tag); +#endif Assert (Is_gray_hd (hd)); Hd_val (v) = Blackhd_hd (hd); size = Wosize_hd (hd); if (Tag_hd (hd) < No_scan_tag){ for (i = 0; i < size; i++){ child = Field (v, i); +#ifdef NATIVE_CODE_AND_NO_NAKED_POINTERS + if (Is_block (child) + && Wosize_val (child) > 0 /* Atoms never need to be marked. */ + /* Closure blocks contain code pointers at offsets that cannot + be reliably determined, so we always use the page table when + marking such values. */ + && (!marking_closure || Is_in_heap (child))) { + /* See [caml_darken] for a description of this assertion. */ + CAMLassert (Is_in_heap (child) || Is_black_hd (Hd_val (child))); +#else if (Is_block (child) && Is_in_heap (child)) { +#endif hd = Hd_val (child); if (Tag_hd (hd) == Forward_tag){ value f = Forward_val (child); @@ -457,15 +492,23 @@ static asize_t clip_heap_chunk_size (asize_t request) return ((request + Page_size - 1) >> Page_log) << Page_log; } -/* Make sure the request is >= caml_major_heap_increment, then call - clip_heap_chunk_size, then make sure the result is >= request. +/* Compute the heap increment, make sure the request is at least that big, + then call clip_heap_chunk_size, then make sure the result is >= request. */ asize_t caml_round_heap_chunk_size (asize_t request) { asize_t result = request; + uintnat incr; + + /* Compute the heap increment as a byte size. */ + if (caml_major_heap_increment > 1000){ + incr = Bsize_wsize (caml_major_heap_increment); + }else{ + incr = caml_stat_heap_size / 100 * caml_major_heap_increment; + } - if (result < caml_major_heap_increment){ - result = caml_major_heap_increment; + if (result < incr){ + result = incr; } result = clip_heap_chunk_size (result); diff --git a/byterun/memory.h b/byterun/memory.h index 07610701..9befa873 100644 --- a/byterun/memory.h +++ b/byterun/memory.h @@ -266,27 +266,31 @@ CAMLextern struct caml__roots_block *caml_local_roots; /* defined in roots.c */ 0) #define CAMLlocal1(x) \ - value x = 0; \ + value x = Val_unit; \ CAMLxparam1 (x) #define CAMLlocal2(x, y) \ - value x = 0, y = 0; \ + value x = Val_unit, y = Val_unit; \ CAMLxparam2 (x, y) #define CAMLlocal3(x, y, z) \ - value x = 0, y = 0, z = 0; \ + value x = Val_unit, y = Val_unit, z = Val_unit; \ CAMLxparam3 (x, y, z) #define CAMLlocal4(x, y, z, t) \ - value x = 0, y = 0, z = 0, t = 0; \ + value x = Val_unit, y = Val_unit, z = Val_unit, t = Val_unit; \ CAMLxparam4 (x, y, z, t) #define CAMLlocal5(x, y, z, t, u) \ - value x = 0, y = 0, z = 0, t = 0, u = 0; \ + value x = Val_unit, y = Val_unit, z = Val_unit, t = Val_unit, u = Val_unit; \ CAMLxparam5 (x, y, z, t, u) #define CAMLlocalN(x, size) \ - value x [(size)] = { 0, /* 0, 0, ... */ }; \ + value x [(size)]; \ + int caml__i_##x; \ + for (caml__i_##x = 0; caml__i_##x < size; caml__i_##x ++) { \ + x[caml__i_##x] = Val_unit; \ + } \ CAMLxparamN (x, (size)) diff --git a/byterun/misc.c b/byterun/misc.c index 6eeae0f1..6dc27d5c 100644 --- a/byterun/misc.c +++ b/byterun/misc.c @@ -12,6 +12,8 @@ /***********************************************************************/ #include +#include +#include #include "config.h" #include "misc.h" #include "memory.h" @@ -121,3 +123,39 @@ void caml_ext_table_free(struct ext_table * tbl, int free_entries) for (i = 0; i < tbl->size; i++) caml_stat_free(tbl->contents[i]); caml_stat_free(tbl->contents); } + +CAMLexport char * caml_strdup(const char * s) +{ + size_t slen = strlen(s); + char * res = caml_stat_alloc(slen + 1); + memcpy(res, s, slen + 1); + return res; +} + +CAMLexport char * caml_strconcat(int n, ...) +{ + va_list args; + char * res, * p; + size_t len; + int i; + + len = 0; + va_start(args, n); + for (i = 0; i < n; i++) { + const char * s = va_arg(args, const char *); + len += strlen(s); + } + va_end(args); + res = caml_stat_alloc(len + 1); + va_start(args, n); + p = res; + for (i = 0; i < n; i++) { + const char * s = va_arg(args, const char *); + size_t l = strlen(s); + memcpy(p, s, l); + p += l; + } + va_end(args); + *p = 0; + return res; +} diff --git a/byterun/misc.h b/byterun/misc.h index 4fd82af2..5640980a 100644 --- a/byterun/misc.h +++ b/byterun/misc.h @@ -61,8 +61,6 @@ typedef char * addr; /* Assertions */ -/* */ - #ifdef DEBUG #define CAMLassert(x) \ ((x) ? (void) 0 : caml_failed_assert ( #x , __FILE__, __LINE__)) @@ -76,6 +74,13 @@ CAMLextern void caml_fatal_error_arg (char *fmt, char *arg) Noreturn; CAMLextern void caml_fatal_error_arg2 (char *fmt1, char *arg1, char *fmt2, char *arg2) Noreturn; +/* Safe string operations */ + +CAMLextern char * caml_strdup(const char * s); +CAMLextern char * caml_strconcat(int n, ...); /* n args of const char * type */ + +/* */ + /* Data structures */ struct ext_table { @@ -138,6 +143,13 @@ extern void caml_set_fields (char *, unsigned long, unsigned long); #define Assert CAMLassert #endif +/* snprintf emulation for Win32 */ + +#ifdef _WIN32 +extern int caml_snprintf(char * buf, size_t size, const char * format, ...); +#define snprintf caml_snprintf +#endif + /* */ #endif /* CAML_MISC_H */ diff --git a/byterun/mlvalues.h b/byterun/mlvalues.h index cbb1c7bf..268bcfe9 100644 --- a/byterun/mlvalues.h +++ b/byterun/mlvalues.h @@ -300,5 +300,6 @@ extern value caml_global_data; } #endif +CAMLextern value caml_set_oo_id(value obj); #endif /* CAML_MLVALUES_H */ diff --git a/byterun/obj.c b/byterun/obj.c index 8e00282e..b045fee2 100644 --- a/byterun/obj.c +++ b/byterun/obj.c @@ -247,3 +247,15 @@ value caml_cache_public_method2 (value *meths, value tag, value *cache) } } #endif /*CAML_JIT*/ + +static value oo_last_id = Val_int(0); + +CAMLprim value caml_set_oo_id (value obj) { + Field(obj, 1) = oo_last_id; + oo_last_id += 2; + return obj; +} + +CAMLprim value caml_int_as_pointer (value n) { + return n - 1; +} diff --git a/byterun/osdeps.h b/byterun/osdeps.h index 8123d49b..8204205f 100644 --- a/byterun/osdeps.h +++ b/byterun/osdeps.h @@ -61,9 +61,8 @@ extern char * caml_dlerror(void); Return 0 on success, -1 on error; set errno in the case of error. */ extern int caml_read_directory(char * dirname, struct ext_table * contents); -#ifdef __linux__ -/* Recover executable name from /proc/self/exe if possible */ +/* Recover executable name if possible (/proc/sef/exe under Linux, + GetModuleFileName under Windows). */ extern int caml_executable_name(char * name, int name_len); -#endif #endif /* CAML_OSDEPS_H */ diff --git a/byterun/parsing.c b/byterun/parsing.c index 3c1ced7d..a857e392 100644 --- a/byterun/parsing.c +++ b/byterun/parsing.c @@ -63,7 +63,7 @@ struct parser_env { /* Mirrors parser_env in ../stdlib/parsing.ml */ #if defined(ARCH_BIG_ENDIAN) || SIZEOF_SHORT != 2 #define Short(tbl,n) \ (*((unsigned char *)((tbl) + (n) * 2)) + \ - (*((schar *)((tbl) + (n) * 2 + 1)) << 8)) + (*((signed char *)((tbl) + (n) * 2 + 1)) << 8)) #else #define Short(tbl,n) (((short *)(tbl))[n]) #endif diff --git a/byterun/printexc.c b/byterun/printexc.c index 7e3259ab..a371a71f 100644 --- a/byterun/printexc.c +++ b/byterun/printexc.c @@ -53,8 +53,8 @@ CAMLexport char * caml_format_exception(value exn) buf.ptr = buf.data; buf.end = buf.data + sizeof(buf.data) - 1; - add_string(&buf, String_val(Field(Field(exn, 0), 0))); - if (Wosize_val(exn) >= 2) { + if (Tag_val(exn) == 0) { + add_string(&buf, String_val(Field(Field(exn, 0), 0))); /* Check for exceptions in the style of Match_failure and Assert_failure */ if (Wosize_val(exn) == 2 && Is_block(Field(exn, 1)) && @@ -71,7 +71,8 @@ CAMLexport char * caml_format_exception(value exn) if (i > start) add_string(&buf, ", "); v = Field(bucket, i); if (Is_long(v)) { - sprintf(intbuf, "%" ARCH_INTNAT_PRINTF_FORMAT "d", Long_val(v)); + snprintf(intbuf, sizeof(intbuf), + "%" ARCH_INTNAT_PRINTF_FORMAT "d", Long_val(v)); add_string(&buf, intbuf); } else if (Tag_val(v) == String_tag) { add_char(&buf, '"'); @@ -82,7 +83,9 @@ CAMLexport char * caml_format_exception(value exn) } } add_char(&buf, ')'); - } + } else + add_string(&buf, String_val(Field(exn, 0))); + *buf.ptr = 0; /* Terminate string */ i = buf.ptr - buf.data + 1; res = malloc(i); @@ -92,7 +95,14 @@ CAMLexport char * caml_format_exception(value exn) } -void caml_fatal_uncaught_exception(value exn) +#ifdef NATIVE_CODE +# define DEBUGGER_IN_USE 0 +#else +# define DEBUGGER_IN_USE caml_debugger_in_use +#endif + +/* Default C implementation in case the OCaml one is not registered. */ +static void default_fatal_uncaught_exception(value exn) { char * msg; value * at_exit; @@ -113,13 +123,21 @@ void caml_fatal_uncaught_exception(value exn) fprintf(stderr, "Fatal error: exception %s\n", msg); free(msg); /* Display the backtrace if available */ - if (caml_backtrace_active -#ifndef NATIVE_CODE - && !caml_debugger_in_use -#endif - ) { + if (caml_backtrace_active && !DEBUGGER_IN_USE) caml_print_exception_backtrace(); - } +} + +void caml_fatal_uncaught_exception(value exn) +{ + value *handle_uncaught_exception; + + handle_uncaught_exception = + caml_named_value("Printexc.handle_uncaught_exception"); + if (handle_uncaught_exception != NULL) + /* [Printexc.handle_uncaught_exception] does not raise exception. */ + caml_callback2(*handle_uncaught_exception, exn, Val_bool(DEBUGGER_IN_USE)); + else + default_fatal_uncaught_exception(exn); /* Terminate the process */ exit(2); } diff --git a/byterun/startup.c b/byterun/startup.c index 7b9aad46..36972206 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -246,10 +246,10 @@ static int parse_command_line(char **argv) #endif case 'v': if (!strcmp (argv[i], "-version")){ - printf ("The OCaml runtime, version " OCAML_VERSION "\n"); + printf ("The OCaml runtime, version " OCAML_VERSION_STRING "\n"); exit (0); }else if (!strcmp (argv[i], "-vnum")){ - printf (OCAML_VERSION "\n"); + printf (OCAML_VERSION_STRING "\n"); exit (0); }else{ caml_verb_gc = 0x001+0x004+0x008+0x010+0x020; @@ -350,9 +350,7 @@ CAMLexport void caml_main(char **argv) value res; char * shared_lib_path, * shared_libs, * req_prims; char * exe_name; -#ifdef __linux__ static char proc_self_exe[256]; -#endif /* Machine-dependent initialization of the floating-point hardware so that it behaves as much as possible as specified in IEEE */ @@ -369,12 +367,19 @@ CAMLexport void caml_main(char **argv) #endif parse_camlrunparam(); pos = 0; + + /* First, try argv[0] (when ocamlrun is called by a bytecode program) */ exe_name = argv[0]; -#ifdef __linux__ - if (caml_executable_name(proc_self_exe, sizeof(proc_self_exe)) == 0) - exe_name = proc_self_exe; -#endif fd = caml_attempt_open(&exe_name, &trail, 0); + + /* Should we really do that at all? The current executable is ocamlrun + itself, it's never a bytecode program. */ + if (fd < 0 + && caml_executable_name(proc_self_exe, sizeof(proc_self_exe)) == 0) { + exe_name = proc_self_exe; + fd = caml_attempt_open(&exe_name, &trail, 0); + } + if (fd < 0) { pos = parse_command_line(argv); if (argv[pos] == 0) @@ -425,7 +430,6 @@ CAMLexport void caml_main(char **argv) caml_oldify_one (caml_global_data, &caml_global_data); caml_oldify_mopup (); /* Initialize system libraries */ - caml_init_exceptions(); caml_sys_init(exe_name, argv + pos); #ifdef _WIN32 /* Start a thread to handle signals */ @@ -455,11 +459,9 @@ CAMLexport void caml_startup_code( char **argv) { value res; - char* cds_file; + char * cds_file; char * exe_name; -#ifdef __linux__ static char proc_self_exe[256]; -#endif caml_init_ieee_floats(); #ifdef _MSC_VER @@ -471,15 +473,12 @@ CAMLexport void caml_startup_code( #endif cds_file = getenv("CAML_DEBUG_FILE"); if (cds_file != NULL) { - caml_cds_file = caml_stat_alloc(strlen(cds_file) + 1); - strcpy(caml_cds_file, cds_file); + caml_cds_file = caml_strdup(cds_file); } parse_camlrunparam(); exe_name = argv[0]; -#ifdef __linux__ if (caml_executable_name(proc_self_exe, sizeof(proc_self_exe)) == 0) exe_name = proc_self_exe; -#endif caml_external_raise = NULL; /* Initialize the abstract machine */ caml_init_gc (minor_heap_init, heap_size_init, heap_chunk_init, @@ -514,7 +513,6 @@ CAMLexport void caml_startup_code( caml_section_table = section_table; caml_section_table_size = section_table_size; /* Initialize system libraries */ - caml_init_exceptions(); caml_sys_init(exe_name, argv); /* Execute the program */ caml_debugger(PROGRAM_START); diff --git a/byterun/str.c b/byterun/str.c index 9a96147e..6effa91a 100644 --- a/byterun/str.c +++ b/byterun/str.c @@ -15,6 +15,8 @@ #include #include +#include +#include #include "alloc.h" #include "fail.h" #include "mlvalues.h" @@ -68,7 +70,7 @@ CAMLprim value caml_string_get16(value str, value index) intnat res; unsigned char b1, b2; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 1) caml_array_bound_error(); + if (idx < 0 || idx + 1 >= caml_string_length(str)) caml_array_bound_error(); b1 = Byte_u(str, idx); b2 = Byte_u(str, idx + 1); #ifdef ARCH_BIG_ENDIAN @@ -84,7 +86,7 @@ CAMLprim value caml_string_get32(value str, value index) intnat res; unsigned char b1, b2, b3, b4; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 3) caml_array_bound_error(); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); b1 = Byte_u(str, idx); b2 = Byte_u(str, idx + 1); b3 = Byte_u(str, idx + 2); @@ -97,19 +99,12 @@ CAMLprim value caml_string_get32(value str, value index) return caml_copy_int32(res); } -#ifdef ARCH_INT64_TYPE -#include "int64_native.h" -#else -#include "int64_emul.h" -#endif - CAMLprim value caml_string_get64(value str, value index) { - uint32 reshi; - uint32 reslo; + uint64 res; unsigned char b1, b2, b3, b4, b5, b6, b7, b8; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 7) caml_array_bound_error(); + if (idx < 0 || idx + 7 >= caml_string_length(str)) caml_array_bound_error(); b1 = Byte_u(str, idx); b2 = Byte_u(str, idx + 1); b3 = Byte_u(str, idx + 2); @@ -119,13 +114,17 @@ CAMLprim value caml_string_get64(value str, value index) b7 = Byte_u(str, idx + 6); b8 = Byte_u(str, idx + 7); #ifdef ARCH_BIG_ENDIAN - reshi = b1 << 24 | b2 << 16 | b3 << 8 | b4; - reslo = b5 << 24 | b6 << 16 | b7 << 8 | b8; + res = (uint64) b1 << 56 | (uint64) b2 << 48 + | (uint64) b3 << 40 | (uint64) b4 << 32 + | (uint64) b5 << 24 | (uint64) b6 << 16 + | (uint64) b7 << 8 | (uint64) b8; #else - reshi = b8 << 24 | b7 << 16 | b6 << 8 | b5; - reslo = b4 << 24 | b3 << 16 | b2 << 8 | b1; + res = (uint64) b8 << 56 | (uint64) b7 << 48 + | (uint64) b6 << 40 | (uint64) b5 << 32 + | (uint64) b4 << 24 | (uint64) b3 << 16 + | (uint64) b2 << 8 | (uint64) b1; #endif - return caml_copy_int64(I64_literal(reshi,reslo)); + return caml_copy_int64(res); } CAMLprim value caml_string_set16(value str, value index, value newval) @@ -133,7 +132,7 @@ CAMLprim value caml_string_set16(value str, value index, value newval) unsigned char b1, b2; intnat val; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 1) caml_array_bound_error(); + if (idx < 0 || idx + 1 >= caml_string_length(str)) caml_array_bound_error(); val = Long_val(newval); #ifdef ARCH_BIG_ENDIAN b1 = 0xFF & val >> 8; @@ -152,7 +151,7 @@ CAMLprim value caml_string_set32(value str, value index, value newval) unsigned char b1, b2, b3, b4; intnat val; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 3) caml_array_bound_error(); + if (idx < 0 || idx + 3 >= caml_string_length(str)) caml_array_bound_error(); val = Int32_val(newval); #ifdef ARCH_BIG_ENDIAN b1 = 0xFF & val >> 24; @@ -175,30 +174,28 @@ CAMLprim value caml_string_set32(value str, value index, value newval) CAMLprim value caml_string_set64(value str, value index, value newval) { unsigned char b1, b2, b3, b4, b5, b6, b7, b8; - uint32 lo,hi; int64 val; intnat idx = Long_val(index); - if (idx < 0 || idx >= caml_string_length(str) - 7) caml_array_bound_error(); + if (idx < 0 || idx + 7 >= caml_string_length(str)) caml_array_bound_error(); val = Int64_val(newval); - I64_split(val,hi,lo); #ifdef ARCH_BIG_ENDIAN - b1 = 0xFF & hi >> 24; - b2 = 0xFF & hi >> 16; - b3 = 0xFF & hi >> 8; - b4 = 0xFF & hi; - b5 = 0xFF & lo >> 24; - b6 = 0xFF & lo >> 16; - b7 = 0xFF & lo >> 8; - b8 = 0xFF & lo; + b1 = 0xFF & val >> 56; + b2 = 0xFF & val >> 48; + b3 = 0xFF & val >> 40; + b4 = 0xFF & val >> 32; + b5 = 0xFF & val >> 24; + b6 = 0xFF & val >> 16; + b7 = 0xFF & val >> 8; + b8 = 0xFF & val; #else - b8 = 0xFF & hi >> 24; - b7 = 0xFF & hi >> 16; - b6 = 0xFF & hi >> 8; - b5 = 0xFF & hi; - b4 = 0xFF & lo >> 24; - b3 = 0xFF & lo >> 16; - b2 = 0xFF & lo >> 8; - b1 = 0xFF & lo; + b8 = 0xFF & val >> 56; + b7 = 0xFF & val >> 48; + b6 = 0xFF & val >> 40; + b5 = 0xFF & val >> 32; + b4 = 0xFF & val >> 24; + b3 = 0xFF & val >> 16; + b2 = 0xFF & val >> 8; + b1 = 0xFF & val; #endif Byte_u(str, idx) = b1; Byte_u(str, idx + 1) = b2; @@ -299,3 +296,68 @@ CAMLprim value caml_bitvect_test(value bv, value n) int pos = Int_val(n); return Val_int(Byte_u(bv, pos >> 3) & (1 << (pos & 7))); } + +CAMLexport value caml_alloc_sprintf(const char * format, ...) +{ + va_list args; + char buf[64]; + int n; + value res; + +#ifndef _WIN32 + /* C99-compliant implementation */ + va_start(args, format); + /* "vsnprintf(dest, sz, format, args)" writes at most "sz" characters + into "dest", including the terminating '\0'. + It returns the number of characters of the formatted string, + excluding the terminating '\0'. */ + n = vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + /* Allocate a Caml string with length "n" as computed by vsnprintf. */ + res = caml_alloc_string(n); + if (n < sizeof(buf)) { + /* All output characters were written to buf, including the + terminating '\0'. Just copy them to the result. */ + memcpy(String_val(res), buf, n); + } else { + /* Re-do the formatting, outputting directly in the Caml string. + Note that caml_alloc_string left room for a '\0' at position n, + so the size passed to vsnprintf is n+1. */ + va_start(args, format); + vsnprintf(String_val(res), n + 1, format, args); + va_end(args); + } + return res; +#else + /* Implementation specific to the Microsoft CRT library */ + va_start(args, format); + /* "_vsnprintf(dest, sz, format, args)" writes at most "sz" characters + into "dest". Let "len" be the number of characters of the formatted + string. + If "len" < "sz", a null terminator was appended, and "len" is returned. + If "len" == "sz", no null termination, and "len" is returned. + If "len" > "sz", a negative value is returned. */ + n = _vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + if (n >= 0 && n <= sizeof(buf)) { + /* All output characters were written to buf. + "n" is the actual length of the output. + Copy the characters to a Caml string of length n. */ + res = caml_alloc_string(n); + memcpy(String_val(res), buf, n); + } else { + /* Determine actual length of output, excluding final '\0' */ + va_start(args, format); + n = _vscprintf(format, args); + va_end(args); + res = caml_alloc_string(n); + /* Re-do the formatting, outputting directly in the Caml string. + Note that caml_alloc_string left room for a '\0' at position n, + so the size passed to _vsnprintf is n+1. */ + va_start(args, format); + _vsnprintf(String_val(res), n + 1, format, args); + va_end(args); + } + return res; +#endif +} diff --git a/byterun/sys.c b/byterun/sys.c index 332887b1..03ca1e3e 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -125,8 +125,7 @@ CAMLprim value caml_sys_open(value path, value vflags, value vperm) int fd, flags, perm; char * p; - p = caml_stat_alloc(caml_string_length(path) + 1); - strcpy(p, String_val(path)); + p = caml_strdup(String_val(path)); flags = caml_convert_flag_list(vflags, sys_open_flags); perm = Int_val(vperm); /* open on a named FIFO can block (PR#1533) */ @@ -145,46 +144,107 @@ CAMLprim value caml_sys_open(value path, value vflags, value vperm) CAMLprim value caml_sys_close(value fd) { + caml_enter_blocking_section(); close(Int_val(fd)); + caml_leave_blocking_section(); return Val_unit; } CAMLprim value caml_sys_file_exists(value name) { +#ifdef _WIN32 + struct _stati64 st; +#else struct stat st; - return Val_bool(stat(String_val(name), &st) == 0); +#endif + char * p; + int ret; + + p = caml_strdup(String_val(name)); + caml_enter_blocking_section(); +#ifdef _WIN32 + ret = _stati64(p, &st); +#else + ret = stat(p, &st); +#endif + caml_leave_blocking_section(); + caml_stat_free(p); + + return Val_bool(ret == 0); } CAMLprim value caml_sys_is_directory(value name) { + CAMLparam1(name); +#ifdef _WIN32 + struct _stati64 st; +#else struct stat st; - if (stat(String_val(name), &st) == -1) caml_sys_error(name); +#endif + char * p; + int ret; + + p = caml_strdup(String_val(name)); + caml_enter_blocking_section(); +#ifdef _WIN32 + ret = _stati64(p, &st); +#else + ret = stat(p, &st); +#endif + caml_leave_blocking_section(); + caml_stat_free(p); + + if (ret == -1) caml_sys_error(name); #ifdef S_ISDIR - return Val_bool(S_ISDIR(st.st_mode)); + CAMLreturn(Val_bool(S_ISDIR(st.st_mode))); #else - return Val_bool(st.st_mode & S_IFDIR); + CAMLreturn(Val_bool(st.st_mode & S_IFDIR)); #endif } CAMLprim value caml_sys_remove(value name) { + CAMLparam1(name); + char * p; int ret; - ret = unlink(String_val(name)); + p = caml_strdup(String_val(name)); + caml_enter_blocking_section(); + ret = unlink(p); + caml_leave_blocking_section(); + caml_stat_free(p); if (ret != 0) caml_sys_error(name); - return Val_unit; + CAMLreturn(Val_unit); } CAMLprim value caml_sys_rename(value oldname, value newname) { - if (rename(String_val(oldname), String_val(newname)) != 0) + char * p_old; + char * p_new; + int ret; + p_old = caml_strdup(String_val(oldname)); + p_new = caml_strdup(String_val(newname)); + caml_enter_blocking_section(); + ret = rename(p_old, p_new); + caml_leave_blocking_section(); + caml_stat_free(p_new); + caml_stat_free(p_old); + if (ret != 0) caml_sys_error(NO_ARG); return Val_unit; } CAMLprim value caml_sys_chdir(value dirname) { - if (chdir(String_val(dirname)) != 0) caml_sys_error(dirname); - return Val_unit; + CAMLparam1(dirname); + char * p; + int ret; + p = caml_strdup(String_val(dirname)); + caml_enter_blocking_section(); + ret = chdir(p); + caml_leave_blocking_section(); + caml_stat_free(p); + if (ret != 0) caml_sys_error(dirname); + CAMLreturn(Val_unit); } CAMLprim value caml_sys_getcwd(value unit) @@ -244,11 +304,8 @@ CAMLprim value caml_sys_system_command(value command) CAMLparam1 (command); int status, retcode; char *buf; - intnat len; - len = caml_string_length (command); - buf = caml_stat_alloc (len + 1); - memmove (buf, String_val (command), len + 1); + buf = caml_strdup(String_val(command)); caml_enter_blocking_section (); status = system(buf); caml_leave_blocking_section (); @@ -385,9 +442,16 @@ CAMLprim value caml_sys_read_directory(value path) CAMLparam1(path); CAMLlocal1(result); struct ext_table tbl; + char * p; + int ret; caml_ext_table_init(&tbl, 50); - if (caml_read_directory(String_val(path), &tbl) == -1){ + p = caml_strdup(String_val(path)); + caml_enter_blocking_section(); + ret = caml_read_directory(p, &tbl); + caml_leave_blocking_section(); + caml_stat_free(p); + if (ret == -1){ caml_ext_table_free(&tbl, 1); caml_sys_error(path); } diff --git a/byterun/unix.c b/byterun/unix.c index 3fee9a39..be2c39b1 100644 --- a/byterun/unix.c +++ b/byterun/unix.c @@ -49,11 +49,10 @@ char * caml_decompose_path(struct ext_table * tbl, char * path) { char * p, * q; - int n; + size_t n; if (path == NULL) return NULL; - p = caml_stat_alloc(strlen(path) + 1); - strcpy(p, path); + p = caml_strdup(path); q = p; while (1) { for (n = 0; q[n] != 0 && q[n] != ':'; n++) /*nothing*/; @@ -68,7 +67,7 @@ char * caml_decompose_path(struct ext_table * tbl, char * path) char * caml_search_in_path(struct ext_table * path, char * name) { - char * p, * fullname; + char * p, * dir, * fullname; int i; struct stat st; @@ -76,18 +75,15 @@ char * caml_search_in_path(struct ext_table * path, char * name) if (*p == '/') goto not_found; } for (i = 0; i < path->size; i++) { - fullname = caml_stat_alloc(strlen((char *)(path->contents[i])) + - strlen(name) + 2); - strcpy(fullname, (char *)(path->contents[i])); - if (fullname[0] != 0) strcat(fullname, "/"); - strcat(fullname, name); - if (stat(fullname, &st) == 0 && S_ISREG(st.st_mode)) return fullname; + dir = path->contents[i]; + if (dir[0] == 0) dir = "."; /* empty path component = current dir */ + fullname = caml_strconcat(3, dir, "/", name); + if (stat(fullname, &st) == 0 && S_ISREG(st.st_mode)) + return fullname; caml_stat_free(fullname); } not_found: - fullname = caml_stat_alloc(strlen(name) + 1); - strcpy(fullname, name); - return fullname; + return caml_strdup(name); } #ifdef __CYGWIN32__ @@ -107,31 +103,28 @@ static int cygwin_file_exists(char * name) static char * cygwin_search_exe_in_path(struct ext_table * path, char * name) { - char * p, * fullname; + char * p, * dir, * fullname; int i; for (p = name; *p != 0; p++) { if (*p == '/' || *p == '\\') goto not_found; } for (i = 0; i < path->size; i++) { - fullname = caml_stat_alloc(strlen((char *)(path->contents[i])) + - strlen(name) + 6); - strcpy(fullname, (char *)(path->contents[i])); - strcat(fullname, "/"); - strcat(fullname, name); + dir = path->contents[i]; + if (dir[0] == 0) dir = "."; /* empty path component = current dir */ + fullname = caml_strconcat(3, dir, "/", name); if (cygwin_file_exists(fullname)) return fullname; - strcat(fullname, ".exe"); + caml_stat_free(fullname); + fullname = caml_strconcat(4, dir, "/", name, ".exe"); if (cygwin_file_exists(fullname)) return fullname; caml_stat_free(fullname); } not_found: - fullname = caml_stat_alloc(strlen(name) + 5); - strcpy(fullname, name); - if (cygwin_file_exists(fullname)) return fullname; - strcat(fullname, ".exe"); + if (cygwin_file_exists(name)) return caml_strdup(name); + fullname = caml_strconcat(2, name, ".exe"); if (cygwin_file_exists(fullname)) return fullname; - strcpy(fullname, name); - return fullname; + caml_stat_free(fullname); + return caml_strdup(name); } #endif @@ -156,10 +149,10 @@ char * caml_search_exe_in_path(char * name) char * caml_search_dll_in_path(struct ext_table * path, char * name) { - char * dllname = caml_stat_alloc(strlen(name) + 4); + char * dllname; char * res; - strcpy(dllname, name); - strcat(dllname, ".so"); + + dllname = caml_strconcat(2, name, ".so"); res = caml_search_in_path(path, dllname); caml_stat_free(dllname); return res; @@ -286,7 +279,6 @@ int caml_read_directory(char * dirname, struct ext_table * contents) #else struct direct * e; #endif - char * p; d = opendir(dirname); if (d == NULL) return -1; @@ -294,9 +286,7 @@ int caml_read_directory(char * dirname, struct ext_table * contents) e = readdir(d); if (e == NULL) break; if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0) continue; - p = caml_stat_alloc(strlen(e->d_name) + 1); - strcpy(p, e->d_name); - caml_ext_table_add(contents, p); + caml_ext_table_add(contents, caml_strdup(e->d_name)); } closedir(d); return 0; @@ -321,4 +311,11 @@ int caml_executable_name(char * name, int name_len) return 0; } +#else + +int caml_executable_name(char * name, int name_len) +{ + return -1; +} + #endif diff --git a/byterun/win32.c b/byterun/win32.c index d807f690..67e96832 100644 --- a/byterun/win32.c +++ b/byterun/win32.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -43,8 +44,7 @@ char * caml_decompose_path(struct ext_table * tbl, char * path) int n; if (path == NULL) return NULL; - p = caml_stat_alloc(strlen(path) + 1); - strcpy(p, path); + p = caml_strdup(path); q = p; while (1) { for (n = 0; q[n] != 0 && q[n] != ';'; n++) /*nothing*/; @@ -59,7 +59,7 @@ char * caml_decompose_path(struct ext_table * tbl, char * path) char * caml_search_in_path(struct ext_table * path, char * name) { - char * p, * fullname; + char * p, * dir, * fullname; int i; struct stat st; @@ -67,56 +67,55 @@ char * caml_search_in_path(struct ext_table * path, char * name) if (*p == '/' || *p == '\\') goto not_found; } for (i = 0; i < path->size; i++) { - fullname = caml_stat_alloc(strlen((char *)(path->contents[i])) + - strlen(name) + 2); - strcpy(fullname, (char *)(path->contents[i])); - strcat(fullname, "\\"); - strcat(fullname, name); + dir = path->contents[i]; + if (dir[0] == 0) continue; + /* not sure what empty path components mean under Windows */ + fullname = caml_strconcat(3, dir, "\\", name); caml_gc_message(0x100, "Searching %s\n", (uintnat) fullname); - if (stat(fullname, &st) == 0 && S_ISREG(st.st_mode)) return fullname; + if (stat(fullname, &st) == 0 && S_ISREG(st.st_mode)) + return fullname; caml_stat_free(fullname); } not_found: caml_gc_message(0x100, "%s not found in search path\n", (uintnat) name); - fullname = caml_stat_alloc(strlen(name) + 1); - strcpy(fullname, name); - return fullname; + return caml_strdup(name); } CAMLexport char * caml_search_exe_in_path(char * name) { char * fullname, * filepart; - DWORD pathlen, retcode; + size_t fullnamelen; + DWORD retcode; - pathlen = strlen(name) + 1; - if (pathlen < 256) pathlen = 256; + fullnamelen = strlen(name) + 1; + if (fullnamelen < 256) fullnamelen = 256; while (1) { - fullname = caml_stat_alloc(pathlen); + fullname = caml_stat_alloc(fullnamelen); retcode = SearchPath(NULL, /* use system search path */ name, ".exe", /* add .exe extension if needed */ - pathlen, + fullnamelen, fullname, &filepart); if (retcode == 0) { caml_gc_message(0x100, "%s not found in search path\n", (uintnat) name); - strcpy(fullname, name); - break; + caml_stat_free(fullname); + return caml_strdup(name); } - if (retcode < pathlen) break; + if (retcode < fullnamelen) + return fullname; caml_stat_free(fullname); - pathlen = retcode + 1; + fullnamelen = retcode + 1; } - return fullname; } char * caml_search_dll_in_path(struct ext_table * path, char * name) { - char * dllname = caml_stat_alloc(strlen(name) + 5); + char * dllname; char * res; - strcpy(dllname, name); - strcat(dllname, ".dll"); + + dllname = caml_strconcat(2, name, ".dll"); res = caml_search_in_path(path, dllname); caml_stat_free(dllname); return res; @@ -235,27 +234,27 @@ static void expand_argument(char * arg) static void expand_pattern(char * pat) { + char * prefix, * p, * name; int handle; struct _finddata_t ffblk; - int preflen; + size_t i; handle = _findfirst(pat, &ffblk); if (handle == -1) { store_argument(pat); /* a la Bourne shell */ return; } - for (preflen = strlen(pat); preflen > 0; preflen--) { - char c = pat[preflen - 1]; - if (c == '\\' || c == '/' || c == ':') break; + prefix = caml_strdup(pat); + for (i = strlen(prefix); i > 0; i--) { + char c = prefix[i - 1]; + if (c == '\\' || c == '/' || c == ':') { prefix[i] = 0; break; } } do { - char * name = malloc(preflen + strlen(ffblk.name) + 1); - if (name == NULL) out_of_memory(); - memcpy(name, pat, preflen); - strcpy(name + preflen, ffblk.name); + name = caml_strconcat(2, prefix, ffblk.name); store_argument(name); } while (_findnext(handle, &ffblk) != -1); _findclose(handle); + caml_stat_free(prefix); } @@ -278,7 +277,7 @@ CAMLexport void caml_expand_command_line(int * argcp, char *** argvp) int caml_read_directory(char * dirname, struct ext_table * contents) { - int dirnamelen; + size_t dirnamelen; char * template; #if _MSC_VER <= 1200 int h; @@ -286,28 +285,27 @@ int caml_read_directory(char * dirname, struct ext_table * contents) intptr_t h; #endif struct _finddata_t fileinfo; - char * p; dirnamelen = strlen(dirname); - template = caml_stat_alloc(dirnamelen + 5); - strcpy(template, dirname); - switch (dirname[dirnamelen - 1]) { - case '/': case '\\': case ':': - strcat(template, "*.*"); break; - default: - strcat(template, "\\*.*"); - } + if (dirnamelen > 0 && + (dirname[dirnamelen - 1] == '/' + || dirname[dirnamelen - 1] == '\\' + || dirname[dirnamelen - 1] == ':')) + template = caml_strconcat(2, dirname, "*.*"); + else + template = caml_strconcat(2, dirname, "\\*.*"); h = _findfirst(template, &fileinfo); - caml_stat_free(template); - if (h == -1) return errno == ENOENT ? 0 : -1; + if (h == -1) { + caml_stat_free(template); + return errno == ENOENT ? 0 : -1; + } do { if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) { - p = caml_stat_alloc(strlen(fileinfo.name) + 1); - strcpy(p, fileinfo.name); - caml_ext_table_add(contents, p); + caml_ext_table_add(contents, caml_strdup(fileinfo.name)); } } while (_findnext(h, &fileinfo) == 0); _findclose(h); + caml_stat_free(template); return 0; } @@ -502,3 +500,42 @@ void caml_install_invalid_parameter_handler() } #endif + + +/* Recover executable name */ + +int caml_executable_name(char * name, int name_len) +{ + int retcode; + + int ret = GetModuleFileName(NULL, name, name_len); + if (0 == ret || ret >= name_len) return -1; + return 0; +} + +/* snprintf emulation */ + +int caml_snprintf(char * buf, size_t size, const char * format, ...) +{ + int len; + va_list args; + + if (size > 0) { + va_start(args, format); + len = _vsnprintf(buf, size, format, args); + va_end(args); + if (len >= 0 && len < size) { + /* [len] characters were stored in [buf], + a null-terminator was appended. */ + return len; + } + /* [size] characters were stored in [buf], without null termination. + Put a null terminator, truncating the output. */ + buf[size - 1] = 0; + } + /* Compute the actual length of output, excluding null terminator */ + va_start(args, format); + len = _vscprintf(format, args); + va_end(args); + return len; +} diff --git a/camlp4/.ignore b/camlp4/.ignore deleted file mode 100644 index 481c691a..00000000 --- a/camlp4/.ignore +++ /dev/null @@ -1,2 +0,0 @@ -.cache-status -*.tmp.ml diff --git a/camlp4/CHANGES b/camlp4/CHANGES deleted file mode 100644 index 0251cd16..00000000 --- a/camlp4/CHANGES +++ /dev/null @@ -1,898 +0,0 @@ -- [...] - In the revised syntax of parsers the "?" is now a "??" like in the orignal - syntax to not conflict with optional labels. - -- [29 Jun 05] Add private row types. Make "private" a type constructor - "TyPrv" rather than a flag. (Jacques) - -- [09 Jun 04] Moved "-no_quot" option from pa_o to camlp4, enabling to - use it indepently fom pa_o.cmo. - -- [17 Nov 04] Renamed "loc" into "_loc", introducing an incompatibility - with existing code (3.08.x and before). Such code can generally run - unmodified using the -loc option (camlp4 -loc "loc"). - -Camlp4 Version 3.08.2 ------------------------- -- [07 Oct 04] Changes in the interfaces plexer.mli and pcaml.mli: - - plexer.mli: introduced a new lexer building function `make_lexer', - similar to `gmake', but returning a triple of references in addition - (holding respectively the character number of the beginning of the - current line, the current line number and the name of the file being - parsed). - - pcaml.mli: a new value `position'. A global reference to a triple like - the one mentioned above. -- [07 Sep 04] Camlp4 grammars `error recovery mode' now issues a warning - when used (but this warning is disabled by default). - -Camlp4 Version 3.08.[01] ------------------------- -- [05 Jul 04] creation of the `unmaintained' directory: - pa_format, pa_lefteval, pa_ocamllex, pa_olabl, pa_scheme and pa_sml - go there, each in its own subdir. Currently, they compile fine. -- [05 Jul 04] pa_ifdef, subsumed by pa_macro since 3.07, prints a warning - when loaded, encouraging use of pa_macro. -- [01 July 04] profiled versions of Camlp4 libs are *NOT* installed - by default (not even built). To build and install them, uncomment - the line PROFILING=prof in camlp4/config/Makefile.tpl, and then - make opt.opt && make install -- [22-23 June 04] `make install' now installs also pa_[or].cmx, pa_[or]p.cmx, - pa_[or]_fast.cmx, and odyl.cmx -- [12 may 04] Added to the camlp4 tools the -version option that prints - the version number, in the same way as the other ocaml tools. -- [12 may 04] Locations are now handled as in OCaml. The main benefit - is that line numbers are now correct in error messages. However, this - slightly changes the interface of a few Camlp4 modules (see ICHANGES). - ** Warning: Some contribs of the camlp4 distribution are broken because - of this change. In particular the scheme/lisp syntaxes. -- [20 nov 03] Illegal escape sequences in strings now issue a warning. - -Camlp4 Version 3.07 -___________________ - -- [29 Sep 03] Camlp4 code now licensed under the LGPL minus clause 6. -- [09 Sep 03] Added tokens LABEL and OPTLABEL in plexer, and use them in - both parsers (ocaml and revised). There was, afaik, no other way to fix - ambiguities (bugs) in parsing labels and type constraints. - -Camlp4 Version 3.07 beta1 -________________________ - -- [July 03] Updated the ocaml/camlp4 CVS tree with the camlp4 - "parallel" CVS tree, which becomes obsolete from now on. - Added support for recursive modules, private data constructors, and - new syntaxes for integers (int32, nativeint, ...). - -Camlp4 Version 3.06++ ------------------------ - -- [02 Dec 02] In AST predefined quotation, changed antiquotations for - "rec", "mutable": now all are with coercion "opt": $opt:...$ (instead - of "rec" and "mut"). Added antiquotation for "private". Cleaned up - the entries for "methods" and for labelled and optional parameters. -- [29 Nov 02] Removed all "extract_crc" stuff no more necessary with - the new interface of Dynlink. -- [26 Nov 02] Added ability to use "#use" directives in compiled files. -- [21 Nov 02] Changed Scheme syntax for directives: now, e.g. #load "file" - is written: # (load "file"). Added directives in "implem", "interf" and - "use" directive. -- [20 Nov 02] Added Grammar.glexer returning the lexer used by a - grammar. Also added a field in Token.glexer type to ask lexers to - record the locations of the comments. -- [04 Nov 02] Added option -no_quot with normal syntax (pa_o.cmo): - don't parse quotations (it allows to use e.g. <:> as a valid token). -- [31 Oct 02] Added pa_macro.cmo (to replace pa_ifdef.cmo which is - kept for compatibility, but deprecated). The extended statements - allow de definitions of macros and conditional compilation like - in C. -- [29 Oct 02] Changed pretty printers of the three main syntaxes: if - the locations of input are not correct, do no more raise End_of_file - when displaying the inter-phrases (return: the input found up to eof - if not empty, otherwise the value of the -sep parameter if not empty, - otherwise the string "\n"). -- [25 Oct 02] Added option -records in pa_sml.cmo: generates normal - OCaml records instead of objects (the user must be sure that there - are no names conflicts). -- [22 Oct 02] Added Plexer.specific_space_dot: when set to "true", the - next call to Plexer.gmake returns a lexer where the dot preceded by - spaces (space, tab, newline, etc.) return a different token than when - not preceded by spaces. -- [19 Oct 02] Added printer in Scheme syntax: pr_scheme.cmo and the - extension pr_schemep.cmo which rebuilts parsers. -- [15 Oct 02] Now, in case of syntax error, the real input file name is - displayed (can be different from the input file, because of the possibility - of line directives, typically generated by /lib/cpp). - Changed interface of Stdpp.line_of_loc: now return also a string: the name - of the real input file name. -- [14 Oct 02] Fixed bug in normal syntax (pa_o.cmo): the constructors - with currification of parameters (C x y) were accepted. -- [14 Oct 02] Fixed many problems of make under Windows (in particular if - installations directories contain spaces). -- [11 Oct 02] In ocaml syntax (pa_o.cmo), fixed 3 bugs (or incompatibilities - with the ocaml yacc version of the compiler): 1/ "ref new foo" was - interpreted as "ref;; new foo" instead of "ref (new foo)" 2/ unary - minuses did not work correctly (nor in quotation of syntax trees), in - particular "-0.0" 3/ "begin end" was a syntax error, instead of being "()". -- [Sep-Oct 02] Many changes and improvements in Scheme syntax. -- [07 Oct 02] Added definition of Pcaml.type_declaration which is - now visible in the interface, allowing to change the type declarations. -- [07 Oct 02] Added Pcaml.syntax_name to allow syntax extensions to test - it and take different decision. In revised syntax, its value is "Revised", - in normal syntax "OCaml" and in Scheme syntax "Scheme". -- [03 Oct 02] Added lexing of '\xHH' where HH is hexadecimal number. -- [01 Oct 02] In normal syntax (camlp4o), fixed problem of lexing - comment: (* bleble'''*) -- [23 Sep 02] Fixed bug: input "0x" raised Failure "int_of_string" - without location (syntaxes pa_o and pa_r). -- [14 Sep 02] Added functions Grammar.iter_entry and Grammar.fold_entry - to iterate a grammar entry and transitively all the entries it calls. -- [12 Sep 02] Added "Pcaml.rename_id", a hook to allow parsers to give - ability to rename their identifiers. Called in Scheme syntax (pa_scheme.ml) - when generating its identifiers. -- [09 Sep 02] Fixed bug under toplevel, the command: - !Toploop.parse_toplevel_phrase (Lexing.from_buff "1;;");; - failed "End_of_file". -- [06 Sep 02] Added "Pcaml.string_of". Combined with Pcaml.pr_expr, - Pcaml.pr_patt, and so on, allow to pretty print syntax trees in string. - E.g. in the toplevel: - # #load "pr_o.cmo"; - # Pcaml.string_of Pcaml.pr_expr <:expr< let x = 3 in x + 2 >>;; - - : string = "let x = 3 in x + 2" - -Camlp4 Version 3.06 --------------------- - -- [24 Jul 02] Added Scheme syntax: pa_scheme.ml, camlp4sch.cma (toplevel), - camlp4sch (command). - -Camlp4 Version 3.05 ------------------------ - -- [12 Jul 02] Better treatment of comments in option -cip (add comments - in phrases) for both printers pr_o.cmo (normal syntax) and pr_r.cmo - (revised syntax); added comments before let binding and class - structure items; treat comments inside sum and record type definitions; - the option -tc is now deprecated and equivalent to -cip. -- [13 Jun 02] Added pa_lefteval.cmo: add let..in expressions to guarantee - left evaluation of functions parameters, t-uples, and so on (instead of - the default non-specified-but-in-fact-right-to-left evaluation). -- [06 Jun 02] Changed revised syntax (pa_r) of variants types definition; - (Jacques Garrigue's idea): - old syntax new syntax - [| ... |] [ = ... ] - [| < ... |] [ < ... ] - [| > ... |] [ > ... ] - This applies also in predefined quotations of syntax tree for types - <:ctyp< ... >> -- [05 Jun 02] Added option -ss in pr_o.cmo: print with double semicolons; - and the option -no_ss is now by default. -- [30 May 02] Improved SML syntax (pa_sml). -- [30 May 02] Changed the AST for the "with module" construct (was with - type "module_type"; changed into type "module_expr"). -- [26 May 02] Added missing abstract module types. -- [21 Apr 02] Added polymorphic types for polymorphic methods: - revised syntax (example): ! 'a 'b . type - ctyp quotation: <:ctyp< ! $list:pl$ . $t$ >> -- [17 Apr 02] Fixed bug: in normal syntax (pa_o.cmo) made a parse error on - the "dot" on (in interface file file): - class c : a * B.c -> object val x : int end -- [03 Apr 02] Fixed bug: (* "(*" *) resulted in "comment not terminated". -- [03 Apr 02] Fixed incompatibility with ocaml: ''' and '"' must be - displayed as '\'' and '\"' in normal syntax printer (pr_o.cmo). -- [03 Apr 02] When there are several tokens parsed together (locally LL(n)), - the location error now highlights all tokens, resulting in a more clear - error message (e.g. "for i let" would display "illegal begin of expr" - and highlight the 3 tokens, not just "for"). -- [30 Mar 02] Added pa_extfold.cmo extending pa_extend.cmo by grammar - symbols FOLD0 and FOLD1. Work like LIST0 and LIST1 but have two initial - parameters: a function of type 'a -> 'b -> 'b doing the fold and an - initial value of type 'b. Actually, LIST0 now is like - FOLD0 (fun x y -> x :: y) [] - with an reverse of the resulting list. -- [20 Mar 02] Fixed problem: when running a toplevel linked with camlp4 - as a script, the camlp4 welcome message was displayed. -- [14 Mar 02] The configure shell and the program now test the consistency - of OCaml and Camlp4. Therefore 1/ if trying to compile this version with - an incompatible OCaml version or 2/ trying to run an installed Camlp4 with - a incompatible OCaml version: in both cases, camlp4 fails. -- [14 Mar 02] When make opt.opt is done, the very fast version is made for - the normal syntax ("compiled" version). The installed camlp4o.opt is that - version. -- [05 Mar 02] Changed the conversion to OCaml syntax tree for <:expr< x.val >> - and <:expr< x.val := e >> which generates now the tree of !x and x := e, - no more x.contents and x.contents <- e. This change was necessary because - of a problem if a record has been defined with a field named "contents". - -- [16 Feb 02] Changed interface of grammars: the token type is now - customizable, using a new lexer type Token.glexer, parametrized by - the token type, and a new functor GMake. This was accompanied by - some cleanup. Become deprecated: the type Token.lexer (use Token.glexer), - Grammar.create (use Grammar.gcreate), Unsafe.reinit_gram (use - Unsafe.gram_reinit), the functor Grammar.Make (use Grammar.GMake). - Deprecated means that they are kept during some versions and removed - afterwards. -- [06 Feb 02] Added missing infix "%" in pa_o (normal syntax). -- [06 Feb 02] Added Grammar.print_entry printing any kind of (obj) entry - and having the Format.formatter as first parameter (Grammar.Entry.print - and its equivalent in functorial interface call it). -- [05 Feb 02] Added a flag Plexer.no_quotations. When set to True, the - quotations are no more lexed in all lexers built by Plexer.make () -- [05 Feb 02] Changed the printing of options so that the option -help - aligns correctly their documentation. One can use now Pcaml.add_option - without having to calculate that. -- [05 Feb 02] pr_r.cmo: now the option -ncip (no comments in phrases) is - by default, because its behaviour is not 100% sure. An option -cip has - been added to set it. -- [03 Feb 02] Added function Stdpp.line_of_loc returning the line and - columns positions from a character location and a file. -- [01 Feb 02] Fixed bug in token.ml: the location function provided by - lexer_func_of_parser, lexer_func_of_ocamllex and make_stream_and_location - could raise Invalid_argument "Array.make" for big files if the number - of read tokens overflows the maximum arrays size (Sys.max_array_length). - The bug is not really fixed: in case of this overflow, the returned - location is (0, 0) (but the program does not fail). -- [28 Jan 02] Fixed bug in pa_o when parsing class_types. A horrible hack - had to be programmed to be able to treat them correctly. -- [28 Jan 02] Fixed bug in OCaml toplevel when loading camlp4: the directives - were not applied in the good order. -- [26 Jan 02] The printer pr_extend.cmo try now also to rebuild GEXTEND - statements (before it tried only the EXTEND). -- [23 Jan 02] The empty functional stream "fstream [: :]" is now of type - 'a Fstream.t thanks to the new implementation of lazies allowing to - create polymorphic lazy values. -- [11 Jan 02] Added a test in grammars using Plexer that a keyword is not - used also as parameter of a LIDENT or a UIDENT. -- [04 Jan 02] Fixed bug in pa_sml (SML syntax): the function definitions - with several currified parameters did not work. It works now, but the - previous code was supposed to treat let ("fun" in SML syntax) definitions - of infix operators, what does not work any more now. -- [04 Jan 02] Alain Frisch's contribution: - Added pa_ocamllex.cma, syntax for ocamllex files. The command: - camlp4 pa_ocamllex.cmo pr_o.cmo -ocamllex -impl foo.mll > foo.ml - does the same thing as: - ocamllex foo.mll - Allow to compile directly mll files. Without option -ocamllex, allow - to insert lex rules in a ml file. -- [29 Dec 01] Added variable "inter_phrases" in Pcaml, of type ref (option - string) to specify the string to print between phrases in pretty printers. - The default is None, meaning to copy the inter phrases from the source - file. - -Camlp4 Version 3.04 -------------------- - -- [07 Dec 01] Added Pcaml.parse_interf and Pcaml.parse_implem, hooks to - specify the parsers tof use, i.e. now can use other parsing technics - than the Camlp4 grammar system. -- [27 Nov 01] Fixed functions Token.eval_char and Token.eval_string which - returned bad values, resulting lexing of backslash sequences incompatible - with OCaml (e.g. "\1" returned "\001" (one character) but OCaml returns - the string of the two characters \ and 1). -- [15 Nov 01] In revised syntax, in let binding in sequences, the "in" - can be replaced by a semicolon; the revised syntax printer pr_r.cmo - now rather prints a semicolon there. -- [07 Nov 01] Added the ability to use $ as token: was impossible so far, - because of AST quotation uses it for its antiquotation. The fix is just - a little (invisible) change in Plexer. -- [05 Nov 01] Added option -tc (types comment) when using pr_o or pr_r - try to print comments inside sum and record types like they are in - the source (not by default, because may work incorrectly). -- [05 Nov 01] Added option -ca (comment after) when using pr_o or pr_r: - print ocamldoc comments after the declarations, when they are before. -- [04 Nov 01] Added locations for variants and labels declarations in AST - (file MLast.mli). -- [03 Nov 01] In pretty printers pr_o and pr_r, skip to next begin of line - when displaying the sources between phrase, to prevent e.g. the displaying - of the possible last comment of a sum type declaration (the other comment - being not displayed anyway). -- [24 Oct 01] Fixed incorrect locations in sequences. -- [24 Oct 01] Was erroneously compiled by the OCaml boot compiler instead - of the generated ocamlc. Fixed. -- [15 Oct 01] Fixed some parsing differences between pa_o and ocamlyacc: - in parsers, in labels. -- [12 Oct 01] Added missing bigarray syntax a.{b} (and Cie) in standard - syntax (pa_o). - -Camlp4 Version 3.03 -------------------- - -- [09 Oct 01] Fixed bug: the token !$ did not work. Fixed and completed - some syntaxes of labels patterns. Added missing case in exception - declaration (exception rebinding). -- [05 Oct 01] Fixed bug in normal syntax: when defining a constructor - named "True" of "False" (capitalized, i.e. not like the booleans), it - did not work. -- [04 Oct 01] Fixed some revised and quotation syntaxes in objects classes - and types (cleaner). Cleaned up also several parts of the parsers. -- [02 Oct 01] In revised syntax, the warning for using old syntax for - sequences is now by default. To remove it, the option -no-warn-seq - of camlp4r has been added. Option -warn-seq has been removed. -- [07 Sep 01] Included Camlp4 in OCaml distribution. -- [06 Sep 01] Added missing pattern construction #t -- [05 Sep 01] Fixed bug in pa_o: {A.B.c = d} was refused. -- [26 Aug 01] Fixed bug: in normal and revised syntaxes, refused -1.0 - (minus float) as pattern. -- [24 Aug 01] Fixed bug: (a : b :> c) and ((a : b) :> c) were parsed - identically. -- [20 Aug 01] Fixed configure script for Windows configuration. -- [10 Aug 01] Fixed bug: <:expr< 'a' >> did not work because of a typing - problem. -- [10 Aug 01] Fixed bug in compilation process under Windows: the use of - the extension .exe was missing in several parts in Makefiles and shell - scripts. -- [09 Aug 01] Changed message error in grammar: in the case when the rule - is: ....; tok1; tok2; .. tokn; ... (n terminal tokens following each other), - where the grammar is locally LL(n), it displays now: - tok1 tok2 .. tokn expected - instead of just - tok1 expected - because "tok1" can be correct in the input, and in this case, the message - underscored the tok1 and said "tok1 expected". -- [07 Aug 01] When camlp4r.cma is loaded in the toplevel, the results are - now displayed in revised syntax. -- [04 Aug 01] Added syntax "declare..end" in quotations class_str_item and - class_sig_item to be able to generate several items from one only item - (like in str_item and sig_item). - -Camlp4 Version 3.02 -------------------- - -- [21 Jul 01] Fixed bug: <:expr< { l = x } >> was badly built and resulted - in a typing error. -- [13 Jul 01] Fixed bug: did not accept floats in patterns. -- [11 Jul 01] Added function Pcaml.top_printer to be able to use the - printers Pcaml.pr_expr, Pcaml.pr_patt, and so on for the #install_printer - of OCaml toplevel. Ex: - let f = Pcaml.top_printer Pcaml.pr_expr;; - #install_printer f;; - #load "pr_o.cmo";; -- [24 Jun 01] In grammars, added symbol ANY, returning the current token, - whichever it is. -- [24 Jun 01] In grammars, a rule list of the form [ s1 | s2 | .. | sn ] - is interpreted as [ x = s1 -> x | x = s2 -> x | .. x = sn -> x ] - instead of [ _ = s1 -> () | _ = s2 -> () .. ] -- [24 Jun 01] Moved the functions [Plexer.char_of_char_token] and - [Plexer.string_of_string_token] into module [Token] with names - [Token.eval_char] and [Token.eval_string]. -- [22 Jun 01] Added warning when using old syntax for sequences, while - and do (do..return, do..done) in predefined quotation expr. -- [22 Jun 01] Changed message for unbound quotations (more clear). - -Camlp4 Version 3.01.6: ----------------------- - -- [22 Jun 01] Changed the module Pretty into Spretty. -- [21 Jun 01] Camlp4 can now be compiled even if OCaml is not installed: - in the directory "config", the file "configure_batch" is a possibility - to configure the compilation (alternative of "configure" of the top - directory) and has a parameter "-ocaml-top" to specify the OCaml top - directory (relative to the camlp4/config directory). -- [21 Jun 01] The interactive "configure" now tests if the native-code - compilers ocamlc.opt and ocamlopt.opt are accessible and tell the - Makefile to preferably use them if they are. -- [16 Jun 01] The syntax tree for strings and characters now represent their - exact input representation (the node for characters is now of type string, - no more char). For example, the string "a\098c" remains "a\098c" and is - *not* converted into (the equivalent) "abc" in the syntax tree. The - convertion takes place when converting into OCaml tree representation. - This has the advantage that the pretty print now display them as they - are in the input file. To convert from input to real representation - (if needed), two functions have been added: Plexer.string_of_string_token - and Plexer.char_of_char_token. -- [10 Jun 01] In revised syntax, added ability to write {foo x = y} as short - form for {foo = fun x -> y}. -- [08 Jun 01] Completed missing cases in pa_extfun.cmo for variants. -- [06 Jun 01] Completed missing cases in abstract syntax tree and in normal - syntax parser pa_o.ml (about classes). -- [06 Jun 01] Fixed bug in pa_o.cmo (parser of normal syntax): (~~) did not - work, and actually all prefix operators between parentheses. - -Camlp4 Version 3.01.5: ----------------------- - -- [04 Jun 01] Fixed bug: when using "include" in a structure item the rest - of the structure was lost. -- [31 May 01] Added ability to user #load and #directory inside ml or mli - files to specify a cmo file to be loaded (for syntax extension) or the - directory path (like option -I). Same semantics than in toplevel. -- [29 May 01] The name of the location variable used in grammars (action - parts of the rules) and in the predefined quotations for OCaml syntax - trees is now configurable in Stdpp.loc_name (string reference). Added also - option -loc to set this variable. Default: loc. -- [26 May 01] Added functional streams: a library module Fstream and a syntax - kit: pa_fstream.cmo. Syntax: - streams: fstream [: ... :] - parsers: fparser [ [: ... :] -> ... | ... ] -- [25 May 01] Added function Token.lexer_func_of a little bit more general - than Token.lexer_func_of_parser. - -Camlp4 Version 3.01.4: ----------------------- - -- [20 May 01] Fixed bug: pr_rp and pr_op could generate bound variables - resulting incorrect program: - (e.g. fun s -> parser [: `_; x :] -> s x was printed: - fun s -> parser [: `_; s :] -> s s) -- [19 May 01] Small improvement in pretty.ml resulting a faster print (no - more stacked HOVboxes which printers pr_r and pr_o usually generate in - expr, patt, ctyp, etc.) -- [18 May 01] Added [lexer_func_of_parser] and [lexer_func_of_ocamllex] - in module [Token] to create lexers functions from char stream parsers - or from [ocamllex] lexers. -- [16 May 01] Pretty printing with pr_r.cmo (revised syntax) now keep - comments inside phrases. -- [15 May 01] Changed pretty printing system, using now new extensible - functions of Camlp4. -- [15 May 01] Added library module Extfun for extensible functions, - syntax pa_extfun, and a printer pr_extfun. -- [12 May 01] Fixed bug: missing cases in pr_o and pr_r for in cases of - "for", "while", and some other expressions, when between parentheses. - -Camlp4 Version 3.01.3: ----------------------- - -- [04 May 01] Put back the syntax "do ... return ..." in predefined - quotation "expr", to be able to compile previous programs. Work - only if the quotation is in position of expression, not in pattern. -- [04 May 01] Added lisp syntax pa_lisp.cmo (not terminated). -- [01 May 01] Fixed bug: in toplevel, in case of syntax error in #use, - the display was incorrect: it displayed the input, instead of the - file location. - -Camlp4 Version 3.01.2: ----------------------- - -- [27 Apr 01] Added variable Grammar.error_verbose and option -verbose of - command camlp4 to display more information in case of parsing error. -- [27 Apr 01] Fixed bug: the locations in sequences was not what expected - by OCaml, resulting on bad locations displaying in case of typing error. -- [27 Apr 01] Fixed bug: in normal syntax, the sequence was parsed - of left associative instead of right associative, resulting bad pretty - printing. - -Camlp4 Version 3.01.1: ----------------------- - -- [19 Apr 01] Added missing new feature "include" (structure item). -- [17 Apr 01] Changed revised syntax of sequences. Now: - do { expr1; expr2 ..... ; exprn } - for patt = expr to/downto expr do { expr1; expr2 ..... ; exprn } - while expr do { expr1; expr2 ..... ; exprn } - * If holding a "let ... in", the scope applies up to the end of the sequence. - * The old syntax "do .... return ..." is still accepted. - * In expr quotation, it is *not* accepted. To ensure backward - compatibility, use ifdef NEWSEQ, which answers True from this version. - * The printer pr_r.cmo by default prints with this new syntax. - * To print with old syntax, use option -old_seq. - * To get a warning when using old syntax, use option -warn_seq. - -Camlp4 Version 3.01: --------------------- - -- [5 Mar 01] In pa_o.ml fixed problem, did not parse: - class ['a, 'b] cl a b : ['a, 'b] classtype -- [9 Oct 00] Raise now Stream.Error when parsing with an empty entry (meaning - that the user probably forgot to initialize it). -- [21 Jul 00] Fixed (pr_o.cmo) pb of bad printing of - let (f : unit -> int) = fun () -> 1 -- [10 Jun, 21 Jul 00] Added Pcaml.sync to synchronize after syntax error in - toplevel. -- [24 May 00] Changed the "make opt", returning to what was done in the - previous releases, i.e. just the compilation of the library (6 files). - The native code compilation of "camlp4o" and "camlp4r" are not absolutely - necessary and can create problems in some systems because of too long code. - The drawbacks are more important than the advantages. -- [19 May 00] Changed option -split_gext (when pa_extend.cmo is loaded) into - -split_ext: it applies now also for non functorial grammars (extended by - EXTEND instead of GEXTEND). -- [12 May 00] Fixed problem in pr_rp.cmo and pr_op.cmo: the pretty printing - of the construction "match x with parser" did not work (because of the - type constraint "Stream.t _" added some versions ago). - -Camlp4 Version 3.00: --------------------- - -- [Apr 19, 00] Added "pa_olabl" for labels with old Olabl syntax. -- [Apr 18, 00] Make opt now builds camlp4o.opt and camlp4r.opt -- [Apr 17, 00] Added support for labels and variants. -- [Mar 28, 00] Improved the grammars: now the rules starting with n - terminals are locally LL(n), i.e. if any of the terminal fails, it is - not Error but just Failure. Allows to write the OCaml syntax case: - ( operator ) - ( expr ) - with the problem of "( - )" as: - "("; "-"; ")" - "("; operator; ")" - "("; expr; ")" - after factorization of the "(", the rule "-"; ")" is locally LL(2): it - works for this reason. In the previous implementation, a hack had to be - added for this case. - - To allow this, the interface of "Token" changed. The field "tparse" is - now of type "pattern -> option (Stream.t t -> string)" instead of - "pattern -> Stream.t t -> string". Set it to "None" for standard pattern - parsing (or if you don't know). - -Camlp4 Version 2.04: --------------------- - -- [Nov 23, 99] Changed the module name Config into Oconfig, because of - conflict problem when applications want to link with the module Config of - OCaml. - -Camlp4 Version 2.03: --------------------- - -* pr_depend: - - [Jun 25, 99] Added missing case in "pr_depend.cmo": pattern A.B.C. - - [Jun 5, 99] Fixed in "pr_depend.ml" case expression "Foo.Bar" displaying a - bad dependency with file "bar.ml" if existed. And changed "pa_r.ml" - (revised syntax parsing) to generate a more logical ast for case - "var.Mod.lab". - - [Apr 29, 99] Added missing cases in "pr_o.cmo" and in "pr_depend.cmo". - - [Mar 11, 99] Added missing cases in "pr_depend.cmo". - - [Mar 9, 99] Added missing case in pr_depend.ml. - -* Other: - - [Sep 10, 99] Updated from current OCaml new interfaces. - - [Jul 9, 99] Added stream type constraint in pa_oop.ml to reflect the same - change in OCaml. - - [Jun 24, 99] Added missing "constraint" construction in types - - [Jun 15, 99] Added option -I for command "mkcamlp4". - - [May 14, 99] Added man pages (links) for camlp4o, camlp4r, mkcamlp4, ocpp - - [May 10, 99] Added shell script "configure_batch" in directory "config". - - [May 10, 99] Changed LICENSE to BSD. - - [Apr 29, 99] Added "ifdef" for mli files. - - [Apr 11, 99] Changed option "-no_cp" into "-sep" in pr_r.cmo and pr_o.cmo. - - [Apr 11, 99] Fixed (old) bug: too long strings where bad pretty printed. - - [Mar 24, 99] Added missing stream type constraint for parsers. - - [Mar 17, 99] Changed template Makefile to use ocamlc.opt and ocamlopt.opt - by default, instead of ocamlc and ocamlopt. - - [Mar 9, 99] Added ifndef in pa_ifdef.ml. - - [Mar 7, 99] Completed and fixed some cases in pr_extend.ml. - -Camlp4 Version 2.02: --------------------- - -* Parsing: - - [Feb 27, 99] Fixed 2 bugs, resulting of incorrect OCaml parsing of the - program example: "type t = F(B).t" - - [Jan 30, 99] Fixed bug "pa_op.ml", could not parse "parser | [<>] -> ()". - - [Jan 16, 99] Added "define" and "undef" in "pa_ifdef.cmo". - - [Dec 22, 98] Fixed precedence of "!=" in OCaml syntax - -* Printing: - - [Mar 4, 99] Added pr_depend.cmo for printing file dependencies. - - [Dec 28, 98] Fixed pretty printing of long strings starting with spaces; - used to display "\\n..." instead of "\\n...". - -* Camlp4: - - [Feb 19, 99] Sort command line argument list in reverse order to - avoid argument names conflicts when adding arguments. - -* Olabl: - - [Feb 26, 99] Started extensions for Olabl: directory "lablp4" and some - changes in MLast. Olabl programs can be preprocessed by: - camlp4 pa_labl.cma pr_ldump.cmo - -* Internal: - - Use of pr_depend.cmo instead of ocamldep for dependencies. - -Camlp4 Version 2.01: --------------------- - -Token interface -* Big change: the type for tokens and tokens patterns is now (string * string) - the first string being the constructor name and the second its possible - parameters. No change in EXTEND statements using Plexer. But lexers - have: - - a supplementary parameter "tparse" to specify how to parse token - from token patterns. - - fields "using" and "removing" replacing "add_keyword" and - "remove_keyword". - See the file README-2.01 for how to update your programs and the interface - of Token. - -Grammar interface -* The function "keywords" have been replaced by "tokens". The equivalent - of the old statement: - Grammar.keywords g - is now: - Grammar.tokens g "" - -Missing features added -* Added "lazy" statement (pa_r.cmo, pa_o.cmo, pr_r.cmo, pr_o.cmo) -* Added print "assert" statement (pr_o.cmo, pr_r.cmo) -* Added parsing of infix operators like in OCaml (e.g. |||) in pa_o.cmo - -Compilation -* Added "make scratch" -* Changed Makefile. No more "make T=../", working bad in some systems. -* Some changes to make compilation in Windows 95/98 working better (thanks - to Patricia Peratto). - -Classes and objects -* Added quotations for classes and objects (q_MLast.ml) -* Added accessible entries in module Pcaml (class_type, class_expr, etc.) -* Changed classes and objects types in definition (module MLast) - -Miscelleneous -* Some adds in pa_sml.cmo. Thanks to Franklin Chen. -* Added option "-no_cp" when "pr_o.cmo" or "pr_r.cmo" is loaded: do - not print comments between phrases. -* Added option "-split_gext" when "pa_extend.cmo" is loaded: split GEXTEND - by functions to turn around a PowerPC problem. - -Bug fixes -* Fixed pa_r.cmo, pa_o.cmo to parse, and pr_r.cmo, pr_o.cmo to print "(x:#M.c)" -* Fixed printing pr_o.cmo of "(a.b <- 1)::1" -* Extended options with parameters worked only when the parameter was sticked. - Ex: - camlp4o pr_o.cmo -l120 foo.ml - worked, but not: - camlp4o pr_o.cmo -l 120 foo.ml - -Camlp4 Version 2.00: --------------------- - -* Designation "righteous" has been renamed "revised". -* Added class and objects in OCaml printing (pr_o.cmo), revised parsing - (pa_r.cmo) and printing (pr_r.cmo). -* Fixed bug in OCaml syntax: let _, x = 1, 2;; was refused. - -Camlp4 Version 2.00--1: ------------------------ - -* Added classes and objects in OCaml syntax (pa_o.cmo) -* Fixed pr_r.cmo et pr_r.cmo which wrote on stdout, even when option -o - -Camlp4 Version 2.00--: ----------------------- - -* Adapted for OCaml 2.00. -* No objects and classes in this version. - -* Added "let module" parsing and printing. -* Added arrays patterns parsing and printing. -* Added records with "with" "{... with ...}" parsing and printing - -* Added # num "string" in plexer (was missing). -* Fixed bug in pr_o.cmo: module A = B (C);; was printed module A = B C;; -* Added "pa_sml.cmo", SML syntax + "lib.sml" -* Fixed bug in pa_r.ml and pa_o.ml: forgot to clear let_binding -* Changed Plexer: unknown keywords do not raise error but return Tterm -* q_MLast.cmo: suppressed <:expr< [$list:el$] >> (cannot work) -* Added option "-no_ss" (no ;;) when "pr_o.cmo" loaded -* Many changes and bug fixing in pretty printing pr_o.cmo and pr_r.cmo -* Command ocpp works now without having to explicitely load - "/usr/local/lib/ocaml/stdlib.cma" and - "/usr/local/lib/camlp4/gramlib.cma" - -* Fixed problem of pretty print "&" and "or" in normal and righteous syntaxes -* Added missing statement "include" in signature item in normal and righteous - syntaxes -* Changed precedence of ":=" and "<-" in normal syntax (pa_o et pr_o): - now before "or", like in OCaml compiler. -* Same change in righteous syntax, by symmetry. - -Camlp4 Version 1.07.2: ----------------------- - -Errors and missings in normal and righteous syntaxes. - -* Added forgotten syntax (righteous): type constraints in class type fields. -* Added missing syntax (normal): type foo = bar = {......} -* Added missing syntax (normal): did not accept separators before ending - constructions (many of them). -* Fixed bug: "assert false" is now of type 'a, like in OCaml. -* Fixed to match OCaml feature: "\^" is "\^" in OCaml, but just "^" in Camlp4. -* Fixed bug in Windows NT/95: problem in backslash before newlines in strings - -Grammars, EXTEND, DELETE_RULE - -* Added functorial version for grammars (started in version 1.07.1, - completed in this version). -* Added statements GEXTEND and GDELETE_RULE in pa_extend.cmo for functorial - version. -* EXTEND statement is added AFTER "top" instead of LEVEL "top" (because - of problems parsing "a; EXTEND...") -* Added ability to have expressions (in antiquotation form) of type string in - EXTEND after keywords "LIDENT", "UIDENT", "IDENT", "ANTIQUOT", "INT" as - in others constructions inside EXTEND. -* A grammar rule hidden by another is not deleted but just masked. DELETE_RULE - will restore the old version. -* DELETE_RULE now raises Not_found if no rule matched. -* Fixed bug: DELETE_RULE did not work when deleting a rule which is a prefix of - another rule. -* Some functions for "system use" in [Grammar] become "official": - [Entry.obj], [extend], [delete_rule]. - -Command line, man page - -* Added option -o: output on file instead of standard output, necessary - to allow compilation in Windows NT/95 (in fact, this option exists since - 1.07.1 but forgotten in its "changes" list). -* Command line option -help more complete. -* Updated man page: camlp4 options are better explained. -* Fixed bug: "camlp4 [other-options] foo.ml" worked but not - "camlp4 foo.ml [other-options]". -* Fixed bug: "camlp4 foo" did not display a understandable error message. - -Camlp4's compilation - -* Changes in compilation process in order to try to make it work better for - Windows NT under Cygnus. - -Miscellaneous - -* Added [Pcaml.add_option] for adding command line options. - -Camlp4 Version 1.07.1: ----------------------- - -* Added forgotten syntax in pr_o: type x = y = A | B -* Fixed bug negative floats parsing in pa_o => error while pretty printing -* Added assert statement and option -noassert. -* Environment variable CAMLP4LIB to change camlp4 library directory -* Grammar: empty rules have a correct location instead of (-1, -1) -* Compilation possible in Windows NT/95 -* String constants no more shared while parsing OCaml -* Fixed bug in antiquotations in q_MLast.cmo (bad errors locations) -* Fixed bug in antiquotations in q_MLast.cmo (EOI not checked) -* Fixed bug in Plexer: could not create keywords with iso 8859 characters - -Camlp4 Version 1.07: --------------------- - -* Changed version number + configuration script -* Added iso 8859 uppercase characters for uidents in plexer.ml -* Fixed bug factorization IDENT in grammars -* Fixed bug pr_o.cmo was printing "declare" -* Fixed bug constructor arity in OCaml syntax (pa_o.cmo). -* Changed "lazy" into "slazy". -* Completed pa_ifdef.cmo. - -Camlp4 Version 1.06: --------------------- - -* Adapted to OCaml 1.06. -* Changed version number to match OCaml's => 1.06 too. -* Deleted module Gstream, using OCaml's Stream. -* Generate different AST for C(x,y) and C x y (change done in OCaml's compiler) -* No more message "Interrupted" in toplevel in case of syntax error. -* Added flag to suppress warnings while extending grammars. -* Completed some missing statements and declarations (objects) -* Modified odyl implementation; works better -* Added ability to extend command line specification -* Added "let_binding" as predefined (accessible) entry in Pcaml. -* Added construction FUNCTION in EXTEND statement to call another function. -* Added some ISO-8859-1 characters in lexer identifiers. -* Fixed bug "value x = {val = 1};" (righteous syntax) -* Fixed bug "open A.B.C" was interpreted as "open B.A.C" -* Modified behavior of "DELETE_RULE": the complete rule must be provided -* Completed quotations MLast ("expr", "patt", etc) to accept whole language -* Renamed "LIKE" into "LEVEL" in grammar EXTEND -* Added "NEXT" as grammar symbol in grammar EXTEND -* Added command "mkcamlp4" to make camlp4 executables linked with C code -* Added "pr_extend.cmo" to reconstitute EXTEND instructions - -Camlp4 Version 0.6: -------------------- - ---- Installing - -* To compile camlp4, it is no more necessary to have the sources of the - Objective Caml compiler available. It can be compiled like any other - Objective Caml program. - ---- Options of "camlp4" - -* Added option -where: "camlp4 -where" prints the name of the standard - library directory of Camlp4 and exit. So, the ocaml toplevel and the - compiler can use the option: - -I `camlp4 -where` - -* Added option -nolib to not search for objects files in the installed - library directory of Camlp4. - ---- Interface of grammar library modules - -* The function Grammar.keywords returns now a list of pairs. The pair is - composed of a keyword and the number of times it is used in entries. - -* Changed interface of Token and Grammar for lexers, so user lexers have - to be changed. - ---- New features in grammars - -* New instruction "DELETE_RULE" provided by pa_extend.cmo to delete rules. - Ex: - DELETE_RULE Pcaml.expr: "if" END; - deletes the "if" instruction of the language. - -* Added the ability to parse some specific integer in grammars: a possible - parameter to INT, like the ones for LIDENT and UIDENT. - -* In instruction EXTEND, ability to omit "-> action", default is "-> ()" - -* Ability to add antiquotation (between $'s) as symbol rule, of type string, - interpreted as a keyword, in instruction EXTEND. - -* Ability to put entries with qualified names (Foo.bar) in instruction EXTEND. - ---- Quotations - -* The module Ast has been renamed MLast. The quotation expander "q_ast.cmo" - has been renamed "q_MLast.cmo". - -* Quotation expanders are now of two kinds: - - The "classical" type for expanders returning a string. These expanders - have now a supplementary parameter: a boolean value set to "True" - when the quotation is in a context of an expression an to "False" - when the quotation is in a context of a pattern. These expanders, - returning strings which are parsed afterwards, may work for some - language syntax and/or language extensions used (e.g. may work for - Righteous syntax and not for OCaml syntax). - - A new type of expander returning directly syntax trees. A pair - of functions, for expressions and for patterns must be provided. - These expanders are independant from the language syntax and/or - extensions used. - -* The predefined quotation expanders "ctyp_", "patt_" and "expr_" has - been deleted; one can use "ctyp", "patt", and "expr" in position of - pattern or expression. - ---- OCaml and Righteous syntaxes - -* Fixed bug: "open Foo.Bar" was converted (pr_dump.cmo) into "open Bar.Foo" - -* Corrected behavior different from OCaml's: "^" and "@" were at the same - level than "=": now, like OCaml, they have a separated right associative - level. - ---- Grammars behavior - -* While extending entries: default position is now "extension of the - first level", instead of "adding a new level at the end". - -* Another Change: in each precedence level, terminals are inserted before - other symbols (non terminals, lists, options, etc), LIDENT "foo" before - LIDENT (alone) and UIDENT "foo" before UIDENT (alone). New rules not - factorizable are now inserted before the other rules. - -* Changed algorithm of entries parsing: each precedence level is tested - against the stream *before* its next precedences levels (instead of - *after*): - EXTEND e: [[ LIDENT "a" -> "xxx" ] | [ i = LIDENT -> i ]]; END; - Now, parsing the entry e with the string "a" returns "xxx" instead of "a" - -* Less keywords in instruction EXTEND (LEFTA, LIDENT, etc), which can be - used now as normal identifiers. - -* When inserting a new rule, a warning appears if a rule with the - same production already existed (it is deleted). - -* Parse error messages (Gstream.Error) are formatted => spaces trigger - Format.print_space and newlines trigger Format.force_newline. - - -Camlp4 Version 0.5: -------------------- - -* Possible creation of native code library (make opt) - -* OCaml and Righteous Syntax more complete - -* Added pa_ru.cmo for compiling sequences of type unit (Righteous) - -* Quotations AST - - No more quotation long_id - - Antiquotations for identifiers more simple - -* Lot of small changes - - -Camlp4 Version 0.4: -------------------- - -* First distributed version diff --git a/camlp4/Camlp4.mlpack b/camlp4/Camlp4.mlpack deleted file mode 100644 index cc38b119..00000000 --- a/camlp4/Camlp4.mlpack +++ /dev/null @@ -1,9 +0,0 @@ -Debug -ErrorHandler -OCamlInitSyntax -Options -PreCast -Printers -Register -Sig -Struct diff --git a/camlp4/Camlp4/Camlp4Ast.partial.ml b/camlp4/Camlp4/Camlp4Ast.partial.ml deleted file mode 100644 index 22874373..00000000 --- a/camlp4/Camlp4/Camlp4Ast.partial.ml +++ /dev/null @@ -1,412 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Note: when you modify these types you must increment - ast magic numbers defined in Camlp4_config.ml. *) - - type loc = Loc.t - and meta_bool = - [ BTrue - | BFalse - | BAnt of string ] - and rec_flag = - [ ReRecursive - | ReNil - | ReAnt of string ] - and direction_flag = - [ DiTo - | DiDownto - | DiAnt of string ] - and mutable_flag = - [ MuMutable - | MuNil - | MuAnt of string ] - and private_flag = - [ PrPrivate - | PrNil - | PrAnt of string ] - and virtual_flag = - [ ViVirtual - | ViNil - | ViAnt of string ] - and override_flag = - [ OvOverride - | OvNil - | OvAnt of string ] - and row_var_flag = - [ RvRowVar - | RvNil - | RvAnt of string ] - and meta_option 'a = - [ ONone - | OSome of 'a - | OAnt of string ] - and meta_list 'a = - [ LNil - | LCons of 'a and meta_list 'a - | LAnt of string ] - and ident = - [ IdAcc of loc and ident and ident (* i . i *) - | IdApp of loc and ident and ident (* i i *) - | IdLid of loc and string (* foo *) - | IdUid of loc and string (* Bar *) - | IdAnt of loc and string (* $s$ *) ] - and ctyp = - [ TyNil of loc - | TyAli of loc and ctyp and ctyp (* t as t *) (* list 'a as 'a *) - | TyAny of loc (* _ *) - | TyApp of loc and ctyp and ctyp (* t t *) (* list 'a *) - | TyArr of loc and ctyp and ctyp (* t -> t *) (* int -> string *) - | TyCls of loc and ident (* #i *) (* #point *) - | TyLab of loc and string and ctyp (* ~s:t *) - | TyId of loc and ident (* i *) (* Lazy.t *) - | TyMan of loc and ctyp and ctyp (* t == t *) (* type t = [ A | B ] == Foo.t *) - (* type t 'a 'b 'c = t constraint t = t constraint t = t *) - | TyDcl of loc and string and list ctyp and ctyp and list (ctyp * ctyp) - (* < (t)? (..)? > *) (* < move : int -> 'a .. > as 'a *) - | TyObj of loc and ctyp and row_var_flag - | TyOlb of loc and string and ctyp (* ?s:t *) - | TyPol of loc and ctyp and ctyp (* ! t . t *) (* ! 'a . list 'a -> 'a *) - | TyTypePol of loc and ctyp and ctyp (* type t . t *) (* type a . list a -> a *) - | TyQuo of loc and string (* 's *) - | TyQuP of loc and string (* +'s *) - | TyQuM of loc and string (* -'s *) - | TyAnP of loc (* +_ *) - | TyAnM of loc (* -_ *) - | TyVrn of loc and string (* `s *) - | TyRec of loc and ctyp (* { t } *) (* { foo : int ; bar : mutable string } *) - | TyCol of loc and ctyp and ctyp (* t : t *) - | TySem of loc and ctyp and ctyp (* t; t *) - | TyCom of loc and ctyp and ctyp (* t, t *) - | TySum of loc and ctyp (* [ t ] *) (* [ A of int and string | B ] *) - | TyOf of loc and ctyp and ctyp (* t of t *) (* A of int *) - | TyAnd of loc and ctyp and ctyp (* t and t *) - | TyOr of loc and ctyp and ctyp (* t | t *) - | TyPrv of loc and ctyp (* private t *) - | TyMut of loc and ctyp (* mutable t *) - | TyTup of loc and ctyp (* ( t ) *) (* (int * string) *) - | TySta of loc and ctyp and ctyp (* t * t *) - | TyVrnEq of loc and ctyp (* [ = t ] *) - | TyVrnSup of loc and ctyp (* [ > t ] *) - | TyVrnInf of loc and ctyp (* [ < t ] *) - | TyVrnInfSup of loc and ctyp and ctyp (* [ < t > t ] *) - | TyAmp of loc and ctyp and ctyp (* t & t *) - | TyOfAmp of loc and ctyp and ctyp (* t of & t *) - | TyPkg of loc and module_type (* (module S) *) - | TyAnt of loc and string (* $s$ *) - ] - and patt = - [ PaNil of loc - | PaId of loc and ident (* i *) - | PaAli of loc and patt and patt (* p as p *) (* (Node x y as n) *) - | PaAnt of loc and string (* $s$ *) - | PaAny of loc (* _ *) - | PaApp of loc and patt and patt (* p p *) (* fun x y -> *) - | PaArr of loc and patt (* [| p |] *) - | PaCom of loc and patt and patt (* p, p *) - | PaSem of loc and patt and patt (* p; p *) - | PaChr of loc and string (* c *) (* 'x' *) - | PaInt of loc and string - | PaInt32 of loc and string - | PaInt64 of loc and string - | PaNativeInt of loc and string - | PaFlo of loc and string - | PaLab of loc and string and patt (* ~s or ~s:(p) *) - (* ?s or ?s:(p) *) - | PaOlb of loc and string and patt - (* ?s:(p = e) or ?(p = e) *) - | PaOlbi of loc and string and patt and expr - | PaOrp of loc and patt and patt (* p | p *) - | PaRng of loc and patt and patt (* p .. p *) - | PaRec of loc and patt (* { p } *) - | PaEq of loc and ident and patt (* i = p *) - | PaStr of loc and string (* s *) - | PaTup of loc and patt (* ( p ) *) - | PaTyc of loc and patt and ctyp (* (p : t) *) - | PaTyp of loc and ident (* #i *) - | PaVrn of loc and string (* `s *) - | PaLaz of loc and patt (* lazy p *) - | PaMod of loc and string (* (module M) *) ] - and expr = - [ ExNil of loc - | ExId of loc and ident (* i *) - | ExAcc of loc and expr and expr (* e.e *) - | ExAnt of loc and string (* $s$ *) - | ExApp of loc and expr and expr (* e e *) - | ExAre of loc and expr and expr (* e.(e) *) - | ExArr of loc and expr (* [| e |] *) - | ExSem of loc and expr and expr (* e; e *) - | ExAsf of loc (* assert False *) - | ExAsr of loc and expr (* assert e *) - | ExAss of loc and expr and expr (* e := e *) - | ExChr of loc and string (* 'c' *) - | ExCoe of loc and expr and ctyp and ctyp (* (e : t) or (e : t :> t) *) - | ExFlo of loc and string (* 3.14 *) - (* for s = e to/downto e do { e } *) - | ExFor of loc and string and expr and expr and direction_flag and expr - | ExFun of loc and match_case (* fun [ mc ] *) - | ExIfe of loc and expr and expr and expr (* if e then e else e *) - | ExInt of loc and string (* 42 *) - | ExInt32 of loc and string - | ExInt64 of loc and string - | ExNativeInt of loc and string - | ExLab of loc and string and expr (* ~s or ~s:e *) - | ExLaz of loc and expr (* lazy e *) - (* let b in e or let rec b in e *) - | ExLet of loc and rec_flag and binding and expr - (* let module s = me in e *) - | ExLmd of loc and string and module_expr and expr - (* match e with [ mc ] *) - | ExMat of loc and expr and match_case - (* new i *) - | ExNew of loc and ident - (* object ((p))? (cst)? end *) - | ExObj of loc and patt and class_str_item - (* ?s or ?s:e *) - | ExOlb of loc and string and expr - (* {< rb >} *) - | ExOvr of loc and rec_binding - (* { rb } or { (e) with rb } *) - | ExRec of loc and rec_binding and expr - (* do { e } *) - | ExSeq of loc and expr - (* e#s *) - | ExSnd of loc and expr and string - (* e.[e] *) - | ExSte of loc and expr and expr - (* s *) (* "foo" *) - | ExStr of loc and string - (* try e with [ mc ] *) - | ExTry of loc and expr and match_case - (* (e) *) - | ExTup of loc and expr - (* e, e *) - | ExCom of loc and expr and expr - (* (e : t) *) - | ExTyc of loc and expr and ctyp - (* `s *) - | ExVrn of loc and string - (* while e do { e } *) - | ExWhi of loc and expr and expr - (* let open i in e *) - | ExOpI of loc and ident and expr - (* fun (type t) -> e *) - (* let f x (type t) y z = e *) - | ExFUN of loc and string and expr - (* (module ME : S) which is represented as (module (ME : S)) *) - | ExPkg of loc and module_expr ] - and module_type = - [ MtNil of loc - (* i *) (* A.B.C *) - | MtId of loc and ident - (* functor (s : mt) -> mt *) - | MtFun of loc and string and module_type and module_type - (* 's *) - | MtQuo of loc and string - (* sig sg end *) - | MtSig of loc and sig_item - (* mt with wc *) - | MtWit of loc and module_type and with_constr - (* module type of m *) - | MtOf of loc and module_expr - | MtAnt of loc and string (* $s$ *) ] - and sig_item = - [ SgNil of loc - (* class cict *) - | SgCls of loc and class_type - (* class type cict *) - | SgClt of loc and class_type - (* sg ; sg *) - | SgSem of loc and sig_item and sig_item - (* # s or # s e *) - | SgDir of loc and string and expr - (* exception t *) - | SgExc of loc and ctyp - (* external s : t = s ... s *) - | SgExt of loc and string and ctyp and meta_list string - (* include mt *) - | SgInc of loc and module_type - (* module s : mt *) - | SgMod of loc and string and module_type - (* module rec mb *) - | SgRecMod of loc and module_binding - (* module type s = mt *) - | SgMty of loc and string and module_type - (* open i *) - | SgOpn of loc and ident - (* type t *) - | SgTyp of loc and ctyp - (* value s : t *) - | SgVal of loc and string and ctyp - | SgAnt of loc and string (* $s$ *) ] - and with_constr = - [ WcNil of loc - (* type t = t *) - | WcTyp of loc and ctyp and ctyp - (* module i = i *) - | WcMod of loc and ident and ident - (* type t := t *) - | WcTyS of loc and ctyp and ctyp - (* module i := i *) - | WcMoS of loc and ident and ident - (* wc and wc *) - | WcAnd of loc and with_constr and with_constr - | WcAnt of loc and string (* $s$ *) ] - and binding = - [ BiNil of loc - (* bi and bi *) (* let a = 42 and c = 43 *) - | BiAnd of loc and binding and binding - (* p = e *) (* let patt = expr *) - | BiEq of loc and patt and expr - | BiAnt of loc and string (* $s$ *) ] - and rec_binding = - [ RbNil of loc - (* rb ; rb *) - | RbSem of loc and rec_binding and rec_binding - (* i = e *) - | RbEq of loc and ident and expr - | RbAnt of loc and string (* $s$ *) ] - and module_binding = - [ MbNil of loc - (* mb and mb *) (* module rec (s : mt) = me and (s : mt) = me *) - | MbAnd of loc and module_binding and module_binding - (* s : mt = me *) - | MbColEq of loc and string and module_type and module_expr - (* s : mt *) - | MbCol of loc and string and module_type - | MbAnt of loc and string (* $s$ *) ] - and match_case = - [ McNil of loc - (* a | a *) - | McOr of loc and match_case and match_case - (* p (when e)? -> e *) - | McArr of loc and patt and expr and expr - | McAnt of loc and string (* $s$ *) ] - and module_expr = - [ MeNil of loc - (* i *) - | MeId of loc and ident - (* me me *) - | MeApp of loc and module_expr and module_expr - (* functor (s : mt) -> me *) - | MeFun of loc and string and module_type and module_expr - (* struct st end *) - | MeStr of loc and str_item - (* (me : mt) *) - | MeTyc of loc and module_expr and module_type - (* (value e) *) - (* (value e : S) which is represented as (value (e : S)) *) - | MePkg of loc and expr - | MeAnt of loc and string (* $s$ *) ] - and str_item = - [ StNil of loc - (* class cice *) - | StCls of loc and class_expr - (* class type cict *) - | StClt of loc and class_type - (* st ; st *) - | StSem of loc and str_item and str_item - (* # s or # s e *) - | StDir of loc and string and expr - (* exception t or exception t = i *) - | StExc of loc and ctyp and meta_option(*FIXME*) ident - (* e *) - | StExp of loc and expr - (* external s : t = s ... s *) - | StExt of loc and string and ctyp and meta_list string - (* include me *) - | StInc of loc and module_expr - (* module s = me *) - | StMod of loc and string and module_expr - (* module rec mb *) - | StRecMod of loc and module_binding - (* module type s = mt *) - | StMty of loc and string and module_type - (* open i *) - | StOpn of loc and ident - (* type t *) - | StTyp of loc and ctyp - (* value (rec)? bi *) - | StVal of loc and rec_flag and binding - | StAnt of loc and string (* $s$ *) ] - and class_type = - [ CtNil of loc - (* (virtual)? i ([ t ])? *) - | CtCon of loc and virtual_flag and ident and ctyp - (* [t] -> ct *) - | CtFun of loc and ctyp and class_type - (* object ((t))? (csg)? end *) - | CtSig of loc and ctyp and class_sig_item - (* ct and ct *) - | CtAnd of loc and class_type and class_type - (* ct : ct *) - | CtCol of loc and class_type and class_type - (* ct = ct *) - | CtEq of loc and class_type and class_type - (* $s$ *) - | CtAnt of loc and string ] - and class_sig_item = - [ CgNil of loc - (* type t = t *) - | CgCtr of loc and ctyp and ctyp - (* csg ; csg *) - | CgSem of loc and class_sig_item and class_sig_item - (* inherit ct *) - | CgInh of loc and class_type - (* method s : t or method private s : t *) - | CgMth of loc and string and private_flag and ctyp - (* value (virtual)? (mutable)? s : t *) - | CgVal of loc and string and mutable_flag and virtual_flag and ctyp - (* method virtual (private)? s : t *) - | CgVir of loc and string and private_flag and ctyp - | CgAnt of loc and string (* $s$ *) ] - and class_expr = - [ CeNil of loc - (* ce e *) - | CeApp of loc and class_expr and expr - (* (virtual)? i ([ t ])? *) - | CeCon of loc and virtual_flag and ident and ctyp - (* fun p -> ce *) - | CeFun of loc and patt and class_expr - (* let (rec)? bi in ce *) - | CeLet of loc and rec_flag and binding and class_expr - (* object ((p))? (cst)? end *) - | CeStr of loc and patt and class_str_item - (* ce : ct *) - | CeTyc of loc and class_expr and class_type - (* ce and ce *) - | CeAnd of loc and class_expr and class_expr - (* ce = ce *) - | CeEq of loc and class_expr and class_expr - (* $s$ *) - | CeAnt of loc and string ] - and class_str_item = - [ CrNil of loc - (* cst ; cst *) - | CrSem of loc and class_str_item and class_str_item - (* type t = t *) - | CrCtr of loc and ctyp and ctyp - (* inherit(!)? ce (as s)? *) - | CrInh of loc and override_flag and class_expr and string - (* initializer e *) - | CrIni of loc and expr - (* method(!)? (private)? s : t = e or method(!)? (private)? s = e *) - | CrMth of loc and string and override_flag and private_flag and expr and ctyp - (* value(!)? (mutable)? s = e *) - | CrVal of loc and string and override_flag and mutable_flag and expr - (* method virtual (private)? s : t *) - | CrVir of loc and string and private_flag and ctyp - (* value virtual (mutable)? s : t *) - | CrVvr of loc and string and mutable_flag and ctyp - | CrAnt of loc and string (* $s$ *) ]; diff --git a/camlp4/Camlp4/Debug.ml b/camlp4/Camlp4/Debug.ml deleted file mode 100644 index 73a38db8..00000000 --- a/camlp4/Camlp4/Debug.ml +++ /dev/null @@ -1,64 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -(* camlp4r *) -open Format; - -module Debug = struct value mode _ = False; end; - -type section = string; - -value out_channel = - try - let f = Sys.getenv "CAMLP4_DEBUG_FILE" in - open_out_gen [Open_wronly; Open_creat; Open_append; Open_text] - 0o666 f - with - [ Not_found -> Pervasives.stderr ]; - -module StringSet = Set.Make String; - -value mode = - try - let str = Sys.getenv "CAMLP4_DEBUG" in - let rec loop acc i = - try - let pos = String.index_from str i ':' in - loop (StringSet.add (String.sub str i (pos - i)) acc) (pos + 1) - with - [ Not_found -> - StringSet.add (String.sub str i (String.length str - i)) acc ] in - let sections = loop StringSet.empty 0 in - if StringSet.mem "*" sections then fun _ -> True - else fun x -> StringSet.mem x sections - with [ Not_found -> fun _ -> False ]; - -value formatter = - let header = "camlp4-debug: " in - let at_bol = ref True in - (make_formatter - (fun buf pos len -> - for i = pos to pos + len - 1 do - if at_bol.val then output_string out_channel header else (); - let ch = buf.[i]; - output_char out_channel ch; - at_bol.val := ch = '\n'; - done) - (fun () -> flush out_channel)); - -value printf section fmt = fprintf formatter ("%s: " ^^ fmt) section; diff --git a/camlp4/Camlp4/Debug.mli b/camlp4/Camlp4/Debug.mli deleted file mode 100644 index 97597f9c..00000000 --- a/camlp4/Camlp4/Debug.mli +++ /dev/null @@ -1,22 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -(* camlp4r *) -type section = string; -value mode : section -> bool; -value printf : section -> format 'a Format.formatter unit -> 'a; diff --git a/camlp4/Camlp4/ErrorHandler.ml b/camlp4/Camlp4/ErrorHandler.ml deleted file mode 100644 index bfefa49a..00000000 --- a/camlp4/Camlp4/ErrorHandler.ml +++ /dev/null @@ -1,171 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -(* camlp4r *) - -open Format; - -module ObjTools = struct - - value desc obj = - if Obj.is_block obj then - "tag = " ^ string_of_int (Obj.tag obj) - else "int_val = " ^ string_of_int (Obj.obj obj); - - (*Imported from the extlib*) - value rec to_string r = - if Obj.is_int r then - let i = (Obj.magic r : int) - in string_of_int i ^ " | CstTag" ^ string_of_int (i + 1) - else (* Block. *) - let rec get_fields acc = - fun - [ 0 -> acc - | n -> let n = n-1 in get_fields [Obj.field r n :: acc] n ] - in - let rec is_list r = - if Obj.is_int r then - r = Obj.repr 0 (* [] *) - else - let s = Obj.size r and t = Obj.tag r in - t = 0 && s = 2 && is_list (Obj.field r 1) (* h :: t *) - in - let rec get_list r = - if Obj.is_int r then [] - else let h = Obj.field r 0 and t = get_list (Obj.field r 1) in [h :: t] - in - let opaque name = - (* XXX In future, print the address of value 'r'. Not possible in - * pure OCaml at the moment. - *) - "<" ^ name ^ ">" - in - let s = Obj.size r and t = Obj.tag r in - (* From the tag, determine the type of block. *) - match t with - [ _ when is_list r -> - let fields = get_list r in - "[" ^ String.concat "; " (List.map to_string fields) ^ "]" - | 0 -> - let fields = get_fields [] s in - "(" ^ String.concat ", " (List.map to_string fields) ^ ")" - | x when x = Obj.lazy_tag -> - (* Note that [lazy_tag .. forward_tag] are < no_scan_tag. Not - * clear if very large constructed values could have the same - * tag. XXX *) - opaque "lazy" - | x when x = Obj.closure_tag -> - opaque "closure" - | x when x = Obj.object_tag -> - let fields = get_fields [] s in - let (_class, id, slots) = - match fields with - [ [h; h'::t] -> (h, h', t) - | _ -> assert False ] - in - (* No information on decoding the class (first field). So just print - * out the ID and the slots. *) - "Object #" ^ to_string id ^ " (" ^ String.concat ", " (List.map to_string slots) ^ ")" - | x when x = Obj.infix_tag -> - opaque "infix" - | x when x = Obj.forward_tag -> - opaque "forward" - | x when x < Obj.no_scan_tag -> - let fields = get_fields [] s in - "Tag" ^ string_of_int t ^ - " (" ^ String.concat ", " (List.map to_string fields) ^ ")" - | x when x = Obj.string_tag -> - "\"" ^ String.escaped (Obj.magic r : string) ^ "\"" - | x when x = Obj.double_tag -> - Camlp4_import.Oprint.float_repres (Obj.magic r : float) - | x when x = Obj.abstract_tag -> - opaque "abstract" - | x when x = Obj.custom_tag -> - opaque "custom" - | x when x = Obj.final_tag -> - opaque "final" - | _ -> - failwith ("ObjTools.to_string: unknown tag (" ^ string_of_int t ^ ")") ]; - - value print ppf x = fprintf ppf "%s" (to_string x); - value print_desc ppf x = fprintf ppf "%s" (desc x); - -end; - -value default_handler ppf x = do { - let x = Obj.repr x; - fprintf ppf "Camlp4: Uncaught exception: %s" - (Obj.obj (Obj.field (Obj.field x 0) 0) : string); - if Obj.size x > 1 then do { - pp_print_string ppf " ("; - for i = 1 to Obj.size x - 1 do - if i > 1 then pp_print_string ppf ", " else (); - ObjTools.print ppf (Obj.field x i); - done; - pp_print_char ppf ')' - } - else (); - fprintf ppf "@." -}; - -value handler = ref (fun ppf default_handler exn -> default_handler ppf exn); - -value register f = - let current_handler = handler.val in - handler.val := - fun ppf default_handler exn -> - try f ppf exn with exn -> current_handler ppf default_handler exn; - -module Register (Error : Sig.Error) = struct - let current_handler = handler.val in - handler.val := - fun ppf default_handler -> - fun [ Error.E x -> Error.print ppf x - | x -> current_handler ppf default_handler x ]; -end; - - -value gen_print ppf default_handler = - fun - [ Out_of_memory -> fprintf ppf "Out of memory" - | Assert_failure (file, line, char) -> - fprintf ppf "Assertion failed, file %S, line %d, char %d" - file line char - | Match_failure (file, line, char) -> - fprintf ppf "Pattern matching failed, file %S, line %d, char %d" - file line char - | Failure str -> fprintf ppf "Failure: %S" str - | Invalid_argument str -> fprintf ppf "Invalid argument: %S" str - | Sys_error str -> fprintf ppf "I/O error: %S" str - | Stream.Failure -> fprintf ppf "Parse failure" - | Stream.Error str -> fprintf ppf "Parse error: %s" str - | x -> handler.val ppf default_handler x ]; - -value print ppf = gen_print ppf default_handler; - -value try_print ppf = gen_print ppf (fun _ -> raise); - -value to_string exn = - let buf = Buffer.create 128 in - let () = bprintf buf "%a" print exn in - Buffer.contents buf; - -value try_to_string exn = - let buf = Buffer.create 128 in - let () = bprintf buf "%a" try_print exn in - Buffer.contents buf; diff --git a/camlp4/Camlp4/ErrorHandler.mli b/camlp4/Camlp4/ErrorHandler.mli deleted file mode 100644 index d73238df..00000000 --- a/camlp4/Camlp4/ErrorHandler.mli +++ /dev/null @@ -1,36 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) -value print : Format.formatter -> exn -> unit; - -value try_print : Format.formatter -> exn -> unit; - -value to_string : exn -> string; - -value try_to_string : exn -> string; - -value register : (Format.formatter -> exn -> unit) -> unit; - -module Register (Error : Sig.Error) : sig end; - -module ObjTools : sig - value print : Format.formatter -> Obj.t -> unit; - value print_desc : Format.formatter -> Obj.t -> unit; - (*Imported from the extlib*) - value to_string : Obj.t -> string; - value desc : Obj.t -> string; -end; diff --git a/camlp4/Camlp4/OCamlInitSyntax.ml b/camlp4/Camlp4/OCamlInitSyntax.ml deleted file mode 100644 index c424bfa7..00000000 --- a/camlp4/Camlp4/OCamlInitSyntax.ml +++ /dev/null @@ -1,265 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Camlp4Ast) - (Gram : Sig.Grammar.Static with module Loc = Ast.Loc - with type Token.t = Sig.camlp4_token) - (Quotation : Sig.Quotation with module Ast = Sig.Camlp4AstToAst Ast) -: Sig.Camlp4Syntax with module Loc = Ast.Loc - and module Ast = Ast - and module Token = Gram.Token - and module Gram = Gram - and module Quotation = Quotation -= struct - - module Loc = Ast.Loc; - module Ast = Ast; - module Gram = Gram; - module Token = Gram.Token; - open Sig; - - (* Warnings *) - type warning = Loc.t -> string -> unit; - value default_warning loc txt = Format.eprintf " %a: %s@." Loc.print loc txt; - value current_warning = ref default_warning; - value print_warning loc txt = current_warning.val loc txt; - - value a_CHAR = Gram.Entry.mk "a_CHAR"; - value a_FLOAT = Gram.Entry.mk "a_FLOAT"; - value a_INT = Gram.Entry.mk "a_INT"; - value a_INT32 = Gram.Entry.mk "a_INT32"; - value a_INT64 = Gram.Entry.mk "a_INT64"; - value a_LABEL = Gram.Entry.mk "a_LABEL"; - value a_LIDENT = Gram.Entry.mk "a_LIDENT"; - value a_NATIVEINT = Gram.Entry.mk "a_NATIVEINT"; - value a_OPTLABEL = Gram.Entry.mk "a_OPTLABEL"; - value a_STRING = Gram.Entry.mk "a_STRING"; - value a_UIDENT = Gram.Entry.mk "a_UIDENT"; - value a_ident = Gram.Entry.mk "a_ident"; - value amp_ctyp = Gram.Entry.mk "amp_ctyp"; - value and_ctyp = Gram.Entry.mk "and_ctyp"; - value match_case = Gram.Entry.mk "match_case"; - value match_case0 = Gram.Entry.mk "match_case0"; - value binding = Gram.Entry.mk "binding"; - value class_declaration = Gram.Entry.mk "class_declaration"; - value class_description = Gram.Entry.mk "class_description"; - value class_expr = Gram.Entry.mk "class_expr"; - value class_fun_binding = Gram.Entry.mk "class_fun_binding"; - value class_fun_def = Gram.Entry.mk "class_fun_def"; - value class_info_for_class_expr = Gram.Entry.mk "class_info_for_class_expr"; - value class_info_for_class_type = Gram.Entry.mk "class_info_for_class_type"; - value class_longident = Gram.Entry.mk "class_longident"; - value class_longident_and_param = Gram.Entry.mk "class_longident_and_param"; - value class_name_and_param = Gram.Entry.mk "class_name_and_param"; - value class_sig_item = Gram.Entry.mk "class_sig_item"; - value class_signature = Gram.Entry.mk "class_signature"; - value class_str_item = Gram.Entry.mk "class_str_item"; - value class_structure = Gram.Entry.mk "class_structure"; - value class_type = Gram.Entry.mk "class_type"; - value class_type_declaration = Gram.Entry.mk "class_type_declaration"; - value class_type_longident = Gram.Entry.mk "class_type_longident"; - value class_type_longident_and_param = Gram.Entry.mk "class_type_longident_and_param"; - value class_type_plus = Gram.Entry.mk "class_type_plus"; - value comma_ctyp = Gram.Entry.mk "comma_ctyp"; - value comma_expr = Gram.Entry.mk "comma_expr"; - value comma_ipatt = Gram.Entry.mk "comma_ipatt"; - value comma_patt = Gram.Entry.mk "comma_patt"; - value comma_type_parameter = Gram.Entry.mk "comma_type_parameter"; - value constrain = Gram.Entry.mk "constrain"; - value constructor_arg_list = Gram.Entry.mk "constructor_arg_list"; - value constructor_declaration = Gram.Entry.mk "constructor_declaration"; - value constructor_declarations = Gram.Entry.mk "constructor_declarations"; - value ctyp = Gram.Entry.mk "ctyp"; - value cvalue_binding = Gram.Entry.mk "cvalue_binding"; - value direction_flag = Gram.Entry.mk "direction_flag"; - value direction_flag_quot = Gram.Entry.mk "direction_flag_quot"; - value dummy = Gram.Entry.mk "dummy"; - value entry_eoi = Gram.Entry.mk "entry_eoi"; - value eq_expr = Gram.Entry.mk "eq_expr"; - value expr = Gram.Entry.mk "expr"; - value expr_eoi = Gram.Entry.mk "expr_eoi"; - value field_expr = Gram.Entry.mk "field_expr"; - value field_expr_list = Gram.Entry.mk "field_expr_list"; - value fun_binding = Gram.Entry.mk "fun_binding"; - value fun_def = Gram.Entry.mk "fun_def"; - value ident = Gram.Entry.mk "ident"; - value implem = Gram.Entry.mk "implem"; - value interf = Gram.Entry.mk "interf"; - value ipatt = Gram.Entry.mk "ipatt"; - value ipatt_tcon = Gram.Entry.mk "ipatt_tcon"; - value label = Gram.Entry.mk "label"; - value label_declaration = Gram.Entry.mk "label_declaration"; - value label_declaration_list = Gram.Entry.mk "label_declaration_list"; - value label_expr = Gram.Entry.mk "label_expr"; - value label_expr_list = Gram.Entry.mk "label_expr_list"; - value label_ipatt = Gram.Entry.mk "label_ipatt"; - value label_ipatt_list = Gram.Entry.mk "label_ipatt_list"; - value label_longident = Gram.Entry.mk "label_longident"; - value label_patt = Gram.Entry.mk "label_patt"; - value label_patt_list = Gram.Entry.mk "label_patt_list"; - value labeled_ipatt = Gram.Entry.mk "labeled_ipatt"; - value let_binding = Gram.Entry.mk "let_binding"; - value meth_list = Gram.Entry.mk "meth_list"; - value meth_decl = Gram.Entry.mk "meth_decl"; - value module_binding = Gram.Entry.mk "module_binding"; - value module_binding0 = Gram.Entry.mk "module_binding0"; - value module_declaration = Gram.Entry.mk "module_declaration"; - value module_expr = Gram.Entry.mk "module_expr"; - value module_longident = Gram.Entry.mk "module_longident"; - value module_longident_with_app = Gram.Entry.mk "module_longident_with_app"; - value module_rec_declaration = Gram.Entry.mk "module_rec_declaration"; - value module_type = Gram.Entry.mk "module_type"; - value package_type = Gram.Entry.mk "package_type"; - value more_ctyp = Gram.Entry.mk "more_ctyp"; - value name_tags = Gram.Entry.mk "name_tags"; - value opt_as_lident = Gram.Entry.mk "opt_as_lident"; - value opt_class_self_patt = Gram.Entry.mk "opt_class_self_patt"; - value opt_class_self_type = Gram.Entry.mk "opt_class_self_type"; - value opt_class_signature = Gram.Entry.mk "opt_class_signature"; - value opt_class_structure = Gram.Entry.mk "opt_class_structure"; - value opt_comma_ctyp = Gram.Entry.mk "opt_comma_ctyp"; - value opt_dot_dot = Gram.Entry.mk "opt_dot_dot"; - value row_var_flag_quot = Gram.Entry.mk "row_var_flag_quot"; - value opt_eq_ctyp = Gram.Entry.mk "opt_eq_ctyp"; - value opt_expr = Gram.Entry.mk "opt_expr"; - value opt_meth_list = Gram.Entry.mk "opt_meth_list"; - value opt_mutable = Gram.Entry.mk "opt_mutable"; - value mutable_flag_quot = Gram.Entry.mk "mutable_flag_quot"; - value opt_polyt = Gram.Entry.mk "opt_polyt"; - value opt_private = Gram.Entry.mk "opt_private"; - value private_flag_quot = Gram.Entry.mk "private_flag_quot"; - value opt_rec = Gram.Entry.mk "opt_rec"; - value rec_flag_quot = Gram.Entry.mk "rec_flag_quot"; - value opt_sig_items = Gram.Entry.mk "opt_sig_items"; - value opt_str_items = Gram.Entry.mk "opt_str_items"; - value opt_virtual = Gram.Entry.mk "opt_virtual"; - value virtual_flag_quot = Gram.Entry.mk "virtual_flag_quot"; - value opt_override = Gram.Entry.mk "opt_override"; - value override_flag_quot = Gram.Entry.mk "override_flag_quot"; - value opt_when_expr = Gram.Entry.mk "opt_when_expr"; - value patt = Gram.Entry.mk "patt"; - value patt_as_patt_opt = Gram.Entry.mk "patt_as_patt_opt"; - value patt_eoi = Gram.Entry.mk "patt_eoi"; - value patt_tcon = Gram.Entry.mk "patt_tcon"; - value phrase = Gram.Entry.mk "phrase"; - value poly_type = Gram.Entry.mk "poly_type"; - value row_field = Gram.Entry.mk "row_field"; - value sem_expr = Gram.Entry.mk "sem_expr"; - value sem_expr_for_list = Gram.Entry.mk "sem_expr_for_list"; - value sem_patt = Gram.Entry.mk "sem_patt"; - value sem_patt_for_list = Gram.Entry.mk "sem_patt_for_list"; - value semi = Gram.Entry.mk "semi"; - value sequence = Gram.Entry.mk "sequence"; - value do_sequence = Gram.Entry.mk "do_sequence"; - value sig_item = Gram.Entry.mk "sig_item"; - value sig_items = Gram.Entry.mk "sig_items"; - value star_ctyp = Gram.Entry.mk "star_ctyp"; - value str_item = Gram.Entry.mk "str_item"; - value str_items = Gram.Entry.mk "str_items"; - value top_phrase = Gram.Entry.mk "top_phrase"; - value type_constraint = Gram.Entry.mk "type_constraint"; - value type_declaration = Gram.Entry.mk "type_declaration"; - value type_ident_and_parameters = Gram.Entry.mk "type_ident_and_parameters"; - value type_kind = Gram.Entry.mk "type_kind"; - value type_longident = Gram.Entry.mk "type_longident"; - value type_longident_and_parameters = Gram.Entry.mk "type_longident_and_parameters"; - value type_parameter = Gram.Entry.mk "type_parameter"; - value type_parameters = Gram.Entry.mk "type_parameters"; - value typevars = Gram.Entry.mk "typevars"; - value use_file = Gram.Entry.mk "use_file"; - value val_longident = Gram.Entry.mk "val_longident"; - value value_let = Gram.Entry.mk "value_let"; - value value_val = Gram.Entry.mk "value_val"; - value with_constr = Gram.Entry.mk "with_constr"; - value expr_quot = Gram.Entry.mk "quotation of expression"; - value patt_quot = Gram.Entry.mk "quotation of pattern"; - value ctyp_quot = Gram.Entry.mk "quotation of type"; - value str_item_quot = Gram.Entry.mk "quotation of structure item"; - value sig_item_quot = Gram.Entry.mk "quotation of signature item"; - value class_str_item_quot = Gram.Entry.mk "quotation of class structure item"; - value class_sig_item_quot = Gram.Entry.mk "quotation of class signature item"; - value module_expr_quot = Gram.Entry.mk "quotation of module expression"; - value module_type_quot = Gram.Entry.mk "quotation of module type"; - value class_type_quot = Gram.Entry.mk "quotation of class type"; - value class_expr_quot = Gram.Entry.mk "quotation of class expression"; - value with_constr_quot = Gram.Entry.mk "quotation of with constraint"; - value binding_quot = Gram.Entry.mk "quotation of binding"; - value rec_binding_quot = Gram.Entry.mk "quotation of record binding"; - value match_case_quot = Gram.Entry.mk "quotation of match_case (try/match/function case)"; - value module_binding_quot = Gram.Entry.mk "quotation of module rec binding"; - value ident_quot = Gram.Entry.mk "quotation of identifier"; - value prefixop = Gram.Entry.mk "prefix operator (start with '!', '?', '~')"; - value infixop0 = Gram.Entry.mk "infix operator (level 0) (comparison operators, and some others)"; - value infixop1 = Gram.Entry.mk "infix operator (level 1) (start with '^', '@')"; - value infixop2 = Gram.Entry.mk "infix operator (level 2) (start with '+', '-')"; - value infixop3 = Gram.Entry.mk "infix operator (level 3) (start with '*', '/', '%')"; - value infixop4 = Gram.Entry.mk "infix operator (level 4) (start with \"**\") (right assoc)"; - - EXTEND Gram - top_phrase: - [ [ `EOI -> None ] ] - ; - END; - - module AntiquotSyntax = struct - module Loc = Ast.Loc; - module Ast = Sig.Camlp4AstToAst Ast; - module Gram = Gram; - value antiquot_expr = Gram.Entry.mk "antiquot_expr"; - value antiquot_patt = Gram.Entry.mk "antiquot_patt"; - EXTEND Gram - antiquot_expr: - [ [ x = expr; `EOI -> x ] ] - ; - antiquot_patt: - [ [ x = patt; `EOI -> x ] ] - ; - END; - value parse_expr loc str = Gram.parse_string antiquot_expr loc str; - value parse_patt loc str = Gram.parse_string antiquot_patt loc str; - end; - - module Quotation = Quotation; - - value wrap directive_handler pa init_loc cs = - let rec loop loc = - let (pl, stopped_at_directive) = pa loc cs in - match stopped_at_directive with - [ Some new_loc -> - let pl = - match List.rev pl with - [ [] -> assert False - | [x :: xs] -> - match directive_handler x with - [ None -> xs - | Some x -> [x :: xs] ] ] - in (List.rev pl) @ (loop new_loc) - | None -> pl ] - in loop init_loc; - - value parse_implem ?(directive_handler = fun _ -> None) _loc cs = - let l = wrap directive_handler (Gram.parse implem) _loc cs in - <:str_item< $list:l$ >>; - - value parse_interf ?(directive_handler = fun _ -> None) _loc cs = - let l = wrap directive_handler (Gram.parse interf) _loc cs in - <:sig_item< $list:l$ >>; - - value print_interf ?input_file:(_) ?output_file:(_) _ = failwith "No interface printer"; - value print_implem ?input_file:(_) ?output_file:(_) _ = failwith "No implementation printer"; -end; diff --git a/camlp4/Camlp4/Options.ml b/camlp4/Camlp4/Options.ml deleted file mode 100644 index 20503b40..00000000 --- a/camlp4/Camlp4/Options.ml +++ /dev/null @@ -1,191 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -type spec_list = list (string * Arg.spec * string); -open Format; - -value rec action_arg s sl = - fun - [ Arg.Unit f -> if s = "" then do { f (); Some sl } else None - | Arg.Bool f -> - if s = "" then - match sl with - [ [s :: sl] -> - try do { f (bool_of_string s); Some sl } with - [ Invalid_argument "bool_of_string" -> None ] - | [] -> None ] - else - try do { f (bool_of_string s); Some sl } with - [ Invalid_argument "bool_of_string" -> None ] - | Arg.Set r -> if s = "" then do { r.val := True; Some sl } else None - | Arg.Clear r -> if s = "" then do { r.val := False; Some sl } else None - | Arg.Rest f -> do { List.iter f [s :: sl]; Some [] } - | Arg.String f -> - if s = "" then - match sl with - [ [s :: sl] -> do { f s; Some sl } - | [] -> None ] - else do { f s; Some sl } - | Arg.Set_string r -> - if s = "" then - match sl with - [ [s :: sl] -> do { r.val := s; Some sl } - | [] -> None ] - else do { r.val := s; Some sl } - | Arg.Int f -> - if s = "" then - match sl with - [ [s :: sl] -> - try do { f (int_of_string s); Some sl } with - [ Failure "int_of_string" -> None ] - | [] -> None ] - else - try do { f (int_of_string s); Some sl } with - [ Failure "int_of_string" -> None ] - | Arg.Set_int r -> - if s = "" then - match sl with - [ [s :: sl] -> - try do { r.val := (int_of_string s); Some sl } with - [ Failure "int_of_string" -> None ] - | [] -> None ] - else - try do { r.val := (int_of_string s); Some sl } with - [ Failure "int_of_string" -> None ] - | Arg.Float f -> - if s = "" then - match sl with - [ [s :: sl] -> do { f (float_of_string s); Some sl } - | [] -> None ] - else do { f (float_of_string s); Some sl } - | Arg.Set_float r -> - if s = "" then - match sl with - [ [s :: sl] -> do { r.val := (float_of_string s); Some sl } - | [] -> None ] - else do { r.val := (float_of_string s); Some sl } - | Arg.Tuple specs -> - let rec action_args s sl = - fun - [ [] -> Some sl - | [spec :: spec_list] -> - match action_arg s sl spec with - [ None -> action_args "" [] spec_list - | Some [s :: sl] -> action_args s sl spec_list - | Some sl -> action_args "" sl spec_list - ] - ] in - action_args s sl specs - | Arg.Symbol syms f -> - match (if s = "" then sl else [s :: sl]) with - [ [s :: sl] when List.mem s syms -> do { f s; Some sl } - | _ -> None ] - ]; - -value common_start s1 s2 = - loop 0 where rec loop i = - if i == String.length s1 || i == String.length s2 then i - else if s1.[i] == s2.[i] then loop (i + 1) - else i; - -value parse_arg fold s sl = - fold - (fun (name, action, _) acu -> - let i = common_start s name in - if i == String.length name then - try action_arg (String.sub s i (String.length s - i)) sl action with - [ Arg.Bad _ -> acu ] - else acu) None; - -value rec parse_aux fold anon_fun = - fun - [ [] -> [] - | [s :: sl] -> - if String.length s > 1 && s.[0] = '-' then - match parse_arg fold s sl with - [ Some sl -> parse_aux fold anon_fun sl - | None -> [s :: parse_aux fold anon_fun sl] ] - else do { (anon_fun s : unit); parse_aux fold anon_fun sl } ]; - -value align_doc key s = - let s = - loop 0 where rec loop i = - if i = String.length s then "" - else if s.[i] = ' ' then loop (i + 1) - else String.sub s i (String.length s - i) - in - let (p, s) = - if String.length s > 0 then - if s.[0] = '<' then - loop 0 where rec loop i = - if i = String.length s then ("", s) - else if s.[i] <> '>' then loop (i + 1) - else - let p = String.sub s 0 (i + 1) in - loop (i + 1) where rec loop i = - if i >= String.length s then (p, "") - else if s.[i] = ' ' then loop (i + 1) - else (p, String.sub s i (String.length s - i)) - else ("", s) - else ("", "") - in - let tab = - String.make (max 1 (16 - String.length key - String.length p)) ' ' - in - p ^ tab ^ s; - -value make_symlist l = - match l with - [ [] -> "" - | [h::t] -> (List.fold_left (fun x y -> x ^ "|" ^ y) ("{" ^ h) t) ^ "}" ]; - -value print_usage_list l = - List.iter - (fun (key, spec, doc) -> - match spec with - [ Arg.Symbol symbs _ -> - let s = make_symlist symbs in - let synt = key ^ " " ^ s in - eprintf " %s %s\n" synt (align_doc synt doc) - | _ -> eprintf " %s %s\n" key (align_doc key doc) ] ) - l; - -value remaining_args argv = - let rec loop l i = - if i == Array.length argv then l else loop [argv.(i) :: l] (i + 1) - in - List.rev (loop [] (Arg.current.val + 1)); - -value init_spec_list = ref []; -value ext_spec_list = ref []; - -value init spec_list = init_spec_list.val := spec_list; - -value add name spec descr = - ext_spec_list.val := [(name, spec, descr) :: ext_spec_list.val]; - -value fold f init = - let spec_list = init_spec_list.val @ ext_spec_list.val in - let specs = Sort.list (fun (k1, _, _) (k2, _, _) -> k1 >= k2) spec_list in - List.fold_right f specs init; - -value parse anon_fun argv = - let remaining_args = remaining_args argv in - parse_aux fold anon_fun remaining_args; - -value ext_spec_list () = ext_spec_list.val; diff --git a/camlp4/Camlp4/Options.mli b/camlp4/Camlp4/Options.mli deleted file mode 100644 index 2deb878d..00000000 --- a/camlp4/Camlp4/Options.mli +++ /dev/null @@ -1,26 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -type spec_list = list (string * Arg.spec * string); -value init : spec_list -> unit; -value add : string -> Arg.spec -> string -> unit; - (** Add an option to the command line options. *) -value print_usage_list : spec_list -> unit; -value ext_spec_list : unit -> spec_list; -value parse : (string -> unit) -> array string -> list string; diff --git a/camlp4/Camlp4/PreCast.ml b/camlp4/Camlp4/PreCast.ml deleted file mode 100644 index 16974851..00000000 --- a/camlp4/Camlp4/PreCast.ml +++ /dev/null @@ -1,67 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id = struct - value name = "Camlp4.PreCast"; - value version = Sys.ocaml_version; -end; - -type camlp4_token = Sig.camlp4_token == - [ KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int and string - | INT32 of int32 and string - | INT64 of int64 and string - | NATIVEINT of nativeint and string - | FLOAT of float and string - | CHAR of char and string - | STRING of string and string - | LABEL of string - | OPTLABEL of string - | QUOTATION of Sig.quotation - | ANTIQUOT of string and string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int and option string - | EOI ]; - -module Loc = Struct.Loc; -module Ast = Struct.Camlp4Ast.Make Loc; -module Token = Struct.Token.Make Loc; -module Lexer = Struct.Lexer.Make Token; -module Gram = Struct.Grammar.Static.Make Lexer; -module DynLoader = Struct.DynLoader; -module Quotation = Struct.Quotation.Make Ast; -module MakeSyntax (U : sig end) = OCamlInitSyntax.Make Ast Gram Quotation; -module Syntax = MakeSyntax (struct end); -module AstFilters = Struct.AstFilters.Make Ast; -module MakeGram = Struct.Grammar.Static.Make; - -module Printers = struct - module OCaml = Printers.OCaml.Make Syntax; - module OCamlr = Printers.OCamlr.Make Syntax; - (* module OCamlrr = Printers.OCamlrr.Make Syntax; *) - module DumpOCamlAst = Printers.DumpOCamlAst.Make Syntax; - module DumpCamlp4Ast = Printers.DumpCamlp4Ast.Make Syntax; - module Null = Printers.Null.Make Syntax; -end; diff --git a/camlp4/Camlp4/PreCast.mli b/camlp4/Camlp4/PreCast.mli deleted file mode 100644 index a7dad534..00000000 --- a/camlp4/Camlp4/PreCast.mli +++ /dev/null @@ -1,76 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -type camlp4_token = Sig.camlp4_token == - [ KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int and string - | INT32 of int32 and string - | INT64 of int64 and string - | NATIVEINT of nativeint and string - | FLOAT of float and string - | CHAR of char and string - | STRING of string and string - | LABEL of string - | OPTLABEL of string - | QUOTATION of Sig.quotation - | ANTIQUOT of string and string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int and option string - | EOI ]; - -module Id : Sig.Id; -module Loc : Sig.Loc; -module Ast : Sig.Camlp4Ast with module Loc = Loc; -module Token : Sig.Token - with module Loc = Loc - and type t = camlp4_token; -module Lexer : Sig.Lexer - with module Loc = Loc - and module Token = Token; -module Gram : Sig.Grammar.Static - with module Loc = Loc - and module Token = Token; -module Quotation : Sig.Quotation with module Ast = Sig.Camlp4AstToAst Ast; -module DynLoader : Sig.DynLoader; -module AstFilters : Sig.AstFilters with module Ast = Ast; -module Syntax : Sig.Camlp4Syntax - with module Loc = Loc - and module Token = Token - and module Ast = Ast - and module Gram = Gram - and module Quotation = Quotation; - -module Printers : sig - module OCaml : (Sig.Printer Ast).S; - module OCamlr : (Sig.Printer Ast).S; - module DumpOCamlAst : (Sig.Printer Ast).S; - module DumpCamlp4Ast : (Sig.Printer Ast).S; - module Null : (Sig.Printer Ast).S; -end; - -module MakeGram (Lexer : Sig.Lexer with module Loc = Loc) - : Sig.Grammar.Static with module Loc = Loc and module Token = Lexer.Token; - -module MakeSyntax (U : sig end) : Sig.Syntax; diff --git a/camlp4/Camlp4/Printers.mlpack b/camlp4/Camlp4/Printers.mlpack deleted file mode 100644 index 9e593a75..00000000 --- a/camlp4/Camlp4/Printers.mlpack +++ /dev/null @@ -1,5 +0,0 @@ -DumpCamlp4Ast -DumpOCamlAst -Null -OCaml -OCamlr diff --git a/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml b/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml deleted file mode 100644 index 5b34e994..00000000 --- a/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml +++ /dev/null @@ -1,51 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id = struct - value name = "Camlp4Printers.DumpCamlp4Ast"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Syntax) -: (Sig.Printer Syntax.Ast).S -= struct - include Syntax; - - value with_open_out_file x f = - match x with - [ Some file -> do { let oc = open_out_bin file; - f oc; - flush oc; - close_out oc } - | None -> do { set_binary_mode_out stdout True; f stdout; flush stdout } ]; - - value dump_ast magic ast oc = do { - output_string oc magic; - output_value oc ast; - }; - - value print_interf ?input_file:(_) ?output_file ast = - with_open_out_file output_file - (dump_ast Camlp4_config.camlp4_ast_intf_magic_number ast); - - value print_implem ?input_file:(_) ?output_file ast = - with_open_out_file output_file - (dump_ast Camlp4_config.camlp4_ast_impl_magic_number ast); - -end; diff --git a/camlp4/Camlp4/Printers/DumpCamlp4Ast.mli b/camlp4/Camlp4/Printers/DumpCamlp4Ast.mli deleted file mode 100644 index 5a0eb96f..00000000 --- a/camlp4/Camlp4/Printers/DumpCamlp4Ast.mli +++ /dev/null @@ -1,21 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Id : Sig.Id; - -module Make (Syntax : Sig.Syntax) : (Sig.Printer Syntax.Ast).S; diff --git a/camlp4/Camlp4/Printers/DumpOCamlAst.ml b/camlp4/Camlp4/Printers/DumpOCamlAst.ml deleted file mode 100644 index 57d2a15e..00000000 --- a/camlp4/Camlp4/Printers/DumpOCamlAst.ml +++ /dev/null @@ -1,53 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id : Sig.Id = struct - value name = "Camlp4Printers.DumpOCamlAst"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) -: (Sig.Printer Syntax.Ast).S -= struct - include Syntax; - module Ast2pt = Struct.Camlp4Ast2OCamlAst.Make Ast; - - value with_open_out_file x f = - match x with - [ Some file -> do { let oc = open_out_bin file; - f oc; - flush oc; - close_out oc } - | None -> do { set_binary_mode_out stdout True; f stdout; flush stdout } ]; - - value dump_pt magic fname pt oc = do { - output_string oc magic; - output_value oc (if fname = "-" then "" else fname); - output_value oc pt; - }; - - value print_interf ?(input_file = "-") ?output_file ast = - let pt = Ast2pt.sig_item ast in - with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_intf_magic_number input_file pt); - - value print_implem ?(input_file = "-") ?output_file ast = - let pt = Ast2pt.str_item ast in - with_open_out_file output_file (dump_pt Camlp4_config.ocaml_ast_impl_magic_number input_file pt); - -end; diff --git a/camlp4/Camlp4/Printers/DumpOCamlAst.mli b/camlp4/Camlp4/Printers/DumpOCamlAst.mli deleted file mode 100644 index 16eafbdb..00000000 --- a/camlp4/Camlp4/Printers/DumpOCamlAst.mli +++ /dev/null @@ -1,21 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Id : Sig.Id; - -module Make (Syntax : Sig.Camlp4Syntax) : (Sig.Printer Syntax.Ast).S; diff --git a/camlp4/Camlp4/Printers/Null.ml b/camlp4/Camlp4/Printers/Null.ml deleted file mode 100644 index 3b3b9549..00000000 --- a/camlp4/Camlp4/Printers/Null.ml +++ /dev/null @@ -1,30 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id = struct - value name = "Camlp4.Printers.Null"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Syntax) = struct - include Syntax; - - value print_interf ?input_file:(_) ?output_file:(_) _ = (); - value print_implem ?input_file:(_) ?output_file:(_) _ = (); -end; diff --git a/camlp4/Camlp4/Printers/Null.mli b/camlp4/Camlp4/Printers/Null.mli deleted file mode 100644 index f81ce613..00000000 --- a/camlp4/Camlp4/Printers/Null.mli +++ /dev/null @@ -1,22 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id : Sig.Id; - -module Make (Syntax : Sig.Syntax) : (Sig.Printer Syntax.Ast).S; diff --git a/camlp4/Camlp4/Printers/OCaml.ml b/camlp4/Camlp4/Printers/OCaml.ml deleted file mode 100644 index 338655f0..00000000 --- a/camlp4/Camlp4/Printers/OCaml.ml +++ /dev/null @@ -1,1156 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open Format; - -module Id = struct - value name = "Camlp4.Printers.OCaml"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - include Syntax; - - type sep = format unit formatter unit; - type fun_binding = [= `patt of Ast.patt | `newtype of string ]; - - value pp = fprintf; - value cut f = fprintf f "@ "; - - value list' elt sep sep' f = - let rec loop = - fun - [ [] -> () - | [x::xs] -> do { pp f sep ; elt f x; pp f sep'; loop xs } ] in - fun - [ [] -> () - | [x] -> do { elt f x; pp f sep' } - | [x::xs] -> do { elt f x; pp f sep'; loop xs } ]; - - value list elt sep f = - let rec loop = - fun - [ [] -> () - | [x::xs] -> do { pp f sep ; elt f x; loop xs } ] in - fun - [ [] -> () - | [x] -> elt f x - | [x::xs] -> do { elt f x; loop xs } ]; - - value rec list_of_meta_list = - fun - [ Ast.LNil -> [] - | Ast.LCons x xs -> [x :: list_of_meta_list xs] - | Ast.LAnt _ -> assert False ]; - - value meta_list elt sep f mxs = - let xs = list_of_meta_list mxs in - list elt sep f xs; - - module CommentFilter = Struct.CommentFilter.Make Token; - value comment_filter = CommentFilter.mk (); - CommentFilter.define (Gram.get_filter ()) comment_filter; - - module StringSet = Set.Make String; - - value infix_lidents = ["asr"; "land"; "lor"; "lsl"; "lsr"; "lxor"; "mod"; "or"]; - - value is_infix = - let first_chars = ['='; '<'; '>'; '|'; '&'; '$'; '@'; '^'; '+'; '-'; '*'; '/'; '%'; '\\'] - and infixes = - List.fold_right StringSet.add infix_lidents StringSet.empty - in fun s -> (StringSet.mem s infixes - || (s <> "" && List.mem s.[0] first_chars)); - - value is_keyword = - let keywords = (* without infix_lidents *) - List.fold_right StringSet.add - ["and"; "as"; "assert"; "begin"; "class"; "constraint"; "do"; - "done"; "downto"; "else"; "end"; "exception"; "external"; "false"; - "for"; "fun"; "function"; "functor"; "if"; "in"; "include"; - "inherit"; "initializer"; "lazy"; "let"; "match"; "method"; "module"; - "mutable"; "new"; "object"; "of"; "open"; "parser"; "private"; "rec"; "sig"; - "struct"; "then"; "to"; "true"; "try"; "type"; "val"; "virtual"; - "when"; "while"; "with"] StringSet.empty - in fun s -> StringSet.mem s keywords; - - module Lexer = Struct.Lexer.Make Token; - let module M = ErrorHandler.Register Lexer.Error in (); - open Sig; - value lexer s = - Lexer.from_string ~quotations:Camlp4_config.quotations.val Loc.ghost s; - value lex_string str = - try match lexer str with parser - [: `(tok, _); `(EOI, _) :] -> tok - with - [ Stream.Failure | Stream.Error _ -> - failwith (sprintf - "Cannot print %S this string contains more than one token" str) - | Lexer.Error.E exn -> - failwith (sprintf - "Cannot print %S this identifier does not respect OCaml lexing rules (%s)" - str (Lexer.Error.to_string exn)) ]; - - (* This is to be sure character literals are always escaped. *) - value ocaml_char x = Char.escaped (Struct.Token.Eval.char x); - - value rec get_expr_args a al = - match a with - [ <:expr< $a1$ $a2$ >> -> get_expr_args a1 [a2 :: al] - | _ -> (a, al) ]; - - value rec get_patt_args a al = - match a with - [ <:patt< $a1$ $a2$ >> -> get_patt_args a1 [a2 :: al] - | _ -> (a, al) ]; - - value rec get_ctyp_args a al = - match a with - [ <:ctyp< $a1$ $a2$ >> -> get_ctyp_args a1 [a2 :: al] - | _ -> (a, al) ]; - - value is_irrefut_patt = Ast.is_irrefut_patt; - - value rec expr_fun_args = - fun - [ <:expr< fun $p$ -> $e$ >> as ge -> - if is_irrefut_patt p then - let (pl, e) = expr_fun_args e in - ([`patt p :: pl], e) - else ([], ge) - | <:expr< fun (type $i$) -> $e$ >> -> - let (pl, e) = expr_fun_args e in - ([`newtype i :: pl], e) - | ge -> ([], ge) ]; - - value rec class_expr_fun_args = - fun - [ <:class_expr< fun $p$ -> $ce$ >> as ge -> - if is_irrefut_patt p then - let (pl, ce) = class_expr_fun_args ce in - ([p :: pl], ce) - else ([], ge) - | ge -> ([], ge) ]; - - value rec do_print_comments_before loc f = - parser - [ [: ` (comm, comm_loc) when Loc.strictly_before comm_loc loc; s :] -> - let () = f comm comm_loc in - do_print_comments_before loc f s - | [: :] -> () ]; - - class printer ?curry_constr:(init_curry_constr = False) ?(comments = True) () = - object (o) - - (** pipe means we are under a match case (try, function) *) - value pipe = False; - value semi = False; - - method under_pipe = {< pipe = True >}; - method under_semi = {< semi = True >}; - method reset_semi = {< semi = False >}; - method reset = {< pipe = False; semi = False >}; - - value semisep : sep = ";;"; - value no_semisep : sep = ""; (* used to mark where ";;" should not occur *) - value mode = if comments then `comments else `no_comments; - value curry_constr = init_curry_constr; - value var_conversion = False; - - method andsep : sep = "@]@ @[<2>and@ "; - method value_val = "val"; - method value_let = "let"; - - method semisep = semisep; - method set_semisep s = {< semisep = s >}; - method set_comments b = {< mode = if b then `comments else `no_comments >}; - method set_loc_and_comments = {< mode = `loc_and_comments >}; - method set_curry_constr b = {< curry_constr = b >}; - - method print_comments_before loc f = - match mode with - [ `comments -> - do_print_comments_before loc (fun c _ -> pp f "%s@ " c) - (CommentFilter.take_stream comment_filter) - | `loc_and_comments -> - let () = pp f "(*loc: %a*)@ " Loc.dump loc in - do_print_comments_before loc - (fun s -> pp f "%s(*comm_loc: %a*)@ " s Loc.dump) - (CommentFilter.take_stream comment_filter) - | _ -> () ]; - - method var f = - fun - [ "" -> pp f "$lid:\"\"$" - | "[]" -> pp f "[]" - | "()" -> pp f "()" - | " True" -> pp f "True" - | " False" -> pp f "False" - | v -> - match (var_conversion, v) with - [ (True, "val") -> pp f "contents" - | (True, "True") -> pp f "true" - | (True, "False") -> pp f "false" - | _ -> - match lex_string v with - [ (LIDENT s | UIDENT s | ESCAPED_IDENT s) when is_keyword s -> - pp f "%s__" s - | (LIDENT s | ESCAPED_IDENT s) when List.mem s infix_lidents -> - pp f "( %s )" s - | SYMBOL s -> - pp f "( %s )" s - | LIDENT s | UIDENT s | ESCAPED_IDENT s -> - pp_print_string f s - | tok -> failwith (sprintf - "Bad token used as an identifier: %s" - (Token.to_string tok)) ] ] ]; - - method type_params f = - fun - [ [] -> () - | [x] -> pp f "%a@ " o#ctyp x - | l -> pp f "@[<1>(%a)@]@ " (list o#ctyp ",@ ") l ]; - - method class_params f = - fun - [ <:ctyp< $t1$, $t2$ >> -> - pp f "@[<1>%a,@ %a@]" o#class_params t1 o#class_params t2 - | x -> o#ctyp f x ]; - - method override_flag f = - fun - [ Ast.OvOverride -> pp f "!" - | Ast.OvNil -> () - | Ast.OvAnt s -> o#anti f s ]; - - method mutable_flag f = fun - [ Ast.MuMutable -> pp f "mutable@ " - | Ast.MuNil -> () - | Ast.MuAnt s -> o#anti f s ]; - - method rec_flag f = fun - [ Ast.ReRecursive -> pp f "rec@ " - | Ast.ReNil -> () - | Ast.ReAnt s -> o#anti f s ]; - - method virtual_flag f = fun - [ Ast.ViVirtual -> pp f "virtual@ " - | Ast.ViNil -> () - | Ast.ViAnt s -> o#anti f s ]; - - method private_flag f = fun - [ Ast.PrPrivate -> pp f "private@ " - | Ast.PrNil -> () - | Ast.PrAnt s -> o#anti f s ]; - - method anti f s = pp f "$%s$" s; - - method seq f = - fun - [ <:expr< $e1$; $e2$ >> -> - pp f "%a;@ %a" o#under_semi#seq e1 o#seq e2 - | <:expr< do { $e$ } >> -> - o#seq f e - | e -> o#expr f e ]; - - (* FIXME when the Format module will fixed. - pp_print_if_newline f (); - pp_print_string f "| "; *) - method match_case f = - fun - [ <:match_case@_loc<>> -> - pp f "@[<2>@ _ ->@ %a@]" o#raise_match_failure _loc - | a -> o#match_case_aux f a ]; - - method match_case_aux f = - fun - [ <:match_case<>> -> () - | <:match_case< $anti:s$ >> -> o#anti f s - | <:match_case< $a1$ | $a2$ >> -> - pp f "%a%a" o#match_case_aux a1 o#match_case_aux a2 - | <:match_case< $p$ -> $e$ >> -> - pp f "@ | @[<2>%a@ ->@ %a@]" o#patt p o#under_pipe#expr e - | <:match_case< $p$ when $w$ -> $e$ >> -> - pp f "@ | @[<2>%a@ when@ %a@ ->@ %a@]" - o#patt p o#under_pipe#expr w o#under_pipe#expr e ]; - - method fun_binding f = - fun - [ `patt p -> o#simple_patt f p - | `newtype i -> pp f "(type %s)" i ]; - - method binding f bi = - let () = o#node f bi Ast.loc_of_binding in - match bi with - [ <:binding<>> -> () - | <:binding< $b1$ and $b2$ >> -> - do { o#binding f b1; pp f o#andsep; o#binding f b2 } - | <:binding< $p$ = $e$ >> -> - let (pl, e') = - match p with - [ <:patt< ($_$ : $_$) >> -> ([], e) - | _ -> expr_fun_args e ] in - match (p, e') with - [ (<:patt< $lid:_$ >>, <:expr< ($e'$ : $t$) >>) -> - pp f "%a :@ %a =@ %a" - (list o#fun_binding "@ ") [`patt p::pl] o#ctyp t o#expr e' - | (<:patt< $lid:_$ >>, _) -> - pp f "%a @[<0>%a=@]@ %a" o#simple_patt - p (list' o#fun_binding "" "@ ") pl o#expr e' - | _ -> - pp f "%a =@ %a" o#simple_patt p o#expr e ] - | <:binding< $anti:s$ >> -> o#anti f s ]; - - method record_binding f bi = - let () = o#node f bi Ast.loc_of_rec_binding in - match bi with - [ <:rec_binding<>> -> () - | <:rec_binding< $i$ = $e$ >> -> - pp f "@ @[<2>%a =@ %a@];" o#var_ident i o#expr e - | <:rec_binding< $b1$ ; $b2$ >> -> - do { o#under_semi#record_binding f b1; - o#under_semi#record_binding f b2 } - | <:rec_binding< $anti:s$ >> -> o#anti f s ]; - - method mk_patt_list = - fun - [ <:patt< [$p1$ :: $p2$] >> -> - let (pl, c) = o#mk_patt_list p2 in - ([p1 :: pl], c) - | <:patt< [] >> -> ([], None) - | p -> ([], Some p) ]; - - method mk_expr_list = - fun - [ <:expr< [$e1$ :: $e2$] >> -> - let (el, c) = o#mk_expr_list e2 in - ([e1 :: el], c) - | <:expr< [] >> -> ([], None) - | e -> ([], Some e) ]; - - method expr_list f = - fun - [ [] -> pp f "[]" - | [e] -> pp f "[ %a ]" o#under_semi#expr e - | el -> pp f "@[<2>[ %a@] ]" (list o#under_semi#expr ";@ ") el ]; - - method expr_list_cons simple f e = - let (el, c) = o#mk_expr_list e in - match c with - [ None -> o#expr_list f el - | Some x -> - (if simple then pp f "@[<2>(%a)@]" else pp f "@[<2>%a@]") - (list o#under_semi#dot_expr " ::@ ") (el @ [x]) ]; - - method patt_expr_fun_args f (p, e) = - let (pl, e) = expr_fun_args e - in pp f "%a@ ->@ %a" (list o#fun_binding "@ ") [p::pl] o#expr e; - - method patt_class_expr_fun_args f (p, ce) = - let (pl, ce) = class_expr_fun_args ce - in pp f "%a =@]@ %a" (list o#simple_patt "@ ") [p::pl] o#class_expr ce; - - method constrain f (t1, t2) = - pp f "@[<2>constraint@ %a =@ %a@]" o#ctyp t1 o#ctyp t2; - - method sum_type f t = - match Ast.list_of_ctyp t [] with - [ [] -> () - | ts -> - pp f "@[| %a@]" (list o#constructor_declaration "@ | ") ts ]; - - method private constructor_declaration f t = - match t with - [ <:ctyp< $t1$ : $t2$ -> $t3$ >> -> pp f "@[<2>%a :@ @[<2>%a@ ->@ %a@]@]" o#ctyp t1 o#constructor_type t2 o#ctyp t3 - | t -> o#ctyp f t ]; - - method string f = pp f "%s"; - method quoted_string f = pp f "%S"; - - method numeric f num suff = - if num.[0] = '-' then pp f "(%s%s)" num suff else pp f "%s%s" num suff; - - method module_expr_get_functor_args accu = - fun - [ <:module_expr< functor ($s$ : $mt$) -> $me$ >> -> - o#module_expr_get_functor_args [(s, mt)::accu] me - | <:module_expr< ($me$ : $mt$) >> -> (List.rev accu, me, Some mt) - | me -> (List.rev accu, me, None) ]; - - method functor_args f = list o#functor_arg "@ " f; - - method functor_arg f (s, mt) = - pp f "@[<2>(%a :@ %a)@]" o#var s o#module_type mt; - - method module_rec_binding f = - fun - [ <:module_binding<>> -> () - | <:module_binding< $s$ : $mt$ = $me$ >> -> - pp f "@[<2>%a :@ %a =@ %a@]" - o#var s o#module_type mt o#module_expr me - | <:module_binding< $s$ : $mt$ >> -> - pp f "@[<2>%a :@ %a@]" o#var s o#module_type mt - | <:module_binding< $mb1$ and $mb2$ >> -> - do { o#module_rec_binding f mb1; - pp f o#andsep; - o#module_rec_binding f mb2 } - | <:module_binding< $anti:s$ >> -> o#anti f s ]; - - method class_declaration f = - fun - [ <:class_expr< ( $ce$ : $ct$ ) >> -> - pp f "%a :@ %a" o#class_expr ce o#class_type ct - | ce -> o#class_expr f ce ]; - - method raise_match_failure f _loc = - let n = Loc.file_name _loc in - let l = Loc.start_line _loc in - let c = Loc.start_off _loc - Loc.start_bol _loc in - o#expr f <:expr< raise (Match_failure $`str:n$ $`int:l$ $`int:c$) >>; - - method node : ! 'a . formatter -> 'a -> ('a -> Loc.t) -> unit = - fun f node loc_of_node -> - o#print_comments_before (loc_of_node node) f; - - method ident f i = - let () = o#node f i Ast.loc_of_ident in - match i with - [ <:ident< $i1$.$i2$ >> -> pp f "%a.@,%a" o#ident i1 o#ident i2 - | <:ident< $i1$ $i2$ >> -> pp f "%a@,(%a)" o#ident i1 o#ident i2 - | <:ident< $anti:s$ >> -> o#anti f s - | <:ident< $lid:s$ >> | <:ident< $uid:s$ >> -> o#var f s ]; - - method private var_ident = {< var_conversion = True >}#ident; - - method expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ ((<:expr< let $rec:_$ $_$ in $_$ >> | - <:expr< let module $_$ = $_$ in $_$ >>) as e) when semi -> - pp f "(%a)" o#reset#expr e - | ((<:expr< match $_$ with [ $_$ ] >> | - <:expr< try $_$ with [ $_$ ] >> | - <:expr< fun [ $_$ ] >>) as e) when pipe || semi -> - pp f "(%a)" o#reset#expr e - - | <:expr< - $x$ >> -> - (* If you want to remove the space take care of - !r *) - pp f "@[<2>-@ %a@]" o#dot_expr x - | <:expr< -. $x$ >> -> - pp f "@[<2>-.@ %a@]" o#dot_expr x (* same note as above *) - | <:expr< [$_$ :: $_$] >> -> o#expr_list_cons False f e - | <:expr@_loc< $lid:n$ $x$ $y$ >> when is_infix n -> - pp f "@[<2>%a@ %s@ %a@]" o#apply_expr x n o#apply_expr y - | <:expr< $x$ $y$ >> -> - let (a, al) = get_expr_args x [y] in - if (not curry_constr) && Ast.is_expr_constructor a then - match al with - [ [ <:expr< ($tup:_$) >> ] -> - pp f "@[<2>%a@ (%a)@]" o#apply_expr x o#expr y - | [_] -> pp f "@[<2>%a@ %a@]" o#apply_expr x o#apply_expr y - | al -> - pp f "@[<2>%a@ (%a)@]" o#apply_expr a - (* The #apply_expr below may put too much parens. - However using #expr would be wrong: PR#5056. *) - (list o#under_pipe#apply_expr ",@ ") al ] - else pp f "@[<2>%a@]" (list o#apply_expr "@ ") [a::al] - | <:expr< $e1$.val := $e2$ >> -> - pp f "@[<2>%a :=@ %a@]" o#dot_expr e1 o#expr e2 - | <:expr< $e1$ := $e2$ >> -> - pp f "@[<2>%a@ <-@ %a@]" o#dot_expr e1 o#expr e2 - | <:expr@loc< fun [] >> -> - pp f "@[<2>fun@ _@ ->@ %a@]" o#raise_match_failure loc - | <:expr< fun $p$ -> $e$ >> when is_irrefut_patt p -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args (`patt p, e) - | <:expr< fun (type $i$) -> $e$ >> -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args (`newtype i, e) - | <:expr< fun [ $a$ ] >> -> - pp f "@[function%a@]" o#match_case a - | <:expr< if $e1$ then $e2$ else $e3$ >> -> - pp f "@[@[<2>if@ %a@]@ @[<2>then@ %a@]@ @[<2>else@ %a@]@]" - o#expr e1 o#under_semi#expr e2 o#under_semi#expr e3 - | <:expr< lazy $e$ >> -> pp f "@[<2>lazy@ %a@]" o#simple_expr e - | <:expr< let $rec:r$ $bi$ in $e$ >> -> - match e with - [ <:expr< let $rec:_$ $_$ in $_$ >> -> - pp f "@[<0>@[<2>let %a%a in@]@ %a@]" - o#rec_flag r o#binding bi o#reset_semi#expr e - | _ -> - 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 - | <:expr< match $e$ with [ $a$ ] >> -> - pp f "@[@[@[<2>match %a@]@ with@]%a@]" - o#expr e o#match_case a - | <:expr< try $e$ with [ $a$ ] >> -> - pp f "@[<0>@[try@ %a@]@ @[<0>with%a@]@]" - o#expr e o#match_case a - | <:expr< assert False >> -> pp f "@[<2>assert@ false@]" - | <:expr< assert $e$ >> -> pp f "@[<2>assert@ %a@]" o#dot_expr e - | <:expr< let module $s$ = $me$ in $e$ >> -> - pp f "@[<2>let module %a =@ %a@]@ @[<2>in@ %a@]" o#var s o#module_expr me o#reset_semi#expr e - | <:expr< object $cst$ end >> -> - pp f "@[@[object@ %a@]@ end@]" o#class_str_item cst - | <:expr< object ($p$ : $t$) $cst$ end >> -> - pp f "@[@[object @[<1>(%a :@ %a)@]@ %a@]@ end@]" - o#patt p o#ctyp t o#class_str_item cst - | <:expr< object ($p$) $cst$ end >> -> - pp f "@[@[object @[<2>(%a)@]@ %a@]@ end@]" - o#patt p o#class_str_item cst - | e -> o#apply_expr f e ]; - - method apply_expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ <:expr< new $i$ >> -> pp f "@[<2>new@ %a@]" o#ident i - | e -> o#dot_expr f e ]; - - method dot_expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ <:expr< $e$.val >> -> pp f "@[<2>!@,%a@]" o#simple_expr e - | <:expr< $e1$ . $e2$ >> -> pp f "@[<2>%a.@,%a@]" o#dot_expr e1 o#dot_expr e2 - | <:expr< $e1$ .( $e2$ ) >> -> - pp f "@[<2>%a.@,(%a)@]" o#dot_expr e1 o#expr e2 - | <:expr< $e1$ .[ $e2$ ] >> -> - pp f "%a.@[<1>[@,%a@]@,]" o#dot_expr e1 o#expr e2 - | <:expr< $e$ # $s$ >> -> pp f "@[<2>%a#@,%s@]" o#dot_expr e s - | e -> o#simple_expr f e ]; - - method simple_expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ <:expr<>> -> () - | <:expr< do { $e$ } >> -> - pp f "@[(%a)@]" o#seq e - | <:expr< [$_$ :: $_$] >> -> o#expr_list_cons True f e - | <:expr< ( $tup:e$ ) >> -> - pp f "@[<1>(%a)@]" o#expr e - | <:expr< [| $e$ |] >> -> - pp f "@[<0>@[<2>[|@ %a@]@ |]@]" o#under_semi#expr e - | <:expr< ($e$ :> $t$) >> -> - pp f "@[<2>(%a :>@ %a)@]" o#expr e o#ctyp t - | <:expr< ($e$ : $t1$ :> $t2$) >> -> - pp f "@[<2>(%a :@ %a :>@ %a)@]" o#expr e o#ctyp t1 o#ctyp t2 - | <:expr< ($e$ : $t$) >> -> - pp f "@[<2>(%a :@ %a)@]" o#expr e o#ctyp t - | <:expr< $anti:s$ >> -> o#anti f s - | <:expr< for $s$ = $e1$ $to:df$ $e2$ do { $e3$ } >> -> - pp f "@[@[@[<2>for %a =@ %a@ %a@ %a@ do@]@ %a@]@ done@]" - o#var s o#expr e1 o#direction_flag df o#expr e2 o#seq e3 - | <:expr< $int:s$ >> -> o#numeric f s "" - | <:expr< $nativeint:s$ >> -> o#numeric f s "n" - | <:expr< $int64:s$ >> -> o#numeric f s "L" - | <:expr< $int32:s$ >> -> o#numeric f s "l" - | <:expr< $flo:s$ >> -> o#numeric f s "" - | <:expr< $chr:s$ >> -> pp f "'%s'" (ocaml_char s) - | <:expr< $id:i$ >> -> o#var_ident f i - | <:expr< { $b$ } >> -> - pp f "@[@[{%a@]@ }@]" o#record_binding b - | <:expr< { ($e$) with $b$ } >> -> - pp f "@[@[{@ (%a)@ with%a@]@ }@]" - o#expr e o#record_binding b - | <:expr< $str:s$ >> -> pp f "\"%s\"" s - | <:expr< while $e1$ do { $e2$ } >> -> - pp f "@[<2>while@ %a@ do@ %a@ done@]" o#expr e1 o#seq e2 - | <:expr< ~ $s$ >> -> pp f "~%s" s - | <:expr< ~ $s$ : $e$ >> -> pp f "@[<2>~%s:@ %a@]" s o#dot_expr e - | <:expr< ? $s$ >> -> pp f "?%s" s - | <:expr< ? $s$ : $e$ >> -> pp f "@[<2>?%s:@ %a@]" s o#dot_expr e - | <:expr< ` $lid:s$ >> -> pp f "`%a" o#var s - | <:expr< {< $b$ >} >> -> - pp f "@[@[{<%a@]@ >}@]" o#record_binding b - | <:expr< $e1$, $e2$ >> -> - pp f "%a,@ %a" o#simple_expr e1 o#simple_expr e2 - | <:expr< $e1$; $e2$ >> -> - pp f "%a;@ %a" o#under_semi#expr e1 o#expr e2 - | <:expr< (module $me$ : $mt$) >> -> - pp f "@[@[(module %a : %a@])@]" - o#module_expr me o#module_type mt - | <:expr< (module $me$) >> -> - pp f "@[@[(module %a@])@]" o#module_expr me - | <:expr< $_$ $_$ >> | <:expr< $_$ . $_$ >> | <:expr< $_$ . ( $_$ ) >> | - <:expr< $_$ . [ $_$ ] >> | <:expr< $_$ := $_$ >> | - <:expr< $_$ # $_$ >> | - <:expr< fun [ $_$ ] >> | <:expr< fun (type $_$) -> $_$ >> | <:expr< match $_$ with [ $_$ ] >> | - <:expr< try $_$ with [ $_$ ] >> | - <:expr< if $_$ then $_$ else $_$ >> | - <:expr< let $rec:_$ $_$ in $_$ >> | - <:expr< let module $_$ = $_$ in $_$ >> | - <:expr< let open $_$ in $_$ >> | - <:expr< assert $_$ >> | <:expr< assert False >> | - <:expr< lazy $_$ >> | <:expr< new $_$ >> | - <:expr< object ($_$) $_$ end >> -> - pp f "(%a)" o#reset#expr e ]; - - method direction_flag f b = - match b with - [ Ast.DiTo -> pp_print_string f "to" - | Ast.DiDownto -> pp_print_string f "downto" - | Ast.DiAnt s -> o#anti f s ]; - - method patt f p = - let () = o#node f p Ast.loc_of_patt in match p with - [ <:patt< ( $p1$ as $p2$ ) >> -> pp f "@[<1>(%a@ as@ %a)@]" o#patt p1 o#patt p2 - | <:patt< $i$ = $p$ >> -> pp f "@[<2>%a =@ %a@]" o#var_ident i o#patt p - | <:patt< $p1$; $p2$ >> -> pp f "%a;@ %a" o#patt p1 o#patt p2 - | p -> o#patt1 f p ]; - - method patt1 f = fun - [ <:patt< $p1$ | $p2$ >> -> pp f "@[<2>%a@ |@ %a@]" o#patt1 p1 o#patt2 p2 - | p -> o#patt2 f p ]; - - method patt2 f = fun - [ (* <:patt< ( $tup:p$ ) >> -> pp f "@[<1>(%a)@]" o#patt3 p - | *) p -> o#patt3 f p ]; - - method patt3 f = fun - [ <:patt< $p1$ .. $p2$ >> -> pp f "@[<2>%a@ ..@ %a@]" o#patt3 p1 o#patt4 p2 - | <:patt< $p1$, $p2$ >> -> pp f "%a,@ %a" o#patt3 p1 o#patt3 p2 - | p -> o#patt4 f p ]; - - method patt4 f = fun - [ <:patt< [$_$ :: $_$] >> as p -> - let (pl, c) = o#mk_patt_list p in - match c with - [ None -> pp f "@[<2>[@ %a@]@ ]" (list o#patt ";@ ") pl - | Some x -> pp f "@[<2>%a@]" (list o#patt5 " ::@ ") (pl @ [x]) ] - | p -> o#patt5 f p ]; - - method patt5 f = fun - [ <:patt< [$_$ :: $_$] >> as p -> o#simple_patt f p - | <:patt< lazy $p$ >> -> - pp f "@[<2>lazy %a@]" o#simple_patt p - | <:patt< $x$ $y$ >> -> - let (a, al) = get_patt_args x [y] in - if not (Ast.is_patt_constructor a) then - Format.eprintf "WARNING: strange pattern application of a non constructor@." - else if curry_constr then - pp f "@[<2>%a@]" (list o#simple_patt "@ ") [a::al] - else - match al with - [ [ <:patt< ($tup:_$) >> ] -> - pp f "@[<2>%a@ (%a)@]" o#simple_patt x o#patt y - | [_] -> pp f "@[<2>%a@ %a@]" o#patt5 x o#simple_patt y - | al -> pp f "@[<2>%a@ (%a)@]" o#patt5 a - (list o#simple_patt ",@ ") al ] - | p -> o#simple_patt f p ]; - - method simple_patt f p = - let () = o#node f p Ast.loc_of_patt in - match p with - [ <:patt<>> -> () - | <:patt< $id:i$ >> -> o#var_ident f i - | <:patt< $anti:s$ >> -> o#anti f s - | <:patt< _ >> -> pp f "_" - | <:patt< ( module $m$ ) >> -> pp f "(module %s)" m - | <:patt< ( $tup:p$ ) >> -> pp f "@[<1>(%a)@]" o#patt3 p - | <:patt< { $p$ } >> -> pp f "@[{@ %a@]@ }" o#patt p - | <:patt< $str:s$ >> -> pp f "\"%s\"" s - | <:patt< ( $p$ : $t$ ) >> -> pp f "@[<1>(%a :@ %a)@]" o#patt p o#ctyp t - | <:patt< $nativeint:s$ >> -> o#numeric f s "n" - | <:patt< $int64:s$ >> -> o#numeric f s "L" - | <:patt< $int32:s$ >> -> o#numeric f s "l" - | <:patt< $int:s$ >> -> o#numeric f s "" - | <:patt< $flo:s$ >> -> o#numeric f s "" - | <:patt< $chr:s$ >> -> pp f "'%s'" (ocaml_char s) - | <:patt< ~ $s$ >> -> pp f "~%s" s - | <:patt< ` $uid:s$ >> -> pp f "`%a" o#var s - | <:patt< # $i$ >> -> pp f "@[<2>#%a@]" o#ident i - | <:patt< [| $p$ |] >> -> pp f "@[<2>[|@ %a@]@ |]" o#patt p - | <:patt< ~ $s$ : ($p$) >> -> pp f "@[<2>~%s:@ (%a)@]" s o#patt p - | <:patt< ? $s$ >> -> pp f "?%s" s - | <:patt< ?($p$) >> -> - pp f "@[<2>?(%a)@]" o#patt_tycon p - | <:patt< ? $s$ : ($p$) >> -> - pp f "@[<2>?%s:@,@[<1>(%a)@]@]" s o#patt_tycon p - | <:patt< ?($p$ = $e$) >> -> - pp f "@[<2>?(%a =@ %a)@]" o#patt_tycon p o#expr e - | <:patt< ? $s$ : ($p$ = $e$) >> -> - pp f "@[<2>?%s:@,@[<1>(%a =@ %a)@]@]" s o#patt_tycon p o#expr e - | <:patt< $_$ $_$ >> | <:patt< ($_$ as $_$) >> | <:patt< $_$ | $_$ >> | - <:patt< $_$ .. $_$ >> | <:patt< $_$, $_$ >> | - <:patt< $_$; $_$ >> | <:patt< $_$ = $_$ >> | <:patt< lazy $_$ >> as p -> - pp f "@[<1>(%a)@]" o#patt p - ]; - - method patt_tycon f = - fun - [ <:patt< ( $p$ : $t$ ) >> -> pp f "%a :@ %a" o#patt p o#ctyp t - | p -> o#patt f p ]; - - method simple_ctyp f t = - let () = o#node f t Ast.loc_of_ctyp in - match t with - [ <:ctyp< $id:i$ >> -> o#ident f i - | <:ctyp< $anti:s$ >> -> o#anti f s - | <:ctyp< _ >> -> pp f "_" - | Ast.TyAnP _ -> pp f "+_" - | Ast.TyAnM _ -> pp f "-_" - | <:ctyp< ~ $s$ : $t$ >> -> pp f "@[<2>%s:@ %a@]" s o#simple_ctyp t - | <:ctyp< ? $s$ : $t$ >> -> pp f "@[<2>?%s:@ %a@]" s o#simple_ctyp t - | <:ctyp< < > >> -> pp f "< >" - | <:ctyp< < .. > >> -> pp f "< .. >" - | <:ctyp< < $t$ .. > >> -> pp f "@[<0>@[<2><@ %a;@ ..@]@ >@]" o#ctyp t - | <:ctyp< < $t$ > >> -> pp f "@[<0>@[<2><@ %a@]@ >@]" o#ctyp t - | <:ctyp< '$s$ >> -> pp f "'%a" o#var s - | <:ctyp< { $t$ } >> -> pp f "@[<2>{@ %a@]@ }" o#ctyp t - | <:ctyp< [ $t$ ] >> -> pp f "@[<0>%a@]" o#sum_type t - | <:ctyp< ( $tup:t$ ) >> -> pp f "@[<1>(%a)@]" o#ctyp t - | <:ctyp< (module $mt$) >> -> pp f "@[<2>(module@ %a@])" o#module_type mt - | <:ctyp< [ = $t$ ] >> -> pp f "@[<2>[@ %a@]@ ]" o#sum_type t - | <:ctyp< [ < $t$ ] >> -> pp f "@[<2>[<@ %a@]@,]" o#sum_type t - | <:ctyp< [ < $t1$ > $t2$ ] >> -> - let (a, al) = get_ctyp_args t2 [] in - pp f "@[<2>[<@ %a@ >@ %a@]@ ]" o#sum_type t1 - (list o#simple_ctyp "@ ") [a::al] - | <:ctyp< [ > $t$ ] >> -> pp f "@[<2>[>@ %a@]@,]" o#sum_type t - | <:ctyp< # $i$ >> -> pp f "@[<2>#%a@]" o#ident i - | <:ctyp< `$s$ >> -> pp f "`%a" o#var s - | <:ctyp< $t1$ * $t2$ >> -> pp f "%a *@ %a" o#simple_ctyp t1 o#simple_ctyp t2 - | <:ctyp<>> -> assert False - | t -> pp f "@[<1>(%a)@]" o#ctyp t ]; - - method ctyp f t = - let () = o#node f t Ast.loc_of_ctyp in - match t with - [ <:ctyp< $t1$ as $t2$ >> -> pp f "@[<2>%a@ as@ %a@]" o#simple_ctyp t1 o#simple_ctyp t2 - | <:ctyp< $t1$ -> $t2$ >> -> pp f "@[<2>%a@ ->@ %a@]" o#ctyp1 t1 o#ctyp t2 - | <:ctyp< +'$s$ >> -> pp f "+'%a" o#var s - | <:ctyp< -'$s$ >> -> pp f "-'%a" o#var s - | <:ctyp< $t1$ | $t2$ >> -> pp f "%a@ | %a" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t1$ : mutable $t2$ >> -> - pp f "@[mutable@ %a :@ %a@]" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t1$ : $t2$ >> -> pp f "@[<2>%a :@ %a@]" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t1$; $t2$ >> -> pp f "%a;@ %a" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t$ of $<:ctyp<>>$ >> -> o#ctyp f t - | <:ctyp< $t1$ of $t2$ >> -> - pp f "@[%a@ @[<3>of@ %a@]@]" o#ctyp t1 o#constructor_type t2 - | <:ctyp< $t1$ of & $t2$ >> -> - pp f "@[%a@ @[<3>of &@ %a@]@]" o#ctyp t1 o#constructor_type t2 - | <:ctyp< $t1$ and $t2$ >> -> pp f "%a@ and %a" o#ctyp t1 o#ctyp t2 - | <:ctyp< mutable $t$ >> -> pp f "@[<2>mutable@ %a@]" o#ctyp t - | <:ctyp< $t1$ & $t2$ >> -> pp f "%a@ &@ %a" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t1$ == $t2$ >> -> - pp f "@[<2>%a =@ %a@]" o#simple_ctyp t1 o#ctyp t2 - | Ast.TyDcl _ tn tp te cl -> do { - pp f "@[<2>%a%a@]" o#type_params tp o#var tn; - match te with - [ <:ctyp<>> -> () - | _ -> pp f " =@ %a" o#ctyp te ]; - if cl <> [] then pp f "@ %a" (list o#constrain "@ ") cl else (); - } - | t -> o#ctyp1 f t ]; - - method ctyp1 f = fun - [ <:ctyp< $t1$ $t2$ >> -> - match get_ctyp_args t1 [t2] with - [ (_, [_]) -> pp f "@[<2>%a@ %a@]" o#simple_ctyp t2 o#simple_ctyp t1 - | (a, al) -> pp f "@[<2>(%a)@ %a@]" (list o#ctyp ",@ ") al o#simple_ctyp a ] - | <:ctyp< ! $t1$ . $t2$ >> -> - let (a, al) = get_ctyp_args t1 [] in - pp f "@[<2>%a.@ %a@]" (list o#ctyp "@ ") [a::al] o#ctyp t2 - | Ast.TyTypePol (_,t1,t2) -> - let (a, al) = get_ctyp_args t1 [] in - pp f "@[<2>type %a.@ %a@]" (list o#ctyp "@ ") [a::al] o#ctyp t2 - | <:ctyp< private $t$ >> -> pp f "@[private@ %a@]" o#simple_ctyp t - | t -> o#simple_ctyp f t ]; - - method constructor_type f t = - match t with - [ <:ctyp@loc< $t1$ and $t2$ >> -> - let () = o#node f t (fun _ -> loc) in - pp f "%a@ * %a" o#constructor_type t1 o#constructor_type t2 - | <:ctyp< $_$ -> $_$ >> -> pp f "(%a)" o#ctyp t - | t -> o#ctyp f t ]; - - - method sig_item f sg = - let () = o#node f sg Ast.loc_of_sig_item in - match sg with - [ <:sig_item<>> -> () - | <:sig_item< $sg$; $<:sig_item<>>$ >> | - <:sig_item< $<:sig_item<>>$; $sg$ >> -> - o#sig_item f sg - | <:sig_item< $sg1$; $sg2$ >> -> - do { o#sig_item f sg1; cut f; o#sig_item f sg2 } - | <:sig_item< exception $t$ >> -> - pp f "@[<2>exception@ %a%(%)@]" o#ctyp t semisep - | <:sig_item< external $s$ : $t$ = $sl$ >> -> - pp f "@[<2>external@ %a :@ %a =@ %a%(%)@]" - o#var s o#ctyp t (meta_list o#quoted_string "@ ") sl semisep - | <:sig_item< module $s1$ ($s2$ : $mt1$) : $mt2$ >> -> - let rec loop accu = - fun - [ <:module_type< functor ($s$ : $mt1$) -> $mt2$ >> -> - loop [(s, mt1)::accu] mt2 - | mt -> (List.rev accu, mt) ] in - let (al, mt) = loop [(s2, mt1)] mt2 in - pp f "@[<2>module %a@ @[<0>%a@] :@ %a%(%)@]" - o#var s1 o#functor_args al o#module_type mt semisep - | <:sig_item< module $s$ : $mt$ >> -> - pp f "@[<2>module %a :@ %a%(%)@]" - o#var s o#module_type mt semisep - | <:sig_item< module type $s$ = $ <:module_type<>> $ >> -> - pp f "@[<2>module type %a%(%)@]" o#var s semisep - | <:sig_item< module type $s$ = $mt$ >> -> - pp f "@[<2>module type %a =@ %a%(%)@]" - o#var s o#module_type mt semisep - | <:sig_item< open $sl$ >> -> - pp f "@[<2>open@ %a%(%)@]" o#ident sl semisep - | <:sig_item< type $t$ >> -> - pp f "@[@[type %a@]%(%)@]" o#ctyp t semisep - | <:sig_item< value $s$ : $t$ >> -> - pp f "@[<2>%s %a :@ %a%(%)@]" - o#value_val o#var s o#ctyp t semisep - | <:sig_item< include $mt$ >> -> - pp f "@[<2>include@ %a%(%)@]" o#module_type mt semisep - | <:sig_item< class type $ct$ >> -> - pp f "@[<2>class type %a%(%)@]" o#class_type ct semisep - | <:sig_item< class $ce$ >> -> - pp f "@[<2>class %a%(%)@]" o#class_type ce semisep - | <:sig_item< module rec $mb$ >> -> - pp f "@[<2>module rec %a%(%)@]" - o#module_rec_binding mb semisep - | <:sig_item< # $_$ $_$ >> -> () - | <:sig_item< $anti:s$ >> -> - pp f "%a%(%)" o#anti s semisep ]; - - method str_item f st = - let () = o#node f st Ast.loc_of_str_item in - match st with - [ <:str_item<>> -> () - | <:str_item< $st$; $<:str_item<>>$ >> | - <:str_item< $<:str_item<>>$; $st$ >> -> - o#str_item f st - | <:str_item< $st1$; $st2$ >> -> - do { o#str_item f st1; cut f; o#str_item f st2 } - | <:str_item< exception $t$ >> -> - pp f "@[<2>exception@ %a%(%)@]" o#ctyp t semisep - | <:str_item< exception $t$ = $sl$ >> -> - pp f "@[<2>exception@ %a =@ %a%(%)@]" o#ctyp t o#ident sl semisep - | <:str_item< external $s$ : $t$ = $sl$ >> -> - pp f "@[<2>external@ %a :@ %a =@ %a%(%)@]" - o#var s o#ctyp t (meta_list o#quoted_string "@ ") sl semisep - | <:str_item< module $s1$ ($s2$ : $mt1$) = $me$ >> -> - match o#module_expr_get_functor_args [(s2, mt1)] me with - [ (al, me, Some mt2) -> - pp f "@[<2>module %a@ @[<0>%a@] :@ %a =@ %a%(%)@]" - o#var s1 o#functor_args al o#module_type mt2 - o#module_expr me semisep - | (al, me, _) -> - pp f "@[<2>module %a@ @[<0>%a@] =@ %a%(%)@]" - o#var s1 o#functor_args al o#module_expr me semisep ] - | <:str_item< module $s$ : $mt$ = $me$ >> -> - pp f "@[<2>module %a :@ %a =@ %a%(%)@]" - o#var s o#module_type mt o#module_expr me semisep - | <:str_item< module $s$ = $me$ >> -> - pp f "@[<2>module %a =@ %a%(%)@]" o#var s o#module_expr me semisep - | <: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 - | <:str_item< type $t$ >> -> - pp f "@[@[type %a@]%(%)@]" o#ctyp t semisep - | <:str_item< value $rec:r$ $bi$ >> -> - pp f "@[<2>%s %a%a%(%)@]" o#value_let o#rec_flag r o#binding bi semisep - | <:str_item< $exp:e$ >> -> - pp f "@[<2>let _ =@ %a%(%)@]" o#expr e semisep - | <:str_item< include $me$ >> -> - pp f "@[<2>include@ %a%(%)@]" o#simple_module_expr me semisep - | <:str_item< class type $ct$ >> -> - pp f "@[<2>class type %a%(%)@]" o#class_type ct semisep - | <:str_item< class $ce$ >> -> - pp f "@[class %a%(%)@]" o#class_declaration ce semisep - | <:str_item< module rec $mb$ >> -> - pp f "@[<2>module rec %a%(%)@]" o#module_rec_binding mb semisep - | <:str_item< # $_$ $_$ >> -> () - | <:str_item< $anti:s$ >> -> pp f "%a%(%)" o#anti s semisep - | Ast.StExc _ _ (Ast.OAnt _) -> assert False ]; - - method module_type f mt = - let () = o#node f mt Ast.loc_of_module_type in - match mt with - [ <:module_type<>> -> assert False - | <:module_type< module type of $me$ >> -> - pp f "@[<2>module type of@ %a@]" o#module_expr me - | <:module_type< $id:i$ >> -> o#ident f i - | <:module_type< $anti:s$ >> -> o#anti f s - | <:module_type< functor ( $s$ : $mt1$ ) -> $mt2$ >> -> - pp f "@[<2>functor@ @[<1>(%a :@ %a)@]@ ->@ %a@]" - o#var s o#module_type mt1 o#module_type mt2 - | <:module_type< '$s$ >> -> pp f "'%a" o#var s - | <:module_type< sig $sg$ end >> -> - pp f "@[@[sig@ %a@]@ end@]" o#sig_item sg - | <:module_type< $mt$ with $wc$ >> -> - pp f "@[<2>%a@ with@ %a@]" o#module_type mt o#with_constraint wc ]; - - method with_constraint f wc = - let () = o#node f wc Ast.loc_of_with_constr in - match wc with - [ <:with_constr<>> -> () - | <:with_constr< type $t1$ = $t2$ >> -> - pp f "@[<2>type@ %a =@ %a@]" o#ctyp t1 o#ctyp t2 - | <:with_constr< module $i1$ = $i2$ >> -> - pp f "@[<2>module@ %a =@ %a@]" o#ident i1 o#ident i2 - | <:with_constr< type $t1$ := $t2$ >> -> - pp f "@[<2>type@ %a :=@ %a@]" o#ctyp t1 o#ctyp t2 - | <:with_constr< module $i1$ := $i2$ >> -> - pp f "@[<2>module@ %a :=@ %a@]" o#ident i1 o#ident i2 - | <:with_constr< $wc1$ and $wc2$ >> -> - do { o#with_constraint f wc1; pp f o#andsep; o#with_constraint f wc2 } - | <:with_constr< $anti:s$ >> -> o#anti f s ]; - - method module_expr f me = - let () = o#node f me Ast.loc_of_module_expr in - match me with - [ <:module_expr<>> -> assert False - | <:module_expr< ( struct $st$ end : sig $sg$ end ) >> -> - pp f "@[<2>@[struct@ %a@]@ end :@ @[sig@ %a@]@ end@]" - o#str_item st o#sig_item sg - | _ -> o#simple_module_expr f me ]; - - method simple_module_expr f me = - let () = o#node f me Ast.loc_of_module_expr in - match me with - [ <:module_expr<>> -> assert False - | <:module_expr< $id:i$ >> -> o#ident f i - | <:module_expr< $anti:s$ >> -> o#anti f s - | <:module_expr< $me1$ $me2$ >> -> - pp f "@[<2>%a@,(%a)@]" o#module_expr me1 o#module_expr me2 - | <:module_expr< functor ( $s$ : $mt$ ) -> $me$ >> -> - pp f "@[<2>functor@ @[<1>(%a :@ %a)@]@ ->@ %a@]" o#var s o#module_type mt o#module_expr me - | <:module_expr< struct $st$ end >> -> - pp f "@[@[struct@ %a@]@ end@]" o#str_item st - | <:module_expr< ( $me$ : $mt$ ) >> -> - pp f "@[<1>(%a :@ %a)@]" o#module_expr me o#module_type mt - | <:module_expr< (value $e$ : $mt$ ) >> -> - pp f "@[<1>(%s %a :@ %a)@]" o#value_val o#expr e o#module_type mt - | <:module_expr< (value $e$ ) >> -> - pp f "@[<1>(%s %a)@]" o#value_val o#expr e - ]; - - method class_expr f ce = - let () = o#node f ce Ast.loc_of_class_expr in - match ce with - [ <:class_expr< $ce$ $e$ >> -> - pp f "@[<2>%a@ %a@]" o#class_expr ce o#apply_expr e - | <:class_expr< $id:i$ >> -> - pp f "@[<2>%a@]" o#ident i - | <:class_expr< $id:i$ [ $t$ ] >> -> - pp f "@[<2>@[<1>[%a]@]@ %a@]" o#class_params t o#ident i - | <:class_expr< virtual $lid:i$ >> -> - pp f "@[<2>virtual@ %a@]" o#var i - | <:class_expr< virtual $lid:i$ [ $t$ ] >> -> - pp f "@[<2>virtual@ @[<1>[%a]@]@ %a@]" o#class_params t o#var i - | <:class_expr< fun $p$ -> $ce$ >> -> - pp f "@[<2>fun@ %a@ ->@ %a@]" o#simple_patt p o#class_expr ce - | <:class_expr< let $rec:r$ $bi$ in $ce$ >> -> - pp f "@[<2>let %a%a@]@ @[<2>in@ %a@]" - o#rec_flag r o#binding bi o#class_expr ce - | <:class_expr< object $cst$ end >> -> - pp f "@[@[object %a@]@ end@]" o#class_str_item cst - | <:class_expr< object ($p$) $cst$ end >> -> - pp f "@[@[object @[<1>(%a)@]@ %a@]@ end@]" - o#patt p o#class_str_item cst - | <:class_expr< ( $ce$ : $ct$ ) >> -> - pp f "@[<1>(%a :@ %a)@]" o#class_expr ce o#class_type ct - | <:class_expr< $anti:s$ >> -> o#anti f s - | <:class_expr< $ce1$ and $ce2$ >> -> - do { o#class_expr f ce1; pp f o#andsep; o#class_expr f ce2 } - | <:class_expr< $ce1$ = fun $p$ -> $ce2$ >> when is_irrefut_patt p -> - pp f "@[<2>%a@ %a" o#class_expr ce1 - o#patt_class_expr_fun_args (p, ce2) - | <:class_expr< $ce1$ = $ce2$ >> -> - pp f "@[<2>%a =@]@ %a" o#class_expr ce1 o#class_expr ce2 - | _ -> assert False ]; - - method class_type f ct = - let () = o#node f ct Ast.loc_of_class_type in - match ct with - [ <:class_type< $id:i$ >> -> - pp f "@[<2>%a@]" o#ident i - | <:class_type< $id:i$ [ $t$ ] >> -> - pp f "@[<2>[@,%a@]@,]@ %a" o#class_params t o#ident i - | <:class_type< virtual $lid:i$ >> -> - pp f "@[<2>virtual@ %a@]" o#var i - | <:class_type< virtual $lid:i$ [ $t$ ] >> -> - pp f "@[<2>virtual@ [@,%a@]@,]@ %a" o#class_params t o#var i - | <:class_type< [ $t$ ] -> $ct$ >> -> - pp f "@[<2>%a@ ->@ %a@]" o#simple_ctyp t o#class_type ct - | <:class_type< object $csg$ end >> -> - pp f "@[@[object@ %a@]@ end@]" o#class_sig_item csg - | <:class_type< object ($t$) $csg$ end >> -> - pp f "@[@[object @[<1>(%a)@]@ %a@]@ end@]" - o#ctyp t o#class_sig_item csg - | <:class_type< $anti:s$ >> -> o#anti f s - | <:class_type< $ct1$ and $ct2$ >> -> - do { o#class_type f ct1; pp f o#andsep; o#class_type f ct2 } - | <:class_type< $ct1$ : $ct2$ >> -> - pp f "%a :@ %a" o#class_type ct1 o#class_type ct2 - | <:class_type< $ct1$ = $ct2$ >> -> - pp f "%a =@ %a" o#class_type ct1 o#class_type ct2 - | _ -> assert False ]; - - method class_sig_item f csg = - let () = o#node f csg Ast.loc_of_class_sig_item in - match csg with - [ <:class_sig_item<>> -> () - | <:class_sig_item< $csg$; $<:class_sig_item<>>$ >> | - <:class_sig_item< $<:class_sig_item<>>$; $csg$ >> -> - o#class_sig_item f csg - | <:class_sig_item< $csg1$; $csg2$ >> -> - do { o#class_sig_item f csg1; cut f; o#class_sig_item f csg2 } - | <:class_sig_item< constraint $t1$ = $t2$ >> -> - pp f "@[<2>constraint@ %a =@ %a%(%)@]" o#ctyp t1 o#ctyp t2 no_semisep - | <:class_sig_item< inherit $ct$ >> -> - pp f "@[<2>inherit@ %a%(%)@]" o#class_type ct no_semisep - | <:class_sig_item< method $private:pr$ $s$ : $t$ >> -> - pp f "@[<2>method %a%a :@ %a%(%)@]" o#private_flag pr o#var s - o#ctyp t no_semisep - | <:class_sig_item< method virtual $private:pr$ $s$ : $t$ >> -> - pp f "@[<2>method virtual %a%a :@ %a%(%)@]" - o#private_flag pr o#var s o#ctyp t no_semisep - | <:class_sig_item< value $mutable:mu$ $virtual:vi$ $s$ : $t$ >> -> - pp f "@[<2>%s %a%a%a :@ %a%(%)@]" - o#value_val o#mutable_flag mu o#virtual_flag vi o#var s o#ctyp t - no_semisep - | <:class_sig_item< $anti:s$ >> -> - pp f "%a%(%)" o#anti s no_semisep ]; - - method class_str_item f cst = - let () = o#node f cst Ast.loc_of_class_str_item in - match cst with - [ <:class_str_item<>> -> () - | <:class_str_item< $cst$; $<:class_str_item<>>$ >> | - <:class_str_item< $<:class_str_item<>>$; $cst$ >> -> - o#class_str_item f cst - | <:class_str_item< $cst1$; $cst2$ >> -> - do { o#class_str_item f cst1; cut f; o#class_str_item f cst2 } - | <:class_str_item< constraint $t1$ = $t2$ >> -> - pp f "@[<2>constraint %a =@ %a%(%)@]" o#ctyp t1 o#ctyp t2 no_semisep - | <:class_str_item< inherit $override:ov$ $ce$ >> -> - pp f "@[<2>inherit%a@ %a%(%)@]" o#override_flag ov o#class_expr ce no_semisep - | <:class_str_item< inherit $override:ov$ $ce$ as $lid:s$ >> -> - pp f "@[<2>inherit%a@ %a as@ %a%(%)@]" o#override_flag ov o#class_expr ce o#var s no_semisep - | <:class_str_item< initializer $e$ >> -> - pp f "@[<2>initializer@ %a%(%)@]" o#expr e no_semisep - | <:class_str_item< method $override:ov$ $private:pr$ $s$ = $e$ >> -> - pp f "@[<2>method%a %a%a =@ %a%(%)@]" - o#override_flag ov o#private_flag pr o#var s o#expr e no_semisep - | <:class_str_item< method $override:ov$ $private:pr$ $s$ : $t$ = $e$ >> -> - pp f "@[<2>method%a %a%a :@ %a =@ %a%(%)@]" - o#override_flag ov o#private_flag pr o#var s o#ctyp t o#expr e no_semisep - | <:class_str_item< method virtual $private:pr$ $s$ : $t$ >> -> - pp f "@[<2>method virtual@ %a%a :@ %a%(%)@]" - o#private_flag pr o#var s o#ctyp t no_semisep - | <:class_str_item< value virtual $mutable:mu$ $s$ : $t$ >> -> - pp f "@[<2>%s virtual %a%a :@ %a%(%)@]" - o#value_val o#mutable_flag mu o#var s o#ctyp t no_semisep - | <:class_str_item< value $override:ov$ $mutable:mu$ $s$ = $e$ >> -> - pp f "@[<2>%s%a %a%a =@ %a%(%)@]" - o#value_val o#override_flag ov o#mutable_flag mu o#var s o#expr e no_semisep - | <:class_str_item< $anti:s$ >> -> - pp f "%a%(%)" o#anti s no_semisep ]; - - method implem f st = - match st with - [ <:str_item< $exp:e$ >> -> pp f "@[<0>%a%(%)@]@." o#expr e semisep - | st -> pp f "@[%a@]@." o#str_item st ]; - - method interf f sg = pp f "@[%a@]@." o#sig_item sg; - end; - - value with_outfile output_file fct arg = - let call close f = do { - try fct f arg with [ exn -> do { close (); raise exn } ]; - close () - } in - match output_file with - [ None -> call (fun () -> ()) std_formatter - | Some s -> - let oc = open_out s in - let f = formatter_of_out_channel oc in - call (fun () -> close_out oc) f ]; - - value print output_file fct = - let o = new printer () in - with_outfile output_file (fct o); - - value print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg; - - value print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st; - -end; - -module MakeMore (Syntax : Sig.Camlp4Syntax) -: (Sig.Printer Syntax.Ast).S -= struct - - include Make Syntax; - - value semisep : ref sep = ref ("@\n" : sep); - value margin = ref 78; - value comments = ref True; - value locations = ref False; - value curry_constr = ref False; - - value print output_file fct = - let o = new printer ~comments:comments.val - ~curry_constr:curry_constr.val () in - let o = o#set_semisep semisep.val in - let o = if locations.val then o#set_loc_and_comments else o in - with_outfile output_file - (fun f -> - let () = Format.pp_set_margin f margin.val in - Format.fprintf f "@[%a@]@." (fct o)); - - value print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg; - - value print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st; - - value check_sep s = - if String.contains s '%' then failwith "-sep Format error, % found in string" - else (Obj.magic (Struct.Token.Eval.string s : string) : sep); - - Options.add "-l" (Arg.Int (fun i -> margin.val := i)) - " line length for pretty printing."; - - Options.add "-ss" (Arg.Unit (fun () -> semisep.val := ";;")) - " Print double semicolons."; - - Options.add "-no_ss" (Arg.Unit (fun () -> semisep.val := "")) - " Do not print double semicolons (default)."; - - Options.add "-sep" (Arg.String (fun s -> semisep.val := check_sep s)) - " Use this string between phrases."; - - Options.add "-curry-constr" (Arg.Set curry_constr) "Use currified constructors."; - - Options.add "-no_comments" (Arg.Clear comments) "Do not add comments."; - - Options.add "-add_locations" (Arg.Set locations) "Add locations as comment."; - -end; diff --git a/camlp4/Camlp4/Printers/OCaml.mli b/camlp4/Camlp4/Printers/OCaml.mli deleted file mode 100644 index 0d36742b..00000000 --- a/camlp4/Camlp4/Printers/OCaml.mli +++ /dev/null @@ -1,167 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Id : Sig.Id; - -module Make (Syntax : Sig.Camlp4Syntax) : sig - open Format; - include Sig.Camlp4Syntax - with module Loc = Syntax.Loc - and module Token = Syntax.Token - and module Ast = Syntax.Ast - and module Gram = Syntax.Gram; - - type sep = format unit formatter unit; - type fun_binding = [= `patt of Ast.patt | `newtype of string ]; - - value list' : - (formatter -> 'a -> unit) -> - format 'b formatter unit -> - format unit formatter unit -> - formatter -> list 'a -> unit; - - value list : - (formatter -> 'a -> unit) -> - format 'b formatter unit -> - formatter -> list 'a -> unit; - - value lex_string : string -> Token.t; - value is_infix : string -> bool; - value is_keyword : string -> bool; - value ocaml_char : string -> string; - value get_expr_args : - Ast.expr -> list Ast.expr -> (Ast.expr * list Ast.expr); - value get_patt_args : - Ast.patt -> list Ast.patt -> (Ast.patt * list Ast.patt); - value get_ctyp_args : - Ast.ctyp -> list Ast.ctyp -> (Ast.ctyp * list Ast.ctyp); - value expr_fun_args : Ast.expr -> (list fun_binding * Ast.expr); - - (** - [new printer ~curry_constr:True ~comments:False] - Default values: curry_constr = False - comments = True - *) - class printer : - [?curry_constr: bool] -> [?comments: bool] -> [unit] -> - object ('a) - method interf : formatter -> Ast.sig_item -> unit; - method implem : formatter -> Ast.str_item -> unit; - method sig_item : formatter -> Ast.sig_item -> unit; - method str_item : formatter -> Ast.str_item -> unit; - - value pipe : bool; - value semi : bool; - value semisep : sep; - value no_semisep : sep; - method value_val : string; - method value_let : string; - method andsep : sep; - method anti : formatter -> string -> unit; - method class_declaration : - formatter -> Ast.class_expr -> unit; - method class_expr : formatter -> Ast.class_expr -> unit; - method class_sig_item : - formatter -> Ast.class_sig_item -> unit; - method class_str_item : - formatter -> Ast.class_str_item -> unit; - method class_type : formatter -> Ast.class_type -> unit; - method constrain : - formatter -> (Ast.ctyp * Ast.ctyp) -> unit; - method ctyp : formatter -> Ast.ctyp -> unit; - method ctyp1 : formatter -> Ast.ctyp -> unit; - method constructor_type : formatter -> Ast.ctyp -> unit; - method dot_expr : formatter -> Ast.expr -> unit; - method apply_expr : formatter -> Ast.expr -> unit; - method expr : formatter -> Ast.expr -> unit; - method expr_list : formatter -> list Ast.expr -> unit; - method expr_list_cons : bool -> formatter -> Ast.expr -> unit; - method fun_binding : formatter -> fun_binding -> unit; - method functor_arg : - formatter -> (string * Ast.module_type) -> unit; - method functor_args : - formatter -> - list (string * Ast.module_type) -> unit; - method ident : formatter -> Ast.ident -> unit; - method numeric : formatter -> string -> string -> unit; - method binding : formatter -> Ast.binding -> unit; - method record_binding : formatter -> Ast.rec_binding -> unit; - method match_case : formatter -> Ast.match_case -> unit; - method match_case_aux : formatter -> Ast.match_case -> unit; - method mk_expr_list : Ast.expr -> (list Ast.expr * option Ast.expr); - method mk_patt_list : Ast.patt -> (list Ast.patt * option Ast.patt); - method simple_module_expr : formatter -> Ast.module_expr -> unit; - method module_expr : formatter -> Ast.module_expr -> unit; - method module_expr_get_functor_args : - list (string * Ast.module_type) -> - Ast.module_expr -> - (list (string * Ast.module_type) * - Ast.module_expr * - option Ast.module_type); - method module_rec_binding : formatter -> Ast.module_binding -> unit; - method module_type : formatter -> Ast.module_type -> unit; - method override_flag : formatter -> Ast.override_flag -> unit; - method mutable_flag : formatter -> Ast.mutable_flag -> unit; - method direction_flag : formatter -> Ast.direction_flag -> unit; - method rec_flag : formatter -> Ast.rec_flag -> unit; - method node : formatter -> 'b -> ('b -> Loc.t) -> unit; - method patt : formatter -> Ast.patt -> unit; - method patt1 : formatter -> Ast.patt -> unit; - method patt2 : formatter -> Ast.patt -> unit; - method patt3 : formatter -> Ast.patt -> unit; - method patt4 : formatter -> Ast.patt -> unit; - method patt5 : formatter -> Ast.patt -> unit; - method patt_tycon : formatter -> Ast.patt -> unit; - method patt_expr_fun_args : - formatter -> (fun_binding * Ast.expr) -> unit; - method patt_class_expr_fun_args : - formatter -> (Ast.patt * Ast.class_expr) -> unit; - method print_comments_before : Loc.t -> formatter -> unit; - method private_flag : formatter -> Ast.private_flag -> unit; - method virtual_flag : formatter -> Ast.virtual_flag -> unit; - method quoted_string : formatter -> string -> unit; - method raise_match_failure : formatter -> Loc.t -> unit; - method reset : 'a; - method reset_semi : 'a; - method semisep : sep; - method set_comments : bool -> 'a; - method set_curry_constr : bool -> 'a; - method set_loc_and_comments : 'a; - method set_semisep : sep -> 'a; - method simple_ctyp : formatter -> Ast.ctyp -> unit; - method simple_expr : formatter -> Ast.expr -> unit; - method simple_patt : formatter -> Ast.patt -> unit; - method seq : formatter -> Ast.expr -> unit; - method string : formatter -> string -> unit; - method sum_type : formatter -> Ast.ctyp -> unit; - method type_params : formatter -> list Ast.ctyp -> unit; - method class_params : formatter -> Ast.ctyp -> unit; - method under_pipe : 'a; - method under_semi : 'a; - method var : formatter -> string -> unit; - method with_constraint : formatter -> Ast.with_constr -> unit; - end; - - value with_outfile : - option string -> (formatter -> 'a -> unit) -> 'a -> unit; - - value print : - option string -> (printer -> formatter -> 'a -> unit) -> 'a -> unit; -end; - -module MakeMore (Syntax : Sig.Camlp4Syntax) : (Sig.Printer Syntax.Ast).S; diff --git a/camlp4/Camlp4/Printers/OCamlr.ml b/camlp4/Camlp4/Printers/OCamlr.ml deleted file mode 100644 index 33a85f3d..00000000 --- a/camlp4/Camlp4/Printers/OCamlr.ml +++ /dev/null @@ -1,324 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open Format; - -module Id = struct - value name = "Camlp4.Printers.OCamlr"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - include Syntax; - open Sig; - - module PP_o = OCaml.Make Syntax; - - open PP_o; - - value pp = fprintf; - - value is_keyword = - let keywords = ["where"] - and not_keywords = ["false"; "function"; "true"; "val"] - in fun s -> not (List.mem s not_keywords) - && (is_keyword s || List.mem s keywords); - - class printer ?curry_constr:(init_curry_constr = True) ?(comments = True) () = - object (o) - inherit PP_o.printer ~curry_constr:init_curry_constr ~comments () as super; - - value! semisep : sep = ";"; - value! no_semisep : sep = ";"; - value mode = if comments then `comments else `no_comments; - value curry_constr = init_curry_constr; - value first_match_case = True; - - method andsep : sep = "@]@ @[<2>and@ "; - method value_val = "value"; - method value_let = "value"; - method under_pipe = o; - method under_semi = o; - method reset_semi = o; - method reset = o; - method private unset_first_match_case = {< first_match_case = False >}; - method private set_first_match_case = {< first_match_case = True >}; - - method seq f e = - let rec self right f e = - let go_right = self right and go_left = self False in - match e with - [ <:expr< let $rec:r$ $bi$ in $e1$ >> -> - if right then - pp f "@[<2>let %a%a@];@ %a" - o#rec_flag r o#binding bi go_right e1 - else - pp f "(%a)" o#expr e - | <:expr< do { $e$ } >> -> go_right f e - | <:expr< $e1$; $e2$ >> -> do { - pp f "%a;@ " go_left e1; - match (right, e2) with - [ (True, <:expr< let $rec:r$ $bi$ in $e3$ >>) -> - pp f "@[<2>let %a%a@];@ %a" - o#rec_flag r o#binding bi go_right e3 - | _ -> go_right f e2 ] } - | e -> o#expr f e ] - in self True f e; - - method var f = - fun - [ "" -> pp f "$lid:\"\"$" - | "[]" -> pp f "[]" - | "()" -> pp f "()" - | " True" -> pp f "True" - | " False" -> pp f "False" - | v -> - match lex_string v with - [ (LIDENT s | UIDENT s | ESCAPED_IDENT s) when is_keyword s -> - pp f "%s__" s - | SYMBOL s -> - pp f "( %s )" s - | LIDENT s | UIDENT s | ESCAPED_IDENT s -> - pp_print_string f s - | tok -> failwith (sprintf - "Bad token used as an identifier: %s" - (Token.to_string tok)) ] ]; - - method type_params f = - fun - [ [] -> () - | [x] -> pp f "@ %a" o#ctyp x - | l -> pp f "@ @[<1>%a@]" (list o#ctyp "@ ") l ]; - - method match_case f = - fun - [ <:match_case<>> -> pp f "@ []" - | m -> pp f "@ [ %a ]" o#set_first_match_case#match_case_aux m ]; - - method match_case_aux f = - fun - [ <:match_case<>> -> () - | <:match_case< $anti:s$ >> -> o#anti f s - | <:match_case< $a1$ | $a2$ >> -> - pp f "%a%a" o#match_case_aux a1 o#unset_first_match_case#match_case_aux a2 - | <:match_case< $p$ -> $e$ >> -> - let () = if first_match_case then () else pp f "@ | " in - pp f "@[<2>%a@ ->@ %a@]" o#patt p o#under_pipe#expr e - | <:match_case< $p$ when $w$ -> $e$ >> -> - let () = if first_match_case then () else pp f "@ | " in - pp f "@[<2>%a@ when@ %a@ ->@ %a@]" - o#patt p o#under_pipe#expr w o#under_pipe#expr e ]; - - method sum_type f = - fun - [ <:ctyp<>> -> pp f "[]" - | t -> pp f "@[[ %a ]@]" o#ctyp t - ]; - - method ident f i = - let () = o#node f i Ast.loc_of_ident in - match i with - [ <:ident< $i1$ $i2$ >> -> pp f "%a@ %a" o#dot_ident i1 o#dot_ident i2 - | i -> o#dot_ident f i ]; - - method private dot_ident f i = - let () = o#node f i Ast.loc_of_ident in - match i with - [ <:ident< $i1$.$i2$ >> -> pp f "%a.@,%a" o#dot_ident i1 o#dot_ident i2 - | <:ident< $anti:s$ >> -> o#anti f s - | <:ident< $lid:s$ >> | <:ident< $uid:s$ >> -> o#var f s - | i -> pp f "(%a)" o#ident i ]; - - method patt4 f = fun - [ <:patt< [$_$ :: $_$] >> as p -> - let (pl, c) = o#mk_patt_list p in - match c with - [ None -> pp f "@[<2>[@ %a@]@ ]" (list o#patt ";@ ") pl - | Some x -> pp f "@[<2>[ %a ::@ %a ]@]" (list o#patt ";@ ") pl o#patt x ] - | p -> super#patt4 f p ]; - - method expr_list_cons _ f e = - let (el, c) = o#mk_expr_list e in - match c with - [ None -> o#expr_list f el - | Some x -> pp f "@[<2>[ %a ::@ %a ]@]" (list o#expr ";@ ") el o#expr x ]; - - method expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ <:expr< $e1$ := $e2$ >> -> - pp f "@[<2>%a@ :=@ %a@]" o#dot_expr e1 o#expr e2 - | <:expr< fun $p$ -> $e$ >> when Ast.is_irrefut_patt p -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args (`patt p, e) - | <:expr< fun (type $i$) -> $e$ >> -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args (`newtype i, e) - | <:expr< fun [ $a$ ] >> -> - pp f "@[fun%a@]" o#match_case a - | <:expr< assert False >> -> pp f "@[<2>assert@ False@]" - | e -> super#expr f e ]; - - method dot_expr f e = - let () = o#node f e Ast.loc_of_expr in - match e with - [ <:expr< $e$.val >> -> pp f "@[<2>%a.@,val@]" o#simple_expr e - | e -> super#dot_expr f e ]; - - method ctyp f t = - let () = o#node f t Ast.loc_of_ctyp in - match t with - [ Ast.TyDcl _ tn tp te cl -> do { - pp f "@[<2>%a%a@]" o#var tn o#type_params tp; - match te with - [ <:ctyp<>> -> () - | _ -> pp f " =@ %a" o#ctyp te ]; - if cl <> [] then pp f "@ %a" (list o#constrain "@ ") cl else (); - } - | <:ctyp< $t1$ : mutable $t2$ >> -> - pp f "@[%a :@ mutable %a@]" o#ctyp t1 o#ctyp t2 - | <:ctyp< $t1$ == $t2$ >> -> - pp f "@[<2>%a ==@ %a@]" o#simple_ctyp t1 o#ctyp t2 - | t -> super#ctyp f t ]; - - method simple_ctyp f t = - let () = o#node f t Ast.loc_of_ctyp in - match t with - [ <:ctyp< [ = $t$ ] >> -> pp f "@[<2>[ =@ %a@]@ ]" o#ctyp t - | <:ctyp< [ < $t$ ] >> -> pp f "@[<2>[ <@ %a@]@,]" o#ctyp t - | <:ctyp< [ < $t1$ > $t2$ ] >> -> - pp f "@[<2>[ <@ %a@ >@ %a@]@ ]" o#ctyp t1 o#ctyp t2 - | <:ctyp< [ > $t$ ] >> -> pp f "@[<2>[ >@ %a@]@,]" o#ctyp t - | <:ctyp< $t1$ == $t2$ >> -> - pp f "@[<2>%a@ ==@ %a@]" o#simple_ctyp t1 o#simple_ctyp t2 - | <:ctyp< ~ $s$ : $t$ >> -> pp f "@[<2>~%s:@ %a@]" s o#simple_ctyp t - | t -> super#simple_ctyp f t ]; - - method ctyp1 f = fun - [ <:ctyp< $t1$ $t2$ >> -> - match get_ctyp_args t1 [t2] with - [ (_, [_]) -> pp f "@[<2>%a@ %a@]" o#simple_ctyp t1 o#simple_ctyp t2 - | (a, al) -> pp f "@[<2>%a@]" (list o#simple_ctyp "@ ") [a::al] ] - | <:ctyp< ! $t1$ . $t2$ >> -> - let (a, al) = get_ctyp_args t1 [] in - pp f "@[<2>! %a.@ %a@]" (list o#ctyp "@ ") [a::al] o#ctyp t2 - | t -> super#ctyp1 f t ]; - - method constructor_type f t = - match t with - [ <:ctyp@loc< $t1$ and $t2$ >> -> - let () = o#node f t (fun _ -> loc) in - pp f "%a@ and %a" o#constructor_type t1 o#constructor_type t2 - | t -> o#ctyp f t ]; - - method str_item f st = - match st with - [ <:str_item< $exp:e$ >> -> pp f "@[<2>%a%(%)@]" o#expr e semisep - | st -> super#str_item f st ]; - - method module_expr f me = - let () = o#node f me Ast.loc_of_module_expr in - match me with - [ <:module_expr< $me1$ $me2$ >> -> - pp f "@[<2>%a@ %a@]" o#module_expr me1 o#simple_module_expr me2 - | me -> super#module_expr f me ]; - - method simple_module_expr f me = - let () = o#node f me Ast.loc_of_module_expr in - match me with - [ <:module_expr< $_$ $_$ >> -> - pp f "(%a)" o#module_expr me - | _ -> super#simple_module_expr f me ]; - - method implem f st = pp f "@[%a@]@." o#str_item st; - - method class_type f ct = - let () = o#node f ct Ast.loc_of_class_type in - match ct with - [ <:class_type< [ $t$ ] -> $ct$ >> -> - pp f "@[<2>[ %a ] ->@ %a@]" o#simple_ctyp t o#class_type ct - | <:class_type< $id:i$ >> -> - pp f "@[<2>%a@]" o#ident i - | <:class_type< $id:i$ [ $t$ ] >> -> - pp f "@[<2>%a [@,%a@]@,]" o#ident i o#class_params t - | <:class_type< virtual $lid:i$ >> -> - pp f "@[<2>virtual@ %a@]" o#var i - | <:class_type< virtual $lid:i$ [ $t$ ] >> -> - pp f "@[<2>virtual@ %a@ [@,%a@]@,]" o#var i o#class_params t - | ct -> super#class_type f ct ]; - - method class_expr f ce = - let () = o#node f ce Ast.loc_of_class_expr in - match ce with - [ <:class_expr< $id:i$ >> -> - pp f "@[<2>%a@]" o#ident i - | <:class_expr< $id:i$ [ $t$ ] >> -> - pp f "@[<2>%a@ @[<1>[%a]@]@]" o#ident i o#class_params t - | <:class_expr< virtual $lid:i$ >> -> - pp f "@[<2>virtual@ %a@]" o#var i - | <:class_expr< virtual $lid:i$ [ $t$ ] >> -> - pp f "@[<2>virtual@ %a@ @[<1>[%a]@]@]" o#var i o#class_params t - | ce -> super#class_expr f ce ]; - end; - - value with_outfile = with_outfile; - - value print output_file fct = - let o = new printer () in - with_outfile output_file (fct o); - - value print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg; - - value print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st; - -end; - -module MakeMore (Syntax : Sig.Camlp4Syntax) -: (Sig.Printer Syntax.Ast).S -= struct - - include Make Syntax; - - value margin = ref 78; - value comments = ref True; - value locations = ref False; - value curry_constr = ref True; - - value print output_file fct = - let o = new printer ~comments:comments.val - ~curry_constr:curry_constr.val () in - let o = if locations.val then o#set_loc_and_comments else o in - with_outfile output_file - (fun f -> - let () = Format.pp_set_margin f margin.val in - Format.fprintf f "@[%a@]@." (fct o)); - - value print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg; - - value print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st; - - Options.add "-l" (Arg.Int (fun i -> margin.val := i)) - " line length for pretty printing."; - - Options.add "-no_comments" (Arg.Clear comments) "Do not add comments."; - - Options.add "-add_locations" (Arg.Set locations) "Add locations as comment."; - -end; diff --git a/camlp4/Camlp4/Printers/OCamlr.mli b/camlp4/Camlp4/Printers/OCamlr.mli deleted file mode 100644 index 45fcbdef..00000000 --- a/camlp4/Camlp4/Printers/OCamlr.mli +++ /dev/null @@ -1,47 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Id : Sig.Id; - -module Make (Syntax : Sig.Camlp4Syntax) : sig - open Format; - include Sig.Camlp4Syntax - with module Loc = Syntax.Loc - and module Token = Syntax.Token - and module Ast = Syntax.Ast - and module Gram = Syntax.Gram; - - (** - [new printer ~curry_constr:c ~comments:False] - Default values: curry_constr = True - comments = True - *) - class printer : - [?curry_constr: bool] -> [?comments: bool] -> [unit] -> - object ('a) - inherit (OCaml.Make Syntax).printer; - end; - - value with_outfile : - option string -> (formatter -> 'a -> unit) -> 'a -> unit; - - value print : - option string -> (printer -> formatter -> 'a -> unit) -> 'a -> unit; -end; - -module MakeMore (Syntax : Sig.Camlp4Syntax) : (Sig.Printer Syntax.Ast).S; diff --git a/camlp4/Camlp4/Register.ml b/camlp4/Camlp4/Register.ml deleted file mode 100644 index 010a8310..00000000 --- a/camlp4/Camlp4/Register.ml +++ /dev/null @@ -1,171 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module PP = Printers; -open PreCast; - -type parser_fun 'a = - ?directive_handler:('a -> option 'a) -> PreCast.Loc.t -> Stream.t char -> 'a; - -type printer_fun 'a = - ?input_file:string -> ?output_file:string -> 'a -> unit; - -value sig_item_parser = ref (fun ?directive_handler:(_) _ _ -> failwith "No interface parser"); -value str_item_parser = ref (fun ?directive_handler:(_) _ _ -> failwith "No implementation parser"); - -value sig_item_printer = ref (fun ?input_file:(_) ?output_file:(_) _ -> failwith "No interface printer"); -value str_item_printer = ref (fun ?input_file:(_) ?output_file:(_) _ -> failwith "No implementation printer"); - -value callbacks = Queue.create (); - -value loaded_modules = ref []; - -value iter_and_take_callbacks f = - let rec loop () = loop (f (Queue.take callbacks)) in - try loop () with [ Queue.Empty -> () ]; - -value declare_dyn_module m f = - begin - (* let () = Format.eprintf "declare_dyn_module: %s@." m in *) - loaded_modules.val := [ m :: loaded_modules.val ]; - Queue.add (m, f) callbacks; - end; - -value register_str_item_parser f = str_item_parser.val := f; -value register_sig_item_parser f = sig_item_parser.val := f; -value register_parser f g = - do { str_item_parser.val := f; sig_item_parser.val := g }; -value current_parser () = (str_item_parser.val, sig_item_parser.val); - -value register_str_item_printer f = str_item_printer.val := f; -value register_sig_item_printer f = sig_item_printer.val := f; -value register_printer f g = - do { str_item_printer.val := f; sig_item_printer.val := g }; -value current_printer () = (str_item_printer.val, sig_item_printer.val); - -module Plugin (Id : Sig.Id) (Maker : functor (Unit : sig end) -> sig end) = struct - declare_dyn_module Id.name (fun _ -> let module M = Maker (struct end) in ()); -end; - -module SyntaxExtension (Id : Sig.Id) (Maker : Sig.SyntaxExtension) = struct - declare_dyn_module Id.name (fun _ -> let module M = Maker Syntax in ()); -end; - -module OCamlSyntaxExtension - (Id : Sig.Id) (Maker : functor (Syn : Sig.Camlp4Syntax) -> Sig.Camlp4Syntax) = -struct - declare_dyn_module Id.name (fun _ -> let module M = Maker Syntax in ()); -end; - -module SyntaxPlugin (Id : Sig.Id) (Maker : functor (Syn : Sig.Syntax) -> sig end) = struct - declare_dyn_module Id.name (fun _ -> let module M = Maker Syntax in ()); -end; - -module Printer - (Id : Sig.Id) (Maker : functor (Syn : Sig.Syntax) - -> (Sig.Printer Syn.Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - let module M = Maker Syntax in - register_printer M.print_implem M.print_interf); -end; - -module OCamlPrinter - (Id : Sig.Id) (Maker : functor (Syn : Sig.Camlp4Syntax) - -> (Sig.Printer Syn.Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - let module M = Maker Syntax in - register_printer M.print_implem M.print_interf); -end; - -module OCamlPreCastPrinter - (Id : Sig.Id) (P : (Sig.Printer PreCast.Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - register_printer P.print_implem P.print_interf); -end; - -module Parser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Ast) - -> (Sig.Parser Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - let module M = Maker PreCast.Ast in - register_parser M.parse_implem M.parse_interf); -end; - -module OCamlParser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Camlp4Ast) - -> (Sig.Parser Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - let module M = Maker PreCast.Ast in - register_parser M.parse_implem M.parse_interf); -end; - -module OCamlPreCastParser - (Id : Sig.Id) (P : (Sig.Parser PreCast.Ast).S) = -struct - declare_dyn_module Id.name (fun _ -> - register_parser P.parse_implem P.parse_interf); -end; - -module AstFilter - (Id : Sig.Id) (Maker : functor (F : Sig.AstFilters) -> sig end) = -struct - declare_dyn_module Id.name (fun _ -> let module M = Maker AstFilters in ()); -end; - -sig_item_parser.val := Syntax.parse_interf; -str_item_parser.val := Syntax.parse_implem; - -module CurrentParser = struct - module Ast = Ast; - value parse_interf ?directive_handler loc strm = - sig_item_parser.val ?directive_handler loc strm; - value parse_implem ?directive_handler loc strm = - str_item_parser.val ?directive_handler loc strm; -end; - -module CurrentPrinter = struct - module Ast = Ast; - value print_interf ?input_file ?output_file ast = - sig_item_printer.val ?input_file ?output_file ast; - value print_implem ?input_file ?output_file ast = - str_item_printer.val ?input_file ?output_file ast; -end; - -value enable_ocaml_printer () = - let module M = OCamlPrinter PP.OCaml.Id PP.OCaml.MakeMore in (); - -value enable_ocamlr_printer () = - let module M = OCamlPrinter PP.OCamlr.Id PP.OCamlr.MakeMore in (); - -(* value enable_ocamlrr_printer () = - let module M = OCamlPrinter PP.OCamlrr.Id PP.OCamlrr.MakeMore in (); *) - -value enable_dump_ocaml_ast_printer () = - let module M = OCamlPrinter PP.DumpOCamlAst.Id PP.DumpOCamlAst.Make in (); - -value enable_dump_camlp4_ast_printer () = - let module M = Printer PP.DumpCamlp4Ast.Id PP.DumpCamlp4Ast.Make in (); - -value enable_null_printer () = - let module M = Printer PP.Null.Id PP.Null.Make in (); diff --git a/camlp4/Camlp4/Register.mli b/camlp4/Camlp4/Register.mli deleted file mode 100644 index d997d417..00000000 --- a/camlp4/Camlp4/Register.mli +++ /dev/null @@ -1,95 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Plugin - (Id : Sig.Id) (Plugin : functor (Unit : sig end) -> sig end) : sig end; - -module SyntaxPlugin - (Id : Sig.Id) (SyntaxPlugin : functor (Syn : Sig.Syntax) -> sig end) : - sig end; - -module SyntaxExtension - (Id : Sig.Id) (SyntaxExtension : Sig.SyntaxExtension) : sig end; - -module OCamlSyntaxExtension - (Id : Sig.Id) - (SyntaxExtension : functor (Syntax : Sig.Camlp4Syntax) -> Sig.Camlp4Syntax) - : sig end; - -(** {6 Registering Parsers} *) - -type parser_fun 'a = - ?directive_handler:('a -> option 'a) -> PreCast.Loc.t -> Stream.t char -> 'a; - -value register_str_item_parser : parser_fun PreCast.Ast.str_item -> unit; -value register_sig_item_parser : parser_fun PreCast.Ast.sig_item -> unit; -value register_parser : parser_fun PreCast.Ast.str_item -> parser_fun PreCast.Ast.sig_item -> unit; -value current_parser : unit -> (parser_fun PreCast.Ast.str_item * parser_fun PreCast.Ast.sig_item); - -module Parser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Ast) -> (Sig.Parser Ast).S) : sig end; - -module OCamlParser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Camlp4Ast) -> (Sig.Parser Ast).S) : sig end; - -module OCamlPreCastParser - (Id : Sig.Id) (Parser : (Sig.Parser PreCast.Ast).S) : sig end; - -(** {6 Registering Printers} *) - -type printer_fun 'a = - ?input_file:string -> ?output_file:string -> 'a -> unit; - -value register_str_item_printer : printer_fun PreCast.Ast.str_item -> unit; -value register_sig_item_printer : printer_fun PreCast.Ast.sig_item -> unit; -value register_printer : printer_fun PreCast.Ast.str_item -> printer_fun PreCast.Ast.sig_item -> unit; -value current_printer : unit -> (printer_fun PreCast.Ast.str_item * printer_fun PreCast.Ast.sig_item); - -module Printer - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Syntax) -> (Sig.Printer Syn.Ast).S) : - sig end; - -module OCamlPrinter - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Camlp4Syntax) -> (Sig.Printer Syn.Ast).S) : - sig end; - -module OCamlPreCastPrinter - (Id : Sig.Id) (Printer : (Sig.Printer PreCast.Ast).S) : - sig end; - -(** {6 Registering Filters} *) - -module AstFilter - (Id : Sig.Id) (Maker : functor (F : Sig.AstFilters) -> sig end) : sig end; - -value declare_dyn_module : string -> (unit -> unit) -> unit; -value iter_and_take_callbacks : ((string * (unit -> unit)) -> unit) -> unit; -value loaded_modules : ref (list string); - -module CurrentParser : (Sig.Parser PreCast.Ast).S; -module CurrentPrinter : (Sig.Printer PreCast.Ast).S; - -value enable_ocaml_printer : unit -> unit; -value enable_ocamlr_printer : unit -> unit; -(* value enable_ocamlrr_printer : unit -> unit; *) -value enable_null_printer : unit -> unit; -value enable_dump_ocaml_ast_printer : unit -> unit; -value enable_dump_camlp4_ast_printer : unit -> unit; diff --git a/camlp4/Camlp4/Sig.ml b/camlp4/Camlp4/Sig.ml deleted file mode 100644 index bae3da5a..00000000 --- a/camlp4/Camlp4/Sig.ml +++ /dev/null @@ -1,1445 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -(** Camlp4 signature repository *) - -(** {6 Basic signatures} *) - -(** Signature with just a type. *) -module type Type = sig - type t; -end; - -(** Signature for errors modules, an Error modules can be registred with - the {!ErrorHandler.Register} functor in order to be well printed. *) -module type Error = sig - type t; - exception E of t; - value to_string : t -> string; - value print : Format.formatter -> t -> unit; -end; - -(** A signature for extensions identifiers. *) -module type Id = sig - - (** The name of the extension, typically the module name. *) - value name : string; - - (** The version of the extension, typically $ Id$ with a versionning system. *) - value version : string; - -end; - -(** A signature for warnings abstract from locations. *) -module Warning (Loc : Type) = struct - module type S = sig - type warning = Loc.t -> string -> unit; - value default_warning : warning; - value current_warning : ref warning; - value print_warning : warning; - end; -end; - -(** {6 Advanced signatures} *) - -(** A signature for locations. *) -module type Loc = sig - - (** The type of locations. Note that, as for OCaml locations, - character numbers in locations refer to character numbers in the - parsed character stream, while line numbers refer to line - numbers in the source file. The source file and the parsed - character stream differ, for instance, when the parsed character - stream contains a line number directive. The line number - directive will only update the file-name field and the - line-number field of the position. It makes therefore no sense - to use character numbers with the source file if the sources - contain line number directives. *) - type t; - - (** Return a start location for the given file name. - This location starts at the begining of the file. *) - value mk : string -> t; - - (** The [ghost] location can be used when no location - information is available. *) - value ghost : t; - - (** {6 Conversion functions} *) - - (** Return a location where both positions are set the given position. *) - value of_lexing_position : Lexing.position -> t; - - (** Return an OCaml location. *) - value to_ocaml_location : t -> Camlp4_import.Location.t; - - (** Return a location from an OCaml location. *) - value of_ocaml_location : Camlp4_import.Location.t -> t; - - (** Return a location from ocamllex buffer. *) - value of_lexbuf : Lexing.lexbuf -> t; - - (** Return a location from [(file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost)]. *) - value of_tuple : (string * int * int * int * int * int * int * bool) -> t; - - (** Return [(file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost)]. *) - value to_tuple : t -> (string * int * int * int * int * int * int * bool); - - (** [merge loc1 loc2] Return a location that starts at [loc1] and end at - [loc2]. *) - value merge : t -> t -> t; - - (** The stop pos becomes equal to the start pos. *) - value join : t -> t; - - (** [move selector n loc] - Return the location where positions are moved. - Affected positions are chosen with [selector]. - Returned positions have their character offset plus [n]. *) - value move : [= `start | `stop | `both ] -> int -> t -> t; - - (** [shift n loc] Return the location where the new start position is the old - stop position, and where the new stop position character offset is the - old one plus [n]. *) - value shift : int -> t -> t; - - (** [move_line n loc] Return the location with the old line count plus [n]. - The "begin of line" of both positions become the current offset. *) - value move_line : int -> t -> t; - - (** {6 Accessors} *) - - (** Return the file name *) - value file_name : t -> string; - - (** Return the line number of the begining of this location. *) - value start_line : t -> int; - - (** Return the line number of the ending of this location. *) - value stop_line : t -> int; - - (** Returns the number of characters from the begining of the stream - to the begining of the line of location's begining. *) - value start_bol : t -> int; - - (** Returns the number of characters from the begining of the stream - to the begining of the line of location's ending. *) - value stop_bol : t -> int; - - (** Returns the number of characters from the begining of the stream - of the begining of this location. *) - value start_off : t -> int; - - (** Return the number of characters from the begining of the stream - of the ending of this location. *) - value stop_off : t -> int; - - (** Return the start position as a Lexing.position. *) - value start_pos : t -> Lexing.position; - - (** Return the stop position as a Lexing.position. *) - value stop_pos : t -> Lexing.position; - - (** Generally, return true if this location does not come - from an input stream. *) - value is_ghost : t -> bool; - - (** Return the associated ghost location. *) - value ghostify : t -> t; - - (** Return the location with the give file name *) - value set_file_name : string -> t -> t; - - (** [strictly_before loc1 loc2] True if the stop position of [loc1] is - strictly_before the start position of [loc2]. *) - value strictly_before : t -> t -> bool; - - (** Return the location with an absolute file name. *) - value make_absolute : t -> t; - - (** Print the location into the formatter in a format suitable for error - reporting. *) - value print : Format.formatter -> t -> unit; - - (** Print the location in a short format useful for debugging. *) - value dump : Format.formatter -> t -> unit; - - (** Same as {!print} but return a string instead of printting it. *) - value to_string : t -> string; - - (** [Exc_located loc e] is an encapsulation of the exception [e] with - the input location [loc]. To be used in quotation expanders - and in grammars to specify some input location for an error. - Do not raise this exception directly: rather use the following - function [Loc.raise]. *) - exception Exc_located of t and exn; - - (** [raise loc e], if [e] is already an [Exc_located] exception, - re-raise it, else raise the exception [Exc_located loc e]. *) - value raise : t -> exn -> 'a; - - (** The name of the location variable used in grammars and in - the predefined quotations for OCaml syntax trees. Default: [_loc]. *) - value name : ref string; - -end; - -(** Abstract syntax tree minimal signature. - Types of this signature are abstract. - See the {!Camlp4Ast} signature for a concrete definition. *) -module type Ast = sig - - (** {6 Syntactic categories as abstract types} *) - - type loc; - type meta_bool; - type meta_option 'a; - type meta_list 'a; - type ctyp; - type patt; - type expr; - type module_type; - type sig_item; - type with_constr; - type module_expr; - type str_item; - type class_type; - type class_sig_item; - type class_expr; - type class_str_item; - type match_case; - type ident; - type binding; - type rec_binding; - type module_binding; - type rec_flag; - type direction_flag; - type mutable_flag; - type private_flag; - type virtual_flag; - type row_var_flag; - type override_flag; - - (** {6 Location accessors} *) - - value loc_of_ctyp : ctyp -> loc; - value loc_of_patt : patt -> loc; - value loc_of_expr : expr -> loc; - value loc_of_module_type : module_type -> loc; - value loc_of_module_expr : module_expr -> loc; - value loc_of_sig_item : sig_item -> loc; - value loc_of_str_item : str_item -> loc; - value loc_of_class_type : class_type -> loc; - value loc_of_class_sig_item : class_sig_item -> loc; - value loc_of_class_expr : class_expr -> loc; - value loc_of_class_str_item : class_str_item -> loc; - value loc_of_with_constr : with_constr -> loc; - value loc_of_binding : binding -> loc; - value loc_of_rec_binding : rec_binding -> loc; - value loc_of_module_binding : module_binding -> loc; - value loc_of_match_case : match_case -> loc; - value loc_of_ident : ident -> loc; - - (** {6 Traversals} *) - - (** This class is the base class for map traversal on the Ast. - To make a custom traversal class one just extend it like that: - - This example swap pairs expression contents: - open Camlp4.PreCast; - [class swap = object - inherit Ast.map as super; - method expr e = - match super#expr e with - \[ <:expr\@_loc< ($e1$, $e2$) >> -> <:expr< ($e2$, $e1$) >> - | e -> e \]; - end; - value _loc = Loc.ghost; - value map = (new swap)#expr; - assert (map <:expr< fun x -> (x, 42) >> = <:expr< fun x -> (42, x) >>);] - *) - class map : object ('self_type) - method string : string -> string; - method list : ! 'a 'b . ('self_type -> 'a -> 'b) -> list 'a -> list 'b; - method meta_bool : meta_bool -> meta_bool; - method meta_option : ! 'a 'b . ('self_type -> 'a -> 'b) -> meta_option 'a -> meta_option 'b; - method meta_list : ! 'a 'b . ('self_type -> 'a -> 'b) -> meta_list 'a -> meta_list 'b; - method loc : loc -> loc; - method expr : expr -> expr; - method patt : patt -> patt; - method ctyp : ctyp -> ctyp; - method str_item : str_item -> str_item; - method sig_item : sig_item -> sig_item; - - method module_expr : module_expr -> module_expr; - method module_type : module_type -> module_type; - method class_expr : class_expr -> class_expr; - method class_type : class_type -> class_type; - method class_sig_item : class_sig_item -> class_sig_item; - method class_str_item : class_str_item -> class_str_item; - method with_constr : with_constr -> with_constr; - method binding : binding -> binding; - method rec_binding : rec_binding -> rec_binding; - method module_binding : module_binding -> module_binding; - method match_case : match_case -> match_case; - method ident : ident -> ident; - method override_flag : override_flag -> override_flag; - method mutable_flag : mutable_flag -> mutable_flag; - method private_flag : private_flag -> private_flag; - method virtual_flag : virtual_flag -> virtual_flag; - method direction_flag : direction_flag -> direction_flag; - method rec_flag : rec_flag -> rec_flag; - method row_var_flag : row_var_flag -> row_var_flag; - - method unknown : ! 'a. 'a -> 'a; - end; - - (** Fold style traversal *) - class fold : object ('self_type) - method string : string -> 'self_type; - method list : ! 'a . ('self_type -> 'a -> 'self_type) -> list 'a -> 'self_type; - method meta_bool : meta_bool -> 'self_type; - method meta_option : ! 'a . ('self_type -> 'a -> 'self_type) -> meta_option 'a -> 'self_type; - method meta_list : ! 'a . ('self_type -> 'a -> 'self_type) -> meta_list 'a -> 'self_type; - method loc : loc -> 'self_type; - method expr : expr -> 'self_type; - method patt : patt -> 'self_type; - method ctyp : ctyp -> 'self_type; - method str_item : str_item -> 'self_type; - method sig_item : sig_item -> 'self_type; - method module_expr : module_expr -> 'self_type; - method module_type : module_type -> 'self_type; - method class_expr : class_expr -> 'self_type; - method class_type : class_type -> 'self_type; - method class_sig_item : class_sig_item -> 'self_type; - method class_str_item : class_str_item -> 'self_type; - method with_constr : with_constr -> 'self_type; - method binding : binding -> 'self_type; - method rec_binding : rec_binding -> 'self_type; - method module_binding : module_binding -> 'self_type; - method match_case : match_case -> 'self_type; - method ident : ident -> 'self_type; - method rec_flag : rec_flag -> 'self_type; - method direction_flag : direction_flag -> 'self_type; - method mutable_flag : mutable_flag -> 'self_type; - method private_flag : private_flag -> 'self_type; - method virtual_flag : virtual_flag -> 'self_type; - method row_var_flag : row_var_flag -> 'self_type; - method override_flag : override_flag -> 'self_type; - - method unknown : ! 'a. 'a -> 'self_type; - end; - -end; - - -(** Signature for OCaml syntax trees. *) (* - This signature is an extension of {!Ast} - It provides: - - Types for all kinds of structure. - - Map: A base class for map traversals. - - Map classes and functions for common kinds. - - == Core language == - ctyp :: Representaion of types - patt :: The type of patterns - expr :: The type of expressions - match_case :: The type of cases for match/function/try constructions - ident :: The type of identifiers (including path like Foo(X).Bar.y) - binding :: The type of let bindings - rec_binding :: The type of record definitions - - == Modules == - module_type :: The type of module types - sig_item :: The type of signature items - str_item :: The type of structure items - module_expr :: The type of module expressions - module_binding :: The type of recursive module definitions - with_constr :: The type of `with' constraints - - == Classes == - class_type :: The type of class types - class_sig_item :: The type of class signature items - class_expr :: The type of class expressions - class_str_item :: The type of class structure items - *) -module type Camlp4Ast = sig - - (** The inner module for locations *) - module Loc : Loc; - - INCLUDE "camlp4/Camlp4/Camlp4Ast.partial.ml"; - - value loc_of_ctyp : ctyp -> loc; - value loc_of_patt : patt -> loc; - value loc_of_expr : expr -> loc; - value loc_of_module_type : module_type -> loc; - value loc_of_module_expr : module_expr -> loc; - value loc_of_sig_item : sig_item -> loc; - value loc_of_str_item : str_item -> loc; - value loc_of_class_type : class_type -> loc; - value loc_of_class_sig_item : class_sig_item -> loc; - value loc_of_class_expr : class_expr -> loc; - value loc_of_class_str_item : class_str_item -> loc; - value loc_of_with_constr : with_constr -> loc; - value loc_of_binding : binding -> loc; - value loc_of_rec_binding : rec_binding -> loc; - value loc_of_module_binding : module_binding -> loc; - value loc_of_match_case : match_case -> loc; - value loc_of_ident : ident -> loc; - - module Meta : sig - module type META_LOC = sig - (* The first location is where to put the returned pattern. - Generally it's _loc to match with <:patt< ... >> quotations. - The second location is the one to treat. *) - value meta_loc_patt : loc -> loc -> patt; - (* The first location is where to put the returned expression. - Generally it's _loc to match with <:expr< ... >> quotations. - The second location is the one to treat. *) - value meta_loc_expr : loc -> loc -> expr; - end; - module MetaLoc : sig - value meta_loc_patt : loc -> loc -> patt; - value meta_loc_expr : loc -> loc -> expr; - end; - module MetaGhostLoc : sig - value meta_loc_patt : loc -> 'a -> patt; - value meta_loc_expr : loc -> 'a -> expr; - end; - module MetaLocVar : sig - value meta_loc_patt : loc -> 'a -> patt; - value meta_loc_expr : loc -> 'a -> expr; - end; - module Make (MetaLoc : META_LOC) : sig - module Expr : sig - value meta_string : loc -> string -> expr; - value meta_int : loc -> string -> expr; - value meta_float : loc -> string -> expr; - value meta_char : loc -> string -> expr; - value meta_bool : loc -> bool -> expr; - value meta_list : (loc -> 'a -> expr) -> loc -> list 'a -> expr; - value meta_binding : loc -> binding -> expr; - value meta_rec_binding : loc -> rec_binding -> expr; - value meta_class_expr : loc -> class_expr -> expr; - value meta_class_sig_item : loc -> class_sig_item -> expr; - value meta_class_str_item : loc -> class_str_item -> expr; - value meta_class_type : loc -> class_type -> expr; - value meta_ctyp : loc -> ctyp -> expr; - value meta_expr : loc -> expr -> expr; - value meta_ident : loc -> ident -> expr; - value meta_match_case : loc -> match_case -> expr; - value meta_module_binding : loc -> module_binding -> expr; - value meta_module_expr : loc -> module_expr -> expr; - value meta_module_type : loc -> module_type -> expr; - value meta_patt : loc -> patt -> expr; - value meta_sig_item : loc -> sig_item -> expr; - value meta_str_item : loc -> str_item -> expr; - value meta_with_constr : loc -> with_constr -> expr; - value meta_rec_flag : loc -> rec_flag -> expr; - value meta_mutable_flag : loc -> mutable_flag -> expr; - value meta_virtual_flag : loc -> virtual_flag -> expr; - value meta_private_flag : loc -> private_flag -> expr; - value meta_row_var_flag : loc -> row_var_flag -> expr; - value meta_override_flag : loc -> override_flag -> expr; - value meta_direction_flag : loc -> direction_flag -> expr; - end; - module Patt : sig - value meta_string : loc -> string -> patt; - value meta_int : loc -> string -> patt; - value meta_float : loc -> string -> patt; - value meta_char : loc -> string -> patt; - value meta_bool : loc -> bool -> patt; - value meta_list : (loc -> 'a -> patt) -> loc -> list 'a -> patt; - value meta_binding : loc -> binding -> patt; - value meta_rec_binding : loc -> rec_binding -> patt; - value meta_class_expr : loc -> class_expr -> patt; - value meta_class_sig_item : loc -> class_sig_item -> patt; - value meta_class_str_item : loc -> class_str_item -> patt; - value meta_class_type : loc -> class_type -> patt; - value meta_ctyp : loc -> ctyp -> patt; - value meta_expr : loc -> expr -> patt; - value meta_ident : loc -> ident -> patt; - value meta_match_case : loc -> match_case -> patt; - value meta_module_binding : loc -> module_binding -> patt; - value meta_module_expr : loc -> module_expr -> patt; - value meta_module_type : loc -> module_type -> patt; - value meta_patt : loc -> patt -> patt; - value meta_sig_item : loc -> sig_item -> patt; - value meta_str_item : loc -> str_item -> patt; - value meta_with_constr : loc -> with_constr -> patt; - value meta_rec_flag : loc -> rec_flag -> patt; - value meta_mutable_flag : loc -> mutable_flag -> patt; - value meta_virtual_flag : loc -> virtual_flag -> patt; - value meta_private_flag : loc -> private_flag -> patt; - value meta_row_var_flag : loc -> row_var_flag -> patt; - value meta_override_flag : loc -> override_flag -> patt; - value meta_direction_flag : loc -> direction_flag -> patt; - end; - end; - end; - - (** See {!Ast.map}. *) - class map : object ('self_type) - method string : string -> string; - method list : ! 'a 'b . ('self_type -> 'a -> 'b) -> list 'a -> list 'b; - method meta_bool : meta_bool -> meta_bool; - method meta_option : ! 'a 'b . ('self_type -> 'a -> 'b) -> meta_option 'a -> meta_option 'b; - method meta_list : ! 'a 'b . ('self_type -> 'a -> 'b) -> meta_list 'a -> meta_list 'b; - method loc : loc -> loc; - method expr : expr -> expr; - method patt : patt -> patt; - method ctyp : ctyp -> ctyp; - method str_item : str_item -> str_item; - method sig_item : sig_item -> sig_item; - - method module_expr : module_expr -> module_expr; - method module_type : module_type -> module_type; - method class_expr : class_expr -> class_expr; - method class_type : class_type -> class_type; - method class_sig_item : class_sig_item -> class_sig_item; - method class_str_item : class_str_item -> class_str_item; - method with_constr : with_constr -> with_constr; - method binding : binding -> binding; - method rec_binding : rec_binding -> rec_binding; - method module_binding : module_binding -> module_binding; - method match_case : match_case -> match_case; - method ident : ident -> ident; - method mutable_flag : mutable_flag -> mutable_flag; - method private_flag : private_flag -> private_flag; - method virtual_flag : virtual_flag -> virtual_flag; - method direction_flag : direction_flag -> direction_flag; - method rec_flag : rec_flag -> rec_flag; - method row_var_flag : row_var_flag -> row_var_flag; - method override_flag : override_flag -> override_flag; - - method unknown : ! 'a. 'a -> 'a; - end; - - (** See {!Ast.fold}. *) - class fold : object ('self_type) - method string : string -> 'self_type; - method list : ! 'a . ('self_type -> 'a -> 'self_type) -> list 'a -> 'self_type; - method meta_bool : meta_bool -> 'self_type; - method meta_option : ! 'a . ('self_type -> 'a -> 'self_type) -> meta_option 'a -> 'self_type; - method meta_list : ! 'a . ('self_type -> 'a -> 'self_type) -> meta_list 'a -> 'self_type; - method loc : loc -> 'self_type; - method expr : expr -> 'self_type; - method patt : patt -> 'self_type; - method ctyp : ctyp -> 'self_type; - method str_item : str_item -> 'self_type; - method sig_item : sig_item -> 'self_type; - method module_expr : module_expr -> 'self_type; - method module_type : module_type -> 'self_type; - method class_expr : class_expr -> 'self_type; - method class_type : class_type -> 'self_type; - method class_sig_item : class_sig_item -> 'self_type; - method class_str_item : class_str_item -> 'self_type; - method with_constr : with_constr -> 'self_type; - method binding : binding -> 'self_type; - method rec_binding : rec_binding -> 'self_type; - method module_binding : module_binding -> 'self_type; - method match_case : match_case -> 'self_type; - method ident : ident -> 'self_type; - method rec_flag : rec_flag -> 'self_type; - method direction_flag : direction_flag -> 'self_type; - method mutable_flag : mutable_flag -> 'self_type; - method private_flag : private_flag -> 'self_type; - method virtual_flag : virtual_flag -> 'self_type; - method row_var_flag : row_var_flag -> 'self_type; - method override_flag : override_flag -> 'self_type; - - method unknown : ! 'a. 'a -> 'self_type; - end; - - value map_expr : (expr -> expr) -> map; - value map_patt : (patt -> patt) -> map; - value map_ctyp : (ctyp -> ctyp) -> map; - value map_str_item : (str_item -> str_item) -> map; - value map_sig_item : (sig_item -> sig_item) -> map; - value map_loc : (loc -> loc) -> map; - - value ident_of_expr : expr -> ident; - value ident_of_patt : patt -> ident; - value ident_of_ctyp : ctyp -> ident; - - value biAnd_of_list : list binding -> binding; - value rbSem_of_list : list rec_binding -> rec_binding; - value paSem_of_list : list patt -> patt; - value paCom_of_list : list patt -> patt; - value tyOr_of_list : list ctyp -> ctyp; - value tyAnd_of_list : list ctyp -> ctyp; - value tyAmp_of_list : list ctyp -> ctyp; - value tySem_of_list : list ctyp -> ctyp; - value tyCom_of_list : list ctyp -> ctyp; - value tySta_of_list : list ctyp -> ctyp; - value stSem_of_list : list str_item -> str_item; - value sgSem_of_list : list sig_item -> sig_item; - value crSem_of_list : list class_str_item -> class_str_item; - value cgSem_of_list : list class_sig_item -> class_sig_item; - value ctAnd_of_list : list class_type -> class_type; - value ceAnd_of_list : list class_expr -> class_expr; - value wcAnd_of_list : list with_constr -> with_constr; - value meApp_of_list : list module_expr -> module_expr; - value mbAnd_of_list : list module_binding -> module_binding; - value mcOr_of_list : list match_case -> match_case; - value idAcc_of_list : list ident -> ident; - value idApp_of_list : list ident -> ident; - value exSem_of_list : list expr -> expr; - value exCom_of_list : list expr -> expr; - - value list_of_ctyp : ctyp -> list ctyp -> list ctyp; - value list_of_binding : binding -> list binding -> list binding; - value list_of_rec_binding : rec_binding -> list rec_binding -> list rec_binding; - value list_of_with_constr : with_constr -> list with_constr -> list with_constr; - value list_of_patt : patt -> list patt -> list patt; - value list_of_expr : expr -> list expr -> list expr; - value list_of_str_item : str_item -> list str_item -> list str_item; - value list_of_sig_item : sig_item -> list sig_item -> list sig_item; - value list_of_class_sig_item : class_sig_item -> list class_sig_item -> list class_sig_item; - value list_of_class_str_item : class_str_item -> list class_str_item -> list class_str_item; - value list_of_class_type : class_type -> list class_type -> list class_type; - value list_of_class_expr : class_expr -> list class_expr -> list class_expr; - value list_of_module_expr : module_expr -> list module_expr -> list module_expr; - value list_of_module_binding : module_binding -> list module_binding -> list module_binding; - value list_of_match_case : match_case -> list match_case -> list match_case; - value list_of_ident : ident -> list ident -> list ident; - - (** Like [String.escape] but takes care to not - escape antiquotations strings. *) - value safe_string_escaped : string -> string; - - (** Returns True if the given pattern is irrefutable. *) - value is_irrefut_patt : patt -> bool; - - value is_constructor : ident -> bool; - value is_patt_constructor : patt -> bool; - value is_expr_constructor : expr -> bool; - - value ty_of_stl : (Loc.t * string * list ctyp) -> ctyp; - value ty_of_sbt : (Loc.t * string * bool * ctyp) -> ctyp; - value bi_of_pe : (patt * expr) -> binding; - value pel_of_binding : binding -> list (patt * expr); - value binding_of_pel : list (patt * expr) -> binding; - value sum_type_of_list : list (Loc.t * string * list ctyp) -> ctyp; - value record_type_of_list : list (Loc.t * string * bool * ctyp) -> ctyp; -end; - -(** This functor is a restriction functor. - It takes a Camlp4Ast module and gives the Ast one. - Typical use is for [with] constraints. - Example: ... with module Ast = Camlp4.Sig.Camlp4AstToAst Camlp4Ast *) -module Camlp4AstToAst (M : Camlp4Ast) : Ast - with type loc = M.loc - and type meta_bool = M.meta_bool - and type meta_option 'a = M.meta_option 'a - and type meta_list 'a = M.meta_list 'a - and type ctyp = M.ctyp - and type patt = M.patt - and type expr = M.expr - and type module_type = M.module_type - and type sig_item = M.sig_item - and type with_constr = M.with_constr - and type module_expr = M.module_expr - and type str_item = M.str_item - and type class_type = M.class_type - and type class_sig_item = M.class_sig_item - and type class_expr = M.class_expr - and type class_str_item = M.class_str_item - and type binding = M.binding - and type rec_binding = M.rec_binding - and type module_binding = M.module_binding - and type match_case = M.match_case - and type ident = M.ident - and type rec_flag = M.rec_flag - and type direction_flag = M.direction_flag - and type mutable_flag = M.mutable_flag - and type private_flag = M.private_flag - and type virtual_flag = M.virtual_flag - and type row_var_flag = M.row_var_flag - and type override_flag = M.override_flag -= M; - -(** Concrete definition of Camlp4 ASTs abstracted from locations. - Since the Ast contains locations, this functor produces Ast types - for a given location type. *) -module MakeCamlp4Ast (Loc : Type) = struct - - INCLUDE "camlp4/Camlp4/Camlp4Ast.partial.ml"; - -end; - -(** {6 Filters} *) - -(** A type for stream filters. *) -type stream_filter 'a 'loc = Stream.t ('a * 'loc) -> Stream.t ('a * 'loc); - -(** Registerinng and folding of Ast filters. - Two kinds of filters must be handled: - - Implementation filters: str_item -> str_item. - - Interface filters: sig_item -> sig_item. *) -module type AstFilters = sig - - module Ast : Camlp4Ast; - - type filter 'a = 'a -> 'a; - - value register_sig_item_filter : (filter Ast.sig_item) -> unit; - value register_str_item_filter : (filter Ast.str_item) -> unit; - value register_topphrase_filter : (filter Ast.str_item) -> unit; - - value fold_interf_filters : ('a -> filter Ast.sig_item -> 'a) -> 'a -> 'a; - value fold_implem_filters : ('a -> filter Ast.str_item -> 'a) -> 'a -> 'a; - value fold_topphrase_filters : ('a -> filter Ast.str_item -> 'a) -> 'a -> 'a; - -end; - -(** ASTs as one single dynamic type *) -module type DynAst = sig - module Ast : Ast; - type tag 'a; - - value ctyp_tag : tag Ast.ctyp; - value patt_tag : tag Ast.patt; - value expr_tag : tag Ast.expr; - value module_type_tag : tag Ast.module_type; - value sig_item_tag : tag Ast.sig_item; - value with_constr_tag : tag Ast.with_constr; - value module_expr_tag : tag Ast.module_expr; - value str_item_tag : tag Ast.str_item; - value class_type_tag : tag Ast.class_type; - value class_sig_item_tag : tag Ast.class_sig_item; - value class_expr_tag : tag Ast.class_expr; - value class_str_item_tag : tag Ast.class_str_item; - value match_case_tag : tag Ast.match_case; - value ident_tag : tag Ast.ident; - value binding_tag : tag Ast.binding; - value rec_binding_tag : tag Ast.rec_binding; - value module_binding_tag : tag Ast.module_binding; - - value string_of_tag : tag 'a -> string; - - module Pack (X : sig type t 'a; end) : sig - type pack; - value pack : tag 'a -> X.t 'a -> pack; - value unpack : tag 'a -> pack -> X.t 'a; - value print_tag : Format.formatter -> pack -> unit; - end; -end; - - -(** {6 Quotation operations} *) - -(** The generic quotation type. - To see how fields are used here is an example: - <:q_name@q_loc> - The last one, q_shift is equal to the length of "<:q_name@q_loc<". *) -type quotation = - { q_name : string ; - q_loc : string ; - q_shift : int ; - q_contents : string }; - -(** The signature for a quotation expander registery. *) -module type Quotation = sig - module Ast : Ast; - module DynAst : DynAst with module Ast = Ast; - open Ast; - - (** The [loc] is the initial location. The option string is the optional name - for the location variable. The string is the quotation contents. *) - type expand_fun 'a = loc -> option string -> string -> 'a; - - (** [add name exp] adds the quotation [name] associated with the - expander [exp]. *) - value add : string -> DynAst.tag 'a -> expand_fun 'a -> unit; - - (** [find name] returns the expander of the given quotation name. *) - value find : string -> DynAst.tag 'a -> expand_fun 'a; - - (** [default] holds the default quotation name. *) - value default : ref string; - - (** [parse_quotation_result parse_function loc position_tag quotation quotation_result] - It's a parser wrapper, this function handles the error reporting for you. *) - value parse_quotation_result : - (loc -> string -> 'a) -> loc -> quotation -> string -> string -> 'a; - - (** function translating quotation names; default = identity *) - value translate : ref (string -> string); - - value expand : loc -> quotation -> DynAst.tag 'a -> 'a; - - (** [dump_file] optionally tells Camlp4 to dump the - result of an expander if this result is syntactically incorrect. - If [None] (default), this result is not dumped. If [Some fname], the - result is dumped in the file [fname]. *) - value dump_file : ref (option string); - - module Error : Error; - -end; - -(** {6 Tokens} *) - -(** A signature for tokens. *) -module type Token = sig - - module Loc : Loc; - - type t; - - value to_string : t -> string; - - value print : Format.formatter -> t -> unit; - - value match_keyword : string -> t -> bool; - - value extract_string : t -> string; - - module Filter : sig - - type token_filter = stream_filter t Loc.t; - - (** The type for this filter chain. - A basic implementation just store the [is_keyword] function given - by [mk] and use it in the [filter] function. *) - type t; - - (** The given predicate function returns true if the given string - is a keyword. This function can be used in filters to translate - identifier tokens to keyword tokens. *) - value mk : (string -> bool) -> t; - - (** This function allows to register a new filter to the token filter chain. - You can choose to not support these and raise an exception. *) - value define_filter : t -> (token_filter -> token_filter) -> unit; - - (** This function filter the given stream and return a filtered stream. - A basic implementation just match identifiers against the [is_keyword] - function to produce token keywords instead. *) - value filter : t -> token_filter; - - (** Called by the grammar system when a keyword is used. - The boolean argument is True when it's the first time that keyword - is used. If you do not care about this information just return [()]. *) - value keyword_added : t -> string -> bool -> unit; - - (** Called by the grammar system when a keyword is no longer used. - If you do not care about this information just return [()]. *) - value keyword_removed : t -> string -> unit; - end; - - module Error : Error; -end; - -(** This signature describes tokens for the OCaml and the Revised - syntax lexing rules. For some tokens the data constructor holds two - representations with the evaluated one and the source one. For example - the INT data constructor holds an integer and a string, this string can - contains more information that's needed for a good pretty-printing - ("42", "4_2", "0000042", "0b0101010"...). - - The meaning of the tokens are: -- [KEYWORD s] is the keyword [s]. -- [LIDENT s] is the ident [s] starting with a lowercase letter. -- [UIDENT s] is the ident [s] starting with an uppercase letter. -- [INT i s] (resp. [INT32 i s], [INT64 i s] and [NATIVEINT i s]) - the integer constant [i] whose string source is [s]. -- [FLOAT f s] is the float constant [f] whose string source is [s]. -- [STRING s s'] is the string constant [s] whose string source is [s']. -- [CHAR c s] is the character constant [c] whose string source is [s]. -- [QUOTATION q] is a quotation [q], see {!Quotation.t} for more information. -- [ANTIQUOT n s] is an antiquotation [n] holding the string [s]. -- [EOI] is the end of input. - - Warning: the second string associated with the constructor [STRING] is - the string found in the source without any interpretation. In particular, - the backslashes are not interpreted. For example, if the input is ["\n"] - the string is *not* a string with one element containing the character - "return", but a string of two elements: the backslash and the character - ["n"]. To interpret a string use the first string of the [STRING] - constructor (or if you need to compute it use the module - {!Camlp4.Struct.Token.Eval}. Same thing for the constructor [CHAR]. *) -type camlp4_token = - [ KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int and string - | INT32 of int32 and string - | INT64 of int64 and string - | NATIVEINT of nativeint and string - | FLOAT of float and string - | CHAR of char and string - | STRING of string and string - | LABEL of string - | OPTLABEL of string - | QUOTATION of quotation - | ANTIQUOT of string and string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int and option string - | EOI ]; - -(** A signature for specialized tokens. *) -module type Camlp4Token = Token with type t = camlp4_token; - -(** {6 Dynamic loaders} *) - -(** A signature for dynamic loaders. *) -module type DynLoader = sig - type t; - exception Error of string and string; - - (** [mk ?ocaml_stdlib ?camlp4_stdlib] - The stdlib flag is true by default. - To disable it use: [mk ~ocaml_stdlib:False] *) - value mk : ?ocaml_stdlib: bool -> ?camlp4_stdlib: bool -> unit -> t; - - (** Fold over the current load path list. *) - value fold_load_path : t -> (string -> 'a -> 'a) -> 'a -> 'a; - - (** [load f] Load the file [f]. If [f] is not an absolute path name, - the load path list used to find the directory of [f]. *) - value load : t -> string -> unit; - - (** [include_dir d] Add the directory [d] in the current load path - list (like the common -I option). *) - value include_dir : t -> string -> unit; - - (** [find_in_path f] Returns the full path of the file [f] if - [f] is in the current load path, raises [Not_found] otherwise. *) - value find_in_path : t -> string -> string; - - (** [is_native] [True] if we are in native code, [False] for bytecode. *) - value is_native : bool; -end; - -(** A signature for grammars. *) -module Grammar = struct - - (** Internal signature for sematantic actions of grammars, - not for the casual user. These functions are unsafe. *) - module type Action = sig - type t ; - - value mk : 'a -> t; - value get : t -> 'a; - value getf : t -> ('a -> 'b); - value getf2 : t -> ('a -> 'b -> 'c); - end; - - type assoc = - [ NonA - | RightA - | LeftA ]; - - type position = - [ First - | Last - | Before of string - | After of string - | Level of string ]; - - (** Common signature for {!Sig.Grammar.Static} and {!Sig.Grammar.Dynamic}. *) - module type Structure = sig - module Loc : Loc; - module Action : Action; - module Token : Token with module Loc = Loc; - - type gram; - type internal_entry; - type tree; - - type token_pattern = ((Token.t -> bool) * string); - type token_info; - type token_stream = Stream.t (Token.t * token_info); - - value token_location : token_info -> Loc.t; - - type symbol = - [ Smeta of string and list symbol and Action.t - | Snterm of internal_entry - | Snterml of internal_entry and string - | Slist0 of symbol - | Slist0sep of symbol and symbol - | Slist1 of symbol - | Slist1sep of symbol and symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree ]; - - type production_rule = (list symbol * Action.t); - type single_extend_statment = - (option string * option assoc * list production_rule); - type extend_statment = - (option position * list single_extend_statment); - type delete_statment = list symbol; - - type fold 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> Stream.t 'a -> 'c; - - type foldsep 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> (Stream.t 'a -> unit) -> Stream.t 'a -> 'c; - - end; - - (** Signature for Camlp4 grammars. Here the dynamic means that you can produce as - many grammar values as needed with a single grammar module. - If you do not need many grammar values it's preferable to use a static one. *) - module type Dynamic = sig - include Structure; - - (** Make a new grammar. *) - value mk : unit -> gram; - - module Entry : sig - (** The abstract type of grammar entries. The type parameter is the type - of the semantic actions that are associated with this entry. *) - type t 'a; - - (** Make a new entry from the given name. *) - value mk : gram -> string -> t 'a; - - (** Make a new entry from a name and an hand made token parser. *) - value of_parser : - gram -> string -> (token_stream -> 'a) -> t 'a; - - (** Clear the entry and setup this parser instead. *) - value setup_parser : - t 'a -> (token_stream -> 'a) -> unit; - - (** Get the entry name. *) - value name : t 'a -> string; - - (** Print the given entry into the given formatter. *) - value print : Format.formatter -> t 'a -> unit; - - (** Same as {!print} but show the left-factorization. *) - value dump : Format.formatter -> t 'a -> unit; - - (**/**) - value obj : t 'a -> internal_entry; - value clear : t 'a -> unit; - (**/**) - end; - - (** [get_filter g] Get the {!Token.Filter} associated to the [g]. *) - value get_filter : gram -> Token.Filter.t; - - type not_filtered 'a; - - (** This function is called by the EXTEND ... END syntax. *) - value extend : Entry.t 'a -> extend_statment -> unit; - - (** The delete rule. *) - value delete_rule : Entry.t 'a -> delete_statment -> unit; - - value srules : Entry.t 'a -> list (list symbol * Action.t) -> symbol; - value sfold0 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold1 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold0sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; - (* value sfold1sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; *) - - (** Use the lexer to produce a non filtered token stream from a char stream. *) - value lex : gram -> Loc.t -> Stream.t char -> not_filtered (Stream.t (Token.t * Loc.t)); - - (** Token stream from string. *) - value lex_string : gram -> Loc.t -> string -> not_filtered (Stream.t (Token.t * Loc.t)); - - (** Filter a token stream using the {!Token.Filter} module *) - value filter : gram -> not_filtered (Stream.t (Token.t * Loc.t)) -> token_stream; - - (** Lex, filter and parse a stream of character. *) - value parse : Entry.t 'a -> Loc.t -> Stream.t char -> 'a; - - (** Same as {!parse} but from a string. *) - value parse_string : Entry.t 'a -> Loc.t -> string -> 'a; - - (** Parse a token stream that is not filtered yet. *) - value parse_tokens_before_filter : - Entry.t 'a -> not_filtered (Stream.t (Token.t * Loc.t)) -> 'a; - - (** Parse a token stream that is already filtered. *) - value parse_tokens_after_filter : - Entry.t 'a -> token_stream -> 'a; - - end; - - (** Signature for Camlp4 grammars. Here the static means that there is only - one grammar value by grammar module. If you do not need to store the grammar - value it's preferable to use a static one. *) - module type Static = sig - include Structure; - - module Entry : sig - (** The abstract type of grammar entries. The type parameter is the type - of the semantic actions that are associated with this entry. *) - type t 'a; - - (** Make a new entry from the given name. *) - value mk : string -> t 'a; - - (** Make a new entry from a name and an hand made token parser. *) - value of_parser : - string -> (token_stream -> 'a) -> t 'a; - - (** Clear the entry and setup this parser instead. *) - value setup_parser : - t 'a -> (token_stream -> 'a) -> unit; - - (** Get the entry name. *) - value name : t 'a -> string; - - (** Print the given entry into the given formatter. *) - value print : Format.formatter -> t 'a -> unit; - - (** Same as {!print} but show the left-factorization. *) - value dump : Format.formatter -> t 'a -> unit; - - (**/**) - value obj : t 'a -> internal_entry; - value clear : t 'a -> unit; - (**/**) - end; - - (** Get the {!Token.Filter} associated to the grammar module. *) - value get_filter : unit -> Token.Filter.t; - - type not_filtered 'a; - - (** This function is called by the EXTEND ... END syntax. *) - value extend : Entry.t 'a -> extend_statment -> unit; - - (** The delete rule. *) - value delete_rule : Entry.t 'a -> delete_statment -> unit; - value srules : Entry.t 'a -> list (list symbol * Action.t) -> symbol; - value sfold0 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold1 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold0sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; - (* value sfold1sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; *) - - (** Use the lexer to produce a non filtered token stream from a char stream. *) - value lex : Loc.t -> Stream.t char -> not_filtered (Stream.t (Token.t * Loc.t)); - - (** Token stream from string. *) - value lex_string : Loc.t -> string -> not_filtered (Stream.t (Token.t * Loc.t)); - - (** Filter a token stream using the {!Token.Filter} module *) - value filter : not_filtered (Stream.t (Token.t * Loc.t)) -> token_stream; - - (** Lex, filter and parse a stream of character. *) - value parse : Entry.t 'a -> Loc.t -> Stream.t char -> 'a; - - (** Same as {!parse} but from a string. *) - value parse_string : Entry.t 'a -> Loc.t -> string -> 'a; - - (** Parse a token stream that is not filtered yet. *) - value parse_tokens_before_filter : - Entry.t 'a -> not_filtered (Stream.t (Token.t * Loc.t)) -> 'a; - - (** Parse a token stream that is already filtered. *) - value parse_tokens_after_filter : - Entry.t 'a -> token_stream -> 'a; - - end; - -end; - -(** A signature for lexers. *) -module type Lexer = sig - module Loc : Loc; - module Token : Token with module Loc = Loc; - module Error : Error; - - (** The constructor for a lexing function. The character stream is the input - stream to be lexed. The result is a stream of pairs of a token and - a location. - The lexer do not use global (mutable) variables: instantiations - of [Lexer.mk ()] do not perturb each other. *) - value mk : unit -> (Loc.t -> Stream.t char -> Stream.t (Token.t * Loc.t)); -end; - - -(** A signature for parsers abstract from ASTs. *) -module Parser (Ast : Ast) = struct - module type SIMPLE = sig - (** The parse function for expressions. - The underlying expression grammar entry is generally "expr; EOI". *) - value parse_expr : Ast.loc -> string -> Ast.expr; - - (** The parse function for patterns. - The underlying pattern grammar entry is generally "patt; EOI". *) - value parse_patt : Ast.loc -> string -> Ast.patt; - end; - - module type S = sig - - (** Called when parsing an implementation (ml file) to build the syntax - tree; the returned list contains the phrases (structure items) as a - single "declare" node (a list of structure items); if the parser - encounter a directive it stops (since the directive may change the - syntax), the given [directive_handler] function evaluates it and - the parsing starts again. *) - value parse_implem : ?directive_handler:(Ast.str_item -> option Ast.str_item) -> - Ast.loc -> Stream.t char -> Ast.str_item; - - (** Same as {!parse_implem} but for interface (mli file). *) - value parse_interf : ?directive_handler:(Ast.sig_item -> option Ast.sig_item) -> - Ast.loc -> Stream.t char -> Ast.sig_item; - end; -end; - -(** A signature for printers abstract from ASTs. *) -module Printer (Ast : Ast) = struct - module type S = sig - - value print_interf : ?input_file:string -> ?output_file:string -> - Ast.sig_item -> unit; - value print_implem : ?input_file:string -> ?output_file:string -> - Ast.str_item -> unit; - - end; -end; - -(** A syntax module is a sort of constistent bunch of modules and values. - In such a module you have a parser, a printer, and also modules for - locations, syntax trees, tokens, grammars, quotations, anti-quotations. - There is also the main grammar entries. *) -module type Syntax = sig - module Loc : Loc; - module Ast : Ast with type loc = Loc.t; - module Token : Token with module Loc = Loc; - module Gram : Grammar.Static with module Loc = Loc and module Token = Token; - module Quotation : Quotation with module Ast = Ast; - - module AntiquotSyntax : (Parser Ast).SIMPLE; - - include (Warning Loc).S; - include (Parser Ast).S; - include (Printer Ast).S; -end; - -(** A syntax module is a sort of constistent bunch of modules and values. - In such a module you have a parser, a printer, and also modules for - locations, syntax trees, tokens, grammars, quotations, anti-quotations. - There is also the main grammar entries. *) -module type Camlp4Syntax = sig - module Loc : Loc; - - module Ast : Camlp4Ast with module Loc = Loc; - module Token : Camlp4Token with module Loc = Loc; - - module Gram : Grammar.Static with module Loc = Loc and module Token = Token; - module Quotation : Quotation with module Ast = Camlp4AstToAst Ast; - - module AntiquotSyntax : (Parser Ast).SIMPLE; - - include (Warning Loc).S; - include (Parser Ast).S; - include (Printer Ast).S; - - value interf : Gram.Entry.t (list Ast.sig_item * option Loc.t); - value implem : Gram.Entry.t (list Ast.str_item * option Loc.t); - value top_phrase : Gram.Entry.t (option Ast.str_item); - value use_file : Gram.Entry.t (list Ast.str_item * option Loc.t); - value a_CHAR : Gram.Entry.t string; - value a_FLOAT : Gram.Entry.t string; - value a_INT : Gram.Entry.t string; - value a_INT32 : Gram.Entry.t string; - value a_INT64 : Gram.Entry.t string; - value a_LABEL : Gram.Entry.t string; - value a_LIDENT : Gram.Entry.t string; - value a_NATIVEINT : Gram.Entry.t string; - value a_OPTLABEL : Gram.Entry.t string; - value a_STRING : Gram.Entry.t string; - value a_UIDENT : Gram.Entry.t string; - value a_ident : Gram.Entry.t string; - value amp_ctyp : Gram.Entry.t Ast.ctyp; - value and_ctyp : Gram.Entry.t Ast.ctyp; - value match_case : Gram.Entry.t Ast.match_case; - value match_case0 : Gram.Entry.t Ast.match_case; - value match_case_quot : Gram.Entry.t Ast.match_case; - value binding : Gram.Entry.t Ast.binding; - value binding_quot : Gram.Entry.t Ast.binding; - value rec_binding_quot : Gram.Entry.t Ast.rec_binding; - value class_declaration : Gram.Entry.t Ast.class_expr; - value class_description : Gram.Entry.t Ast.class_type; - value class_expr : Gram.Entry.t Ast.class_expr; - value class_expr_quot : Gram.Entry.t Ast.class_expr; - value class_fun_binding : Gram.Entry.t Ast.class_expr; - value class_fun_def : Gram.Entry.t Ast.class_expr; - value class_info_for_class_expr : Gram.Entry.t Ast.class_expr; - value class_info_for_class_type : Gram.Entry.t Ast.class_type; - value class_longident : Gram.Entry.t Ast.ident; - value class_longident_and_param : Gram.Entry.t Ast.class_expr; - value class_name_and_param : Gram.Entry.t (string * Ast.ctyp); - value class_sig_item : Gram.Entry.t Ast.class_sig_item; - value class_sig_item_quot : Gram.Entry.t Ast.class_sig_item; - value class_signature : Gram.Entry.t Ast.class_sig_item; - value class_str_item : Gram.Entry.t Ast.class_str_item; - value class_str_item_quot : Gram.Entry.t Ast.class_str_item; - value class_structure : Gram.Entry.t Ast.class_str_item; - value class_type : Gram.Entry.t Ast.class_type; - value class_type_declaration : Gram.Entry.t Ast.class_type; - value class_type_longident : Gram.Entry.t Ast.ident; - value class_type_longident_and_param : Gram.Entry.t Ast.class_type; - value class_type_plus : Gram.Entry.t Ast.class_type; - value class_type_quot : Gram.Entry.t Ast.class_type; - value comma_ctyp : Gram.Entry.t Ast.ctyp; - value comma_expr : Gram.Entry.t Ast.expr; - value comma_ipatt : Gram.Entry.t Ast.patt; - value comma_patt : Gram.Entry.t Ast.patt; - value comma_type_parameter : Gram.Entry.t Ast.ctyp; - value constrain : Gram.Entry.t (Ast.ctyp * Ast.ctyp); - value constructor_arg_list : Gram.Entry.t Ast.ctyp; - value constructor_declaration : Gram.Entry.t Ast.ctyp; - value constructor_declarations : Gram.Entry.t Ast.ctyp; - value ctyp : Gram.Entry.t Ast.ctyp; - value ctyp_quot : Gram.Entry.t Ast.ctyp; - value cvalue_binding : Gram.Entry.t Ast.expr; - value direction_flag : Gram.Entry.t Ast.direction_flag; - value direction_flag_quot : Gram.Entry.t Ast.direction_flag; - value dummy : Gram.Entry.t unit; - value eq_expr : Gram.Entry.t (string -> Ast.patt -> Ast.patt); - value expr : Gram.Entry.t Ast.expr; - value expr_eoi : Gram.Entry.t Ast.expr; - value expr_quot : Gram.Entry.t Ast.expr; - value field_expr : Gram.Entry.t Ast.rec_binding; - value field_expr_list : Gram.Entry.t Ast.rec_binding; - value fun_binding : Gram.Entry.t Ast.expr; - value fun_def : Gram.Entry.t Ast.expr; - value ident : Gram.Entry.t Ast.ident; - value ident_quot : Gram.Entry.t Ast.ident; - value ipatt : Gram.Entry.t Ast.patt; - value ipatt_tcon : Gram.Entry.t Ast.patt; - value label : Gram.Entry.t string; - value label_declaration : Gram.Entry.t Ast.ctyp; - value label_declaration_list : Gram.Entry.t Ast.ctyp; - value label_expr : Gram.Entry.t Ast.rec_binding; - value label_expr_list : Gram.Entry.t Ast.rec_binding; - value label_ipatt : Gram.Entry.t Ast.patt; - value label_ipatt_list : Gram.Entry.t Ast.patt; - value label_longident : Gram.Entry.t Ast.ident; - value label_patt : Gram.Entry.t Ast.patt; - value label_patt_list : Gram.Entry.t Ast.patt; - value labeled_ipatt : Gram.Entry.t Ast.patt; - value let_binding : Gram.Entry.t Ast.binding; - value meth_list : Gram.Entry.t (Ast.ctyp * Ast.row_var_flag); - value meth_decl : Gram.Entry.t Ast.ctyp; - value module_binding : Gram.Entry.t Ast.module_binding; - value module_binding0 : Gram.Entry.t Ast.module_expr; - value module_binding_quot : Gram.Entry.t Ast.module_binding; - value module_declaration : Gram.Entry.t Ast.module_type; - value module_expr : Gram.Entry.t Ast.module_expr; - value module_expr_quot : Gram.Entry.t Ast.module_expr; - value module_longident : Gram.Entry.t Ast.ident; - value module_longident_with_app : Gram.Entry.t Ast.ident; - value module_rec_declaration : Gram.Entry.t Ast.module_binding; - value module_type : Gram.Entry.t Ast.module_type; - value package_type : Gram.Entry.t Ast.module_type; - value module_type_quot : Gram.Entry.t Ast.module_type; - value more_ctyp : Gram.Entry.t Ast.ctyp; - value name_tags : Gram.Entry.t Ast.ctyp; - value opt_as_lident : Gram.Entry.t string; - value opt_class_self_patt : Gram.Entry.t Ast.patt; - value opt_class_self_type : Gram.Entry.t Ast.ctyp; - value opt_comma_ctyp : Gram.Entry.t Ast.ctyp; - value opt_dot_dot : Gram.Entry.t Ast.row_var_flag; - value row_var_flag_quot : Gram.Entry.t Ast.row_var_flag; - value opt_eq_ctyp : Gram.Entry.t Ast.ctyp; - value opt_expr : Gram.Entry.t Ast.expr; - value opt_meth_list : Gram.Entry.t Ast.ctyp; - value opt_mutable : Gram.Entry.t Ast.mutable_flag; - value mutable_flag_quot : Gram.Entry.t Ast.mutable_flag; - value opt_override : Gram.Entry.t Ast.override_flag; - value override_flag_quot : Gram.Entry.t Ast.override_flag; - value opt_polyt : Gram.Entry.t Ast.ctyp; - value opt_private : Gram.Entry.t Ast.private_flag; - value private_flag_quot : Gram.Entry.t Ast.private_flag; - value opt_rec : Gram.Entry.t Ast.rec_flag; - value rec_flag_quot : Gram.Entry.t Ast.rec_flag; - value opt_virtual : Gram.Entry.t Ast.virtual_flag; - value virtual_flag_quot : Gram.Entry.t Ast.virtual_flag; - value opt_when_expr : Gram.Entry.t Ast.expr; - value patt : Gram.Entry.t Ast.patt; - value patt_as_patt_opt : Gram.Entry.t Ast.patt; - value patt_eoi : Gram.Entry.t Ast.patt; - value patt_quot : Gram.Entry.t Ast.patt; - value patt_tcon : Gram.Entry.t Ast.patt; - value phrase : Gram.Entry.t Ast.str_item; - value poly_type : Gram.Entry.t Ast.ctyp; - value row_field : Gram.Entry.t Ast.ctyp; - value sem_expr : Gram.Entry.t Ast.expr; - value sem_expr_for_list : Gram.Entry.t (Ast.expr -> Ast.expr); - value sem_patt : Gram.Entry.t Ast.patt; - value sem_patt_for_list : Gram.Entry.t (Ast.patt -> Ast.patt); - value semi : Gram.Entry.t unit; - value sequence : Gram.Entry.t Ast.expr; - value do_sequence : Gram.Entry.t Ast.expr; - value sig_item : Gram.Entry.t Ast.sig_item; - value sig_item_quot : Gram.Entry.t Ast.sig_item; - value sig_items : Gram.Entry.t Ast.sig_item; - value star_ctyp : Gram.Entry.t Ast.ctyp; - value str_item : Gram.Entry.t Ast.str_item; - value str_item_quot : Gram.Entry.t Ast.str_item; - value str_items : Gram.Entry.t Ast.str_item; - value type_constraint : Gram.Entry.t unit; - value type_declaration : Gram.Entry.t Ast.ctyp; - value type_ident_and_parameters : Gram.Entry.t (string * list Ast.ctyp); - value type_kind : Gram.Entry.t Ast.ctyp; - value type_longident : Gram.Entry.t Ast.ident; - value type_longident_and_parameters : Gram.Entry.t Ast.ctyp; - value type_parameter : Gram.Entry.t Ast.ctyp; - value type_parameters : Gram.Entry.t (Ast.ctyp -> Ast.ctyp); - value typevars : Gram.Entry.t Ast.ctyp; - value val_longident : Gram.Entry.t Ast.ident; - value value_let : Gram.Entry.t unit; - value value_val : Gram.Entry.t unit; - value with_constr : Gram.Entry.t Ast.with_constr; - value with_constr_quot : Gram.Entry.t Ast.with_constr; - value prefixop : Gram.Entry.t Ast.expr; - value infixop0 : Gram.Entry.t Ast.expr; - value infixop1 : Gram.Entry.t Ast.expr; - value infixop2 : Gram.Entry.t Ast.expr; - value infixop3 : Gram.Entry.t Ast.expr; - value infixop4 : Gram.Entry.t Ast.expr; -end; - -(** A signature for syntax extension (syntax -> syntax functors). *) -module type SyntaxExtension = functor (Syn : Syntax) - -> (Syntax with module Loc = Syn.Loc - and module Ast = Syn.Ast - and module Token = Syn.Token - and module Gram = Syn.Gram - and module Quotation = Syn.Quotation); diff --git a/camlp4/Camlp4/Struct.mlpack b/camlp4/Camlp4/Struct.mlpack deleted file mode 100644 index a939fe77..00000000 --- a/camlp4/Camlp4/Struct.mlpack +++ /dev/null @@ -1,15 +0,0 @@ -AstFilters -Camlp4Ast -Camlp4Ast2OCamlAst -CleanAst -CommentFilter -DynLoader -EmptyError -EmptyPrinter -FreeVars -Lexer -Loc -Quotation -Token -Grammar -DynAst diff --git a/camlp4/Camlp4/Struct/.ignore b/camlp4/Camlp4/Struct/.ignore deleted file mode 100644 index 262784db..00000000 --- a/camlp4/Camlp4/Struct/.ignore +++ /dev/null @@ -1,2 +0,0 @@ -Lexer.ml -Camlp4Ast.tmp.ml diff --git a/camlp4/Camlp4/Struct/AstFilters.ml b/camlp4/Camlp4/Struct/AstFilters.ml deleted file mode 100644 index 6474ba8e..00000000 --- a/camlp4/Camlp4/Struct/AstFilters.ml +++ /dev/null @@ -1,37 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Ast : Sig.Camlp4Ast) -: Sig.AstFilters with module Ast = Ast -= struct - - module Ast = Ast; - - type filter 'a = 'a -> 'a; - - value interf_filters = Queue.create (); - value fold_interf_filters f i = Queue.fold f i interf_filters; - value implem_filters = Queue.create (); - value fold_implem_filters f i = Queue.fold f i implem_filters; - value topphrase_filters = Queue.create (); - value fold_topphrase_filters f i = Queue.fold f i topphrase_filters; - - value register_sig_item_filter f = Queue.add f interf_filters; - value register_str_item_filter f = Queue.add f implem_filters; - value register_topphrase_filter f = Queue.add f topphrase_filters; -end; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast.mlast b/camlp4/Camlp4/Struct/Camlp4Ast.mlast deleted file mode 100644 index 9c5a9975..00000000 --- a/camlp4/Camlp4/Struct/Camlp4Ast.mlast +++ /dev/null @@ -1,544 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Loc : Sig.Loc) -: Sig.Camlp4Ast with module Loc = Loc -= struct - module Loc = Loc; - - module Ast = struct - include Sig.MakeCamlp4Ast Loc; - - value safe_string_escaped s = - if String.length s > 2 && s.[0] = '\\' && s.[1] = '$' then s - else String.escaped s; - end; - - include Ast; - - external loc_of_ctyp : ctyp -> Loc.t = "%field0"; - external loc_of_patt : patt -> Loc.t = "%field0"; - external loc_of_expr : expr -> Loc.t = "%field0"; - external loc_of_module_type : module_type -> Loc.t = "%field0"; - external loc_of_module_expr : module_expr -> Loc.t = "%field0"; - external loc_of_sig_item : sig_item -> Loc.t = "%field0"; - external loc_of_str_item : str_item -> Loc.t = "%field0"; - external loc_of_class_type : class_type -> Loc.t = "%field0"; - external loc_of_class_sig_item : class_sig_item -> Loc.t = "%field0"; - external loc_of_class_expr : class_expr -> Loc.t = "%field0"; - external loc_of_class_str_item : class_str_item -> Loc.t = "%field0"; - external loc_of_with_constr : with_constr -> Loc.t = "%field0"; - external loc_of_binding : binding -> Loc.t = "%field0"; - external loc_of_rec_binding : rec_binding -> Loc.t = "%field0"; - external loc_of_module_binding : module_binding -> Loc.t = "%field0"; - external loc_of_match_case : match_case -> Loc.t = "%field0"; - external loc_of_ident : ident -> Loc.t = "%field0"; - - value ghost = Loc.ghost; - - value rec is_module_longident = - fun - [ <:ident< $_$.$i$ >> -> is_module_longident i - | <:ident< $i1$ $i2$ >> -> - is_module_longident i1 && is_module_longident i2 - | <:ident< $uid:_$ >> -> True - | _ -> False ]; - - value ident_of_expr = - let error () = - invalid_arg "ident_of_expr: this expression is not an identifier" in - let rec self = - fun - [ <:expr@_loc< $e1$ $e2$ >> -> <:ident< $self e1$ $self e2$ >> - | <:expr@_loc< $e1$.$e2$ >> -> <:ident< $self e1$.$self e2$ >> - | <:expr< $lid:_$ >> -> error () - | <:expr< $id:i$ >> -> if is_module_longident i then i else error () - | _ -> error () ] in - fun - [ <:expr< $id:i$ >> -> i - | <:expr< $_$ $_$ >> -> error () - | t -> self t ]; - - value ident_of_ctyp = - let error () = - invalid_arg "ident_of_ctyp: this type is not an identifier" in - let rec self = - fun - [ <:ctyp@_loc< $t1$ $t2$ >> -> <:ident< $self t1$ $self t2$ >> - | <:ctyp< $lid:_$ >> -> error () - | <:ctyp< $id:i$ >> -> if is_module_longident i then i else error () - | _ -> error () ] in - fun - [ <:ctyp< $id:i$ >> -> i - | t -> self t ]; - - value ident_of_patt = - let error () = - invalid_arg "ident_of_patt: this pattern is not an identifier" in - let rec self = - fun - [ <:patt@_loc< $p1$ $p2$ >> -> <:ident< $self p1$ $self p2$ >> - | <:patt< $lid:_$ >> -> error () - | <:patt< $id:i$ >> -> if is_module_longident i then i else error () - | _ -> error () ] in - fun - [ <:patt< $id:i$ >> -> i - | p -> self p ]; - - value rec is_irrefut_patt = - fun - [ <:patt< $lid:_$ >> -> True - | <:patt< () >> -> True - | <:patt< _ >> -> True - | <:patt<>> -> True (* why not *) - | <:patt< ($x$ as $y$) >> -> is_irrefut_patt x && is_irrefut_patt y - | <:patt< { $p$ } >> -> is_irrefut_patt p - | <:patt< $_$ = $p$ >> -> is_irrefut_patt p - | <:patt< $p1$; $p2$ >> -> is_irrefut_patt p1 && is_irrefut_patt p2 - | <:patt< $p1$, $p2$ >> -> is_irrefut_patt p1 && is_irrefut_patt p2 - | <:patt< $p1$ | $p2$ >> -> is_irrefut_patt p1 && is_irrefut_patt p2 (* could be more fine grained *) - | <:patt< $p1$ $p2$ >> -> is_irrefut_patt p1 && is_irrefut_patt p2 - | <:patt< ($p$ : $_$) >> -> is_irrefut_patt p - | <:patt< ($tup:pl$) >> -> is_irrefut_patt pl - | <:patt< ? $_$ >> -> True - | <:patt< ? $_$ : ($p$) >> -> is_irrefut_patt p - | <:patt< ? $_$ : ($p$ = $_$) >> -> is_irrefut_patt p - | <:patt< ~ $_$ >> -> True - | <:patt< ~ $_$ : $p$ >> -> is_irrefut_patt p - | <:patt< lazy $p$ >> -> is_irrefut_patt p - | <:patt< $id:_$ >> -> False (* here one need to know the arity of constructors *) - | <:patt< (module $_$) >> -> True - | <:patt< `$_$ >> | <:patt< $str:_$ >> | <:patt< $_$ .. $_$ >> | - <:patt< $flo:_$ >> | <:patt< $nativeint:_$ >> | <:patt< $int64:_$ >> | - <:patt< $int32:_$ >> | <:patt< $int:_$ >> | <:patt< $chr:_$ >> | - <:patt< #$_$ >> | <:patt< [| $_$ |] >> | <:patt< $anti:_$ >> -> False - ]; - - value rec is_constructor = - fun - [ <:ident< $_$.$i$ >> -> is_constructor i - | <:ident< $uid:_$ >> -> True - | <:ident< $lid:_$ >> | <:ident< $_$ $_$ >> -> False - | <:ident< $anti:_$ >> -> assert False ]; - - value is_patt_constructor = - fun - [ <:patt< $id:i$ >> -> is_constructor i - | <:patt< `$_$ >> -> True - | _ -> False ]; - - value rec is_expr_constructor = - fun - [ <:expr< $id:i$ >> -> is_constructor i - | <:expr< $e1$.$e2$ >> -> is_expr_constructor e1 && is_expr_constructor e2 - | <:expr< `$_$ >> -> True - | _ -> False ]; - - value rec tyOr_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$ | $tyOr_of_list ts$ >> ]; - - value rec tyAnd_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$ and $tyAnd_of_list ts$ >> ]; - - value rec tySem_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$ ; $tySem_of_list ts$ >> ]; - - value rec tyCom_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$, $tyCom_of_list ts$ >> ]; - - value rec tyAmp_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$ & $tyAmp_of_list ts$ >> ]; - - value rec tySta_of_list = - fun - [ [] -> <:ctyp@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_ctyp t in <:ctyp< $t$ * $tySta_of_list ts$ >> ]; - - value rec stSem_of_list = - fun - [ [] -> <:str_item@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_str_item t in <:str_item< $t$ ; $stSem_of_list ts$ >> ]; - - value rec sgSem_of_list = - fun - [ [] -> <:sig_item@ghost<>> - | [t] -> t - | [t::ts] -> - let _loc = loc_of_sig_item t in <:sig_item< $t$ ; $sgSem_of_list ts$ >> ]; - - value rec biAnd_of_list = - fun - [ [] -> <:binding@ghost<>> - | [b] -> b - | [b::bs] -> - let _loc = loc_of_binding b in <:binding< $b$ and $biAnd_of_list bs$ >> ]; - - value rec rbSem_of_list = - fun - [ [] -> <:rec_binding@ghost<>> - | [b] -> b - | [b::bs] -> - let _loc = loc_of_rec_binding b in - <:rec_binding< $b$; $rbSem_of_list bs$ >> ]; - - value rec wcAnd_of_list = - fun - [ [] -> <:with_constr@ghost<>> - | [w] -> w - | [w::ws] -> - let _loc = loc_of_with_constr w in - <:with_constr< $w$ and $wcAnd_of_list ws$ >> ]; - - value rec idAcc_of_list = - fun - [ [] -> assert False - | [i] -> i - | [i::is] -> - let _loc = loc_of_ident i in - <:ident< $i$ . $idAcc_of_list is$ >> ]; - - value rec idApp_of_list = - fun - [ [] -> assert False - | [i] -> i - | [i::is] -> - let _loc = loc_of_ident i in - <:ident< $i$ $idApp_of_list is$ >> ]; - - value rec mcOr_of_list = - fun - [ [] -> <:match_case@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_match_case x in - <:match_case< $x$ | $mcOr_of_list xs$ >> ]; - - value rec mbAnd_of_list = - fun - [ [] -> <:module_binding@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_module_binding x in - <:module_binding< $x$ and $mbAnd_of_list xs$ >> ]; - - value rec meApp_of_list = - fun - [ [] -> assert False - | [x] -> x - | [x::xs] -> - let _loc = loc_of_module_expr x in - <:module_expr< $x$ $meApp_of_list xs$ >> ]; - - value rec ceAnd_of_list = - fun - [ [] -> <:class_expr@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_class_expr x in - <:class_expr< $x$ and $ceAnd_of_list xs$ >> ]; - - value rec ctAnd_of_list = - fun - [ [] -> <:class_type@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_class_type x in - <:class_type< $x$ and $ctAnd_of_list xs$ >> ]; - - value rec cgSem_of_list = - fun - [ [] -> <:class_sig_item@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_class_sig_item x in - <:class_sig_item< $x$; $cgSem_of_list xs$ >> ]; - - value rec crSem_of_list = - fun - [ [] -> <:class_str_item@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_class_str_item x in - <:class_str_item< $x$; $crSem_of_list xs$ >> ]; - - value rec paSem_of_list = - fun - [ [] -> <:patt@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_patt x in - <:patt< $x$; $paSem_of_list xs$ >> ]; - - value rec paCom_of_list = - fun - [ [] -> <:patt@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_patt x in - <:patt< $x$, $paCom_of_list xs$ >> ]; - - value rec exSem_of_list = - fun - [ [] -> <:expr@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_expr x in - <:expr< $x$; $exSem_of_list xs$ >> ]; - - value rec exCom_of_list = - fun - [ [] -> <:expr@ghost<>> - | [x] -> x - | [x::xs] -> - let _loc = loc_of_expr x in - <:expr< $x$, $exCom_of_list xs$ >> ]; - - value ty_of_stl = - fun - [ (_loc, s, []) -> <:ctyp< $uid:s$ >> - | (_loc, s, tl) -> <:ctyp< $uid:s$ of $tyAnd_of_list tl$ >> ]; - - value ty_of_sbt = - fun - [ (_loc, s, True, t) -> <:ctyp< $lid:s$ : mutable $t$ >> - | (_loc, s, False, t) -> <:ctyp< $lid:s$ : $t$ >> ]; - - value bi_of_pe (p, e) = let _loc = loc_of_patt p in <:binding< $p$ = $e$ >>; - value sum_type_of_list l = tyOr_of_list (List.map ty_of_stl l); - value record_type_of_list l = tySem_of_list (List.map ty_of_sbt l); - value binding_of_pel l = biAnd_of_list (List.map bi_of_pe l); - - value rec pel_of_binding = - fun - [ <:binding< $b1$ and $b2$ >> -> pel_of_binding b1 @ pel_of_binding b2 - | <:binding< $p$ = $e$ >> -> [(p, e)] - | _ -> assert False ]; - - value rec list_of_binding x acc = - match x with - [ <:binding< $b1$ and $b2$ >> -> - list_of_binding b1 (list_of_binding b2 acc) - | t -> [t :: acc] ]; - - value rec list_of_rec_binding x acc = - match x with - [ <:rec_binding< $b1$; $b2$ >> -> - list_of_rec_binding b1 (list_of_rec_binding b2 acc) - | t -> [t :: acc] ]; - - value rec list_of_with_constr x acc = - match x with - [ <:with_constr< $w1$ and $w2$ >> -> - list_of_with_constr w1 (list_of_with_constr w2 acc) - | t -> [t :: acc] ]; - - value rec list_of_ctyp x acc = - match x with - [ <:ctyp<>> -> acc - | <:ctyp< $x$ & $y$ >> | <:ctyp< $x$, $y$ >> | - <:ctyp< $x$ * $y$ >> | <:ctyp< $x$; $y$ >> | - <:ctyp< $x$ and $y$ >> | <:ctyp< $x$ | $y$ >> -> - list_of_ctyp x (list_of_ctyp y acc) - | x -> [x :: acc] ]; - - value rec list_of_patt x acc = - match x with - [ <:patt<>> -> acc - | <:patt< $x$, $y$ >> | <:patt< $x$; $y$ >> -> - list_of_patt x (list_of_patt y acc) - | x -> [x :: acc] ]; - - value rec list_of_expr x acc = - match x with - [ <:expr<>> -> acc - | <:expr< $x$, $y$ >> | <:expr< $x$; $y$ >> -> - list_of_expr x (list_of_expr y acc) - | x -> [x :: acc] ]; - - value rec list_of_str_item x acc = - match x with - [ <:str_item<>> -> acc - | <:str_item< $x$; $y$ >> -> - list_of_str_item x (list_of_str_item y acc) - | x -> [x :: acc] ]; - - value rec list_of_sig_item x acc = - match x with - [ <:sig_item<>> -> acc - | <:sig_item< $x$; $y$ >> -> - list_of_sig_item x (list_of_sig_item y acc) - | x -> [x :: acc] ]; - - value rec list_of_class_sig_item x acc = - match x with - [ <:class_sig_item<>> -> acc - | <:class_sig_item< $x$; $y$ >> -> - list_of_class_sig_item x (list_of_class_sig_item y acc) - | x -> [x :: acc] ]; - - value rec list_of_class_str_item x acc = - match x with - [ <:class_str_item<>> -> acc - | <:class_str_item< $x$; $y$ >> -> - list_of_class_str_item x (list_of_class_str_item y acc) - | x -> [x :: acc] ]; - - value rec list_of_class_type x acc = - match x with - [ <:class_type< $x$ and $y$ >> -> - list_of_class_type x (list_of_class_type y acc) - | x -> [x :: acc] ]; - - value rec list_of_class_expr x acc = - match x with - [ <:class_expr< $x$ and $y$ >> -> - list_of_class_expr x (list_of_class_expr y acc) - | x -> [x :: acc] ]; - - value rec list_of_module_expr x acc = - match x with - [ <:module_expr< $x$ $y$ >> -> - list_of_module_expr x (list_of_module_expr y acc) - | x -> [x :: acc] ]; - - value rec list_of_match_case x acc = - match x with - [ <:match_case<>> -> acc - | <:match_case< $x$ | $y$ >> -> - list_of_match_case x (list_of_match_case y acc) - | x -> [x :: acc] ]; - - value rec list_of_ident x acc = - match x with - [ <:ident< $x$ . $y$ >> | <:ident< $x$ $y$ >> -> - list_of_ident x (list_of_ident y acc) - | x -> [x :: acc] ]; - - value rec list_of_module_binding x acc = - match x with - [ <:module_binding< $x$ and $y$ >> -> - list_of_module_binding x (list_of_module_binding y acc) - | x -> [x :: acc] ]; - - module Camlp4Trash = struct - INCLUDE "camlp4/Camlp4/Camlp4Ast.partial.ml"; - end; - - module Meta = struct - - module type META_LOC = sig - (** The first location is where to put the returned pattern. - Generally it's _loc to match with <:patt< ... >> quotations. - The second location is the one to treat. *) - value meta_loc_patt : Loc.t -> Loc.t -> Ast.patt; - (** The first location is where to put the returned expression. - Generally it's _loc to match with <:expr< ... >> quotations. - The second location is the one to treat. *) - value meta_loc_expr : Loc.t -> Loc.t -> Ast.expr; - end; - - module MetaLoc = struct - value meta_loc_patt _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location in - <:patt< Loc.of_tuple - ($`str:a$, $`int:b$, $`int:c$, $`int:d$, - $`int:e$, $`int:f$, $`int:g$, - $if h then <:patt< True >> else <:patt< False >> $) >>; - value meta_loc_expr _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location in - <:expr< Loc.of_tuple - ($`str:a$, $`int:b$, $`int:c$, $`int:d$, - $`int:e$, $`int:f$, $`int:g$, - $if h then <:expr< True >> else <:expr< False >> $) >>; - end; - - module MetaGhostLoc = struct - value meta_loc_patt _loc _ = <:patt< Loc.ghost >>; - value meta_loc_expr _loc _ = <:expr< Loc.ghost >>; - end; - - module MetaLocVar = struct - value meta_loc_patt _loc _ = <:patt< $lid:Loc.name.val$ >>; - value meta_loc_expr _loc _ = <:expr< $lid:Loc.name.val$ >>; - end; - - module Make (MetaLoc : META_LOC) = struct - open MetaLoc; - - value meta_loc = meta_loc_expr; - module Expr = Camlp4Filters.MetaGeneratorExpr Ast; - value meta_loc = meta_loc_patt; - module Patt = Camlp4Filters.MetaGeneratorPatt Ast; - end; - - end; - - class map = Camlp4MapGenerator.generated; - - class fold = Camlp4FoldGenerator.generated; - - value map_expr f = object - inherit map as super; - method expr x = f (super#expr x); - end; - value map_patt f = object - inherit map as super; - method patt x = f (super#patt x); - end; - value map_ctyp f = object - inherit map as super; - method ctyp x = f (super#ctyp x); - end; - value map_str_item f = object - inherit map as super; - method str_item x = f (super#str_item x); - end; - value map_sig_item f = object - inherit map as super; - method sig_item x = f (super#sig_item x); - end; - value map_loc f = object - inherit map as super; - method loc x = f (super#loc x); - end; -end; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml deleted file mode 100644 index 3c04214a..00000000 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +++ /dev/null @@ -1,1238 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -module Make (Ast : Sig.Camlp4Ast) = struct - open Format; - open Camlp4_import.Parsetree; - open Camlp4_import.Longident; - open Camlp4_import.Asttypes; - open Ast; - - value constructors_arity () = - debug ast2pt "constructors_arity: %b@." Camlp4_config.constructors_arity.val in - Camlp4_config.constructors_arity.val; - - value error loc str = Loc.raise loc (Failure str); - - value char_of_char_token loc s = - try Token.Eval.char s with [ Failure _ as exn -> Loc.raise loc exn ] - ; - - value string_of_string_token loc s = - try Token.Eval.string s - with [ Failure _ as exn -> Loc.raise loc exn ] - ; - - value remove_underscores s = - let l = String.length s in - let rec remove src dst = - if src >= l then - if dst >= l then s else String.sub s 0 dst - else - match s.[src] with - [ '_' -> remove (src + 1) dst - | c -> do { s.[dst] := c; remove (src + 1) (dst + 1) } ] - in remove 0 0 - ; - - value mkloc = Loc.to_ocaml_location; - value mkghloc loc = Loc.to_ocaml_location (Loc.ghostify loc); - - value with_loc txt loc = Camlp4_import.Location.mkloc txt (mkloc loc); - - value mktyp loc d = {ptyp_desc = d; ptyp_loc = mkloc loc}; - value mkpat loc d = {ppat_desc = d; ppat_loc = mkloc loc}; - value mkghpat loc d = {ppat_desc = d; ppat_loc = mkghloc loc}; - value mkexp loc d = {pexp_desc = d; pexp_loc = mkloc loc}; - value mkmty loc d = {pmty_desc = d; pmty_loc = mkloc loc}; - value mksig loc d = {psig_desc = d; psig_loc = mkloc loc}; - value mkmod loc d = {pmod_desc = d; pmod_loc = mkloc loc}; - value mkstr loc d = {pstr_desc = d; pstr_loc = mkloc loc}; - value mkfield loc d = {pfield_desc = d; pfield_loc = mkloc loc}; - value mkcty loc d = {pcty_desc = d; pcty_loc = mkloc loc}; - value mkcl loc d = {pcl_desc = d; pcl_loc = mkloc loc}; - value mkcf loc d = { pcf_desc = d; pcf_loc = mkloc loc; }; - value mkctf loc d = { pctf_desc = d; pctf_loc = mkloc loc; }; - - value mkpolytype t = - match t.ptyp_desc with - [ Ptyp_poly _ _ -> t - | _ -> { (t) with ptyp_desc = Ptyp_poly [] t } ] - ; - - value mkvirtual = fun - [ <:virtual_flag< virtual >> -> Virtual - | <:virtual_flag<>> -> Concrete - | _ -> assert False ]; - - value mkdirection = fun - [ <:direction_flag< to >> -> Upto - | <:direction_flag< downto >> -> Downto - | _ -> assert False ]; - - value lident s = Lident s; - value lident_with_loc s loc = with_loc (Lident s) loc; - - - value ldot l s = Ldot l s; - value lapply l s = Lapply l s; - - value conv_con = - let t = Hashtbl.create 73 in - do { - List.iter (fun (s, s') -> Hashtbl.add t s s') - [("True", "true"); ("False", "false"); (" True", "True"); - (" False", "False")]; - fun s -> try Hashtbl.find t s with [ Not_found -> s ] - } - ; - - value conv_lab = - let t = Hashtbl.create 73 in - do { - List.iter (fun (s, s') -> Hashtbl.add t s s') [("val", "contents")]; - fun s -> try Hashtbl.find t s with [ Not_found -> s ] - } - ; - - value array_function_no_loc str name = - ldot (lident str) (if Camlp4_config.unsafe.val then "unsafe_" ^ name else name) - ; - value array_function loc str name = with_loc (array_function_no_loc str name) loc; - value mkrf = - fun - [ <:rec_flag< rec >> -> Recursive - | <:rec_flag<>> -> Nonrecursive - | _ -> assert False ]; - - value mkli sloc s list = with_loc (loop lident list) sloc - where rec loop f = - fun - [ [i :: il] -> loop (ldot (f i)) il - | [] -> f s ] - ; - - value rec ctyp_fa al = - fun - [ TyApp _ f a -> ctyp_fa [a :: al] f - | f -> (f, al) ] - ; - - value ident_tag ?(conv_lid = fun x -> x) i = - - let rec self i acc = - match i with - [ <:ident< $lid:"*predef*"$.$lid:"option"$ >> -> - (ldot (lident "*predef*") "option", `lident) - | <:ident< $i1$.$i2$ >> -> - self i2 (Some (self i1 acc)) - | <:ident< $i1$ $i2$ >> -> - let i' = Lapply (fst (self i1 None)) (fst (self i2 None)) in - let x = - match acc with - [ None -> i' - | _ -> error (loc_of_ident i) "invalid long identifier" ] - in (x, `app) - | <:ident< $uid:s$ >> -> - let x = - match acc with - [ None -> lident s - | Some (acc, `uident | `app) -> ldot acc s - | _ -> error (loc_of_ident i) "invalid long identifier" ] - in (x, `uident) - | <:ident< $lid:s$ >> -> - let x = - match acc with - [ None -> lident (conv_lid s) - | Some (acc, `uident | `app) -> ldot acc (conv_lid s) - | _ -> error (loc_of_ident i) "invalid long identifier" ] - in (x, `lident) - | _ -> error (loc_of_ident i) "invalid long identifier" ] - in self i None; - - value ident_noloc ?conv_lid i = fst (ident_tag ?conv_lid i); - value ident ?conv_lid i = - with_loc (ident_noloc ?conv_lid i) (loc_of_ident i); - - value long_lident msg id = - match ident_tag id with - [ (i, `lident) -> with_loc i (loc_of_ident id) - | _ -> error (loc_of_ident id) msg ] - ; - - value long_type_ident = long_lident "invalid long identifier type"; - value long_class_ident = long_lident "invalid class name"; - - value long_uident_noloc ?(conv_con = fun x -> x) i = - match ident_tag i with - [ (Ldot i s, `uident) -> ldot i (conv_con s) - | (Lident s, `uident) -> lident (conv_con s) - | (i, `app) -> i - | _ -> error (loc_of_ident i) "uppercase identifier expected" ] - ; - - value long_uident ?conv_con i = - with_loc (long_uident_noloc ?conv_con i) (loc_of_ident i); - - value rec ctyp_long_id_prefix t = - match t with - [ <:ctyp< $id:i$ >> -> ident_noloc i - | <:ctyp< $m1$ $m2$ >> -> - let li1 = ctyp_long_id_prefix m1 in - let li2 = ctyp_long_id_prefix m2 in - Lapply li1 li2 - | t -> error (loc_of_ctyp t) "invalid module expression" ] - ; - - value ctyp_long_id t = - match t with - [ <:ctyp< $id:i$ >> -> - (False, long_type_ident i) - | TyApp loc _ _ -> - error loc "invalid type name" - | TyCls _ i -> (True, ident i) - | t -> error (loc_of_ctyp t) "invalid type" ] - ; - - value rec ty_var_list_of_ctyp = - fun - [ <:ctyp< $t1$ $t2$ >> -> ty_var_list_of_ctyp t1 @ ty_var_list_of_ctyp t2 - | <:ctyp< '$s$ >> -> [s] - | _ -> assert False ]; - - value predef_option loc = - TyId (loc, IdAcc (loc, IdLid (loc, "*predef*"), IdLid (loc, "option"))); - - value rec ctyp = - fun - [ TyId loc i -> - let li = long_type_ident i in - mktyp loc (Ptyp_constr li []) - | TyAli loc t1 t2 -> - let (t, i) = - match (t1, t2) with - [ (t, TyQuo _ s) -> (t, s) - | (TyQuo _ s, t) -> (t, s) - | _ -> error loc "invalid alias type" ] - in - mktyp loc (Ptyp_alias (ctyp t) i) - | TyAny loc -> mktyp loc Ptyp_any - | TyApp loc _ _ as f -> - let (f, al) = ctyp_fa [] f in - let (is_cls, li) = ctyp_long_id f in - if is_cls then mktyp loc (Ptyp_class li (List.map ctyp al) []) - else mktyp loc (Ptyp_constr li (List.map ctyp al)) - | TyArr loc (TyLab _ lab t1) t2 -> - mktyp loc (Ptyp_arrow lab (ctyp t1) (ctyp t2)) - | TyArr loc (TyOlb loc1 lab t1) t2 -> - let t1 = TyApp loc1 (predef_option loc1) t1 in - mktyp loc (Ptyp_arrow ("?" ^ lab) (ctyp t1) (ctyp t2)) - | TyArr loc t1 t2 -> mktyp loc (Ptyp_arrow "" (ctyp t1) (ctyp t2)) - | <:ctyp@loc< < $fl$ > >> -> mktyp loc (Ptyp_object (meth_list fl [])) - | <:ctyp@loc< < $fl$ .. > >> -> - mktyp loc (Ptyp_object (meth_list fl [mkfield loc Pfield_var])) - | TyCls loc id -> - mktyp loc (Ptyp_class (ident id) [] []) - | <:ctyp@loc< (module $pt$) >> -> - let (i, cs) = package_type pt in - mktyp loc (Ptyp_package i cs) - | TyLab loc _ _ -> error loc "labelled type not allowed here" - | TyMan loc _ _ -> error loc "manifest type not allowed here" - | TyOlb loc _ _ -> error loc "labelled type not allowed here" - | TyPol loc t1 t2 -> mktyp loc (Ptyp_poly (ty_var_list_of_ctyp t1) (ctyp t2)) - | TyQuo loc s -> mktyp loc (Ptyp_var s) - | TyRec loc _ -> error loc "record type not allowed here" - | TySum loc _ -> error loc "sum type not allowed here" - | TyPrv loc _ -> error loc "private type not allowed here" - | TyMut loc _ -> error loc "mutable type not allowed here" - | TyOr loc _ _ -> error loc "type1 | type2 not allowed here" - | TyAnd loc _ _ -> error loc "type1 and type2 not allowed here" - | TyOf loc _ _ -> error loc "type1 of type2 not allowed here" - | TyCol loc _ _ -> error loc "type1 : type2 not allowed here" - | TySem loc _ _ -> error loc "type1 ; type2 not allowed here" - | <:ctyp@loc< ($t1$ * $t2$) >> -> - mktyp loc (Ptyp_tuple (List.map ctyp (list_of_ctyp t1 (list_of_ctyp t2 [])))) - | <:ctyp@loc< [ = $t$ ] >> -> mktyp loc (Ptyp_variant (row_field t) True None) - | <:ctyp@loc< [ > $t$ ] >> -> mktyp loc (Ptyp_variant (row_field t) False None) - | <:ctyp@loc< [ < $t$ ] >> -> mktyp loc (Ptyp_variant (row_field t) True (Some [])) - | <:ctyp@loc< [ < $t$ > $t'$ ] >> -> - mktyp loc (Ptyp_variant (row_field t) True (Some (name_tags t'))) - | TyAnt loc _ -> error loc "antiquotation not allowed here" - | TyOfAmp _ _ _ |TyAmp _ _ _ |TySta _ _ _ | - TyCom _ _ _ |TyVrn _ _ |TyQuM _ _ |TyQuP _ _ |TyDcl _ _ _ _ _ | - TyAnP _ | TyAnM _ | TyTypePol _ _ _ | - TyObj _ _ (RvAnt _) | TyNil _ | TyTup _ _ -> - assert False ] - and row_field = fun - [ <:ctyp<>> -> [] - | <:ctyp< `$i$ >> -> [Rtag i True []] - | <:ctyp< `$i$ of & $t$ >> -> [Rtag i True (List.map ctyp (list_of_ctyp t []))] - | <:ctyp< `$i$ of $t$ >> -> [Rtag i False (List.map ctyp (list_of_ctyp t []))] - | <:ctyp< $t1$ | $t2$ >> -> row_field t1 @ row_field t2 - | t -> [Rinherit (ctyp t)] ] - and name_tags = fun - [ <:ctyp< $t1$ $t2$ >> -> name_tags t1 @ name_tags t2 - | <:ctyp< `$s$ >> -> [s] - | _ -> assert False ] - and meth_list fl acc = - match fl with - [ <:ctyp<>> -> acc - | <:ctyp< $t1$; $t2$ >> -> meth_list t1 (meth_list t2 acc) - | <:ctyp@loc< $lid:lab$ : $t$ >> -> - [mkfield loc (Pfield lab (mkpolytype (ctyp t))) :: acc] - | _ -> assert False ] - - and package_type_constraints wc acc = - match wc with - [ <:with_constr<>> -> acc - | <:with_constr< type $id:id$ = $ct$ >> -> - [(ident id, ctyp ct) :: acc] - | <:with_constr< $wc1$ and $wc2$ >> -> - package_type_constraints wc1 (package_type_constraints wc2 acc) - | _ -> error (loc_of_with_constr wc) "unexpected `with constraint' for a package type" ] - - and package_type : module_type -> package_type = - fun - [ <:module_type< $id:i$ with $wc$ >> -> - (long_uident i, package_type_constraints wc []) - | <:module_type< $id:i$ >> -> (long_uident i, []) - | mt -> error (loc_of_module_type mt) "unexpected package type" ] - ; - - value mktype loc tl cl tk tp tm = - let (params, variance) = List.split tl in - {ptype_params = params; ptype_cstrs = cl; ptype_kind = tk; - ptype_private = tp; ptype_manifest = tm; ptype_loc = mkloc loc; - ptype_variance = variance} - ; - value mkprivate' m = if m then Private else Public; - value mkprivate = fun - [ <:private_flag< private >> -> Private - | <:private_flag<>> -> Public - | _ -> assert False ]; - value mktrecord = - fun - [ <:ctyp@loc< $id:(<:ident@sloc< $lid:s$ >>)$ : mutable $t$ >> -> - (with_loc s sloc, Mutable, mkpolytype (ctyp t), mkloc loc) - | <:ctyp@loc< $id:(<:ident@sloc< $lid:s$ >>)$ : $t$ >> -> - (with_loc s sloc, Immutable, mkpolytype (ctyp t), mkloc loc) - | _ -> assert False (*FIXME*) ]; - value mkvariant = - fun - [ <:ctyp@loc< $id:(<:ident@sloc< $uid:s$ >>)$ >> -> - (with_loc (conv_con s) sloc, [], None, mkloc loc) - | <:ctyp@loc< $id:(<:ident@sloc< $uid:s$ >>)$ of $t$ >> -> - (with_loc (conv_con s) sloc, List.map ctyp (list_of_ctyp t []), None, mkloc loc) - | <:ctyp@loc< $id:(<:ident@sloc< $uid:s$ >>)$ : ($t$ -> $u$) >> -> - (with_loc (conv_con s) sloc, List.map ctyp (list_of_ctyp t []), Some (ctyp u), mkloc loc) - | <:ctyp@loc< $id:(<:ident@sloc< $uid:s$ >>)$ : $t$ >> -> - (with_loc (conv_con s) sloc, [], Some (ctyp t), mkloc loc) - - | _ -> assert False (*FIXME*) ]; - value rec type_decl tl cl loc m pflag = - fun - [ <:ctyp< $t1$ == $t2$ >> -> - type_decl tl cl loc (Some (ctyp t1)) pflag t2 - | <:ctyp@_loc< private $t$ >> -> - if pflag then - error _loc "multiple private keyword used, use only one instead" - else - type_decl tl cl loc m True t - | <:ctyp< { $t$ } >> -> - mktype loc tl cl - (Ptype_record (List.map mktrecord (list_of_ctyp t []))) (mkprivate' pflag) m - | <:ctyp< [ $t$ ] >> -> - mktype loc tl cl - (Ptype_variant (List.map mkvariant (list_of_ctyp t []))) (mkprivate' pflag) m - | t -> - if m <> None then - error loc "only one manifest type allowed by definition" else - let m = - match t with - [ <:ctyp<>> -> None - | _ -> Some (ctyp t) ] - in - mktype loc tl cl Ptype_abstract (mkprivate' pflag) m ] - ; - - value type_decl tl cl t loc = type_decl tl cl loc None False t; - - value mkvalue_desc loc t p = {pval_type = ctyp t; pval_prim = p; pval_loc = mkloc loc}; - - value rec list_of_meta_list = - fun - [ Ast.LNil -> [] - | Ast.LCons x xs -> [x :: list_of_meta_list xs] - | Ast.LAnt _ -> assert False ]; - - value mkmutable = fun - [ <:mutable_flag< mutable >> -> Mutable - | <:mutable_flag<>> -> Immutable - | _ -> assert False ]; - - value paolab lab p = - match (lab, p) with - [ ("", <:patt< $lid:i$ >> | <:patt< ($lid:i$ : $_$) >>) -> i - | ("", p) -> error (loc_of_patt p) "bad ast in label" - | _ -> lab ] - ; - - value opt_private_ctyp = - fun - [ <:ctyp< private $t$ >> -> (Ptype_abstract, Private, ctyp t) - | t -> (Ptype_abstract, Public, ctyp t) ]; - - value rec type_parameters t acc = - match t with - [ <:ctyp< $t1$ $t2$ >> -> type_parameters t1 (type_parameters t2 acc) - | <:ctyp< +'$s$ >> -> [(s, (True, False)) :: acc] - | <:ctyp< -'$s$ >> -> [(s, (False, True)) :: acc] - | <:ctyp< '$s$ >> -> [(s, (False, False)) :: acc] - | _ -> assert False ]; - - value rec optional_type_parameters t acc = - match t with - [ <:ctyp< $t1$ $t2$ >> -> optional_type_parameters t1 (optional_type_parameters t2 acc) - | <:ctyp@loc< +'$s$ >> -> [(Some (with_loc s loc), (True, False)) :: acc] - | Ast.TyAnP _loc -> [(None, (True, False)) :: acc] - | <:ctyp@loc< -'$s$ >> -> [(Some (with_loc s loc), (False, True)) :: acc] - | Ast.TyAnM _loc -> [(None, (False, True)) :: acc] - | <:ctyp@loc< '$s$ >> -> [(Some (with_loc s loc), (False, False)) :: acc] - | Ast.TyAny _loc -> [(None, (False, False)) :: acc] - | _ -> assert False ]; - - value rec class_parameters t acc = - match t with - [ <:ctyp< $t1$, $t2$ >> -> class_parameters t1 (class_parameters t2 acc) - | <:ctyp@loc< +'$s$ >> -> [(with_loc s loc, (True, False)) :: acc] - | <:ctyp@loc< -'$s$ >> -> [(with_loc s loc, (False, True)) :: acc] - | <:ctyp@loc< '$s$ >> -> [(with_loc s loc, (False, False)) :: acc] - | _ -> assert False ]; - - value rec type_parameters_and_type_name t acc = - match t with - [ <:ctyp< $t1$ $t2$ >> -> - type_parameters_and_type_name t1 - (optional_type_parameters t2 acc) - | <:ctyp< $id:i$ >> -> (ident i, acc) - | _ -> assert False ]; - - value mkwithtyp pwith_type loc id_tpl ct = - let (id, tpl) = type_parameters_and_type_name id_tpl [] in - let (params, variance) = List.split tpl in - let (kind, priv, ct) = opt_private_ctyp ct in - (id, pwith_type - {ptype_params = params; ptype_cstrs = []; - ptype_kind = kind; - ptype_private = priv; - ptype_manifest = Some ct; - ptype_loc = mkloc loc; ptype_variance = variance}); - - value rec mkwithc wc acc = - match wc with - [ <:with_constr<>> -> acc - | <:with_constr@loc< type $id_tpl$ = $ct$ >> -> - [mkwithtyp (fun x -> Pwith_type x) loc id_tpl ct :: acc] - | <:with_constr< module $i1$ = $i2$ >> -> - [(long_uident i1, Pwith_module (long_uident i2)) :: acc] - | <:with_constr@loc< type $id_tpl$ := $ct$ >> -> - [mkwithtyp (fun x -> Pwith_typesubst x) loc id_tpl ct :: acc] - | <:with_constr< module $i1$ := $i2$ >> (*WcMoS _ i1 i2*) -> - [(long_uident i1, Pwith_modsubst (long_uident i2)) :: acc] - | <:with_constr< $wc1$ and $wc2$ >> -> mkwithc wc1 (mkwithc wc2 acc) - | <:with_constr@loc< $anti:_$ >> -> - error loc "bad with constraint (antiquotation)" ]; - - value rec patt_fa al = - fun - [ PaApp _ f a -> patt_fa [a :: al] f - | f -> (f, al) ] - ; - - value rec deep_mkrangepat loc c1 c2 = - if c1 = c2 then mkghpat loc (Ppat_constant (Const_char c1)) - else - mkghpat loc - (Ppat_or (mkghpat loc (Ppat_constant (Const_char c1))) - (deep_mkrangepat loc (Char.chr (Char.code c1 + 1)) c2)) - ; - - value rec mkrangepat loc c1 c2 = - if c1 > c2 then mkrangepat loc c2 c1 - else if c1 = c2 then mkpat loc (Ppat_constant (Const_char c1)) - else - mkpat loc - (Ppat_or (mkghpat loc (Ppat_constant (Const_char c1))) - (deep_mkrangepat loc (Char.chr (Char.code c1 + 1)) c2)) - ; - - value rec patt = - fun - [ <:patt@loc< $id:(<:ident@sloc< $lid:s$ >>)$ >> -> - mkpat loc (Ppat_var (with_loc s sloc)) - | <:patt@loc< $id:i$ >> -> - let p = Ppat_construct (long_uident ~conv_con i) - None (constructors_arity ()) - in mkpat loc p - | PaAli loc p1 p2 -> - let (p, i) = - match (p1, p2) with - [ (p, <:patt< $id:(<:ident@sloc< $lid:s$ >>)$ >>) -> (p, with_loc s sloc) - | (<:patt< $id:(<:ident@sloc< $lid:s$ >>)$ >>, p) -> (p, with_loc s sloc) - | _ -> error loc "invalid alias pattern" ] - in - mkpat loc (Ppat_alias (patt p) i) - | PaAnt loc _ -> error loc "antiquotation not allowed here" - | PaAny loc -> mkpat loc Ppat_any - | <:patt@loc< $id:(<:ident@sloc< $uid:s$ >>)$ ($tup:<:patt@loc_any< _ >>$) >> -> - mkpat loc (Ppat_construct (lident_with_loc (conv_con s) sloc) - (Some (mkpat loc_any Ppat_any)) False) - | PaApp loc _ _ as f -> - let (f, al) = patt_fa [] f in - let al = List.map patt al in - match (patt f).ppat_desc with - [ Ppat_construct li None _ -> - if constructors_arity () then - mkpat loc (Ppat_construct li (Some (mkpat loc (Ppat_tuple al))) True) - else - let a = - match al with - [ [a] -> a - | _ -> mkpat loc (Ppat_tuple al) ] - in - mkpat loc (Ppat_construct li (Some a) False) - | Ppat_variant s None -> - let a = - if constructors_arity () then - mkpat loc (Ppat_tuple al) - else - match al with - [ [a] -> a - | _ -> mkpat loc (Ppat_tuple al) ] - in mkpat loc (Ppat_variant s (Some a)) - | _ -> - error (loc_of_patt f) - "this is not a constructor, it cannot be applied in a pattern" ] - | PaArr loc p -> mkpat loc (Ppat_array (List.map patt (list_of_patt p []))) - | PaChr loc s -> - mkpat loc (Ppat_constant (Const_char (char_of_char_token loc s))) - | PaInt loc s -> - let i = try int_of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int" - ] in mkpat loc (Ppat_constant (Const_int i)) - | PaInt32 loc s -> - let i32 = try Int32.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int32" - ] in mkpat loc (Ppat_constant (Const_int32 i32)) - | PaInt64 loc s -> - let i64 = try Int64.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int64" - ] in mkpat loc (Ppat_constant (Const_int64 i64)) - | PaNativeInt loc s -> - let nati = try Nativeint.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type nativeint" - ] in mkpat loc (Ppat_constant (Const_nativeint nati)) - | PaFlo loc s -> mkpat loc (Ppat_constant (Const_float (remove_underscores s))) - | PaLab loc _ _ -> error loc "labeled pattern not allowed here" - | PaOlb loc _ _ | PaOlbi loc _ _ _ -> error loc "labeled pattern not allowed here" - | PaOrp loc p1 p2 -> mkpat loc (Ppat_or (patt p1) (patt p2)) - | PaRng loc p1 p2 -> - match (p1, p2) with - [ (PaChr loc1 c1, PaChr loc2 c2) -> - let c1 = char_of_char_token loc1 c1 in - let c2 = char_of_char_token loc2 c2 in - mkrangepat loc c1 c2 - | _ -> error loc "range pattern allowed only for characters" ] - | PaRec loc p -> - 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$) >> -> - mkpat loc (Ppat_tuple - (List.map patt (list_of_patt p1 (list_of_patt p2 [])))) - | <:patt@loc< ($tup:_$) >> -> error loc "singleton tuple pattern" - | PaTyc loc p t -> mkpat loc (Ppat_constraint (patt p) (ctyp t)) - | PaTyp loc i -> mkpat loc (Ppat_type (long_type_ident i)) - | PaVrn loc s -> mkpat loc (Ppat_variant (conv_con s) None) - | PaLaz loc p -> mkpat loc (Ppat_lazy (patt p)) - | PaMod loc m -> mkpat loc (Ppat_unpack (with_loc m loc)) - | PaEq _ _ _ | PaSem _ _ _ | PaCom _ _ _ | PaNil _ as p -> - error (loc_of_patt p) "invalid pattern" ] - and mklabpat = - fun - [ <:patt< $i$ = $p$ >> -> (ident ~conv_lid:conv_lab i, patt p) - | p -> error (loc_of_patt p) "invalid pattern" ]; - - value rec expr_fa al = - fun - [ ExApp _ f a -> expr_fa [a :: al] f - | f -> (f, al) ] - ; - - value rec class_expr_fa al = - fun - [ CeApp _ ce a -> class_expr_fa [a :: al] ce - | ce -> (ce, al) ] - ; - - - value rec sep_expr_acc l = - fun - [ ExAcc _ e1 e2 -> sep_expr_acc (sep_expr_acc l e2) e1 - | <:expr@loc< $uid:s$ >> as e -> - match l with - [ [] -> [(loc, [], e)] - | [(loc', sl, e) :: l] -> [(Loc.merge loc loc', [s :: sl], e) :: l] ] - | <:expr< $id:(<:ident< $_$.$_$ >> as i)$ >> -> - let rec normalize_acc = - fun - [ <:ident@_loc< $i1$.$i2$ >> -> - <:expr< $normalize_acc i1$.$normalize_acc i2$ >> - | <:ident@_loc< $i1$ $i2$ >> -> - <:expr< $normalize_acc i1$ $normalize_acc i2$ >> - | <:ident@_loc< $anti:_$ >> | <:ident@_loc< $uid:_$ >> | - <:ident@_loc< $lid:_$ >> as i -> <:expr< $id:i$ >> ] - in sep_expr_acc l (normalize_acc i) - | e -> [(loc_of_expr e, [], e) :: l] ] - ; - - value override_flag loc = - fun [ <:override_flag< ! >> -> Override - | <:override_flag<>> -> Fresh - | _ -> error loc "antiquotation not allowed here" - ]; - - value list_of_opt_ctyp ot acc = - match ot with - [ <:ctyp<>> -> acc - | t -> list_of_ctyp t acc ]; - -value varify_constructors var_names = - let rec loop t = - let desc = - match t.ptyp_desc with - [ - Ptyp_any -> Ptyp_any - | Ptyp_var x -> Ptyp_var x - | Ptyp_arrow label core_type core_type' -> - Ptyp_arrow label (loop core_type) (loop core_type') - | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst) - | Ptyp_constr ({ txt = Lident s }) [] when List.mem s var_names -> - Ptyp_var ("&" ^ s) - | Ptyp_constr longident lst -> - Ptyp_constr longident (List.map loop lst) - | Ptyp_object lst -> - Ptyp_object (List.map loop_core_field lst) - | Ptyp_class longident lst lbl_list -> - Ptyp_class (longident, List.map loop lst, lbl_list) - | Ptyp_alias core_type string -> - Ptyp_alias(loop core_type, string) - | Ptyp_variant row_field_list flag lbl_lst_option -> - Ptyp_variant(List.map loop_row_field row_field_list, flag, lbl_lst_option) - | Ptyp_poly string_lst core_type -> - Ptyp_poly(string_lst, loop core_type) - | Ptyp_package longident lst -> - Ptyp_package(longident,List.map (fun (n,typ) -> (n,loop typ) ) lst) -] - in - {(t) with ptyp_desc = desc} - and loop_core_field t = - let desc = - match t.pfield_desc with - [ Pfield(n,typ) -> - Pfield(n,loop typ) - | Pfield_var -> - Pfield_var] - in - { (t) with pfield_desc=desc} - and loop_row_field x = - match x with - [ Rtag(label,flag,lst) -> - Rtag(label,flag,List.map loop lst) - | Rinherit t -> - Rinherit (loop t) ] - in - loop; - - - - value rec expr = - fun - [ <:expr@loc< $x$.val >> -> - mkexp loc - (Pexp_apply (mkexp loc (Pexp_ident (lident_with_loc "!" loc))) [("", expr x)]) - | ExAcc loc _ _ | <:expr@loc< $id:<:ident< $_$ . $_$ >>$ >> as e -> - let (e, l) = - match sep_expr_acc [] e with - [ [(loc, ml, <:expr@sloc< $uid:s$ >>) :: l] -> - let ca = constructors_arity () in - (mkexp loc (Pexp_construct (mkli sloc (conv_con s) ml) None ca), l) - | [(loc, ml, <:expr@sloc< $lid:s$ >>) :: l] -> - (mkexp loc (Pexp_ident (mkli sloc s ml)), l) - | [(_, [], e) :: l] -> (expr e, l) - | _ -> error loc "bad ast in expression" ] - in - let (_, e) = - List.fold_left - (fun (loc_bp, e1) (loc_ep, ml, e2) -> - match e2 with - [ <:expr@sloc< $lid:s$ >> -> - let loc = Loc.merge loc_bp loc_ep - in (loc, mkexp loc (Pexp_field e1 (mkli sloc (conv_lab s) ml))) - | _ -> error (loc_of_expr e2) "lowercase identifier expected" ]) - (loc, e) l - in - e - | ExAnt loc _ -> error loc "antiquotation not allowed here" - | ExApp loc _ _ as f -> - let (f, al) = expr_fa [] f in - let al = List.map label_expr al in - match (expr f).pexp_desc with - [ Pexp_construct li None _ -> - let al = List.map snd al in - if constructors_arity () then - mkexp loc (Pexp_construct li (Some (mkexp loc (Pexp_tuple al))) True) - else - let a = - match al with - [ [a] -> a - | _ -> mkexp loc (Pexp_tuple al) ] - in - mkexp loc (Pexp_construct li (Some a) False) - | Pexp_variant s None -> - let al = List.map snd al in - let a = - if constructors_arity () then - mkexp loc (Pexp_tuple al) - else - match al with - [ [a] -> a - | _ -> mkexp loc (Pexp_tuple al) ] - in mkexp loc (Pexp_variant s (Some a)) - | _ -> mkexp loc (Pexp_apply (expr f) al) ] - | ExAre loc e1 e2 -> - mkexp loc - (Pexp_apply (mkexp loc (Pexp_ident (array_function loc "Array" "get"))) - [("", expr e1); ("", expr e2)]) - | ExArr loc e -> mkexp loc (Pexp_array (List.map expr (list_of_expr e []))) - | ExAsf loc -> mkexp loc Pexp_assertfalse - | ExAss loc e v -> - let e = - match e with - [ <:expr@loc< $x$.val >> -> - Pexp_apply (mkexp loc (Pexp_ident (lident_with_loc ":=" loc))) - [("", expr x); ("", expr v)] - | ExAcc loc _ _ -> - match (expr e).pexp_desc with - [ Pexp_field e lab -> Pexp_setfield e lab (expr v) - | _ -> error loc "bad record access" ] - | ExAre loc e1 e2 -> - Pexp_apply (mkexp loc (Pexp_ident (array_function loc "Array" "set"))) - [("", expr e1); ("", expr e2); ("", expr v)] - | <:expr< $id:(<:ident@lloc< $lid:lab$ >>)$ >> -> Pexp_setinstvar (with_loc lab lloc) (expr v) - | ExSte loc e1 e2 -> - Pexp_apply - (mkexp loc (Pexp_ident (array_function loc "String" "set"))) - [("", expr e1); ("", expr e2); ("", expr v)] - | _ -> error loc "bad left part of assignment" ] - in - mkexp loc e - | ExAsr loc e -> mkexp loc (Pexp_assert (expr e)) - | ExChr loc s -> - mkexp loc (Pexp_constant (Const_char (char_of_char_token loc s))) - | ExCoe loc e t1 t2 -> - let t1 = - match t1 with - [ <:ctyp<>> -> None - | t -> Some (ctyp t) ] in - mkexp loc (Pexp_constraint (expr e) t1 (Some (ctyp t2))) - | ExFlo loc s -> mkexp loc (Pexp_constant (Const_float (remove_underscores s))) - | ExFor loc i e1 e2 df el -> - let e3 = ExSeq loc el in - mkexp loc (Pexp_for (with_loc i loc) (expr e1) (expr e2) (mkdirection df) (expr e3)) - | <:expr@loc< fun [ $PaLab _ lab po$ when $w$ -> $e$ ] >> -> - mkexp loc - (Pexp_function lab None - [(patt_of_lab loc lab po, when_expr e w)]) - | <:expr@loc< fun [ $PaOlbi _ lab p e1$ when $w$ -> $e2$ ] >> -> - let lab = paolab lab p in - mkexp loc - (Pexp_function ("?" ^ lab) (Some (expr e1)) [(patt p, when_expr e2 w)]) - | <:expr@loc< fun [ $PaOlb _ lab p$ when $w$ -> $e$ ] >> -> - let lab = paolab lab p in - mkexp loc - (Pexp_function ("?" ^ lab) None [(patt_of_lab loc lab p, when_expr e w)]) - | ExFun loc a -> mkexp loc (Pexp_function "" None (match_case a [])) - | ExIfe loc e1 e2 e3 -> - mkexp loc (Pexp_ifthenelse (expr e1) (expr e2) (Some (expr e3))) - | ExInt loc s -> - let i = try int_of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int" - ] in mkexp loc (Pexp_constant (Const_int i)) - | ExInt32 loc s -> - let i32 = try Int32.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int32" - ] in mkexp loc (Pexp_constant (Const_int32 i32)) - | ExInt64 loc s -> - let i64 = try Int64.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type int64" - ] in mkexp loc (Pexp_constant (Const_int64 i64)) - | ExNativeInt loc s -> - let nati = try Nativeint.of_string s with [ - Failure _ -> error loc "Integer literal exceeds the range of representable integers of type nativeint" - ] in mkexp loc (Pexp_constant (Const_nativeint nati)) - | ExLab loc _ _ -> error loc "labeled expression not allowed here" - | ExLaz loc e -> mkexp loc (Pexp_lazy (expr e)) - | ExLet loc rf bi e -> - mkexp loc (Pexp_let (mkrf rf) (binding bi []) (expr e)) - | ExLmd loc i me e -> mkexp loc (Pexp_letmodule (with_loc i loc) (module_expr me) (expr e)) - | ExMat loc e a -> mkexp loc (Pexp_match (expr e) (match_case a [])) - | ExNew loc id -> mkexp loc (Pexp_new (long_type_ident id)) - | ExObj loc po cfl -> - let p = - match po with - [ <:patt<>> -> <:patt@loc< _ >> - | p -> p ] - in - let cil = class_str_item cfl [] in - mkexp loc (Pexp_object { pcstr_pat = patt p; pcstr_fields = cil }) - | ExOlb loc _ _ -> error loc "labeled expression not allowed here" - | ExOvr loc iel -> mkexp loc (Pexp_override (mkideexp iel [])) - | ExRec loc lel eo -> - match lel with - [ <:rec_binding<>> -> error loc "empty record" - | _ -> - let eo = - match eo with - [ <:expr<>> -> None - | e -> Some (expr e) ] in - mkexp loc (Pexp_record (mklabexp lel []) eo) ] - | ExSeq _loc e -> - let rec loop = - fun - [ [] -> expr <:expr< () >> - | [e] -> expr e - | [e :: el] -> - let _loc = Loc.merge (loc_of_expr e) _loc in - mkexp _loc (Pexp_sequence (expr e) (loop el)) ] - in - loop (list_of_expr e []) - | ExSnd loc e s -> mkexp loc (Pexp_send (expr e) s) - | ExSte loc e1 e2 -> - mkexp loc - (Pexp_apply (mkexp loc (Pexp_ident (array_function loc "String" "get"))) - [("", expr e1); ("", expr e2)]) - | ExStr loc s -> - mkexp loc (Pexp_constant (Const_string (string_of_string_token loc s))) - | ExTry loc e a -> mkexp loc (Pexp_try (expr e) (match_case a [])) - | <:expr@loc< ($e1$, $e2$) >> -> - mkexp loc (Pexp_tuple (List.map expr (list_of_expr e1 (list_of_expr e2 [])))) - | <:expr@loc< ($tup:_$) >> -> error loc "singleton tuple" - | ExTyc loc e t -> mkexp loc (Pexp_constraint (expr e) (Some (ctyp t)) None) - | <:expr@loc< () >> -> - mkexp loc (Pexp_construct (lident_with_loc "()" loc) None True) - | <:expr@loc< $lid:s$ >> -> - mkexp loc (Pexp_ident (lident_with_loc s loc)) - | <:expr@loc< $uid:s$ >> -> - (* let ca = constructors_arity () in *) - mkexp loc (Pexp_construct (lident_with_loc (conv_con s) loc) None True) - | ExVrn loc s -> mkexp loc (Pexp_variant (conv_con s) None) - | 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)) - | <: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)) - | <:expr@loc< (module $me$) >> -> - mkexp loc (Pexp_pack (module_expr me)) - | ExFUN loc i e -> - mkexp loc (Pexp_newtype i (expr e)) - | <:expr@loc< $_$,$_$ >> -> error loc "expr, expr: not allowed here" - | <:expr@loc< $_$;$_$ >> -> - error loc "expr; expr: not allowed here, use do {...} or [|...|] to surround them" - | ExId _ _ | ExNil _ as e -> error (loc_of_expr e) "invalid expr" ] - and patt_of_lab _loc lab = - fun - [ <:patt<>> -> patt <:patt< $lid:lab$ >> - | p -> patt p ] - and expr_of_lab _loc lab = - fun - [ <:expr<>> -> expr <:expr< $lid:lab$ >> - | e -> expr e ] - and label_expr = - fun - [ ExLab loc lab eo -> (lab, expr_of_lab loc lab eo) - | ExOlb loc lab eo -> ("?" ^ lab, expr_of_lab loc lab eo) - | e -> ("", expr e) ] - and binding x acc = - match x with - [ <:binding< $x$ and $y$ >> -> - binding x (binding y acc) - | <:binding@_loc< $pat:( <:patt@sloc< $lid:bind_name$ >> )$ = ($e$ : $TyTypePol _ vs ty$) >> -> - (* this code is not pretty because it is temporary *) - let rec id_to_string x = - match x with - [ <:ctyp< $lid:x$ >> -> [x] - | <:ctyp< $x$ $y$ >> -> (id_to_string x) @ (id_to_string y) - | _ -> assert False] - in - let vars = id_to_string vs in - let ampersand_vars = List.map (fun x -> "&" ^ x) vars in - let ty' = varify_constructors vars (ctyp ty) in - let mkexp = mkexp _loc in - let mkpat = mkpat _loc in - let e = mkexp (Pexp_constraint (expr e) (Some (ctyp ty)) None) in - let rec mk_newtypes x = - match x with - [ [newtype :: []] -> mkexp (Pexp_newtype(newtype, e)) - | [newtype :: newtypes] -> - mkexp(Pexp_newtype (newtype,mk_newtypes newtypes)) - | [] -> assert False] - in - let pat = - mkpat (Ppat_constraint (mkpat (Ppat_var (with_loc bind_name sloc)), - mktyp _loc (Ptyp_poly ampersand_vars ty'))) - in - let e = mk_newtypes vars in - [( pat, e) :: acc] - | <:binding@_loc< $p$ = ($e$ : ! $vs$ . $ty$) >> -> - [(patt <:patt< ($p$ : ! $vs$ . $ty$ ) >>, expr e) :: acc] - | <:binding< $p$ = $e$ >> -> [(patt p, expr e) :: acc] - | <:binding<>> -> acc - | _ -> assert False ] - and match_case x acc = - match x with - [ <:match_case< $x$ | $y$ >> -> match_case x (match_case y acc) - | <:match_case< $pat:p$ when $w$ -> $e$ >> -> - [(patt p, when_expr e w) :: acc] - | <:match_case<>> -> acc - | _ -> assert False ] - and when_expr e w = - match w with - [ <:expr<>> -> expr e - | w -> mkexp (loc_of_expr w) (Pexp_when (expr w) (expr e)) ] - and mklabexp x acc = - match x with - [ <:rec_binding< $x$; $y$ >> -> - mklabexp x (mklabexp y acc) - | <:rec_binding< $i$ = $e$ >> -> [(ident ~conv_lid:conv_lab i, expr e) :: acc] - | _ -> assert False ] - and mkideexp x acc = - match x with - [ <:rec_binding<>> -> acc - | <:rec_binding< $x$; $y$ >> -> - mkideexp x (mkideexp y acc) - | <:rec_binding< $id:( <:ident@sloc< $lid:s$ >>)$ = $e$ >> -> [(with_loc s sloc, expr e) :: acc] - | _ -> assert False ] - and mktype_decl x acc = - match x with - [ <:ctyp< $x$ and $y$ >> -> - mktype_decl x (mktype_decl y acc) - | Ast.TyDcl cloc c tl td cl -> - let cl = - List.map - (fun (t1, t2) -> - let loc = Loc.merge (loc_of_ctyp t1) (loc_of_ctyp t2) in - (ctyp t1, ctyp t2, mkloc loc)) - cl - in - [(with_loc c cloc, - type_decl (List.fold_right optional_type_parameters tl []) cl td cloc) :: acc] - | _ -> assert False ] - and module_type = - fun - [ <:module_type@loc<>> -> error loc "abstract/nil module type not allowed here" - | <:module_type@loc< $id:i$ >> -> mkmty loc (Pmty_ident (long_uident i)) - | <:module_type@loc< functor ($n$ : $nt$) -> $mt$ >> -> - mkmty loc (Pmty_functor (with_loc n loc) (module_type nt) (module_type mt)) - | <:module_type@loc< '$_$ >> -> error loc "module type variable not allowed here" - | <:module_type@loc< sig $sl$ end >> -> - mkmty loc (Pmty_signature (sig_item sl [])) - | <:module_type@loc< $mt$ with $wc$ >> -> - mkmty loc (Pmty_with (module_type mt) (mkwithc wc [])) - | <:module_type@loc< module type of $me$ >> -> - mkmty loc (Pmty_typeof (module_expr me)) - | <:module_type< $anti:_$ >> -> assert False ] - and sig_item s l = - match s with - [ <:sig_item<>> -> l - | SgCls loc cd -> - [mksig loc (Psig_class - (List.map class_info_class_type (list_of_class_type cd []))) :: l] - | SgClt loc ctd -> - [mksig loc (Psig_class_type - (List.map class_info_class_type (list_of_class_type ctd []))) :: l] - | <:sig_item< $sg1$; $sg2$ >> -> sig_item sg1 (sig_item sg2 l) - | SgDir _ _ _ -> l - | <:sig_item@loc< exception $uid:s$ >> -> - [mksig loc (Psig_exception (with_loc (conv_con s) loc) []) :: l] - | <:sig_item@loc< exception $uid:s$ of $t$ >> -> - [mksig loc (Psig_exception (with_loc (conv_con s) loc) - (List.map ctyp (list_of_ctyp t []))) :: l] - | SgExc _ _ -> assert False (*FIXME*) - | SgExt loc n t sl -> [mksig loc (Psig_value (with_loc n loc) (mkvalue_desc loc t (list_of_meta_list sl))) :: l] - | SgInc loc mt -> [mksig loc (Psig_include (module_type mt)) :: l] - | SgMod loc n mt -> [mksig loc (Psig_module (with_loc n loc) (module_type mt)) :: l] - | SgRecMod loc mb -> - [mksig loc (Psig_recmodule (module_sig_binding mb [])) :: l] - | SgMty loc n mt -> - let si = - match mt with - [ MtQuo _ _ -> Pmodtype_abstract - | _ -> Pmodtype_manifest (module_type mt) ] - in - [mksig loc (Psig_modtype (with_loc n loc) si) :: l] - | SgOpn loc id -> - [mksig loc (Psig_open Fresh (long_uident id)) :: l] - | SgTyp loc tdl -> [mksig loc (Psig_type (mktype_decl tdl [])) :: l] - | SgVal loc n t -> [mksig loc (Psig_value (with_loc n loc) (mkvalue_desc loc t [])) :: l] - | <:sig_item@loc< $anti:_$ >> -> error loc "antiquotation in sig_item" ] - and module_sig_binding x acc = - match x with - [ <:module_binding< $x$ and $y$ >> -> - module_sig_binding x (module_sig_binding y acc) - | <:module_binding@loc< $s$ : $mt$ >> -> - [(with_loc s loc, module_type mt) :: acc] - | _ -> assert False ] - and module_str_binding x acc = - match x with - [ <:module_binding< $x$ and $y$ >> -> - module_str_binding x (module_str_binding y acc) - | <:module_binding@loc< $s$ : $mt$ = $me$ >> -> - [(with_loc s loc, module_type mt, module_expr me) :: acc] - | _ -> assert False ] - and module_expr = - fun - [ <:module_expr@loc<>> -> error loc "nil module expression" - | <:module_expr@loc< $id:i$ >> -> mkmod loc (Pmod_ident (long_uident i)) - | <:module_expr@loc< $me1$ $me2$ >> -> - mkmod loc (Pmod_apply (module_expr me1) (module_expr me2)) - | <:module_expr@loc< functor ($n$ : $mt$) -> $me$ >> -> - mkmod loc (Pmod_functor (with_loc n loc) (module_type mt) (module_expr me)) - | <:module_expr@loc< struct $sl$ end >> -> - mkmod loc (Pmod_structure (str_item sl [])) - | <:module_expr@loc< ($me$ : $mt$) >> -> - mkmod loc (Pmod_constraint (module_expr me) (module_type mt)) - | <:module_expr@loc< (value $e$ : $pt$) >> -> - mkmod loc (Pmod_unpack ( - mkexp loc (Pexp_constraint (expr e, - Some (mktyp loc (Ptyp_package (package_type pt))), - None)))) - | <:module_expr@loc< (value $e$) >> -> - mkmod loc (Pmod_unpack (expr e)) - | <:module_expr@loc< $anti:_$ >> -> error loc "antiquotation in module_expr" ] - and str_item s l = - match s with - [ <:str_item<>> -> l - | StCls loc cd -> - [mkstr loc (Pstr_class - (List.map class_info_class_expr (list_of_class_expr cd []))) :: l] - | StClt loc ctd -> - [mkstr loc (Pstr_class_type - (List.map class_info_class_type (list_of_class_type ctd []))) :: l] - | <:str_item< $st1$; $st2$ >> -> str_item st1 (str_item st2 l) - | StDir _ _ _ -> l - | <:str_item@loc< exception $uid:s$ >> -> - [mkstr loc (Pstr_exception (with_loc (conv_con s) loc) []) :: l ] - | <:str_item@loc< exception $uid:s$ of $t$ >> -> - [mkstr loc (Pstr_exception (with_loc (conv_con s) loc) - (List.map ctyp (list_of_ctyp t []))) :: l ] - | <:str_item@loc< exception $uid:s$ = $i$ >> -> - [mkstr loc (Pstr_exn_rebind (with_loc (conv_con s) loc) (long_uident ~conv_con i)) :: l ] - | <:str_item@loc< exception $uid:_$ of $_$ = $_$ >> -> - error loc "type in exception alias" - | StExc _ _ _ -> assert False (*FIXME*) - | StExp loc e -> [mkstr loc (Pstr_eval (expr e)) :: l] - | StExt loc n t sl -> [mkstr loc (Pstr_primitive (with_loc n loc) (mkvalue_desc loc t (list_of_meta_list sl))) :: l] - | StInc loc me -> [mkstr loc (Pstr_include (module_expr me)) :: l] - | StMod loc n me -> [mkstr loc (Pstr_module (with_loc n loc) (module_expr me)) :: l] - | 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] - | StTyp loc tdl -> [mkstr loc (Pstr_type (mktype_decl tdl [])) :: l] - | StVal loc rf bi -> - [mkstr loc (Pstr_value (mkrf rf) (binding bi [])) :: l] - | <:str_item@loc< $anti:_$ >> -> error loc "antiquotation in str_item" ] - and class_type = - fun - [ CtCon loc ViNil id tl -> - mkcty loc - (Pcty_constr (long_class_ident id) (List.map ctyp (list_of_opt_ctyp tl []))) - | CtFun loc (TyLab _ lab t) ct -> - mkcty loc (Pcty_fun lab (ctyp t) (class_type ct)) - | CtFun loc (TyOlb loc1 lab t) ct -> - let t = TyApp loc1 (predef_option loc1) t in - mkcty loc (Pcty_fun ("?" ^ lab) (ctyp t) (class_type ct)) - | CtFun loc t ct -> mkcty loc (Pcty_fun "" (ctyp t) (class_type ct)) - | CtSig loc t_o ctfl -> - let t = - match t_o with - [ <:ctyp<>> -> <:ctyp@loc< _ >> - | t -> t ] - in - let cil = class_sig_item ctfl [] in - mkcty loc (Pcty_signature { - pcsig_self = ctyp t; - pcsig_fields = cil; - pcsig_loc = mkloc loc; - }) - | CtCon loc _ _ _ -> - error loc "invalid virtual class inside a class type" - | CtAnt _ _ | CtEq _ _ _ | CtCol _ _ _ | CtAnd _ _ _ | CtNil _ -> - assert False ] - - and class_info_class_expr ci = - match ci with - [ CeEq _ (CeCon loc vir (IdLid nloc name) params) ce -> - let (loc_params, (params, variance)) = - match params with - [ <:ctyp<>> -> (loc, ([], [])) - | t -> (loc_of_ctyp t, List.split (class_parameters t [])) ] - in - {pci_virt = mkvirtual vir; - pci_params = (params, mkloc loc_params); - pci_name = with_loc name nloc; - pci_expr = class_expr ce; - pci_loc = mkloc loc; - pci_variance = variance} - | ce -> error (loc_of_class_expr ce) "bad class definition" ] - and class_info_class_type ci = - match ci with - [ CtEq _ (CtCon loc vir (IdLid nloc name) params) ct | - CtCol _ (CtCon loc vir (IdLid nloc name) params) ct -> - let (loc_params, (params, variance)) = - match params with - [ <:ctyp<>> -> (loc, ([], [])) - | t -> (loc_of_ctyp t, List.split (class_parameters t [])) ] - in - {pci_virt = mkvirtual vir; - pci_params = (params, mkloc loc_params); - pci_name = with_loc name nloc; - pci_expr = class_type ct; - pci_loc = mkloc loc; - pci_variance = variance} - | ct -> error (loc_of_class_type ct) - "bad class/class type declaration/definition" ] - and class_sig_item c l = - match c with - [ <:class_sig_item<>> -> l - | CgCtr loc t1 t2 -> [mkctf loc (Pctf_cstr (ctyp t1, ctyp t2)) :: l] - | <:class_sig_item< $csg1$; $csg2$ >> -> - class_sig_item csg1 (class_sig_item csg2 l) - | CgInh loc ct -> [mkctf loc (Pctf_inher (class_type ct)) :: l] - | CgMth loc s pf t -> - [mkctf loc (Pctf_meth (s, mkprivate pf, mkpolytype (ctyp t))) :: l] - | CgVal loc s b v t -> - [mkctf loc (Pctf_val (s, mkmutable b, mkvirtual v, ctyp t)) :: l] - | CgVir loc s b t -> - [mkctf loc (Pctf_virt (s, mkprivate b, mkpolytype (ctyp t))) :: l] - | CgAnt _ _ -> assert False ] - and class_expr = - fun - [ CeApp loc _ _ as c -> - let (ce, el) = class_expr_fa [] c in - let el = List.map label_expr el in - mkcl loc (Pcl_apply (class_expr ce) el) - | CeCon loc ViNil id tl -> - mkcl loc - (Pcl_constr (long_class_ident id) (List.map ctyp (list_of_opt_ctyp tl []))) - | CeFun loc (PaLab _ lab po) ce -> - mkcl loc - (Pcl_fun lab None (patt_of_lab loc lab po) (class_expr ce)) - | CeFun loc (PaOlbi _ lab p e) ce -> - let lab = paolab lab p in - mkcl loc (Pcl_fun ("?" ^ lab) (Some (expr e)) (patt p) (class_expr ce)) - | CeFun loc (PaOlb _ lab p) ce -> - let lab = paolab lab p in - mkcl loc - (Pcl_fun ("?" ^ lab) None (patt_of_lab loc lab p) (class_expr ce)) - | CeFun loc p ce -> mkcl loc (Pcl_fun "" None (patt p) (class_expr ce)) - | CeLet loc rf bi ce -> - mkcl loc (Pcl_let (mkrf rf) (binding bi []) (class_expr ce)) - | CeStr loc po cfl -> - let p = - match po with - [ <:patt<>> -> <:patt@loc< _ >> - | p -> p ] - in - let cil = class_str_item cfl [] in - mkcl loc (Pcl_structure { - pcstr_pat = patt p; - pcstr_fields = cil; - }) - | CeTyc loc ce ct -> - mkcl loc (Pcl_constraint (class_expr ce) (class_type ct)) - | CeCon loc _ _ _ -> - error loc "invalid virtual class inside a class expression" - | CeAnt _ _ | CeEq _ _ _ | CeAnd _ _ _ | CeNil _ -> assert False ] - and class_str_item c l = - match c with - [ CrNil _ -> l - | CrCtr loc t1 t2 -> [mkcf loc (Pcf_constr (ctyp t1, ctyp t2)) :: l] - | <:class_str_item< $cst1$; $cst2$ >> -> - class_str_item cst1 (class_str_item cst2 l) - | CrInh loc ov ce pb -> - let opb = if pb = "" then None else Some pb in - [mkcf loc (Pcf_inher (override_flag loc ov) (class_expr ce) opb) :: l] - | CrIni loc e -> [mkcf loc (Pcf_init (expr e)) :: l] - | CrMth loc s ov pf e t -> - let t = - match t with - [ <:ctyp<>> -> None - | t -> Some (mkpolytype (ctyp t)) ] in - let e = mkexp loc (Pexp_poly (expr e) t) in - [mkcf loc (Pcf_meth (with_loc s loc, mkprivate pf, override_flag loc ov, e)) :: l] - | CrVal loc s ov mf e -> - [mkcf loc (Pcf_val (with_loc s loc, mkmutable mf, override_flag loc ov, expr e)) :: l] - | CrVir loc s pf t -> - [mkcf loc (Pcf_virt (with_loc s loc, mkprivate pf, mkpolytype (ctyp t))) :: l] - | CrVvr loc s mf t -> - [mkcf loc (Pcf_valvirt (with_loc s loc, mkmutable mf, ctyp t)) :: l] - | CrAnt _ _ -> assert False ]; - - value sig_item ast = sig_item ast []; - value str_item ast = str_item ast []; - - value directive = - fun - [ <:expr<>> -> Pdir_none - | ExStr _ s -> Pdir_string s - | ExInt _ i -> Pdir_int (int_of_string i) - | <:expr< True >> -> Pdir_bool True - | <:expr< False >> -> Pdir_bool False - | e -> Pdir_ident (ident_noloc (ident_of_expr e)) ] - ; - - value phrase = - fun - [ StDir _ d dp -> Ptop_dir d (directive dp) - | si -> Ptop_def (str_item si) ] - ; -end; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli deleted file mode 100644 index 0e6f52cc..00000000 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli +++ /dev/null @@ -1,32 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -module Make (Camlp4Ast : Sig.Camlp4Ast) : sig - open Camlp4Ast; - - (** {6 Useful functions} *) - - value sig_item : sig_item -> Camlp4_import.Parsetree.signature; - value str_item : str_item -> Camlp4_import.Parsetree.structure; - value phrase : str_item -> Camlp4_import.Parsetree.toplevel_phrase; - -end; diff --git a/camlp4/Camlp4/Struct/CleanAst.ml b/camlp4/Camlp4/Struct/CleanAst.ml deleted file mode 100644 index 8354d1c2..00000000 --- a/camlp4/Camlp4/Struct/CleanAst.ml +++ /dev/null @@ -1,145 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -(** This module is suppose to contain nils elimination. *) -module Make (Ast : Sig.Camlp4Ast) = struct - - class clean_ast = object - - inherit Ast.map as super; - - method with_constr wc = - match super#with_constr wc with - [ <:with_constr< $ <:with_constr<>> $ and $wc$ >> | - <:with_constr< $wc$ and $ <:with_constr<>> $ >> -> wc - | wc -> wc ]; - - method expr e = - match super#expr e with - [ <:expr< let $rec:_$ $ <:binding<>> $ in $e$ >> | - <:expr< { ($e$) with $ <:rec_binding<>> $ } >> | - <:expr< $ <:expr<>> $, $e$ >> | - <:expr< $e$, $ <:expr<>> $ >> | - <:expr< $ <:expr<>> $; $e$ >> | - <:expr< $e$; $ <:expr<>> $ >> -> e - | e -> e ]; - - method patt p = - match super#patt p with - [ <:patt< ( $p$ as $ <:patt<>> $ ) >> | - <:patt< $ <:patt<>> $ | $p$ >> | - <:patt< $p$ | $ <:patt<>> $ >> | - <:patt< $ <:patt<>> $, $p$ >> | - <:patt< $p$, $ <:patt<>> $ >> | - <:patt< $ <:patt<>> $; $p$ >> | - <:patt< $p$; $ <:patt<>> $ >> -> p - | p -> p ]; - - method match_case mc = - match super#match_case mc with - [ <:match_case< $ <:match_case<>> $ | $mc$ >> | - <:match_case< $mc$ | $ <:match_case<>> $ >> -> mc - | mc -> mc ]; - - method binding bi = - match super#binding bi with - [ <:binding< $ <:binding<>> $ and $bi$ >> | - <:binding< $bi$ and $ <:binding<>> $ >> -> bi - | bi -> bi ]; - - method rec_binding rb = - match super#rec_binding rb with - [ <:rec_binding< $ <:rec_binding<>> $ ; $bi$ >> | - <:rec_binding< $bi$ ; $ <:rec_binding<>> $ >> -> bi - | bi -> bi ]; - - method module_binding mb = - match super#module_binding mb with - [ <:module_binding< $ <:module_binding<>> $ and $mb$ >> | - <:module_binding< $mb$ and $ <:module_binding<>> $ >> -> mb - | mb -> mb ]; - - method ctyp t = - match super#ctyp t with - [ <:ctyp< ! $ <:ctyp<>> $ . $t$ >> | - <:ctyp< $ <:ctyp<>> $ as $t$ >> | - <:ctyp< $t$ as $ <:ctyp<>> $ >> | - <:ctyp< $t$ -> $ <:ctyp<>> $ >> | - <:ctyp< $ <:ctyp<>> $ -> $t$ >> | - <:ctyp< $ <:ctyp<>> $ | $t$ >> | - <:ctyp< $t$ | $ <:ctyp<>> $ >> | - <:ctyp< $t$ of $ <:ctyp<>> $ >> | - <:ctyp< $ <:ctyp<>> $ and $t$ >> | - <:ctyp< $t$ and $ <:ctyp<>> $ >> | - <:ctyp< $t$; $ <:ctyp<>> $ >> | - <:ctyp< $ <:ctyp<>> $; $t$ >> | - <:ctyp< $ <:ctyp<>> $, $t$ >> | - <:ctyp< $t$, $ <:ctyp<>> $ >> | - <:ctyp< $t$ & $ <:ctyp<>> $ >> | - <:ctyp< $ <:ctyp<>> $ & $t$ >> | - <:ctyp< $ <:ctyp<>> $ * $t$ >> | - <:ctyp< $t$ * $ <:ctyp<>> $ >> -> t - | t -> t ]; - - method sig_item sg = - match super#sig_item sg with - [ <:sig_item< $ <:sig_item<>> $; $sg$ >> | - <:sig_item< $sg$; $ <:sig_item<>> $ >> -> sg - | <:sig_item@loc< type $ <:ctyp<>> $ >> -> <:sig_item@loc<>> - | sg -> sg ]; - - method str_item st = - match super#str_item st with - [ <:str_item< $ <:str_item<>> $; $st$ >> | - <:str_item< $st$; $ <:str_item<>> $ >> -> st - | <:str_item@loc< type $ <:ctyp<>> $ >> -> <:str_item@loc<>> - | <:str_item@loc< value $rec:_$ $ <:binding<>> $ >> -> <:str_item@loc<>> - | st -> st ]; - - method module_type mt = - match super#module_type mt with - [ <:module_type< $mt$ with $ <:with_constr<>> $ >> -> mt - | mt -> mt ]; - - method class_expr ce = - match super#class_expr ce with - [ <:class_expr< $ <:class_expr<>> $ and $ce$ >> | - <:class_expr< $ce$ and $ <:class_expr<>> $ >> -> ce - | ce -> ce ]; - - method class_type ct = - match super#class_type ct with - [ <:class_type< $ <:class_type<>> $ and $ct$ >> | - <:class_type< $ct$ and $ <:class_type<>> $ >> -> ct - | ct -> ct ]; - - method class_sig_item csg = - match super#class_sig_item csg with - [ <:class_sig_item< $ <:class_sig_item<>> $; $csg$ >> | - <:class_sig_item< $csg$; $ <:class_sig_item<>> $ >> -> csg - | csg -> csg ]; - - method class_str_item cst = - match super#class_str_item cst with - [ <:class_str_item< $ <:class_str_item<>> $; $cst$ >> | - <:class_str_item< $cst$; $ <:class_str_item<>> $ >> -> cst - | cst -> cst ]; - - end; - -end; diff --git a/camlp4/Camlp4/Struct/CommentFilter.ml b/camlp4/Camlp4/Struct/CommentFilter.ml deleted file mode 100644 index f8cb3004..00000000 --- a/camlp4/Camlp4/Struct/CommentFilter.ml +++ /dev/null @@ -1,56 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Token : Sig.Camlp4Token) = struct - open Token; - - type t = (Stream.t (string * Loc.t) * Queue.t (string * Loc.t)); - - value mk () = - let q = Queue.create () in - let f _ = - debug comments "take...@\n" in - try Some (Queue.take q) with [ Queue.Empty -> None ] - in (Stream.from f, q); - - value filter (_, q) = - let rec self = - parser - [ [: ` (Sig.COMMENT x, loc); xs :] -> - do { Queue.add (x, loc) q; - debug comments "add: %S at %a@\n" x Loc.dump loc in - self xs } - | [: ` x; xs :] -> - (* debug comments "Found %a at %a@." Token.print x Loc.dump loc in *) - [: ` x; self xs :] - | [: :] -> [: :] ] - in self; - - value take_list (_, q) = - let rec self accu = - if Queue.is_empty q then accu else self [Queue.take q :: accu] - in self []; - - value take_stream = fst; - - value define token_fiter comments_strm = - debug comments "Define a comment filter@\n" in - Token.Filter.define_filter token_fiter - (fun previous strm -> previous (filter comments_strm strm)); - -end; diff --git a/camlp4/Camlp4/Struct/CommentFilter.mli b/camlp4/Camlp4/Struct/CommentFilter.mli deleted file mode 100644 index 1df29f7b..00000000 --- a/camlp4/Camlp4/Struct/CommentFilter.mli +++ /dev/null @@ -1,33 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Token : Sig.Camlp4Token) : sig - open Token; - - type t; - - value mk : unit -> t; - - value define : Token.Filter.t -> t -> unit; - - value filter : t -> Stream.t (Token.t * Loc.t) -> Stream.t (Token.t * Loc.t); - - value take_list : t -> list (string * Loc.t); - - value take_stream : t -> Stream.t (string * Loc.t); -end; diff --git a/camlp4/Camlp4/Struct/DynAst.ml b/camlp4/Camlp4/Struct/DynAst.ml deleted file mode 100644 index 4bc8a33b..00000000 --- a/camlp4/Camlp4/Struct/DynAst.ml +++ /dev/null @@ -1,91 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Ast) : Sig.DynAst with module Ast = Ast = struct - module Ast = Ast; - type tag 'a = - [ Tag_ctyp - | Tag_patt - | Tag_expr - | Tag_module_type - | Tag_sig_item - | Tag_with_constr - | Tag_module_expr - | Tag_str_item - | Tag_class_type - | Tag_class_sig_item - | Tag_class_expr - | Tag_class_str_item - | Tag_match_case - | Tag_ident - | Tag_binding - | Tag_rec_binding - | Tag_module_binding ]; - - value string_of_tag = - fun - [ Tag_ctyp -> "ctyp" - | Tag_patt -> "patt" - | Tag_expr -> "expr" - | Tag_module_type -> "module_type" - | Tag_sig_item -> "sig_item" - | Tag_with_constr -> "with_constr" - | Tag_module_expr -> "module_expr" - | Tag_str_item -> "str_item" - | Tag_class_type -> "class_type" - | Tag_class_sig_item -> "class_sig_item" - | Tag_class_expr -> "class_expr" - | Tag_class_str_item -> "class_str_item" - | Tag_match_case -> "match_case" - | Tag_ident -> "ident" - | Tag_binding -> "binding" - | Tag_rec_binding -> "rec_binding" - | Tag_module_binding -> "module_binding" ]; - - value ctyp_tag = Tag_ctyp; - value patt_tag = Tag_patt; - value expr_tag = Tag_expr; - value module_type_tag = Tag_module_type; - value sig_item_tag = Tag_sig_item; - value with_constr_tag = Tag_with_constr; - value module_expr_tag = Tag_module_expr; - value str_item_tag = Tag_str_item; - value class_type_tag = Tag_class_type; - value class_sig_item_tag = Tag_class_sig_item; - value class_expr_tag = Tag_class_expr; - value class_str_item_tag = Tag_class_str_item; - value match_case_tag = Tag_match_case; - value ident_tag = Tag_ident; - value binding_tag = Tag_binding; - value rec_binding_tag = Tag_rec_binding; - value module_binding_tag = Tag_module_binding; - - type dyn; - external dyn_tag : tag 'a -> tag dyn = "%identity"; - - module Pack(X : sig type t 'a; end) = struct - (* These Obj.* hacks should be avoided with GADTs *) - type pack = (tag dyn * Obj.t); - exception Pack_error; - value pack tag v = (dyn_tag tag, Obj.repr v); - value unpack (tag : tag 'a) (tag', obj) = - if dyn_tag tag = tag' then (Obj.obj obj : X.t 'a) else raise Pack_error; - value print_tag f (tag, _) = Format.pp_print_string f (string_of_tag tag); - end; -end; diff --git a/camlp4/Camlp4/Struct/DynLoader.ml b/camlp4/Camlp4/Struct/DynLoader.ml deleted file mode 100644 index 00ab05ab..00000000 --- a/camlp4/Camlp4/Struct/DynLoader.ml +++ /dev/null @@ -1,84 +0,0 @@ -(* camlp4r pa_macro.cmo *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2001-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - - -type t = Queue.t string; - -exception Error of string and string; - -value include_dir x y = Queue.add y x; - -value fold_load_path x f acc = Queue.fold (fun x y -> f y x) acc x; - -value mk ?(ocaml_stdlib = True) ?(camlp4_stdlib = True) () = - let q = Queue.create () in do { - if ocaml_stdlib then include_dir q Camlp4_config.ocaml_standard_library else (); - if camlp4_stdlib then do { - include_dir q Camlp4_config.camlp4_standard_library; - include_dir q (Filename.concat Camlp4_config.camlp4_standard_library "Camlp4Parsers"); - include_dir q (Filename.concat Camlp4_config.camlp4_standard_library "Camlp4Printers"); - include_dir q (Filename.concat Camlp4_config.camlp4_standard_library "Camlp4Filters"); - } else (); - include_dir q "."; - q -}; - -(* Load files in core *) - -value find_in_path x name = - if not (Filename.is_implicit name) then - if Sys.file_exists name then name else raise Not_found - else - let res = - fold_load_path x - (fun dir -> - fun - [ None -> - let fullname = Filename.concat dir name in - if Sys.file_exists fullname then Some fullname else None - | x -> x ]) None - in match res with [ None -> raise Not_found | Some x -> x ]; - -value load = - let _initialized = ref False in - fun _path file -> - do { - if not _initialized.val then - try do { - Dynlink.init (); - Dynlink.allow_unsafe_modules True; - _initialized.val := True - } - with - [ Dynlink.Error e -> - raise (Error "Camlp4's dynamic loader initialization" (Dynlink.error_message e)) ] - else (); - let fname = - try find_in_path _path file with - [ Not_found -> raise (Error file "file not found in path") ] - in - try Dynlink.loadfile fname with - [ Dynlink.Error e -> raise (Error fname (Dynlink.error_message e)) ] - }; - - -value is_native = Dynlink.is_native; diff --git a/camlp4/Camlp4/Struct/DynLoader.mli b/camlp4/Camlp4/Struct/DynLoader.mli deleted file mode 100644 index 7a7dc899..00000000 --- a/camlp4/Camlp4/Struct/DynLoader.mli +++ /dev/null @@ -1,20 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -include Sig.DynLoader; diff --git a/camlp4/Camlp4/Struct/EmptyError.ml b/camlp4/Camlp4/Struct/EmptyError.ml deleted file mode 100644 index 52a50289..00000000 --- a/camlp4/Camlp4/Struct/EmptyError.ml +++ /dev/null @@ -1,22 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -type t = unit; -exception E of t; -value print _ = assert False; -value to_string _ = assert False; diff --git a/camlp4/Camlp4/Struct/EmptyError.mli b/camlp4/Camlp4/Struct/EmptyError.mli deleted file mode 100644 index 076ee317..00000000 --- a/camlp4/Camlp4/Struct/EmptyError.mli +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -include Sig.Error; diff --git a/camlp4/Camlp4/Struct/EmptyPrinter.ml b/camlp4/Camlp4/Struct/EmptyPrinter.ml deleted file mode 100644 index 11a93cd6..00000000 --- a/camlp4/Camlp4/Struct/EmptyPrinter.ml +++ /dev/null @@ -1,22 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Ast) = struct - value print_interf ?input_file:(_) ?output_file:(_) _ = failwith "No interface printer"; - value print_implem ?input_file:(_) ?output_file:(_) _ = failwith "No implementation printer"; -end; diff --git a/camlp4/Camlp4/Struct/EmptyPrinter.mli b/camlp4/Camlp4/Struct/EmptyPrinter.mli deleted file mode 100644 index 94585b32..00000000 --- a/camlp4/Camlp4/Struct/EmptyPrinter.mli +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Ast) : (Sig.Printer Ast).S; diff --git a/camlp4/Camlp4/Struct/FreeVars.ml b/camlp4/Camlp4/Struct/FreeVars.ml deleted file mode 100644 index 8c253ff5..00000000 --- a/camlp4/Camlp4/Struct/FreeVars.ml +++ /dev/null @@ -1,127 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Camlp4Ast) = struct - - module S = Set.Make String; - - class c_fold_pattern_vars ['accu] f init = - object - inherit Ast.fold as super; - value acc = init; - method acc : 'accu = acc; - method patt = - fun - [ <:patt< $lid:s$ >> | <:patt< ~ $s$ >> | <:patt< ? $s$ >> -> - {< acc = f s acc >} - | p -> super#patt p ]; - end; - - value fold_pattern_vars f p init = ((new c_fold_pattern_vars f init)#patt p)#acc; - - value rec fold_binding_vars f bi acc = - match bi with - [ <:binding< $bi1$ and $bi2$ >> -> - fold_binding_vars f bi1 (fold_binding_vars f bi2 acc) - | <:binding< $p$ = $_$ >> -> fold_pattern_vars f p acc - | <:binding<>> -> acc - | <:binding< $anti:_$ >> -> assert False ]; - - class fold_free_vars ['accu] (f : string -> 'accu -> 'accu) ?(env_init = S.empty) free_init = - object (o) - inherit Ast.fold as super; - value free : 'accu = free_init; - value env : S.t = env_init; - - method free = free; - method set_env env = {< env = env >}; - method add_atom s = {< env = S.add s env >}; - method add_patt p = {< env = fold_pattern_vars S.add p env >}; - method add_binding bi = {< env = fold_binding_vars S.add bi env >}; - - method expr = - fun - [ <:expr< $lid:s$ >> | <:expr< ~ $s$ >> | <:expr< ? $s$ >> -> - if S.mem s env then o else {< free = f s free >} - - | <:expr< let $bi$ in $e$ >> -> - (((o#add_binding bi)#expr e)#set_env env)#binding bi - - | <:expr< let rec $bi$ in $e$ >> -> - (((o#add_binding bi)#expr e)#binding bi)#set_env env - - | <:expr< for $s$ = $e1$ $to:_$ $e2$ do { $e3$ } >> -> - ((((o#expr e1)#expr e2)#add_atom s)#expr e3)#set_env env - - | <:expr< $id:_$ >> | <:expr< new $_$ >> -> o - - | <:expr< object ($p$) $cst$ end >> -> - ((o#add_patt p)#class_str_item cst)#set_env env - - | e -> super#expr e ]; - - method match_case = - fun - [ <:match_case< $p$ when $e1$ -> $e2$ >> -> - (((o#add_patt p)#expr e1)#expr e2)#set_env env - | m -> super#match_case m ]; - - method str_item = - fun - [ <:str_item< external $s$ : $t$ = $_$ >> -> - (o#ctyp t)#add_atom s - | <:str_item< value $bi$ >> -> - (o#binding bi)#add_binding bi - | <:str_item< value rec $bi$ >> -> - (o#add_binding bi)#binding bi - | st -> super#str_item st ]; - - method class_expr = - fun - [ <:class_expr< fun $p$ -> $ce$ >> -> - ((o#add_patt p)#class_expr ce)#set_env env - | <:class_expr< let $bi$ in $ce$ >> -> - (((o#binding bi)#add_binding bi)#class_expr ce)#set_env env - | <:class_expr< let rec $bi$ in $ce$ >> -> - (((o#add_binding bi)#binding bi)#class_expr ce)#set_env env - | <:class_expr< object ($p$) $cst$ end >> -> - ((o#add_patt p)#class_str_item cst)#set_env env - | ce -> super#class_expr ce ]; - - method class_str_item = - fun - [ <:class_str_item< inherit $override:_$ $_$ >> as cst -> super#class_str_item cst - | <:class_str_item< inherit $override:_$ $ce$ as $s$ >> -> - (o#class_expr ce)#add_atom s - | <:class_str_item< value $override:_$ $mutable:_$ $s$ = $e$ >> -> - (o#expr e)#add_atom s - | <:class_str_item< value virtual $mutable:_$ $s$ : $t$ >> -> - (o#ctyp t)#add_atom s - | cst -> super#class_str_item cst ]; - - method module_expr = fun - [ <:module_expr< struct $st$ end >> -> - (o#str_item st)#set_env env - | me -> super#module_expr me ]; - - end; - - value free_vars env_init e = - let fold = new fold_free_vars S.add ~env_init S.empty in (fold#expr e)#free; -end; diff --git a/camlp4/Camlp4/Struct/FreeVars.mli b/camlp4/Camlp4/Struct/FreeVars.mli deleted file mode 100644 index 06d3cc0a..00000000 --- a/camlp4/Camlp4/Struct/FreeVars.mli +++ /dev/null @@ -1,48 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Make (Ast : Sig.Camlp4Ast) : sig - module S : Set.S with type elt = string; - - value fold_binding_vars : (string -> 'accu -> 'accu) -> Ast.binding -> 'accu -> 'accu; - - class c_fold_pattern_vars ['accu] : [string -> 'accu -> 'accu] -> ['accu] -> - object - inherit Ast.fold; - value acc : 'accu; - method acc : 'accu; - end; - - value fold_pattern_vars : (string -> 'accu -> 'accu) -> Ast.patt -> 'accu -> 'accu; - - class fold_free_vars ['accu] : [string -> 'accu -> 'accu] -> [?env_init:S.t] -> ['accu] -> - object ('self_type) - inherit Ast.fold; - value free : 'accu; - value env : S.t; - method free : 'accu; - method set_env : S.t -> 'self_type; - method add_atom : string -> 'self_type; - method add_patt : Ast.patt -> 'self_type; - method add_binding : Ast.binding -> 'self_type; - end; - - value free_vars : S.t -> Ast.expr -> S.t; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar.mlpack b/camlp4/Camlp4/Struct/Grammar.mlpack deleted file mode 100644 index 46fb34f7..00000000 --- a/camlp4/Camlp4/Struct/Grammar.mlpack +++ /dev/null @@ -1,13 +0,0 @@ -Delete -Dynamic -Entry -Failed -Find -Fold -Insert -Parser -Print -Search -Static -Structure -Tools diff --git a/camlp4/Camlp4/Struct/Grammar/Delete.ml b/camlp4/Camlp4/Struct/Grammar/Delete.ml deleted file mode 100644 index 4273ebeb..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Delete.ml +++ /dev/null @@ -1,187 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -exception Rule_not_found of (string * string); - -let () = - Printexc.register_printer - (fun - [ Rule_not_found (symbols, entry) -> - let msg = Printf.sprintf "rule %S cannot be found in entry\n%s" symbols entry in - Some msg - | _ -> None ]) in () -; - -module Make (Structure : Structure.S) = struct - module Tools = Tools.Make Structure; - module Parser = Parser.Make Structure; - module Print = Print.Make Structure; - open Structure; - -value raise_rule_not_found entry symbols = - let to_string f x = - let buff = Buffer.create 128 in - let ppf = Format.formatter_of_buffer buff in - do { - f ppf x; - Format.pp_print_flush ppf (); - Buffer.contents buff - } in - let entry = to_string Print.entry entry in - let symbols = to_string Print.print_rule symbols in - raise (Rule_not_found (symbols, entry)) -; - -(* Deleting a rule *) - -(* [delete_rule_in_tree] returns - [Some (dsl, t)] if success - [dsl] = - Some (list of deleted nodes) if branch deleted - None if action replaced by previous version of action - [t] = remaining tree - [None] if failure *) - -value delete_rule_in_tree entry = - let rec delete_in_tree symbols tree = - match (symbols, tree) with - [ ([s :: sl], Node n) -> - if Tools.logically_eq_symbols entry s n.node then delete_son sl n - else - match delete_in_tree symbols n.brother with - [ Some (dsl, t) -> - Some (dsl, Node {node = n.node; son = n.son; brother = t}) - | None -> None ] - | ([_ :: _], _) -> None - | ([], Node n) -> - match delete_in_tree [] n.brother with - [ Some (dsl, t) -> - Some (dsl, Node {node = n.node; son = n.son; brother = t}) - | None -> None ] - | ([], DeadEnd) -> None - | ([], LocAct _ []) -> Some (Some [], DeadEnd) - | ([], LocAct _ [action :: list]) -> Some (None, LocAct action list) ] - and delete_son sl n = - match delete_in_tree sl n.son with - [ Some (Some dsl, DeadEnd) -> Some (Some [n.node :: dsl], n.brother) - | Some (Some dsl, t) -> - let t = Node {node = n.node; son = t; brother = n.brother} in - Some (Some [n.node :: dsl], t) - | Some (None, t) -> - let t = Node {node = n.node; son = t; brother = n.brother} in - Some (None, t) - | None -> None ] - in - delete_in_tree -; -value rec decr_keyw_use gram = - fun - [ Skeyword kwd -> removing gram kwd - | Smeta _ sl _ -> List.iter (decr_keyw_use gram) sl - | Slist0 s | Slist1 s | Sopt s | Stry s -> decr_keyw_use gram s - | Slist0sep s1 s2 -> do { decr_keyw_use gram s1; decr_keyw_use gram s2 } - | Slist1sep s1 s2 -> do { decr_keyw_use gram s1; decr_keyw_use gram s2 } - | Stree t -> decr_keyw_use_in_tree gram t - | Sself | Snext | Snterm _ | Snterml _ _ | Stoken _ -> () ] -and decr_keyw_use_in_tree gram = - fun - [ DeadEnd | LocAct _ _ -> () - | Node n -> - do { - decr_keyw_use gram n.node; - decr_keyw_use_in_tree gram n.son; - decr_keyw_use_in_tree gram n.brother - } ] -; -value rec delete_rule_in_suffix entry symbols = - fun - [ [lev :: levs] -> - match delete_rule_in_tree entry symbols lev.lsuffix with - [ Some (dsl, t) -> - do { - match dsl with - [ Some dsl -> List.iter (decr_keyw_use entry.egram) dsl - | None -> () ]; - match t with - [ DeadEnd when lev.lprefix == DeadEnd -> levs - | _ -> - let lev = - {assoc = lev.assoc; lname = lev.lname; lsuffix = t; - lprefix = lev.lprefix} - in - [lev :: levs] ] - } - | None -> - let levs = delete_rule_in_suffix entry symbols levs in - [lev :: levs] ] - | [] -> raise_rule_not_found entry symbols ] -; - -value rec delete_rule_in_prefix entry symbols = - fun - [ [lev :: levs] -> - match delete_rule_in_tree entry symbols lev.lprefix with - [ Some (dsl, t) -> - do { - match dsl with - [ Some dsl -> List.iter (decr_keyw_use entry.egram) dsl - | None -> () ]; - match t with - [ DeadEnd when lev.lsuffix == DeadEnd -> levs - | _ -> - let lev = - {assoc = lev.assoc; lname = lev.lname; - lsuffix = lev.lsuffix; lprefix = t} - in - [lev :: levs] ] - } - | None -> - let levs = delete_rule_in_prefix entry symbols levs in - [lev :: levs] ] - | [] -> raise_rule_not_found entry symbols ] -; - -value rec delete_rule_in_level_list entry symbols levs = - match symbols with - [ [Sself :: symbols] -> delete_rule_in_suffix entry symbols levs - | [Snterm e :: symbols] when e == entry -> - delete_rule_in_suffix entry symbols levs - | _ -> delete_rule_in_prefix entry symbols levs ] -; - - -value delete_rule entry sl = - match entry.edesc with - [ Dlevels levs -> - let levs = delete_rule_in_level_list entry sl levs in - do { - entry.edesc := Dlevels levs; - entry.estart := - fun lev strm -> - let f = Parser.start_parser_of_entry entry in - do { entry.estart := f; f lev strm }; - entry.econtinue := - fun lev bp a strm -> - let f = Parser.continue_parser_of_entry entry in - do { entry.econtinue := f; f lev bp a strm } - } - | Dparser _ -> () ] -; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Dynamic.ml b/camlp4/Camlp4/Struct/Grammar/Dynamic.ml deleted file mode 100644 index 06ac28f1..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Dynamic.ml +++ /dev/null @@ -1,73 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Lexer : Sig.Lexer) -: Sig.Grammar.Dynamic with module Loc = Lexer.Loc - and module Token = Lexer.Token -= struct - module Structure = Structure.Make Lexer; - module Delete = Delete.Make Structure; - module Insert = Insert.Make Structure; - module Entry = Entry.Make Structure; - module Fold = Fold.Make Structure; - module Tools = Tools.Make Structure; - include Structure; - - value mk () = - let gkeywords = Hashtbl.create 301 in - { - gkeywords = gkeywords; - gfilter = Token.Filter.mk (Hashtbl.mem gkeywords); - glexer = Lexer.mk (); - warning_verbose = ref True; (* FIXME *) - error_verbose = Camlp4_config.verbose - }; - - value get_filter g = g.gfilter; - - value lex g loc cs = g.glexer loc cs; - - value lex_string g loc str = lex g loc (Stream.of_string str); - - value filter g ts = Tools.keep_prev_loc (Token.Filter.filter g.gfilter ts); - - value parse_tokens_after_filter entry ts = Entry.parse_tokens_after_filter entry ts; - - value parse_tokens_before_filter entry ts = parse_tokens_after_filter entry (filter entry.egram ts); - - value parse entry loc cs = parse_tokens_before_filter entry (lex entry.egram loc cs); - - value parse_string entry loc str = - parse_tokens_before_filter entry (lex_string entry.egram loc str); - - value delete_rule = Delete.delete_rule; - - value srules e rl = - let t = - List.fold_left - (fun tree (symbols, action) -> Insert.insert_tree e symbols action tree) - DeadEnd rl - in - Stree t; - value sfold0 = Fold.sfold0; - value sfold1 = Fold.sfold1; - value sfold0sep = Fold.sfold0sep; - (* value sfold1sep = Fold.sfold1sep; *) - - value extend = Insert.extend; -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Entry.ml b/camlp4/Camlp4/Struct/Grammar/Entry.ml deleted file mode 100644 index 4ab0c896..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Entry.ml +++ /dev/null @@ -1,92 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) = struct - module Dump = Print.MakeDump Structure; - module Print = Print.Make Structure; - module Tools = Tools.Make Structure; - open Format; - open Structure; - open Tools; - - type t 'a = internal_entry; - - value name e = e.ename; - - value print ppf e = fprintf ppf "%a@\n" Print.entry e; - value dump ppf e = fprintf ppf "%a@\n" Dump.entry e; - - (* value find e s = Find.entry e s; *) - - value mk g n = - { egram = g; - ename = n; - estart = empty_entry n; - econtinue _ _ _ = parser []; - edesc = Dlevels [] }; - - value action_parse entry ts : Action.t = - try entry.estart 0 ts with - [ Stream.Failure -> - Loc.raise (get_prev_loc ts) - (Stream.Error ("illegal begin of " ^ entry.ename)) - | Loc.Exc_located _ _ as exc -> raise exc - | exc -> Loc.raise (get_prev_loc ts) exc ]; - - value lex entry loc cs = entry.egram.glexer loc cs; - - value lex_string entry loc str = lex entry loc (Stream.of_string str); - - value filter entry ts = - keep_prev_loc (Token.Filter.filter (get_filter entry.egram) ts); - - value parse_tokens_after_filter entry ts = Action.get (action_parse entry ts); - - value parse_tokens_before_filter entry ts = parse_tokens_after_filter entry (filter entry ts); - - value parse entry loc cs = parse_tokens_before_filter entry (lex entry loc cs); - - value parse_string entry loc str = - parse_tokens_before_filter entry (lex_string entry loc str); - - value of_parser g n (p : Stream.t (Token.t * token_info) -> 'a) : t 'a = - let f ts = Action.mk (p ts) in - { egram = g; - ename = n; - estart _ = f; - econtinue _ _ _ = parser []; - edesc = Dparser f }; - - value setup_parser e (p : Stream.t (Token.t * token_info) -> 'a) = - let f ts = Action.mk (p ts) in do { - e.estart := fun _ -> f; - e.econtinue := fun _ _ _ -> parser []; - e.edesc := Dparser f - }; - - value clear e = - do { - e.estart := fun _ -> parser []; - e.econtinue := fun _ _ _ -> parser []; - e.edesc := Dlevels [] - }; - - value obj x = x; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Failed.ml b/camlp4/Camlp4/Struct/Grammar/Failed.ml deleted file mode 100644 index a0327b15..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Failed.ml +++ /dev/null @@ -1,132 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) = struct - module Tools = Tools.Make Structure; - module Search = Search.Make Structure; - module Print = Print.Make Structure; - open Structure; - open Format; - -value rec name_of_symbol entry = - fun - [ Snterm e -> "[" ^ e.ename ^ "]" - | Snterml e l -> "[" ^ e.ename ^ " level " ^ l ^ "]" - | Sself | Snext -> "[" ^ entry.ename ^ "]" - | Stoken (_, descr) -> descr - | Skeyword kwd -> "\"" ^ kwd ^ "\"" - | _ -> "???" ] -; - - -value rec name_of_symbol_failed entry = - fun - [ Slist0 s | Slist0sep s _ | - Slist1 s | Slist1sep s _ | - Sopt s | Stry s -> name_of_symbol_failed entry s - | Stree t -> name_of_tree_failed entry t - | s -> name_of_symbol entry s ] -and name_of_tree_failed entry = - fun - [ Node {node = s; brother = bro; son = son} -> - let tokl = - match s with - [ Stoken _ | Skeyword _ -> Tools.get_token_list entry [] s son - | _ -> None ] - in - match tokl with - [ None -> - let txt = name_of_symbol_failed entry s in - let txt = - match (s, son) with - [ (Sopt _, Node _) -> txt ^ " or " ^ name_of_tree_failed entry son - | _ -> txt ] - in - let txt = - match bro with - [ DeadEnd | LocAct _ _ -> txt - | Node _ -> txt ^ " or " ^ name_of_tree_failed entry bro ] - in - txt - | Some (tokl, _, _) -> - List.fold_left - (fun s tok -> - (if s = "" then "" else s ^ " then ") ^ - match tok with - [ Stoken (_, descr) -> descr - | Skeyword kwd -> kwd - | _ -> assert False ]) - "" tokl ] - | DeadEnd | LocAct _ _ -> "???" ] -; -value magic _s x = debug magic "Obj.magic: %s@." _s in Obj.magic x; -value tree_failed entry prev_symb_result prev_symb tree = - let txt = name_of_tree_failed entry tree in - let txt = - match prev_symb with - [ Slist0 s -> - let txt1 = name_of_symbol_failed entry s in - txt1 ^ " or " ^ txt ^ " expected" - | Slist1 s -> - let txt1 = name_of_symbol_failed entry s in - txt1 ^ " or " ^ txt ^ " expected" - | Slist0sep s sep -> - match magic "tree_failed: 'a -> list 'b" prev_symb_result with - [ [] -> - let txt1 = name_of_symbol_failed entry s in - txt1 ^ " or " ^ txt ^ " expected" - | _ -> - let txt1 = name_of_symbol_failed entry sep in - txt1 ^ " or " ^ txt ^ " expected" ] - | Slist1sep s sep -> - match magic "tree_failed: 'a -> list 'b" prev_symb_result with - [ [] -> - let txt1 = name_of_symbol_failed entry s in - txt1 ^ " or " ^ txt ^ " expected" - | _ -> - let txt1 = name_of_symbol_failed entry sep in - txt1 ^ " or " ^ txt ^ " expected" ] - | Stry _(*NP: not sure about this*) | Sopt _ | Stree _ -> txt ^ " expected" - | _ -> txt ^ " expected after " ^ name_of_symbol entry prev_symb ] - in - do { - if entry.egram.error_verbose.val then do { - let tree = Search.tree_in_entry prev_symb tree entry.edesc; - let ppf = err_formatter; - fprintf ppf "@[@,"; - fprintf ppf "----------------------------------@,"; - fprintf ppf "Parse error in entry [%s], rule:@;<0 2>" entry.ename; - fprintf ppf "@["; - Print.print_level ppf pp_force_newline (Print.flatten_tree tree); - fprintf ppf "@]@,"; - fprintf ppf "----------------------------------@,"; - fprintf ppf "@]@." - } - else (); - txt ^ " (in [" ^ entry.ename ^ "])" - } -; -value symb_failed entry prev_symb_result prev_symb symb = - let tree = Node {node = symb; brother = DeadEnd; son = DeadEnd} in - tree_failed entry prev_symb_result prev_symb tree -; - -value symb_failed_txt e s1 s2 = symb_failed e 0 s1 s2; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Find.ml b/camlp4/Camlp4/Struct/Grammar/Find.ml deleted file mode 100644 index 82bd2f0e..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Find.ml +++ /dev/null @@ -1,68 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -(* - value entry e s = - let rec find_levels = - fun - [ [] -> None - | [lev :: levs] -> - match find_tree lev.lsuffix with - [ None -> - match find_tree lev.lprefix with - [ None -> find_levels levs - | x -> x ] - | x -> x ] ] - and symbol = - fun - [ Snterm e -> if e.ename = s then Some e else None - | Snterml e _ -> if e.ename = s then Some e else None - | Smeta _ sl _ -> find_symbol_list sl - | Slist0 s -> find_symbol s - | Slist0sep s _ -> find_symbol s - | Slist1 s -> find_symbol s - | Slist1sep s _ -> find_symbol s - | Sopt s -> find_symbol s - | Stree t -> find_tree t - | Sself | Snext | Stoken _ | Stoken_fun _ -> None ] - and symbol_list = - fun - [ [s :: sl] -> - match find_symbol s with - [ None -> find_symbol_list sl - | x -> x ] - | [] -> None ] - and tree = - fun - [ Node {node = s; brother = bro; son = son} -> - match find_symbol s with - [ None -> - match find_tree bro with - [ None -> find_tree son - | x -> x ] - | x -> x ] - | LocAct _ _ | DeadEnd -> None ] - in - match e.edesc with - [ Dlevels levs -> - match find_levels levs with - [ Some e -> e - | None -> raise Not_found ] - | Dparser _ -> raise Not_found ] - ; -*) diff --git a/camlp4/Camlp4/Struct/Grammar/Fold.ml b/camlp4/Camlp4/Struct/Grammar/Fold.ml deleted file mode 100644 index 99e09550..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Fold.ml +++ /dev/null @@ -1,95 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - - - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Structure : Structure.S) = struct - open Structure; - open Format; - module Parse = Parser.Make Structure; - module Fail = Failed.Make Structure; - open Sig.Grammar; - - (* Prevent from implict usage. *) - module Stream = struct - type t 'a = Stream.t 'a; - exception Failure = Stream.Failure; - exception Error = Stream.Error; - end; - - value sfold0 f e _entry _symbl psymb = - let rec fold accu = - parser - [ [: a = psymb; s :] -> fold (f a accu) s - | [: :] -> accu ] - in - parser [: a = fold e :] -> a - ; - - value sfold1 f e _entry _symbl psymb = - let rec fold accu = - parser - [ [: a = psymb; s :] -> fold (f a accu) s - | [: :] -> accu ] - in - parser [: a = psymb; a = fold (f a e) :] -> a - ; - - value sfold0sep f e entry symbl psymb psep = - let failed = - fun - [ [symb; sep] -> Fail.symb_failed_txt entry sep symb - | _ -> "failed" ] - in - let rec kont accu = - parser - [ [: () = psep; a = psymb ?? failed symbl; s :] -> kont (f a accu) s - | [: :] -> accu ] - in - parser - [ [: a = psymb; s :] -> kont (f a e) s - | [: :] -> e ] - ; - - value sfold1sep f e entry symbl psymb psep = - let failed = - fun - [ [symb; sep] -> Fail.symb_failed_txt entry sep symb - | _ -> "failed" ] - in - let parse_top = - fun - [ [symb; _] -> Parse.parse_top_symb entry symb (* FIXME context *) - | _ -> raise Stream.Failure ] - in - let rec kont accu = - parser - [ [: () = psep; - a = - parser - [ [: a = psymb :] -> a - | [: a = parse_top symbl :] -> Obj.magic a - | [: :] -> raise (Stream.Error (failed symbl)) ]; - s :] -> - kont (f a accu) s - | [: :] -> accu ] - in - parser [: a = psymb; s :] -> kont (f a e) s - ; -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Fold.mli b/camlp4/Camlp4/Struct/Grammar/Fold.mli deleted file mode 100644 index 1578ccbd..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Fold.mli +++ /dev/null @@ -1,30 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - - - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) : sig - open Structure; - - value sfold0 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold1 : ('a -> 'b -> 'b) -> 'b -> fold _ 'a 'b; - value sfold0sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; - (* value sfold1sep : ('a -> 'b -> 'b) -> 'b -> foldsep _ 'a 'b; *) -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Insert.ml b/camlp4/Camlp4/Struct/Grammar/Insert.ml deleted file mode 100644 index 24deb01f..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Insert.ml +++ /dev/null @@ -1,323 +0,0 @@ -(* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) = struct - module Tools = Tools.Make Structure; - module Parser = Parser.Make Structure; - open Structure; - open Format; - open Sig.Grammar; - - value is_before s1 s2 = - match (s1, s2) with - [ (Skeyword _ | Stoken _, Skeyword _ | Stoken _) -> False - | (Skeyword _ | Stoken _, _) -> True - | _ -> False ] - ; - value rec derive_eps = - fun - [ Slist0 _ | Slist0sep _ _ | Sopt _ -> True - | Stry s -> derive_eps s - | Stree t -> tree_derive_eps t - | Slist1 _ | Slist1sep _ _ | Stoken _ | Skeyword _ -> - (* For sure we cannot derive epsilon from these *) - False - | Smeta _ _ _ | Snterm _ | Snterml _ _ | Snext | Sself -> - (* Approximation *) - False ] - and tree_derive_eps = - fun - [ LocAct _ _ -> True - | Node {node = s; brother = bro; son = son} -> - derive_eps s && tree_derive_eps son || tree_derive_eps bro - | DeadEnd -> False ] - ; - - value empty_lev lname assoc = - let assoc = - match assoc with - [ Some a -> a - | None -> LeftA ] - in - {assoc = assoc; lname = lname; lsuffix = DeadEnd; lprefix = DeadEnd} - ; - value change_lev entry lev n lname assoc = - let a = - match assoc with - [ None -> lev.assoc - | Some a -> - do { - if a <> lev.assoc && entry.egram.warning_verbose.val then do { - eprintf " Changing associativity of level \"%s\"\n" n; - flush Pervasives.stderr - } - else (); - a - } ] - in - do { - match lname with - [ Some n -> - if lname <> lev.lname && entry.egram.warning_verbose.val then do { - eprintf " Level label \"%s\" ignored\n" n; flush Pervasives.stderr - } - else () - | None -> () ]; - {assoc = a; lname = lev.lname; lsuffix = lev.lsuffix; - lprefix = lev.lprefix} - } - ; - value change_to_self entry = - fun - [ Snterm e when e == entry -> Sself - | x -> x ] - ; - - - value get_level entry position levs = - match position with - [ Some First -> ([], empty_lev, levs) - | Some Last -> (levs, empty_lev, []) - | Some (Level n) -> - let rec get = - fun - [ [] -> - do { - eprintf "No level labelled \"%s\" in entry \"%s\"\n" n - entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend" - } - | [lev :: levs] -> - if Tools.is_level_labelled n lev then ([], change_lev entry lev n, levs) - else - let (levs1, rlev, levs2) = get levs in - ([lev :: levs1], rlev, levs2) ] - in - get levs - | Some (Before n) -> - let rec get = - fun - [ [] -> - do { - eprintf "No level labelled \"%s\" in entry \"%s\"\n" n - entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend" - } - | [lev :: levs] -> - if Tools.is_level_labelled n lev then ([], empty_lev, [lev :: levs]) - else - let (levs1, rlev, levs2) = get levs in - ([lev :: levs1], rlev, levs2) ] - in - get levs - | Some (After n) -> - let rec get = - fun - [ [] -> - do { - eprintf "No level labelled \"%s\" in entry \"%s\"\n" n - entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend" - } - | [lev :: levs] -> - if Tools.is_level_labelled n lev then ([lev], empty_lev, levs) - else - let (levs1, rlev, levs2) = get levs in - ([lev :: levs1], rlev, levs2) ] - in - get levs - | None -> - match levs with - [ [lev :: levs] -> ([], change_lev entry lev "", levs) - | [] -> ([], empty_lev, []) ] ] - ; - - value rec check_gram entry = - fun - [ Snterm e -> - if e.egram != entry.egram then do { - eprintf "\ - Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" - entry.ename e.ename; - flush Pervasives.stderr; - failwith "Grammar.extend error" - } - else () - | Snterml e _ -> - if e.egram != entry.egram then do { - eprintf "\ - Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" - entry.ename e.ename; - flush Pervasives.stderr; - failwith "Grammar.extend error" - } - else () - | Smeta _ sl _ -> List.iter (check_gram entry) sl - | Slist0sep s t -> do { check_gram entry t; check_gram entry s } - | Slist1sep s t -> do { check_gram entry t; check_gram entry s } - | Slist0 s | Slist1 s | Sopt s | Stry s -> check_gram entry s - | Stree t -> tree_check_gram entry t - | Snext | Sself | Stoken _ | Skeyword _ -> () ] - and tree_check_gram entry = - fun - [ Node {node = n; brother = bro; son = son} -> - do { - check_gram entry n; - tree_check_gram entry bro; - tree_check_gram entry son - } - | LocAct _ _ | DeadEnd -> () ] - ; - value get_initial = - fun - [ [Sself :: symbols] -> (True, symbols) - | symbols -> (False, symbols) ] - ; - - - value insert_tokens gram symbols = - let rec insert = - fun - [ Smeta _ sl _ -> List.iter insert sl - | Slist0 s | Slist1 s | Sopt s | Stry s -> insert s - | Slist0sep s t -> do { insert s; insert t } - | Slist1sep s t -> do { insert s; insert t } - | Stree t -> tinsert t - | Skeyword kwd -> using gram kwd - | Snterm _ | Snterml _ _ | Snext | Sself | Stoken _ -> () ] - and tinsert = - fun - [ Node {node = s; brother = bro; son = son} -> - do { insert s; tinsert bro; tinsert son } - | LocAct _ _ | DeadEnd -> () ] - in - List.iter insert symbols - ; - - value insert_tree entry gsymbols action tree = - let rec insert symbols tree = - match symbols with - [ [s :: sl] -> insert_in_tree s sl tree - | [] -> - match tree with - [ Node {node = s; son = son; brother = bro} -> - Node {node = s; son = son; brother = insert [] bro} - | LocAct old_action action_list -> - let () = - if entry.egram.warning_verbose.val then - eprintf " Grammar extension: in [%s] some rule has been masked@." - entry.ename - else () - in LocAct action [old_action :: action_list] - | DeadEnd -> LocAct action [] ] ] - and insert_in_tree s sl tree = - match try_insert s sl tree with - [ Some t -> t - | None -> Node {node = s; son = insert sl DeadEnd; brother = tree} ] - and try_insert s sl tree = - match tree with - [ Node {node = s1; son = son; brother = bro} -> - if Tools.eq_symbol s s1 then - let t = Node {node = s1; son = insert sl son; brother = bro} in - Some t - else if is_before s1 s || derive_eps s && not (derive_eps s1) then - let bro = - match try_insert s sl bro with - [ Some bro -> bro - | None -> - Node {node = s; son = insert sl DeadEnd; brother = bro} ] - in - let t = Node {node = s1; son = son; brother = bro} in - Some t - else - match try_insert s sl bro with - [ Some bro -> - let t = Node {node = s1; son = son; brother = bro} in - Some t - | None -> None ] - | LocAct _ _ | DeadEnd -> None ] - in - insert gsymbols tree - ; - value insert_level entry e1 symbols action slev = - match e1 with - [ True -> - {assoc = slev.assoc; lname = slev.lname; - lsuffix = insert_tree entry symbols action slev.lsuffix; - lprefix = slev.lprefix} - | False -> - {assoc = slev.assoc; lname = slev.lname; lsuffix = slev.lsuffix; - lprefix = insert_tree entry symbols action slev.lprefix} ] - ; - - value levels_of_rules entry position rules = - let elev = - match entry.edesc with - [ Dlevels elev -> elev - | Dparser _ -> - do { - eprintf "Error: entry not extensible: \"%s\"\n" entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend" - } ] - in - if rules = [] then elev - else - let (levs1, make_lev, levs2) = get_level entry position elev in - let (levs, _) = - List.fold_left - (fun (levs, make_lev) (lname, assoc, level) -> - let lev = make_lev lname assoc in - let lev = - List.fold_left - (fun lev (symbols, action) -> - let symbols = List.map (change_to_self entry) symbols in - do { - List.iter (check_gram entry) symbols; - let (e1, symbols) = get_initial symbols; - insert_tokens entry.egram symbols; - insert_level entry e1 symbols action lev - }) - lev level - in - ([lev :: levs], empty_lev)) - ([], make_lev) rules - in - levs1 @ List.rev levs @ levs2 - ; - - value extend entry (position, rules) = - let elev = levels_of_rules entry position rules in - do { - entry.edesc := Dlevels elev; - entry.estart := - fun lev strm -> - let f = Parser.start_parser_of_entry entry in - do { entry.estart := f; f lev strm }; - entry.econtinue := - fun lev bp a strm -> - let f = Parser.continue_parser_of_entry entry in - do { entry.econtinue := f; f lev bp a strm } - }; - - end; diff --git a/camlp4/Camlp4/Struct/Grammar/Parser.ml b/camlp4/Camlp4/Struct/Grammar/Parser.ml deleted file mode 100644 index 48054e4d..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Parser.ml +++ /dev/null @@ -1,431 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) = struct - module Tools = Tools.Make Structure; - module Failed = Failed.Make Structure; - module Print = Print.Make Structure; - open Structure; - open Sig.Grammar; - - module StreamOrig = Stream; - - value njunk strm n = - for i = 1 to n do Stream.junk strm done; - - value loc_bp = Tools.get_cur_loc; - value loc_ep = Tools.get_prev_loc; - value drop_prev_loc = Tools.drop_prev_loc; - - value add_loc bp parse_fun strm = - let x = parse_fun strm in - let ep = loc_ep strm in - let loc = - if Loc.start_off bp > Loc.stop_off ep then - (* If nothing has been consumed, create a 0-length location. *) - Loc.join bp - else - Loc.merge bp ep - in - (x, loc); - - value stream_peek_nth strm n = - let rec loop i = fun - [ [x :: xs] -> if i = 1 then Some x else loop (i - 1) xs - | [] -> None ] - in - loop n (Stream.npeek n strm); - - (* We don't want Stream's functions to be used implictly. *) - module Stream = struct - type t 'a = StreamOrig.t 'a; - exception Failure = StreamOrig.Failure; - exception Error = StreamOrig.Error; - value peek = StreamOrig.peek; - value junk = StreamOrig.junk; - - value dup strm = - (* This version of peek_nth is off-by-one from Stream.peek_nth *) - let peek_nth n = - loop n (Stream.npeek (n + 1) strm) where rec loop n = - fun - [ [] -> None - | [x] -> if n = 0 then Some x else None - | [_ :: l] -> loop (n - 1) l ] - in - Stream.from peek_nth; - end; - - value try_parser ps strm = - let strm' = Stream.dup strm in - let r = - try ps strm' - with - [ Stream.Error _ | Loc.Exc_located _ (Stream.Error _) -> - raise Stream.Failure - | exc -> raise exc ] - in do { - njunk strm (StreamOrig.count strm'); - r; - }; - - value level_number entry lab = - let rec lookup levn = - fun - [ [] -> failwith ("unknown level " ^ lab) - | [lev :: levs] -> - if Tools.is_level_labelled lab lev then levn else lookup (succ levn) levs ] - in - match entry.edesc with - [ Dlevels elev -> lookup 0 elev - | Dparser _ -> raise Not_found ] - ; - value strict_parsing = ref False; - value strict_parsing_warning = ref False; - - value rec top_symb entry = - fun - [ Sself | Snext -> Snterm entry - | Snterml e _ -> Snterm e - | Slist1sep s sep -> Slist1sep (top_symb entry s) sep - | _ -> raise Stream.Failure ] - ; - - value top_tree entry = - fun - [ Node {node = s; brother = bro; son = son} -> - Node {node = top_symb entry s; brother = bro; son = son} - | LocAct _ _ | DeadEnd -> raise Stream.Failure ] - ; - - value entry_of_symb entry = - fun - [ Sself | Snext -> entry - | Snterm e -> e - | Snterml e _ -> e - | _ -> raise Stream.Failure ] - ; - - value continue entry loc a s son p1 = - parser - [: a = (entry_of_symb entry s).econtinue 0 loc a; - act = p1 ?? Failed.tree_failed entry a s son :] -> - Action.mk (fun _ -> Action.getf act a) - ; - - (* PR#4603, PR#4330, PR#4551: - Here loc_bp replaced get_loc_ep to fix all these bugs. - If you do change it again look at these bugs. *) - value skip_if_empty bp strm = - if loc_bp strm = bp then Action.mk (fun _ -> raise Stream.Failure) - else - raise Stream.Failure - ; - - value do_recover parser_of_tree entry nlevn alevn loc a s son = - parser - [ [: a = parser_of_tree entry nlevn alevn (top_tree entry son) :] -> a - | [: a = skip_if_empty loc :] -> a - | [: a = - continue entry loc a s son - (parser_of_tree entry nlevn alevn son) :] -> - a ] - ; - - - value recover parser_of_tree entry nlevn alevn loc a s son strm = - if strict_parsing.val then raise (Stream.Error (Failed.tree_failed entry a s son)) - else - let _ = - if strict_parsing_warning.val then begin - let msg = Failed.tree_failed entry a s son; - Format.eprintf "Warning: trying to recover from syntax error"; - if entry.ename <> "" then Format.eprintf " in [%s]" entry.ename else (); - Format.eprintf "\n%s%a@." msg Loc.print loc; - end else () in - do_recover parser_of_tree entry nlevn alevn loc a s son strm - ; - - value rec parser_of_tree entry nlevn alevn = - fun - [ DeadEnd -> parser [] - | LocAct act _ -> parser [: :] -> act - | Node {node = Sself; son = LocAct act _; brother = DeadEnd} -> - parser [: a = entry.estart alevn :] -> Action.getf act a - | Node {node = Sself; son = LocAct act _; brother = bro} -> - let p2 = parser_of_tree entry nlevn alevn bro in - parser - [ [: a = entry.estart alevn :] -> Action.getf act a - | [: a = p2 :] -> a ] - | Node {node = s; son = son; brother = DeadEnd} -> - let tokl = - match s with - [ Stoken _ | Skeyword _ -> Tools.get_token_list entry [] s son - | _ -> None ] - in - match tokl with - [ None -> - let ps = parser_of_symbol entry nlevn s in - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = parser_cont p1 entry nlevn alevn s son in - fun strm -> - let bp = loc_bp strm in - match strm with parser - [: a = ps; act = p1 bp a :] -> Action.getf act a - | Some (tokl, last_tok, son) -> - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = parser_cont p1 entry nlevn alevn last_tok son in - parser_of_token_list p1 tokl ] - | Node {node = s; son = son; brother = bro} -> - let tokl = - match s with - [ Stoken _ | Skeyword _ -> Tools.get_token_list entry [] s son - | _ -> None ] - in - match tokl with - [ None -> - let ps = parser_of_symbol entry nlevn s in - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = parser_cont p1 entry nlevn alevn s son in - let p2 = parser_of_tree entry nlevn alevn bro in - fun strm -> - let bp = loc_bp strm in - match strm with parser - [ [: a = ps; act = p1 bp a :] -> Action.getf act a - | [: a = p2 :] -> a ] - | Some (tokl, last_tok, son) -> - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = parser_cont p1 entry nlevn alevn last_tok son in - let p1 = parser_of_token_list p1 tokl in - let p2 = parser_of_tree entry nlevn alevn bro in - parser - [ [: a = p1 :] -> a - | [: a = p2 :] -> a ] ] ] - and parser_cont p1 entry nlevn alevn s son loc a = - parser - [ [: a = p1 :] -> a - | [: a = recover parser_of_tree entry nlevn alevn loc a s son :] -> a - | [: :] -> raise (Stream.Error (Failed.tree_failed entry a s son)) ] - and parser_of_token_list p1 tokl = - loop 1 tokl where rec loop n = - fun - [ [Stoken (tematch, _) :: tokl] -> - match tokl with - [ [] -> - let ps strm = - match stream_peek_nth strm n with - [ Some (tok, _) when tematch tok -> (njunk strm n; Action.mk tok) - | _ -> raise Stream.Failure ] - in - fun strm -> - let bp = loc_bp strm in - match strm with parser - [: a = ps; act = p1 bp a :] -> Action.getf act a - | _ -> - let ps strm = - match stream_peek_nth strm n with - [ Some (tok, _) when tematch tok -> tok - | _ -> raise Stream.Failure ] - in - let p1 = loop (n + 1) tokl in - parser [: tok = ps; s :] -> - let act = p1 s in Action.getf act tok ] - | [Skeyword kwd :: tokl] -> - match tokl with - [ [] -> - let ps strm = - match stream_peek_nth strm n with - [ Some (tok, _) when Token.match_keyword kwd tok -> - (njunk strm n; Action.mk tok) - | _ -> raise Stream.Failure ] - in - fun strm -> - let bp = loc_bp strm in - match strm with parser - [: a = ps; act = p1 bp a :] -> Action.getf act a - | _ -> - let ps strm = - match stream_peek_nth strm n with - [ Some (tok, _) when Token.match_keyword kwd tok -> tok - | _ -> raise Stream.Failure ] - in - let p1 = loop (n + 1) tokl in - parser [: tok = ps; s :] -> - let act = p1 s in Action.getf act tok ] - | _ -> invalid_arg "parser_of_token_list" ] - and parser_of_symbol entry nlevn = - fun - [ Smeta _ symbl act -> - let act = Obj.magic act entry symbl in - let pl = List.map (parser_of_symbol entry nlevn) symbl in - Obj.magic (List.fold_left (fun act p -> Obj.magic act p) act pl) - | Slist0 s -> - let ps = parser_of_symbol entry nlevn s in - let rec loop al = - parser - [ [: a = ps; s :] -> loop [a :: al] s - | [: :] -> al ] - in - parser [: a = loop [] :] -> Action.mk (List.rev a) - | Slist0sep symb sep -> - let ps = parser_of_symbol entry nlevn symb in - let pt = parser_of_symbol entry nlevn sep in - let rec kont al = - parser - [ [: v = pt; a = ps ?? Failed.symb_failed entry v sep symb; - s :] -> - kont [a :: al] s - | [: :] -> al ] - in - parser - [ [: a = ps; s :] -> Action.mk (List.rev (kont [a] s)) - | [: :] -> Action.mk [] ] - | Slist1 s -> - let ps = parser_of_symbol entry nlevn s in - let rec loop al = - parser - [ [: a = ps; s :] -> loop [a :: al] s - | [: :] -> al ] - in - parser [: a = ps; s :] -> Action.mk (List.rev (loop [a] s)) - | Slist1sep symb sep -> - let ps = parser_of_symbol entry nlevn symb in - let pt = parser_of_symbol entry nlevn sep in - let rec kont al = - parser - [ [: v = pt; - a = - parser - [ [: a = ps :] -> a - | [: a = parse_top_symb entry symb :] -> a - | [: :] -> - raise (Stream.Error (Failed.symb_failed entry v sep symb)) ]; - s :] -> - kont [a :: al] s - | [: :] -> al ] - in - parser [: a = ps; s :] -> Action.mk (List.rev (kont [a] s)) - | Sopt s -> - let ps = parser_of_symbol entry nlevn s in - parser - [ [: a = ps :] -> Action.mk (Some a) - | [: :] -> Action.mk None ] - | Stry s -> - let ps = parser_of_symbol entry nlevn s in - try_parser ps - | Stree t -> - let pt = parser_of_tree entry 1 0 t in - fun strm -> - let bp = loc_bp strm in - match strm with parser - [: (act, loc) = add_loc bp pt :] -> - Action.getf act loc - | Snterm e -> parser [: a = e.estart 0 :] -> a - | Snterml e l -> - parser [: a = e.estart (level_number e l) :] -> a - | Sself -> parser [: a = entry.estart 0 :] -> a - | Snext -> parser [: a = entry.estart nlevn :] -> a - | Skeyword kwd -> - parser - [: `(tok, _) when Token.match_keyword kwd tok :] -> - Action.mk tok - | Stoken (f, _) -> - parser - [: `(tok,_) when f tok :] -> Action.mk tok ] - and parse_top_symb entry symb strm = - parser_of_symbol entry 0 (top_symb entry symb) strm; - - value rec start_parser_of_levels entry clevn = - fun - [ [] -> fun _ -> parser [] - | [lev :: levs] -> - let p1 = start_parser_of_levels entry (succ clevn) levs in - match lev.lprefix with - [ DeadEnd -> p1 - | tree -> - let alevn = - match lev.assoc with - [ LeftA | NonA -> succ clevn - | RightA -> clevn ] - in - let p2 = parser_of_tree entry (succ clevn) alevn tree in - match levs with - [ [] -> - fun levn strm -> - let bp = loc_bp strm in - match strm with parser - [: (act, loc) = add_loc bp p2; strm :] -> - let a = Action.getf act loc in - entry.econtinue levn loc a strm - | _ -> - fun levn strm -> - if levn > clevn then p1 levn strm - else - let bp = loc_bp strm in - match strm with parser - [ [: (act, loc) = add_loc bp p2 :] -> - let a = Action.getf act loc in - entry.econtinue levn loc a strm - | [: act = p1 levn :] -> act ] ] ] ] - ; - - value start_parser_of_entry entry = - debug gram "start_parser_of_entry: @[<2>%a@]@." Print.entry entry in - match entry.edesc with - [ Dlevels [] -> Tools.empty_entry entry.ename - | Dlevels elev -> start_parser_of_levels entry 0 elev - | Dparser p -> fun _ -> p ] - ; - value rec continue_parser_of_levels entry clevn = - fun - [ [] -> fun _ _ _ -> parser [] - | [lev :: levs] -> - let p1 = continue_parser_of_levels entry (succ clevn) levs in - match lev.lsuffix with - [ DeadEnd -> p1 - | tree -> - let alevn = - match lev.assoc with - [ LeftA | NonA -> succ clevn - | RightA -> clevn ] - in - let p2 = parser_of_tree entry (succ clevn) alevn tree in - fun levn bp a strm -> - if levn > clevn then p1 levn bp a strm - else - match strm with parser - [ [: act = p1 levn bp a :] -> act - | [: (act, loc) = add_loc bp p2 :] -> - let a = Action.getf2 act a loc in - entry.econtinue levn loc a strm ] ] ] - ; - - value continue_parser_of_entry entry = - debug gram "continue_parser_of_entry: @[<2>%a@]@." Print.entry entry in - match entry.edesc with - [ Dlevels elev -> - let p = continue_parser_of_levels entry 0 elev in - fun levn bp a -> - parser - [ [: a = p levn bp a :] -> a - | [: :] -> a ] - | Dparser _ -> fun _ _ _ -> parser [] ] - ; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Parser.mli b/camlp4/Camlp4/Struct/Grammar/Parser.mli deleted file mode 100644 index 74e0fe07..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Parser.mli +++ /dev/null @@ -1,62 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - - - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) : sig - open Structure; - value add_loc : - Loc.t -> (token_stream -> 'b) -> token_stream -> ('b * Loc.t); - value level_number : internal_entry -> string -> int; - value strict_parsing : ref bool; - value strict_parsing_warning : ref bool; - value top_symb : - internal_entry -> symbol -> symbol; - value top_tree : - internal_entry -> tree -> tree; - value entry_of_symb : - internal_entry -> symbol -> internal_entry; - value continue : - internal_entry -> Loc.t -> Action.t -> symbol -> tree -> efun -> efun; - value do_recover : - (internal_entry -> 'a -> 'b -> tree -> efun) -> internal_entry -> - 'a -> 'b -> Loc.t -> Action.t -> symbol -> tree -> efun; - value recover : - (internal_entry -> 'a -> 'b -> tree -> efun) -> internal_entry -> - 'a -> 'b -> Loc.t -> Action.t -> symbol -> tree -> efun; - value parser_of_tree : - internal_entry -> int -> int -> tree -> efun; - value parser_cont : - efun -> internal_entry -> int -> int -> symbol -> tree -> Loc.t -> Action.t -> efun; - value parser_of_token_list : - (Loc.t -> Action.t -> efun) -> list symbol -> efun; - value parser_of_symbol : - internal_entry -> int -> symbol -> efun; - value parse_top_symb : - internal_entry -> symbol -> efun; - value start_parser_of_levels : - internal_entry -> int -> list level -> int -> efun; - value start_parser_of_entry : - internal_entry -> int -> efun; - value continue_parser_of_levels : - internal_entry -> int -> list level -> int -> Loc.t -> 'a -> efun; - value continue_parser_of_entry : - internal_entry -> int -> Loc.t -> Action.t -> efun; -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Print.ml b/camlp4/Camlp4/Struct/Grammar/Print.ml deleted file mode 100644 index 06e09c21..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Print.ml +++ /dev/null @@ -1,270 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) = struct - open Structure; - open Format; - open Sig.Grammar; - - value rec flatten_tree = - fun - [ DeadEnd -> [] - | LocAct _ _ -> [[]] - | Node {node = n; brother = b; son = s} -> - [ [n :: l] | l <- flatten_tree s ] @ flatten_tree b ]; - - value rec print_symbol ppf = - fun - [ Smeta n sl _ -> print_meta ppf n sl - | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s - | Slist0sep s t -> - fprintf ppf "LIST0 %a SEP %a" print_symbol1 s print_symbol1 t - | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s - | Slist1sep s t -> - fprintf ppf "LIST1 %a SEP %a" print_symbol1 s print_symbol1 t - | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s - | Stry s -> fprintf ppf "TRY %a" print_symbol1 s - | Snterml e l -> fprintf ppf "%s@ LEVEL@ %S" e.ename l - | Snterm _ | Snext | Sself | Stree _ | Stoken _ | Skeyword _ as s -> - print_symbol1 ppf s ] - and print_meta ppf n sl = - loop 0 sl where rec loop i = - fun - [ [] -> () - | [s :: sl] -> - let j = - try String.index_from n i ' ' with [ Not_found -> String.length n ] - in - do { - fprintf ppf "%s %a" (String.sub n i (j - i)) print_symbol1 s; - if sl = [] then () - else do { fprintf ppf " "; loop (min (j + 1) (String.length n)) sl } - } ] - and print_symbol1 ppf = - fun - [ Snterm e -> pp_print_string ppf e.ename - | Sself -> pp_print_string ppf "SELF" - | Snext -> pp_print_string ppf "NEXT" - | Stoken (_, descr) -> pp_print_string ppf descr - | Skeyword s -> fprintf ppf "%S" s - | Stree t -> print_level ppf pp_print_space (flatten_tree t) - | Smeta _ _ _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ | - Slist1sep _ _ | Sopt _ | Stry _ as s -> - fprintf ppf "(%a)" print_symbol s ] - and print_rule ppf symbols = - do { - fprintf ppf "@["; - let _ = - List.fold_left - (fun sep symbol -> - do { - fprintf ppf "%t%a" sep print_symbol symbol; - fun ppf -> fprintf ppf ";@ " - }) - (fun _ -> ()) symbols - in - fprintf ppf "@]" - } - and print_level ppf pp_print_space rules = - do { - fprintf ppf "@[[ "; - let _ = - List.fold_left - (fun sep rule -> - do { - fprintf ppf "%t%a" sep print_rule rule; - fun ppf -> fprintf ppf "%a| " pp_print_space () - }) - (fun _ -> ()) rules - in - fprintf ppf " ]@]" - } - ; - - value levels ppf elev = - let _ = - List.fold_left - (fun sep lev -> - let rules = - [ [Sself :: t] | t <- flatten_tree lev.lsuffix ] @ - flatten_tree lev.lprefix - in - do { - fprintf ppf "%t@[" sep; - match lev.lname with - [ Some n -> fprintf ppf "%S@;<1 2>" n - | None -> () ]; - match lev.assoc with - [ LeftA -> fprintf ppf "LEFTA" - | RightA -> fprintf ppf "RIGHTA" - | NonA -> fprintf ppf "NONA" ]; - fprintf ppf "@]@;<1 2>"; - print_level ppf pp_force_newline rules; - fun ppf -> fprintf ppf "@,| " - }) - (fun _ -> ()) elev - in - (); - - value entry ppf e = - do { - fprintf ppf "@[%s: [ " e.ename; - match e.edesc with - [ Dlevels elev -> levels ppf elev - | Dparser _ -> fprintf ppf "" ]; - fprintf ppf " ]@]" - }; - -end; - -module MakeDump (Structure : Structure.S) = struct - open Structure; - open Format; - open Sig.Grammar; - - type brothers = [ Bro of symbol and list brothers ]; - - value rec print_tree ppf tree = - let rec get_brothers acc = - fun - [ DeadEnd -> List.rev acc - | LocAct _ _ -> List.rev acc - | Node {node = n; brother = b; son = s} -> get_brothers [Bro n (get_brothers [] s) :: acc] b ] - and print_brothers ppf brothers = - if brothers = [] then fprintf ppf "@ []" - else - List.iter (fun [ Bro n xs -> do { - fprintf ppf "@ @[- %a" print_symbol n; - match xs with - [ [] -> () - | [_] -> try print_children ppf (get_children [] xs) - with [ Exit -> fprintf ppf ":%a" print_brothers xs ] - | _ -> fprintf ppf ":%a" print_brothers xs ]; - fprintf ppf "@]"; - }]) brothers - and print_children ppf = List.iter (fprintf ppf ";@ %a" print_symbol) - and get_children acc = - fun - [ [] -> List.rev acc - | [Bro n x] -> get_children [n::acc] x - | _ -> raise Exit ] - in print_brothers ppf (get_brothers [] tree) - and print_symbol ppf = - fun - [ Smeta n sl _ -> print_meta ppf n sl - | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s - | Slist0sep s t -> - fprintf ppf "LIST0 %a SEP %a" print_symbol1 s print_symbol1 t - | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s - | Slist1sep s t -> - fprintf ppf "LIST1 %a SEP %a" print_symbol1 s print_symbol1 t - | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s - | Stry s -> fprintf ppf "TRY %a" print_symbol1 s - | Snterml e l -> fprintf ppf "%s@ LEVEL@ %S" e.ename l - | Snterm _ | Snext | Sself | Stree _ | Stoken _ | Skeyword _ as s -> - print_symbol1 ppf s ] - and print_meta ppf n sl = - loop 0 sl where rec loop i = - fun - [ [] -> () - | [s :: sl] -> - let j = - try String.index_from n i ' ' with [ Not_found -> String.length n ] - in - do { - fprintf ppf "%s %a" (String.sub n i (j - i)) print_symbol1 s; - if sl = [] then () - else do { fprintf ppf " "; loop (min (j + 1) (String.length n)) sl } - } ] - and print_symbol1 ppf = - fun - [ Snterm e -> pp_print_string ppf e.ename - | Sself -> pp_print_string ppf "SELF" - | Snext -> pp_print_string ppf "NEXT" - | Stoken (_, descr) -> pp_print_string ppf descr - | Skeyword s -> fprintf ppf "%S" s - | Stree t -> print_tree ppf t - | Smeta _ _ _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ | - Slist1sep _ _ | Sopt _ | Stry _ as s -> - fprintf ppf "(%a)" print_symbol s ] - and print_rule ppf symbols = - do { - fprintf ppf "@["; - let _ = - List.fold_left - (fun sep symbol -> - do { - fprintf ppf "%t%a" sep print_symbol symbol; - fun ppf -> fprintf ppf ";@ " - }) - (fun _ -> ()) symbols - in - fprintf ppf "@]" - } - and print_level ppf pp_print_space rules = - do { - fprintf ppf "@[[ "; - let _ = - List.fold_left - (fun sep rule -> - do { - fprintf ppf "%t%a" sep print_rule rule; - fun ppf -> fprintf ppf "%a| " pp_print_space () - }) - (fun _ -> ()) rules - in - fprintf ppf " ]@]" - } - ; - - value levels ppf elev = - let _ = - List.fold_left - (fun sep lev -> - do { - fprintf ppf "%t@[" sep; - match lev.lname with - [ Some n -> fprintf ppf "%S@;<1 2>" n - | None -> () ]; - match lev.assoc with - [ LeftA -> fprintf ppf "LEFTA" - | RightA -> fprintf ppf "RIGHTA" - | NonA -> fprintf ppf "NONA" ]; - fprintf ppf "@]@;<1 2>"; - fprintf ppf "@[suffix:@ "; - print_tree ppf lev.lsuffix; - fprintf ppf "@]@ @[prefix:@ "; - print_tree ppf lev.lprefix; - fprintf ppf "@]"; - fun ppf -> fprintf ppf "@,| " - }) - (fun _ -> ()) elev - in - (); - - value entry ppf e = - do { - fprintf ppf "@[%s: [ " e.ename; - match e.edesc with - [ Dlevels elev -> levels ppf elev - | Dparser _ -> fprintf ppf "" ]; - fprintf ppf " ]@]" - }; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Print.mli b/camlp4/Camlp4/Struct/Grammar/Print.mli deleted file mode 100644 index b1059a6d..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Print.mli +++ /dev/null @@ -1,47 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Structure : Structure.S) : sig - value flatten_tree : Structure.tree -> list (list Structure.symbol); - value print_symbol : Format.formatter -> Structure.symbol -> unit; - value print_meta : - Format.formatter -> string -> list Structure.symbol -> unit; - value print_symbol1 : Format.formatter -> Structure.symbol -> unit; - value print_rule : Format.formatter -> list Structure.symbol -> unit; - value print_level : - Format.formatter -> - (Format.formatter -> unit -> unit) -> - list (list Structure.symbol) -> unit; - value levels : Format.formatter -> list Structure.level -> unit; - value entry : Format.formatter -> Structure.internal_entry -> unit; -end; - -module MakeDump (Structure : Structure.S) : sig - value print_symbol : Format.formatter -> Structure.symbol -> unit; - value print_meta : - Format.formatter -> string -> list Structure.symbol -> unit; - value print_symbol1 : Format.formatter -> Structure.symbol -> unit; - value print_rule : Format.formatter -> list Structure.symbol -> unit; - value print_level : - Format.formatter -> - (Format.formatter -> unit -> unit) -> - list (list Structure.symbol) -> unit; - value levels : Format.formatter -> list Structure.level -> unit; - value entry : Format.formatter -> Structure.internal_entry -> unit; -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Search.ml b/camlp4/Camlp4/Struct/Grammar/Search.ml deleted file mode 100644 index 226a0d44..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Search.ml +++ /dev/null @@ -1,95 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Structure : Structure.S) = struct - open Structure; -value tree_in_entry prev_symb tree = - fun - [ Dlevels levels -> - let rec search_levels = - fun - [ [] -> tree - | [level :: levels] -> - match search_level level with - [ Some tree -> tree - | None -> search_levels levels ] ] - and search_level level = - match search_tree level.lsuffix with - [ Some t -> Some (Node {node = Sself; son = t; brother = DeadEnd}) - | None -> search_tree level.lprefix ] - and search_tree t = - if tree <> DeadEnd && t == tree then Some t - else - match t with - [ Node n -> - match search_symbol n.node with - [ Some symb -> - Some (Node {node = symb; son = n.son; brother = DeadEnd}) - | None -> - match search_tree n.son with - [ Some t -> - Some (Node {node = n.node; son = t; brother = DeadEnd}) - | None -> search_tree n.brother ] ] - | LocAct _ _ | DeadEnd -> None ] - and search_symbol symb = - match symb with - [ Snterm _ | Snterml _ _ | Slist0 _ | Slist0sep _ _ | Slist1 _ | - Slist1sep _ _ | Sopt _ | Stry _ | Stoken _ | Stree _ | Skeyword _ - when symb == prev_symb -> - Some symb - | Slist0 symb -> - match search_symbol symb with - [ Some symb -> Some (Slist0 symb) - | None -> None ] - | Slist0sep symb sep -> - match search_symbol symb with - [ Some symb -> Some (Slist0sep symb sep) - | None -> - match search_symbol sep with - [ Some sep -> Some (Slist0sep symb sep) - | None -> None ] ] - | Slist1 symb -> - match search_symbol symb with - [ Some symb -> Some (Slist1 symb) - | None -> None ] - | Slist1sep symb sep -> - match search_symbol symb with - [ Some symb -> Some (Slist1sep symb sep) - | None -> - match search_symbol sep with - [ Some sep -> Some (Slist1sep symb sep) - | None -> None ] ] - | Sopt symb -> - match search_symbol symb with - [ Some symb -> Some (Sopt symb) - | None -> None ] - | Stry symb -> - match search_symbol symb with - [ Some symb -> Some (Stry symb) - | None -> None ] - | Stree t -> - match search_tree t with - [ Some t -> Some (Stree t) - | None -> None ] - | _ -> None ] - in - search_levels levels - | Dparser _ -> tree ] -; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Static.ml b/camlp4/Camlp4/Struct/Grammar/Static.ml deleted file mode 100644 index 02aec0b1..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Static.ml +++ /dev/null @@ -1,84 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring -*) - -value uncurry f (x,y) = f x y; -value flip f x y = f y x; - -module Make (Lexer : Sig.Lexer) -: Sig.Grammar.Static with module Loc = Lexer.Loc - and module Token = Lexer.Token -= struct - module Structure = Structure.Make Lexer; - module Delete = Delete.Make Structure; - module Insert = Insert.Make Structure; - module Fold = Fold.Make Structure; - module Tools = Tools.Make Structure; - include Structure; - - value gram = - let gkeywords = Hashtbl.create 301 in - { - gkeywords = gkeywords; - gfilter = Token.Filter.mk (Hashtbl.mem gkeywords); - glexer = Lexer.mk (); - warning_verbose = ref True; (* FIXME *) - error_verbose = Camlp4_config.verbose - }; - - module Entry = struct - module E = Entry.Make Structure; - type t 'a = E.t 'a; - value mk = E.mk gram; - value of_parser name strm = E.of_parser gram name strm; - value setup_parser = E.setup_parser; - value name = E.name; - value print = E.print; - value clear = E.clear; - value dump = E.dump; - value obj x = x; - end; - - value get_filter () = gram.gfilter; - - value lex loc cs = gram.glexer loc cs; - - value lex_string loc str = lex loc (Stream.of_string str); - - value filter ts = Tools.keep_prev_loc (Token.Filter.filter gram.gfilter ts); - - value parse_tokens_after_filter entry ts = Entry.E.parse_tokens_after_filter entry ts; - - value parse_tokens_before_filter entry ts = parse_tokens_after_filter entry (filter ts); - - value parse entry loc cs = parse_tokens_before_filter entry (lex loc cs); - - value parse_string entry loc str = parse_tokens_before_filter entry (lex_string loc str); - - value delete_rule = Delete.delete_rule; - - value srules e rl = - Stree (List.fold_left (flip (uncurry (Insert.insert_tree e))) DeadEnd rl); - value sfold0 = Fold.sfold0; - value sfold1 = Fold.sfold1; - value sfold0sep = Fold.sfold0sep; - (* value sfold1sep = Fold.sfold1sep; *) - - value extend = Insert.extend; - -end; diff --git a/camlp4/Camlp4/Struct/Grammar/Structure.ml b/camlp4/Camlp4/Struct/Grammar/Structure.ml deleted file mode 100644 index e2a79b18..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Structure.ml +++ /dev/null @@ -1,294 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -open Sig.Grammar; - -module type S = sig - module Loc : Sig.Loc; - module Token : Sig.Token with module Loc = Loc; - module Lexer : Sig.Lexer - with module Loc = Loc - and module Token = Token; - module Action : Sig.Grammar.Action; - - type gram = - { gfilter : Token.Filter.t; - gkeywords : Hashtbl.t string (ref int); - glexer : Loc.t -> Stream.t char -> Stream.t (Token.t * Loc.t); - warning_verbose : ref bool; - error_verbose : ref bool }; - - type token_info = { prev_loc : Loc.t - ; cur_loc : Loc.t - ; prev_loc_only : bool - }; - - type token_stream = Stream.t (Token.t * token_info); - - type efun = token_stream -> Action.t; - - type token_pattern = ((Token.t -> bool) * string); - - type internal_entry = - { egram : gram; - ename : string; - estart : mutable int -> efun; - econtinue : mutable int -> Loc.t -> Action.t -> efun; - edesc : mutable desc } - and desc = - [ Dlevels of list level - | Dparser of token_stream -> Action.t ] - and level = - { assoc : assoc ; - lname : option string ; - lsuffix : tree ; - lprefix : tree } - and symbol = - [ Smeta of string and list symbol and Action.t - | Snterm of internal_entry - | Snterml of internal_entry and string - | Slist0 of symbol - | Slist0sep of symbol and symbol - | Slist1 of symbol - | Slist1sep of symbol and symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree ] - and tree = - [ Node of node - | LocAct of Action.t and list Action.t - | DeadEnd ] - and node = - { node : symbol ; - son : tree ; - brother : tree }; - - type production_rule = (list symbol * Action.t); - type single_extend_statment = - (option string * option assoc * list production_rule); - type extend_statment = - (option position * list single_extend_statment); - type delete_statment = list symbol; - - type fold 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> Stream.t 'a -> 'c; - - type foldsep 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> (Stream.t 'a -> unit) -> Stream.t 'a -> 'c; - - (* Accessors *) - value get_filter : gram -> Token.Filter.t; - - (* Useful functions *) - value using : gram -> string -> unit; - value removing : gram -> string -> unit; -end; - -module Make (Lexer : Sig.Lexer) = struct - module Loc = Lexer.Loc; - module Token = Lexer.Token; - module Action : Sig.Grammar.Action = struct - type t = Obj.t ; - value mk = Obj.repr; - value get = Obj.obj ; - value getf = Obj.obj ; - value getf2 = Obj.obj ; - end; - module Lexer = Lexer; - - type gram = - { gfilter : Token.Filter.t; - gkeywords : Hashtbl.t string (ref int); - glexer : Loc.t -> Stream.t char -> Stream.t (Token.t * Loc.t); - warning_verbose : ref bool; - error_verbose : ref bool }; - - type token_info = { prev_loc : Loc.t - ; cur_loc : Loc.t - ; prev_loc_only : bool - }; - - type token_stream = Stream.t (Token.t * token_info); - - type efun = token_stream -> Action.t; - - type token_pattern = ((Token.t -> bool) * string); - - type internal_entry = - { egram : gram; - ename : string; - estart : mutable int -> efun; - econtinue : mutable int -> Loc.t -> Action.t -> efun; - edesc : mutable desc } - and desc = - [ Dlevels of list level - | Dparser of token_stream -> Action.t ] - and level = - { assoc : assoc ; - lname : option string ; - lsuffix : tree ; - lprefix : tree } - and symbol = - [ Smeta of string and list symbol and Action.t - | Snterm of internal_entry - | Snterml of internal_entry and string - | Slist0 of symbol - | Slist0sep of symbol and symbol - | Slist1 of symbol - | Slist1sep of symbol and symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree ] - and tree = - [ Node of node - | LocAct of Action.t and list Action.t - | DeadEnd ] - and node = - { node : symbol ; - son : tree ; - brother : tree }; - - type production_rule = (list symbol * Action.t); - type single_extend_statment = - (option string * option assoc * list production_rule); - type extend_statment = - (option position * list single_extend_statment); - type delete_statment = list symbol; - - type fold 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> Stream.t 'a -> 'c; - - type foldsep 'a 'b 'c = - internal_entry -> list symbol -> - (Stream.t 'a -> 'b) -> (Stream.t 'a -> unit) -> Stream.t 'a -> 'c; - - value get_filter g = g.gfilter; - value token_location r = r.cur_loc; - - type not_filtered 'a = 'a; - value using { gkeywords = table; gfilter = filter } kwd = - let r = try Hashtbl.find table kwd with - [ Not_found -> - let r = ref 0 in do { Hashtbl.add table kwd r; r } ] - in do { Token.Filter.keyword_added filter kwd (r.val = 0); - incr r }; - - value removing { gkeywords = table; gfilter = filter } kwd = - let r = Hashtbl.find table kwd in - let () = decr r in - if r.val = 0 then do { - Token.Filter.keyword_removed filter kwd; - Hashtbl.remove table kwd - } else (); -end; - -(* -value iter_entry f e = - let treated = ref [] in - let rec do_entry e = - if List.memq e treated.val then () - else do { - treated.val := [e :: treated.val]; - f e; - match e.edesc with - [ Dlevels ll -> List.iter do_level ll - | Dparser _ -> () ] - } - and do_level lev = do { do_tree lev.lsuffix; do_tree lev.lprefix } - and do_tree = - fun - [ Node n -> do_node n - | LocAct _ _ | DeadEnd -> () ] - and do_node n = do { do_symbol n.node; do_tree n.son; do_tree n.brother } - and do_symbol = - fun - [ Smeta _ sl _ -> List.iter do_symbol sl - | Snterm e | Snterml e _ -> do_entry e - | Slist0 s | Slist1 s | Sopt s | Stry s -> do_symbol s - | Slist0sep s1 s2 | Slist1sep s1 s2 -> do { do_symbol s1; do_symbol s2 } - | Stree t -> do_tree t - | Sself | Snext | Stoken _ | Stoken_fun _ -> () ] - in - do_entry e -; - -value fold_entry f e init = - let treated = ref [] in - let rec do_entry accu e = - if List.memq e treated.val then accu - else do { - treated.val := [e :: treated.val]; - let accu = f e accu in - match e.edesc with - [ Dlevels ll -> List.fold_left do_level accu ll - | Dparser _ -> accu ] - } - and do_level accu lev = - let accu = do_tree accu lev.lsuffix in - do_tree accu lev.lprefix - and do_tree accu = - fun - [ Node n -> do_node accu n - | LocAct _ _ | DeadEnd -> accu ] - and do_node accu n = - let accu = do_symbol accu n.node in - let accu = do_tree accu n.son in - do_tree accu n.brother - and do_symbol accu = - fun - [ Smeta _ sl _ -> List.fold_left do_symbol accu sl - | Snterm e | Snterml e _ -> do_entry accu e - | Slist0 s | Slist1 s | Sopt s | Stry s -> do_symbol accu s - | Slist0sep s1 s2 | Slist1sep s1 s2 -> - let accu = do_symbol accu s1 in - do_symbol accu s2 - | Stree t -> do_tree accu t - | Sself | Snext | Stoken _ | Stoken_fun _ -> accu ] - in - do_entry init e -; - -value is_level_labelled n lev = - match lev.lname with - [ Some n1 -> n = n1 - | None -> False ] -; - -value tokens g con = - let list = ref [] in - do { - Hashtbl.iter - (fun (p_con, p_prm) c -> - if p_con = con then list.val := [(p_prm, c.val) :: list.val] else ()) - g.gtokens; - list.val - } -; -*) diff --git a/camlp4/Camlp4/Struct/Grammar/Tools.ml b/camlp4/Camlp4/Struct/Grammar/Tools.ml deleted file mode 100644 index df4b03fe..00000000 --- a/camlp4/Camlp4/Struct/Grammar/Tools.ml +++ /dev/null @@ -1,132 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -(* PR#5090: don't do lookahead on get_prev_loc. *) -value get_prev_loc_only = ref False; - -module Make (Structure : Structure.S) = struct - open Structure; - - value empty_entry ename _ = - raise (Stream.Error ("entry [" ^ ename ^ "] is empty")); - - value rec stream_map f = parser - [ [: ` x; strm :] -> [: ` (f x); stream_map f strm :] - | [: :] -> [: :] ]; - - value keep_prev_loc strm = - match Stream.peek strm with - [ None -> [: :] - | Some (tok0,init_loc) -> - let rec go prev_loc strm1 = - if get_prev_loc_only.val then - [: `(tok0, {prev_loc; cur_loc = prev_loc; prev_loc_only = True}); - go prev_loc strm1 :] - else - match strm1 with parser - [ [: `(tok,cur_loc); strm :] -> - [: `(tok, {prev_loc; cur_loc; prev_loc_only = False}); - go cur_loc strm :] - | [: :] -> [: :] ] - in go init_loc strm ]; - - value drop_prev_loc strm = stream_map (fun (tok,r) -> (tok,r.cur_loc)) strm; - - value get_cur_loc strm = - match Stream.peek strm with - [ Some (_,r) -> r.cur_loc - | None -> Loc.ghost ]; - - value get_prev_loc strm = - begin - get_prev_loc_only.val := True; - let result = match Stream.peek strm with - [ Some (_, {prev_loc; prev_loc_only = True}) -> - begin Stream.junk strm; prev_loc end - | Some (_, {prev_loc; prev_loc_only = False}) -> prev_loc - | None -> Loc.ghost ]; - get_prev_loc_only.val := False; - result - end; - - value is_level_labelled n lev = - match lev.lname with - [ Some n1 -> n = n1 - | None -> False ]; - - value warning_verbose = ref True; - - value rec get_token_list entry tokl last_tok tree = - match tree with - [ Node {node = (Stoken _ | Skeyword _ as tok); son = son; brother = DeadEnd} -> - get_token_list entry [last_tok :: tokl] tok son - | _ -> - if tokl = [] then None - else Some (List.rev [last_tok :: tokl], last_tok, tree) ]; - - value is_antiquot s = - let len = String.length s in - len > 1 && s.[0] = '$'; - - value eq_Stoken_ids s1 s2 = - not (is_antiquot s1) && not (is_antiquot s2) && s1 = s2; - - value logically_eq_symbols entry = - let rec eq_symbols s1 s2 = - match (s1, s2) with - [ (Snterm e1, Snterm e2) -> e1.ename = e2.ename - | (Snterm e1, Sself) -> e1.ename = entry.ename - | (Sself, Snterm e2) -> entry.ename = e2.ename - | (Snterml e1 l1, Snterml e2 l2) -> e1.ename = e2.ename && l1 = l2 - | (Slist0 s1, Slist0 s2) | - (Slist1 s1, Slist1 s2) | - (Sopt s1, Sopt s2) | - (Stry s1, Stry s2) -> eq_symbols s1 s2 - | (Slist0sep s1 sep1, Slist0sep s2 sep2) | - (Slist1sep s1 sep1, Slist1sep s2 sep2) -> - eq_symbols s1 s2 && eq_symbols sep1 sep2 - | (Stree t1, Stree t2) -> eq_trees t1 t2 - | (Stoken (_, s1), Stoken (_, s2)) -> eq_Stoken_ids s1 s2 - | _ -> s1 = s2 ] - and eq_trees t1 t2 = - match (t1, t2) with - [ (Node n1, Node n2) -> - eq_symbols n1.node n2.node && eq_trees n1.son n2.son && - eq_trees n1.brother n2.brother - | (LocAct _ _ | DeadEnd, LocAct _ _ | DeadEnd) -> True - | _ -> False ] - in - eq_symbols; - - value rec eq_symbol s1 s2 = - match (s1, s2) with - [ (Snterm e1, Snterm e2) -> e1 == e2 - | (Snterml e1 l1, Snterml e2 l2) -> e1 == e2 && l1 = l2 - | (Slist0 s1, Slist0 s2) | - (Slist1 s1, Slist1 s2) | - (Sopt s1, Sopt s2) | - (Stry s1, Stry s2) -> eq_symbol s1 s2 - | (Slist0sep s1 sep1, Slist0sep s2 sep2) | - (Slist1sep s1 sep1, Slist1sep s2 sep2) -> - eq_symbol s1 s2 && eq_symbol sep1 sep2 - | (Stree _, Stree _) -> False - | (Stoken (_, s1), Stoken (_, s2)) -> eq_Stoken_ids s1 s2 - | _ -> s1 = s2 ] - ; -end; diff --git a/camlp4/Camlp4/Struct/Lexer.mll b/camlp4/Camlp4/Struct/Lexer.mll deleted file mode 100644 index 6d5099a8..00000000 --- a/camlp4/Camlp4/Struct/Lexer.mll +++ /dev/null @@ -1,495 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -(* The lexer definition *) - - -{ - -(** A lexical analyzer. *) - -(* FIXME interface module Make (Token : Token) |+ Note that this Token sig is not in Sig +| *) -(* : Sig.Lexer. S with module Loc = Token.Loc and module Token = Token; *) - -(* type context = -{ loc : Loc.t ; - in_comment : bool ; - |+* FIXME When True, all lexers built by [Plexer.make ()] do not lex the - quotation syntax any more. Default is False (quotations are - lexed). +| - quotations : bool }; - -value default_context : context; - -value mk : Loc.t -> Stream.t char -> Stream.t (Token.t * Loc.t); - -value mk' : context -> Stream.t char -> Stream.t (Token.t * Loc.t); *) -(* FIXME Beware the context argument must be given like that: - * mk' { (default_context) with ... = ... } strm - *) - -module TokenEval = Token.Eval -module Make (Token : Sig.Camlp4Token) -= struct - module Loc = Token.Loc - module Token = Token - - open Lexing - open Sig - - (* Error report *) - module Error = struct - - type t = - | Illegal_character of char - | Illegal_escape of string - | Unterminated_comment - | Unterminated_string - | Unterminated_quotation - | Unterminated_antiquot - | Unterminated_string_in_comment - | Comment_start - | Comment_not_end - | Literal_overflow of string - - exception E of t - - open Format - - let print ppf = - function - | Illegal_character c -> - fprintf ppf "Illegal character (%s)" (Char.escaped c) - | Illegal_escape s -> - fprintf ppf "Illegal backslash escape in string or character (%s)" s - | Unterminated_comment -> - fprintf ppf "Comment not terminated" - | Unterminated_string -> - fprintf ppf "String literal not terminated" - | Unterminated_string_in_comment -> - fprintf ppf "This comment contains an unterminated string literal" - | Unterminated_quotation -> - fprintf ppf "Quotation not terminated" - | Unterminated_antiquot -> - fprintf ppf "Antiquotation not terminated" - | Literal_overflow ty -> - fprintf ppf "Integer literal exceeds the range of representable integers of type %s" ty - | Comment_start -> - fprintf ppf "this is the start of a comment" - | Comment_not_end -> - fprintf ppf "this is not the end of a comment" - - let to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b - end;; - - let module M = ErrorHandler.Register(Error) in () - - open Error - - (* To store some context information: - * loc : position of the beginning of a string, quotation and comment - * in_comment: are we in a comment? - * quotations: shall we lex quotation? - * If quotations is false it's a SYMBOL token. - * antiquots : shall we lex antiquotations. - *) - - type context = - { loc : Loc.t ; - in_comment : bool ; - quotations : bool ; - antiquots : bool ; - lexbuf : lexbuf ; - buffer : Buffer.t } - - let default_context lb = - { loc = Loc.ghost ; - in_comment = false ; - quotations = true ; - antiquots = false ; - lexbuf = lb ; - buffer = Buffer.create 256 } - - (* To buffer string literals, quotations and antiquotations *) - - let store c = Buffer.add_string c.buffer (Lexing.lexeme c.lexbuf) - let istore_char c i = Buffer.add_char c.buffer (Lexing.lexeme_char c.lexbuf i) - let buff_contents c = - let contents = Buffer.contents c.buffer in - Buffer.reset c.buffer; contents - - let loc c = Loc.merge c.loc (Loc.of_lexbuf c.lexbuf) - let quotations c = c.quotations - let antiquots c = c.antiquots - 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 p = c.lexbuf.lex_start_p in - c.lexbuf.lex_start_p <- { (p) with pos_cnum = p.pos_cnum + shift } - - let update_loc c = { (c) with loc = Loc.of_lexbuf c.lexbuf } - let with_curr_loc f c = f (update_loc c) c.lexbuf - let parse_nested f c = - with_curr_loc f c; - set_start_p c; - buff_contents c - let shift n c = { (c) with loc = Loc.move `both n c.loc } - let store_parse f c = store c ; f c c.lexbuf - let parse f c = f c c.lexbuf - let mk_quotation quotation c name loc shift = - let s = parse_nested quotation (update_loc c) in - let contents = String.sub s 0 (String.length s - 2) in - QUOTATION { q_name = name ; - q_loc = loc ; - q_shift = shift ; - q_contents = contents } - - - (* Update the current location with file name and line number. *) - - let update_loc c file line absolute chars = - let lexbuf = c.lexbuf in - let pos = lexbuf.lex_curr_p in - let new_file = match file with - | None -> pos.pos_fname - | Some s -> s - in - lexbuf.lex_curr_p <- { pos with - pos_fname = new_file; - pos_lnum = if absolute then line else pos.pos_lnum + line; - pos_bol = pos.pos_cnum - chars; - } - - (* To convert integer literals, copied from "../parsing/lexer.mll" *) - - let cvt_int_literal s = - - int_of_string ("-" ^ s) - let cvt_int32_literal s = - Int32.neg (Int32.of_string ("-" ^ s)) - let cvt_int64_literal s = - Int64.neg (Int64.of_string ("-" ^ s)) - let cvt_nativeint_literal s = - Nativeint.neg (Nativeint.of_string ("-" ^ s)) - - - let err error loc = - raise(Loc.Exc_located(loc, Error.E error)) - - let warn error loc = - Format.eprintf "Warning: %a: %a@." Loc.print loc Error.print error - - } - - let newline = ('\010' | '\013' | "\013\010") - let blank = [' ' '\009' '\012'] - let lowercase = ['a'-'z' '\223'-'\246' '\248'-'\255' '_'] - let uppercase = ['A'-'Z' '\192'-'\214' '\216'-'\222'] - let identchar = - ['A'-'Z' 'a'-'z' '_' '\192'-'\214' '\216'-'\246' '\248'-'\255' '\'' '0'-'9'] - let ident = (lowercase|uppercase) identchar* - let locname = ident - let not_star_symbolchar = - ['$' '!' '%' '&' '+' '-' '.' '/' ':' '<' '=' '>' '?' '@' '^' '|' '~' '\\'] - let symbolchar = '*' | not_star_symbolchar - let quotchar = - ['!' '%' '&' '+' '-' '.' '/' ':' '=' '?' '@' '^' '|' '~' '\\' '*'] - let hexa_char = ['0'-'9' 'A'-'F' 'a'-'f'] - let decimal_literal = - ['0'-'9'] ['0'-'9' '_']* - let hex_literal = - '0' ['x' 'X'] hexa_char ['0'-'9' 'A'-'F' 'a'-'f' '_']* - let oct_literal = - '0' ['o' 'O'] ['0'-'7'] ['0'-'7' '_']* - let bin_literal = - '0' ['b' 'B'] ['0'-'1'] ['0'-'1' '_']* - let int_literal = - decimal_literal | hex_literal | oct_literal | bin_literal - let float_literal = - ['0'-'9'] ['0'-'9' '_']* - ('.' ['0'-'9' '_']* )? - (['e' 'E'] ['+' '-']? ['0'-'9'] ['0'-'9' '_']*)? - - (* Delimitors are extended (from 3.09) in a conservative way *) - - (* These chars that can't start an expression or a pattern: *) - let safe_delimchars = ['%' '&' '/' '@' '^'] - - (* These symbols are unsafe since "[<", "[|", etc. exsist. *) - let delimchars = safe_delimchars | ['|' '<' '>' ':' '=' '.'] - - let left_delims = ['(' '[' '{'] - let right_delims = [')' ']' '}'] - - let left_delimitor = - (* At least a safe_delimchars *) - left_delims delimchars* safe_delimchars (delimchars|left_delims)* - - (* A '(' or a new super '(' without "(<" *) - | '(' (['|' ':'] delimchars*)? - (* Old brackets, no new brackets starting with "[|" or "[:" *) - | '[' ['|' ':']? - (* Old "[<","{<" and new ones *) - | ['[' '{'] delimchars* '<' - (* Old brace and new ones *) - | '{' (['|' ':'] delimchars*)? - - let right_delimitor = - (* At least a safe_delimchars *) - (delimchars|right_delims)* safe_delimchars (delimchars|right_delims)* right_delims - (* A ')' or a new super ')' without ">)" *) - | (delimchars* ['|' ':'])? ')' - (* Old brackets, no new brackets ending with "|]" or ":]" *) - | ['|' ':']? ']' - (* Old ">]",">}" and new ones *) - | '>' delimchars* [']' '}'] - (* Old brace and new ones *) - | (delimchars* ['|' ':'])? '}' - - - rule token c = parse - | newline { update_loc c None 1 false 0; NEWLINE } - | blank + as x { BLANKS x } - | "~" (lowercase identchar * as x) ':' { LABEL x } - | "?" (lowercase identchar * as x) ':' { OPTLABEL x } - | lowercase identchar * as x { LIDENT x } - | uppercase identchar * as x { UIDENT x } - | int_literal as i - { try INT(cvt_int_literal i, i) - with Failure _ -> err (Literal_overflow "int") (Loc.of_lexbuf lexbuf) } - | float_literal as f - { try FLOAT(float_of_string f, f) - with Failure _ -> err (Literal_overflow "float") (Loc.of_lexbuf lexbuf) } - | (int_literal as i) "l" - { try INT32(cvt_int32_literal i, i) - with Failure _ -> err (Literal_overflow "int32") (Loc.of_lexbuf lexbuf) } - | (int_literal as i) "L" - { try INT64(cvt_int64_literal i, i) - with Failure _ -> err (Literal_overflow "int64") (Loc.of_lexbuf lexbuf) } - | (int_literal as i) "n" - { try NATIVEINT(cvt_nativeint_literal i, i) - with Failure _ -> err (Literal_overflow "nativeint") (Loc.of_lexbuf lexbuf) } - | '"' - { with_curr_loc string c; - let s = buff_contents c in STRING (TokenEval.string s, s) } - | "'" (newline as x) "'" - { update_loc c None 1 false 1; CHAR (TokenEval.char x, x) } - | "'" ( [^ '\\' '\010' '\013'] - | '\\' (['\\' '"' 'n' 't' 'b' 'r' ' ' '\''] - |['0'-'9'] ['0'-'9'] ['0'-'9'] - |'x' hexa_char hexa_char) - as x) "'" { CHAR (TokenEval.char x, x) } - | "'\\" (_ as c) - { err (Illegal_escape (String.make 1 c)) (Loc.of_lexbuf lexbuf) } - | "(*" - { store c; COMMENT(parse_nested comment (in_comment c)) } - | "(*)" - { warn Comment_start (Loc.of_lexbuf lexbuf) ; - parse comment (in_comment c); COMMENT (buff_contents c) } - | "*)" - { warn Comment_not_end (Loc.of_lexbuf lexbuf) ; - move_start_p (-1) c; SYMBOL "*" } - | "<<" (quotchar* as beginning) - { if quotations c - then (move_start_p (-String.length beginning); - mk_quotation quotation c "" "" 2) - else parse (symbolchar_star ("<<" ^ beginning)) c } - | "<<>>" - { if quotations c - then QUOTATION { q_name = ""; q_loc = ""; q_shift = 2; q_contents = "" } - else parse (symbolchar_star "<<>>") c } - | "<@" - { if quotations c then with_curr_loc maybe_quotation_at c - else parse (symbolchar_star "<@") c } - | "<:" - { if quotations c then with_curr_loc maybe_quotation_colon c - else parse (symbolchar_star "<:") c } - | "#" [' ' '\t']* (['0'-'9']+ as num) [' ' '\t']* - ("\"" ([^ '\010' '\013' '"' ] * as name) "\"")? - [^ '\010' '\013'] * newline - { let inum = int_of_string num - in update_loc c name inum true 0; LINE_DIRECTIVE(inum, name) } - | '(' (not_star_symbolchar as op) ')' - { ESCAPED_IDENT (String.make 1 op) } - | '(' (not_star_symbolchar symbolchar* not_star_symbolchar as op) ')' - { ESCAPED_IDENT op } - | '(' (not_star_symbolchar symbolchar* as op) blank+ ')' - { ESCAPED_IDENT op } - | '(' blank+ (symbolchar* not_star_symbolchar as op) ')' - { ESCAPED_IDENT op } - | '(' blank+ (symbolchar+ as op) blank+ ')' - { ESCAPED_IDENT op } - | ( "#" | "`" | "'" | "," | "." | ".." | ":" | "::" - | ":=" | ":>" | ";" | ";;" | "_" - | left_delimitor | right_delimitor ) as x { SYMBOL x } - | '$' { if antiquots c - then with_curr_loc dollar (shift 1 c) - else parse (symbolchar_star "$") c } - | ['~' '?' '!' '=' '<' '>' '|' '&' '@' '^' '+' '-' '*' '/' '%' '\\'] symbolchar * - as x { SYMBOL x } - | eof - { let pos = lexbuf.lex_curr_p in - lexbuf.lex_curr_p <- { pos with pos_bol = pos.pos_bol + 1 ; - pos_cnum = pos.pos_cnum + 1 }; EOI } - | _ as c { err (Illegal_character c) (Loc.of_lexbuf lexbuf) } - - and comment c = parse - "(*" - { store c; with_curr_loc comment c; parse comment c } - | "*)" { store c } - | '<' (':' ident)? ('@' locname)? '<' - { store c; - if quotations c then with_curr_loc quotation c; parse comment c } - | ident { store_parse comment c } - | "\"" - { store c; - begin try with_curr_loc string c - with Loc.Exc_located(_, Error.E Unterminated_string) -> - err Unterminated_string_in_comment (loc c) - end; - Buffer.add_char c.buffer '"'; - parse comment c } - | "''" { store_parse comment c } - | "'''" { store_parse comment c } - | "'" newline "'" - { update_loc c None 1 false 1; store_parse comment c } - | "'" [^ '\\' '\'' '\010' '\013' ] "'" { store_parse comment c } - | "'\\" ['\\' '"' '\'' 'n' 't' 'b' 'r' ' '] "'" { store_parse comment c } - | "'\\" ['0'-'9'] ['0'-'9'] ['0'-'9'] "'" { store_parse comment c } - | "'\\" 'x' hexa_char hexa_char "'" { store_parse comment c } - | eof - { err Unterminated_comment (loc c) } - | newline - { update_loc c None 1 false 0; store_parse comment c } - | _ { store_parse comment c } - - and string c = parse - '"' { set_start_p c } - | '\\' newline ([' ' '\t'] * as space) - { update_loc c None 1 false (String.length space); - store_parse string c } - | '\\' ['\\' '"' 'n' 't' 'b' 'r' ' ' '\''] { store_parse string c } - | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] { store_parse string c } - | '\\' 'x' hexa_char hexa_char { store_parse string c } - | '\\' (_ as x) - { if is_in_comment c - then store_parse string c - else begin - warn (Illegal_escape (String.make 1 x)) (Loc.of_lexbuf lexbuf); - store_parse string c - end } - | newline - { update_loc c None 1 false 0; store_parse string c } - | eof { err Unterminated_string (loc c) } - | _ { store_parse string c } - - and symbolchar_star beginning c = parse - | symbolchar* as tok { move_start_p (-String.length beginning) c ; - SYMBOL(beginning ^ tok) } - - and maybe_quotation_at c = parse - | (ident as loc) '<' - { mk_quotation quotation c "" loc (1 + String.length loc) } - | symbolchar* as tok { SYMBOL("<@" ^ tok) } - - and maybe_quotation_colon c = parse - | (ident as name) '<' - { mk_quotation quotation c name "" (1 + String.length name) } - | (ident as name) '@' (locname as loc) '<' - { mk_quotation quotation c name loc - (2 + String.length loc + String.length name) } - | symbolchar* as tok { SYMBOL("<:" ^ tok) } - - and quotation c = parse - | '<' (':' ident)? ('@' locname)? '<' { store c ; - with_curr_loc quotation c ; - parse quotation c } - | ">>" { store c } - | eof { err Unterminated_quotation (loc c) } - | newline { update_loc c None 1 false 0 ; - store_parse quotation c } - | _ { store_parse quotation c } - - and dollar c = parse - | '$' { set_start_p c; ANTIQUOT("", "") } - | ('`'? (identchar*|['.' '!']+) as name) ':' - { with_curr_loc (antiquot name) (shift (1 + String.length name) c) } - | _ { store_parse (antiquot "") c } - - and antiquot name c = parse - | '$' { set_start_p c; ANTIQUOT(name, buff_contents c) } - | eof { err Unterminated_antiquot (loc c) } - | newline - { update_loc c None 1 false 0; store_parse (antiquot name) c } - | '<' (':' ident)? ('@' locname)? '<' - { store c; with_curr_loc quotation c; parse (antiquot name) c } - | _ { store_parse (antiquot name) c } - - { - - let lexing_store s buff max = - let rec self n s = - if n >= max then n - else - match Stream.peek s with - | Some x -> - Stream.junk s; - buff.[n] <- x; - succ n - | _ -> n - in - self 0 s - - let from_context c = - let next _ = - let tok = with_curr_loc token c in - let loc = Loc.of_lexbuf c.lexbuf in - Some ((tok, loc)) - in Stream.from next - - let from_lexbuf ?(quotations = true) lb = - let c = { (default_context lb) with - loc = Loc.of_lexbuf lb; - antiquots = !Camlp4_config.antiquotations; - quotations = quotations } - in from_context c - - let setup_loc lb loc = - let start_pos = Loc.start_pos loc in - lb.lex_abs_pos <- start_pos.pos_cnum; - lb.lex_curr_p <- start_pos - - let from_string ?quotations loc str = - let lb = Lexing.from_string str in - setup_loc lb loc; - from_lexbuf ?quotations lb - - let from_stream ?quotations loc strm = - let lb = Lexing.from_function (lexing_store strm) in - setup_loc lb loc; - from_lexbuf ?quotations lb - - let mk () loc strm = - from_stream ~quotations:!Camlp4_config.quotations loc strm -end -} diff --git a/camlp4/Camlp4/Struct/Loc.ml b/camlp4/Camlp4/Struct/Loc.ml deleted file mode 100644 index 2fd2c910..00000000 --- a/camlp4/Camlp4/Struct/Loc.ml +++ /dev/null @@ -1,307 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -(* camlp4r *) - -open Format; - -(* FIXME - Study these 2 others implementations which change the ghost - handling: - - type pos = ... the same ... - - 1/ - - type loc = { - file_name : string; - start : pos; - stop : pos - }; - - type t = - [ Nowhere - | Ghost of loc (* the closest non ghost loc *) - | Concrete of loc ]; - - 2/ - - type loc = { - file_name : string; - start : pos; - stop : pos - }; - - type t = option loc; - - 3/ - - type t = { - file_name : option string; - start : pos; - stop : pos - }; - -*) - -type pos = { - line : int; - bol : int; - off : int -}; - -type t = { - file_name : string; - start : pos; - stop : pos; - ghost : bool -}; - -(* Debug section *) -value dump_sel f x = - let s = - match x with - [ `start -> "`start" - | `stop -> "`stop" - | `both -> "`both" - | _ -> "" ] - in pp_print_string f s; -value dump_pos f x = - fprintf f "@[{ line = %d ;@ bol = %d ;@ off = %d } : pos@]" - x.line x.bol x.off; -value dump_long f x = - fprintf f - "@[{ file_name = %s ;@ start = %a (%d-%d);@ stop = %a (%d);@ ghost = %b@ } : Loc.t@]" - x.file_name dump_pos x.start (x.start.off - x.start.bol) - (x.stop.off - x.start.bol) dump_pos x.stop - (x.stop.off - x.stop.bol) x.ghost; -value dump f x = - fprintf f "[%S: %d:%d-%d %d:%d%t]" - x.file_name x.start.line (x.start.off - x.start.bol) - (x.stop.off - x.start.bol) x.stop.line (x.stop.off - x.stop.bol) - (fun o -> if x.ghost then fprintf o " (ghost)" else ()); - -value start_pos = { line = 1 ; bol = 0 ; off = 0 }; - -value ghost = - { file_name = "ghost-location"; - start = start_pos; - stop = start_pos; - ghost = True }; - -value mk file_name = - debug loc "mk %s@\n" file_name in - { file_name = file_name; - start = start_pos; - stop = start_pos; - ghost = False }; - -value of_tuple (file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost) = - { file_name = file_name; - start = { line = start_line ; bol = start_bol ; off = start_off }; - stop = { line = stop_line ; bol = stop_bol ; off = stop_off }; - ghost = ghost }; - -value to_tuple - { file_name = file_name; - start = { line = start_line ; bol = start_bol ; off = start_off }; - stop = { line = stop_line ; bol = stop_bol ; off = stop_off }; - ghost = ghost } = - (file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost); - -value pos_of_lexing_position p = - let pos = - { line = p.Lexing.pos_lnum ; - bol = p.Lexing.pos_bol ; - off = p.Lexing.pos_cnum } in - debug loc "pos_of_lexing_position: %a@\n" dump_pos pos in - pos; - -value pos_to_lexing_position p file_name = - (* debug loc "pos_to_lexing_position: %a@\n" dump_pos p in *) - { Lexing. - pos_fname = file_name; - pos_lnum = p.line ; - pos_bol = p.bol ; - pos_cnum = p.off }; - -value better_file_name a b = - match (a, b) with - [ ("", "") -> a - | ("", x) -> x - | (x, "") -> x - | ("-", x) -> x - | (x, "-") -> x - | (x, _) -> x ]; - -value of_lexbuf lb = - let start = Lexing.lexeme_start_p lb - and stop = Lexing.lexeme_end_p lb in - let loc = - { file_name = better_file_name start.Lexing.pos_fname stop.Lexing.pos_fname; - start = pos_of_lexing_position start; - stop = pos_of_lexing_position stop; - ghost = False } in - debug loc "of_lexbuf: %a@\n" dump loc in - loc; - -value of_lexing_position pos = - let loc = - { file_name = pos.Lexing.pos_fname; - start = pos_of_lexing_position pos; - stop = pos_of_lexing_position pos; - ghost = False } in - debug loc "of_lexing_position: %a@\n" dump loc in - loc; - -value to_ocaml_location x = - debug loc "to_ocaml_location: %a@\n" dump x in - { Camlp4_import.Location. - loc_start = pos_to_lexing_position x.start x.file_name; - loc_end = pos_to_lexing_position x.stop x.file_name; - loc_ghost = x.ghost }; - -value of_ocaml_location { Camlp4_import.Location.loc_start = a; loc_end = b; loc_ghost = g } = - let res = - { file_name = better_file_name a.Lexing.pos_fname b.Lexing.pos_fname; - start = pos_of_lexing_position a; - stop = pos_of_lexing_position b; - ghost = g } in - debug loc "of_ocaml_location: %a@\n" dump res in - res; - -value start_pos x = pos_to_lexing_position x.start x.file_name; -value stop_pos x = pos_to_lexing_position x.stop x.file_name; - -value merge a b = - if a == b then - debug loc "trivial merge@\n" in - a - else - let r = - match (a.ghost, b.ghost) with - [ (False, False) -> - (* FIXME if a.file_name <> b.file_name then - raise (Invalid_argument - (sprintf "Loc.merge: Filenames must be equal: %s <> %s" - a.file_name b.file_name)) *) - (* else *) - { (a) with stop = b.stop } - | (True, True) -> { (a) with stop = b.stop } - | (True, _) -> { (a) with stop = b.stop } - | (_, True) -> { (b) with start = a.start } ] - in debug loc "@[merge %a@ %a@ %a@]@\n" dump a dump b dump r in r; - -value join x = { (x) with stop = x.start }; - -value map f start_stop_both x = - match start_stop_both with - [ `start -> { (x) with start = f x.start } - | `stop -> { (x) with stop = f x.stop } - | `both -> { (x) with start = f x.start; stop = f x.stop } ]; - -value move_pos chars x = { (x) with off = x.off + chars }; - -value move s chars x = - debug loc "move %a %d %a@\n" dump_sel s chars dump x in - map (move_pos chars) s x; - -value move_line lines x = - debug loc "move_line %d %a@\n" lines dump x in - let move_line_pos x = - { (x) with line = x.line + lines ; bol = x.off } - in map move_line_pos `both x; - -value shift width x = - { (x) with start = x.stop ; stop = move_pos width x.stop }; - -value file_name x = x.file_name; -value start_line x = x.start.line; -value stop_line x = x.stop.line; -value start_bol x = x.start.bol; -value stop_bol x = x.stop.bol; -value start_off x = x.start.off; -value stop_off x = x.stop.off; -value is_ghost x = x.ghost; - -value set_file_name s x = - debug loc "set_file_name: %a@\n" dump x in - { (x) with file_name = s }; - -value ghostify x = - debug loc "ghostify: %a@\n" dump x in - { (x) with ghost = True }; - -value make_absolute x = - debug loc "make_absolute: %a@\n" dump x in - let pwd = Sys.getcwd () in - if Filename.is_relative x.file_name then - { (x) with file_name = Filename.concat pwd x.file_name } - else x; - -value strictly_before x y = - let b = x.stop.off < y.start.off && x.file_name = y.file_name in - debug loc "%a [strictly_before] %a => %b@\n" dump x dump y b in - b; - -value to_string x = do { - let (a, b) = (x.start, x.stop) in - let res = sprintf "File \"%s\", line %d, characters %d-%d" - x.file_name a.line (a.off - a.bol) (b.off - a.bol) in - if x.start.line <> x.stop.line then - sprintf "%s (end at line %d, character %d)" - res x.stop.line (b.off - b.bol) - else res -}; - -value print out x = pp_print_string out (to_string x); - -value check x msg = - if ((start_line x) > (stop_line x) || - (start_bol x) > (stop_bol x) || - (start_off x) > (stop_off x) || - (start_line x) < 0 || (stop_line x) < 0 || - (start_bol x) < 0 || (stop_bol x) < 0 || - (start_off x) < 0 || (stop_off x) < 0) - (* Here, we don't check - (start_off x) < (start_bol x) || (stop_off x) < (start_bol x) - since the lexer is called on antiquotations, with off=0, but line and bolpos - have "correct" values *) - then do { - eprintf "*** Warning: (%s) strange positions ***\n%a@\n" msg print x; - False - } - else True; - -exception Exc_located of t and exn; - -ErrorHandler.register - (fun ppf -> - fun [ Exc_located loc exn -> - fprintf ppf "%a:@\n%a" print loc ErrorHandler.print exn - | exn -> raise exn ]); - -value name = ref "_loc"; - -value raise loc exc = - match exc with - [ Exc_located _ _ -> raise exc - | _ -> raise (Exc_located loc exc) ] -; diff --git a/camlp4/Camlp4/Struct/Loc.mli b/camlp4/Camlp4/Struct/Loc.mli deleted file mode 100644 index c6c523fc..00000000 --- a/camlp4/Camlp4/Struct/Loc.mli +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -include Sig.Loc; diff --git a/camlp4/Camlp4/Struct/Quotation.ml b/camlp4/Camlp4/Struct/Quotation.ml deleted file mode 100644 index c9d6169a..00000000 --- a/camlp4/Camlp4/Struct/Quotation.ml +++ /dev/null @@ -1,167 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -module Make (Ast : Sig.Camlp4Ast) -: Sig.Quotation with module Ast = Ast -= struct - module Ast = Ast; - module DynAst = DynAst.Make Ast; - module Loc = Ast.Loc; - open Format; - open Sig; - - type expand_fun 'a = Loc.t -> option string -> string -> 'a; - - module Exp_key = DynAst.Pack(struct - type t 'a = unit; - end); - - module Exp_fun = DynAst.Pack(struct - type t 'a = expand_fun 'a; - end); - - value expanders_table = - (ref [] : ref (list ((string * Exp_key.pack) * Exp_fun.pack))); - - value default = ref ""; - value translate = ref (fun x -> x); - - value expander_name name = - match translate.val name with - [ "" -> default.val - | name -> name ]; - - value find name tag = - let key = (expander_name name, Exp_key.pack tag ()) in - Exp_fun.unpack tag (List.assoc key expanders_table.val); - - value add name tag f = - let elt = ((name, Exp_key.pack tag ()), Exp_fun.pack tag f) in - expanders_table.val := [elt :: expanders_table.val]; - - value dump_file = ref None; - - module Error = struct - type error = - [ Finding - | Expanding - | ParsingResult of Loc.t and string - | Locating ]; - type t = (string * string * error * exn); - exception E of t; - - value print ppf (name, position, ctx, exn) = - let name = if name = "" then default.val else name in - let pp x = fprintf ppf "@?@[<2>While %s %S in a position of %S:" x name position in - let () = - match ctx with - [ Finding -> begin - pp "finding quotation"; - if expanders_table.val = [] then - fprintf ppf "@ There is no quotation expander available." - else - begin - fprintf ppf "@ @[Available quotation expanders are:@\n"; - List.iter begin fun ((s,t),_) -> - fprintf ppf "@[<2>%s@ (in@ a@ position@ of %a)@]@ " - s Exp_key.print_tag t - end expanders_table.val; - fprintf ppf "@]" - end - end - | Expanding -> pp "expanding quotation" - | Locating -> pp "parsing" - | ParsingResult loc str -> - let () = pp "parsing result of quotation" in - match dump_file.val with - [ Some dump_file -> - let () = fprintf ppf " dumping result...\n" in - try - let oc = open_out_bin dump_file in - begin - output_string oc str; - output_string oc "\n"; - flush oc; - close_out oc; - fprintf ppf "%a:" Loc.print (Loc.set_file_name dump_file loc); - end - with _ -> - fprintf ppf - "Error while dumping result in file %S; dump aborted" - dump_file - | None -> - fprintf ppf - "\n(consider setting variable Quotation.dump_file, or using the -QD option)" - ] - ] - in fprintf ppf "@\n%a@]@." ErrorHandler.print exn; - - value to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b; - end; - let module M = ErrorHandler.Register Error in (); - open Error; - - value expand_quotation loc expander pos_tag quot = - debug quot "expand_quotation: name: %s, str: %S@." quot.q_name quot.q_contents in - let loc_name_opt = if quot.q_loc = "" then None else Some quot.q_loc in - try expander loc loc_name_opt quot.q_contents with - [ Loc.Exc_located _ (Error.E _) as exc -> - raise exc - | Loc.Exc_located iloc exc -> - let exc1 = Error.E (quot.q_name, pos_tag, Expanding, exc) in - raise (Loc.Exc_located iloc exc1) - | exc -> - let exc1 = Error.E (quot.q_name, pos_tag, Expanding, exc) in - raise (Loc.Exc_located loc exc1) ]; - - value parse_quotation_result parse loc quot pos_tag str = - try parse loc str with - [ Loc.Exc_located iloc (Error.E (n, pos_tag, Expanding, exc)) -> - let ctx = ParsingResult iloc quot.q_contents in - let exc1 = Error.E (n, pos_tag, ctx, exc) in - raise (Loc.Exc_located iloc exc1) - | Loc.Exc_located iloc (Error.E _ as exc) -> - raise (Loc.Exc_located iloc exc) - | Loc.Exc_located iloc exc -> - let ctx = ParsingResult iloc quot.q_contents in - let exc1 = Error.E (quot.q_name, pos_tag, ctx, exc) in - raise (Loc.Exc_located iloc exc1) ]; - - value expand loc quotation tag = - let pos_tag = DynAst.string_of_tag tag in - let name = quotation.q_name in - debug quot "handle_quotation: name: %s, str: %S@." name quotation.q_contents in - let expander = - try find name tag - with - [ Loc.Exc_located _ (Error.E _) as exc -> raise exc - | Loc.Exc_located qloc exc -> - raise (Loc.Exc_located qloc (Error.E (name, pos_tag, Finding, exc))) - | exc -> - raise (Loc.Exc_located loc (Error.E (name, pos_tag, Finding, exc))) ] - in - let loc = Loc.join (Loc.move `start quotation.q_shift loc) in - expand_quotation loc expander pos_tag quotation; - -end; diff --git a/camlp4/Camlp4/Struct/Token.ml b/camlp4/Camlp4/Struct/Token.ml deleted file mode 100644 index 701e990d..00000000 --- a/camlp4/Camlp4/Struct/Token.ml +++ /dev/null @@ -1,244 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open Format; - -module Make (Loc : Sig.Loc) -: Sig.Camlp4Token with module Loc = Loc -= struct - module Loc = Loc; - open Sig; - type t = camlp4_token; - type token = t; - - value to_string = - fun - [ KEYWORD s -> sprintf "KEYWORD %S" s - | SYMBOL s -> sprintf "SYMBOL %S" s - | LIDENT s -> sprintf "LIDENT %S" s - | UIDENT s -> sprintf "UIDENT %S" s - | INT _ s -> sprintf "INT %s" s - | INT32 _ s -> sprintf "INT32 %sd" s - | INT64 _ s -> sprintf "INT64 %sd" s - | NATIVEINT _ s-> sprintf "NATIVEINT %sd" s - | FLOAT _ s -> sprintf "FLOAT %s" s - | CHAR _ s -> sprintf "CHAR '%s'" s - | STRING _ s -> sprintf "STRING \"%s\"" s - (* here it's not %S since the string is already escaped *) - | LABEL s -> sprintf "LABEL %S" s - | OPTLABEL s -> sprintf "OPTLABEL %S" s - | ANTIQUOT n s -> sprintf "ANTIQUOT %s: %S" n s - | QUOTATION x -> sprintf "QUOTATION { q_name=%S; q_loc=%S; q_shift=%d; q_contents=%S }" - x.q_name x.q_loc x.q_shift x.q_contents - | COMMENT s -> sprintf "COMMENT %S" s - | BLANKS s -> sprintf "BLANKS %S" s - | NEWLINE -> sprintf "NEWLINE" - | EOI -> sprintf "EOI" - | ESCAPED_IDENT s -> sprintf "ESCAPED_IDENT %S" s - | LINE_DIRECTIVE i None -> sprintf "LINE_DIRECTIVE %d" i - | LINE_DIRECTIVE i (Some s) -> sprintf "LINE_DIRECTIVE %d %S" i s ]; - - value print ppf x = pp_print_string ppf (to_string x); - - value match_keyword kwd = - fun - [ KEYWORD kwd' when kwd = kwd' -> True - | _ -> False ]; - - value extract_string = - fun - [ KEYWORD s | SYMBOL s | LIDENT s | UIDENT s | INT _ s | INT32 _ s | - INT64 _ s | NATIVEINT _ s | FLOAT _ s | CHAR _ s | STRING _ s | - LABEL s | OPTLABEL s | COMMENT s | BLANKS s | ESCAPED_IDENT s -> s - | tok -> - invalid_arg ("Cannot extract a string from this token: "^ - to_string tok) ]; - - module Error = struct - type t = - [ Illegal_token of string - | Keyword_as_label of string - | Illegal_token_pattern of string and string - | Illegal_constructor of string ]; - - exception E of t; - - value print ppf = - fun - [ Illegal_token s -> - fprintf ppf "Illegal token (%s)" s - | Keyword_as_label kwd -> - fprintf ppf "`%s' is a keyword, it cannot be used as label name" kwd - | Illegal_token_pattern p_con p_prm -> - fprintf ppf "Illegal token pattern: %s %S" p_con p_prm - | Illegal_constructor con -> - fprintf ppf "Illegal constructor %S" con ]; - - value to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b; - end; - let module M = ErrorHandler.Register Error in (); - - module Filter = struct - type token_filter = stream_filter t Loc.t; - - type t = - { is_kwd : string -> bool; - filter : mutable token_filter }; - - value err error loc = - raise (Loc.Exc_located loc (Error.E error)); - - value keyword_conversion tok is_kwd = - match tok with - [ SYMBOL s | LIDENT s | UIDENT s when is_kwd s -> KEYWORD s - | ESCAPED_IDENT s -> LIDENT s - | _ -> tok ]; - - value check_keyword_as_label tok loc is_kwd = - let s = - match tok with - [ LABEL s -> s - | OPTLABEL s -> s - | _ -> "" ] - in if s <> "" && is_kwd s then err (Error.Keyword_as_label s) loc else (); - - value check_unknown_keywords tok loc = - match tok with - [ SYMBOL s -> err (Error.Illegal_token s) loc - | _ -> () ]; - - value error_no_respect_rules p_con p_prm = - raise (Error.E (Error.Illegal_token_pattern p_con p_prm)); - - value check_keyword _ = True; - (* FIXME let lb = Lexing.from_string s in - let next () = token default_context lb in - try - match next () with - [ SYMBOL _ | UIDENT _ | LIDENT _ -> (next () = EOI) - | _ -> False ] - with [ Stream.Error _ -> False ]; *) - - value error_on_unknown_keywords = ref False; - - value rec ignore_layout = - parser - [ [: `(COMMENT _ | BLANKS _ | NEWLINE | LINE_DIRECTIVE _ _, _); s :] -> - ignore_layout s - | [: ` x; s :] -> [: ` x; ignore_layout s :] - | [: :] -> [: :] ]; - - value mk is_kwd = - { is_kwd = is_kwd; - filter = ignore_layout }; - - value filter x = - let f tok loc = do { - let tok = keyword_conversion tok x.is_kwd; - check_keyword_as_label tok loc x.is_kwd; - if error_on_unknown_keywords.val - then check_unknown_keywords tok loc else (); - debug token "@[Lexer before filter:@ %a@ at@ %a@]@." - print tok Loc.dump loc in - (tok, loc) - } in - let rec filter = - parser - [ [: `(tok, loc); s :] -> [: ` f tok loc; filter s :] - | [: :] -> [: :] ] - in - let rec tracer = (* FIXME add a debug block construct *) - parser - [ [: `((_tok, _loc) as x); xs :] -> - debug token "@[Lexer after filter:@ %a@ at@ %a@]@." - print _tok Loc.dump _loc in - [: ` x; tracer xs :] - | [: :] -> [: :] ] - in fun strm -> tracer (x.filter (filter strm)); - - value define_filter x f = x.filter := f x.filter; - - value keyword_added _ _ _ = (); - value keyword_removed _ _ = (); - end; - -end; - -(* Char and string tokens to real chars and string *) -module Eval = struct - - value valch x = Char.code x - Char.code '0'; - value valch_hex x = - let d = Char.code x in - if d >= 97 then d - 87 - else if d >= 65 then d - 55 - else d - 48; - - value rec skip_indent = parser - [ [: `' ' | '\t'; s :] -> skip_indent s - | [: :] -> () ]; - - value skip_opt_linefeed = parser - [ [: `'\010' :] -> () - | [: :] -> () ]; - - value chr c = - if c < 0 || c > 255 then failwith "invalid char token" else Char.chr c; - - value rec backslash = parser - [ [: `'\010' :] -> '\010' - | [: `'\013' :] -> '\013' - | [: `'n' :] -> '\n' - | [: `'r' :] -> '\r' - | [: `'t' :] -> '\t' - | [: `'b' :] -> '\b' - | [: `'\\' :] -> '\\' - | [: `'"' :] -> '"' - | [: `'\'' :] -> '\'' - | [: `' ' :] -> ' ' - | [: `('0'..'9' as c1); `('0'..'9' as c2); `('0'..'9' as c3) :] -> - chr (100 * (valch c1) + 10 * (valch c2) + (valch c3)) - | [: `'x'; `('0'..'9' | 'a'..'f' | 'A'..'F' as c1) ; - `('0'..'9' | 'a'..'f' | 'A'..'F' as c2) :] -> - chr (16 * (valch_hex c1) + (valch_hex c2)) ]; - - value rec backslash_in_string strict store = parser - [ [: `'\010'; s :] -> skip_indent s - | [: `'\013'; s :] -> do { skip_opt_linefeed s; skip_indent s } - | [: x = backslash :] -> store x - | [: `c when not strict :] -> do { store '\\'; store c } - | [: :] -> failwith "invalid string token" ]; - - value char s = - if String.length s = 1 then s.[0] - else if String.length s = 0 then failwith "invalid char token" - else match Stream.of_string s with parser - [ [: `'\\'; x = backslash :] -> x - | [: :] -> failwith "invalid char token" ]; - - value string ?strict s = - let buf = Buffer.create 23 in - let store = Buffer.add_char buf in - let rec parse = parser - [ [: `'\\'; _ = backslash_in_string (strict <> None) store; s :] -> parse s - | [: `c; s :] -> do { store c; parse s } - | [: :] -> Buffer.contents buf ] - in parse (Stream.of_string s); -end; diff --git a/camlp4/Camlp4/Struct/Token.mli b/camlp4/Camlp4/Struct/Token.mli deleted file mode 100644 index d3e866a3..00000000 --- a/camlp4/Camlp4/Struct/Token.mli +++ /dev/null @@ -1,35 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Make (Loc : Sig.Loc) : Sig.Camlp4Token with module Loc = Loc; - -module Eval : sig - value char : string -> char; - (** Convert a char token, where the escape sequences (backslashes) - remain to be interpreted; raise [Failure] if an - incorrect backslash sequence is found; [Token.Eval.char (Char.escaped c)] - returns [c] *) - - value string : ?strict:unit -> string -> string; - (** [Taken.Eval.string strict s] - Convert a string token, where the escape sequences (backslashes) - remain to be interpreted; raise [Failure] if [strict] and an - incorrect backslash sequence is found; - [Token.Eval.string strict (String.escaped s)] returns [s] *) -end; diff --git a/camlp4/Camlp4Bin.ml b/camlp4/Camlp4Bin.ml deleted file mode 100644 index ecc64311..00000000 --- a/camlp4/Camlp4Bin.ml +++ /dev/null @@ -1,325 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -open Camlp4; -open PreCast.Syntax; -open PreCast; -open Format; -module CleanAst = Camlp4.Struct.CleanAst.Make Ast; -module SSet = Set.Make String; - -value pa_r = "Camlp4OCamlRevisedParser"; -value pa_rr = "Camlp4OCamlReloadedParser"; -value pa_o = "Camlp4OCamlParser"; -value pa_rp = "Camlp4OCamlRevisedParserParser"; -value pa_op = "Camlp4OCamlParserParser"; -value pa_g = "Camlp4GrammarParser"; -value pa_m = "Camlp4MacroParser"; -value pa_qb = "Camlp4QuotationCommon"; -value pa_q = "Camlp4QuotationExpander"; -value pa_rq = "Camlp4OCamlRevisedQuotationExpander"; -value pa_oq = "Camlp4OCamlOriginalQuotationExpander"; -value pa_l = "Camlp4ListComprehension"; - -open Register; - -value dyn_loader = ref (fun []); -value rcall_callback = ref (fun () -> ()); -value loaded_modules = ref SSet.empty; -value add_to_loaded_modules name = - loaded_modules.val := SSet.add name loaded_modules.val; - -value (objext,libext) = - if DynLoader.is_native then (".cmxs",".cmxs") - else (".cmo",".cma"); - -value rewrite_and_load n x = - let dyn_loader = dyn_loader.val () in - let find_in_path = DynLoader.find_in_path dyn_loader in - let real_load name = do { - add_to_loaded_modules name; - DynLoader.load dyn_loader name - } in - let load = List.iter begin fun n -> - if SSet.mem n loaded_modules.val || List.mem n Register.loaded_modules.val then () - else begin - add_to_loaded_modules n; - DynLoader.load dyn_loader (n ^ objext); - end - end in - do { - match (n, String.lowercase x) with - [ ("Parsers"|"", "pa_r.cmo" | "r" | "ocamlr" | "ocamlrevised" | "camlp4ocamlrevisedparser.cmo") -> load [pa_r] - | ("Parsers"|"", "rr" | "reloaded" | "ocamlreloaded" | "camlp4ocamlreloadedparser.cmo") -> load [pa_rr] - | ("Parsers"|"", "pa_o.cmo" | "o" | "ocaml" | "camlp4ocamlparser.cmo") -> load [pa_r; pa_o] - | ("Parsers"|"", "pa_rp.cmo" | "rp" | "rparser" | "camlp4ocamlrevisedparserparser.cmo") -> load [pa_r; pa_rp] - | ("Parsers"|"", "pa_op.cmo" | "op" | "parser" | "camlp4ocamlparserparser.cmo") -> load [pa_r; pa_o; pa_rp; pa_op] - | ("Parsers"|"", "pa_extend.cmo" | "pa_extend_m.cmo" | "g" | "grammar" | "camlp4grammarparser.cmo") -> load [pa_g] - | ("Parsers"|"", "pa_macro.cmo" | "m" | "macro" | "camlp4macroparser.cmo") -> load [pa_m] - | ("Parsers"|"", "q" | "camlp4quotationexpander.cmo") -> load [pa_qb; pa_q] - | ("Parsers"|"", "q_mlast.cmo" | "rq" | "camlp4ocamlrevisedquotationexpander.cmo") -> load [pa_qb; pa_rq] - | ("Parsers"|"", "oq" | "camlp4ocamloriginalquotationexpander.cmo") -> load [pa_r; pa_o; pa_qb; pa_oq] - | ("Parsers"|"", "rf") -> load [pa_r; pa_rp; pa_qb; pa_q; pa_g; pa_l; pa_m] - | ("Parsers"|"", "of") -> load [pa_r; pa_o; pa_rp; pa_op; pa_qb; pa_q; pa_g; pa_l; pa_m] - | ("Parsers"|"", "comp" | "camlp4listcomprehension.cmo") -> load [pa_l] - | ("Filters"|"", "lift" | "camlp4astlifter.cmo") -> load ["Camlp4AstLifter"] - | ("Filters"|"", "exn" | "camlp4exceptiontracer.cmo") -> load ["Camlp4ExceptionTracer"] - | ("Filters"|"", "prof" | "camlp4profiler.cmo") -> load ["Camlp4Profiler"] - (* map is now an alias of fold since fold handles map too *) - | ("Filters"|"", "map" | "camlp4mapgenerator.cmo") -> load ["Camlp4FoldGenerator"] - | ("Filters"|"", "fold" | "camlp4foldgenerator.cmo") -> load ["Camlp4FoldGenerator"] - | ("Filters"|"", "meta" | "camlp4metagenerator.cmo") -> load ["Camlp4MetaGenerator"] - | ("Filters"|"", "trash" | "camlp4trashremover.cmo") -> load ["Camlp4TrashRemover"] - | ("Filters"|"", "striploc" | "camlp4locationstripper.cmo") -> load ["Camlp4LocationStripper"] - | ("Printers"|"", "pr_r.cmo" | "r" | "ocamlr" | "camlp4ocamlrevisedprinter.cmo") -> - Register.enable_ocamlr_printer () - | ("Printers"|"", "pr_o.cmo" | "o" | "ocaml" | "camlp4ocamlprinter.cmo") -> - Register.enable_ocaml_printer () - | ("Printers"|"", "pr_dump.cmo" | "p" | "dumpocaml" | "camlp4ocamlastdumper.cmo") -> - Register.enable_dump_ocaml_ast_printer () - | ("Printers"|"", "d" | "dumpcamlp4" | "camlp4astdumper.cmo") -> - Register.enable_dump_camlp4_ast_printer () - | ("Printers"|"", "a" | "auto" | "camlp4autoprinter.cmo") -> - load ["Camlp4AutoPrinter"] - | _ -> - let y = "Camlp4"^n^"/"^x^objext in - real_load (try find_in_path y with [ Not_found -> x ]) ]; - rcall_callback.val (); - }; - -value print_warning = eprintf "%a:\n%s@." Loc.print; - -value rec parse_file dyn_loader name pa getdir = - let directive_handler = Some (fun ast -> - match getdir ast with - [ Some x -> - match x with - [ (_, "load", s) -> do { rewrite_and_load "" s; None } - | (_, "directory", s) -> do { DynLoader.include_dir dyn_loader s; None } - | (_, "use", s) -> Some (parse_file dyn_loader s pa getdir) - | (_, "default_quotation", s) -> do { Quotation.default.val := s; None } - | (loc, _, _) -> Loc.raise loc (Stream.Error "bad directive") ] - | None -> None ]) in - let loc = Loc.mk name - in do { - current_warning.val := print_warning; - let ic = if name = "-" then stdin else open_in_bin name; - let cs = Stream.of_channel ic; - let clear () = if name = "-" then () else close_in ic; - let phr = - try pa ?directive_handler loc cs - with x -> do { clear (); raise x }; - clear (); - phr - }; - -value output_file = ref None; - -value process dyn_loader name pa pr clean fold_filters getdir = - let ast = parse_file dyn_loader name pa getdir in - let ast = fold_filters (fun t filter -> filter t) ast in - let ast = clean ast in - pr ?input_file:(Some name) ?output_file:output_file.val ast; - -value gind = - fun - [ <:sig_item@loc< # $n$ $str:s$ >> -> Some (loc, n, s) - | _ -> None ]; - -value gimd = - fun - [ <:str_item@loc< # $n$ $str:s$ >> -> Some (loc, n, s) - | _ -> None ]; - -value process_intf dyn_loader name = - process dyn_loader name CurrentParser.parse_interf CurrentPrinter.print_interf - (new CleanAst.clean_ast)#sig_item - AstFilters.fold_interf_filters gind; -value process_impl dyn_loader name = - process dyn_loader name CurrentParser.parse_implem CurrentPrinter.print_implem - (new CleanAst.clean_ast)#str_item - AstFilters.fold_implem_filters gimd; - -value just_print_the_version () = - do { printf "%s@." Camlp4_config.version; exit 0 }; - -value print_version () = - do { eprintf "Camlp4 version %s@." Camlp4_config.version; exit 0 }; - -value print_stdlib () = - do { printf "%s@." Camlp4_config.camlp4_standard_library; exit 0 }; - -value usage ini_sl ext_sl = - do { - eprintf "\ -Usage: camlp4 [load-options] [--] [other-options]\n\ -Options:\n\ -.ml Parse this implementation file\n\ -.mli Parse this interface file\n\ -.%s Load this module inside the Camlp4 core@." -(if DynLoader.is_native then "cmxs " else "(cmo|cma)") -; - Options.print_usage_list ini_sl; - (* loop (ini_sl @ ext_sl) where rec loop = - fun - [ [(y, _, _) :: _] when y = "-help" -> () - | [_ :: sl] -> loop sl - | [] -> eprintf " -help Display this list of options.@." ]; *) - if ext_sl <> [] then do { - eprintf "Options added by loaded object files:@."; - Options.print_usage_list ext_sl; - } - else (); - }; - -value warn_noassert () = - do { - eprintf "\ -camlp4 warning: option -noassert is obsolete\n\ -You should give the -noassert option to the ocaml compiler instead.@."; - }; - -type file_kind = - [ Intf of string - | Impl of string - | Str of string - | ModuleImpl of string - | IncludeDir of string ]; - -value search_stdlib = ref True; -value print_loaded_modules = ref False; -value (task, do_task) = - let t = ref None in - let task f x = - let () = Camlp4_config.current_input_file.val := x in - t.val := Some (if t.val = None then (fun _ -> f x) - else (fun usage -> usage ())) in - let do_task usage = match t.val with [ Some f -> f usage | None -> () ] in - (task, do_task); -value input_file x = - let dyn_loader = dyn_loader.val () in - do { - rcall_callback.val (); - match x with - [ Intf file_name -> task (process_intf dyn_loader) file_name - | Impl file_name -> task (process_impl dyn_loader) file_name - | Str s -> - begin - let (f, o) = Filename.open_temp_file "from_string" ".ml"; - output_string o s; - close_out o; - task (process_impl dyn_loader) f; - at_exit (fun () -> Sys.remove f); - end - | ModuleImpl file_name -> rewrite_and_load "" file_name - | IncludeDir dir -> DynLoader.include_dir dyn_loader dir ]; - rcall_callback.val (); - }; - -value initial_spec_list = - [("-I", Arg.String (fun x -> input_file (IncludeDir x)), - " Add directory in search patch for object files."); - ("-where", Arg.Unit print_stdlib, - "Print camlp4 library directory and exit."); - ("-nolib", Arg.Clear search_stdlib, - "No automatic search for object files in library directory."); - ("-intf", Arg.String (fun x -> input_file (Intf x)), - " Parse as an interface, whatever its extension."); - ("-impl", Arg.String (fun x -> input_file (Impl x)), - " Parse as an implementation, whatever its extension."); - ("-str", Arg.String (fun x -> input_file (Str x)), - " Parse as an implementation."); - ("-unsafe", Arg.Set Camlp4_config.unsafe, - "Generate unsafe accesses to array and strings."); - ("-noassert", Arg.Unit warn_noassert, - "Obsolete, do not use this option."); - ("-verbose", Arg.Set Camlp4_config.verbose, - "More verbose in parsing errors."); - ("-loc", Arg.Set_string Loc.name, - " Name of the location variable (default: " ^ Loc.name.val ^ ")."); - ("-QD", Arg.String (fun x -> Quotation.dump_file.val := Some x), - " Dump quotation expander result in case of syntax error."); - ("-o", Arg.String (fun x -> output_file.val := Some x), - " Output on instead of standard output."); - ("-v", Arg.Unit print_version, - "Print Camlp4 version and exit."); - ("-version", Arg.Unit just_print_the_version, - "Print Camlp4 version number and exit."); - ("-vnum", Arg.Unit just_print_the_version, - "Print Camlp4 version number and exit."); - ("-no_quot", Arg.Clear Camlp4_config.quotations, - "Don't parse quotations, allowing to use, e.g. \"<:>\" as token."); - ("-loaded-modules", Arg.Set print_loaded_modules, "Print the list of loaded modules."); - ("-parser", Arg.String (rewrite_and_load "Parsers"), - " Load the parser Camlp4Parsers/.cm(o|a|xs)"); - ("-printer", Arg.String (rewrite_and_load "Printers"), - " Load the printer Camlp4Printers/.cm(o|a|xs)"); - ("-filter", Arg.String (rewrite_and_load "Filters"), - " Load the filter Camlp4Filters/.cm(o|a|xs)"); - ("-ignore", Arg.String ignore, "ignore the next argument"); - ("--", Arg.Unit ignore, "Deprecated, does nothing") -]; - -Options.init initial_spec_list; - -value anon_fun name = - input_file - (if Filename.check_suffix name ".mli" then Intf name - else if Filename.check_suffix name ".ml" then Impl name - else if Filename.check_suffix name objext then ModuleImpl name - else if Filename.check_suffix name libext then ModuleImpl name - else raise (Arg.Bad ("don't know what to do with " ^ name))); - -value main argv = - let usage () = do { usage initial_spec_list (Options.ext_spec_list ()); exit 0 } in - try do { - let dynloader = DynLoader.mk ~ocaml_stdlib:search_stdlib.val - ~camlp4_stdlib:search_stdlib.val (); - dyn_loader.val := fun () -> dynloader; - let call_callback () = - Register.iter_and_take_callbacks - (fun (name, module_callback) -> - let () = add_to_loaded_modules name in - module_callback ()); - call_callback (); - rcall_callback.val := call_callback; - match Options.parse anon_fun argv with - [ [] -> () - | ["-help"|"--help"|"-h"|"-?" :: _] -> usage () - | [s :: _] -> - do { eprintf "%s: unknown or misused option\n" s; - eprintf "Use option -help for usage@."; - exit 2 } ]; - do_task usage; - call_callback (); - if print_loaded_modules.val then do { - SSet.iter (eprintf "%s@.") loaded_modules.val; - } else () - } - with - [ Arg.Bad s -> do { eprintf "Error: %s\n" s; - eprintf "Use option -help for usage@."; - exit 2 } - | Arg.Help _ -> usage () - | exc -> do { eprintf "@[%a@]@." ErrorHandler.print exc; exit 2 } ]; - -main Sys.argv; diff --git a/camlp4/Camlp4Filters/Camlp4AstLifter.ml b/camlp4/Camlp4Filters/Camlp4AstLifter.ml deleted file mode 100644 index cc594aac..00000000 --- a/camlp4/Camlp4Filters/Camlp4AstLifter.ml +++ /dev/null @@ -1,44 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - - -open Camlp4; - -module Id = struct - value name = "Camlp4AstLifter"; - value version = Sys.ocaml_version; -end; - -module Make (AstFilters : Camlp4.Sig.AstFilters) = struct - open AstFilters; - - module MetaLoc = struct - module Ast = Ast; - value meta_loc_patt _loc _ = <:patt< loc >>; - value meta_loc_expr _loc _ = <:expr< loc >>; - end; - module MetaAst = Ast.Meta.Make MetaLoc; - - register_str_item_filter (fun ast -> - let _loc = Ast.loc_of_str_item ast in - <:str_item< let loc = Loc.ghost in $exp:MetaAst.Expr.meta_str_item _loc ast$ >>); - -end; - -let module M = Camlp4.Register.AstFilter Id Make in (); diff --git a/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml b/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml deleted file mode 100644 index 3cf570c0..00000000 --- a/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml +++ /dev/null @@ -1,68 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - - -open Camlp4; - -module Id = struct - value name = "Camlp4ExceptionTracer"; - value version = Sys.ocaml_version; -end; - -module Make (AstFilters : Camlp4.Sig.AstFilters) = struct - open AstFilters; - open Ast; - - value add_debug_expr e = - (* let _loc = Loc.make_absolute (MLast.loc_of_expr e) in *) - let _loc = Ast.loc_of_expr e in - let msg = "camlp4-debug: exc: %s at " ^ Loc.to_string _loc ^ "@." in - <:expr< - try $e$ - with - [ Stream.Failure | Exit as exc -> raise exc - | exc -> do { - if Debug.mode "exc" then - Format.eprintf $`str:msg$ (Printexc.to_string exc) else (); - raise exc - } ] >>; - - value rec map_match_case = - fun - [ <:match_case@_loc< $m1$ | $m2$ >> -> - <:match_case< $map_match_case m1$ | $map_match_case m2$ >> - | <:match_case@_loc< $p$ when $w$ -> $e$ >> -> - <:match_case@_loc< $p$ when $w$ -> $add_debug_expr e$ >> - | m -> m ]; - - value filter = object - inherit Ast.map as super; - method expr = fun - [ <:expr@_loc< fun [ $m$ ] >> -> <:expr< fun [ $map_match_case m$ ] >> - | x -> super#expr x ]; - method str_item = fun - [ <:str_item< module Debug = $_$ >> as st -> st - | st -> super#str_item st ]; - end; - - register_str_item_filter filter#str_item; - -end; - -let module M = Camlp4.Register.AstFilter Id Make in (); diff --git a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml deleted file mode 100644 index 205afa92..00000000 --- a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml +++ /dev/null @@ -1,609 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006-2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - - -open Camlp4; - -module Id = struct - value name = "Camlp4FoldGenerator"; - value version = Sys.ocaml_version; -end; - -module Make (AstFilters : Camlp4.Sig.AstFilters) = struct - open AstFilters; - module StringMap = Map.Make String; - open Ast; - - value _loc = Loc.ghost; - - value sf = Printf.sprintf; - - value xik i k = - let i = - if i < 0 then assert False - else if i = 0 then "" - else sf "_i%d" i - in - let k = - if k < 1 then assert False - else if k = 1 then "" - else sf "_k%d" k - in - sf "_x%s%s" i k; - value exik i k = <:expr< $lid:xik i k$ >>; - value pxik i k = <:patt< $lid:xik i k$ >>; - value elidk y k = <:expr< $lid:sf "%s_%d" y k$ >>; - value plidk y k = <:patt< $lid:sf "%s_%d" y k$ >>; - - value xs s = "_x_" ^ s; - value xsk = sf "_x_%s_%d"; - value exsk s k = <:expr< $lid:xsk s k$>>; - - value rec apply_expr accu = - fun - [ [] -> accu - | [x :: xs] -> - let _loc = Ast.loc_of_expr x - in apply_expr <:expr< $accu$ $x$ >> xs ]; - - value rec apply_patt accu = - fun - [ [] -> accu - | [x :: xs] -> - let _loc = Ast.loc_of_patt x - in apply_patt <:patt< $accu$ $x$ >> xs ]; - - value rec apply_ctyp accu = - fun - [ [] -> accu - | [x :: xs] -> - let _loc = Ast.loc_of_ctyp x - in apply_ctyp <:ctyp< $accu$ $x$ >> xs ]; - - value opt_map f = fun [ Some x -> Some (f x) | None -> None ]; - - value list_init f n = - let rec self m = - if m = n then [] - else [f m :: self (succ m)] - in self 0; - - value rec lid_of_ident sep = - fun - [ <:ident< $lid:s$ >> | <:ident< $uid:s$ >> -> s - | <:ident< $i1$.$i2$ >> -> lid_of_ident sep i1 ^ sep ^ lid_of_ident sep i2 - | _ -> assert False ]; - - type type_decl = (string * Ast.ident * list Ast.ctyp * Ast.ctyp * bool); - - value builtin_types = - let tyMap = StringMap.empty in - let tyMap = - let abstr = ["string"; "int"; "float"; "int32"; "int64"; "nativeint"; "char"] in - List.fold_right - (fun name -> StringMap.add name (name, <:ident< $lid:name$ >>, [], <:ctyp<>>, False)) - abstr tyMap - in - let tyMap = - let concr = - [("bool", <:ident>, [], <:ctyp< [ False | True ] >>, False); - ("list", <:ident>, [ <:ctyp< 'a >> ], <:ctyp< [ $uid:"[]"$ | $uid:"::"$ of 'a and list 'a ] >>, False); - ("option", <:ident

add to the search path for INCLUDE'd files - - After having used a DEFINE followed by "= ", you - can use it in expressions *and* in patterns. If the expression defining - the macro cannot be used as a pattern, there is an error message if - it is used in a pattern. - - You can also define a local macro in an expression usigng the DEFINE ... IN form. - Note that local macros have lowercase names and can not take parameters. - - If a macro is defined to = NOTHING, and then used as an argument to a function, - this will be equivalent to function taking one less argument. Similarly, - passing NOTHING as an argument to a macro is equivalent to "erasing" the - corresponding parameter from the macro body. - - The toplevel statement INCLUDE can be used to include a - file containing macro definitions and also any other toplevel items. - The included files are looked up in directories passed in via the -I - option, falling back to the current directory. - - The expression __FILE__ returns the current compiled file name. - The expression __LOCATION__ returns the current location of itself. - If used inside a macro, it returns the location where the macro is - called. - The expression (LOCATION_OF parameter) returns the location of the given - macro parameter. It cannot be used outside a macro definition. - -*) - -open Camlp4; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - type item_or_def 'a = - [ SdStr of 'a - | SdDef of string and option (list string * Ast.expr) - | SdUnd of string - | SdITE of bool and list (item_or_def 'a) and list (item_or_def 'a) - | SdLazy of Lazy.t 'a ]; - - value rec list_remove x = - fun - [ [(y, _) :: l] when y = x -> l - | [d :: l] -> [d :: list_remove x l] - | [] -> [] ]; - - value defined = ref []; - - value is_defined i = List.mem_assoc i defined.val; - - value bad_patt _loc = - Loc.raise _loc - (Failure - "this macro cannot be used in a pattern (see its definition)"); - - value substp _loc env = - loop where rec loop = - fun - [ <:expr< $e1$ $e2$ >> -> <:patt< $loop e1$ $loop e2$ >> - | <:expr< >> -> <:patt< >> - | <:expr< $lid:x$ >> -> - try List.assoc x env with - [ Not_found -> <:patt< $lid:x$ >> ] - | <:expr< $uid:x$ >> -> - try List.assoc x env with - [ Not_found -> <:patt< $uid:x$ >> ] - | <:expr< $int:x$ >> -> <:patt< $int:x$ >> - | <:expr< $str:s$ >> -> <:patt< $str:s$ >> - | <:expr< ($tup:x$) >> -> <:patt< ($tup:loop x$) >> - | <:expr< $x1$, $x2$ >> -> <:patt< $loop x1$, $loop x2$ >> - | <:expr< { $bi$ } >> -> - let rec substbi = fun - [ <:rec_binding< $b1$; $b2$ >> -> <:patt< $substbi b1$; $substbi b2$ >> - | <:rec_binding< $i$ = $e$ >> -> <:patt< $i$ = $loop e$ >> - | _ -> bad_patt _loc ] - in <:patt< { $substbi bi$ } >> - | _ -> bad_patt _loc ]; - - class reloc _loc = object - inherit Ast.map as super; - method loc _ = _loc; - (* method _Loc_t _ = _loc; *) - end; - - class subst _loc env = object - inherit reloc _loc as super; - method expr = - fun - [ <:expr< $lid:x$ >> | <:expr< $uid:x$ >> as e -> - try List.assoc x env with - [ Not_found -> super#expr e ] - | <:expr@_loc< LOCATION_OF $lid:x$ >> | <:expr@_loc< LOCATION_OF $uid:x$ >> as e -> - try - let loc = Ast.loc_of_expr (List.assoc x env) in - let (a, b, c, d, e, f, g, h) = Loc.to_tuple loc in - <:expr< Loc.of_tuple - ($`str:a$, $`int:b$, $`int:c$, $`int:d$, - $`int:e$, $`int:f$, $`int:g$, - $if h then <:expr< True >> else <:expr< False >> $) >> - with [ Not_found -> super#expr e ] - | e -> super#expr e ]; - - method patt = - fun - [ <:patt< $lid:x$ >> | <:patt< $uid:x$ >> as p -> - try substp _loc [] (List.assoc x env) with - [ Not_found -> super#patt p ] - | p -> super#patt p ]; - end; - - value incorrect_number loc l1 l2 = - Loc.raise loc - (Failure - (Printf.sprintf "expected %d parameters; found %d" - (List.length l2) (List.length l1))); - - value define eo x = - do { - match eo with - [ Some ([], e) -> - EXTEND Gram - expr: LEVEL "simple" - [ [ UIDENT $x$ -> (new reloc _loc)#expr e ]] - ; - patt: LEVEL "simple" - [ [ UIDENT $x$ -> - let p = substp _loc [] e - in (new reloc _loc)#patt p ]] - ; - END - | Some (sl, e) -> - EXTEND Gram - expr: LEVEL "apply" - [ [ UIDENT $x$; param = SELF -> - let el = - match param with - [ <:expr< ($tup:e$) >> -> Ast.list_of_expr e [] - | e -> [e] ] - in - if List.length el = List.length sl then - let env = List.combine sl el in - (new subst _loc env)#expr e - else - incorrect_number _loc el sl ] ] - ; - patt: LEVEL "simple" - [ [ UIDENT $x$; param = SELF -> - let pl = - match param with - [ <:patt< ($tup:p$) >> -> Ast.list_of_patt p [] - | p -> [p] ] - in - if List.length pl = List.length sl then - let env = List.combine sl pl in - let p = substp _loc env e in - (new reloc _loc)#patt p - else - incorrect_number _loc pl sl ] ] - ; - END - | None -> () ]; - defined.val := [(x, eo) :: defined.val]; - }; - - value undef x = - try - do { - let eo = List.assoc x defined.val in - match eo with - [ Some ([], _) -> - do { - DELETE_RULE Gram expr: UIDENT $x$ END; - DELETE_RULE Gram patt: UIDENT $x$ END; - } - | Some (_, _) -> - do { - DELETE_RULE Gram expr: UIDENT $x$; SELF END; - DELETE_RULE Gram patt: UIDENT $x$; SELF END; - } - | None -> () ]; - defined.val := list_remove x defined.val; - } - with - [ Not_found -> () ]; - - value parse_def s = - match Gram.parse_string expr (Loc.mk "") s with - [ <:expr< $uid:n$ >> -> define None n - | <:expr< $uid:n$ = $e$ >> -> define (Some ([],e)) n - | _ -> invalid_arg s ]; - - (* This is a list of directories to search for INCLUDE statements. *) - value include_dirs = ref []; - - (* Add something to the above, make sure it ends with a slash. *) - value add_include_dir str = - if str <> "" then - let str = - if String.get str ((String.length str)-1) = '/' - then str else str ^ "/" - in include_dirs.val := include_dirs.val @ [str] - else (); - - value parse_include_file rule = - let dir_ok file dir = Sys.file_exists (dir ^ file) in - fun file -> - let file = - try (List.find (dir_ok file) (include_dirs.val @ ["./"])) ^ file - with [ Not_found -> file ] - in - let ch = open_in file in - let st = Stream.of_channel ch in - Gram.parse rule (Loc.mk file) st; - - value rec execute_macro nil cons = - fun - [ SdStr i -> i - | SdDef x eo -> do { define eo x; nil } - | SdUnd x -> do { undef x; nil } - | SdITE b l1 l2 -> execute_macro_list nil cons (if b then l1 else l2) - | SdLazy l -> Lazy.force l ] - - and execute_macro_list nil cons = fun - [ [] -> nil - | [hd::tl] -> (* The evaluation order is important here *) - let il1 = execute_macro nil cons hd in - let il2 = execute_macro_list nil cons tl in - cons il1 il2 ] - ; - - (* Stack of conditionals. *) - value stack = Stack.create () ; - - (* Make an SdITE value by extracting the result of the test from the stack. *) - value make_SdITE_result st1 st2 = - let test = Stack.pop stack in - SdITE test st1 st2 ; - - type branch = [ Then | Else ]; - - (* Execute macro only if it belongs to the currently active branch. *) - value execute_macro_if_active_branch _loc nil cons branch macro_def = - let test = Stack.top stack in - let item = - if (test && branch=Then) || ((not test) && branch=Else) then - execute_macro nil cons macro_def - else (* ignore the macro *) - nil - in SdStr(item) - ; - - EXTEND Gram - GLOBAL: expr patt str_item sig_item; - str_item: FIRST - [ [ x = macro_def -> - execute_macro <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) x ] ] - ; - sig_item: FIRST - [ [ x = macro_def_sig -> - execute_macro <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) x ] ] - ; - macro_def: - [ [ "DEFINE"; i = uident; def = opt_macro_value -> SdDef i def - | "UNDEF"; i = uident -> SdUnd i - | "IFDEF"; uident_eval_ifdef; "THEN"; st1 = smlist_then; st2 = else_macro_def -> - make_SdITE_result st1 st2 - | "IFNDEF"; uident_eval_ifndef; "THEN"; st1 = smlist_then; st2 = else_macro_def -> - make_SdITE_result st1 st2 - | "INCLUDE"; fname = STRING -> - SdLazy (lazy (parse_include_file str_items fname)) ] ] - ; - macro_def_sig: - [ [ "DEFINE"; i = uident -> SdDef i None - | "UNDEF"; i = uident -> SdUnd i - | "IFDEF"; uident_eval_ifdef; "THEN"; sg1 = sglist_then; sg2 = else_macro_def_sig -> - make_SdITE_result sg1 sg2 - | "IFNDEF"; uident_eval_ifndef; "THEN"; sg1 = sglist_then; sg2 = else_macro_def_sig -> - make_SdITE_result sg1 sg2 - | "INCLUDE"; fname = STRING -> - SdLazy (lazy (parse_include_file sig_items fname)) ] ] - ; - uident_eval_ifdef: - [ [ i = uident -> Stack.push (is_defined i) stack ]] - ; - uident_eval_ifndef: - [ [ i = uident -> Stack.push (not (is_defined i)) stack ]] - ; - else_macro_def: - [ [ "ELSE"; st = smlist_else; endif -> st - | endif -> [] ] ] - ; - else_macro_def_sig: - [ [ "ELSE"; st = sglist_else; endif -> st - | endif -> [] ] ] - ; - else_expr: - [ [ "ELSE"; e = expr; endif -> e - | endif -> <:expr< () >> ] ] - ; - smlist_then: - [ [ sml = LIST1 [ d = macro_def; semi -> - execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Then d - | si = str_item; semi -> SdStr si ] -> sml ] ] - ; - smlist_else: - [ [ sml = LIST1 [ d = macro_def; semi -> - execute_macro_if_active_branch _loc <:str_item<>> (fun a b -> <:str_item< $a$; $b$ >>) Else d - | si = str_item; semi -> SdStr si ] -> sml ] ] - ; - sglist_then: - [ [ sgl = LIST1 [ d = macro_def_sig; semi -> - execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Then d - | si = sig_item; semi -> SdStr si ] -> sgl ] ] - ; - sglist_else: - [ [ sgl = LIST1 [ d = macro_def_sig; semi -> - execute_macro_if_active_branch _loc <:sig_item<>> (fun a b -> <:sig_item< $a$; $b$ >>) Else d - | si = sig_item; semi -> SdStr si ] -> sgl ] ] - ; - endif: - [ [ "END" -> () - | "ENDIF" -> () ] ] - ; - opt_macro_value: - [ [ "("; pl = LIST1 [ x = LIDENT -> x ] SEP ","; ")"; "="; e = expr -> Some (pl, e) - | "="; e = expr -> Some ([], e) - | -> None ] ] - ; - expr: LEVEL "top" - [ [ "IFDEF"; i = uident; "THEN"; e1 = expr; e2 = else_expr -> - if is_defined i then e1 else e2 - | "IFNDEF"; i = uident; "THEN"; e1 = expr; e2 = else_expr -> - if is_defined i then e2 else e1 - | "DEFINE"; i = LIDENT; "="; def = expr; "IN"; body = expr -> - (new subst _loc [(i, def)])#expr body ] ] - ; - patt: - [ [ "IFDEF"; i = uident; "THEN"; p1 = patt; "ELSE"; p2 = patt; endif -> - if is_defined i then p1 else p2 - | "IFNDEF"; i = uident; "THEN"; p1 = patt; "ELSE"; p2 = patt; endif -> - if is_defined i then p2 else p1 ] ] - ; - uident: - [ [ i = UIDENT -> i ] ] - ; - (* dirty hack to allow polymorphic variants using the introduced keywords. *) - expr: BEFORE "simple" - [ [ "`"; kwd = [ "IFDEF" | "IFNDEF" | "THEN" | "ELSE" | "END" | "ENDIF" - | "DEFINE" | "IN" ] -> <:expr< `$uid:kwd$ >> - | "`"; s = a_ident -> <:expr< ` $s$ >> ] ] - ; - (* idem *) - patt: BEFORE "simple" - [ [ "`"; kwd = [ "IFDEF" | "IFNDEF" | "THEN" | "ELSE" | "END" | "ENDIF" ] -> - <:patt< `$uid:kwd$ >> - | "`"; s = a_ident -> <:patt< ` $s$ >> ] ] - ; - END; - - Options.add "-D" (Arg.String parse_def) - " Define for IFDEF instruction."; - Options.add "-U" (Arg.String undef) - " Undefine for IFDEF instruction."; - Options.add "-I" (Arg.String add_include_dir) - " Add a directory to INCLUDE search path."; - -end; - -let module M = Register.OCamlSyntaxExtension Id Make in (); - -module MakeNothing (AstFilters : Camlp4.Sig.AstFilters) = struct - open AstFilters; - open Ast; - - (* Remove NOTHING and expanse __FILE__ and __LOCATION__ *) - value map_expr = - fun - [ <:expr< $e$ NOTHING >> | <:expr< fun $ <:patt< NOTHING >> $ -> $e$ >> -> e - | <:expr@_loc< $lid:"__FILE__"$ >> -> <:expr< $`str:Loc.file_name _loc$ >> - | <:expr@_loc< $lid:"__LOCATION__"$ >> -> - let (a, b, c, d, e, f, g, h) = Loc.to_tuple _loc in - <:expr< Loc.of_tuple - ($`str:a$, $`int:b$, $`int:c$, $`int:d$, - $`int:e$, $`int:f$, $`int:g$, - $if h then <:expr< True >> else <:expr< False >> $) >> - | e -> e]; - - register_str_item_filter (Ast.map_expr map_expr)#str_item; - -end; - -let module M = Camlp4.Register.AstFilter Id MakeNothing in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.ml b/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.ml deleted file mode 100644 index eace67b4..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.ml +++ /dev/null @@ -1,25 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open PreCast; -let module Gram = MakeGram Lexer in -let module M1 = OCamlInitSyntax.Make Ast Gram Quotation in -let module M2 = Camlp4OCamlRevisedParser.Make M1 in -let module M3 = Camlp4OCamlParser.Make M2 in -let module M3 = Camlp4QuotationCommon.Make M3 Syntax.AntiquotSyntax in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml deleted file mode 100644 index d32fad9b..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml +++ /dev/null @@ -1,720 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - -module Id : Sig.Id = struct - value name = "Camlp4OCamlParser"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - Camlp4_config.constructors_arity.val := False; - - (*FIXME remove this and use OCaml ones *) - value bigarray_set _loc var newval = - match var with - [ <:expr< Bigarray.Array1.get $arr$ $c1$ >> -> - Some <:expr< Bigarray.Array1.set $arr$ $c1$ $newval$ >> - | <:expr< Bigarray.Array2.get $arr$ $c1$ $c2$ >> -> - Some <:expr< Bigarray.Array2.set $arr$ $c1$ $c2$ $newval$ >> - | <:expr< Bigarray.Array3.get $arr$ $c1$ $c2$ $c3$ >> -> - Some <:expr< Bigarray.Array3.set $arr$ $c1$ $c2$ $c3$ $newval$ >> - | <:expr< Bigarray.Genarray.get $arr$ [| $coords$ |] >> -> - Some <:expr< Bigarray.Genarray.set $arr$ [| $coords$ |] $newval$ >> - | _ -> None ]; - value mk_anti ?(c = "") n s = "\\$"^n^c^":"^s; - (*FIXME*) - - value conc_seq e1 e2 = - match (e1, e2) with - [ (<:expr@_loc< do { $e1$ } >>, <:expr< do { $e2$ } >>) -> - <:expr< do { $e1$; $e2$ } >> - | (<:expr@_loc< do { $e1$ } >>, _) -> - <:expr< do { $e1$; $e2$ } >> - | (_, <:expr@_loc< do { $e2$ } >>) -> - <:expr< do { $e1$; $e2$ } >> - | _ -> - let _loc = - Loc.merge (Ast.loc_of_expr e1) - (Ast.loc_of_expr e2) in - <:expr< do { $e1$; $e2$ } >> ]; - - value stream_peek_nth n strm = - loop n (Stream.npeek n strm) where rec loop n = - fun - [ [] -> None - | [(x, _)] -> if n == 1 then Some x else None - | [_ :: l] -> loop (n - 1) l ] - ; - - value test_not_dot_nor_lparen = - Gram.Entry.of_parser "test_not_dot_nor_lparen" (fun strm -> - match Stream.peek strm with - [ Some (KEYWORD ("."|"("),_) -> raise Stream.Failure - | _ -> () ]); - - (* horrible hacks to be able to parse class_types *) - - value test_ctyp_minusgreater = - Gram.Entry.of_parser "test_ctyp_minusgreater" - (fun strm -> - let rec skip_simple_ctyp n = - match stream_peek_nth n strm with - [ Some (KEYWORD "->") -> n - | Some (KEYWORD ("[" | "[<")) -> - skip_simple_ctyp (ignore_upto "]" (n + 1) + 1) - | Some (KEYWORD "(") -> skip_simple_ctyp (ignore_upto ")" (n + 1) + 1) - | Some - (KEYWORD - ("as" | "'" | ":" | "*" | "." | "#" | "<" | ">" | ".." | ";" | - "_" | "?")) -> - skip_simple_ctyp (n + 1) - | Some (LIDENT _ | UIDENT _) -> - skip_simple_ctyp (n + 1) - | Some _ | None -> raise Stream.Failure ] - and ignore_upto end_kwd n = - match stream_peek_nth n strm with - [ Some (KEYWORD prm) when prm = end_kwd -> n - | Some (KEYWORD ("[" | "[<")) -> - ignore_upto end_kwd (ignore_upto "]" (n + 1) + 1) - | Some (KEYWORD "(") -> ignore_upto end_kwd (ignore_upto ")" (n + 1) + 1) - | Some _ -> ignore_upto end_kwd (n + 1) - | None -> raise Stream.Failure ] - in - match Stream.peek strm with - [ Some ((KEYWORD "[" | LIDENT _ | UIDENT _), _) -> skip_simple_ctyp 1 - | Some (KEYWORD "object", _) -> raise Stream.Failure - | _ -> 1 ]) - ; - - value lident_colon = - Gram.Entry.of_parser "lident_colon" - (fun strm -> - match Stream.npeek 2 strm with - [ [(LIDENT i, _); (KEYWORD ":", _)] -> - do { Stream.junk strm; Stream.junk strm; i } - | _ -> raise Stream.Failure ]) - ; - - value rec is_ident_constr_call = - fun - [ <:ident< $uid:_$ >> -> True - | <:ident< $_$.$i$ >> -> is_ident_constr_call i - | _ -> False ]; - - value rec is_expr_constr_call = - fun - [ <:expr< $id:i$ >> -> is_ident_constr_call i - | <:expr< `$_$ >> -> True - | <:expr< $_$.$e$ >> -> is_expr_constr_call e - | <:expr@_loc< $e$ $_$ >> -> - let res = is_expr_constr_call e in - if (not Camlp4_config.constructors_arity.val) && res then - Loc.raise _loc (Stream.Error "currified constructor") - else res - | _ -> False ]; - - DELETE_RULE Gram expr: SELF; "where"; opt_rec; let_binding END; - DELETE_RULE Gram value_let: "value" END; - DELETE_RULE Gram value_val: "value" END; - DELETE_RULE Gram str_item: value_let; opt_rec; binding END; - DELETE_RULE Gram module_type: "'"; a_ident END; - DELETE_RULE Gram module_type: SELF; SELF; dummy END; - DELETE_RULE Gram module_type: SELF; "."; SELF END; - DELETE_RULE Gram label_expr: label_longident; fun_binding END; - 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: "fun"; "["; LIST0 match_case0 SEP "|"; "]" END; - DELETE_RULE Gram expr: "if"; SELF; "then"; SELF; "else"; SELF END; - DELETE_RULE Gram expr: "do"; do_sequence END; - DELETE_RULE Gram expr: SELF; SELF END; - DELETE_RULE Gram expr: "new"; class_longident END; - DELETE_RULE Gram expr: "["; sem_expr_for_list; "::"; expr; "]" END; - DELETE_RULE Gram expr: "{"; label_expr_list; "}" END; - DELETE_RULE Gram expr: "{"; "("; SELF; ")"; "with"; label_expr_list; "}" END; - DELETE_RULE Gram expr: "("; SELF; ","; comma_expr; ")" END; - DELETE_RULE Gram expr: SELF; ":="; SELF; dummy END; - DELETE_RULE Gram expr: "~"; a_LIDENT; ":"; SELF END; - DELETE_RULE Gram expr: "?"; a_LIDENT; ":"; SELF END; - DELETE_RULE Gram constructor_declarations: a_UIDENT; ":"; ctyp END; - (* Some other DELETE_RULE are after the grammar *) - - value clear = Gram.Entry.clear; - clear ctyp; - clear patt; - clear a_UIDENT; - clear type_longident_and_parameters; - clear type_parameters; - clear ipatt; - clear labeled_ipatt; - clear semi; - clear do_sequence; - clear type_kind; - clear constructor_arg_list; - clear poly_type; - clear class_name_and_param; - clear class_longident_and_param; - clear class_type_longident_and_param; - clear class_type_plus; - clear type_constraint; - clear comma_patt; - clear sequence; - clear sem_expr_for_list; - clear sem_expr; - clear label_declaration; - clear star_ctyp; - clear match_case; - clear with_constr; - clear package_type; - clear top_phrase; - - let apply () = EXTEND Gram - GLOBAL: - a_CHAR a_FLOAT a_INT a_INT32 a_INT64 a_LABEL a_LIDENT - a_NATIVEINT a_OPTLABEL a_STRING a_UIDENT a_ident - amp_ctyp and_ctyp match_case match_case0 match_case_quot binding binding_quot - class_declaration class_description class_expr class_expr_quot - class_fun_binding class_fun_def class_info_for_class_expr - class_info_for_class_type class_longident class_longident_and_param - class_name_and_param class_sig_item class_sig_item_quot class_signature - class_str_item class_str_item_quot class_structure class_type - class_type_declaration class_type_longident - class_type_longident_and_param class_type_plus class_type_quot - comma_ctyp comma_expr comma_ipatt comma_patt comma_type_parameter - constrain constructor_arg_list constructor_declaration - constructor_declarations ctyp ctyp_quot cvalue_binding direction_flag - dummy eq_expr expr expr_eoi expr_quot fun_binding - fun_def ident ident_quot implem interf ipatt ipatt_tcon label - label_declaration label_declaration_list label_expr label_expr_list - label_longident label_patt_list meth_list - labeled_ipatt let_binding module_binding module_binding0 - module_binding_quot module_declaration module_expr module_expr_quot - module_longident module_longident_with_app module_rec_declaration - module_type module_type_quot more_ctyp name_tags opt_as_lident - opt_class_self_patt opt_class_self_type - opt_comma_ctyp opt_dot_dot opt_eq_ctyp opt_expr - opt_meth_list opt_mutable opt_polyt opt_private opt_rec - opt_virtual opt_when_expr patt patt_as_patt_opt patt_eoi - patt_quot patt_tcon phrase poly_type row_field - sem_expr sem_expr_for_list sem_patt sem_patt_for_list semi sequence - sig_item sig_item_quot sig_items star_ctyp str_item str_item_quot - str_items top_phrase type_constraint type_declaration - type_ident_and_parameters type_kind type_longident - type_longident_and_parameters type_parameter type_parameters typevars - use_file val_longident value_let value_val with_constr with_constr_quot - infixop0 infixop1 infixop2 infixop3 infixop4 do_sequence package_type - ; - sem_expr: - [ [ e1 = expr LEVEL "top"; ";"; e2 = SELF -> <:expr< $e1$; $e2$ >> - | e = expr LEVEL "top"; ";" -> e - | e = expr LEVEL "top" -> e ] ] - ; - sequence: - [ [ e = sem_expr -> e ] ] - ; - do_sequence: - [ [ seq = sequence; "done" -> seq - ] ] - ; - sem_expr_for_list: - [ [ e = expr LEVEL "top"; ";"; el = SELF -> fun acc -> <:expr< [ $e$ :: $el acc$ ] >> - | e = expr LEVEL "top"; ";" -> fun acc -> <:expr< [ $e$ :: $acc$ ] >> - | e = expr LEVEL "top" -> fun acc -> <:expr< [ $e$ :: $acc$ ] >> - ] ] - ; - str_item: - [ "top" - [ "let"; r = opt_rec; bi = binding; "in"; x = expr -> - <:str_item< let $rec:r$ $bi$ in $x$ >> - | "let"; r = opt_rec; bi = binding -> - match bi with - [ <:binding< _ = $e$ >> -> <:str_item< $exp:e$ >> - | _ -> <: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$ >> - ] ] - ; - seq_expr: - [ [ e1 = expr LEVEL "top"; ";"; e2 = SELF -> - conc_seq e1 e2 - | e1 = expr LEVEL "top"; ";" -> e1 - | e1 = expr LEVEL "top" -> e1 ] ]; - expr: BEFORE "top" - [ ";" [ e = seq_expr -> e ] ]; - expr: LEVEL "top" - [ [ "let"; r = opt_rec; bi = binding; "in"; - x = expr LEVEL ";" -> - <:expr< let $rec:r$ $bi$ in $x$ >> - | "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$ >> - | "function"; a = match_case -> - <:expr< fun [ $a$ ] >> - | "if"; e1 = SELF; "then"; e2 = expr LEVEL "top"; - "else"; e3 = expr LEVEL "top" -> - <:expr< if $e1$ then $e2$ else $e3$ >> - | "if"; e1 = SELF; "then"; e2 = expr LEVEL "top" -> - <:expr< if $e1$ then $e2$ else () >> - ] ]; - expr: BEFORE "||" - [ "," - [ e1 = SELF; ","; e2 = comma_expr -> - <:expr< ( $e1$, $e2$ ) >> ] - | ":=" NONA - [ e1 = SELF; ":="; e2 = expr LEVEL "top" -> - <:expr< $e1$.val := $e2$ >> - | e1 = SELF; "<-"; e2 = expr LEVEL "top" -> - match bigarray_set _loc e1 e2 with - [ Some e -> e - | None -> <:expr< $e1$ := $e2$ >> ] - ] ]; - expr: AFTER "^" - [ "::" RIGHTA - [ e1 = SELF; "::"; e2 = SELF -> <:expr< [$e1$ :: $e2$] >> ] - ]; - expr: LEVEL "apply" (* LEFTA *) - [ [ e1 = SELF; e2 = SELF -> - match (is_expr_constr_call e1, e2) with - [ (True, <:expr< ( $tup:e$ ) >>) -> - List.fold_left (fun e1 e2 -> <:expr< $e1$ $e2$ >>) e1 - (Ast.list_of_expr e []) - | _ -> <:expr< $e1$ $e2$ >> ] - ] ]; - expr: LEVEL "simple" (* LEFTA *) - [ [ "false" -> <:expr< False >> - | "true" -> <:expr< True >> - | "{"; lel = TRY [lel = label_expr_list; "}" -> lel] -> - <:expr< { $lel$ } >> - | "{"; e = TRY [e = expr LEVEL "."; "with" -> e]; lel = label_expr_list; "}" -> - <:expr< { ($e$) with $lel$ } >> - | "new"; i = class_longident -> <:expr< new $i$ >> - ] ] - ; - val_longident: - [ [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> - | i = a_LIDENT -> <:ident< $lid:i$ >> - | `ANTIQUOT (""|"id"|"anti"|"list" as n) s; "."; i = SELF -> - <:ident< $anti:mk_anti ~c:"ident" n s$.$i$ >> - | i = a_UIDENT; "."; j = SELF -> <:ident< $uid:i$.$j$ >> ] ] - ; - match_case: - [ [ OPT "|"; l = LIST1 match_case0 SEP "|" -> Ast.mcOr_of_list l ] ] - ; - patt_constr: - [ [ i = module_longident -> <:patt< $id:i$ >> - | "`"; s = a_ident -> <:patt< `$s$ >> ] ] - ; - (* Patterns *) - patt: - [ "as" LEFTA - [ p1 = SELF; "as"; i = a_LIDENT -> <:patt< ($p1$ as $lid:i$) >> ] - | "|" LEFTA - [ p1 = SELF; "|"; p2 = SELF -> <:patt< $p1$ | $p2$ >> ] - | "," - [ p = SELF; ","; pl = (*FIXME comma_patt*) LIST1 NEXT SEP "," -> - <:patt< ( $p$, $Ast.paCom_of_list pl$ ) >> ] - | "::" RIGHTA - [ p1 = SELF; "::"; p2 = SELF -> <:patt< [$p1$ :: $p2$] >> ] - | "apply" RIGHTA - [ p1 = patt_constr; p2 = SELF -> - match p2 with - [ <:patt< ( $tup:p$ ) >> -> - List.fold_left (fun p1 p2 -> <:patt< $p1$ $p2$ >>) p1 - (Ast.list_of_patt p []) - | _ -> <:patt< $p1$ $p2$ >> ] - | "lazy"; p = SELF -> <:patt< lazy $p$ >> - | `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | p = patt_constr -> p ] - | "simple" - [ `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | `ANTIQUOT ("tup" as n) s -> <:patt< ($tup:<:patt< $anti:mk_anti ~c:"patt" n s$ >>$) >> - | `ANTIQUOT ("`bool" as n) s -> <:patt< $anti:mk_anti n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.patt_tag - | i = ident -> <:patt< $id:i$ >> - | s = a_INT -> <:patt< $int:s$ >> - | s = a_INT32 -> <:patt< $int32:s$ >> - | s = a_INT64 -> <:patt< $int64:s$ >> - | s = a_NATIVEINT -> <:patt< $nativeint:s$ >> - | "-"; s = a_INT -> <:patt< $int:"-" ^ s$ >> - | "-"; s = a_INT32 -> <:patt< $int32:"-" ^ s$ >> - | "-"; s = a_INT64 -> <:patt< $int64:"-" ^ s$ >> - | "-"; s = a_NATIVEINT -> <:patt< $nativeint:"-" ^ s$ >> - | "-"; s = a_FLOAT -> <:patt< $flo:"-" ^ s$ >> - | s = a_FLOAT -> <:patt< $flo:s$ >> - | s = a_STRING -> <:patt< $str:s$ >> - | s1 = a_CHAR; ".."; s2 = a_CHAR -> <:patt< $chr:s1$ .. $chr:s2$ >> - | s = a_CHAR -> <:patt< $chr:s$ >> - | "false" -> <:patt< False >> - | "true" -> <:patt< True >> - | "["; "]" -> <:patt< [] >> - | "["; mk_list = sem_patt_for_list; "::"; last = patt; "]" -> - mk_list last - | "["; mk_list = sem_patt_for_list; "]" -> - mk_list <:patt< [] >> - | "[|"; "|]" -> <:patt< [||] >> - | "[|"; pl = sem_patt; "|]" -> <:patt< [| $pl$ |] >> - | "{"; pl = label_patt_list; "}" -> <:patt< { $pl$ } >> - | "("; ")" -> <:patt< () >> - | "("; "module"; m = a_UIDENT; ")" -> <:patt< (module $m$) >> - | "("; "module"; m = a_UIDENT; ":"; pt = package_type; ")" -> - <:patt< ((module $m$) : (module $pt$)) >> - | "("; p = patt; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> - | "("; p = patt; ")" -> <:patt< $p$ >> - | "_" -> <:patt< _ >> - | "`"; s = a_ident -> <:patt< ` $s$ >> - | "#"; i = type_longident -> <:patt< # $i$ >> ] ] - ; - comma_expr: - [ [ e1 = expr LEVEL ":="; ","; e2 = SELF -> <:expr< $e1$, $e2$ >> - | e1 = expr LEVEL ":=" -> e1 ] ] - ; - (* comma_patt: - [ [ p1 = SELF; ","; p2 = SELF -> <:patt< $p1$, $p2$ >> - | p = patt LEVEL ".." -> p ] ] - ; *) - type_constraint: - [ [ "constraint" -> () ] ] - ; - with_constr: - [ LEFTA - [ wc1 = SELF; "and"; wc2 = SELF -> <:with_constr< $wc1$ and $wc2$ >> - | `ANTIQUOT (""|"with_constr"|"anti"|"list" as n) s -> - <:with_constr< $anti:mk_anti ~c:"with_constr" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.with_constr_tag - | "type"; `ANTIQUOT (""|"typ"|"anti" as n) s; "="; t = opt_private_ctyp -> - <:with_constr< type $anti:mk_anti ~c:"ctyp" n s$ = $t$ >> - | "type"; t1 = type_longident_and_parameters; "="; t2 = opt_private_ctyp -> - <:with_constr< type $t1$ = $t2$ >> - | "module"; i1 = module_longident; "="; i2 = module_longident_with_app -> - <:with_constr< module $i1$ = $i2$ >> - | "type"; `ANTIQUOT (""|"typ"|"anti" as n) s; ":="; t = opt_private_ctyp -> - <:with_constr< type $anti:mk_anti ~c:"ctyp" n s$ := $t$ >> - | "type"; t1 = type_longident_and_parameters; ":="; t2 = opt_private_ctyp -> - <:with_constr< type $t1$ := $t2$ >> - | "module"; i1 = module_longident; ":="; i2 = module_longident_with_app -> - <:with_constr< module $i1$ := $i2$ >> ] ] - ; - package_type: - [ [ i = module_longident_with_app -> <:module_type< $id:i$ >> - | i = module_longident_with_app; "with"; cs = package_type_cstrs -> - <:module_type< $id:i$ with $cs$ >> - ] ] - ; - package_type_cstr: - [ [ "type"; i = ident; "="; ty = ctyp -> - <:with_constr< type $id:i$ = $ty$ >> - ] ] - ; - package_type_cstrs: - [ [ c = package_type_cstr -> c - | c = package_type_cstr; "and"; cs = package_type_cstrs -> - <:with_constr< $c$ and $cs$ >> - ] ] - ; - opt_private_ctyp: - [ [ "private"; t = ctyp -> <:ctyp< private $t$ >> - | t = ctyp -> t ] ] - ; - class_type_plus: - [ [ i = lident_colon; t = ctyp LEVEL "star"; "->"; ct = SELF -> - <:class_type< [ ~ $i$ : $t$ ] -> $ct$ >> - | "?"; i = a_LIDENT; ":"; t = ctyp LEVEL "star"; "->"; ct = SELF -> - <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> - | i = OPTLABEL (* FIXME inline a_OPTLABEL *); t = ctyp LEVEL "star"; "->"; ct = SELF -> - <:class_type< [ ? $i$ : $t$ ] -> $ct$ >> - | test_ctyp_minusgreater; t = ctyp LEVEL "star"; "->"; ct = SELF -> - <:class_type< [ $t$ ] -> $ct$ >> - | ct = class_type -> ct ] ] - ; - class_type_longident_and_param: - [ [ "["; t = comma_ctyp; "]"; i = class_type_longident -> - <:class_type< $id:i$ [ $t$ ] >> - | i = class_type_longident -> <:class_type< $id:i$ >> ] ] - ; - class_longident_and_param: - [ [ "["; t = comma_ctyp; "]"; ci = class_longident -> - <:class_expr< $id:ci$ [ $t$ ] >> - | ci = class_longident -> <:class_expr< $id:ci$ >> - ] ] - ; - class_name_and_param: - [ [ "["; x = comma_type_parameter; "]"; i = a_LIDENT -> (i, x) - | i = a_LIDENT -> (i, <:ctyp<>>) - ] ] - ; - ctyp: - [ [ t1 = SELF; "as"; "'"; i = a_ident -> <:ctyp< $t1$ as '$i$ >> ] - | "arrow" RIGHTA - [ t1 = SELF; "->"; t2 = SELF -> <:ctyp< $t1$ -> $t2$ >> - | i = TRY [i = a_LIDENT; ":" -> i]; t1 = ctyp LEVEL "star"; "->"; t2 = SELF -> - <:ctyp< ( ~ $i$ : $t1$ ) -> $t2$ >> - | i = a_OPTLABEL; t1 = ctyp LEVEL "star"; "->"; t2 = SELF -> - <:ctyp< ( ? $i$ : $t1$ ) -> $t2$ >> - | "?"; i = a_LIDENT; ":"; t1 = ctyp LEVEL "star"; "->"; t2 = SELF -> - <:ctyp< ( ? $i$ : $t1$ ) -> $t2$ >> ] - | "star" - [ t = SELF; "*"; tl = star_ctyp -> - <:ctyp< ( $t$ * $tl$ ) >> ] - | "ctyp1" - [ t1 = SELF; t2 = SELF -> <:ctyp< $t2$ $t1$ >> ] - | "ctyp2" - [ t1 = SELF; "."; t2 = SELF -> - try <:ctyp< $id:Ast.ident_of_ctyp t1$.$id:Ast.ident_of_ctyp t2$ >> - with [ Invalid_argument s -> raise (Stream.Error s) ] - | t1 = SELF; "("; t2 = SELF; ")" -> - let t = <:ctyp< $t1$ $t2$ >> in - try <:ctyp< $id:Ast.ident_of_ctyp t$ >> - with [ Invalid_argument s -> raise (Stream.Error s) ] ] - | "simple" - [ "'"; i = a_ident -> <:ctyp< '$i$ >> - | "_" -> <:ctyp< _ >> - | i = a_LIDENT -> <:ctyp< $lid:i$ >> - | i = a_UIDENT -> <:ctyp< $uid:i$ >> - | `ANTIQUOT (""|"typ"|"anti" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("tup" as n) s -> - <:ctyp< ($tup:<:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >>$) >> - | `ANTIQUOT ("id" as n) s -> - <:ctyp< $id:<:ident< $anti:mk_anti ~c:"ident" n s$ >>$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | "("; t = SELF; ","; mk = comma_ctyp_app; ")"; - i = ctyp LEVEL "ctyp2" -> - mk <:ctyp< $i$ $t$ >> - | "("; t = SELF; ")" -> <:ctyp< $t$ >> - | "#"; i = class_longident -> <:ctyp< # $i$ >> - | "<"; t = opt_meth_list; ">" -> t - | "["; OPT "|"; rfl = row_field; "]" -> - <:ctyp< [ = $rfl$ ] >> - | "["; ">"; "]" -> <:ctyp< [ > $<:ctyp<>>$ ] >> - | "["; ">"; OPT "|"; rfl = row_field; "]" -> - <:ctyp< [ > $rfl$ ] >> - | "[<"; OPT "|"; rfl = row_field; "]" -> - <:ctyp< [ < $rfl$ ] >> - | "[<"; OPT "|"; rfl = row_field; ">"; ntl = name_tags; "]" -> - <:ctyp< [ < $rfl$ > $ntl$ ] >> - | "("; "module"; p = package_type; ")" -> <:ctyp< (module $p$) >> - ] ] - ; - 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$ >> - ] ] - ; - star_ctyp: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp*" n s$ >> - | t1 = ctyp LEVEL "ctyp1"; "*"; t2 = SELF -> - <:ctyp< $t1$ * $t2$ >> - | t = ctyp LEVEL "ctyp1" -> t - ] ] - ; - constructor_declarations: - [ [ s = a_UIDENT; ":"; t = constructor_arg_list ; "->" ; ret = ctyp -> - <:ctyp< $uid:s$ : ($t$ -> $ret$) >> - | s = a_UIDENT; ":"; ret = constructor_arg_list -> - match Ast.list_of_ctyp ret [] with - [ [c] -> <:ctyp< $uid:s$ : $c$ >> - | _ -> raise (Stream.Error "invalid generalized constructor type") ] - ] ] - ; - semi: - [ [ ";;" -> () | -> () ] ] - ; - ipatt: - [ [ p = patt -> p ] ] - ; - type_longident_and_parameters: - [ [ "("; tpl = type_parameters; ")"; i = type_longident -> - tpl <:ctyp< $id:i$ >> - | tp = type_parameter; i = type_longident -> - <:ctyp< $id:i$ $tp$ >> - | i = type_longident -> - <:ctyp< $id:i$ >> - ] ] - ; - type_parameters: - [ [ t1 = type_parameter; ","; t2 = SELF -> - fun acc -> t2 <:ctyp< $acc$ $t1$ >> - | t = type_parameter -> fun acc -> <:ctyp< $acc$ $t$ >> - ] ] - ; - - optional_type_parameter: - [ [ `ANTIQUOT (""|"typ"|"anti" as n) s -> <:ctyp< $anti:mk_anti n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | "+"; "_" -> Ast.TyAnP _loc - | "+"; "'"; i = a_ident -> <:ctyp< +'$lid:i$ >> - | "-"; "_" -> Ast.TyAnM _loc - | "-"; "'"; i = a_ident -> <:ctyp< -'$lid:i$ >> - | "_" -> Ast.TyAny _loc - | "'"; i = a_ident -> <:ctyp< '$lid:i$ >> - - ] ] - ; - - type_ident_and_parameters: - [ [ "("; tpl = LIST1 optional_type_parameter SEP ","; ")"; i = a_LIDENT -> (i, tpl) - | t = optional_type_parameter; i = a_LIDENT -> (i, [t]) - | i = a_LIDENT -> (i, []) - ] ] - ; - type_kind: - [ [ "private"; tk = type_kind -> <:ctyp< private $tk$ >> - | (x, t) = TRY [x = OPT "|"; t = constructor_declarations; - test_not_dot_nor_lparen -> (x, t)] -> - (* If there is no "|" and [t] is an antiquotation, - then it is not a sum type. *) - match (x, t) with - [ (None, Ast.TyAnt _) -> t - | _ -> <:ctyp< [ $t$ ] >> ] - | t = TRY ctyp -> <:ctyp< $t$ >> - | t = TRY ctyp; "="; "private"; tk = type_kind -> - <:ctyp< $t$ == private $tk$ >> - | t1 = TRY ctyp; "="; "{"; t2 = label_declaration_list; "}" -> - <:ctyp< $t1$ == { $t2$ } >> - | t1 = TRY ctyp; "="; OPT "|"; t2 = constructor_declarations -> - <:ctyp< $t1$ == [ $t2$ ] >> - | "{"; t = label_declaration_list; "}" -> - <:ctyp< { $t$ } >> ] ] - ; - ctyp_quot: - [ [ "private"; t = ctyp_quot -> <:ctyp< private $t$ >> - | "|"; t = constructor_declarations -> <:ctyp< [ $t$ ] >> - | x = more_ctyp; "="; y = ctyp_quot -> <:ctyp< $x$ == $y$ >> - | "{"; t = label_declaration_list; "}" -> <:ctyp< { $t$ } >> - ] ] - ; - module_expr: LEVEL "apply" - [ [ i = SELF; "("; j = SELF; ")" -> <:module_expr< $i$ $j$ >> ] ] - ; - ident_quot: LEVEL "apply" - [ [ i = SELF; "("; j = SELF; ")" -> <:ident< $i$ $j$ >> ] ] - ; - module_longident_with_app: LEVEL "apply" - [ [ i = SELF; "("; j = SELF; ")" -> <:ident< $i$ $j$ >> ] ] - ; - type_longident: LEVEL "apply" - [ [ i = SELF; "("; j = SELF; ")" -> <:ident< $i$ $j$ >> ] ] - ; - constructor_arg_list: - [ [ t1 = SELF; "*"; t2 = SELF -> <:ctyp< $t1$ and $t2$ >> - | t = ctyp LEVEL "ctyp1" -> t - ] ] - ; - value_let: - [ [ "let" -> () ] ] - ; - value_val: - [ [ "val" -> () ] ] - ; - label_declaration: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | s = a_LIDENT; ":"; t = poly_type -> <:ctyp< $lid:s$ : $t$ >> - | "mutable"; s = a_LIDENT; ":"; t = poly_type -> - <:ctyp< $lid:s$ : mutable $t$ >> - ] ] - ; - poly_type: - [ [ t1 = TRY [t = typevars; "." -> t]; t2 = ctyp -> - <:ctyp< ! $t1$ . $t2$ >> - | t = TRY ctyp -> t ] ] - ; - labeled_ipatt: - [ [ i = a_LABEL; p = patt LEVEL "simple" -> - <:patt< ~ $i$ : $p$ >> - | "~"; i = a_LIDENT -> <:patt< ~ $i$ >> - | "~"; "("; i = a_LIDENT; ")" -> - <:patt< ~ $i$ >> - | "~"; "("; i = a_LIDENT; ":"; t = ctyp; ")" -> - <:patt< ~ $i$ : ($lid:i$ : $t$) >> - | i = a_OPTLABEL; j = a_LIDENT -> (* ?a:b <> ?a : b *) - <:patt< ? $i$ : ($lid:j$) >> - | i = a_OPTLABEL; "_" -> - <:patt< ? $i$ : (_) >> - | i = a_OPTLABEL; "("; p = patt; ")" -> - <:patt< ? $i$ : ($p$) >> - | i = a_OPTLABEL; "("; p = patt; "="; e = expr; ")" -> - <:patt< ? $i$ : ( $p$ = $e$ ) >> - | i = a_OPTLABEL; "("; p = patt; ":"; t = ctyp; ")" -> - <:patt< ? $i$ : ( $p$ : $t$ ) >> - | i = a_OPTLABEL; "("; p = patt; ":"; t = ctyp; "="; - e = expr; ")" -> - <:patt< ? $i$ : ( $p$ : $t$ = $e$ ) >> - | "?"; i = a_LIDENT -> <:patt< ? $i$ >> - | "?"; "("; i = a_LIDENT; "="; e = expr; ")" -> - <:patt< ? ( $lid:i$ = $e$ ) >> - | "?"; "("; i = a_LIDENT; ":"; t = ctyp; "="; e = expr; ")" -> - <:patt< ? ( $lid:i$ : $t$ = $e$ ) >> - | "?"; "("; i = a_LIDENT; ")" -> - <:patt< ? $i$ >> - | "?"; "("; i = a_LIDENT; ":"; t = ctyp; ")" -> - <:patt< ? ( $lid:i$ : $t$ ) >> - | p = patt LEVEL "simple" -> p - ] ] - ; - label_expr: - [ [ i = label_longident; "="; e = expr LEVEL "top" -> - <:rec_binding< $i$ = $e$ >> ] ] - ; - a_UIDENT: - [ [ `ANTIQUOT (""|"uid" as n) s -> mk_anti n s - | `UIDENT "True" -> " True" - | `UIDENT "False" -> " False" - | `UIDENT s -> s - ] ] - ; - top_phrase: - [ [ "#"; n = a_LIDENT; dp = opt_expr; ";;" -> - Some <:str_item< # $n$ $dp$ >> - | l = LIST1 str_item; ";;" -> Some (Ast.stSem_of_list l) - | `EOI -> None - ] ] - ; - END in apply (); - - (* Some other DELETE_RULE are before the grammar *) - DELETE_RULE Gram module_longident_with_app: "("; SELF; ")" END; - DELETE_RULE Gram type_longident: "("; SELF; ")" END; - DELETE_RULE Gram ident_quot: "("; SELF; ")" END; - DELETE_RULE Gram module_longident_with_app: SELF; SELF END; - DELETE_RULE Gram type_longident: SELF; SELF END; - DELETE_RULE Gram ident_quot: SELF; SELF END; - DELETE_RULE Gram module_expr: SELF; SELF END; -end; -let module M = Register.OCamlSyntaxExtension Id Make in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml deleted file mode 100644 index 082ac836..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml +++ /dev/null @@ -1,60 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 1998-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - -open Camlp4; - -module Id : Sig.Id = struct - value name = "Camlp4OCamlParserParser"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - module M = Camlp4OCamlRevisedParserParser.Make Syntax; - open M; - - Gram.Entry.clear stream_expr; - Gram.Entry.clear stream_begin; - Gram.Entry.clear stream_end; - Gram.Entry.clear stream_quot; - Gram.Entry.clear parser_case_list; - - EXTEND Gram - stream_expr: - [ [ e = expr LEVEL "top" -> e ] ] - ; - stream_begin: - [ [ "[<" -> () ] ] - ; - stream_end: - [ [ ">]" -> () ] ] - ; - stream_quot: - [ [ "'" -> () ] ] - ; - parser_case_list: - [ [ OPT "|"; pcl = LIST1 parser_case SEP "|" -> pcl ] ] - ; - END; -end; - -let module M = Register.OCamlSyntaxExtension Id Make in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml deleted file mode 100644 index 85efa827..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml +++ /dev/null @@ -1,94 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: Original version - *) - -module Id = struct - value name = "Camlp4Reloaded"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - Gram.Entry.clear match_case; - Gram.Entry.clear semi; - - value mkseq _loc = - fun - [ <:expr< $_$; $_$ >> as e -> <:expr< do { $e$ } >> - | e -> e ] - ; - - DELETE_RULE Gram match_case0: patt_as_patt_opt; opt_when_expr; "->"; expr END; - - value revised = - try - (DELETE_RULE Gram expr: "if"; SELF; "then"; SELF; "else"; SELF END; True) - with [ Struct.Grammar.Delete.Rule_not_found _ -> begin - DELETE_RULE Gram expr: "if"; SELF; "then"; expr LEVEL "top"; "else"; expr LEVEL "top" END; - DELETE_RULE Gram expr: "if"; SELF; "then"; expr LEVEL "top" END; False - end ]; - - if revised then begin - DELETE_RULE Gram expr: "fun"; "["; LIST0 match_case0 SEP "|"; "]" END; - EXTEND Gram - expr: LEVEL "top" - [ [ "function"; a = match_case -> <:expr< fun [ $a$ ] >> ] ]; - END; - DELETE_RULE Gram value_let: "value" END; - DELETE_RULE Gram value_val: "value" END; - end else begin - DELETE_RULE Gram value_let: "let" END; - DELETE_RULE Gram value_val: "val" END; - end; - - EXTEND Gram - GLOBAL: match_case match_case0 expr value_let value_val semi; - - match_case: - [ [ OPT "|"; l = LIST1 match_case0 SEP "|"; "end" -> Ast.mcOr_of_list l - | "end" -> <:match_case<>> ] ] - ; - - match_case0: - [ [ p = patt_as_patt_opt; w = opt_when_expr; "->"; e = sequence -> - <:match_case< $p$ when $w$ -> $mkseq _loc e$ >> ] ] - ; - - expr: LEVEL "top" - [ [ "if"; e1 = sequence; "then"; e2 = sequence; "else"; e3 = sequence; "end" -> - <:expr< if $mkseq _loc e1$ then $mkseq _loc e2$ else $mkseq _loc e3$ >> - | "if"; e1 = sequence; "then"; e2 = sequence; "end" -> - <:expr< if $mkseq _loc e1$ then $mkseq _loc e2$ else () >> ] ] - ; - - value_let: - [ [ "val" -> () ] ] - ; - value_val: - [ [ "val" -> () ] ] - ; - semi: - [ [ ";;" -> () | ";" -> () | -> () ] ] - ; - END; - -end; - -let module M = Register.OCamlSyntaxExtension Id Make in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml deleted file mode 100644 index ffca6798..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ /dev/null @@ -1,1925 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -module Id = struct - value name = "Camlp4OCamlRevisedParser"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - (* Camlp4_config.constructors_arity.val := True; *) - Camlp4_config.constructors_arity.val := False; - - value help_sequences () = - do { - Printf.eprintf "\ -New syntax:\ -\n (e1; e2; ... ; en) OR begin e1; e2; ... ; en end\ -\n while e do e1; e2; ... ; en done\ -\n for v = v1 to/downto v2 do e1; e2; ... ; en done\ -\nOld syntax (still supported):\ -\n do {e1; e2; ... ; en}\ -\n while e do {e1; e2; ... ; en}\ -\n for v = v1 to/downto v2 do {e1; e2; ... ; en}\ -\nVery old (no more supported) syntax:\ -\n do e1; e2; ... ; en-1; return en\ -\n while e do e1; e2; ... ; en; done\ -\n for v = v1 to/downto v2 do e1; e2; ... ; en; done\ -\n"; - flush stderr; - exit 1 - } - ; - Options.add "-help_seq" (Arg.Unit help_sequences) - "Print explanations about new sequences and exit."; - - Gram.Entry.clear a_CHAR; - Gram.Entry.clear a_FLOAT; - Gram.Entry.clear a_INT; - Gram.Entry.clear a_INT32; - Gram.Entry.clear a_INT64; - Gram.Entry.clear a_LABEL; - Gram.Entry.clear a_LIDENT; - Gram.Entry.clear a_NATIVEINT; - Gram.Entry.clear a_OPTLABEL; - Gram.Entry.clear a_STRING; - Gram.Entry.clear a_UIDENT; - Gram.Entry.clear a_ident; - Gram.Entry.clear amp_ctyp; - Gram.Entry.clear and_ctyp; - Gram.Entry.clear match_case; - Gram.Entry.clear match_case0; - Gram.Entry.clear match_case_quot; - Gram.Entry.clear binding; - Gram.Entry.clear binding_quot; - Gram.Entry.clear rec_binding_quot; - Gram.Entry.clear class_declaration; - Gram.Entry.clear class_description; - Gram.Entry.clear class_expr; - Gram.Entry.clear class_expr_quot; - Gram.Entry.clear class_fun_binding; - Gram.Entry.clear class_fun_def; - Gram.Entry.clear class_info_for_class_expr; - Gram.Entry.clear class_info_for_class_type; - Gram.Entry.clear class_longident; - Gram.Entry.clear class_longident_and_param; - Gram.Entry.clear class_name_and_param; - Gram.Entry.clear class_sig_item; - Gram.Entry.clear class_sig_item_quot; - Gram.Entry.clear class_signature; - Gram.Entry.clear class_str_item; - Gram.Entry.clear class_str_item_quot; - Gram.Entry.clear class_structure; - Gram.Entry.clear class_type; - Gram.Entry.clear class_type_declaration; - Gram.Entry.clear class_type_longident; - Gram.Entry.clear class_type_longident_and_param; - Gram.Entry.clear class_type_plus; - Gram.Entry.clear class_type_quot; - Gram.Entry.clear comma_ctyp; - Gram.Entry.clear comma_expr; - Gram.Entry.clear comma_ipatt; - Gram.Entry.clear comma_patt; - Gram.Entry.clear comma_type_parameter; - Gram.Entry.clear constrain; - Gram.Entry.clear constructor_arg_list; - Gram.Entry.clear constructor_declaration; - Gram.Entry.clear constructor_declarations; - Gram.Entry.clear ctyp; - Gram.Entry.clear ctyp_quot; - Gram.Entry.clear cvalue_binding; - Gram.Entry.clear direction_flag; - Gram.Entry.clear dummy; - Gram.Entry.clear eq_expr; - Gram.Entry.clear expr; - Gram.Entry.clear expr_eoi; - Gram.Entry.clear expr_quot; - Gram.Entry.clear field_expr; - Gram.Entry.clear field_expr_list; - Gram.Entry.clear fun_binding; - Gram.Entry.clear fun_def; - Gram.Entry.clear ident; - Gram.Entry.clear ident_quot; - Gram.Entry.clear implem; - Gram.Entry.clear interf; - Gram.Entry.clear ipatt; - Gram.Entry.clear ipatt_tcon; - Gram.Entry.clear label; - Gram.Entry.clear label_declaration; - Gram.Entry.clear label_declaration_list; - Gram.Entry.clear label_expr_list; - Gram.Entry.clear label_expr; - Gram.Entry.clear label_ipatt; - Gram.Entry.clear label_ipatt_list; - Gram.Entry.clear label_longident; - Gram.Entry.clear label_patt; - Gram.Entry.clear label_patt_list; - Gram.Entry.clear labeled_ipatt; - Gram.Entry.clear let_binding; - Gram.Entry.clear meth_list; - Gram.Entry.clear meth_decl; - Gram.Entry.clear module_binding; - Gram.Entry.clear module_binding0; - Gram.Entry.clear module_binding_quot; - Gram.Entry.clear module_declaration; - Gram.Entry.clear module_expr; - Gram.Entry.clear module_expr_quot; - Gram.Entry.clear module_longident; - Gram.Entry.clear module_longident_with_app; - Gram.Entry.clear module_rec_declaration; - Gram.Entry.clear module_type; - Gram.Entry.clear module_type_quot; - Gram.Entry.clear more_ctyp; - Gram.Entry.clear name_tags; - Gram.Entry.clear opt_as_lident; - Gram.Entry.clear opt_class_self_patt; - Gram.Entry.clear opt_class_self_type; - Gram.Entry.clear opt_comma_ctyp; - Gram.Entry.clear opt_dot_dot; - Gram.Entry.clear opt_eq_ctyp; - Gram.Entry.clear opt_expr; - Gram.Entry.clear opt_meth_list; - Gram.Entry.clear opt_mutable; - Gram.Entry.clear opt_polyt; - Gram.Entry.clear opt_private; - Gram.Entry.clear opt_rec; - Gram.Entry.clear opt_virtual; - Gram.Entry.clear opt_when_expr; - Gram.Entry.clear patt; - Gram.Entry.clear patt_as_patt_opt; - Gram.Entry.clear patt_eoi; - Gram.Entry.clear patt_quot; - Gram.Entry.clear patt_tcon; - Gram.Entry.clear phrase; - Gram.Entry.clear poly_type; - Gram.Entry.clear row_field; - Gram.Entry.clear sem_expr; - Gram.Entry.clear sem_expr_for_list; - Gram.Entry.clear sem_patt; - Gram.Entry.clear sem_patt_for_list; - Gram.Entry.clear semi; - Gram.Entry.clear sequence; - Gram.Entry.clear sig_item; - Gram.Entry.clear sig_item_quot; - Gram.Entry.clear sig_items; - Gram.Entry.clear star_ctyp; - Gram.Entry.clear str_item; - Gram.Entry.clear str_item_quot; - Gram.Entry.clear str_items; - Gram.Entry.clear top_phrase; - Gram.Entry.clear type_constraint; - Gram.Entry.clear type_declaration; - Gram.Entry.clear type_ident_and_parameters; - Gram.Entry.clear type_kind; - Gram.Entry.clear type_longident; - Gram.Entry.clear type_longident_and_parameters; - Gram.Entry.clear type_parameter; - Gram.Entry.clear type_parameters; - Gram.Entry.clear typevars; - Gram.Entry.clear use_file; - Gram.Entry.clear val_longident; - Gram.Entry.clear value_let; - Gram.Entry.clear value_val; - Gram.Entry.clear with_constr; - Gram.Entry.clear with_constr_quot; - - value neg_string n = - let len = String.length n in - if len > 0 && n.[0] = '-' then String.sub n 1 (len - 1) - else "-" ^ n - ; - - value mkumin _loc f arg = - match arg with - [ <:expr< $int:n$ >> -> <:expr< $int:neg_string n$ >> - | <:expr< $int32:n$ >> -> <:expr< $int32:neg_string n$ >> - | <:expr< $int64:n$ >> -> <:expr< $int64:neg_string n$ >> - | <:expr< $nativeint:n$ >> -> <:expr< $nativeint:neg_string n$ >> - | <:expr< $flo:n$ >> -> <:expr< $flo:neg_string n$ >> - | _ -> <:expr< $lid:"~" ^ f$ $arg$ >> ]; - - value mklistexp _loc last = - loop True where rec loop top = - fun - [ [] -> - match last with - [ Some e -> e - | None -> <:expr< [] >> ] - | [e1 :: el] -> - let _loc = - if top then _loc else Loc.merge (Ast.loc_of_expr e1) _loc - in - <:expr< [$e1$ :: $loop False el$] >> ] - ; - - value mkassert _loc = - fun - [ <:expr< False >> -> - <:expr< assert False >> (* this case takes care about - the special assert false node *) - | e -> <:expr< assert $e$ >> ] - ; - - value append_eLem el e = el @ [e]; - value mk_anti ?(c = "") n s = "\\$"^n^c^":"^s; - - value mksequence _loc = - fun - [ <:expr< $_$; $_$ >> | <:expr< $anti:_$ >> as e -> <:expr< do { $e$ } >> - | e -> e ] - ; - - value mksequence' _loc = - fun - [ <:expr< $_$; $_$ >> as e -> <:expr< do { $e$ } >> - | e -> e ] - ; - - value rec lid_of_ident = - fun - [ <:ident< $_$ . $i$ >> -> lid_of_ident i - | <:ident< $lid:lid$ >> -> lid - | _ -> assert False ]; - - value module_type_app mt1 mt2 = - match (mt1, mt2) with - [ (<:module_type@_loc< $id:i1$ >>, <:module_type< $id:i2$ >>) -> - <:module_type< $id:<:ident< $i1$ $i2$ >>$ >> - | _ -> raise Stream.Failure ]; - - value module_type_acc mt1 mt2 = - match (mt1, mt2) with - [ (<:module_type@_loc< $id:i1$ >>, <:module_type< $id:i2$ >>) -> - <:module_type< $id:<:ident< $i1$.$i2$ >>$ >> - | _ -> raise Stream.Failure ]; - - value bigarray_get _loc arr arg = - let coords = - match arg with - [ <:expr< ($e1$, $e2$) >> | <:expr< $e1$, $e2$ >> -> - Ast.list_of_expr e1 (Ast.list_of_expr e2 []) - | _ -> [arg] ] - in - match coords with - [ [c1] -> <:expr< Bigarray.Array1.get $arr$ $c1$ >> - | [c1; c2] -> <:expr< Bigarray.Array2.get $arr$ $c1$ $c2$ >> - | [c1; c2; c3] -> <:expr< Bigarray.Array3.get $arr$ $c1$ $c2$ $c3$ >> - (* | coords -> <:expr< Bigarray.Genarray.get $arr$ [| $list:coords$ |] >> ] *) - | coords -> - <:expr< Bigarray.Genarray.get $arr$ [| $Ast.exSem_of_list coords$ |] >> ]; - - value bigarray_set _loc var newval = - match var with - [ <:expr< Bigarray.Array1.get $arr$ $c1$ >> -> - Some <:expr< Bigarray.Array1.set $arr$ $c1$ $newval$ >> - | <:expr< Bigarray.Array2.get $arr$ $c1$ $c2$ >> -> - Some <:expr< Bigarray.Array2.set $arr$ $c1$ $c2$ $newval$ >> - | <:expr< Bigarray.Array3.get $arr$ $c1$ $c2$ $c3$ >> -> - Some <:expr< Bigarray.Array3.set $arr$ $c1$ $c2$ $c3$ $newval$ >> - | <:expr< Bigarray.Genarray.get $arr$ [| $coords$ |] >> -> - Some <:expr< Bigarray.Genarray.set $arr$ [| $coords$ |] $newval$ >> - | _ -> None ]; - - value stopped_at _loc = - Some (Loc.move_line 1 _loc) (* FIXME be more precise *); - - value rec generalized_type_of_type = - fun - [ <:ctyp< $t1$ -> $t2$ >> -> - let (tl, rt) = generalized_type_of_type t2 in - ([t1 :: tl], rt) - | t -> - ([], t) ] - ; - - value symbolchar = - let list = - ['$'; '!'; '%'; '&'; '*'; '+'; '-'; '.'; '/'; ':'; '<'; '='; '>'; '?'; - '@'; '^'; '|'; '~'; '\\'] - in - let rec loop s i = - if i == String.length s then True - else if List.mem s.[i] list then loop s (i + 1) - else False - in - loop - ; - - value setup_op_parser entry p = - Gram.Entry.setup_parser entry - (parser - [: `(KEYWORD x | SYMBOL x, ti) when p x :] -> - let _loc = Gram.token_location ti in - <:expr< $lid:x$ >>); - - let list = ['!'; '?'; '~'] in - let excl = ["!="; "??"] in - setup_op_parser prefixop - (fun x -> not (List.mem x excl) && String.length x >= 2 && - List.mem x.[0] list && symbolchar x 1); - - let list_ok = ["<"; ">"; "<="; ">="; "="; "<>"; "=="; "!="; "$"] in - let list_first_char_ok = ['='; '<'; '>'; '|'; '&'; '$'; '!'] in - let excl = ["<-"; "||"; "&&"] in - setup_op_parser infixop0 - (fun x -> (List.mem x list_ok) || - (not (List.mem x excl) && String.length x >= 2 && - List.mem x.[0] list_first_char_ok && symbolchar x 1)); - - let list = ['@'; '^'] in - setup_op_parser infixop1 - (fun x -> String.length x >= 1 && List.mem x.[0] list && - symbolchar x 1); - - let list = ['+'; '-'] in - setup_op_parser infixop2 - (fun x -> x <> "->" && String.length x >= 1 && List.mem x.[0] list && - symbolchar x 1); - - let list = ['*'; '/'; '%'; '\\'] in - setup_op_parser infixop3 - (fun x -> String.length x >= 1 && List.mem x.[0] list && - (x.[0] <> '*' || String.length x < 2 || x.[1] <> '*') && - symbolchar x 1); - - setup_op_parser infixop4 - (fun x -> String.length x >= 2 && x.[0] == '*' && x.[1] == '*' && - symbolchar x 2); - - value rec infix_kwds_filter = - 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 :] - | [: xs :] -> - [: `tok; infix_kwds_filter xs :] ] - | [: `x; xs :] -> [: `x; infix_kwds_filter xs :] ]; - - Token.Filter.define_filter (Gram.get_filter ()) - (fun f strm -> infix_kwds_filter (f strm)); - - Gram.Entry.setup_parser sem_expr begin - let symb1 = Gram.parse_tokens_after_filter expr in - let symb = - parser - [ [: `(ANTIQUOT ("list" as n) s, ti) :] -> - let _loc = Gram.token_location ti in - <:expr< $anti:mk_anti ~c:"expr;" n s$ >> - | [: a = symb1 :] -> a ] - in - let rec kont al = - parser - [ [: `(KEYWORD ";", _); a = symb; s :] -> - let _loc = Loc.merge (Ast.loc_of_expr al) - (Ast.loc_of_expr a) in - kont <:expr< $al$; $a$ >> s - | [: :] -> al ] - in - parser [: a = symb; s :] -> kont a s - end; - - let apply () = EXTEND Gram - GLOBAL: - a_CHAR a_FLOAT a_INT a_INT32 a_INT64 a_LABEL a_LIDENT rec_binding_quot - a_NATIVEINT a_OPTLABEL a_STRING a_UIDENT a_ident - amp_ctyp and_ctyp match_case match_case0 match_case_quot binding binding_quot - class_declaration class_description class_expr class_expr_quot - class_fun_binding class_fun_def class_info_for_class_expr - class_info_for_class_type class_longident class_longident_and_param - class_name_and_param class_sig_item class_sig_item_quot class_signature - class_str_item class_str_item_quot class_structure class_type - class_type_declaration class_type_longident - class_type_longident_and_param class_type_plus class_type_quot - comma_ctyp comma_expr comma_ipatt comma_patt comma_type_parameter - constrain constructor_arg_list constructor_declaration - constructor_declarations ctyp ctyp_quot cvalue_binding direction_flag - dummy eq_expr expr expr_eoi expr_quot field_expr field_expr_list fun_binding - fun_def ident ident_quot implem interf ipatt ipatt_tcon label - label_declaration label_declaration_list label_expr label_expr_list - label_ipatt label_ipatt_list label_longident label_patt label_patt_list - labeled_ipatt let_binding meth_list meth_decl module_binding module_binding0 - module_binding_quot module_declaration module_expr module_expr_quot - module_longident module_longident_with_app module_rec_declaration - module_type module_type_quot more_ctyp name_tags opt_as_lident - opt_class_self_patt opt_class_self_type opt_comma_ctyp opt_dot_dot opt_eq_ctyp opt_expr - opt_meth_list opt_mutable opt_polyt opt_private opt_rec - opt_virtual opt_when_expr patt patt_as_patt_opt patt_eoi - patt_quot patt_tcon phrase poly_type row_field - sem_expr sem_expr_for_list sem_patt sem_patt_for_list semi sequence - sig_item sig_item_quot sig_items star_ctyp str_item str_item_quot - str_items top_phrase type_constraint type_declaration - type_ident_and_parameters type_kind type_longident - type_longident_and_parameters type_parameter type_parameters typevars - use_file val_longident value_let value_val with_constr with_constr_quot - infixop0 infixop1 infixop2 infixop3 infixop4 do_sequence package_type - rec_flag_quot direction_flag_quot mutable_flag_quot private_flag_quot - virtual_flag_quot row_var_flag_quot override_flag_quot; - module_expr: - [ "top" - [ "functor"; "("; i = a_UIDENT; ":"; t = module_type; ")"; "->"; - me = SELF -> - <:module_expr< functor ( $i$ : $t$ ) -> $me$ >> - | "struct"; st = str_items; "end" -> - <:module_expr< struct $st$ end >> ] - | "apply" - [ me1 = SELF; me2 = SELF -> <:module_expr< $me1$ $me2$ >> ] - | "simple" - [ `ANTIQUOT (""|"mexp"|"anti"|"list" as n) s -> - <:module_expr< $anti:mk_anti ~c:"module_expr" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.module_expr_tag - | i = module_longident -> <:module_expr< $id:i$ >> - | "("; me = SELF; ":"; mt = module_type; ")" -> - <:module_expr< ( $me$ : $mt$ ) >> - | "("; me = SELF; ")" -> <:module_expr< $me$ >> - | "("; value_val; e = expr; ")" -> - <:module_expr< (value $e$) >> - | "("; value_val; e = expr; ":"; p = package_type; ")" -> - <:module_expr< (value $e$ : $p$) >> ] ] - ; - str_item: - [ "top" - [ "exception"; t = constructor_declaration -> - <:str_item< exception $t$ >> - | "exception"; t = constructor_declaration; "="; i = type_longident -> - <:str_item< exception $t$ = $i$ >> - | "external"; i = a_LIDENT; ":"; t = ctyp; "="; sl = string_list -> - <:str_item< external $i$ : $t$ = $sl$ >> - | "include"; me = module_expr -> <:str_item< include $me$ >> - | "module"; i = a_UIDENT; mb = module_binding0 -> - <:str_item< module $i$ = $mb$ >> - | "module"; "rec"; mb = module_binding -> - <: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$ >> - | "type"; td = type_declaration -> - <:str_item< type $td$ >> - | value_let; r = opt_rec; bi = binding -> - <:str_item< value $rec:r$ $bi$ >> - | "class"; cd = class_declaration -> - <:str_item< class $cd$ >> - | "class"; "type"; ctd = class_type_declaration -> - <:str_item< class type $ctd$ >> - | `ANTIQUOT (""|"stri"|"anti"|"list" as n) s -> - <:str_item< $anti:mk_anti ~c:"str_item" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.str_item_tag - | e = expr -> <:str_item< $exp:e$ >> ] ] - ; - module_binding0: - [ RIGHTA - [ "("; m = a_UIDENT; ":"; mt = module_type; ")"; mb = SELF -> - <:module_expr< functor ( $m$ : $mt$ ) -> $mb$ >> - | ":"; mt = module_type; "="; me = module_expr -> - <:module_expr< ( $me$ : $mt$ ) >> - | "="; me = module_expr -> <:module_expr< $me$ >> ] ] - ; - module_binding: - [ LEFTA - [ b1 = SELF; "and"; b2 = SELF -> - <:module_binding< $b1$ and $b2$ >> - | `ANTIQUOT ("module_binding"|"anti"|"list" as n) s -> - <:module_binding< $anti:mk_anti ~c:"module_binding" n s$ >> - | `ANTIQUOT ("" as n) s -> - <:module_binding< $anti:mk_anti ~c:"module_binding" n s$ >> - | `ANTIQUOT ("" as n) m; ":"; mt = module_type; "="; me = module_expr -> - <:module_binding< $mk_anti n m$ : $mt$ = $me$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.module_binding_tag - | m = a_UIDENT; ":"; mt = module_type; "="; me = module_expr -> - <:module_binding< $m$ : $mt$ = $me$ >> ] ] - ; - module_type: - [ "top" - [ "functor"; "("; i = a_UIDENT; ":"; t = SELF; ")"; "->"; mt = SELF -> - <:module_type< functor ( $i$ : $t$ ) -> $mt$ >> ] - | "with" - [ mt = SELF; "with"; wc = with_constr -> - <:module_type< $mt$ with $wc$ >> ] - | "apply" - [ mt1 = SELF; mt2 = SELF; dummy -> module_type_app mt1 mt2 ] - | "." - [ mt1 = SELF; "."; mt2 = SELF -> module_type_acc mt1 mt2 ] - | "sig" - [ "sig"; sg = sig_items; "end" -> - <:module_type< sig $sg$ end >> ] - | "simple" - [ `ANTIQUOT (""|"mtyp"|"anti"|"list" as n) s -> - <:module_type< $anti:mk_anti ~c:"module_type" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.module_type_tag - | i = module_longident_with_app -> <:module_type< $id:i$ >> - | "'"; i = a_ident -> <:module_type< ' $i$ >> - | "("; mt = SELF; ")" -> <:module_type< $mt$ >> - | "module"; "type"; "of"; me = module_expr -> - <:module_type< module type of $me$ >> ] ] - ; - sig_item: - [ "top" - [ `ANTIQUOT (""|"sigi"|"anti"|"list" as n) s -> - <:sig_item< $anti:mk_anti ~c:"sig_item" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.sig_item_tag - | "exception"; t = constructor_declaration -> - <:sig_item< exception $t$ >> - | "external"; i = a_LIDENT; ":"; t = ctyp; "="; sl = string_list -> - <:sig_item< external $i$ : $t$ = $sl$ >> - | "include"; mt = module_type -> <:sig_item< include $mt$ >> - | "module"; i = a_UIDENT; mt = module_declaration -> - <:sig_item< module $i$ : $mt$ >> - | "module"; "rec"; mb = module_rec_declaration -> - <:sig_item< module rec $mb$ >> - | "module"; "type"; i = a_ident; "="; mt = module_type -> - <:sig_item< module type $i$ = $mt$ >> - | "module"; "type"; i = a_ident -> - <:sig_item< module type $i$ >> - | "open"; i = module_longident -> <:sig_item< open $i$ >> - | "type"; t = type_declaration -> - <:sig_item< type $t$ >> - | value_val; i = a_LIDENT; ":"; t = ctyp -> - <:sig_item< value $i$ : $t$ >> - | "class"; cd = class_description -> - <:sig_item< class $cd$ >> - | "class"; "type"; ctd = class_type_declaration -> - <:sig_item< class type $ctd$ >> ] ] - ; - module_declaration: - [ RIGHTA - [ ":"; mt = module_type -> <:module_type< $mt$ >> - | "("; i = a_UIDENT; ":"; t = module_type; ")"; mt = SELF -> - <:module_type< functor ( $i$ : $t$ ) -> $mt$ >> ] ] - ; - module_rec_declaration: - [ LEFTA - [ m1 = SELF; "and"; m2 = SELF -> <:module_binding< $m1$ and $m2$ >> - | `ANTIQUOT (""|"module_binding"|"anti"|"list" as n) s -> - <:module_binding< $anti:mk_anti ~c:"module_binding" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.module_binding_tag - | m = a_UIDENT; ":"; mt = module_type -> <:module_binding< $m$ : $mt$ >> - ] ] - ; - with_constr: - [ LEFTA - [ wc1 = SELF; "and"; wc2 = SELF -> <:with_constr< $wc1$ and $wc2$ >> - | `ANTIQUOT (""|"with_constr"|"anti"|"list" as n) s -> - <:with_constr< $anti:mk_anti ~c:"with_constr" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.with_constr_tag - | "type"; `ANTIQUOT (""|"typ"|"anti" as n) s; "="; t = ctyp -> - <:with_constr< type $anti:mk_anti ~c:"ctyp" n s$ = $t$ >> - | "type"; t1 = type_longident_and_parameters; "="; t2 = ctyp -> - <:with_constr< type $t1$ = $t2$ >> - | "module"; i1 = module_longident; "="; i2 = module_longident_with_app -> - <:with_constr< module $i1$ = $i2$ >> - | "type"; `ANTIQUOT (""|"typ"|"anti" as n) s; ":="; t = ctyp -> - <:with_constr< type $anti:mk_anti ~c:"ctyp" n s$ := $t$ >> - | "type"; t1 = type_longident_and_parameters; ":="; t2 = ctyp -> - <:with_constr< type $t1$ := $t2$ >> - | "module"; i1 = module_longident; ":="; i2 = module_longident_with_app -> - <:with_constr< module $i1$ := $i2$ >> ] ] - ; - expr: - [ "top" RIGHTA - [ "let"; r = opt_rec; bi = binding; "in"; x = SELF -> - <: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$ >> - | "fun"; "["; a = LIST0 match_case0 SEP "|"; "]" -> - <:expr< fun [ $list:a$ ] >> - | "fun"; e = fun_def -> e - | "match"; e = sequence; "with"; a = match_case -> - <:expr< match $mksequence' _loc e$ with [ $a$ ] >> - | "try"; e = sequence; "with"; a = match_case -> - <:expr< try $mksequence' _loc e$ with [ $a$ ] >> - | "if"; e1 = SELF; "then"; e2 = SELF; "else"; e3 = SELF -> - <:expr< if $e1$ then $e2$ else $e3$ >> - | "do"; seq = do_sequence -> mksequence _loc seq - | "for"; i = a_LIDENT; "="; e1 = sequence; df = direction_flag; - e2 = sequence; "do"; seq = do_sequence -> - <:expr< for $i$ = $mksequence' _loc e1$ $to:df$ $mksequence' _loc e2$ do { $seq$ } >> - | "while"; e = sequence; "do"; seq = do_sequence -> - <:expr< while $mksequence' _loc e$ do { $seq$ } >> - | "object"; csp = opt_class_self_patt; cst = class_structure; "end" -> - <:expr< object ($csp$) $cst$ end >> ] - | "where" - [ e = SELF; "where"; rf = opt_rec; lb = let_binding -> - <:expr< let $rec:rf$ $lb$ in $e$ >> ] - | ":=" NONA - [ e1 = SELF; ":="; e2 = SELF; dummy -> - match bigarray_set _loc e1 e2 with - [ Some e -> e - | None -> <:expr< $e1$ := $e2$ >> ] ] - | "||" RIGHTA - [ e1 = SELF; op = infixop6; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "&&" RIGHTA - [ e1 = SELF; op = infixop5; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "<" LEFTA - [ e1 = SELF; op = infixop0; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "^" RIGHTA - [ e1 = SELF; op = infixop1; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "+" LEFTA - [ e1 = SELF; op = infixop2; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "*" LEFTA - [ e1 = SELF; "land"; e2 = SELF -> <:expr< $e1$ land $e2$ >> - | e1 = SELF; "lor"; e2 = SELF -> <:expr< $e1$ lor $e2$ >> - | e1 = SELF; "lxor"; e2 = SELF -> <:expr< $e1$ lxor $e2$ >> - | e1 = SELF; "mod"; e2 = SELF -> <:expr< $e1$ mod $e2$ >> - | e1 = SELF; op = infixop3; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "**" RIGHTA - [ e1 = SELF; "asr"; e2 = SELF -> <:expr< $e1$ asr $e2$ >> - | e1 = SELF; "lsl"; e2 = SELF -> <:expr< $e1$ lsl $e2$ >> - | e1 = SELF; "lsr"; e2 = SELF -> <:expr< $e1$ lsr $e2$ >> - | e1 = SELF; op = infixop4; e2 = SELF -> <:expr< $op$ $e1$ $e2$ >> ] - | "unary minus" NONA - [ "-"; e = SELF -> mkumin _loc "-" e - | "-."; e = SELF -> mkumin _loc "-." e ] - | "apply" LEFTA - [ e1 = SELF; e2 = SELF -> <:expr< $e1$ $e2$ >> - | "assert"; e = SELF -> mkassert _loc e - | "new"; i = class_longident -> <:expr< new $i$ >> - | "lazy"; e = SELF -> <:expr< lazy $e$ >> ] - | "label" NONA - [ "~"; i = a_LIDENT; ":"; e = SELF -> <:expr< ~ $i$ : $e$ >> - | "~"; i = a_LIDENT -> <:expr< ~ $i$ >> - - (* Here it's LABEL and not tilde_label since ~a:b is different than ~a : b *) - | `LABEL i; e = SELF -> <:expr< ~ $i$ : $e$ >> - - (* Same remark for ?a:b *) - | `OPTLABEL i; e = SELF -> <:expr< ? $i$ : $e$ >> - - | "?"; i = a_LIDENT; ":"; e = SELF -> <:expr< ? $i$ : $e$ >> - | "?"; i = a_LIDENT -> <:expr< ? $i$ >> ] - | "." LEFTA - [ e1 = SELF; "."; "("; e2 = SELF; ")" -> <:expr< $e1$ .( $e2$ ) >> - | e1 = SELF; "."; "["; e2 = SELF; "]" -> <:expr< $e1$ .[ $e2$ ] >> - | e1 = SELF; "."; "{"; e2 = comma_expr; "}" -> bigarray_get _loc e1 e2 - | e1 = SELF; "."; e2 = SELF -> <:expr< $e1$ . $e2$ >> - | e = SELF; "#"; lab = label -> <:expr< $e$ # $lab$ >> ] - | "~-" NONA - [ "!"; e = SELF -> <:expr< $e$.val >> - | f = prefixop; e = SELF -> <:expr< $f$ $e$ >> ] - | "simple" - [ `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.expr_tag - | `ANTIQUOT ("exp"|""|"anti" as n) s -> - <:expr< $anti:mk_anti ~c:"expr" n s$ >> - | `ANTIQUOT ("`bool" as n) s -> - <:expr< $id:<:ident< $anti:mk_anti n s$ >>$ >> - | `ANTIQUOT ("tup" as n) s -> - <:expr< $tup: <:expr< $anti:mk_anti ~c:"expr" n s$ >>$ >> - | `ANTIQUOT ("seq" as n) s -> - <:expr< do $anti:mk_anti ~c:"expr" n s$ done >> - | s = a_INT -> <:expr< $int:s$ >> - | s = a_INT32 -> <:expr< $int32:s$ >> - | s = a_INT64 -> <:expr< $int64:s$ >> - | s = a_NATIVEINT -> <:expr< $nativeint:s$ >> - | s = a_FLOAT -> <:expr< $flo:s$ >> - | 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$ >> - | i = TRY val_longident -> <:expr< $id:i$ >> - | "`"; s = a_ident -> <:expr< ` $s$ >> - | "["; "]" -> <:expr< [] >> - | "["; mk_list = sem_expr_for_list; "::"; last = expr; "]" -> - mk_list last - | "["; mk_list = sem_expr_for_list; "]" -> - mk_list <:expr< [] >> - | "[|"; "|]" -> <:expr< [| $<:expr<>>$ |] >> - | "[|"; el = sem_expr; "|]" -> <:expr< [| $el$ |] >> - | "{"; el = label_expr_list; "}" -> <:expr< { $el$ } >> - | "{"; "("; e = SELF; ")"; "with"; el = label_expr_list; "}" -> - <:expr< { ($e$) with $el$ } >> - | "{<"; ">}" -> <:expr< {<>} >> - | "{<"; fel = field_expr_list; ">}" -> <:expr< {< $fel$ >} >> - | "("; ")" -> <:expr< () >> - | "("; e = SELF; ":"; t = ctyp; ")" -> <:expr< ($e$ : $t$) >> - | "("; e = SELF; ","; el = comma_expr; ")" -> <:expr< ( $e$, $el$ ) >> - | "("; e = SELF; ";"; seq = sequence; ")" -> mksequence _loc <:expr< $e$; $seq$ >> - | "("; e = SELF; ";"; ")" -> mksequence _loc e - | "("; e = SELF; ":"; t = ctyp; ":>"; t2 = ctyp; ")" -> - <:expr< ($e$ : $t$ :> $t2$ ) >> - | "("; e = SELF; ":>"; t = ctyp; ")" -> <:expr< ($e$ :> $t$) >> - | "("; e = SELF; ")" -> e - | "begin"; seq = sequence; "end" -> mksequence _loc seq - | "begin"; "end" -> <:expr< () >> - | "("; "module"; me = module_expr; ")" -> - <:expr< (module $me$) >> - | "("; "module"; me = module_expr; ":"; pt = package_type; ")" -> - <:expr< (module $me$ : $pt$) >> - ] ] - ; - do_sequence: - [ [ seq = TRY ["{"; seq = sequence; "}" -> seq] -> seq - | TRY ["{"; "}"] -> <:expr< () >> - | seq = TRY [seq = sequence; "done" -> seq] -> seq - | "done" -> <:expr< () >> - ] ] - ; - infixop5: - [ [ x = [ "&" | "&&" ] -> <:expr< $lid:x$ >> ] ] - ; - infixop6: - [ [ x = [ "or" | "||" ] -> <:expr< $lid:x$ >> ] ] - ; - sem_expr_for_list: - [ [ e = expr; ";"; el = SELF -> fun acc -> <:expr< [ $e$ :: $el acc$ ] >> - | e = expr; ";" -> fun acc -> <:expr< [ $e$ :: $acc$ ] >> - | e = expr -> fun acc -> <:expr< [ $e$ :: $acc$ ] >> - ] ] - ; - comma_expr: - [ [ e1 = SELF; ","; e2 = SELF -> <:expr< $e1$, $e2$ >> - | `ANTIQUOT ("list" as n) s -> <:expr< $anti:mk_anti ~c:"expr," n s$ >> - | e = expr LEVEL "top" -> e ] ] - ; - dummy: - [ [ -> () ] ] - ; - sequence': - [ [ -> fun e -> e - | ";" -> fun e -> e - | ";"; el = sequence -> fun e -> <:expr< $e$; $el$ >> ] ] - ; - sequence: - [ [ "let"; rf = opt_rec; bi = binding; "in"; e = expr; k = sequence' -> - k <:expr< let $rec:rf$ $bi$ in $e$ >> - | "let"; rf = opt_rec; bi = binding; ";"; el = SELF -> - <:expr< let $rec:rf$ $bi$ in $mksequence _loc el$ >> - | "let"; "module"; m = a_UIDENT; mb = module_binding0; "in"; e = expr; k = sequence' -> - 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$ >> - | `ANTIQUOT ("list" as n) s -> <:expr< $anti:mk_anti ~c:"expr;" n s$ >> - | e = expr; k = sequence' -> k e ] ] - ; - binding: - [ LEFTA - [ `ANTIQUOT ("binding"|"list" as n) s -> - <:binding< $anti:mk_anti ~c:"binding" n s$ >> - | `ANTIQUOT (""|"anti" as n) s; "="; e = expr -> - <:binding< $anti:mk_anti ~c:"patt" n s$ = $e$ >> - | `ANTIQUOT (""|"anti" as n) s -> <:binding< $anti:mk_anti ~c:"binding" n s$ >> - | b1 = SELF; "and"; b2 = SELF -> <:binding< $b1$ and $b2$ >> - | b = let_binding -> b - ] ] - ; - let_binding: - [ [ p = ipatt; e = fun_binding -> <:binding< $p$ = $e$ >> ] ] - ; - fun_binding: - [ RIGHTA - [ TRY ["("; "type"]; i = a_LIDENT; ")"; e = SELF -> - <:expr< fun (type $i$) -> $e$ >> - | p = TRY labeled_ipatt; e = SELF -> - <:expr< fun $p$ -> $e$ >> - | bi = cvalue_binding -> bi - ] ] - ; - match_case: - [ [ "["; l = LIST0 match_case0 SEP "|"; "]" -> Ast.mcOr_of_list l - | p = ipatt; "->"; e = expr -> <:match_case< $p$ -> $e$ >> ] ] - ; - match_case0: - [ [ `ANTIQUOT ("match_case"|"list" as n) s -> - <:match_case< $anti:mk_anti ~c:"match_case" n s$ >> - | `ANTIQUOT (""|"anti" as n) s -> - <:match_case< $anti:mk_anti ~c:"match_case" n s$ >> - | `ANTIQUOT (""|"anti" as n) s; "->"; e = expr -> - <:match_case< $anti:mk_anti ~c:"patt" n s$ -> $e$ >> - | `ANTIQUOT (""|"anti" as n) s; "when"; w = expr; "->"; e = expr -> - <:match_case< $anti:mk_anti ~c:"patt" n s$ when $w$ -> $e$ >> - | p = patt_as_patt_opt; w = opt_when_expr; "->"; e = expr -> <:match_case< $p$ when $w$ -> $e$ >> - ] ] - ; - opt_when_expr: - [ [ "when"; w = expr -> w - | -> <:expr<>> - ] ] - ; - patt_as_patt_opt: - [ [ p1 = patt; "as"; p2 = patt -> <:patt< ($p1$ as $p2$) >> - | p = patt -> p - ] ] - ; - label_expr_list: - [ [ b1 = label_expr; ";"; b2 = SELF -> <:rec_binding< $b1$ ; $b2$ >> - | b1 = label_expr; ";" -> b1 - | b1 = label_expr -> b1 - ] ]; - label_expr: - [ [ `ANTIQUOT ("rec_binding" as n) s -> - <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | `ANTIQUOT (""|"anti" as n) s -> - <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | `ANTIQUOT (""|"anti" as n) s; "="; e = expr -> - <:rec_binding< $anti:mk_anti ~c:"ident" n s$ = $e$ >> - | `ANTIQUOT ("list" as n) s -> - <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | i = label_longident; e = fun_binding -> <:rec_binding< $i$ = $e$ >> - | i = label_longident -> - <:rec_binding< $i$ = $lid:lid_of_ident i$ >> ] ] - ; - fun_def: - [ [ TRY ["("; "type"]; i = a_LIDENT; ")"; - e = fun_def_cont_no_when -> - <:expr< fun (type $i$) -> $e$ >> - | p = TRY labeled_ipatt; (w, e) = fun_def_cont -> - <:expr< fun [ $p$ when $w$ -> $e$ ] >> ] ] - ; - fun_def_cont: - [ RIGHTA - [ TRY ["("; "type"]; i = a_LIDENT; ")"; - e = fun_def_cont_no_when -> - (<:expr<>>, <:expr< fun (type $i$) -> $e$ >>) - | p = TRY labeled_ipatt; (w,e) = SELF -> - (<:expr<>>, <:expr< fun [ $p$ when $w$ -> $e$ ] >>) - | "when"; w = expr; "->"; e = expr -> (w, e) - | "->"; e = expr -> (<:expr<>>, e) ] ] - ; - fun_def_cont_no_when: - [ RIGHTA - [ TRY ["("; "type"]; i = a_LIDENT; ")"; - e = fun_def_cont_no_when -> <:expr< fun (type $i$) -> $e$ >> - | p = TRY labeled_ipatt; (w,e) = fun_def_cont -> - <:expr< fun [ $p$ when $w$ -> $e$ ] >> - | "->"; e = expr -> e ] ] - ; - patt: - [ "|" LEFTA - [ p1 = SELF; "|"; p2 = SELF -> <:patt< $p1$ | $p2$ >> ] - | ".." NONA - [ p1 = SELF; ".."; p2 = SELF -> <:patt< $p1$ .. $p2$ >> ] - | "apply" LEFTA - [ p1 = SELF; p2 = SELF -> <:patt< $p1$ $p2$ >> - | "lazy"; p = SELF -> <:patt< lazy $p$ >> ] - | "simple" - [ `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | `ANTIQUOT ("tup" as n) s -> <:patt< ($tup:<:patt< $anti:mk_anti ~c:"patt" n s$ >>$) >> - | `ANTIQUOT ("`bool" as n) s -> <:patt< $id:<:ident< $anti:mk_anti n s$ >>$ >> - | i = ident -> <:patt< $id:i$ >> - | s = a_INT -> <:patt< $int:s$ >> - | s = a_INT32 -> <:patt< $int32:s$ >> - | s = a_INT64 -> <:patt< $int64:s$ >> - | s = a_NATIVEINT -> <:patt< $nativeint:s$ >> - | s = a_FLOAT -> <:patt< $flo:s$ >> - | s = a_STRING -> <:patt< $str:s$ >> - | s = a_CHAR -> <:patt< $chr:s$ >> - | "-"; s = a_INT -> <:patt< $int:neg_string s$ >> - | "-"; s = a_INT32 -> <:patt< $int32:neg_string s$ >> - | "-"; s = a_INT64 -> <:patt< $int64:neg_string s$ >> - | "-"; s = a_NATIVEINT -> <:patt< $nativeint:neg_string s$ >> - | "-"; s = a_FLOAT -> <:patt< $flo:neg_string s$ >> - | "["; "]" -> <:patt< [] >> - | "["; mk_list = sem_patt_for_list; "::"; last = patt; "]" -> - mk_list last - | "["; mk_list = sem_patt_for_list; "]" -> - mk_list <:patt< [] >> - | "[|"; "|]" -> <:patt< [| $<:patt<>>$ |] >> - | "[|"; pl = sem_patt; "|]" -> <:patt< [| $pl$ |] >> - | "{"; pl = label_patt_list; "}" -> <:patt< { $pl$ } >> - | "("; ")" -> <:patt< () >> - | "("; "module"; m = a_UIDENT; ")" -> <:patt< (module $m$) >> - | "("; "module"; m = a_UIDENT; ":"; pt = package_type; ")" -> - <:patt< ((module $m$) : (module $pt$)) >> - | "("; p = SELF; ")" -> p - | "("; p = SELF; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> - | "("; p = SELF; "as"; p2 = SELF; ")" -> <:patt< ($p$ as $p2$) >> - | "("; p = SELF; ","; pl = comma_patt; ")" -> <:patt< ($p$, $pl$) >> - | "_" -> <:patt< _ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.patt_tag - | "`"; s = a_ident -> <:patt< ` $s$ >> - | "#"; i = type_longident -> <:patt< # $i$ >> - | `LABEL i; p = SELF -> <:patt< ~ $i$ : $p$ >> - | "~"; `ANTIQUOT (""|"lid" as n) i; ":"; p = SELF -> - <:patt< ~ $mk_anti n i$ : $p$ >> - | "~"; `ANTIQUOT (""|"lid" as n) i -> <:patt< ~ $mk_anti n i$ >> - | "~"; `LIDENT i -> <:patt< ~ $i$ >> - (* | i = opt_label; "("; p = patt_tcon; ")" -> *) - (* <:patt< ? $i$ : ($p$) >> *) - | `OPTLABEL i; "("; p = patt_tcon; f = eq_expr; ")" -> f i p - | "?"; `ANTIQUOT (""|"lid" as n) i; ":"; "("; p = patt_tcon; f = eq_expr; ")" -> - f (mk_anti n i) p - | "?"; `LIDENT i -> <:patt< ? $i$ >> - | "?"; `ANTIQUOT (""|"lid" as n) i -> <:patt< ? $mk_anti n i$ >> - | "?"; "("; p = patt_tcon; ")" -> - <:patt< ? ($p$) >> - | "?"; "("; p = patt_tcon; "="; e = expr; ")" -> - <:patt< ? ($p$ = $e$) >> ] ] - ; - comma_patt: - [ [ p1 = SELF; ","; p2 = SELF -> <:patt< $p1$, $p2$ >> - | `ANTIQUOT ("list" as n) s -> <:patt< $anti:mk_anti ~c:"patt," n s$ >> - | p = patt -> p ] ] - ; - sem_patt: - [ LEFTA - [ p1 = patt; ";"; p2 = SELF -> <:patt< $p1$; $p2$ >> - | `ANTIQUOT ("list" as n) s -> <:patt< $anti:mk_anti ~c:"patt;" n s$ >> - | p = patt; ";" -> p - | p = patt -> p ] ] - ; - sem_patt_for_list: - [ [ p = patt; ";"; pl = SELF -> fun acc -> <:patt< [ $p$ :: $pl acc$ ] >> - | p = patt; ";" -> fun acc -> <:patt< [ $p$ :: $acc$ ] >> - | p = patt -> fun acc -> <:patt< [ $p$ :: $acc$ ] >> - ] ] - ; - 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 - ] ]; - label_patt: - [ [ `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.patt_tag - | `ANTIQUOT ("list" as n) s -> - <:patt< $anti:mk_anti ~c:"patt;" n s$ >> - | i = label_longident; "="; p = patt -> <:patt< $i$ = $p$ >> - | i = label_longident -> <:patt< $i$ = $lid:lid_of_ident i$ >> - ] ] - ; - ipatt: - [ [ "{"; pl = label_ipatt_list; "}" -> <:patt< { $pl$ } >> - | `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | `ANTIQUOT ("tup" as n) s -> - <:patt< ($tup:<:patt< $anti:mk_anti ~c:"patt" n s$ >>$) >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.patt_tag - | "("; ")" -> <:patt< () >> - | "("; "module"; m = a_UIDENT; ")" -> <:patt< (module $m$) >> - | "("; "module"; m = a_UIDENT; ":"; pt = package_type; ")" -> - <:patt< ((module $m$) : (module $pt$)) >> - | "("; p = SELF; ")" -> p - | "("; p = SELF; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> - | "("; p = SELF; "as"; p2 = SELF; ")" -> <:patt< ($p$ as $p2$) >> - | "("; p = SELF; ","; pl = comma_ipatt; ")" -> <:patt< ($p$, $pl$) >> - | s = a_LIDENT -> <:patt< $lid:s$ >> - | "_" -> <:patt< _ >> ] ] - ; - labeled_ipatt: - [ [ p = ipatt -> p ] ] - ; - comma_ipatt: - [ LEFTA - [ p1 = SELF; ","; p2 = SELF -> <:patt< $p1$, $p2$ >> - | `ANTIQUOT ("list" as n) s -> <:patt< $anti:mk_anti ~c:"patt," n s$ >> - | p = ipatt -> p ] ] - ; - label_ipatt_list: - [ [ p1 = label_ipatt; ";"; p2 = SELF -> <:patt< $p1$ ; $p2$ >> - | p1 = label_ipatt; ";"; "_" -> <:patt< $p1$ ; _ >> - | p1 = label_ipatt; ";"; "_"; ";" -> <:patt< $p1$ ; _ >> - | p1 = label_ipatt; ";" -> p1 - | p1 = label_ipatt -> p1 - ] ]; - label_ipatt: - [ [ `ANTIQUOT (""|"pat"|"anti" as n) s -> - <:patt< $anti:mk_anti ~c:"patt" n s$ >> - | `ANTIQUOT ("list" as n) s -> <:patt< $anti:mk_anti ~c:"patt;" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.patt_tag - | i = label_longident; "="; p = ipatt -> <:patt< $i$ = $p$ >> - ] ] - ; - type_declaration: - [ LEFTA - [ `ANTIQUOT (""|"typ"|"anti" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctypand" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | t1 = SELF; "and"; t2 = SELF -> <:ctyp< $t1$ and $t2$ >> - | (n, tpl) = type_ident_and_parameters; tk = opt_eq_ctyp; - cl = LIST0 constrain -> Ast.TyDcl _loc n tpl tk cl ] ] - ; - constrain: - [ [ "constraint"; t1 = ctyp; "="; t2 = ctyp -> (t1, t2) ] ] - ; - opt_eq_ctyp: - [ [ "="; tk = type_kind -> tk - | -> <:ctyp<>> ] ] - ; - type_kind: - [ [ t = ctyp -> t ] ] - ; - type_ident_and_parameters: - [ [ i = a_LIDENT; tpl = LIST0 optional_type_parameter -> (i, tpl) ] ] - ; - type_longident_and_parameters: - [ [ i = type_longident; tpl = type_parameters -> tpl <:ctyp< $id:i$ >> - ] ] - ; - type_parameters: - [ [ t1 = type_parameter; t2 = SELF -> - fun acc -> t2 <:ctyp< $acc$ $t1$ >> - | t = type_parameter -> fun acc -> <:ctyp< $acc$ $t$ >> - | -> fun t -> t - ] ] - ; - - type_parameter: - [ [ `ANTIQUOT (""|"typ"|"anti" as n) s -> <:ctyp< $anti:mk_anti n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | "'"; i = a_ident -> <:ctyp< '$lid:i$ >> - | "+"; "'"; i = a_ident -> <:ctyp< +'$lid:i$ >> - | "-"; "'"; i = a_ident -> <:ctyp< -'$lid:i$ >> ] ] - ; - optional_type_parameter: - [ [ `ANTIQUOT (""|"typ"|"anti" as n) s -> <:ctyp< $anti:mk_anti n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | "'"; i = a_ident -> <:ctyp< '$lid:i$ >> - | "+"; "'"; i = a_ident -> <:ctyp< +'$lid:i$ >> - | "-"; "'"; i = a_ident -> <:ctyp< -'$lid:i$ >> - | "+"; "_" -> Ast.TyAnP _loc - | "-"; "_" -> Ast.TyAnM _loc - | "_" -> Ast.TyAny _loc - - ] ] - ; - - - ctyp: - [ "==" LEFTA - [ t1 = SELF; "=="; t2 = SELF -> <:ctyp< $t1$ == $t2$ >> ] - | "private" NONA - [ "private"; t = ctyp LEVEL "alias" -> <:ctyp< private $t$ >> ] - | "alias" LEFTA - [ t1 = SELF; "as"; t2 = SELF -> <:ctyp< $t1$ as $t2$ >> ] - | "forall" LEFTA - [ "!"; t1 = typevars; "."; t2 = ctyp -> <:ctyp< ! $t1$ . $t2$ >> ] - | "arrow" RIGHTA - [ t1 = SELF; "->"; t2 = SELF -> <:ctyp< $t1$ -> $t2$ >> ] - | "label" NONA - [ "~"; i = a_LIDENT; ":"; t = SELF -> <:ctyp< ~ $i$ : $t$ >> - | i = a_LABEL; t = SELF -> <:ctyp< ~ $i$ : $t$ >> - | "?"; i = a_LIDENT; ":"; t = SELF -> <:ctyp< ? $i$ : $t$ >> - | i = a_OPTLABEL; t = SELF -> <:ctyp< ? $i$ : $t$ >> ] - | "apply" LEFTA - [ t1 = SELF; t2 = SELF -> - let t = <:ctyp< $t1$ $t2$ >> in - try <:ctyp< $id:Ast.ident_of_ctyp t$ >> - with [ Invalid_argument _ -> t ] ] - | "." LEFTA - [ t1 = SELF; "."; t2 = SELF -> - try <:ctyp< $id:Ast.ident_of_ctyp t1$.$id:Ast.ident_of_ctyp t2$ >> - with [ Invalid_argument s -> raise (Stream.Error s) ] ] - | "simple" - [ "'"; i = a_ident -> <:ctyp< '$i$ >> - | "_" -> <:ctyp< _ >> - | `ANTIQUOT (""|"typ"|"anti" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("tup" as n) s -> - <:ctyp< ($tup:<:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >>$) >> - | `ANTIQUOT ("id" as n) s -> - <:ctyp< $id:<:ident< $anti:mk_anti ~c:"ident" n s$ >>$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | i = a_LIDENT -> <:ctyp< $lid:i$ >> - | i = a_UIDENT -> <:ctyp< $uid:i$ >> - | "("; t = SELF; "*"; tl = star_ctyp; ")" -> - <:ctyp< ( $t$ * $tl$ ) >> - | "("; t = SELF; ")" -> t - | "["; "]" -> <:ctyp< [ ] >> - | "["; t = constructor_declarations; "]" -> <:ctyp< [ $t$ ] >> - | "["; "="; rfl = row_field; "]" -> - <:ctyp< [ = $rfl$ ] >> - | "["; ">"; "]" -> <:ctyp< [ > $<:ctyp<>>$ ] >> - | "["; ">"; rfl = row_field; "]" -> - <:ctyp< [ > $rfl$ ] >> - | "["; "<"; rfl = row_field; "]" -> - <:ctyp< [ < $rfl$ ] >> - | "["; "<"; rfl = row_field; ">"; ntl = name_tags; "]" -> - <:ctyp< [ < $rfl$ > $ntl$ ] >> - | "[<"; rfl = row_field; "]" -> - <:ctyp< [ < $rfl$ ] >> - | "[<"; rfl = row_field; ">"; ntl = name_tags; "]" -> - <:ctyp< [ < $rfl$ > $ntl$ ] >> - | "{"; t = label_declaration_list; "}" -> <:ctyp< { $t$ } >> - | "#"; i = class_longident -> <:ctyp< # $i$ >> - | "<"; t = opt_meth_list; ">" -> t - | "("; "module"; p = package_type; ")" -> <:ctyp< (module $p$) >> - ] ] - ; - star_ctyp: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp*" n s$ >> - | t1 = SELF; "*"; t2 = SELF -> - <:ctyp< $t1$ * $t2$ >> - | t = ctyp -> t - ] ] - ; - constructor_declarations: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp|" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | t1 = SELF; "|"; t2 = SELF -> - <:ctyp< $t1$ | $t2$ >> - | s = a_UIDENT; "of"; t = constructor_arg_list -> - <:ctyp< $uid:s$ of $t$ >> - | s = a_UIDENT; ":"; t = ctyp -> - let (tl, rt) = generalized_type_of_type t in - <:ctyp< $uid:s$ : ($Ast.tyAnd_of_list tl$ -> $rt$) >> - | s = a_UIDENT -> - <:ctyp< $uid:s$ >> - ] ] - ; - constructor_declaration: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | s = a_UIDENT; "of"; t = constructor_arg_list -> - <:ctyp< $uid:s$ of $t$ >> - | s = a_UIDENT -> - <:ctyp< $uid:s$ >> - ] ] - ; - constructor_arg_list: - [ [ `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctypand" n s$ >> - | t1 = SELF; "and"; t2 = SELF -> <:ctyp< $t1$ and $t2$ >> - | t = ctyp -> t - ] ] - ; - label_declaration_list: - [ [ t1 = label_declaration; ";"; t2 = SELF -> <:ctyp< $t1$; $t2$ >> - | t1 = label_declaration; ";" -> t1 - | t1 = label_declaration -> t1 - ] ] - ; - label_declaration: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp;" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | s = a_LIDENT; ":"; t = poly_type -> <:ctyp< $lid:s$ : $t$ >> - | s = a_LIDENT; ":"; "mutable"; t = poly_type -> - <:ctyp< $lid:s$ : mutable $t$ >> - ] ] - ; - a_ident: - [ [ i = a_LIDENT -> i - | i = a_UIDENT -> i ] ] - ; - ident: - [ [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> - | i = a_LIDENT -> <:ident< $lid:i$ >> - | `ANTIQUOT (""|"id"|"anti"|"list" as n) s; "."; i = SELF -> - <:ident< $anti:mk_anti ~c:"ident" n s$.$i$ >> - | i = a_UIDENT; "."; j = SELF -> <:ident< $uid:i$.$j$ >> ] ] - ; - module_longident: - [ [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | m = a_UIDENT; "."; l = SELF -> <:ident< $uid:m$.$l$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> ] ] - ; - module_longident_with_app: - [ "apply" - [ i = SELF; j = SELF -> <:ident< $i$ $j$ >> ] - | "." - [ i = SELF; "."; j = SELF -> <:ident< $i$.$j$ >> ] - | "simple" - [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> - | "("; i = SELF; ")" -> i ] ] - ; - module_longident_dot_lparen: - [ [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s; "."; "(" -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | m = a_UIDENT; "."; l = SELF -> <:ident< $uid:m$.$l$ >> - | i = a_UIDENT; "."; "(" -> <:ident< $uid:i$ >> ] ] - ; - type_longident: - [ "apply" - [ i = SELF; j = SELF -> <:ident< $i$ $j$ >> ] - | "." - [ i = SELF; "."; j = SELF -> <:ident< $i$.$j$ >> ] - | "simple" - [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | i = a_LIDENT -> <:ident< $lid:i$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> - | "("; i = SELF; ")" -> i ] ] - ; - label_longident: - [ [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | m = a_UIDENT; "."; l = SELF -> <:ident< $uid:m$.$l$ >> - | i = a_LIDENT -> <:ident< $lid:i$ >> ] ] - ; - class_type_longident: - [ [ x = type_longident -> x ] ] - ; - val_longident: - [ [ x = ident -> x ] ] - ; - class_longident: - [ [ x = label_longident -> x ] ] - ; - class_declaration: - [ LEFTA - [ c1 = SELF; "and"; c2 = SELF -> - <:class_expr< $c1$ and $c2$ >> - | `ANTIQUOT (""|"cdcl"|"anti"|"list" as n) s -> - <:class_expr< $anti:mk_anti ~c:"class_expr" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_expr_tag - | ci = class_info_for_class_expr; ce = class_fun_binding -> - <:class_expr< $ci$ = $ce$ >> - ] ] - ; - class_fun_binding: - [ [ "="; ce = class_expr -> ce - | ":"; ct = class_type_plus; "="; ce = class_expr -> - <:class_expr< ($ce$ : $ct$) >> - | p = labeled_ipatt; cfb = SELF -> - <:class_expr< fun $p$ -> $cfb$ >> - ] ] - ; - class_info_for_class_type: - [ [ mv = opt_virtual; (i, ot) = class_name_and_param -> - <:class_type< $virtual:mv$ $lid:i$ [ $ot$ ] >> - ] ] - ; - class_info_for_class_expr: - [ [ mv = opt_virtual; (i, ot) = class_name_and_param -> - <:class_expr< $virtual:mv$ $lid:i$ [ $ot$ ] >> - ] ] - ; - class_name_and_param: - [ [ i = a_LIDENT; "["; x = comma_type_parameter; "]" -> (i, x) - | i = a_LIDENT -> (i, <:ctyp<>>) - ] ] - ; - comma_type_parameter: - [ [ t1 = SELF; ","; t2 = SELF -> <:ctyp< $t1$, $t2$ >> - | `ANTIQUOT ("list" as n) s -> <:ctyp< $anti:mk_anti ~c:"ctyp," n s$ >> - | t = type_parameter -> t - ] ] - ; - opt_comma_ctyp: - [ [ "["; x = comma_ctyp; "]" -> x - | -> <:ctyp<>> - ] ] - ; - comma_ctyp: - [ [ t1 = SELF; ","; t2 = SELF -> <:ctyp< $t1$, $t2$ >> - | `ANTIQUOT ("list" as n) s -> <:ctyp< $anti:mk_anti ~c:"ctyp," n s$ >> - | t = ctyp -> t - ] ] - ; - class_fun_def: - [ [ p = labeled_ipatt; ce = SELF -> <:class_expr< fun $p$ -> $ce$ >> - | "->"; ce = class_expr -> ce ] ] - ; - class_expr: - [ "top" - [ "fun"; p = labeled_ipatt; ce = class_fun_def -> - <:class_expr< fun $p$ -> $ce$ >> - | "let"; rf = opt_rec; bi = binding; "in"; ce = SELF -> - <:class_expr< let $rec:rf$ $bi$ in $ce$ >> ] - | "apply" NONA - [ ce = SELF; e = expr LEVEL "label" -> - <:class_expr< $ce$ $e$ >> ] - | "simple" - [ `ANTIQUOT (""|"cexp"|"anti" as n) s -> - <:class_expr< $anti:mk_anti ~c:"class_expr" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_expr_tag - | ce = class_longident_and_param -> ce - | "object"; csp = opt_class_self_patt; cst = class_structure; "end" -> - <:class_expr< object ($csp$) $cst$ end >> - | "("; ce = SELF; ":"; ct = class_type; ")" -> - <:class_expr< ($ce$ : $ct$) >> - | "("; ce = SELF; ")" -> ce ] ] - ; - class_longident_and_param: - [ [ ci = class_longident; "["; t = comma_ctyp; "]" -> - <:class_expr< $id:ci$ [ $t$ ] >> - | ci = class_longident -> <:class_expr< $id:ci$ >> - ] ] - ; - class_structure: - [ [ `ANTIQUOT (""|"cst"|"anti"|"list" as n) s -> - <:class_str_item< $anti:mk_anti ~c:"class_str_item" n s$ >> - | `ANTIQUOT (""|"cst"|"anti"|"list" as n) s; semi; cst = SELF -> - <:class_str_item< $anti:mk_anti ~c:"class_str_item" n s$; $cst$ >> - | l = LIST0 [ cst = class_str_item; semi -> cst ] -> Ast.crSem_of_list l - ] ] - ; - opt_class_self_patt: - [ [ "("; p = patt; ")" -> p - | "("; p = patt; ":"; t = ctyp; ")" -> <:patt< ($p$ : $t$) >> - | -> <:patt<>> ] ] - ; - class_str_item: - [ LEFTA - [ `ANTIQUOT (""|"cst"|"anti"|"list" as n) s -> - <:class_str_item< $anti:mk_anti ~c:"class_str_item" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_str_item_tag - | "inherit"; o = opt_override; ce = class_expr; pb = opt_as_lident -> - <:class_str_item< inherit $override:o$ $ce$ as $pb$ >> - | o = value_val_opt_override; mf = opt_mutable; lab = label; e = cvalue_binding -> - <:class_str_item< value $override:o$ $mutable:mf$ $lab$ = $e$ >> - | o = value_val_opt_override; mf = opt_mutable; "virtual"; l = label; ":"; t = poly_type -> - if o <> <:override_flag<>> then - raise (Stream.Error "override (!) is incompatible with virtual") - else - <:class_str_item< value virtual $mutable:mf$ $l$ : $t$ >> - | o = value_val_opt_override; "virtual"; mf = opt_mutable; l = label; ":"; t = poly_type -> - if o <> <:override_flag<>> then - raise (Stream.Error "override (!) is incompatible with virtual") - else - <:class_str_item< value virtual $mutable:mf$ $l$ : $t$ >> - | o = method_opt_override; "virtual"; pf = opt_private; l = label; ":"; t = poly_type -> - if o <> <:override_flag<>> then - raise (Stream.Error "override (!) is incompatible with virtual") - else - <:class_str_item< method virtual $private:pf$ $l$ : $t$ >> - | o = method_opt_override; pf = opt_private; l = label; topt = opt_polyt; e = fun_binding -> - <:class_str_item< method $override:o$ $private:pf$ $l$ : $topt$ = $e$ >> - | o = method_opt_override; pf = opt_private; "virtual"; l = label; ":"; t = poly_type -> - if o <> <:override_flag<>> then - raise (Stream.Error "override (!) is incompatible with virtual") - else - <:class_str_item< method virtual $private:pf$ $l$ : $t$ >> - | type_constraint; t1 = ctyp; "="; t2 = ctyp -> - <:class_str_item< type $t1$ = $t2$ >> - | "initializer"; se = expr -> <:class_str_item< initializer $se$ >> ] ] - ; - method_opt_override: - [ [ "method"; "!" -> <:override_flag< ! >> - | "method"; `ANTIQUOT (("!"|"override"|"anti") as n) s -> Ast.OvAnt (mk_anti n s) - | "method" -> <:override_flag<>> - ] ] - ; - value_val_opt_override: - [ [ value_val; "!" -> <:override_flag< ! >> - | value_val; `ANTIQUOT (("!"|"override"|"anti") as n) s -> Ast.OvAnt (mk_anti n s) - | value_val -> <:override_flag<>> - ] ] - ; - opt_as_lident: - [ [ "as"; i = a_LIDENT -> i - | -> "" - ] ] - ; - opt_polyt: - [ [ ":"; t = poly_type -> t - | -> <:ctyp<>> ] ] - ; - cvalue_binding: - [ [ "="; e = expr -> e - | ":"; "type"; t1 = unquoted_typevars; "." ; t2 = ctyp ; "="; e = expr -> - let u = Ast.TyTypePol _loc t1 t2 in - <:expr< ($e$ : $u$) >> - | ":"; t = poly_type; "="; e = expr -> <:expr< ($e$ : $t$) >> - | ":"; t = poly_type; ":>"; t2 = ctyp; "="; e = expr -> - match t with - [ <:ctyp< ! $_$ . $_$ >> -> raise (Stream.Error "unexpected polytype here") - | _ -> <:expr< ($e$ : $t$ :> $t2$) >> ] - | ":>"; t = ctyp; "="; e = expr -> <:expr< ($e$ :> $t$) >> ] ] - ; - label: - [ [ i = a_LIDENT -> i ] ] - ; - class_type: - [ [ `ANTIQUOT (""|"ctyp"|"anti" as n) s -> - <:class_type< $anti:mk_anti ~c:"class_type" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_type_tag - | ct = class_type_longident_and_param -> ct - | "object"; cst = opt_class_self_type; csg = class_signature; "end" -> - <:class_type< object ($cst$) $csg$ end >> ] ] - ; - class_type_longident_and_param: - [ [ i = class_type_longident; "["; t = comma_ctyp; "]" -> - <:class_type< $id:i$ [ $t$ ] >> - | i = class_type_longident -> <:class_type< $id:i$ >> ] ] - ; - class_type_plus: - [ [ "["; t = ctyp; "]"; "->"; ct = SELF -> <:class_type< [ $t$ ] -> $ct$ >> - | ct = class_type -> ct ] ] - ; - opt_class_self_type: - [ [ "("; t = ctyp; ")" -> t - | -> <:ctyp<>> ] ] - ; - class_signature: - [ [ `ANTIQUOT (""|"csg"|"anti"|"list" as n) s -> - <:class_sig_item< $anti:mk_anti ~c:"class_sig_item" n s$ >> - | `ANTIQUOT (""|"csg"|"anti"|"list" as n) s; semi; csg = SELF -> - <:class_sig_item< $anti:mk_anti ~c:"class_sig_item" n s$; $csg$ >> - | l = LIST0 [ csg = class_sig_item; semi -> csg ] -> Ast.cgSem_of_list l - ] ] - ; - class_sig_item: - [ [ `ANTIQUOT (""|"csg"|"anti"|"list" as n) s -> - <:class_sig_item< $anti:mk_anti ~c:"class_sig_item" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_sig_item_tag - | "inherit"; cs = class_type -> <:class_sig_item< inherit $cs$ >> - | value_val; mf = opt_mutable; mv = opt_virtual; - l = label; ":"; t = ctyp -> - <:class_sig_item< value $mutable:mf$ $virtual:mv$ $l$ : $t$ >> - | "method"; "virtual"; pf = opt_private; l = label; ":"; t = poly_type -> - <:class_sig_item< method virtual $private:pf$ $l$ : $t$ >> - | "method"; pf = opt_private; l = label; ":"; t = poly_type -> - <:class_sig_item< method $private:pf$ $l$ : $t$ >> - | "method"; pf = opt_private; "virtual"; l = label; ":"; t = poly_type -> - <:class_sig_item< method virtual $private:pf$ $l$ : $t$ >> - | type_constraint; t1 = ctyp; "="; t2 = ctyp -> - <:class_sig_item< type $t1$ = $t2$ >> ] ] - ; - type_constraint: - [ [ "type" | "constraint" -> () ] ] - ; - class_description: - [ [ cd1 = SELF; "and"; cd2 = SELF -> <:class_type< $cd1$ and $cd2$ >> - | `ANTIQUOT (""|"typ"|"anti"|"list" as n) s -> - <:class_type< $anti:mk_anti ~c:"class_type" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_type_tag - | ci = class_info_for_class_type; ":"; ct = class_type_plus -> <:class_type< $ci$ : $ct$ >> - ] ] - ; - class_type_declaration: - [ LEFTA - [ cd1 = SELF; "and"; cd2 = SELF -> <:class_type< $cd1$ and $cd2$ >> - | `ANTIQUOT (""|"typ"|"anti"|"list" as n) s -> - <:class_type< $anti:mk_anti ~c:"class_type" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.class_type_tag - | ci = class_info_for_class_type; "="; ct = class_type -> <:class_type< $ci$ = $ct$ >> - ] ] - ; - field_expr_list: - [ [ b1 = field_expr; ";"; b2 = SELF -> <:rec_binding< $b1$ ; $b2$ >> - | b1 = field_expr; ";" -> b1 - | b1 = field_expr -> b1 - ] ]; - field_expr: - [ [ `ANTIQUOT (""|"bi"|"anti" as n) s -> - <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:rec_binding< $anti:mk_anti ~c:"rec_binding" n s$ >> - | l = label; "="; e = expr LEVEL "top" -> <:rec_binding< $lid:l$ = $e$ >> ] ] - ; - meth_list: - [ [ m = meth_decl; ";"; (ml, v) = SELF -> (<:ctyp< $m$; $ml$ >>, v) - | m = meth_decl; ";"; v = opt_dot_dot -> (m, v) - | m = meth_decl; v = opt_dot_dot -> (m, v) - ] ] - ; - meth_decl: - [ [ `ANTIQUOT (""|"typ" as n) s -> <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> <:ctyp< $anti:mk_anti ~c:"ctyp;" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | lab = a_LIDENT; ":"; t = poly_type -> <:ctyp< $lid:lab$ : $t$ >> ] ] - ; - opt_meth_list: - [ [ (ml, v) = meth_list -> <:ctyp< < $ml$ $..:v$ > >> - | v = opt_dot_dot -> <:ctyp< < $..:v$ > >> - ] ] - ; - poly_type: - [ [ t = ctyp -> t ] ] - ; - package_type: - [ [ p = module_type -> p ] ] - ; - typevars: - [ LEFTA - [ t1 = SELF; t2 = SELF -> <:ctyp< $t1$ $t2$ >> - | `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | "'"; i = a_ident -> <:ctyp< '$lid:i$ >> - ] ] - ; - unquoted_typevars: - [ LEFTA - [ t1 = SELF; t2 = SELF -> <:ctyp< $t1$ $t2$ >> - | `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `QUOTATION x -> Quotation.expand _loc x Quotation.DynAst.ctyp_tag - | i = a_ident -> <:ctyp< $lid:i$ >> - ] ] - ; - - row_field: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | `ANTIQUOT ("list" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp|" n s$ >> - | t1 = SELF; "|"; t2 = SELF -> <:ctyp< $t1$ | $t2$ >> - | "`"; i = a_ident -> <:ctyp< `$i$ >> - | "`"; i = a_ident; "of"; "&"; t = amp_ctyp -> <:ctyp< `$i$ of & $t$ >> - | "`"; i = a_ident; "of"; t = amp_ctyp -> <:ctyp< `$i$ of $t$ >> - | t = ctyp -> t ] ] - ; - amp_ctyp: - [ [ t1 = SELF; "&"; t2 = SELF -> <:ctyp< $t1$ & $t2$ >> - | `ANTIQUOT ("list" as n) s -> <:ctyp< $anti:mk_anti ~c:"ctyp&" n s$ >> - | t = ctyp -> t - ] ] - ; - name_tags: - [ [ `ANTIQUOT (""|"typ" as n) s -> - <:ctyp< $anti:mk_anti ~c:"ctyp" n s$ >> - | t1 = SELF; t2 = SELF -> <:ctyp< $t1$ $t2$ >> - | "`"; i = a_ident -> <:ctyp< `$i$ >> - ] ] - ; - eq_expr: - [ [ "="; e = expr -> fun i p -> <:patt< ? $i$ : ($p$ = $e$) >> - | -> fun i p -> <:patt< ? $i$ : ($p$) >> ] ] - ; - patt_tcon: - [ [ p = patt; ":"; t = ctyp -> <:patt< ($p$ : $t$) >> - | p = patt -> p ] ] - ; - ipatt: - [ [ `LABEL i; p = SELF -> <:patt< ~ $i$ : $p$ >> - | "~"; `ANTIQUOT (""|"lid" as n) i; ":"; p = SELF -> - <:patt< ~ $mk_anti n i$ : $p$ >> - | "~"; `ANTIQUOT (""|"lid" as n) i -> <:patt< ~ $mk_anti n i$ >> - | "~"; `LIDENT i -> <:patt< ~ $i$ >> - (* | i = opt_label; "("; p = ipatt_tcon; ")" -> - <:patt< ? $i$ : ($p$) >> - | i = opt_label; "("; p = ipatt_tcon; "="; e = expr; ")" -> - <:patt< ? $i$ : ($p$ = $e$) >> *) - | `OPTLABEL i; "("; p = ipatt_tcon; f = eq_expr; ")" -> f i p - | "?"; `ANTIQUOT (""|"lid" as n) i; ":"; "("; p = ipatt_tcon; - f = eq_expr; ")" -> f (mk_anti n i) p - | "?"; `LIDENT i -> <:patt< ? $i$ >> - | "?"; `ANTIQUOT (""|"lid" as n) i -> <:patt< ? $mk_anti n i$ >> - | "?"; "("; p = ipatt_tcon; ")" -> - <:patt< ? ($p$) >> - | "?"; "("; p = ipatt_tcon; "="; e = expr; ")" -> - <:patt< ? ($p$ = $e$) >> ] ] - ; - ipatt_tcon: - [ [ p = ipatt; ":"; t = ctyp -> <:patt< ($p$ : $t$) >> - | p = ipatt -> p ] ] - ; - direction_flag: - [ [ "to" -> <:direction_flag< to >> - | "downto" -> <:direction_flag< downto >> - | `ANTIQUOT ("to"|"anti" as n) s -> Ast.DiAnt (mk_anti n s) ] ] - ; - opt_private: - [ [ "private" -> <:private_flag< private >> - | `ANTIQUOT ("private"|"anti" as n) s -> Ast.PrAnt (mk_anti n s) - | -> <:private_flag<>> - ] ] - ; - opt_mutable: - [ [ "mutable" -> <:mutable_flag< mutable >> - | `ANTIQUOT ("mutable"|"anti" as n) s -> Ast.MuAnt (mk_anti n s) - | -> <:mutable_flag<>> - ] ] - ; - opt_virtual: - [ [ "virtual" -> <:virtual_flag< virtual >> - | `ANTIQUOT ("virtual"|"anti" as n) s -> Ast.ViAnt (mk_anti n s) - | -> <:virtual_flag<>> - ] ] - ; - opt_dot_dot: - [ [ ".." -> <:row_var_flag< .. >> - | `ANTIQUOT (".."|"anti" as n) s -> Ast.RvAnt (mk_anti n s) - | -> <:row_var_flag<>> - ] ] - ; - opt_rec: - [ [ "rec" -> <:rec_flag< rec >> - | `ANTIQUOT ("rec"|"anti" as n) s -> Ast.ReAnt (mk_anti n s) - | -> <:rec_flag<>> - ] ] - ; - opt_override: - [ [ "!" -> <:override_flag< ! >> - | `ANTIQUOT (("!"|"override"|"anti") as n) s -> Ast.OvAnt (mk_anti n s) - | -> <:override_flag<>> - ] ] - ; - opt_expr: - [ [ e = expr -> e - | -> <:expr<>> - ] ] - ; - interf: - [ [ "#"; n = a_LIDENT; dp = opt_expr; semi -> - ([ <:sig_item< # $n$ $dp$ >> ], stopped_at _loc) - | si = sig_item; semi; (sil, stopped) = SELF -> ([si :: sil], stopped) - | `EOI -> ([], None) ] ] - ; - sig_items: - [ [ `ANTIQUOT (""|"sigi"|"anti"|"list" as n) s -> - <:sig_item< $anti:mk_anti n ~c:"sig_item" s$ >> - | `ANTIQUOT (""|"sigi"|"anti"|"list" as n) s; semi; sg = SELF -> - <:sig_item< $anti:mk_anti n ~c:"sig_item" s$; $sg$ >> - | l = LIST0 [ sg = sig_item; semi -> sg ] -> Ast.sgSem_of_list l - ] ] - ; - implem: - [ [ "#"; n = a_LIDENT; dp = opt_expr; semi -> - ([ <:str_item< # $n$ $dp$ >> ], stopped_at _loc) - | si = str_item; semi; (sil, stopped) = SELF -> ([si :: sil], stopped) - | `EOI -> ([], None) - ] ] - ; - str_items: - [ [ `ANTIQUOT (""|"stri"|"anti"|"list" as n) s -> - <:str_item< $anti:mk_anti n ~c:"str_item" s$ >> - | `ANTIQUOT (""|"stri"|"anti"|"list" as n) s; semi; st = SELF -> - <:str_item< $anti:mk_anti n ~c:"str_item" s$; $st$ >> - | l = LIST0 [ st = str_item; semi -> st ] -> Ast.stSem_of_list l - ] ] - ; - top_phrase: - [ [ ph = phrase -> Some ph - | `EOI -> None - ] ] - ; - use_file: - [ [ "#"; n = a_LIDENT; dp = opt_expr; semi -> - ([ <:str_item< # $n$ $dp$ >> ], stopped_at _loc) - | si = str_item; semi; (sil, stopped) = SELF -> ([si :: sil], stopped) - | `EOI -> ([], None) - ] ] - ; - phrase: - [ [ "#"; n = a_LIDENT; dp = opt_expr; semi -> - <:str_item< # $n$ $dp$ >> - | st = str_item; semi -> st - ] ] - ; - a_INT: - [ [ `ANTIQUOT (""|"int"|"`int" as n) s -> mk_anti n s - | `INT _ s -> s ] ] - ; - a_INT32: - [ [ `ANTIQUOT (""|"int32"|"`int32" as n) s -> mk_anti n s - | `INT32 _ s -> s ] ] - ; - a_INT64: - [ [ `ANTIQUOT (""|"int64"|"`int64" as n) s -> mk_anti n s - | `INT64 _ s -> s ] ] - ; - a_NATIVEINT: - [ [ `ANTIQUOT (""|"nativeint"|"`nativeint" as n) s -> mk_anti n s - | `NATIVEINT _ s -> s ] ] - ; - a_FLOAT: - [ [ `ANTIQUOT (""|"flo"|"`flo" as n) s -> mk_anti n s - | `FLOAT _ s -> s ] ] - ; - a_CHAR: - [ [ `ANTIQUOT (""|"chr"|"`chr" as n) s -> mk_anti n s - | `CHAR _ s -> s ] ] - ; - a_UIDENT: - [ [ `ANTIQUOT (""|"uid" as n) s -> mk_anti n s - | `UIDENT s -> s ] ] - ; - a_LIDENT: - [ [ `ANTIQUOT (""|"lid" as n) s -> mk_anti n s - | `LIDENT s -> s ] ] - ; - a_LABEL: - [ [ "~"; `ANTIQUOT ("" as n) s; ":" -> mk_anti n s - | `LABEL s -> s ] ] - ; - a_OPTLABEL: - [ [ "?"; `ANTIQUOT ("" as n) s; ":" -> mk_anti n s - | `OPTLABEL s -> s ] ] - ; - a_STRING: - [ [ `ANTIQUOT (""|"str"|"`str" as n) s -> mk_anti n s - | `STRING _ s -> s ] ] - ; - string_list: - [ [ `ANTIQUOT (""|"str_list") s -> Ast.LAnt (mk_anti "str_list" s) - | `STRING _ x; xs = string_list -> Ast.LCons x xs - | `STRING _ x -> Ast.LCons x Ast.LNil ] ] - ; - value_let: - [ [ "value" -> () ] ] - ; - value_val: - [ [ "value" -> () ] ] - ; - semi: - [ [ ";" -> () ] ] - ; - expr_quot: - [ [ e1 = expr; ","; e2 = comma_expr -> <:expr< $e1$, $e2$ >> - | e1 = expr; ";"; e2 = sem_expr -> <:expr< $e1$; $e2$ >> - | e = expr -> e - | -> <:expr<>> - ] ] - ; - patt_quot: - [ [ x = patt; ","; y = comma_patt -> <:patt< $x$, $y$ >> - | x = patt; ";"; y = sem_patt -> <:patt< $x$; $y$ >> - | x = patt; "="; y = patt -> - let i = - match x with - [ <:patt@loc< $anti:s$ >> -> <:ident@loc< $anti:s$ >> - | p -> Ast.ident_of_patt p ] - in - <:patt< $i$ = $y$ >> - | x = patt -> x - | -> <:patt<>> - ] ] - ; - ctyp_quot: - [ [ x = more_ctyp; ","; y = comma_ctyp -> <:ctyp< $x$, $y$ >> - | x = more_ctyp; ";"; y = label_declaration_list -> <:ctyp< $x$; $y$ >> - | x = more_ctyp; "|"; y = constructor_declarations -> <:ctyp< $x$ | $y$ >> - | x = more_ctyp; "of"; y = constructor_arg_list -> <:ctyp< $x$ of $y$ >> - | x = more_ctyp; "of"; y = constructor_arg_list; "|"; z = constructor_declarations -> - <:ctyp< $ <:ctyp< $x$ of $y$ >> $ | $z$ >> - | x = more_ctyp; "of"; "&"; y = amp_ctyp -> <:ctyp< $x$ of & $y$ >> - | x = more_ctyp; "of"; "&"; y = amp_ctyp; "|"; z = row_field -> - <:ctyp< $ <:ctyp< $x$ of & $y$ >> $ | $z$ >> - | x = more_ctyp; ":"; y = more_ctyp -> <:ctyp< $x$ : $y$ >> - | x = more_ctyp; ":"; y = more_ctyp; ";"; z = label_declaration_list -> - <:ctyp< $ <:ctyp< $x$ : $y$ >> $ ; $z$ >> - | x = more_ctyp; "*"; y = star_ctyp -> <:ctyp< $x$ * $y$ >> - | x = more_ctyp; "&"; y = amp_ctyp -> <:ctyp< $x$ & $y$ >> - | x = more_ctyp; "and"; y = constructor_arg_list -> <:ctyp< $x$ and $y$ >> - | x = more_ctyp -> x - | -> <:ctyp<>> - ] ] - ; - more_ctyp: - [ [ "mutable"; x = SELF -> <:ctyp< mutable $x$ >> - | "`"; x = a_ident -> <:ctyp< `$x$ >> - | x = ctyp -> x - | x = type_parameter -> x - ] ] - ; - str_item_quot: - [ [ "#"; n = a_LIDENT; dp = opt_expr -> <:str_item< # $n$ $dp$ >> - | st1 = str_item; semi; st2 = SELF -> - match st2 with - [ <:str_item<>> -> st1 - | _ -> <:str_item< $st1$; $st2$ >> ] - | st = str_item -> st - | -> <:str_item<>> ] ] - ; - sig_item_quot: - [ [ "#"; n = a_LIDENT; dp = opt_expr -> <:sig_item< # $n$ $dp$ >> - | sg1 = sig_item; semi; sg2 = SELF -> - match sg2 with - [ <:sig_item<>> -> sg1 - | _ -> <:sig_item< $sg1$; $sg2$ >> ] - | sg = sig_item -> sg - | -> <:sig_item<>> ] ] - ; - module_type_quot: - [ [ x = module_type -> x - | -> <:module_type<>> - ] ] - ; - module_expr_quot: - [ [ x = module_expr -> x - | -> <:module_expr<>> - ] ] - ; - match_case_quot: - [ [ x = LIST0 match_case0 SEP "|" -> <:match_case< $list:x$ >> - | -> <:match_case<>> ] ] - ; - binding_quot: - [ [ x = binding -> x - | -> <:binding<>> - ] ] - ; - rec_binding_quot: - [ [ x = label_expr_list -> x - | -> <:rec_binding<>> ] ] - ; - module_binding_quot: - [ [ b1 = SELF; "and"; b2 = SELF -> - <:module_binding< $b1$ and $b2$ >> - | `ANTIQUOT ("module_binding"|"anti" as n) s -> - <:module_binding< $anti:mk_anti ~c:"module_binding" n s$ >> - | `ANTIQUOT ("" as n) s -> <:module_binding< $anti:mk_anti ~c:"module_binding" n s$ >> - | `ANTIQUOT ("" as n) m; ":"; mt = module_type -> - <:module_binding< $mk_anti n m$ : $mt$ >> - | `ANTIQUOT ("" as n) m; ":"; mt = module_type; "="; me = module_expr -> - <:module_binding< $mk_anti n m$ : $mt$ = $me$ >> - | m = a_UIDENT; ":"; mt = module_type -> <:module_binding< $m$ : $mt$ >> - | m = a_UIDENT; ":"; mt = module_type; "="; me = module_expr -> - <:module_binding< $m$ : $mt$ = $me$ >> - | -> <:module_binding<>> - ] ] - ; - ident_quot: - [ "apply" - [ i = SELF; j = SELF -> <:ident< $i$ $j$ >> ] - | "." - [ i = SELF; "."; j = SELF -> <:ident< $i$.$j$ >> ] - | "simple" - [ `ANTIQUOT (""|"id"|"anti"|"list" as n) s -> - <:ident< $anti:mk_anti ~c:"ident" n s$ >> - | i = a_UIDENT -> <:ident< $uid:i$ >> - | i = a_LIDENT -> <:ident< $lid:i$ >> - | `ANTIQUOT (""|"id"|"anti"|"list" as n) s; "."; i = SELF -> - <:ident< $anti:mk_anti ~c:"ident" n s$.$i$ >> - | "("; i = SELF; ")" -> i - ] ] - ; - class_expr_quot: - [ [ ce1 = SELF; "and"; ce2 = SELF -> <:class_expr< $ce1$ and $ce2$ >> - | ce1 = SELF; "="; ce2 = SELF -> <:class_expr< $ce1$ = $ce2$ >> - | "virtual"; (i, ot) = class_name_and_param -> - <:class_expr< virtual $lid:i$ [ $ot$ ] >> - | `ANTIQUOT ("virtual" as n) s; i = ident; ot = opt_comma_ctyp -> - let anti = Ast.ViAnt (mk_anti ~c:"class_expr" n s) in - <:class_expr< $virtual:anti$ $id:i$ [ $ot$ ] >> - | x = class_expr -> x - | -> <:class_expr<>> - ] ] - ; - class_type_quot: - [ [ ct1 = SELF; "and"; ct2 = SELF -> <:class_type< $ct1$ and $ct2$ >> - | ct1 = SELF; "="; ct2 = SELF -> <:class_type< $ct1$ = $ct2$ >> - | ct1 = SELF; ":"; ct2 = SELF -> <:class_type< $ct1$ : $ct2$ >> - | "virtual"; (i, ot) = class_name_and_param -> - <:class_type< virtual $lid:i$ [ $ot$ ] >> - | `ANTIQUOT ("virtual" as n) s; i = ident; ot = opt_comma_ctyp -> - let anti = Ast.ViAnt (mk_anti ~c:"class_type" n s) in - <:class_type< $virtual:anti$ $id:i$ [ $ot$ ] >> - | x = class_type_plus -> x - | -> <:class_type<>> - ] ] - ; - class_str_item_quot: - [ [ x1 = class_str_item; semi; x2 = SELF -> - match x2 with - [ <:class_str_item<>> -> x1 - | _ -> <:class_str_item< $x1$; $x2$ >> ] - | x = class_str_item -> x - | -> <:class_str_item<>> ] ] - ; - class_sig_item_quot: - [ [ x1 = class_sig_item; semi; x2 = SELF -> - match x2 with - [ <:class_sig_item<>> -> x1 - | _ -> <:class_sig_item< $x1$; $x2$ >> ] - | x = class_sig_item -> x - | -> <:class_sig_item<>> ] ] - ; - with_constr_quot: - [ [ x = with_constr -> x - | -> <:with_constr<>> ] ] - ; - rec_flag_quot: [ [ x = opt_rec -> x ] ]; - direction_flag_quot: [ [ x = direction_flag -> x ] ]; - mutable_flag_quot: [ [ x = opt_mutable -> x ] ]; - private_flag_quot: [ [ x = opt_private -> x ] ]; - virtual_flag_quot: [ [ x = opt_virtual -> x ] ]; - row_var_flag_quot: [ [ x = opt_dot_dot -> x ] ]; - override_flag_quot: [ [ x = opt_override -> x ] ]; - patt_eoi: - [ [ x = patt; `EOI -> x ] ] - ; - expr_eoi: - [ [ x = expr; `EOI -> x ] ] - ; - END in apply (); - -end; - -let module M = Register.OCamlSyntaxExtension Id Make in (); diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml deleted file mode 100644 index 2bdab6bf..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml +++ /dev/null @@ -1,394 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 1998-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - -module Id : Sig.Id = struct - value name = "Camlp4OCamlRevisedParserParser"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) = struct - open Sig; - include Syntax; - - type spat_comp = - [ SpTrm of Loc.t and Ast.patt and option Ast.expr - | SpNtr of Loc.t and Ast.patt and Ast.expr - | SpStr of Loc.t and Ast.patt ] - ; - type sexp_comp = - [ SeTrm of Loc.t and Ast.expr | SeNtr of Loc.t and Ast.expr ] - ; - - value stream_expr = Gram.Entry.mk "stream_expr"; - value stream_begin = Gram.Entry.mk "stream_begin"; - value stream_end = Gram.Entry.mk "stream_end"; - value stream_quot = Gram.Entry.mk "stream_quot"; - value parser_case = Gram.Entry.mk "parser_case"; - value parser_case_list = Gram.Entry.mk "parser_case_list"; - - value strm_n = "__strm"; - value peek_fun _loc = <:expr< Stream.peek >>; - value junk_fun _loc = <:expr< Stream.junk >>; - - (* Parsers. *) - (* In syntax generated, many cases are optimisations. *) - - value rec pattern_eq_expression p e = - match (p, e) with - [ (<:patt< $lid:a$ >>, <:expr< $lid:b$ >>) -> a = b - | (<:patt< $uid:a$ >>, <:expr< $uid:b$ >>) -> a = b - | (<:patt< $p1$ $p2$ >>, <:expr< $e1$ $e2$ >>) -> - pattern_eq_expression p1 e1 && pattern_eq_expression p2 e2 - | _ -> False ] - ; - - value is_raise e = - match e with - [ <:expr< raise $_$ >> -> True - | _ -> False ] - ; - - value is_raise_failure e = - match e with - [ <:expr< raise Stream.Failure >> -> True - | _ -> False ] - ; - - value rec handle_failure e = - match e with - [ <:expr< try $_$ with [ Stream.Failure -> $e$] >> -> - handle_failure e - | <:expr< match $me$ with [ $a$ ] >> -> - let rec match_case_handle_failure = - fun - [ <:match_case< $a1$ | $a2$ >> -> - match_case_handle_failure a1 && match_case_handle_failure a2 - | <:match_case< $pat:_$ -> $e$ >> -> handle_failure e - | _ -> False ] - in handle_failure me && match_case_handle_failure a - | <:expr< let $bi$ in $e$ >> -> - let rec binding_handle_failure = - fun - [ <:binding< $b1$ and $b2$ >> -> - binding_handle_failure b1 && binding_handle_failure b2 - | <:binding< $_$ = $e$ >> -> handle_failure e - | _ -> False ] - in binding_handle_failure bi && handle_failure e - | <:expr< $lid:_$ >> | <:expr< $int:_$ >> | <:expr< $str:_$ >> | - <:expr< $chr:_$ >> | <:expr< fun [ $_$ ] >> | <:expr< $uid:_$ >> -> - True - | <:expr< raise $e$ >> -> - match e with - [ <:expr< Stream.Failure >> -> False - | _ -> True ] - | <:expr< $f$ $x$ >> -> - is_constr_apply f && handle_failure f && handle_failure x - | _ -> False ] - and is_constr_apply = - fun - [ <:expr< $uid:_$ >> -> True - | <:expr< $lid:_$ >> -> False - | <:expr< $x$ $_$ >> -> is_constr_apply x - | _ -> False ] - ; - - value rec subst v e = - let _loc = Ast.loc_of_expr e in - match e with - [ <:expr< $lid:x$ >> -> - let x = if x = v then strm_n else x in - <:expr< $lid:x$ >> - | <:expr< $uid:_$ >> -> e - | <:expr< $int:_$ >> -> e - | <:expr< $chr:_$ >> -> e - | <:expr< $str:_$ >> -> e - | <:expr< $_$ . $_$ >> -> e - | <:expr< let $rec:rf$ $bi$ in $e$ >> -> - <:expr< let $rec:rf$ $subst_binding v bi$ in $subst v e$ >> - | <:expr< $e1$ $e2$ >> -> <:expr< $subst v e1$ $subst v e2$ >> - | <:expr< ( $tup:e$ ) >> -> <:expr< ( $tup:subst v e$ ) >> - | <:expr< $e1$, $e2$ >> -> <:expr< $subst v e1$, $subst v e2$ >> - | _ -> raise Not_found ] - and subst_binding v = - fun - [ <:binding@_loc< $b1$ and $b2$ >> -> - <:binding< $subst_binding v b1$ and $subst_binding v b2$ >> - | <:binding@_loc< $lid:v'$ = $e$ >> -> - <:binding< $lid:v'$ = $if v = v' then e else subst v e$ >> - | _ -> raise Not_found ]; - - value stream_pattern_component skont ckont = - fun - [ SpTrm _loc p None -> - <:expr< match $peek_fun _loc$ $lid:strm_n$ with - [ Some $p$ -> - do { $junk_fun _loc$ $lid:strm_n$; $skont$ } - | _ -> $ckont$ ] >> - | SpTrm _loc p (Some w) -> - <:expr< match $peek_fun _loc$ $lid:strm_n$ with - [ Some $p$ when $w$ -> - do { $junk_fun _loc$ $lid:strm_n$; $skont$ } - | _ -> $ckont$ ] >> - | SpNtr _loc p e -> - let e = - match e with - [ <:expr< fun [ ($lid:v$ : Stream.t _) -> $e$ ] >> when v = strm_n -> e - | _ -> <:expr< $e$ $lid:strm_n$ >> ] - in - if pattern_eq_expression p skont then - if is_raise_failure ckont then e - else if handle_failure e then e - else <:expr< try $e$ with [ Stream.Failure -> $ckont$ ] >> - else if is_raise_failure ckont then - <:expr< let $p$ = $e$ in $skont$ >> - else if pattern_eq_expression <:patt< Some $p$ >> skont then - <:expr< try Some $e$ with [ Stream.Failure -> $ckont$ ] >> - else if is_raise ckont then - let tst = - if handle_failure e then e - else <:expr< try $e$ with [ Stream.Failure -> $ckont$ ] >> - in - <:expr< let $p$ = $tst$ in $skont$ >> - else - <:expr< match try Some $e$ with [ Stream.Failure -> None ] with - [ Some $p$ -> $skont$ - | _ -> $ckont$ ] >> - | SpStr _loc p -> - try - match p with - [ <:patt< $lid:v$ >> -> subst v skont - | _ -> raise Not_found ] - with - [ Not_found -> <:expr< let $p$ = $lid:strm_n$ in $skont$ >> ] ] - ; - - value rec stream_pattern _loc epo e ekont = - fun - [ [] -> - match epo with - [ Some ep -> <:expr< let $ep$ = Stream.count $lid:strm_n$ in $e$ >> - | _ -> e ] - | [(spc, err) :: spcl] -> - let skont = - let ekont err = - let str = - match err with - [ Some estr -> estr - | _ -> <:expr< "" >> ] - in - <:expr< raise (Stream.Error $str$) >> - in - stream_pattern _loc epo e ekont spcl - in - let ckont = ekont err in stream_pattern_component skont ckont spc ] - ; - - value stream_patterns_term _loc ekont tspel = - let pel = - List.fold_right - (fun (p, w, _loc, spcl, epo, e) acc -> - let p = <:patt< Some $p$ >> in - let e = - let ekont err = - let str = - match err with - [ Some estr -> estr - | _ -> <:expr< "" >> ] - in - <:expr< raise (Stream.Error $str$) >> - in - let skont = stream_pattern _loc epo e ekont spcl in - <:expr< do { $junk_fun _loc$ $lid:strm_n$; $skont$ } >> - in - match w with - [ Some w -> <:match_case< $pat:p$ when $w$ -> $e$ | $acc$ >> - | None -> <:match_case< $pat:p$ -> $e$ | $acc$ >> ]) - tspel <:match_case<>> - in - <:expr< match $peek_fun _loc$ $lid:strm_n$ with [ $pel$ | _ -> $ekont ()$ ] >> - ; - - value rec group_terms = - fun - [ [([(SpTrm _loc p w, None) :: spcl], epo, e) :: spel] -> - let (tspel, spel) = group_terms spel in - ([(p, w, _loc, spcl, epo, e) :: tspel], spel) - | spel -> ([], spel) ] - ; - - value rec parser_cases _loc = - fun - [ [] -> <:expr< raise Stream.Failure >> - | spel -> - match group_terms spel with - [ ([], [(spcl, epo, e) :: spel]) -> - stream_pattern _loc epo e (fun _ -> parser_cases _loc spel) spcl - | (tspel, spel) -> - stream_patterns_term _loc (fun _ -> parser_cases _loc spel) tspel ] ] - ; - - value cparser _loc bpo pc = - let e = parser_cases _loc pc in - let e = - match bpo with - [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $e$ >> - | None -> e ] - in - let p = <:patt< ($lid:strm_n$ : Stream.t _) >> in - <:expr< fun $p$ -> $e$ >> - ; - - value cparser_match _loc me bpo pc = - let pc = parser_cases _loc pc in - let e = - match bpo with - [ Some bp -> <:expr< let $bp$ = Stream.count $lid:strm_n$ in $pc$ >> - | None -> pc ] - in - let me = - match me with - [ <:expr@_loc< $_$; $_$ >> as e -> <:expr< do { $e$ } >> - | e -> e ] - in - match me with - [ <:expr< $lid:x$ >> when x = strm_n -> e - | _ -> <:expr< let ($lid:strm_n$ : Stream.t _) = $me$ in $e$ >> ] - ; - - (* streams *) - - value rec not_computing = - fun - [ <:expr< $lid:_$ >> | <:expr< $uid:_$ >> | <:expr< $int:_$ >> | - <:expr< $flo:_$ >> | <:expr< $chr:_$ >> | <:expr< $str:_$ >> -> True - | <:expr< $x$ $y$ >> -> is_cons_apply_not_computing x && not_computing y - | _ -> False ] - and is_cons_apply_not_computing = - fun - [ <:expr< $uid:_$ >> -> True - | <:expr< $lid:_$ >> -> False - | <:expr< $x$ $y$ >> -> is_cons_apply_not_computing x && not_computing y - | _ -> False ] - ; - - value slazy _loc e = - match e with - [ <:expr< $f$ () >> -> - match f with - [ <:expr< $lid:_$ >> -> f - | _ -> <:expr< fun _ -> $e$ >> ] - | _ -> <:expr< fun _ -> $e$ >> ] - ; - - value rec cstream gloc = - fun - [ [] -> let _loc = gloc in <:expr< Stream.sempty >> - | [SeTrm _loc e] -> - if not_computing e then <:expr< Stream.ising $e$ >> - else <:expr< Stream.lsing $slazy _loc e$ >> - | [SeTrm _loc e :: secl] -> - if not_computing e then <:expr< Stream.icons $e$ $cstream gloc secl$ >> - else <:expr< Stream.lcons $slazy _loc e$ $cstream gloc secl$ >> - | [SeNtr _loc e] -> - if not_computing e then e else <:expr< Stream.slazy $slazy _loc e$ >> - | [SeNtr _loc e :: secl] -> - if not_computing e then <:expr< Stream.iapp $e$ $cstream gloc secl$ >> - else <:expr< Stream.lapp $slazy _loc e$ $cstream gloc secl$ >> ] - ; - (* Syntax extensions in Revised Syntax grammar *) - - EXTEND Gram - GLOBAL: expr stream_expr stream_begin stream_end stream_quot - parser_case parser_case_list; - expr: LEVEL "top" - [ [ "parser"; po = OPT parser_ipatt; pcl = parser_case_list -> - cparser _loc po pcl - | "match"; e = sequence; "with"; "parser"; po = OPT parser_ipatt; - pcl = parser_case_list -> - cparser_match _loc e po pcl - ] ] - ; - parser_case_list: - [ [ "["; pcl = LIST0 parser_case SEP "|"; "]" -> pcl - | pc = parser_case -> [pc] - ] ] - ; - parser_case: - [ [ stream_begin; sp = stream_patt; stream_end; po = OPT parser_ipatt; "->"; e = expr -> - (sp, po, e) ] ] - ; - stream_begin: - [ [ "[:" -> () ] ] - ; - stream_end: - [ [ ":]" -> () ] ] - ; - stream_quot: - [ [ "`" -> () ] ] - ; - stream_expr: - [ [ e = expr -> e ] ] - ; - stream_patt: - [ [ spc = stream_patt_comp -> [(spc, None)] - | spc = stream_patt_comp; ";"; sp = stream_patt_comp_err_list -> - [(spc, None) :: sp] - | -> [] ] ] - ; - stream_patt_comp_err: - [ [ spc = stream_patt_comp; eo = OPT [ "??"; e = stream_expr -> e ] -> - (spc, eo) ] ] - ; - stream_patt_comp_err_list: - [ [ spc = stream_patt_comp_err -> [spc] - | spc = stream_patt_comp_err; ";" -> [spc] - | spc = stream_patt_comp_err; ";"; sp = stream_patt_comp_err_list -> - [spc :: sp] ] ] - ; - stream_patt_comp: - [ [ stream_quot; p = patt; eo = OPT [ "when"; e = stream_expr -> e ] -> SpTrm _loc p eo - | p = patt; "="; e = stream_expr -> SpNtr _loc p e - | p = patt -> SpStr _loc p ] ] - ; - parser_ipatt: - [ [ i = a_LIDENT -> <:patt< $lid:i$ >> - | "_" -> <:patt< _ >> - ] ] - ; - expr: LEVEL "simple" - [ [ stream_begin; stream_end -> <:expr< $cstream _loc []$ >> - | stream_begin; sel = stream_expr_comp_list; stream_end -> - <:expr< $cstream _loc sel$ >> ] ] - ; - stream_expr_comp_list: - [ [ se = stream_expr_comp; ";"; sel = stream_expr_comp_list -> [se :: sel] - | se = stream_expr_comp; ";" -> [se] - | se = stream_expr_comp -> [se] ] ] - ; - stream_expr_comp: - [ [ stream_quot; e = stream_expr -> SeTrm _loc e - | e = stream_expr -> SeNtr _loc e ] ] - ; - END; - -end; - -module M = Register.OCamlSyntaxExtension Id Make; diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.ml deleted file mode 100644 index 2e32bcd8..00000000 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.ml +++ /dev/null @@ -1,24 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open PreCast; -let module Gram = MakeGram Lexer in -let module M1 = OCamlInitSyntax.Make Ast Gram Quotation in -let module M2 = Camlp4OCamlRevisedParser.Make M1 in -let module M3 = Camlp4QuotationCommon.Make M2 Syntax.AntiquotSyntax in (); diff --git a/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml b/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml deleted file mode 100644 index 3cf80b56..00000000 --- a/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml +++ /dev/null @@ -1,212 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -module Id = struct - value name = "Camlp4QuotationCommon"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) - (TheAntiquotSyntax : (Sig.Parser Syntax.Ast).SIMPLE) -= struct - open Sig; - include Syntax; (* Be careful an AntiquotSyntax module appears here *) - - module MetaLocHere = Ast.Meta.MetaLoc; - module MetaLoc = struct - module Ast = Ast; - value loc_name = ref None; - value meta_loc_expr _loc loc = - match loc_name.val with - [ None -> <:expr< $lid:Loc.name.val$ >> - | Some "here" -> MetaLocHere.meta_loc_expr _loc loc - | Some x -> <:expr< $lid:x$ >> ]; - value meta_loc_patt _loc _ = <:patt< _ >>; - end; - module MetaAst = Ast.Meta.Make MetaLoc; - module ME = MetaAst.Expr; - module MP = MetaAst.Patt; - - value is_antiquot s = - let len = String.length s in - len > 2 && s.[0] = '\\' && s.[1] = '$'; - - value handle_antiquot_in_string s term parse loc decorate = - if is_antiquot s then - let pos = String.index s ':' in - let name = String.sub s 2 (pos - 2) - and code = String.sub s (pos + 1) (String.length s - pos - 1) in - decorate name (parse loc code) - else term; - - value antiquot_expander = object - inherit Ast.map as super; - method patt = fun - [ <:patt@_loc< $anti:s$ >> | <:patt@_loc< $str:s$ >> as p -> - let mloc _loc = MetaLoc.meta_loc_patt _loc _loc in - handle_antiquot_in_string s p TheAntiquotSyntax.parse_patt _loc (fun n p -> - match n with - [ "antisig_item" -> <:patt< Ast.SgAnt $mloc _loc$ $p$ >> - | "antistr_item" -> <:patt< Ast.StAnt $mloc _loc$ $p$ >> - | "antictyp" -> <:patt< Ast.TyAnt $mloc _loc$ $p$ >> - | "antipatt" -> <:patt< Ast.PaAnt $mloc _loc$ $p$ >> - | "antiexpr" -> <:patt< Ast.ExAnt $mloc _loc$ $p$ >> - | "antimodule_type" -> <:patt< Ast.MtAnt $mloc _loc$ $p$ >> - | "antimodule_expr" -> <:patt< Ast.MeAnt $mloc _loc$ $p$ >> - | "anticlass_type" -> <:patt< Ast.CtAnt $mloc _loc$ $p$ >> - | "anticlass_expr" -> <:patt< Ast.CeAnt $mloc _loc$ $p$ >> - | "anticlass_sig_item" -> <:patt< Ast.CgAnt $mloc _loc$ $p$ >> - | "anticlass_str_item" -> <:patt< Ast.CrAnt $mloc _loc$ $p$ >> - | "antiwith_constr" -> <:patt< Ast.WcAnt $mloc _loc$ $p$ >> - | "antibinding" -> <:patt< Ast.BiAnt $mloc _loc$ $p$ >> - | "antirec_binding" -> <:patt< Ast.RbAnt $mloc _loc$ $p$ >> - | "antimatch_case" -> <:patt< Ast.McAnt $mloc _loc$ $p$ >> - | "antimodule_binding" -> <:patt< Ast.MbAnt $mloc _loc$ $p$ >> - | "antiident" -> <:patt< Ast.IdAnt $mloc _loc$ $p$ >> - | _ -> p ]) - | p -> super#patt p ]; - method expr = fun - [ <:expr@_loc< $anti:s$ >> | <:expr@_loc< $str:s$ >> as e -> - let mloc _loc = MetaLoc.meta_loc_expr _loc _loc in - handle_antiquot_in_string s e TheAntiquotSyntax.parse_expr _loc (fun n e -> - match n with - [ "`int" -> <:expr< string_of_int $e$ >> - | "`int32" -> <:expr< Int32.to_string $e$ >> - | "`int64" -> <:expr< Int64.to_string $e$ >> - | "`nativeint" -> <:expr< Nativeint.to_string $e$ >> - | "`flo" -> <:expr< Camlp4_import.Oprint.float_repres $e$ >> - | "`str" -> <:expr< Ast.safe_string_escaped $e$ >> - | "`chr" -> <:expr< Char.escaped $e$ >> - | "`bool" -> <:expr< Ast.IdUid $mloc _loc$ (if $e$ then "True" else "False") >> - | "liststr_item" -> <:expr< Ast.stSem_of_list $e$ >> - | "listsig_item" -> <:expr< Ast.sgSem_of_list $e$ >> - | "listclass_sig_item" -> <:expr< Ast.cgSem_of_list $e$ >> - | "listclass_str_item" -> <:expr< Ast.crSem_of_list $e$ >> - | "listmodule_expr" -> <:expr< Ast.meApp_of_list $e$ >> - | "listmodule_type" -> <:expr< Ast.mtApp_of_list $e$ >> - | "listmodule_binding" -> <:expr< Ast.mbAnd_of_list $e$ >> - | "listbinding" -> <:expr< Ast.biAnd_of_list $e$ >> - | "listbinding;" -> <:expr< Ast.biSem_of_list $e$ >> - | "listrec_binding" -> <:expr< Ast.rbSem_of_list $e$ >> - | "listclass_type" -> <:expr< Ast.ctAnd_of_list $e$ >> - | "listclass_expr" -> <:expr< Ast.ceAnd_of_list $e$ >> - | "listident" -> <:expr< Ast.idAcc_of_list $e$ >> - | "listctypand" -> <:expr< Ast.tyAnd_of_list $e$ >> - | "listctyp;" -> <:expr< Ast.tySem_of_list $e$ >> - | "listctyp*" -> <:expr< Ast.tySta_of_list $e$ >> - | "listctyp|" -> <:expr< Ast.tyOr_of_list $e$ >> - | "listctyp," -> <:expr< Ast.tyCom_of_list $e$ >> - | "listctyp&" -> <:expr< Ast.tyAmp_of_list $e$ >> - | "listwith_constr" -> <:expr< Ast.wcAnd_of_list $e$ >> - | "listmatch_case" -> <:expr< Ast.mcOr_of_list $e$ >> - | "listpatt," -> <:expr< Ast.paCom_of_list $e$ >> - | "listpatt;" -> <:expr< Ast.paSem_of_list $e$ >> - | "listexpr," -> <:expr< Ast.exCom_of_list $e$ >> - | "listexpr;" -> <:expr< Ast.exSem_of_list $e$ >> - | "antisig_item" -> <:expr< Ast.SgAnt $mloc _loc$ $e$ >> - | "antistr_item" -> <:expr< Ast.StAnt $mloc _loc$ $e$ >> - | "antictyp" -> <:expr< Ast.TyAnt $mloc _loc$ $e$ >> - | "antipatt" -> <:expr< Ast.PaAnt $mloc _loc$ $e$ >> - | "antiexpr" -> <:expr< Ast.ExAnt $mloc _loc$ $e$ >> - | "antimodule_type" -> <:expr< Ast.MtAnt $mloc _loc$ $e$ >> - | "antimodule_expr" -> <:expr< Ast.MeAnt $mloc _loc$ $e$ >> - | "anticlass_type" -> <:expr< Ast.CtAnt $mloc _loc$ $e$ >> - | "anticlass_expr" -> <:expr< Ast.CeAnt $mloc _loc$ $e$ >> - | "anticlass_sig_item" -> <:expr< Ast.CgAnt $mloc _loc$ $e$ >> - | "anticlass_str_item" -> <:expr< Ast.CrAnt $mloc _loc$ $e$ >> - | "antiwith_constr" -> <:expr< Ast.WcAnt $mloc _loc$ $e$ >> - | "antibinding" -> <:expr< Ast.BiAnt $mloc _loc$ $e$ >> - | "antirec_binding" -> <:expr< Ast.RbAnt $mloc _loc$ $e$ >> - | "antimatch_case" -> <:expr< Ast.McAnt $mloc _loc$ $e$ >> - | "antimodule_binding" -> <:expr< Ast.MbAnt $mloc _loc$ $e$ >> - | "antiident" -> <:expr< Ast.IdAnt $mloc _loc$ $e$ >> - | _ -> e ]) - | e -> super#expr e ]; - end; - - value add_quotation name entry mexpr mpatt = - let entry_eoi = Gram.Entry.mk (Gram.Entry.name entry) in - let parse_quot_string entry loc s = - let q = Camlp4_config.antiquotations.val in - let () = Camlp4_config.antiquotations.val := True in - let res = Gram.parse_string entry loc s in - let () = Camlp4_config.antiquotations.val := q in - res in - let expand_expr loc loc_name_opt s = - let ast = parse_quot_string entry_eoi loc s in - let () = MetaLoc.loc_name.val := loc_name_opt in - let meta_ast = mexpr loc ast in - let exp_ast = antiquot_expander#expr meta_ast in - exp_ast in - let expand_str_item loc loc_name_opt s = - let exp_ast = expand_expr loc loc_name_opt s in - <:str_item@loc< $exp:exp_ast$ >> in - let expand_patt _loc loc_name_opt s = - let ast = parse_quot_string entry_eoi _loc s in - let meta_ast = mpatt _loc ast in - let exp_ast = antiquot_expander#patt meta_ast in - match loc_name_opt with - [ None -> exp_ast - | Some name -> - let rec subst_first_loc = - fun - [ <:patt@_loc< Ast.$uid:u$ $_$ >> -> <:patt< Ast.$uid:u$ $lid:name$ >> - | <:patt@_loc< $a$ $b$ >> -> <:patt< $subst_first_loc a$ $b$ >> - | p -> p ] in - subst_first_loc exp_ast ] in - do { - EXTEND Gram - entry_eoi: - [ [ x = entry; `EOI -> x ] ] - ; - END; - Quotation.add name Quotation.DynAst.expr_tag expand_expr; - Quotation.add name Quotation.DynAst.patt_tag expand_patt; - Quotation.add name Quotation.DynAst.str_item_tag expand_str_item; - }; - - add_quotation "sig_item" sig_item_quot ME.meta_sig_item MP.meta_sig_item; - add_quotation "str_item" str_item_quot ME.meta_str_item MP.meta_str_item; - add_quotation "ctyp" ctyp_quot ME.meta_ctyp MP.meta_ctyp; - add_quotation "patt" patt_quot ME.meta_patt MP.meta_patt; - add_quotation "expr" expr_quot ME.meta_expr MP.meta_expr; - add_quotation "module_type" module_type_quot ME.meta_module_type MP.meta_module_type; - add_quotation "module_expr" module_expr_quot ME.meta_module_expr MP.meta_module_expr; - add_quotation "class_type" class_type_quot ME.meta_class_type MP.meta_class_type; - add_quotation "class_expr" class_expr_quot ME.meta_class_expr MP.meta_class_expr; - add_quotation "class_sig_item" - class_sig_item_quot ME.meta_class_sig_item MP.meta_class_sig_item; - add_quotation "class_str_item" - class_str_item_quot ME.meta_class_str_item MP.meta_class_str_item; - add_quotation "with_constr" with_constr_quot ME.meta_with_constr MP.meta_with_constr; - add_quotation "binding" binding_quot ME.meta_binding MP.meta_binding; - add_quotation "rec_binding" rec_binding_quot ME.meta_rec_binding MP.meta_rec_binding; - add_quotation "match_case" match_case_quot ME.meta_match_case MP.meta_match_case; - add_quotation "module_binding" - module_binding_quot ME.meta_module_binding MP.meta_module_binding; - add_quotation "ident" ident_quot ME.meta_ident MP.meta_ident; - add_quotation "rec_flag" rec_flag_quot ME.meta_rec_flag MP.meta_rec_flag; - add_quotation "private_flag" private_flag_quot ME.meta_private_flag MP.meta_private_flag; - add_quotation "row_var_flag" row_var_flag_quot ME.meta_row_var_flag MP.meta_row_var_flag; - add_quotation "mutable_flag" mutable_flag_quot ME.meta_mutable_flag MP.meta_mutable_flag; - add_quotation "virtual_flag" virtual_flag_quot ME.meta_virtual_flag MP.meta_virtual_flag; - add_quotation "override_flag" override_flag_quot ME.meta_override_flag MP.meta_override_flag; - add_quotation "direction_flag" direction_flag_quot ME.meta_direction_flag MP.meta_direction_flag; - -end; diff --git a/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml b/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml deleted file mode 100644 index 81680c6b..00000000 --- a/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml +++ /dev/null @@ -1,33 +0,0 @@ -open Camlp4; (* -*- camlp4r -*- *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - -module Id = struct - value name = "Camlp4QuotationExpander"; - value version = Sys.ocaml_version; -end; - -module Make (Syntax : Sig.Camlp4Syntax) -= struct - module M = Camlp4QuotationCommon.Make Syntax Syntax.AntiquotSyntax; - include M; -end; - -let module M = Register.OCamlSyntaxExtension Id Make in (); diff --git a/camlp4/Camlp4Printers/Camlp4AstDumper.ml b/camlp4/Camlp4Printers/Camlp4AstDumper.ml deleted file mode 100644 index b9adf908..00000000 --- a/camlp4/Camlp4Printers/Camlp4AstDumper.ml +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -Camlp4.Register.enable_dump_camlp4_ast_printer (); diff --git a/camlp4/Camlp4Printers/Camlp4AutoPrinter.ml b/camlp4/Camlp4Printers/Camlp4AutoPrinter.ml deleted file mode 100644 index 4b2787ef..00000000 --- a/camlp4/Camlp4Printers/Camlp4AutoPrinter.ml +++ /dev/null @@ -1,24 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -open Camlp4.Register; - -if Unix.isatty Unix.stdout then - enable_ocaml_printer () -else - enable_dump_ocaml_ast_printer (); diff --git a/camlp4/Camlp4Printers/Camlp4NullDumper.ml b/camlp4/Camlp4Printers/Camlp4NullDumper.ml deleted file mode 100644 index 77105dc7..00000000 --- a/camlp4/Camlp4Printers/Camlp4NullDumper.ml +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -Camlp4.Register.enable_null_printer (); diff --git a/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml b/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml deleted file mode 100644 index 872be925..00000000 --- a/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -Camlp4.Register.enable_dump_ocaml_ast_printer (); diff --git a/camlp4/Camlp4Printers/Camlp4OCamlPrinter.ml b/camlp4/Camlp4Printers/Camlp4OCamlPrinter.ml deleted file mode 100644 index 63fd2a1c..00000000 --- a/camlp4/Camlp4Printers/Camlp4OCamlPrinter.ml +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -Camlp4.Register.enable_ocaml_printer (); diff --git a/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.ml b/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.ml deleted file mode 100644 index 4f8bf71d..00000000 --- a/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.ml +++ /dev/null @@ -1,19 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Nicolas Pouillard: initial version - *) - -Camlp4.Register.enable_ocamlr_printer (); diff --git a/camlp4/Camlp4Top.mlpack b/camlp4/Camlp4Top.mlpack deleted file mode 100644 index d3560fbb..00000000 --- a/camlp4/Camlp4Top.mlpack +++ /dev/null @@ -1,2 +0,0 @@ -Top -Rprint diff --git a/camlp4/Camlp4Top/Rprint.ml b/camlp4/Camlp4Top/Rprint.ml deleted file mode 100644 index 9e49aa0f..00000000 --- a/camlp4/Camlp4Top/Rprint.ml +++ /dev/null @@ -1,507 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -(* There is a few Obj.magic due to the fact that we no longer have compiler - files like Parsetree, Location, Longident but Camlp4_import that wrap them to - avoid name clashing. *) -module Toploop : sig - open Format; - open Camlp4_import; - value print_out_value : - ref (formatter -> Outcometree.out_value -> unit); - value print_out_type : - ref (formatter -> Outcometree.out_type -> unit); - value print_out_class_type : - ref (formatter -> Outcometree.out_class_type -> unit); - value print_out_module_type : - ref (formatter -> Outcometree.out_module_type -> unit); - value print_out_sig_item : - ref (formatter -> Outcometree.out_sig_item -> unit); - value print_out_signature : - ref (formatter -> list Outcometree.out_sig_item -> unit); - value print_out_phrase : - ref (formatter -> Outcometree.out_phrase -> unit); -end = struct - open Toploop; - value print_out_value = Obj.magic print_out_value; - value print_out_type = Obj.magic print_out_type; - value print_out_class_type = Obj.magic print_out_class_type; - value print_out_module_type = Obj.magic print_out_module_type; - value print_out_sig_item = Obj.magic print_out_sig_item; - value print_out_signature = Obj.magic print_out_signature; - value print_out_phrase = Obj.magic print_out_phrase; -end; - -(* This file originally come from typing/oprint.ml *) - -open Format; -open Camlp4_import.Outcometree; -open Camlp4; - -exception Ellipsis; -value cautious f ppf arg = - try f ppf arg with [ Ellipsis -> fprintf ppf "..." ] -; - -value rec print_ident ppf = - fun - [ Oide_ident s -> fprintf ppf "%s" s - | Oide_dot id s -> fprintf ppf "%a.%s" print_ident id s - | Oide_apply id1 id2 -> - fprintf ppf "%a(%a)" print_ident id1 print_ident id2 ] -; - -value value_ident ppf name = - if List.mem name ["or"; "mod"; "land"; "lor"; "lxor"; "lsl"; "lsr"; "asr"] - then - fprintf ppf "( %s )" name - else - match name.[0] with - [ 'a'..'z' | '\223'..'\246' | '\248'..'\255' | '_' -> - fprintf ppf "%s" name - | _ -> fprintf ppf "( %s )" name ] -; - -(* Values *) - -value print_out_value ppf tree = - let rec print_tree ppf = - fun - [ Oval_constr name ([_ :: _] as params) -> - fprintf ppf "@[<1>%a@ %a@]" print_ident name - (print_tree_list print_simple_tree "") params - | Oval_variant name (Some param) -> - fprintf ppf "@[<2>`%s@ %a@]" name print_simple_tree param - | tree -> print_simple_tree ppf tree ] - and print_simple_tree ppf = - fun - [ Oval_int i -> fprintf ppf "%i" i - | Oval_int32 i -> fprintf ppf "%ldl" i - | Oval_int64 i -> fprintf ppf "%LdL" i - | Oval_nativeint i -> fprintf ppf "%ndn" i - | Oval_float f -> fprintf ppf "%.12g" f - | Oval_char c -> fprintf ppf "'%s'" (Char.escaped c) - | Oval_string s -> - try fprintf ppf "\"%s\"" (String.escaped s) with - [ Invalid_argument "String.create" -> fprintf ppf "" ] - | Oval_list tl -> - fprintf ppf "@[<1>[%a]@]" (print_tree_list print_tree ";") tl - | Oval_array tl -> - fprintf ppf "@[<2>[|%a|]@]" (print_tree_list print_tree ";") tl - | Oval_constr (Oide_ident "true") [] -> fprintf ppf "True" - | Oval_constr (Oide_ident "false") [] -> fprintf ppf "False" - | Oval_constr name [] -> print_ident ppf name - | Oval_variant name None -> fprintf ppf "`%s" name - | Oval_stuff s -> fprintf ppf "%s" s - | Oval_record fel -> - fprintf ppf "@[<1>{%a}@]" (cautious (print_fields True)) fel - | Oval_tuple tree_list -> - fprintf ppf "@[(%a)@]" (print_tree_list print_tree ",") tree_list - | Oval_ellipsis -> raise Ellipsis - | Oval_printer f -> f ppf - | tree -> fprintf ppf "@[<1>(%a)@]" (cautious print_tree) tree ] - and print_fields first ppf = - fun - [ [] -> () - | [(name, tree) :: fields] -> - let name = - match name with - [ Oide_ident "contents" -> Oide_ident "val" - | x -> x ] - in - do { - if not first then fprintf ppf ";@ " else (); - fprintf ppf "@[<1>%a=@,%a@]" print_ident name (cautious print_tree) - tree; - print_fields False ppf fields - } ] - and print_tree_list print_item sep ppf tree_list = - let rec print_list first ppf = - fun - [ [] -> () - | [tree :: tree_list] -> - do { - if not first then fprintf ppf "%s@ " sep else (); - print_item ppf tree; - print_list False ppf tree_list - } ] - in - cautious (print_list True) ppf tree_list - in - cautious print_tree ppf tree -; - -value rec print_list pr sep ppf = - fun - [ [] -> () - | [a] -> pr ppf a - | [a :: l] -> do { pr ppf a; sep ppf; print_list pr sep ppf l } ] -; - -value pr_vars = - print_list (fun ppf s -> fprintf ppf "'%s" s) (fun ppf -> fprintf ppf "@ ") -; - -value pr_present = - print_list (fun ppf s -> fprintf ppf "`%s" s) (fun ppf -> fprintf ppf "@ ") -; - -(* Types *) - -value rec print_out_type ppf = - fun - [ Otyp_alias ty s -> fprintf ppf "@[%a as '%s@]" print_out_type ty s - | ty -> print_out_type_1 ppf ty ] -and print_out_type_1 ppf = - fun - [ Otyp_arrow lab ty1 ty2 -> - fprintf ppf "@[%a%a ->@ %a@]" print_ty_label lab - print_out_type_2 ty1 print_out_type_1 ty2 - | Otyp_poly sl ty -> - fprintf ppf "@[!%a.@ %a@]" - pr_vars sl - print_out_type ty - | ty -> print_out_type_2 ppf ty ] -and print_out_type_2 ppf = - fun - [ Otyp_constr id ([_ :: _] as tyl) -> - fprintf ppf "@[%a@;<1 2>%a@]" print_ident id - (print_typlist print_simple_out_type "") tyl - | ty -> print_simple_out_type ppf ty ] -and print_simple_out_type ppf = - let rec print_tkind ppf = - fun - [ Otyp_var ng s -> fprintf ppf "'%s%s" (if ng then "_" else "") s - | Otyp_constr id [] -> fprintf ppf "@[%a@]" print_ident id - | Otyp_tuple tyl -> - fprintf ppf "@[<1>(%a)@]" (print_typlist print_out_type " *") tyl - | Otyp_stuff s -> fprintf ppf "%s" s - | Otyp_variant non_gen row_fields closed tags -> - let print_present ppf = - fun - [ None | Some [] -> () - | Some l -> fprintf ppf "@;<1 -2>> @[%a@]" pr_present l ] - in - let print_fields ppf = - fun - [ Ovar_fields fields -> - print_list print_row_field (fun ppf -> fprintf ppf "@;<1 -2>| ") - ppf fields - | Ovar_name id tyl -> - fprintf ppf "@[%a%a@]" print_typargs tyl print_ident id ] - in - fprintf ppf "%s[%s@[@[%a@]%a ]@]" (if non_gen then "_" else "") - (if closed then if tags = None then "= " else "< " - else if tags = None then "> " - else "? ") - print_fields row_fields - print_present tags - | Otyp_object fields rest -> - fprintf ppf "@[<2>< %a >@]" (print_fields rest) fields - | Otyp_class ng id tyl -> - fprintf ppf "@[%a%s#%a@]" print_typargs tyl (if ng then "_" else "") - print_ident id - | Otyp_manifest ty1 ty2 -> - fprintf ppf "@[<2>%a ==@ %a@]" print_out_type ty1 print_out_type ty2 - | Otyp_sum constrs -> - fprintf ppf "@[[ %a ]@]" - (print_list print_out_constr (fun ppf -> fprintf ppf "@ | ")) constrs - | Otyp_record lbls -> - fprintf ppf "@[{ %a }@]" - (print_list print_out_label (fun ppf -> fprintf ppf ";@ ")) lbls - | Otyp_abstract -> fprintf ppf "" - | Otyp_module (p, n, tyl) -> - do { - fprintf ppf "@[<1>(module %s" p; - let first = ref True in - List.iter2 - (fun s t -> - let sep = if first.val then do { first.val := False; "with" } else "and" in - fprintf ppf " %s type %s = %a" sep s print_out_type t - ) - n tyl; - fprintf ppf ")@]" - } - | Otyp_alias _ _ | Otyp_poly _ _ - | Otyp_arrow _ _ _ | Otyp_constr _ [_ :: _] as ty -> - fprintf ppf "@[<1>(%a)@]" print_out_type ty ] - in - print_tkind ppf -and print_out_constr ppf (name, tyl, ret) = - match (tyl,ret) with - [ ([], None) -> fprintf ppf "%s" name - | ([], Some r) -> fprintf ppf "@[<2>%s:@ %a@]" name print_out_type r - | (_,Some r) -> - fprintf ppf "@[<2>%s:@ %a -> %a@]" name - (print_typlist print_out_type " and") tyl print_out_type r - | (_,None) -> - fprintf ppf "@[<2>%s of@ %a@]" name - (print_typlist print_out_type " and") tyl ] -and print_out_label ppf (name, mut, arg) = - fprintf ppf "@[<2>%s :@ %s%a@]" name (if mut then "mutable " else "") - print_out_type arg -and print_fields rest ppf = - fun - [ [] -> - match rest with - [ Some non_gen -> fprintf ppf "%s.." (if non_gen then "_" else "") - | None -> () ] - | [(s, t)] -> - do { - fprintf ppf "%s : %a" s print_out_type t; - match rest with - [ Some _ -> fprintf ppf ";@ " - | None -> () ]; - print_fields rest ppf [] - } - | [(s, t) :: l] -> - fprintf ppf "%s : %a;@ %a" s print_out_type t (print_fields rest) l ] -and print_row_field ppf (l, opt_amp, tyl) = - let pr_of ppf = - if opt_amp then fprintf ppf " of@ &@ " - else if tyl <> [] then fprintf ppf " of@ " - else fprintf ppf "" - in - fprintf ppf "@[`%s%t%a@]" l pr_of (print_typlist print_out_type " &") - tyl -and print_typlist print_elem sep ppf = - fun - [ [] -> () - | [ty] -> print_elem ppf ty - | [ty :: tyl] -> - fprintf ppf "%a%s@ %a" print_elem ty sep (print_typlist print_elem sep) - tyl ] -and print_typargs ppf = - fun - [ [] -> () - | [ty1] -> fprintf ppf "%a@ " print_simple_out_type ty1 - | tyl -> - fprintf ppf "@[<1>(%a)@]@ " (print_typlist print_out_type ",") tyl ] -and print_ty_label ppf lab = - if lab <> "" then fprintf ppf "%s%s:" (if lab.[0] = '?' then "" else "~") lab else () -; - -value type_parameter ppf (ty, (co, cn)) = - fprintf ppf "%s%s%s" - (if not cn then "+" else if not co then "-" else "") - (if ty = "_" then "" else "'") - ty -; - -value print_out_class_params ppf = - fun - [ [] -> () - | tyl -> - fprintf ppf "@[<1>[%a]@]@ " - (print_list type_parameter (fun ppf -> fprintf ppf ", ")) - tyl ] -; - -(* Signature items *) - -value rec print_out_class_type ppf = - fun - [ Octy_constr id tyl -> - let pr_tyl ppf = - fun - [ [] -> () - | tyl -> - fprintf ppf "@[<1>[%a]@]@ " - (print_typlist Toploop.print_out_type.val ",") tyl ] - in - fprintf ppf "@[%a%a@]" pr_tyl tyl print_ident id - | Octy_fun lab ty cty -> - fprintf ppf "@[%a[ %a ] ->@ %a@]" print_ty_label lab - Toploop.print_out_type.val ty print_out_class_type cty - | Octy_signature self_ty csil -> - let pr_param ppf = - fun - [ Some ty -> fprintf ppf "@ @[(%a)@]" Toploop.print_out_type.val ty - | None -> () ] - in - fprintf ppf "@[@[<2>object%a@]@ %a@;<1 -2>end@]" pr_param self_ty - (print_list print_out_class_sig_item (fun ppf -> fprintf ppf "@ ")) - csil ] -and print_out_class_sig_item ppf = - fun - [ Ocsg_constraint ty1 ty2 -> - fprintf ppf "@[<2>type %a =@ %a;@]" Toploop.print_out_type.val ty1 - Toploop.print_out_type.val ty2 - | Ocsg_method name priv virt ty -> - fprintf ppf "@[<2>method %s%s%s :@ %a;@]" - (if priv then "private " else "") (if virt then "virtual " else "") - name Toploop.print_out_type.val ty - | Ocsg_value name mut virt ty -> - fprintf ppf "@[<2>value %s%s%s :@ %a;@]" - (if mut then "mutable " else "") (if virt then "virtual " else "") - name Toploop.print_out_type.val ty ] -; - -value rec print_out_module_type ppf = - fun - [ Omty_ident id -> fprintf ppf "%a" print_ident id - | Omty_signature sg -> - fprintf ppf "@[sig@ %a@;<1 -2>end@]" - Toploop.print_out_signature.val sg - | Omty_functor name mty_arg mty_res -> - fprintf ppf "@[<2>functor@ (%s : %a) ->@ %a@]" name - print_out_module_type mty_arg print_out_module_type mty_res - | Omty_abstract -> () ] -and needs_semi = - fun - [ Osig_class _ _ _ _ rs - | Osig_class_type _ _ _ _ rs - | Osig_module _ _ rs - | Osig_type _ rs -> rs <> Orec_next - | Osig_exception _ _ - | Osig_modtype _ _ - | Osig_value _ _ _ -> True ] -and print_out_signature ppf = - fun - [ [] -> () - | [item] -> fprintf ppf "%a;" Toploop.print_out_sig_item.val item - | [item :: items] -> - let sep = match items with - [ [hd :: _] -> if needs_semi hd then ";" else "" - | [] -> ";" ] in - fprintf ppf "%a%s@ %a" Toploop.print_out_sig_item.val item sep - print_out_signature items ] -and print_out_sig_item ppf = - fun - [ Osig_class vir_flag name params clt rs -> - fprintf ppf "@[<2>%s%s@ %a%s@ :@ %a@]" - (if rs = Orec_next then "and" else "class") - (if vir_flag then " virtual" else "") print_out_class_params params - name Toploop.print_out_class_type.val clt - | Osig_class_type vir_flag name params clt rs -> - fprintf ppf "@[<2>%s%s@ %a%s@ =@ %a@]" - (if rs = Orec_next then "and" else "class type") - (if vir_flag then " virtual" else "") print_out_class_params params - name Toploop.print_out_class_type.val clt - | Osig_exception id tyl -> - fprintf ppf "@[<2>exception %a@]" print_out_constr (id, tyl,None) - | Osig_modtype name Omty_abstract -> - fprintf ppf "@[<2>module type %s@]" name - | Osig_modtype name mty -> - fprintf ppf "@[<2>module type %s =@ %a@]" name - Toploop.print_out_module_type.val mty - | Osig_module name mty rs -> - fprintf ppf "@[<2>%s %s :@ %a@]" - (match rs with [ Orec_not -> "module" - | Orec_first -> "module rec" - | Orec_next -> "and" ]) name - Toploop.print_out_module_type.val mty - | Osig_type td rs -> - print_out_type_decl - (if rs = Orec_next then "and" else "type") - ppf td - | Osig_value name ty prims -> - let kwd = if prims = [] then "value" else "external" in - let pr_prims ppf = - fun - [ [] -> () - | [s :: sl] -> - do { - fprintf ppf "@ = \"%s\"" s; - List.iter (fun s -> fprintf ppf "@ \"%s\"" s) sl - } ] - in - fprintf ppf "@[<2>%s %a :@ %a%a@]" kwd value_ident name - Toploop.print_out_type.val ty pr_prims prims ] - -and print_out_type_decl kwd ppf (name, args, ty, priv, constraints) = - let constrain ppf (ty, ty') = - fprintf ppf "@ @[<2>constraint %a =@ %a@]" Toploop.print_out_type.val ty - Toploop.print_out_type.val ty' - in - let print_constraints ppf params = List.iter (constrain ppf) params in - let type_defined ppf = - match args with - [ [] -> fprintf ppf "%s" name - | [arg] -> fprintf ppf "%s %a" name type_parameter arg - | _ -> - fprintf ppf "%s@ %a" name - (print_list type_parameter (fun ppf -> fprintf ppf "@ ")) args ] - and print_kind ppf ty = - fprintf ppf "%s@ %a" - (if priv = Obj.magic Camlp4_import.Asttypes.Private then " private" else "") - Toploop.print_out_type.val ty - in - let print_types ppf = fun - [ Otyp_manifest ty1 ty2 -> - fprintf ppf "@ @[<2>%a ==%a@]" - Toploop.print_out_type.val ty1 - print_kind ty2 - | ty -> print_kind ppf ty ] - in - match ty with - [ Otyp_abstract -> - fprintf ppf "@[<2>@[@[%s %t@]@]%a@]" kwd type_defined - print_constraints constraints - | _ -> - fprintf ppf "@[<2>@[@[%s %t@] =%a@]%a@]" kwd type_defined - print_types ty print_constraints constraints ] -; - -(* Phrases *) - -value print_out_exception ppf exn outv = - match exn with - [ Sys.Break -> fprintf ppf "Interrupted.@." - | Out_of_memory -> fprintf ppf "Out of memory during evaluation.@." - | Stack_overflow -> - fprintf ppf "Stack overflow during evaluation (looping recursion?).@." - | _ -> - fprintf ppf "@[Exception:@ %a.@]@." Toploop.print_out_value.val outv ] -; - -value rec print_items ppf = - fun - [ [] -> () - | [(tree, valopt) :: items] -> - do { - match valopt with - [ Some v -> - fprintf ppf "@[<2>%a =@ %a@]" Toploop.print_out_sig_item.val tree - Toploop.print_out_value.val v - | None -> fprintf ppf "@[%a@]" Toploop.print_out_sig_item.val tree ]; - if items <> [] then fprintf ppf "@ %a" print_items items else () - } ] -; - -value print_out_phrase ppf = - fun - [ Ophr_eval outv ty -> - fprintf ppf "@[- : %a@ =@ %a@]@." Toploop.print_out_type.val ty - Toploop.print_out_value.val outv - | Ophr_signature [] -> () - | Ophr_signature items -> fprintf ppf "@[%a@]@." print_items items - | Ophr_exception (exn, outv) -> print_out_exception ppf exn outv ] -; - -Toploop.print_out_value.val := print_out_value; -Toploop.print_out_type.val := print_out_type; -Toploop.print_out_class_type.val := print_out_class_type; -Toploop.print_out_module_type.val := print_out_module_type; -Toploop.print_out_sig_item.val := print_out_sig_item; -Toploop.print_out_signature.val := print_out_signature; -Toploop.print_out_phrase.val := print_out_phrase; diff --git a/camlp4/Camlp4Top/Top.ml b/camlp4/Camlp4Top/Top.ml deleted file mode 100644 index 0e07eb21..00000000 --- a/camlp4/Camlp4Top/Top.ml +++ /dev/null @@ -1,133 +0,0 @@ -(* camlp4r q_MLast.cmo *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2002-2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - - - -(* There is a few Obj.magic due to the fact that we no longer have compiler - files like Parsetree, Location, Longident but Camlp4_import that wrap them to - avoid name clashing. *) -module Toploop : sig - value print_location : - Format.formatter -> Camlp4_import.Location.t -> unit; - value print_warning : - Camlp4_import.Location.t -> Format.formatter -> Camlp4_import.Warnings.t -> unit; - value parse_toplevel_phrase : - ref (Lexing.lexbuf -> Camlp4_import.Parsetree.toplevel_phrase); - value parse_use_file : - ref (Lexing.lexbuf -> list Camlp4_import.Parsetree.toplevel_phrase); -end = struct - value print_location fmt loc = - Toploop.print_location fmt (Obj.magic loc); - value parse_toplevel_phrase = - Obj.magic Toploop.parse_toplevel_phrase; - value parse_use_file = - Obj.magic Toploop.parse_use_file; - value print_warning loc fmt w = - Toploop.print_warning (Obj.magic loc) fmt (Obj.magic w); -end; - -open Camlp4_import.Parsetree; -open Lexing; -open Camlp4; -open PreCast; -open Syntax; -open Camlp4.Sig; -module Ast2pt = Camlp4.Struct.Camlp4Ast2OCamlAst.Make Ast; -module Lexer = Camlp4.Struct.Lexer.Make Token; - -external not_filtered : 'a -> Gram.not_filtered 'a = "%identity"; - -value initialization = lazy begin - if Sys.interactive.val - then Format.printf "\tCamlp4 Parsing version %s\n@." Camlp4_config.version - else () -end; - -value wrap parse_fun lb = - let () = Lazy.force initialization in - let () = Register.iter_and_take_callbacks (fun (_, f) -> f ()) in - let not_filtered_token_stream = Lexer.from_lexbuf lb in - let token_stream = Gram.filter (not_filtered not_filtered_token_stream) in - try - match token_stream with parser - [ [: `(EOI, _) :] -> raise End_of_file - | [: :] -> parse_fun token_stream ] - with - [ End_of_file | Sys.Break | (Loc.Exc_located _ (End_of_file | Sys.Break)) - as x -> raise x - | x -> - let x = - match x with - [ Loc.Exc_located loc x -> do { - Toploop.print_location Format.err_formatter - (Loc.to_ocaml_location loc); - x } - | x -> x ] - in - do { - Format.eprintf "@[<0>%a@]@." Camlp4.ErrorHandler.print x; - raise Exit - } ]; - -value toplevel_phrase token_stream = - match Gram.parse_tokens_after_filter Syntax.top_phrase token_stream with - [ Some str_item -> - let str_item = - AstFilters.fold_topphrase_filters (fun t filter -> filter t) str_item - in - Ast2pt.phrase str_item - - | None -> raise End_of_file ]; - -value use_file token_stream = - let (pl0, eoi) = - loop () where rec loop () = - let (pl, stopped_at_directive) = - Gram.parse_tokens_after_filter Syntax.use_file token_stream - in - if stopped_at_directive <> None then - match pl with - [ [ <:str_item< #load $str:s$ >> ] -> - do { Topdirs.dir_load Format.std_formatter s; loop () } - | [ <:str_item< #directory $str:s$ >> ] -> - do { Topdirs.dir_directory s; loop () } - | _ -> (pl, False) ] - else (pl, True) - in - let pl = - if eoi then [] - else - loop () where rec loop () = - let (pl, stopped_at_directive) = - Gram.parse_tokens_after_filter Syntax.use_file token_stream - in - if stopped_at_directive <> None then pl @ loop () else pl - in List.map Ast2pt.phrase (pl0 @ pl); - -Toploop.parse_toplevel_phrase.val := wrap toplevel_phrase; - -Toploop.parse_use_file.val := wrap use_file; - -current_warning.val := - fun loc txt -> - Toploop.print_warning (Loc.to_ocaml_location loc) Format.err_formatter - (Camlp4_import.Warnings.Camlp4 txt); - -Register.iter_and_take_callbacks (fun (_, f) -> f ()); diff --git a/camlp4/Camlp4_config.ml b/camlp4/Camlp4_config.ml deleted file mode 100644 index a055e6ca..00000000 --- a/camlp4/Camlp4_config.ml +++ /dev/null @@ -1,39 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -let ocaml_standard_library = Camlp4_import.Config.standard_library;; - -let camlp4_standard_library = - try Sys.getenv "CAMLP4LIB" - with Not_found -> - Filename.concat ocaml_standard_library "camlp4";; - -let version = Sys.ocaml_version;; -let program_name = ref "camlp4";; -let constructors_arity = ref true;; -let unsafe = ref false;; -let verbose = ref false;; -let antiquotations = ref false;; -let quotations = ref true;; -let inter_phrases = ref None;; -let camlp4_ast_impl_magic_number = "Camlp42006M002";; -let camlp4_ast_intf_magic_number = "Camlp42006N002";; -let ocaml_ast_intf_magic_number = Camlp4_import.Config.ast_intf_magic_number;; -let ocaml_ast_impl_magic_number = Camlp4_import.Config.ast_impl_magic_number;; -let current_input_file = ref "";; diff --git a/camlp4/Camlp4_config.mli b/camlp4/Camlp4_config.mli deleted file mode 100644 index cbc16322..00000000 --- a/camlp4/Camlp4_config.mli +++ /dev/null @@ -1,34 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - -val version : string;; -val ocaml_standard_library : string;; -val camlp4_standard_library : string;; -val ocaml_ast_impl_magic_number : string;; -val ocaml_ast_intf_magic_number : string;; -val camlp4_ast_impl_magic_number : string;; -val camlp4_ast_intf_magic_number : string;; -val program_name : string ref;; -val unsafe : bool ref;; -val verbose : bool ref;; -val quotations : bool ref;; -val antiquotations : bool ref;; -val constructors_arity : bool ref;; -val inter_phrases : (string option) ref;; -val current_input_file : string ref;; diff --git a/camlp4/ICHANGES b/camlp4/ICHANGES deleted file mode 100644 index 809a65a6..00000000 --- a/camlp4/ICHANGES +++ /dev/null @@ -1,27 +0,0 @@ -Internal, very small, undocumented, or invisible changes -******************************************************** - -- [april-may 04] the following interface files changed in order to - implement OCaml style locations: - camlp4/camlp4/{ast2pt.mli,pcaml.mli,reloc.mli,grammar.mli} - camlp4/lib/{stdpp.mli,token.mli} - The main changes are occurrences of "int" changed into - "Lexing.position" and "int * int" changed into - "Lexing.position * Lexing.position" (or an equivalent type). -- [20 nov 03], token.mli: eval_string takes a location as a extra - argument (needed to issue a warning). - -Camlp4s Version 3.06+19 ------------------------ - -- [28 Oct 02] Changed and simplified local entry of pa_o.ml from "cvalue" - to "cvalue_binding". -- [18 Oct 02] The standard syntax for antiquotations in object class_types - and object class_expr are now: <:class_type< $opt:x$ $list:y$ >> and - <:class_expr< $opt:x$ $list:y$ >>: the syntax without the "opt" is - accepted but deprecated (a warning is displayed). -- [15 Oct 02] Changed Plexer which now manages better the line directives - (applied only on begin of lines, no error if parsing error in the - directive). -- [14 Sep 02] Grammar.print_entry does not end any more with - Format.print_flush. The "flush" is done by Grammar.Entry.print. diff --git a/camlp4/boot/.ignore b/camlp4/boot/.ignore deleted file mode 100644 index 9a5f19e1..00000000 --- a/camlp4/boot/.ignore +++ /dev/null @@ -1,5 +0,0 @@ -camlp4 -camlp4o -camlp4r -SAVED -*.old diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml deleted file mode 100644 index 2a6a4fbf..00000000 --- a/camlp4/boot/Camlp4.ml +++ /dev/null @@ -1,21644 +0,0 @@ -module Debug : - sig - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - (* camlp4r *) - type section = string - - val mode : section -> bool - - val printf : section -> ('a, Format.formatter, unit) format -> 'a - - end = - struct - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - (* camlp4r *) - open Format - - module Debug = struct let mode _ = false - end - - type section = string - - let out_channel = - try - let f = Sys.getenv "CAMLP4_DEBUG_FILE" - in - open_out_gen [ Open_wronly; Open_creat; Open_append; Open_text ] - 0o666 f - with | Not_found -> Pervasives.stderr - - module StringSet = Set.Make(String) - - let mode = - try - let str = Sys.getenv "CAMLP4_DEBUG" in - let rec loop acc i = - try - let pos = String.index_from str i ':' - in - loop (StringSet.add (String.sub str i (pos - i)) acc) (pos + 1) - with - | Not_found -> - StringSet.add (String.sub str i ((String.length str) - i)) acc in - let sections = loop StringSet.empty 0 - in - if StringSet.mem "*" sections - then (fun _ -> true) - else (fun x -> StringSet.mem x sections) - with | Not_found -> (fun _ -> false) - - let formatter = - let header = "camlp4-debug: " in - let at_bol = ref true - in - make_formatter - (fun buf pos len -> - for i = pos to (pos + len) - 1 do - if !at_bol then output_string out_channel header else (); - let ch = buf.[i] - in (output_char out_channel ch; at_bol := ch = '\n') - done) - (fun () -> flush out_channel) - - let printf section fmt = fprintf formatter ("%s: " ^^ fmt) section - - end - -module Options : - sig - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - type spec_list = (string * Arg.spec * string) list - - val init : spec_list -> unit - - val add : string -> Arg.spec -> string -> unit - - (** Add an option to the command line options. *) - val print_usage_list : spec_list -> unit - - val ext_spec_list : unit -> spec_list - - val parse : (string -> unit) -> string array -> string list - - end = - struct - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - type spec_list = (string * Arg.spec * string) list - - open Format - - let rec action_arg s sl = - function - | Arg.Unit f -> if s = "" then (f (); Some sl) else None - | Arg.Bool f -> - if s = "" - then - (match sl with - | s :: sl -> - (try (f (bool_of_string s); Some sl) - with | Invalid_argument "bool_of_string" -> None) - | [] -> None) - else - (try (f (bool_of_string s); Some sl) - with | Invalid_argument "bool_of_string" -> None) - | Arg.Set r -> if s = "" then (r := true; Some sl) else None - | Arg.Clear r -> if s = "" then (r := false; Some sl) else None - | Arg.Rest f -> (List.iter f (s :: sl); Some []) - | Arg.String f -> - if s = "" - then (match sl with | s :: sl -> (f s; Some sl) | [] -> None) - else (f s; Some sl) - | Arg.Set_string r -> - if s = "" - then (match sl with | s :: sl -> (r := s; Some sl) | [] -> None) - else (r := s; Some sl) - | Arg.Int f -> - if s = "" - then - (match sl with - | s :: sl -> - (try (f (int_of_string s); Some sl) - with | Failure "int_of_string" -> None) - | [] -> None) - else - (try (f (int_of_string s); Some sl) - with | Failure "int_of_string" -> None) - | Arg.Set_int r -> - if s = "" - then - (match sl with - | s :: sl -> - (try (r := int_of_string s; Some sl) - with | Failure "int_of_string" -> None) - | [] -> None) - else - (try (r := int_of_string s; Some sl) - with | Failure "int_of_string" -> None) - | Arg.Float f -> - if s = "" - then - (match sl with - | s :: sl -> (f (float_of_string s); Some sl) - | [] -> None) - else (f (float_of_string s); Some sl) - | Arg.Set_float r -> - if s = "" - then - (match sl with - | s :: sl -> (r := float_of_string s; Some sl) - | [] -> None) - else (r := float_of_string s; Some sl) - | Arg.Tuple specs -> - let rec action_args s sl = - (function - | [] -> Some sl - | spec :: spec_list -> - (match action_arg s sl spec with - | None -> action_args "" [] spec_list - | Some (s :: sl) -> action_args s sl spec_list - | Some sl -> action_args "" sl spec_list)) - in action_args s sl specs - | Arg.Symbol (syms, f) -> - (match if s = "" then sl else s :: sl with - | s :: sl when List.mem s syms -> (f s; Some sl) - | _ -> None) - - let common_start s1 s2 = - let rec loop i = - if (i == (String.length s1)) || (i == (String.length s2)) - then i - else if s1.[i] == s2.[i] then loop (i + 1) else i - in loop 0 - - let parse_arg fold s sl = - fold - (fun (name, action, _) acu -> - let i = common_start s name - in - if i == (String.length name) - then - (try - action_arg (String.sub s i ((String.length s) - i)) sl - action - with | Arg.Bad _ -> acu) - else acu) - None - - let rec parse_aux fold anon_fun = - function - | [] -> [] - | s :: sl -> - if ((String.length s) > 1) && (s.[0] = '-') - then - (match parse_arg fold s sl with - | Some sl -> parse_aux fold anon_fun sl - | None -> s :: (parse_aux fold anon_fun sl)) - else ((anon_fun s : unit); parse_aux fold anon_fun sl) - - let align_doc key s = - let s = - let rec loop i = - if i = (String.length s) - then "" - else - if s.[i] = ' ' - then loop (i + 1) - else String.sub s i ((String.length s) - i) - in loop 0 in - let (p, s) = - if (String.length s) > 0 - then - if s.[0] = '<' - then - (let rec loop i = - if i = (String.length s) - then ("", s) - else - if s.[i] <> '>' - then loop (i + 1) - else - (let p = String.sub s 0 (i + 1) in - let rec loop i = - if i >= (String.length s) - then (p, "") - else - if s.[i] = ' ' - then loop (i + 1) - else (p, (String.sub s i ((String.length s) - i))) - in loop (i + 1)) - in loop 0) - else ("", s) - else ("", "") in - let tab = - String.make (max 1 ((16 - (String.length key)) - (String.length p))) - ' ' - in p ^ (tab ^ s) - - let make_symlist l = - match l with - | [] -> "" - | h :: t -> - (List.fold_left (fun x y -> x ^ ("|" ^ y)) ("{" ^ h) t) ^ "}" - - let print_usage_list l = - List.iter - (fun (key, spec, doc) -> - match spec with - | Arg.Symbol (symbs, _) -> - let s = make_symlist symbs in - let synt = key ^ (" " ^ s) - in eprintf " %s %s\n" synt (align_doc synt doc) - | _ -> eprintf " %s %s\n" key (align_doc key doc)) - l - - let remaining_args argv = - let rec loop l i = - if i == (Array.length argv) then l else loop (argv.(i) :: l) (i + 1) - in List.rev (loop [] (!Arg.current + 1)) - - let init_spec_list = ref [] - - let ext_spec_list = ref [] - - let init spec_list = init_spec_list := spec_list - - let add name spec descr = - ext_spec_list := (name, spec, descr) :: !ext_spec_list - - let fold f init = - let spec_list = !init_spec_list @ !ext_spec_list in - let specs = Sort.list (fun (k1, _, _) (k2, _, _) -> k1 >= k2) spec_list - in List.fold_right f specs init - - let parse anon_fun argv = - let remaining_args = remaining_args argv - in parse_aux fold anon_fun remaining_args - - let ext_spec_list () = !ext_spec_list - - end - -module Sig = - struct - (* camlp4r *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - (** Camlp4 signature repository *) - (** {6 Basic signatures} *) - (** Signature with just a type. *) - module type Type = sig type t - end - - (** Signature for errors modules, an Error modules can be registred with - the {!ErrorHandler.Register} functor in order to be well printed. *) - module type Error = - sig - type t - - exception E of t - - val to_string : t -> string - - val print : Format.formatter -> t -> unit - - end - - (** A signature for extensions identifiers. *) - module type Id = - sig - (** The name of the extension, typically the module name. *) - val name : string - - (** The version of the extension, typically $ Id$ with a versionning system. *) - val version : string - - end - - (** A signature for warnings abstract from locations. *) - module Warning (Loc : Type) = - struct - module type S = - sig - type warning = Loc.t -> string -> unit - - val default_warning : warning - - val current_warning : warning ref - - val print_warning : warning - - end - - end - - (** {6 Advanced signatures} *) - (** A signature for locations. *) - module type Loc = - sig - (** The type of locations. Note that, as for OCaml locations, - character numbers in locations refer to character numbers in the - parsed character stream, while line numbers refer to line - numbers in the source file. The source file and the parsed - character stream differ, for instance, when the parsed character - stream contains a line number directive. The line number - directive will only update the file-name field and the - line-number field of the position. It makes therefore no sense - to use character numbers with the source file if the sources - contain line number directives. *) - type t - - (** Return a start location for the given file name. - This location starts at the begining of the file. *) - val mk : string -> t - - (** The [ghost] location can be used when no location - information is available. *) - val ghost : t - - (** {6 Conversion functions} *) - (** Return a location where both positions are set the given position. *) - val of_lexing_position : Lexing.position -> t - - (** Return an OCaml location. *) - val to_ocaml_location : t -> Camlp4_import.Location.t - - (** Return a location from an OCaml location. *) - val of_ocaml_location : Camlp4_import.Location.t -> t - - (** Return a location from ocamllex buffer. *) - val of_lexbuf : Lexing.lexbuf -> t - - (** Return a location from [(file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost)]. *) - val of_tuple : - (string * int * int * int * int * int * int * bool) -> t - - (** Return [(file_name, start_line, start_bol, start_off, - stop_line, stop_bol, stop_off, ghost)]. *) - val to_tuple : - t -> (string * int * int * int * int * int * int * bool) - - (** [merge loc1 loc2] Return a location that starts at [loc1] and end at - [loc2]. *) - val merge : t -> t -> t - - (** The stop pos becomes equal to the start pos. *) - val join : t -> t - - (** [move selector n loc] - Return the location where positions are moved. - Affected positions are chosen with [selector]. - Returned positions have their character offset plus [n]. *) - val move : [ | `start | `stop | `both ] -> int -> t -> t - - (** [shift n loc] Return the location where the new start position is the old - stop position, and where the new stop position character offset is the - old one plus [n]. *) - val shift : int -> t -> t - - (** [move_line n loc] Return the location with the old line count plus [n]. - The "begin of line" of both positions become the current offset. *) - val move_line : int -> t -> t - - (** {6 Accessors} *) - (** Return the file name *) - val file_name : t -> string - - (** Return the line number of the begining of this location. *) - val start_line : t -> int - - (** Return the line number of the ending of this location. *) - val stop_line : t -> int - - (** Returns the number of characters from the begining of the stream - to the begining of the line of location's begining. *) - val start_bol : t -> int - - (** Returns the number of characters from the begining of the stream - to the begining of the line of location's ending. *) - val stop_bol : t -> int - - (** Returns the number of characters from the begining of the stream - of the begining of this location. *) - val start_off : t -> int - - (** Return the number of characters from the begining of the stream - of the ending of this location. *) - val stop_off : t -> int - - (** Return the start position as a Lexing.position. *) - val start_pos : t -> Lexing.position - - (** Return the stop position as a Lexing.position. *) - val stop_pos : t -> Lexing.position - - (** Generally, return true if this location does not come - from an input stream. *) - val is_ghost : t -> bool - - (** Return the associated ghost location. *) - val ghostify : t -> t - - (** Return the location with the give file name *) - val set_file_name : string -> t -> t - - (** [strictly_before loc1 loc2] True if the stop position of [loc1] is - strictly_before the start position of [loc2]. *) - val strictly_before : t -> t -> bool - - (** Return the location with an absolute file name. *) - val make_absolute : t -> t - - (** Print the location into the formatter in a format suitable for error - reporting. *) - val print : Format.formatter -> t -> unit - - (** Print the location in a short format useful for debugging. *) - val dump : Format.formatter -> t -> unit - - (** Same as {!print} but return a string instead of printting it. *) - val to_string : t -> string - - (** [Exc_located loc e] is an encapsulation of the exception [e] with - the input location [loc]. To be used in quotation expanders - and in grammars to specify some input location for an error. - Do not raise this exception directly: rather use the following - function [Loc.raise]. *) - exception Exc_located of t * exn - - (** [raise loc e], if [e] is already an [Exc_located] exception, - re-raise it, else raise the exception [Exc_located loc e]. *) - val raise : t -> exn -> 'a - - (** The name of the location variable used in grammars and in - the predefined quotations for OCaml syntax trees. Default: [_loc]. *) - val name : string ref - - end - - (** Abstract syntax tree minimal signature. - Types of this signature are abstract. - See the {!Camlp4Ast} signature for a concrete definition. *) - module type Ast = - sig - (** {6 Syntactic categories as abstract types} *) - type loc - - type meta_bool - - type 'a meta_option - - type 'a meta_list - - type ctyp - - type patt - - type expr - - type module_type - - type sig_item - - type with_constr - - type module_expr - - type str_item - - type class_type - - type class_sig_item - - type class_expr - - type class_str_item - - type match_case - - type ident - - type binding - - type rec_binding - - type module_binding - - type rec_flag - - type direction_flag - - type mutable_flag - - type private_flag - - type virtual_flag - - type row_var_flag - - type override_flag - - (** {6 Location accessors} *) - val loc_of_ctyp : ctyp -> loc - - val loc_of_patt : patt -> loc - - val loc_of_expr : expr -> loc - - val loc_of_module_type : module_type -> loc - - val loc_of_module_expr : module_expr -> loc - - val loc_of_sig_item : sig_item -> loc - - val loc_of_str_item : str_item -> loc - - val loc_of_class_type : class_type -> loc - - val loc_of_class_sig_item : class_sig_item -> loc - - val loc_of_class_expr : class_expr -> loc - - val loc_of_class_str_item : class_str_item -> loc - - val loc_of_with_constr : with_constr -> loc - - val loc_of_binding : binding -> loc - - val loc_of_rec_binding : rec_binding -> loc - - val loc_of_module_binding : module_binding -> loc - - val loc_of_match_case : match_case -> loc - - val loc_of_ident : ident -> loc - - (** {6 Traversals} *) - (** This class is the base class for map traversal on the Ast. - To make a custom traversal class one just extend it like that: - - This example swap pairs expression contents: - open Camlp4.PreCast; - [class swap = object - inherit Ast.map as super; - method expr e = - match super#expr e with - \[ <:expr\@_loc< ($e1$, $e2$) >> -> <:expr< ($e2$, $e1$) >> - | e -> e \]; - end; - value _loc = Loc.ghost; - value map = (new swap)#expr; - assert (map <:expr< fun x -> (x, 42) >> = <:expr< fun x -> (42, x) >>);] - *) - class map : - object ('self_type) - method string : string -> string - method list : - 'a 'b. ('self_type -> 'a -> 'b) -> 'a list -> 'b list - method meta_bool : meta_bool -> meta_bool - method meta_option : - 'a 'b. - ('self_type -> 'a -> 'b) -> 'a meta_option -> 'b meta_option - method meta_list : - 'a 'b. ('self_type -> 'a -> 'b) -> 'a meta_list -> 'b meta_list - method loc : loc -> loc - method expr : expr -> expr - method patt : patt -> patt - method ctyp : ctyp -> ctyp - method str_item : str_item -> str_item - method sig_item : sig_item -> sig_item - method module_expr : module_expr -> module_expr - method module_type : module_type -> module_type - method class_expr : class_expr -> class_expr - method class_type : class_type -> class_type - method class_sig_item : class_sig_item -> class_sig_item - method class_str_item : class_str_item -> class_str_item - method with_constr : with_constr -> with_constr - method binding : binding -> binding - method rec_binding : rec_binding -> rec_binding - method module_binding : module_binding -> module_binding - method match_case : match_case -> match_case - method ident : ident -> ident - method override_flag : override_flag -> override_flag - method mutable_flag : mutable_flag -> mutable_flag - method private_flag : private_flag -> private_flag - method virtual_flag : virtual_flag -> virtual_flag - method direction_flag : direction_flag -> direction_flag - method rec_flag : rec_flag -> rec_flag - method row_var_flag : row_var_flag -> row_var_flag - method unknown : 'a. 'a -> 'a - end - - (** Fold style traversal *) - class fold : - object ('self_type) - method string : string -> 'self_type - method list : - 'a. ('self_type -> 'a -> 'self_type) -> 'a list -> 'self_type - method meta_bool : meta_bool -> 'self_type - method meta_option : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_option -> 'self_type - method meta_list : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_list -> 'self_type - method loc : loc -> 'self_type - method expr : expr -> 'self_type - method patt : patt -> 'self_type - method ctyp : ctyp -> 'self_type - method str_item : str_item -> 'self_type - method sig_item : sig_item -> 'self_type - method module_expr : module_expr -> 'self_type - method module_type : module_type -> 'self_type - method class_expr : class_expr -> 'self_type - method class_type : class_type -> 'self_type - method class_sig_item : class_sig_item -> 'self_type - method class_str_item : class_str_item -> 'self_type - method with_constr : with_constr -> 'self_type - method binding : binding -> 'self_type - method rec_binding : rec_binding -> 'self_type - method module_binding : module_binding -> 'self_type - method match_case : match_case -> 'self_type - method ident : ident -> 'self_type - method rec_flag : rec_flag -> 'self_type - method direction_flag : direction_flag -> 'self_type - method mutable_flag : mutable_flag -> 'self_type - method private_flag : private_flag -> 'self_type - method virtual_flag : virtual_flag -> 'self_type - method row_var_flag : row_var_flag -> 'self_type - method override_flag : override_flag -> 'self_type - method unknown : 'a. 'a -> 'self_type - end - - end - - (** Signature for OCaml syntax trees. *) - (* - This signature is an extension of {!Ast} - It provides: - - Types for all kinds of structure. - - Map: A base class for map traversals. - - Map classes and functions for common kinds. - - == Core language == - ctyp :: Representaion of types - patt :: The type of patterns - expr :: The type of expressions - match_case :: The type of cases for match/function/try constructions - ident :: The type of identifiers (including path like Foo(X).Bar.y) - binding :: The type of let bindings - rec_binding :: The type of record definitions - - == Modules == - module_type :: The type of module types - sig_item :: The type of signature items - str_item :: The type of structure items - module_expr :: The type of module expressions - module_binding :: The type of recursive module definitions - with_constr :: The type of `with' constraints - - == Classes == - class_type :: The type of class types - class_sig_item :: The type of class signature items - class_expr :: The type of class expressions - class_str_item :: The type of class structure items - *) - module type Camlp4Ast = - sig - (** The inner module for locations *) - module Loc : Loc - - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2007 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Note: when you modify these types you must increment - ast magic numbers defined in Camlp4_config.ml. *) - type loc = - Loc. - t - and meta_bool = - | BTrue | BFalse | BAnt of string - and rec_flag = - | ReRecursive | ReNil | ReAnt of string - and direction_flag = - | DiTo | DiDownto | DiAnt of string - and mutable_flag = - | MuMutable | MuNil | MuAnt of string - and private_flag = - | PrPrivate | PrNil | PrAnt of string - and virtual_flag = - | ViVirtual | ViNil | ViAnt of string - and override_flag = - | OvOverride | OvNil | OvAnt of string - and row_var_flag = - | RvRowVar | RvNil | RvAnt of string - and 'a meta_option = - | ONone | OSome of 'a | OAnt of string - and 'a meta_list = - | LNil | LCons of 'a * 'a meta_list | LAnt of string - and ident = - | IdAcc of loc * ident * ident - | (* i . i *) - IdApp of loc * ident * ident - | (* i i *) - IdLid of loc * string - | (* foo *) - IdUid of loc * string - | (* Bar *) - IdAnt of loc * string - and (* $s$ *) - ctyp = - | TyNil of loc - | TyAli of loc * ctyp * ctyp - | (* t as t *) - (* list 'a as 'a *) - TyAny of loc - | (* _ *) - TyApp of loc * ctyp * ctyp - | (* t t *) - (* list 'a *) - TyArr of loc * ctyp * ctyp - | (* t -> t *) - (* int -> string *) - TyCls of loc * ident - | (* #i *) - (* #point *) - TyLab of loc * string * ctyp - | (* ~s:t *) - TyId of loc * ident - | (* i *) - (* Lazy.t *) - TyMan of loc * ctyp * ctyp - | (* t == t *) - (* type t = [ A | B ] == Foo.t *) - (* type t 'a 'b 'c = t constraint t = t constraint t = t *) - TyDcl of loc * string * ctyp list * ctyp * (ctyp * ctyp) list - | (* < (t)? (..)? > *) - (* < move : int -> 'a .. > as 'a *) - TyObj of loc * ctyp * row_var_flag - | TyOlb of loc * string * ctyp - | (* ?s:t *) - TyPol of loc * ctyp * ctyp - | (* ! t . t *) - (* ! 'a . list 'a -> 'a *) - TyTypePol of loc * ctyp * ctyp - | (* type t . t *) - (* type a . list a -> a *) - TyQuo of loc * string - | (* 's *) - TyQuP of loc * string - | (* +'s *) - TyQuM of loc * string - | (* -'s *) - TyAnP of loc - | (* +_ *) - TyAnM of loc - | (* -_ *) - TyVrn of loc * string - | (* `s *) - TyRec of loc * ctyp - | (* { t } *) - (* { foo : int ; bar : mutable string } *) - TyCol of loc * ctyp * ctyp - | (* t : t *) - TySem of loc * ctyp * ctyp - | (* t; t *) - TyCom of loc * ctyp * ctyp - | (* t, t *) - TySum of loc * ctyp - | (* [ t ] *) - (* [ A of int and string | B ] *) - TyOf of loc * ctyp * ctyp - | (* t of t *) - (* A of int *) - TyAnd of loc * ctyp * ctyp - | (* t and t *) - TyOr of loc * ctyp * ctyp - | (* t | t *) - TyPrv of loc * ctyp - | (* private t *) - TyMut of loc * ctyp - | (* mutable t *) - TyTup of loc * ctyp - | (* ( t ) *) - (* (int * string) *) - TySta of loc * ctyp * ctyp - | (* t * t *) - TyVrnEq of loc * ctyp - | (* [ = t ] *) - TyVrnSup of loc * ctyp - | (* [ > t ] *) - TyVrnInf of loc * ctyp - | (* [ < t ] *) - TyVrnInfSup of loc * ctyp * ctyp - | (* [ < t > t ] *) - TyAmp of loc * ctyp * ctyp - | (* t & t *) - TyOfAmp of loc * ctyp * ctyp - | (* t of & t *) - TyPkg of loc * module_type - | (* (module S) *) - TyAnt of loc * string - and (* $s$ *) - patt = - | PaNil of loc - | PaId of loc * ident - | (* i *) - PaAli of loc * patt * patt - | (* p as p *) - (* (Node x y as n) *) - PaAnt of loc * string - | (* $s$ *) - PaAny of loc - | (* _ *) - PaApp of loc * patt * patt - | (* p p *) - (* fun x y -> *) - PaArr of loc * patt - | (* [| p |] *) - PaCom of loc * patt * patt - | (* p, p *) - PaSem of loc * patt * patt - | (* p; p *) - PaChr of loc * string - | (* c *) - (* 'x' *) - PaInt of loc * string - | PaInt32 of loc * string - | PaInt64 of loc * string - | PaNativeInt of loc * string - | PaFlo of loc * string - | PaLab of loc * string * patt - | (* ~s or ~s:(p) *) - (* ?s or ?s:(p) *) - PaOlb of loc * string * patt - | (* ?s:(p = e) or ?(p = e) *) - PaOlbi of loc * string * patt * expr - | PaOrp of loc * patt * patt - | (* p | p *) - PaRng of loc * patt * patt - | (* p .. p *) - PaRec of loc * patt - | (* { p } *) - PaEq of loc * ident * patt - | (* i = p *) - PaStr of loc * string - | (* s *) - PaTup of loc * patt - | (* ( p ) *) - PaTyc of loc * patt * ctyp - | (* (p : t) *) - PaTyp of loc * ident - | (* #i *) - PaVrn of loc * string - | (* `s *) - PaLaz of loc * patt - | (* lazy p *) - PaMod of loc * string - and (* (module M) *) - expr = - | ExNil of loc - | ExId of loc * ident - | (* i *) - ExAcc of loc * expr * expr - | (* e.e *) - ExAnt of loc * string - | (* $s$ *) - ExApp of loc * expr * expr - | (* e e *) - ExAre of loc * expr * expr - | (* e.(e) *) - ExArr of loc * expr - | (* [| e |] *) - ExSem of loc * expr * expr - | (* e; e *) - ExAsf of loc - | (* assert False *) - ExAsr of loc * expr - | (* assert e *) - ExAss of loc * expr * expr - | (* e := e *) - ExChr of loc * string - | (* 'c' *) - ExCoe of loc * expr * ctyp * ctyp - | (* (e : t) or (e : t :> t) *) - ExFlo of loc * string - | (* 3.14 *) - (* for s = e to/downto e do { e } *) - ExFor of loc * string * expr * expr * direction_flag * expr - | ExFun of loc * match_case - | (* fun [ mc ] *) - ExIfe of loc * expr * expr * expr - | (* if e then e else e *) - ExInt of loc * string - | (* 42 *) - ExInt32 of loc * string - | ExInt64 of loc * string - | ExNativeInt of loc * string - | ExLab of loc * string * expr - | (* ~s or ~s:e *) - ExLaz of loc * expr - | (* lazy e *) - (* let b in e or let rec b in e *) - ExLet of loc * rec_flag * binding * expr - | (* let module s = me in e *) - ExLmd of loc * string * module_expr * expr - | (* match e with [ mc ] *) - ExMat of loc * expr * match_case - | (* new i *) - ExNew of loc * ident - | (* object ((p))? (cst)? end *) - ExObj of loc * patt * class_str_item - | (* ?s or ?s:e *) - ExOlb of loc * string * expr - | (* {< rb >} *) - ExOvr of loc * rec_binding - | (* { rb } or { (e) with rb } *) - ExRec of loc * rec_binding * expr - | (* do { e } *) - ExSeq of loc * expr - | (* e#s *) - ExSnd of loc * expr * string - | (* e.[e] *) - ExSte of loc * expr * expr - | (* s *) - (* "foo" *) - ExStr of loc * string - | (* try e with [ mc ] *) - ExTry of loc * expr * match_case - | (* (e) *) - ExTup of loc * expr - | (* e, e *) - ExCom of loc * expr * expr - | (* (e : t) *) - ExTyc of loc * expr * ctyp - | (* `s *) - ExVrn of loc * string - | (* while e do { e } *) - ExWhi of loc * expr * expr - | (* let open i in e *) - ExOpI of loc * ident * expr - | (* fun (type t) -> e *) - (* let f x (type t) y z = e *) - ExFUN of loc * string * expr - | (* (module ME : S) which is represented as (module (ME : S)) *) - ExPkg of loc * module_expr - and module_type = - | MtNil of loc - | (* i *) - (* A.B.C *) - MtId of loc * ident - | (* functor (s : mt) -> mt *) - MtFun of loc * string * module_type * module_type - | (* 's *) - MtQuo of loc * string - | (* sig sg end *) - MtSig of loc * sig_item - | (* mt with wc *) - MtWit of loc * module_type * with_constr - | (* module type of m *) - MtOf of loc * module_expr - | MtAnt of loc * string - and (* $s$ *) - sig_item = - | SgNil of loc - | (* class cict *) - SgCls of loc * class_type - | (* class type cict *) - SgClt of loc * class_type - | (* sg ; sg *) - SgSem of loc * sig_item * sig_item - | (* # s or # s e *) - SgDir of loc * string * expr - | (* exception t *) - SgExc of loc * ctyp - | (* external s : t = s ... s *) - SgExt of loc * string * ctyp * string meta_list - | (* include mt *) - SgInc of loc * module_type - | (* module s : mt *) - SgMod of loc * string * module_type - | (* module rec mb *) - SgRecMod of loc * module_binding - | (* module type s = mt *) - SgMty of loc * string * module_type - | (* open i *) - SgOpn of loc * ident - | (* type t *) - SgTyp of loc * ctyp - | (* value s : t *) - SgVal of loc * string * ctyp - | SgAnt of loc * string - and (* $s$ *) - with_constr = - | WcNil of loc - | (* type t = t *) - WcTyp of loc * ctyp * ctyp - | (* module i = i *) - WcMod of loc * ident * ident - | (* type t := t *) - WcTyS of loc * ctyp * ctyp - | (* module i := i *) - WcMoS of loc * ident * ident - | (* wc and wc *) - WcAnd of loc * with_constr * with_constr - | WcAnt of loc * string - and (* $s$ *) - binding = - | BiNil of loc - | (* bi and bi *) - (* let a = 42 and c = 43 *) - BiAnd of loc * binding * binding - | (* p = e *) - (* let patt = expr *) - BiEq of loc * patt * expr - | BiAnt of loc * string - and (* $s$ *) - rec_binding = - | RbNil of loc - | (* rb ; rb *) - RbSem of loc * rec_binding * rec_binding - | (* i = e *) - RbEq of loc * ident * expr - | RbAnt of loc * string - and (* $s$ *) - module_binding = - | MbNil of loc - | (* mb and mb *) - (* module rec (s : mt) = me and (s : mt) = me *) - MbAnd of loc * module_binding * module_binding - | (* s : mt = me *) - MbColEq of loc * string * module_type * module_expr - | (* s : mt *) - MbCol of loc * string * module_type - | MbAnt of loc * string - and (* $s$ *) - match_case = - | McNil of loc - | (* a | a *) - McOr of loc * match_case * match_case - | (* p (when e)? -> e *) - McArr of loc * patt * expr * expr - | McAnt of loc * string - and (* $s$ *) - module_expr = - | MeNil of loc - | (* i *) - MeId of loc * ident - | (* me me *) - MeApp of loc * module_expr * module_expr - | (* functor (s : mt) -> me *) - MeFun of loc * string * module_type * module_expr - | (* struct st end *) - MeStr of loc * str_item - | (* (me : mt) *) - MeTyc of loc * module_expr * module_type - | (* (value e) *) - (* (value e : S) which is represented as (value (e : S)) *) - MePkg of loc * expr - | MeAnt of loc * string - and (* $s$ *) - str_item = - | StNil of loc - | (* class cice *) - StCls of loc * class_expr - | (* class type cict *) - StClt of loc * class_type - | (* st ; st *) - StSem of loc * str_item * str_item - | (* # s or # s e *) - StDir of loc * string * expr - | (* exception t or exception t = i *) - StExc of loc * ctyp * (*FIXME*) ident meta_option - | (* e *) - StExp of loc * expr - | (* external s : t = s ... s *) - StExt of loc * string * ctyp * string meta_list - | (* include me *) - StInc of loc * module_expr - | (* module s = me *) - StMod of loc * string * module_expr - | (* module rec mb *) - StRecMod of loc * module_binding - | (* module type s = mt *) - StMty of loc * string * module_type - | (* open i *) - StOpn of loc * ident - | (* type t *) - StTyp of loc * ctyp - | (* value (rec)? bi *) - StVal of loc * rec_flag * binding - | StAnt of loc * string - and (* $s$ *) - class_type = - | CtNil of loc - | (* (virtual)? i ([ t ])? *) - CtCon of loc * virtual_flag * ident * ctyp - | (* [t] -> ct *) - CtFun of loc * ctyp * class_type - | (* object ((t))? (csg)? end *) - CtSig of loc * ctyp * class_sig_item - | (* ct and ct *) - CtAnd of loc * class_type * class_type - | (* ct : ct *) - CtCol of loc * class_type * class_type - | (* ct = ct *) - CtEq of loc * class_type * class_type - | (* $s$ *) - CtAnt of loc * string - and class_sig_item = - | CgNil of loc - | (* type t = t *) - CgCtr of loc * ctyp * ctyp - | (* csg ; csg *) - CgSem of loc * class_sig_item * class_sig_item - | (* inherit ct *) - CgInh of loc * class_type - | (* method s : t or method private s : t *) - CgMth of loc * string * private_flag * ctyp - | (* value (virtual)? (mutable)? s : t *) - CgVal of loc * string * mutable_flag * virtual_flag * ctyp - | (* method virtual (private)? s : t *) - CgVir of loc * string * private_flag * ctyp - | CgAnt of loc * string - and (* $s$ *) - class_expr = - | CeNil of loc - | (* ce e *) - CeApp of loc * class_expr * expr - | (* (virtual)? i ([ t ])? *) - CeCon of loc * virtual_flag * ident * ctyp - | (* fun p -> ce *) - CeFun of loc * patt * class_expr - | (* let (rec)? bi in ce *) - CeLet of loc * rec_flag * binding * class_expr - | (* object ((p))? (cst)? end *) - CeStr of loc * patt * class_str_item - | (* ce : ct *) - CeTyc of loc * class_expr * class_type - | (* ce and ce *) - CeAnd of loc * class_expr * class_expr - | (* ce = ce *) - CeEq of loc * class_expr * class_expr - | (* $s$ *) - CeAnt of loc * string - and class_str_item = - | CrNil of loc - | (* cst ; cst *) - CrSem of loc * class_str_item * class_str_item - | (* type t = t *) - CrCtr of loc * ctyp * ctyp - | (* inherit(!)? ce (as s)? *) - CrInh of loc * override_flag * class_expr * string - | (* initializer e *) - CrIni of loc * expr - | (* method(!)? (private)? s : t = e or method(!)? (private)? s = e *) - CrMth of loc * string * override_flag * private_flag * expr * ctyp - | (* value(!)? (mutable)? s = e *) - CrVal of loc * string * override_flag * mutable_flag * expr - | (* method virtual (private)? s : t *) - CrVir of loc * string * private_flag * ctyp - | (* value virtual (mutable)? s : t *) - CrVvr of loc * string * mutable_flag * ctyp - | CrAnt of loc * string - - val loc_of_ctyp : ctyp -> loc - - val loc_of_patt : patt -> loc - - val loc_of_expr : expr -> loc - - val loc_of_module_type : module_type -> loc - - val loc_of_module_expr : module_expr -> loc - - val loc_of_sig_item : sig_item -> loc - - val loc_of_str_item : str_item -> loc - - val loc_of_class_type : class_type -> loc - - val loc_of_class_sig_item : class_sig_item -> loc - - val loc_of_class_expr : class_expr -> loc - - val loc_of_class_str_item : class_str_item -> loc - - val loc_of_with_constr : with_constr -> loc - - val loc_of_binding : binding -> loc - - val loc_of_rec_binding : rec_binding -> loc - - val loc_of_module_binding : module_binding -> loc - - val loc_of_match_case : match_case -> loc - - val loc_of_ident : ident -> loc - - module Meta : - sig - module type META_LOC = - sig - val meta_loc_patt : loc -> loc -> patt - - val meta_loc_expr : loc -> loc -> expr - - end - - module MetaLoc : - sig - val meta_loc_patt : loc -> loc -> patt - - val meta_loc_expr : loc -> loc -> expr - - end - - module MetaGhostLoc : - sig - val meta_loc_patt : loc -> 'a -> patt - - val meta_loc_expr : loc -> 'a -> expr - - end - - module MetaLocVar : - sig - val meta_loc_patt : loc -> 'a -> patt - - val meta_loc_expr : loc -> 'a -> expr - - end - - module Make (MetaLoc : META_LOC) : - sig - module Expr : - sig - val meta_string : loc -> string -> expr - - val meta_int : loc -> string -> expr - - val meta_float : loc -> string -> expr - - val meta_char : loc -> string -> expr - - val meta_bool : loc -> bool -> expr - - val meta_list : - (loc -> 'a -> expr) -> loc -> 'a list -> expr - - val meta_binding : loc -> binding -> expr - - val meta_rec_binding : loc -> rec_binding -> expr - - val meta_class_expr : loc -> class_expr -> expr - - val meta_class_sig_item : loc -> class_sig_item -> expr - - val meta_class_str_item : loc -> class_str_item -> expr - - val meta_class_type : loc -> class_type -> expr - - val meta_ctyp : loc -> ctyp -> expr - - val meta_expr : loc -> expr -> expr - - val meta_ident : loc -> ident -> expr - - val meta_match_case : loc -> match_case -> expr - - val meta_module_binding : loc -> module_binding -> expr - - val meta_module_expr : loc -> module_expr -> expr - - val meta_module_type : loc -> module_type -> expr - - val meta_patt : loc -> patt -> expr - - val meta_sig_item : loc -> sig_item -> expr - - val meta_str_item : loc -> str_item -> expr - - val meta_with_constr : loc -> with_constr -> expr - - val meta_rec_flag : loc -> rec_flag -> expr - - val meta_mutable_flag : loc -> mutable_flag -> expr - - val meta_virtual_flag : loc -> virtual_flag -> expr - - val meta_private_flag : loc -> private_flag -> expr - - val meta_row_var_flag : loc -> row_var_flag -> expr - - val meta_override_flag : loc -> override_flag -> expr - - val meta_direction_flag : loc -> direction_flag -> expr - - end - - module Patt : - sig - val meta_string : loc -> string -> patt - - val meta_int : loc -> string -> patt - - val meta_float : loc -> string -> patt - - val meta_char : loc -> string -> patt - - val meta_bool : loc -> bool -> patt - - val meta_list : - (loc -> 'a -> patt) -> loc -> 'a list -> patt - - val meta_binding : loc -> binding -> patt - - val meta_rec_binding : loc -> rec_binding -> patt - - val meta_class_expr : loc -> class_expr -> patt - - val meta_class_sig_item : loc -> class_sig_item -> patt - - val meta_class_str_item : loc -> class_str_item -> patt - - val meta_class_type : loc -> class_type -> patt - - val meta_ctyp : loc -> ctyp -> patt - - val meta_expr : loc -> expr -> patt - - val meta_ident : loc -> ident -> patt - - val meta_match_case : loc -> match_case -> patt - - val meta_module_binding : loc -> module_binding -> patt - - val meta_module_expr : loc -> module_expr -> patt - - val meta_module_type : loc -> module_type -> patt - - val meta_patt : loc -> patt -> patt - - val meta_sig_item : loc -> sig_item -> patt - - val meta_str_item : loc -> str_item -> patt - - val meta_with_constr : loc -> with_constr -> patt - - val meta_rec_flag : loc -> rec_flag -> patt - - val meta_mutable_flag : loc -> mutable_flag -> patt - - val meta_virtual_flag : loc -> virtual_flag -> patt - - val meta_private_flag : loc -> private_flag -> patt - - val meta_row_var_flag : loc -> row_var_flag -> patt - - val meta_override_flag : loc -> override_flag -> patt - - val meta_direction_flag : loc -> direction_flag -> patt - - end - - end - - end - - class map : - object ('self_type) - method string : string -> string - method list : - 'a 'b. ('self_type -> 'a -> 'b) -> 'a list -> 'b list - method meta_bool : meta_bool -> meta_bool - method meta_option : - 'a 'b. - ('self_type -> 'a -> 'b) -> 'a meta_option -> 'b meta_option - method meta_list : - 'a 'b. ('self_type -> 'a -> 'b) -> 'a meta_list -> 'b meta_list - method loc : loc -> loc - method expr : expr -> expr - method patt : patt -> patt - method ctyp : ctyp -> ctyp - method str_item : str_item -> str_item - method sig_item : sig_item -> sig_item - method module_expr : module_expr -> module_expr - method module_type : module_type -> module_type - method class_expr : class_expr -> class_expr - method class_type : class_type -> class_type - method class_sig_item : class_sig_item -> class_sig_item - method class_str_item : class_str_item -> class_str_item - method with_constr : with_constr -> with_constr - method binding : binding -> binding - method rec_binding : rec_binding -> rec_binding - method module_binding : module_binding -> module_binding - method match_case : match_case -> match_case - method ident : ident -> ident - method mutable_flag : mutable_flag -> mutable_flag - method private_flag : private_flag -> private_flag - method virtual_flag : virtual_flag -> virtual_flag - method direction_flag : direction_flag -> direction_flag - method rec_flag : rec_flag -> rec_flag - method row_var_flag : row_var_flag -> row_var_flag - method override_flag : override_flag -> override_flag - method unknown : 'a. 'a -> 'a - end - - class fold : - object ('self_type) - method string : string -> 'self_type - method list : - 'a. ('self_type -> 'a -> 'self_type) -> 'a list -> 'self_type - method meta_bool : meta_bool -> 'self_type - method meta_option : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_option -> 'self_type - method meta_list : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_list -> 'self_type - method loc : loc -> 'self_type - method expr : expr -> 'self_type - method patt : patt -> 'self_type - method ctyp : ctyp -> 'self_type - method str_item : str_item -> 'self_type - method sig_item : sig_item -> 'self_type - method module_expr : module_expr -> 'self_type - method module_type : module_type -> 'self_type - method class_expr : class_expr -> 'self_type - method class_type : class_type -> 'self_type - method class_sig_item : class_sig_item -> 'self_type - method class_str_item : class_str_item -> 'self_type - method with_constr : with_constr -> 'self_type - method binding : binding -> 'self_type - method rec_binding : rec_binding -> 'self_type - method module_binding : module_binding -> 'self_type - method match_case : match_case -> 'self_type - method ident : ident -> 'self_type - method rec_flag : rec_flag -> 'self_type - method direction_flag : direction_flag -> 'self_type - method mutable_flag : mutable_flag -> 'self_type - method private_flag : private_flag -> 'self_type - method virtual_flag : virtual_flag -> 'self_type - method row_var_flag : row_var_flag -> 'self_type - method override_flag : override_flag -> 'self_type - method unknown : 'a. 'a -> 'self_type - end - - val map_expr : (expr -> expr) -> map - - val map_patt : (patt -> patt) -> map - - val map_ctyp : (ctyp -> ctyp) -> map - - val map_str_item : (str_item -> str_item) -> map - - val map_sig_item : (sig_item -> sig_item) -> map - - val map_loc : (loc -> loc) -> map - - val ident_of_expr : expr -> ident - - val ident_of_patt : patt -> ident - - val ident_of_ctyp : ctyp -> ident - - val biAnd_of_list : binding list -> binding - - val rbSem_of_list : rec_binding list -> rec_binding - - val paSem_of_list : patt list -> patt - - val paCom_of_list : patt list -> patt - - val tyOr_of_list : ctyp list -> ctyp - - val tyAnd_of_list : ctyp list -> ctyp - - val tyAmp_of_list : ctyp list -> ctyp - - val tySem_of_list : ctyp list -> ctyp - - val tyCom_of_list : ctyp list -> ctyp - - val tySta_of_list : ctyp list -> ctyp - - val stSem_of_list : str_item list -> str_item - - val sgSem_of_list : sig_item list -> sig_item - - val crSem_of_list : class_str_item list -> class_str_item - - val cgSem_of_list : class_sig_item list -> class_sig_item - - val ctAnd_of_list : class_type list -> class_type - - val ceAnd_of_list : class_expr list -> class_expr - - val wcAnd_of_list : with_constr list -> with_constr - - val meApp_of_list : module_expr list -> module_expr - - val mbAnd_of_list : module_binding list -> module_binding - - val mcOr_of_list : match_case list -> match_case - - val idAcc_of_list : ident list -> ident - - val idApp_of_list : ident list -> ident - - val exSem_of_list : expr list -> expr - - val exCom_of_list : expr list -> expr - - val list_of_ctyp : ctyp -> ctyp list -> ctyp list - - val list_of_binding : binding -> binding list -> binding list - - val list_of_rec_binding : - rec_binding -> rec_binding list -> rec_binding list - - val list_of_with_constr : - with_constr -> with_constr list -> with_constr list - - val list_of_patt : patt -> patt list -> patt list - - val list_of_expr : expr -> expr list -> expr list - - val list_of_str_item : str_item -> str_item list -> str_item list - - val list_of_sig_item : sig_item -> sig_item list -> sig_item list - - val list_of_class_sig_item : - class_sig_item -> class_sig_item list -> class_sig_item list - - val list_of_class_str_item : - class_str_item -> class_str_item list -> class_str_item list - - val list_of_class_type : - class_type -> class_type list -> class_type list - - val list_of_class_expr : - class_expr -> class_expr list -> class_expr list - - val list_of_module_expr : - module_expr -> module_expr list -> module_expr list - - val list_of_module_binding : - module_binding -> module_binding list -> module_binding list - - val list_of_match_case : - match_case -> match_case list -> match_case list - - val list_of_ident : ident -> ident list -> ident list - - val safe_string_escaped : string -> string - - val is_irrefut_patt : patt -> bool - - val is_constructor : ident -> bool - - val is_patt_constructor : patt -> bool - - val is_expr_constructor : expr -> bool - - val ty_of_stl : (Loc.t * string * (ctyp list)) -> ctyp - - val ty_of_sbt : (Loc.t * string * bool * ctyp) -> ctyp - - val bi_of_pe : (patt * expr) -> binding - - val pel_of_binding : binding -> (patt * expr) list - - val binding_of_pel : (patt * expr) list -> binding - - val sum_type_of_list : (Loc.t * string * (ctyp list)) list -> ctyp - - val record_type_of_list : (Loc.t * string * bool * ctyp) list -> ctyp - - end - - module Camlp4AstToAst (M : Camlp4Ast) : Ast with type loc = M.loc - and type meta_bool = M.meta_bool - and type 'a meta_option = 'a M.meta_option - and type 'a meta_list = 'a M.meta_list and type ctyp = M.ctyp - and type patt = M.patt and type expr = M.expr - and type module_type = M.module_type and type sig_item = M.sig_item - and type with_constr = M.with_constr - and type module_expr = M.module_expr and type str_item = M.str_item - and type class_type = M.class_type - and type class_sig_item = M.class_sig_item - and type class_expr = M.class_expr - and type class_str_item = M.class_str_item and type binding = M.binding - and type rec_binding = M.rec_binding - and type module_binding = M.module_binding - and type match_case = M.match_case and type ident = M.ident - and type rec_flag = M.rec_flag - and type direction_flag = M.direction_flag - and type mutable_flag = M.mutable_flag - and type private_flag = M.private_flag - and type virtual_flag = M.virtual_flag - and type row_var_flag = M.row_var_flag - and type override_flag = M.override_flag = M - - module MakeCamlp4Ast (Loc : Type) = - struct - type loc = - Loc. - t - and meta_bool = - | BTrue | BFalse | BAnt of string - and rec_flag = - | ReRecursive | ReNil | ReAnt of string - and direction_flag = - | DiTo | DiDownto | DiAnt of string - and mutable_flag = - | MuMutable | MuNil | MuAnt of string - and private_flag = - | PrPrivate | PrNil | PrAnt of string - and virtual_flag = - | ViVirtual | ViNil | ViAnt of string - and override_flag = - | OvOverride | OvNil | OvAnt of string - and row_var_flag = - | RvRowVar | RvNil | RvAnt of string - and 'a meta_option = - | ONone | OSome of 'a | OAnt of string - and 'a meta_list = - | LNil | LCons of 'a * 'a meta_list | LAnt of string - and ident = - | IdAcc of loc * ident * ident - | IdApp of loc * ident * ident - | IdLid of loc * string - | IdUid of loc * string - | IdAnt of loc * string - and ctyp = - | TyNil of loc - | TyAli of loc * ctyp * ctyp - | TyAny of loc - | TyApp of loc * ctyp * ctyp - | TyArr of loc * ctyp * ctyp - | TyCls of loc * ident - | TyLab of loc * string * ctyp - | TyId of loc * ident - | TyMan of loc * ctyp * ctyp - | TyDcl of loc * string * ctyp list * ctyp * (ctyp * ctyp) list - | TyObj of loc * ctyp * row_var_flag - | TyOlb of loc * string * ctyp - | TyPol of loc * ctyp * ctyp - | TyTypePol of loc * ctyp * ctyp - | TyQuo of loc * string - | TyQuP of loc * string - | TyQuM of loc * string - | TyAnP of loc - | TyAnM of loc - | TyVrn of loc * string - | TyRec of loc * ctyp - | TyCol of loc * ctyp * ctyp - | TySem of loc * ctyp * ctyp - | TyCom of loc * ctyp * ctyp - | TySum of loc * ctyp - | TyOf of loc * ctyp * ctyp - | TyAnd of loc * ctyp * ctyp - | TyOr of loc * ctyp * ctyp - | TyPrv of loc * ctyp - | TyMut of loc * ctyp - | TyTup of loc * ctyp - | TySta of loc * ctyp * ctyp - | TyVrnEq of loc * ctyp - | TyVrnSup of loc * ctyp - | TyVrnInf of loc * ctyp - | TyVrnInfSup of loc * ctyp * ctyp - | TyAmp of loc * ctyp * ctyp - | TyOfAmp of loc * ctyp * ctyp - | TyPkg of loc * module_type - | TyAnt of loc * string - and patt = - | PaNil of loc - | PaId of loc * ident - | PaAli of loc * patt * patt - | PaAnt of loc * string - | PaAny of loc - | PaApp of loc * patt * patt - | PaArr of loc * patt - | PaCom of loc * patt * patt - | PaSem of loc * patt * patt - | PaChr of loc * string - | PaInt of loc * string - | PaInt32 of loc * string - | PaInt64 of loc * string - | PaNativeInt of loc * string - | PaFlo of loc * string - | PaLab of loc * string * patt - | PaOlb of loc * string * patt - | PaOlbi of loc * string * patt * expr - | PaOrp of loc * patt * patt - | PaRng of loc * patt * patt - | PaRec of loc * patt - | PaEq of loc * ident * patt - | PaStr of loc * string - | PaTup of loc * patt - | PaTyc of loc * patt * ctyp - | PaTyp of loc * ident - | PaVrn of loc * string - | PaLaz of loc * patt - | PaMod of loc * string - and expr = - | ExNil of loc - | ExId of loc * ident - | ExAcc of loc * expr * expr - | ExAnt of loc * string - | ExApp of loc * expr * expr - | ExAre of loc * expr * expr - | ExArr of loc * expr - | ExSem of loc * expr * expr - | ExAsf of loc - | ExAsr of loc * expr - | ExAss of loc * expr * expr - | ExChr of loc * string - | ExCoe of loc * expr * ctyp * ctyp - | ExFlo of loc * string - | ExFor of loc * string * expr * expr * direction_flag * expr - | ExFun of loc * match_case - | ExIfe of loc * expr * expr * expr - | ExInt of loc * string - | ExInt32 of loc * string - | ExInt64 of loc * string - | ExNativeInt of loc * string - | ExLab of loc * string * expr - | ExLaz of loc * expr - | ExLet of loc * rec_flag * binding * expr - | ExLmd of loc * string * module_expr * expr - | ExMat of loc * expr * match_case - | ExNew of loc * ident - | ExObj of loc * patt * class_str_item - | ExOlb of loc * string * expr - | ExOvr of loc * rec_binding - | ExRec of loc * rec_binding * expr - | ExSeq of loc * expr - | ExSnd of loc * expr * string - | ExSte of loc * expr * expr - | ExStr of loc * string - | ExTry of loc * expr * match_case - | ExTup of loc * expr - | ExCom of loc * expr * expr - | ExTyc of loc * expr * ctyp - | ExVrn of loc * string - | ExWhi of loc * expr * expr - | ExOpI of loc * ident * expr - | ExFUN of loc * string * expr - | ExPkg of loc * module_expr - and module_type = - | MtNil of loc - | MtId of loc * ident - | MtFun of loc * string * module_type * module_type - | MtQuo of loc * string - | MtSig of loc * sig_item - | MtWit of loc * module_type * with_constr - | MtOf of loc * module_expr - | MtAnt of loc * string - and sig_item = - | SgNil of loc - | SgCls of loc * class_type - | SgClt of loc * class_type - | SgSem of loc * sig_item * sig_item - | SgDir of loc * string * expr - | SgExc of loc * ctyp - | SgExt of loc * string * ctyp * string meta_list - | SgInc of loc * module_type - | SgMod of loc * string * module_type - | SgRecMod of loc * module_binding - | SgMty of loc * string * module_type - | SgOpn of loc * ident - | SgTyp of loc * ctyp - | SgVal of loc * string * ctyp - | SgAnt of loc * string - and with_constr = - | WcNil of loc - | WcTyp of loc * ctyp * ctyp - | WcMod of loc * ident * ident - | WcTyS of loc * ctyp * ctyp - | WcMoS of loc * ident * ident - | WcAnd of loc * with_constr * with_constr - | WcAnt of loc * string - and binding = - | BiNil of loc - | BiAnd of loc * binding * binding - | BiEq of loc * patt * expr - | BiAnt of loc * string - and rec_binding = - | RbNil of loc - | RbSem of loc * rec_binding * rec_binding - | RbEq of loc * ident * expr - | RbAnt of loc * string - and module_binding = - | MbNil of loc - | MbAnd of loc * module_binding * module_binding - | MbColEq of loc * string * module_type * module_expr - | MbCol of loc * string * module_type - | MbAnt of loc * string - and match_case = - | McNil of loc - | McOr of loc * match_case * match_case - | McArr of loc * patt * expr * expr - | McAnt of loc * string - and module_expr = - | MeNil of loc - | MeId of loc * ident - | MeApp of loc * module_expr * module_expr - | MeFun of loc * string * module_type * module_expr - | MeStr of loc * str_item - | MeTyc of loc * module_expr * module_type - | MePkg of loc * expr - | MeAnt of loc * string - and str_item = - | StNil of loc - | StCls of loc * class_expr - | StClt of loc * class_type - | StSem of loc * str_item * str_item - | StDir of loc * string * expr - | StExc of loc * ctyp * ident meta_option - | StExp of loc * expr - | StExt of loc * string * ctyp * string meta_list - | StInc of loc * module_expr - | StMod of loc * string * module_expr - | StRecMod of loc * module_binding - | StMty of loc * string * module_type - | StOpn of loc * ident - | StTyp of loc * ctyp - | StVal of loc * rec_flag * binding - | StAnt of loc * string - and class_type = - | CtNil of loc - | CtCon of loc * virtual_flag * ident * ctyp - | CtFun of loc * ctyp * class_type - | CtSig of loc * ctyp * class_sig_item - | CtAnd of loc * class_type * class_type - | CtCol of loc * class_type * class_type - | CtEq of loc * class_type * class_type - | CtAnt of loc * string - and class_sig_item = - | CgNil of loc - | CgCtr of loc * ctyp * ctyp - | CgSem of loc * class_sig_item * class_sig_item - | CgInh of loc * class_type - | CgMth of loc * string * private_flag * ctyp - | CgVal of loc * string * mutable_flag * virtual_flag * ctyp - | CgVir of loc * string * private_flag * ctyp - | CgAnt of loc * string - and class_expr = - | CeNil of loc - | CeApp of loc * class_expr * expr - | CeCon of loc * virtual_flag * ident * ctyp - | CeFun of loc * patt * class_expr - | CeLet of loc * rec_flag * binding * class_expr - | CeStr of loc * patt * class_str_item - | CeTyc of loc * class_expr * class_type - | CeAnd of loc * class_expr * class_expr - | CeEq of loc * class_expr * class_expr - | CeAnt of loc * string - and class_str_item = - | CrNil of loc - | CrSem of loc * class_str_item * class_str_item - | CrCtr of loc * ctyp * ctyp - | CrInh of loc * override_flag * class_expr * string - | CrIni of loc * expr - | CrMth of loc * string * override_flag * private_flag * expr - * ctyp - | CrVal of loc * string * override_flag * mutable_flag * expr - | CrVir of loc * string * private_flag * ctyp - | CrVvr of loc * string * mutable_flag * ctyp - | CrAnt of loc * string - - end - - type ('a, 'loc) stream_filter = - ('a * 'loc) Stream.t -> ('a * 'loc) Stream.t - - module type AstFilters = - sig - module Ast : Camlp4Ast - - type 'a filter = 'a -> 'a - - val register_sig_item_filter : Ast.sig_item filter -> unit - - val register_str_item_filter : Ast.str_item filter -> unit - - val register_topphrase_filter : Ast.str_item filter -> unit - - val fold_interf_filters : - ('a -> Ast.sig_item filter -> 'a) -> 'a -> 'a - - val fold_implem_filters : - ('a -> Ast.str_item filter -> 'a) -> 'a -> 'a - - val fold_topphrase_filters : - ('a -> Ast.str_item filter -> 'a) -> 'a -> 'a - - end - - module type DynAst = - sig - module Ast : Ast - - type 'a tag - - val ctyp_tag : Ast.ctyp tag - - val patt_tag : Ast.patt tag - - val expr_tag : Ast.expr tag - - val module_type_tag : Ast.module_type tag - - val sig_item_tag : Ast.sig_item tag - - val with_constr_tag : Ast.with_constr tag - - val module_expr_tag : Ast.module_expr tag - - val str_item_tag : Ast.str_item tag - - val class_type_tag : Ast.class_type tag - - val class_sig_item_tag : Ast.class_sig_item tag - - val class_expr_tag : Ast.class_expr tag - - val class_str_item_tag : Ast.class_str_item tag - - val match_case_tag : Ast.match_case tag - - val ident_tag : Ast.ident tag - - val binding_tag : Ast.binding tag - - val rec_binding_tag : Ast.rec_binding tag - - val module_binding_tag : Ast.module_binding tag - - val string_of_tag : 'a tag -> string - - module Pack (X : sig type 'a t - end) : - sig - type pack - - val pack : 'a tag -> 'a X.t -> pack - - val unpack : 'a tag -> pack -> 'a X.t - - val print_tag : Format.formatter -> pack -> unit - - end - - end - - type quotation = - { q_name : string; q_loc : string; q_shift : int; q_contents : string - } - - module type Quotation = - sig - module Ast : Ast - - module DynAst : DynAst with module Ast = Ast - - open Ast - - type 'a expand_fun = loc -> string option -> string -> 'a - - val add : string -> 'a DynAst.tag -> 'a expand_fun -> unit - - val find : string -> 'a DynAst.tag -> 'a expand_fun - - val default : string ref - - val parse_quotation_result : - (loc -> string -> 'a) -> loc -> quotation -> string -> string -> 'a - - val translate : (string -> string) ref - - val expand : loc -> quotation -> 'a DynAst.tag -> 'a - - val dump_file : (string option) ref - - module Error : Error - - end - - module type Token = - sig - module Loc : Loc - - type t - - val to_string : t -> string - - val print : Format.formatter -> t -> unit - - val match_keyword : string -> t -> bool - - val extract_string : t -> string - - module Filter : - sig - type token_filter = (t, Loc.t) stream_filter - - type t - - val mk : (string -> bool) -> t - - val define_filter : t -> (token_filter -> token_filter) -> unit - - val filter : t -> token_filter - - val keyword_added : t -> string -> bool -> unit - - val keyword_removed : t -> string -> unit - - end - - module Error : Error - - end - - type camlp4_token = - | KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int * string - | INT32 of int32 * string - | INT64 of int64 * string - | NATIVEINT of nativeint * string - | FLOAT of float * string - | CHAR of char * string - | STRING of string * string - | LABEL of string - | OPTLABEL of string - | QUOTATION of quotation - | ANTIQUOT of string * string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int * string option - | EOI - - module type Camlp4Token = Token with type t = camlp4_token - - module type DynLoader = - sig - type t - - exception Error of string * string - - val mk : ?ocaml_stdlib: bool -> ?camlp4_stdlib: bool -> unit -> t - - val fold_load_path : t -> (string -> 'a -> 'a) -> 'a -> 'a - - val load : t -> string -> unit - - val include_dir : t -> string -> unit - - val find_in_path : t -> string -> string - - val is_native : bool - - end - - module Grammar = - struct - module type Action = - sig - type t - - val mk : 'a -> t - - val get : t -> 'a - - val getf : t -> 'a -> 'b - - val getf2 : t -> 'a -> 'b -> 'c - - end - - type assoc = | NonA | RightA | LeftA - - type position = - | First - | Last - | Before of string - | After of string - | Level of string - - module type Structure = - sig - module Loc : Loc - - module Action : Action - - module Token : Token with module Loc = Loc - - type gram - - type internal_entry - - type tree - - type token_pattern = ((Token.t -> bool) * string) - - type token_info - - type token_stream = (Token.t * token_info) Stream.t - - val token_location : token_info -> Loc.t - - type symbol = - | Smeta of string * symbol list * Action.t - | Snterm of internal_entry - | Snterml of internal_entry * string - | Slist0 of symbol - | Slist0sep of symbol * symbol - | Slist1 of symbol - | Slist1sep of symbol * symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree - - type production_rule = ((symbol list) * Action.t) - - type single_extend_statment = - ((string option) * (assoc option) * (production_rule list)) - - type extend_statment = - ((position option) * (single_extend_statment list)) - - type delete_statment = symbol list - - type ('a, 'b, 'c) fold = - internal_entry -> - symbol list -> ('a Stream.t -> 'b) -> 'a Stream.t -> 'c - - type ('a, 'b, 'c) foldsep = - internal_entry -> - symbol list -> - ('a Stream.t -> 'b) -> - ('a Stream.t -> unit) -> 'a Stream.t -> 'c - - end - - module type Dynamic = - sig - include Structure - - val mk : unit -> gram - - module Entry : - sig - type 'a t - - val mk : gram -> string -> 'a t - - val of_parser : - gram -> string -> (token_stream -> 'a) -> 'a t - - val setup_parser : 'a t -> (token_stream -> 'a) -> unit - - val name : 'a t -> string - - val print : Format.formatter -> 'a t -> unit - - val dump : Format.formatter -> 'a t -> unit - - val obj : 'a t -> internal_entry - - val clear : 'a t -> unit - - end - - val get_filter : gram -> Token.Filter.t - - type 'a not_filtered - - val extend : 'a Entry.t -> extend_statment -> unit - - val delete_rule : 'a Entry.t -> delete_statment -> unit - - val srules : - 'a Entry.t -> ((symbol list) * Action.t) list -> symbol - - val sfold0 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold1 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold0sep : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) foldsep - - val lex : - gram -> - Loc.t -> - char Stream.t -> ((Token.t * Loc.t) Stream.t) not_filtered - - val lex_string : - gram -> - Loc.t -> string -> ((Token.t * Loc.t) Stream.t) not_filtered - - val filter : - gram -> - ((Token.t * Loc.t) Stream.t) not_filtered -> token_stream - - val parse : 'a Entry.t -> Loc.t -> char Stream.t -> 'a - - val parse_string : 'a Entry.t -> Loc.t -> string -> 'a - - val parse_tokens_before_filter : - 'a Entry.t -> ((Token.t * Loc.t) Stream.t) not_filtered -> 'a - - val parse_tokens_after_filter : 'a Entry.t -> token_stream -> 'a - - end - - module type Static = - sig - include Structure - - module Entry : - sig - type 'a t - - val mk : string -> 'a t - - val of_parser : string -> (token_stream -> 'a) -> 'a t - - val setup_parser : 'a t -> (token_stream -> 'a) -> unit - - val name : 'a t -> string - - val print : Format.formatter -> 'a t -> unit - - val dump : Format.formatter -> 'a t -> unit - - val obj : 'a t -> internal_entry - - val clear : 'a t -> unit - - end - - val get_filter : unit -> Token.Filter.t - - type 'a not_filtered - - val extend : 'a Entry.t -> extend_statment -> unit - - val delete_rule : 'a Entry.t -> delete_statment -> unit - - val srules : - 'a Entry.t -> ((symbol list) * Action.t) list -> symbol - - val sfold0 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold1 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold0sep : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) foldsep - - val lex : - Loc.t -> - char Stream.t -> ((Token.t * Loc.t) Stream.t) not_filtered - - val lex_string : - Loc.t -> string -> ((Token.t * Loc.t) Stream.t) not_filtered - - val filter : - ((Token.t * Loc.t) Stream.t) not_filtered -> token_stream - - val parse : 'a Entry.t -> Loc.t -> char Stream.t -> 'a - - val parse_string : 'a Entry.t -> Loc.t -> string -> 'a - - val parse_tokens_before_filter : - 'a Entry.t -> ((Token.t * Loc.t) Stream.t) not_filtered -> 'a - - val parse_tokens_after_filter : 'a Entry.t -> token_stream -> 'a - - end - - end - - module type Lexer = - sig - module Loc : Loc - - module Token : Token with module Loc = Loc - - module Error : Error - - val mk : unit -> Loc.t -> char Stream.t -> (Token.t * Loc.t) Stream.t - - end - - module Parser (Ast : Ast) = - struct - module type SIMPLE = - sig - val parse_expr : Ast.loc -> string -> Ast.expr - - val parse_patt : Ast.loc -> string -> Ast.patt - - end - - module type S = - sig - val parse_implem : - ?directive_handler: (Ast.str_item -> Ast.str_item option) -> - Ast.loc -> char Stream.t -> Ast.str_item - - val parse_interf : - ?directive_handler: (Ast.sig_item -> Ast.sig_item option) -> - Ast.loc -> char Stream.t -> Ast.sig_item - - end - - end - - module Printer (Ast : Ast) = - struct - module type S = - sig - val print_interf : - ?input_file: string -> - ?output_file: string -> Ast.sig_item -> unit - - val print_implem : - ?input_file: string -> - ?output_file: string -> Ast.str_item -> unit - - end - - end - - module type Syntax = - sig - module Loc : Loc - - module Ast : Ast with type loc = Loc.t - - module Token : Token with module Loc = Loc - - module Gram : Grammar.Static with module Loc = Loc - and module Token = Token - - module Quotation : Quotation with module Ast = Ast - - module AntiquotSyntax : Parser(Ast).SIMPLE - - include Warning(Loc).S - - include Parser(Ast).S - - include Printer(Ast).S - - end - - module type Camlp4Syntax = - sig - module Loc : Loc - - module Ast : Camlp4Ast with module Loc = Loc - - module Token : Camlp4Token with module Loc = Loc - - module Gram : Grammar.Static with module Loc = Loc - and module Token = Token - - module Quotation : Quotation with module Ast = Camlp4AstToAst(Ast) - - module AntiquotSyntax : Parser(Ast).SIMPLE - - include Warning(Loc).S - - include Parser(Ast).S - - include Printer(Ast).S - - val interf : ((Ast.sig_item list) * (Loc.t option)) Gram.Entry.t - - val implem : ((Ast.str_item list) * (Loc.t option)) Gram.Entry.t - - val top_phrase : (Ast.str_item option) Gram.Entry.t - - val use_file : ((Ast.str_item list) * (Loc.t option)) Gram.Entry.t - - val a_CHAR : string Gram.Entry.t - - val a_FLOAT : string Gram.Entry.t - - val a_INT : string Gram.Entry.t - - val a_INT32 : string Gram.Entry.t - - val a_INT64 : string Gram.Entry.t - - val a_LABEL : string Gram.Entry.t - - val a_LIDENT : string Gram.Entry.t - - val a_NATIVEINT : string Gram.Entry.t - - val a_OPTLABEL : string Gram.Entry.t - - val a_STRING : string Gram.Entry.t - - val a_UIDENT : string Gram.Entry.t - - val a_ident : string Gram.Entry.t - - val amp_ctyp : Ast.ctyp Gram.Entry.t - - val and_ctyp : Ast.ctyp Gram.Entry.t - - val match_case : Ast.match_case Gram.Entry.t - - val match_case0 : Ast.match_case Gram.Entry.t - - val match_case_quot : Ast.match_case Gram.Entry.t - - val binding : Ast.binding Gram.Entry.t - - val binding_quot : Ast.binding Gram.Entry.t - - val rec_binding_quot : Ast.rec_binding Gram.Entry.t - - val class_declaration : Ast.class_expr Gram.Entry.t - - val class_description : Ast.class_type Gram.Entry.t - - val class_expr : Ast.class_expr Gram.Entry.t - - val class_expr_quot : Ast.class_expr Gram.Entry.t - - val class_fun_binding : Ast.class_expr Gram.Entry.t - - val class_fun_def : Ast.class_expr Gram.Entry.t - - val class_info_for_class_expr : Ast.class_expr Gram.Entry.t - - val class_info_for_class_type : Ast.class_type Gram.Entry.t - - val class_longident : Ast.ident Gram.Entry.t - - val class_longident_and_param : Ast.class_expr Gram.Entry.t - - val class_name_and_param : (string * Ast.ctyp) Gram.Entry.t - - val class_sig_item : Ast.class_sig_item Gram.Entry.t - - val class_sig_item_quot : Ast.class_sig_item Gram.Entry.t - - val class_signature : Ast.class_sig_item Gram.Entry.t - - val class_str_item : Ast.class_str_item Gram.Entry.t - - val class_str_item_quot : Ast.class_str_item Gram.Entry.t - - val class_structure : Ast.class_str_item Gram.Entry.t - - val class_type : Ast.class_type Gram.Entry.t - - val class_type_declaration : Ast.class_type Gram.Entry.t - - val class_type_longident : Ast.ident Gram.Entry.t - - val class_type_longident_and_param : Ast.class_type Gram.Entry.t - - val class_type_plus : Ast.class_type Gram.Entry.t - - val class_type_quot : Ast.class_type Gram.Entry.t - - val comma_ctyp : Ast.ctyp Gram.Entry.t - - val comma_expr : Ast.expr Gram.Entry.t - - val comma_ipatt : Ast.patt Gram.Entry.t - - val comma_patt : Ast.patt Gram.Entry.t - - val comma_type_parameter : Ast.ctyp Gram.Entry.t - - val constrain : (Ast.ctyp * Ast.ctyp) Gram.Entry.t - - val constructor_arg_list : Ast.ctyp Gram.Entry.t - - val constructor_declaration : Ast.ctyp Gram.Entry.t - - val constructor_declarations : Ast.ctyp Gram.Entry.t - - val ctyp : Ast.ctyp Gram.Entry.t - - val ctyp_quot : Ast.ctyp Gram.Entry.t - - val cvalue_binding : Ast.expr Gram.Entry.t - - val direction_flag : Ast.direction_flag Gram.Entry.t - - val direction_flag_quot : Ast.direction_flag Gram.Entry.t - - val dummy : unit Gram.Entry.t - - val eq_expr : (string -> Ast.patt -> Ast.patt) Gram.Entry.t - - val expr : Ast.expr Gram.Entry.t - - val expr_eoi : Ast.expr Gram.Entry.t - - val expr_quot : Ast.expr Gram.Entry.t - - val field_expr : Ast.rec_binding Gram.Entry.t - - val field_expr_list : Ast.rec_binding Gram.Entry.t - - val fun_binding : Ast.expr Gram.Entry.t - - val fun_def : Ast.expr Gram.Entry.t - - val ident : Ast.ident Gram.Entry.t - - val ident_quot : Ast.ident Gram.Entry.t - - val ipatt : Ast.patt Gram.Entry.t - - val ipatt_tcon : Ast.patt Gram.Entry.t - - val label : string Gram.Entry.t - - val label_declaration : Ast.ctyp Gram.Entry.t - - val label_declaration_list : Ast.ctyp Gram.Entry.t - - val label_expr : Ast.rec_binding Gram.Entry.t - - val label_expr_list : Ast.rec_binding Gram.Entry.t - - val label_ipatt : Ast.patt Gram.Entry.t - - val label_ipatt_list : Ast.patt Gram.Entry.t - - val label_longident : Ast.ident Gram.Entry.t - - val label_patt : Ast.patt Gram.Entry.t - - val label_patt_list : Ast.patt Gram.Entry.t - - val labeled_ipatt : Ast.patt Gram.Entry.t - - val let_binding : Ast.binding Gram.Entry.t - - val meth_list : (Ast.ctyp * Ast.row_var_flag) Gram.Entry.t - - val meth_decl : Ast.ctyp Gram.Entry.t - - val module_binding : Ast.module_binding Gram.Entry.t - - val module_binding0 : Ast.module_expr Gram.Entry.t - - val module_binding_quot : Ast.module_binding Gram.Entry.t - - val module_declaration : Ast.module_type Gram.Entry.t - - val module_expr : Ast.module_expr Gram.Entry.t - - val module_expr_quot : Ast.module_expr Gram.Entry.t - - val module_longident : Ast.ident Gram.Entry.t - - val module_longident_with_app : Ast.ident Gram.Entry.t - - val module_rec_declaration : Ast.module_binding Gram.Entry.t - - val module_type : Ast.module_type Gram.Entry.t - - val package_type : Ast.module_type Gram.Entry.t - - val module_type_quot : Ast.module_type Gram.Entry.t - - val more_ctyp : Ast.ctyp Gram.Entry.t - - val name_tags : Ast.ctyp Gram.Entry.t - - val opt_as_lident : string Gram.Entry.t - - val opt_class_self_patt : Ast.patt Gram.Entry.t - - val opt_class_self_type : Ast.ctyp Gram.Entry.t - - val opt_comma_ctyp : Ast.ctyp Gram.Entry.t - - val opt_dot_dot : Ast.row_var_flag Gram.Entry.t - - val row_var_flag_quot : Ast.row_var_flag Gram.Entry.t - - val opt_eq_ctyp : Ast.ctyp Gram.Entry.t - - val opt_expr : Ast.expr Gram.Entry.t - - val opt_meth_list : Ast.ctyp Gram.Entry.t - - val opt_mutable : Ast.mutable_flag Gram.Entry.t - - val mutable_flag_quot : Ast.mutable_flag Gram.Entry.t - - val opt_override : Ast.override_flag Gram.Entry.t - - val override_flag_quot : Ast.override_flag Gram.Entry.t - - val opt_polyt : Ast.ctyp Gram.Entry.t - - val opt_private : Ast.private_flag Gram.Entry.t - - val private_flag_quot : Ast.private_flag Gram.Entry.t - - val opt_rec : Ast.rec_flag Gram.Entry.t - - val rec_flag_quot : Ast.rec_flag Gram.Entry.t - - val opt_virtual : Ast.virtual_flag Gram.Entry.t - - val virtual_flag_quot : Ast.virtual_flag Gram.Entry.t - - val opt_when_expr : Ast.expr Gram.Entry.t - - val patt : Ast.patt Gram.Entry.t - - val patt_as_patt_opt : Ast.patt Gram.Entry.t - - val patt_eoi : Ast.patt Gram.Entry.t - - val patt_quot : Ast.patt Gram.Entry.t - - val patt_tcon : Ast.patt Gram.Entry.t - - val phrase : Ast.str_item Gram.Entry.t - - val poly_type : Ast.ctyp Gram.Entry.t - - val row_field : Ast.ctyp Gram.Entry.t - - val sem_expr : Ast.expr Gram.Entry.t - - val sem_expr_for_list : (Ast.expr -> Ast.expr) Gram.Entry.t - - val sem_patt : Ast.patt Gram.Entry.t - - val sem_patt_for_list : (Ast.patt -> Ast.patt) Gram.Entry.t - - val semi : unit Gram.Entry.t - - val sequence : Ast.expr Gram.Entry.t - - val do_sequence : Ast.expr Gram.Entry.t - - val sig_item : Ast.sig_item Gram.Entry.t - - val sig_item_quot : Ast.sig_item Gram.Entry.t - - val sig_items : Ast.sig_item Gram.Entry.t - - val star_ctyp : Ast.ctyp Gram.Entry.t - - val str_item : Ast.str_item Gram.Entry.t - - val str_item_quot : Ast.str_item Gram.Entry.t - - val str_items : Ast.str_item Gram.Entry.t - - val type_constraint : unit Gram.Entry.t - - val type_declaration : Ast.ctyp Gram.Entry.t - - val type_ident_and_parameters : - (string * (Ast.ctyp list)) Gram.Entry.t - - val type_kind : Ast.ctyp Gram.Entry.t - - val type_longident : Ast.ident Gram.Entry.t - - val type_longident_and_parameters : Ast.ctyp Gram.Entry.t - - val type_parameter : Ast.ctyp Gram.Entry.t - - val type_parameters : (Ast.ctyp -> Ast.ctyp) Gram.Entry.t - - val typevars : Ast.ctyp Gram.Entry.t - - val val_longident : Ast.ident Gram.Entry.t - - val value_let : unit Gram.Entry.t - - val value_val : unit Gram.Entry.t - - val with_constr : Ast.with_constr Gram.Entry.t - - val with_constr_quot : Ast.with_constr Gram.Entry.t - - val prefixop : Ast.expr Gram.Entry.t - - val infixop0 : Ast.expr Gram.Entry.t - - val infixop1 : Ast.expr Gram.Entry.t - - val infixop2 : Ast.expr Gram.Entry.t - - val infixop3 : Ast.expr Gram.Entry.t - - val infixop4 : Ast.expr Gram.Entry.t - - end - - module type SyntaxExtension = - functor (Syn : Syntax) -> Syntax with module Loc = Syn.Loc - and module Ast = Syn.Ast and module Token = Syn.Token - and module Gram = Syn.Gram and module Quotation = Syn.Quotation - - end - -module ErrorHandler : - sig - val print : Format.formatter -> exn -> unit - - val try_print : Format.formatter -> exn -> unit - - val to_string : exn -> string - - val try_to_string : exn -> string - - val register : (Format.formatter -> exn -> unit) -> unit - - module Register (Error : Sig.Error) : sig end - - module ObjTools : - sig - val print : Format.formatter -> Obj.t -> unit - - val print_desc : Format.formatter -> Obj.t -> unit - - val to_string : Obj.t -> string - - val desc : Obj.t -> string - - end - - end = - struct - open Format - - module ObjTools = - struct - let desc obj = - if Obj.is_block obj - then "tag = " ^ (string_of_int (Obj.tag obj)) - else "int_val = " ^ (string_of_int (Obj.obj obj)) - - let rec to_string r = - if Obj.is_int r - then - (let i : int = Obj.magic r - in (string_of_int i) ^ (" | CstTag" ^ (string_of_int (i + 1)))) - else - (let rec get_fields acc = - function - | 0 -> acc - | n -> let n = n - 1 in get_fields ((Obj.field r n) :: acc) n in - let rec is_list r = - if Obj.is_int r - then r = (Obj.repr 0) - else - (let s = Obj.size r - and t = Obj.tag r - in (t = 0) && ((s = 2) && (is_list (Obj.field r 1)))) in - let rec get_list r = - if Obj.is_int r - then [] - else - (let h = Obj.field r 0 - and t = get_list (Obj.field r 1) - in h :: t) in - let opaque name = "<" ^ (name ^ ">") in - let s = Obj.size r - and t = Obj.tag r - in - match t with - | _ when is_list r -> - let fields = get_list r - in - "[" ^ - ((String.concat "; " (List.map to_string fields)) ^ - "]") - | 0 -> - let fields = get_fields [] s - in - "(" ^ - ((String.concat ", " (List.map to_string fields)) ^ - ")") - | x when x = Obj.lazy_tag -> opaque "lazy" - | x when x = Obj.closure_tag -> opaque "closure" - | x when x = Obj.object_tag -> - let fields = get_fields [] s in - let (_class, id, slots) = - (match fields with - | h :: h' :: t -> (h, h', t) - | _ -> assert false) - in - "Object #" ^ - ((to_string id) ^ - (" (" ^ - ((String.concat ", " (List.map to_string slots)) - ^ ")"))) - | x when x = Obj.infix_tag -> opaque "infix" - | x when x = Obj.forward_tag -> opaque "forward" - | x when x < Obj.no_scan_tag -> - let fields = get_fields [] s - in - "Tag" ^ - ((string_of_int t) ^ - (" (" ^ - ((String.concat ", " (List.map to_string fields)) - ^ ")"))) - | x when x = Obj.string_tag -> - "\"" ^ ((String.escaped (Obj.magic r : string)) ^ "\"") - | x when x = Obj.double_tag -> - Camlp4_import.Oprint.float_repres (Obj.magic r : float) - | x when x = Obj.abstract_tag -> opaque "abstract" - | x when x = Obj.custom_tag -> opaque "custom" - | x when x = Obj.final_tag -> opaque "final" - | _ -> - failwith - ("ObjTools.to_string: unknown tag (" ^ - ((string_of_int t) ^ ")"))) - - let print ppf x = fprintf ppf "%s" (to_string x) - - let print_desc ppf x = fprintf ppf "%s" (desc x) - - end - - let default_handler ppf x = - let x = Obj.repr x - in - (fprintf ppf "Camlp4: Uncaught exception: %s" - (Obj.obj (Obj.field (Obj.field x 0) 0) : string); - if (Obj.size x) > 1 - then - (pp_print_string ppf " ("; - for i = 1 to (Obj.size x) - 1 do - if i > 1 then pp_print_string ppf ", " else (); - ObjTools.print ppf (Obj.field x i) - done; - pp_print_char ppf ')') - else (); - fprintf ppf "@.") - - let handler = - ref (fun ppf default_handler exn -> default_handler ppf exn) - - let register f = - let current_handler = !handler - in - handler := - fun ppf default_handler exn -> - try f ppf exn - with | exn -> current_handler ppf default_handler exn - - module Register (Error : Sig.Error) = - struct - let _ = - let current_handler = !handler - in - handler := - fun ppf default_handler -> - function - | Error.E x -> Error.print ppf x - | x -> current_handler ppf default_handler x - - end - - let gen_print ppf default_handler = - function - | Out_of_memory -> fprintf ppf "Out of memory" - | Assert_failure ((file, line, char)) -> - fprintf ppf "Assertion failed, file %S, line %d, char %d" file line - char - | Match_failure ((file, line, char)) -> - fprintf ppf "Pattern matching failed, file %S, line %d, char %d" - file line char - | Failure str -> fprintf ppf "Failure: %S" str - | Invalid_argument str -> fprintf ppf "Invalid argument: %S" str - | Sys_error str -> fprintf ppf "I/O error: %S" str - | Stream.Failure -> fprintf ppf "Parse failure" - | Stream.Error str -> fprintf ppf "Parse error: %s" str - | x -> !handler ppf default_handler x - - let print ppf = gen_print ppf default_handler - - let try_print ppf = gen_print ppf (fun _ -> raise) - - let to_string exn = - let buf = Buffer.create 128 in - let () = bprintf buf "%a" print exn in Buffer.contents buf - - let try_to_string exn = - let buf = Buffer.create 128 in - let () = bprintf buf "%a" try_print exn in Buffer.contents buf - - end - -module Struct = - struct - module Loc : sig include Sig.Loc - end = - struct - open Format - - type pos = { line : int; bol : int; off : int } - - type t = - { file_name : string; start : pos; stop : pos; ghost : bool - } - - let dump_sel f x = - let s = - match x with - | `start -> "`start" - | `stop -> "`stop" - | `both -> "`both" - | _ -> "" - in pp_print_string f s - - let dump_pos f x = - fprintf f "@[{ line = %d ;@ bol = %d ;@ off = %d } : pos@]" - x.line x.bol x.off - - let dump_long f x = - fprintf f - "@[{ file_name = %s ;@ start = %a (%d-%d);@ stop = %a (%d);@ ghost = %b@ } : Loc.t@]" - x.file_name dump_pos x.start (x.start.off - x.start.bol) - (x.stop.off - x.start.bol) dump_pos x.stop - (x.stop.off - x.stop.bol) x.ghost - - let dump f x = - fprintf f "[%S: %d:%d-%d %d:%d%t]" x.file_name x.start.line - (x.start.off - x.start.bol) (x.stop.off - x.start.bol) - x.stop.line (x.stop.off - x.stop.bol) - (fun o -> if x.ghost then fprintf o " (ghost)" else ()) - - let start_pos = { line = 1; bol = 0; off = 0; } - - let ghost = - { - file_name = "ghost-location"; - start = start_pos; - stop = start_pos; - ghost = true; - } - - let mk file_name = - { - file_name = file_name; - start = start_pos; - stop = start_pos; - ghost = false; - } - - let of_tuple (file_name, start_line, start_bol, start_off, stop_line, - stop_bol, stop_off, ghost) - = - { - file_name = file_name; - start = { line = start_line; bol = start_bol; off = start_off; }; - stop = { line = stop_line; bol = stop_bol; off = stop_off; }; - ghost = ghost; - } - - let to_tuple { - file_name = file_name; - start = - { - line = start_line; - bol = start_bol; - off = start_off - }; - stop = - { line = stop_line; bol = stop_bol; off = stop_off }; - ghost = ghost - } = - (file_name, start_line, start_bol, start_off, stop_line, stop_bol, - stop_off, ghost) - - let pos_of_lexing_position p = - let pos = - { - line = p.Lexing.pos_lnum; - bol = p.Lexing.pos_bol; - off = p.Lexing.pos_cnum; - } - in pos - - let pos_to_lexing_position p file_name = - { - Lexing.pos_fname = file_name; - pos_lnum = p.line; - pos_bol = p.bol; - pos_cnum = p.off; - } - - let better_file_name a b = - match (a, b) with - | ("", "") -> a - | ("", x) -> x - | (x, "") -> x - | ("-", x) -> x - | (x, "-") -> x - | (x, _) -> x - - let of_lexbuf lb = - let start = Lexing.lexeme_start_p lb - and stop = Lexing.lexeme_end_p lb in - let loc = - { - file_name = - better_file_name start.Lexing.pos_fname stop.Lexing.pos_fname; - start = pos_of_lexing_position start; - stop = pos_of_lexing_position stop; - ghost = false; - } - in loc - - let of_lexing_position pos = - let loc = - { - file_name = pos.Lexing.pos_fname; - start = pos_of_lexing_position pos; - stop = pos_of_lexing_position pos; - ghost = false; - } - in loc - - let to_ocaml_location x = - { - Camlp4_import.Location.loc_start = - pos_to_lexing_position x.start x.file_name; - loc_end = pos_to_lexing_position x.stop x.file_name; - loc_ghost = x.ghost; - } - - let of_ocaml_location { - Camlp4_import.Location.loc_start = a; - loc_end = b; - loc_ghost = g - } = - let res = - { - file_name = - better_file_name a.Lexing.pos_fname b.Lexing.pos_fname; - start = pos_of_lexing_position a; - stop = pos_of_lexing_position b; - ghost = g; - } - in res - - let start_pos x = pos_to_lexing_position x.start x.file_name - - let stop_pos x = pos_to_lexing_position x.stop x.file_name - - let merge a b = - if a == b - then a - else - (let r = - match ((a.ghost), (b.ghost)) with - | (false, false) -> { (a) with stop = b.stop; } - | (true, true) -> { (a) with stop = b.stop; } - | (true, _) -> { (a) with stop = b.stop; } - | (_, true) -> { (b) with start = a.start; } - in r) - - let join x = { (x) with stop = x.start; } - - let map f start_stop_both x = - match start_stop_both with - | `start -> { (x) with start = f x.start; } - | `stop -> { (x) with stop = f x.stop; } - | `both -> { (x) with start = f x.start; stop = f x.stop; } - - let move_pos chars x = { (x) with off = x.off + chars; } - - let move s chars x = map (move_pos chars) s x - - let move_line lines x = - let move_line_pos x = - { (x) with line = x.line + lines; bol = x.off; } - in map move_line_pos `both x - - let shift width x = - { (x) with start = x.stop; stop = move_pos width x.stop; } - - let file_name x = x.file_name - - let start_line x = x.start.line - - let stop_line x = x.stop.line - - let start_bol x = x.start.bol - - let stop_bol x = x.stop.bol - - let start_off x = x.start.off - - let stop_off x = x.stop.off - - let is_ghost x = x.ghost - - let set_file_name s x = { (x) with file_name = s; } - - let ghostify x = { (x) with ghost = true; } - - let make_absolute x = - let pwd = Sys.getcwd () - in - if Filename.is_relative x.file_name - then { (x) with file_name = Filename.concat pwd x.file_name; } - else x - - let strictly_before x y = - let b = (x.stop.off < y.start.off) && (x.file_name = y.file_name) - in b - - let to_string x = - let (a, b) = ((x.start), (x.stop)) in - let res = - sprintf "File \"%s\", line %d, characters %d-%d" x.file_name - a.line (a.off - a.bol) (b.off - a.bol) - in - if x.start.line <> x.stop.line - then - sprintf "%s (end at line %d, character %d)" res x.stop.line - (b.off - b.bol) - else res - - let print out x = pp_print_string out (to_string x) - - let check x msg = - if - ((start_line x) > (stop_line x)) || - (((start_bol x) > (stop_bol x)) || - (((start_off x) > (stop_off x)) || - (((start_line x) < 0) || - (((stop_line x) < 0) || - (((start_bol x) < 0) || - (((stop_bol x) < 0) || - (((start_off x) < 0) || ((stop_off x) < 0)))))))) - then - (eprintf "*** Warning: (%s) strange positions ***\n%a@\n" msg - print x; - false) - else true - - exception Exc_located of t * exn - - let _ = - ErrorHandler.register - (fun ppf -> - function - | Exc_located (loc, exn) -> - fprintf ppf "%a:@\n%a" print loc ErrorHandler.print exn - | exn -> raise exn) - - let name = ref "_loc" - - let raise loc exc = - match exc with - | Exc_located (_, _) -> raise exc - | _ -> raise (Exc_located (loc, exc)) - - end - - module Token : - sig - module Make (Loc : Sig.Loc) : Sig.Camlp4Token with module Loc = Loc - - module Eval : - sig - val char : string -> char - - val string : ?strict: unit -> string -> string - - end - - end = - struct - open Format - - module Make (Loc : Sig.Loc) : Sig.Camlp4Token with module Loc = Loc = - struct - module Loc = Loc - - open Sig - - type t = camlp4_token - - type token = t - - let to_string = - function - | KEYWORD s -> sprintf "KEYWORD %S" s - | SYMBOL s -> sprintf "SYMBOL %S" s - | LIDENT s -> sprintf "LIDENT %S" s - | UIDENT s -> sprintf "UIDENT %S" s - | INT (_, s) -> sprintf "INT %s" s - | INT32 (_, s) -> sprintf "INT32 %sd" s - | INT64 (_, s) -> sprintf "INT64 %sd" s - | NATIVEINT (_, s) -> sprintf "NATIVEINT %sd" s - | FLOAT (_, s) -> sprintf "FLOAT %s" s - | CHAR (_, s) -> sprintf "CHAR '%s'" s - | STRING (_, s) -> sprintf "STRING \"%s\"" s - | LABEL s -> sprintf "LABEL %S" s - | OPTLABEL s -> sprintf "OPTLABEL %S" s - | ANTIQUOT (n, s) -> sprintf "ANTIQUOT %s: %S" n s - | QUOTATION x -> - sprintf - "QUOTATION { q_name=%S; q_loc=%S; q_shift=%d; q_contents=%S }" - x.q_name x.q_loc x.q_shift x.q_contents - | COMMENT s -> sprintf "COMMENT %S" s - | BLANKS s -> sprintf "BLANKS %S" s - | NEWLINE -> sprintf "NEWLINE" - | EOI -> sprintf "EOI" - | ESCAPED_IDENT s -> sprintf "ESCAPED_IDENT %S" s - | LINE_DIRECTIVE (i, None) -> sprintf "LINE_DIRECTIVE %d" i - | LINE_DIRECTIVE (i, (Some s)) -> - sprintf "LINE_DIRECTIVE %d %S" i s - - let print ppf x = pp_print_string ppf (to_string x) - - let match_keyword kwd = - function | KEYWORD kwd' when kwd = kwd' -> true | _ -> false - - let extract_string = - function - | KEYWORD s | SYMBOL s | LIDENT s | UIDENT s | INT (_, s) | - INT32 (_, s) | INT64 (_, s) | NATIVEINT (_, s) | - FLOAT (_, s) | CHAR (_, s) | STRING (_, s) | LABEL s | - OPTLABEL s | COMMENT s | BLANKS s | ESCAPED_IDENT s -> s - | tok -> - invalid_arg - ("Cannot extract a string from this token: " ^ - (to_string tok)) - - module Error = - struct - type t = - | Illegal_token of string - | Keyword_as_label of string - | Illegal_token_pattern of string * string - | Illegal_constructor of string - - exception E of t - - let print ppf = - function - | Illegal_token s -> fprintf ppf "Illegal token (%s)" s - | Keyword_as_label kwd -> - fprintf ppf - "`%s' is a keyword, it cannot be used as label name" - kwd - | Illegal_token_pattern (p_con, p_prm) -> - fprintf ppf "Illegal token pattern: %s %S" p_con p_prm - | Illegal_constructor con -> - fprintf ppf "Illegal constructor %S" con - - let to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b - - end - - let _ = let module M = ErrorHandler.Register(Error) in () - - module Filter = - struct - type token_filter = (t, Loc.t) stream_filter - - type t = - { is_kwd : string -> bool; mutable filter : token_filter - } - - let err error loc = - raise (Loc.Exc_located (loc, (Error.E error))) - - let keyword_conversion tok is_kwd = - match tok with - | SYMBOL s | LIDENT s | UIDENT s when is_kwd s -> KEYWORD s - | ESCAPED_IDENT s -> LIDENT s - | _ -> tok - - let check_keyword_as_label tok loc is_kwd = - let s = - match tok with | LABEL s -> s | OPTLABEL s -> s | _ -> "" - in - if (s <> "") && (is_kwd s) - then err (Error.Keyword_as_label s) loc - else () - - let check_unknown_keywords tok loc = - match tok with - | SYMBOL s -> err (Error.Illegal_token s) loc - | _ -> () - - let error_no_respect_rules p_con p_prm = - raise - (Error.E (Error.Illegal_token_pattern (p_con, p_prm))) - - let check_keyword _ = true - - let error_on_unknown_keywords = ref false - - let rec ignore_layout (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some - (((COMMENT _ | BLANKS _ | NEWLINE | - LINE_DIRECTIVE (_, _)), - _)) - -> (Stream.junk __strm; ignore_layout __strm) - | Some x -> - (Stream.junk __strm; - let s = __strm - in - Stream.icons x - (Stream.slazy (fun _ -> ignore_layout s))) - | _ -> Stream.sempty - - let mk is_kwd = { is_kwd = is_kwd; filter = ignore_layout; } - - let filter x = - let f tok loc = - let tok = keyword_conversion tok x.is_kwd - in - (check_keyword_as_label tok loc x.is_kwd; - if !error_on_unknown_keywords - then check_unknown_keywords tok loc - else (); - (tok, loc)) in - let rec filter (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some ((tok, loc)) -> - (Stream.junk __strm; - let s = __strm - in - Stream.lcons (fun _ -> f tok loc) - (Stream.slazy (fun _ -> filter s))) - | _ -> Stream.sempty in - let rec tracer (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some (((_tok, _loc) as x)) -> - (Stream.junk __strm; - let xs = __strm - in - Stream.icons x (Stream.slazy (fun _ -> tracer xs))) - | _ -> Stream.sempty - in fun strm -> tracer (x.filter (filter strm)) - - let define_filter x f = x.filter <- f x.filter - - let keyword_added _ _ _ = () - - let keyword_removed _ _ = () - - end - - end - - module Eval = - struct - let valch x = (Char.code x) - (Char.code '0') - - let valch_hex x = - let d = Char.code x - in - if d >= 97 - then d - 87 - else if d >= 65 then d - 55 else d - 48 - - let rec skip_indent (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some (' ' | '\t') -> (Stream.junk __strm; skip_indent __strm) - | _ -> () - - let skip_opt_linefeed (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some '\n' -> (Stream.junk __strm; ()) - | _ -> () - - let chr c = - if (c < 0) || (c > 255) - then failwith "invalid char token" - else Char.chr c - - let rec backslash (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some '\n' -> (Stream.junk __strm; '\n') - | Some '\r' -> (Stream.junk __strm; '\r') - | Some 'n' -> (Stream.junk __strm; '\n') - | Some 'r' -> (Stream.junk __strm; '\r') - | Some 't' -> (Stream.junk __strm; '\t') - | Some 'b' -> (Stream.junk __strm; '\b') - | Some '\\' -> (Stream.junk __strm; '\\') - | Some '"' -> (Stream.junk __strm; '"') - | Some '\'' -> (Stream.junk __strm; '\'') - | Some ' ' -> (Stream.junk __strm; ' ') - | Some (('0' .. '9' as c1)) -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some (('0' .. '9' as c2)) -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some (('0' .. '9' as c3)) -> - (Stream.junk __strm; - chr - (((100 * (valch c1)) + (10 * (valch c2))) + - (valch c3))) - | _ -> raise (Stream.Error ""))) - | _ -> raise (Stream.Error ""))) - | Some 'x' -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some (('0' .. '9' | 'a' .. 'f' | 'A' .. 'F' as c1)) -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some - (('0' .. '9' | 'a' .. 'f' | 'A' .. 'F' as c2)) - -> - (Stream.junk __strm; - chr ((16 * (valch_hex c1)) + (valch_hex c2))) - | _ -> raise (Stream.Error ""))) - | _ -> raise (Stream.Error ""))) - | _ -> raise Stream.Failure - - let rec backslash_in_string strict store (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some '\n' -> (Stream.junk __strm; skip_indent __strm) - | Some '\r' -> - (Stream.junk __strm; - let s = __strm in (skip_opt_linefeed s; skip_indent s)) - | _ -> - (match try Some (backslash __strm) - with | Stream.Failure -> None - with - | Some x -> store x - | _ -> - (match Stream.peek __strm with - | Some c when not strict -> - (Stream.junk __strm; store '\\'; store c) - | _ -> failwith "invalid string token")) - - let char s = - if (String.length s) = 1 - then s.[0] - else - if (String.length s) = 0 - then failwith "invalid char token" - else - (let (__strm : _ Stream.t) = Stream.of_string s - in - match Stream.peek __strm with - | Some '\\' -> - (Stream.junk __strm; - (try backslash __strm - with | Stream.Failure -> raise (Stream.Error ""))) - | _ -> failwith "invalid char token") - - let string ?strict s = - let buf = Buffer.create 23 in - let store = Buffer.add_char buf in - let rec parse (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some '\\' -> - (Stream.junk __strm; - let _ = - (try backslash_in_string (strict <> None) store __strm - with | Stream.Failure -> raise (Stream.Error "")) - in parse __strm) - | Some c -> - (Stream.junk __strm; - let s = __strm in (store c; parse s)) - | _ -> Buffer.contents buf - in parse (Stream.of_string s) - - end - - end - - module Lexer = - struct - module TokenEval = Token.Eval - - module Make (Token : Sig.Camlp4Token) = - struct - module Loc = Token.Loc - - module Token = Token - - open Lexing - - open Sig - - module Error = - struct - type t = - | Illegal_character of char - | Illegal_escape of string - | Unterminated_comment - | Unterminated_string - | Unterminated_quotation - | Unterminated_antiquot - | Unterminated_string_in_comment - | Comment_start - | Comment_not_end - | Literal_overflow of string - - exception E of t - - open Format - - let print ppf = - function - | Illegal_character c -> - fprintf ppf "Illegal character (%s)" (Char.escaped c) - | Illegal_escape s -> - fprintf ppf - "Illegal backslash escape in string or character (%s)" - s - | Unterminated_comment -> - fprintf ppf "Comment not terminated" - | Unterminated_string -> - fprintf ppf "String literal not terminated" - | Unterminated_string_in_comment -> - fprintf ppf - "This comment contains an unterminated string literal" - | Unterminated_quotation -> - fprintf ppf "Quotation not terminated" - | Unterminated_antiquot -> - fprintf ppf "Antiquotation not terminated" - | Literal_overflow ty -> - fprintf ppf - "Integer literal exceeds the range of representable integers of type %s" - ty - | Comment_start -> - fprintf ppf "this is the start of a comment" - | Comment_not_end -> - fprintf ppf "this is not the end of a comment" - - let to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b - - end - - let _ = let module M = ErrorHandler.Register(Error) in () - - open Error - - type context = - { loc : Loc.t; in_comment : bool; quotations : bool; - antiquots : bool; lexbuf : lexbuf; buffer : Buffer.t - } - - let default_context lb = - { - loc = Loc.ghost; - in_comment = false; - quotations = true; - antiquots = false; - lexbuf = lb; - buffer = Buffer.create 256; - } - - let store c = Buffer.add_string c.buffer (Lexing.lexeme c.lexbuf) - - let istore_char c i = - Buffer.add_char c.buffer (Lexing.lexeme_char c.lexbuf i) - - let buff_contents c = - let contents = Buffer.contents c.buffer - in (Buffer.reset c.buffer; contents) - - let loc c = Loc.merge c.loc (Loc.of_lexbuf c.lexbuf) - - let quotations c = c.quotations - - let antiquots c = c.antiquots - - 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 p = c.lexbuf.lex_start_p - in - c.lexbuf.lex_start_p <- - { (p) with pos_cnum = p.pos_cnum + shift; } - - let update_loc c = { (c) with loc = Loc.of_lexbuf c.lexbuf; } - - let with_curr_loc f c = f (update_loc c) c.lexbuf - - let parse_nested f c = - (with_curr_loc f c; set_start_p c; buff_contents c) - - let shift n c = { (c) with loc = Loc.move `both n c.loc; } - - let store_parse f c = (store c; f c c.lexbuf) - - let parse f c = f c c.lexbuf - - let mk_quotation quotation c name loc shift = - let s = parse_nested quotation (update_loc c) in - let contents = String.sub s 0 ((String.length s) - 2) - in - QUOTATION - { - q_name = name; - q_loc = loc; - q_shift = shift; - q_contents = contents; - } - - let update_loc c file line absolute chars = - let lexbuf = c.lexbuf in - let pos = lexbuf.lex_curr_p in - let new_file = - match file with | None -> pos.pos_fname | Some s -> s - in - lexbuf.lex_curr_p <- - { - (pos) - with - pos_fname = new_file; - pos_lnum = if absolute then line else pos.pos_lnum + line; - pos_bol = pos.pos_cnum - chars; - } - - let cvt_int_literal s = - (int_of_string ("-" ^ s)) - - let cvt_int32_literal s = Int32.neg (Int32.of_string ("-" ^ s)) - - let cvt_int64_literal s = Int64.neg (Int64.of_string ("-" ^ s)) - - let cvt_nativeint_literal s = - Nativeint.neg (Nativeint.of_string ("-" ^ s)) - - let err error loc = - raise (Loc.Exc_located (loc, (Error.E error))) - - let warn error loc = - Format.eprintf "Warning: %a: %a@." Loc.print loc Error.print - error - - let __ocaml_lex_tables = - { - Lexing.lex_base = - "\000\000\223\255\224\255\224\000\226\255\253\000\035\001\072\001\ - \109\001\146\001\091\000\183\001\068\000\190\001\218\001\227\255\ - \122\000\002\002\071\002\110\002\176\000\244\255\129\002\162\002\ - \235\002\187\003\154\004\246\004\124\000\001\000\255\255\198\005\ - \253\255\150\006\252\255\245\255\246\255\247\255\253\000\224\000\ - \086\000\091\000\054\003\006\004\029\002\237\001\182\004\109\000\ - \118\007\091\000\253\000\093\000\243\255\242\255\241\255\106\005\ - \077\003\108\000\087\003\017\006\151\007\218\007\001\008\068\008\ - \107\008\107\000\239\255\126\008\075\001\210\008\249\008\060\009\ - \232\255\231\255\230\255\099\009\166\009\205\009\016\010\055\010\ - \249\001\228\255\229\255\238\255\090\010\127\010\164\010\201\010\ - \238\010\019\011\056\011\091\011\128\011\165\011\202\011\239\011\ - \020\012\057\012\094\012\011\007\136\005\004\000\233\255\008\000\ - \054\001\245\002\009\000\005\000\233\255\131\012\138\012\175\012\ - \212\012\249\012\000\013\037\013\068\013\096\013\133\013\138\013\ - \205\013\242\013\023\014\085\014\241\255\006\000\242\255\243\255\ - \148\002\251\255\047\015\123\000\109\000\125\000\255\255\254\255\ - \253\255\111\015\046\016\254\016\206\017\174\018\129\000\017\001\ - \130\000\141\000\249\255\248\255\247\255\237\006\109\003\143\000\ - \246\255\035\004\145\000\245\255\160\014\149\000\244\255\086\004\ - \247\255\248\255\007\000\249\255\201\018\255\255\250\255\121\016\ - \154\004\253\255\091\001\057\001\171\004\252\255\073\017\251\255\ - \240\018\051\019\018\020\048\020\255\255\015\021\238\021\015\022\ - \079\022\255\255\031\023\254\255\164\001\251\255\010\000\252\255\ - \253\255\128\000\079\001\255\255\095\023\030\024\238\024\190\025\ - \254\255\190\026\253\255\254\255\153\001\143\027\110\028\255\255\ - \167\001\062\029\206\001\251\255\080\001\013\000\253\255\254\255\ - \255\255\252\255\126\029\061\030\013\031\221\031"; - Lexing.lex_backtrk = - "\255\255\255\255\255\255\030\000\255\255\028\000\030\000\030\000\ - \030\000\030\000\028\000\028\000\028\000\028\000\028\000\255\255\ - \028\000\030\000\030\000\028\000\028\000\255\255\006\000\006\000\ - \005\000\004\000\030\000\030\000\001\000\000\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\007\000\ - \255\255\255\255\255\255\006\000\006\000\006\000\007\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\014\000\ - \014\000\014\000\255\255\255\255\255\255\255\255\255\255\028\000\ - \028\000\015\000\255\255\028\000\255\255\255\255\028\000\255\255\ - \255\255\255\255\255\255\028\000\028\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\030\000\021\000\020\000\ - \018\000\030\000\018\000\018\000\018\000\018\000\028\000\018\000\ - \255\255\019\000\030\000\255\255\255\255\022\000\255\255\255\255\ - \255\255\255\255\255\255\022\000\255\255\255\255\255\255\255\255\ - \028\000\255\255\028\000\255\255\028\000\028\000\028\000\028\000\ - \030\000\030\000\030\000\255\255\255\255\013\000\255\255\255\255\ - \014\000\255\255\003\000\014\000\014\000\014\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\005\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\006\000\255\255\008\000\255\255\255\255\005\000\ - \005\000\255\255\001\000\001\000\255\255\255\255\255\255\255\255\ - \000\000\001\000\001\000\255\255\255\255\002\000\002\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\003\000\255\255\ - \255\255\004\000\004\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\002\000\002\000\002\000\255\255\ - \255\255\255\255\255\255\255\255\004\000\002\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255"; - Lexing.lex_default = - "\001\000\000\000\000\000\255\255\000\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\000\000\ - \255\255\255\255\255\255\255\255\049\000\000\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\000\000\255\255\ - \000\000\255\255\000\000\000\000\000\000\000\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \054\000\255\255\255\255\255\255\000\000\000\000\000\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\000\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\000\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\103\000\255\255\255\255\000\000\103\000\ - \104\000\103\000\106\000\255\255\000\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\124\000\000\000\255\255\000\000\000\000\ - \142\000\000\000\255\255\255\255\255\255\255\255\000\000\000\000\ - \000\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\000\000\000\000\000\000\255\255\255\255\255\255\ - \000\000\255\255\255\255\000\000\255\255\255\255\000\000\160\000\ - \000\000\000\000\255\255\000\000\166\000\000\000\000\000\255\255\ - \255\255\000\000\255\255\255\255\255\255\000\000\255\255\000\000\ - \255\255\255\255\255\255\255\255\000\000\255\255\255\255\255\255\ - \255\255\000\000\255\255\000\000\189\000\000\000\255\255\000\000\ - \000\000\255\255\255\255\000\000\255\255\255\255\255\255\255\255\ - \000\000\205\000\000\000\000\000\255\255\255\255\255\255\000\000\ - \255\255\255\255\211\000\000\000\255\255\255\255\000\000\000\000\ - \000\000\000\000\255\255\255\255\255\255\255\255"; - Lexing.lex_trans = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\028\000\030\000\030\000\028\000\029\000\102\000\108\000\ - \126\000\163\000\102\000\108\000\191\000\101\000\107\000\214\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \028\000\003\000\021\000\016\000\004\000\009\000\009\000\020\000\ - \019\000\005\000\018\000\003\000\015\000\003\000\014\000\009\000\ - \023\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\013\000\012\000\017\000\006\000\007\000\026\000\ - \009\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\011\000\003\000\005\000\009\000\025\000\ - \015\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\010\000\008\000\005\000\027\000\015\000\ - \117\000\117\000\053\000\100\000\052\000\028\000\045\000\045\000\ - \028\000\115\000\117\000\044\000\044\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\053\000\066\000\118\000\135\000\116\000\ - \115\000\115\000\100\000\117\000\028\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\134\000\ - \148\000\147\000\099\000\099\000\099\000\099\000\099\000\099\000\ - \099\000\099\000\099\000\099\000\146\000\138\000\152\000\136\000\ - \155\000\117\000\051\000\137\000\158\000\050\000\200\000\000\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\118\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\000\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \002\000\003\000\000\000\000\000\003\000\003\000\003\000\051\000\ - \255\255\255\255\003\000\003\000\048\000\003\000\003\000\003\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\003\000\144\000\003\000\003\000\003\000\003\000\ - \003\000\000\000\096\000\096\000\052\000\038\000\084\000\000\000\ - \047\000\000\000\047\000\084\000\096\000\046\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\084\000\ - \147\000\084\000\084\000\084\000\003\000\096\000\003\000\039\000\ - \102\000\000\000\171\000\101\000\003\000\038\000\000\000\003\000\ - \009\000\009\000\000\000\000\000\084\000\003\000\003\000\000\000\ - \003\000\006\000\009\000\000\000\068\000\000\000\000\000\068\000\ - \106\000\171\000\084\000\096\000\003\000\085\000\003\000\006\000\ - \006\000\006\000\003\000\009\000\171\000\171\000\000\000\000\000\ - \000\000\003\000\000\000\068\000\003\000\121\000\121\000\000\000\ - \000\000\084\000\003\000\003\000\074\000\003\000\007\000\121\000\ - \000\000\084\000\084\000\171\000\000\000\000\000\000\000\003\000\ - \084\000\009\000\120\000\000\000\007\000\007\000\007\000\003\000\ - \121\000\197\000\219\000\195\000\217\000\000\000\003\000\196\000\ - \218\000\003\000\009\000\009\000\000\000\000\000\005\000\003\000\ - \003\000\000\000\003\000\006\000\009\000\000\000\000\000\085\000\ - \084\000\003\000\000\000\000\000\003\000\005\000\121\000\085\000\ - \000\000\006\000\006\000\006\000\003\000\009\000\191\000\000\000\ - \255\255\190\000\000\000\003\000\000\000\000\000\003\000\009\000\ - \009\000\000\000\208\000\094\000\003\000\003\000\000\000\003\000\ - \009\000\009\000\000\000\000\000\120\000\005\000\003\000\208\000\ - \208\000\003\000\005\000\009\000\098\000\000\000\009\000\009\000\ - \009\000\003\000\009\000\203\000\000\000\208\000\000\000\000\000\ - \214\000\000\000\000\000\213\000\117\000\117\000\000\000\000\000\ - \194\000\203\000\193\000\111\000\111\000\115\000\117\000\005\000\ - \000\000\085\000\005\000\003\000\109\000\111\000\003\000\094\000\ - \009\000\116\000\216\000\116\000\115\000\115\000\000\000\117\000\ - \114\000\000\000\109\000\112\000\112\000\000\000\111\000\111\000\ - \111\000\000\000\080\000\084\000\000\000\080\000\000\000\000\000\ - \112\000\111\000\212\000\000\000\000\000\000\000\098\000\094\000\ - \003\000\000\000\000\000\000\000\110\000\117\000\109\000\109\000\ - \109\000\080\000\111\000\005\000\111\000\045\000\045\000\000\000\ - \000\000\000\000\081\000\003\000\000\000\000\000\003\000\009\000\ - \009\000\000\000\000\000\084\000\003\000\003\000\000\000\003\000\ - \006\000\009\000\000\000\116\000\000\000\000\000\255\255\084\000\ - \111\000\036\000\110\000\005\000\086\000\000\000\088\000\006\000\ - \006\000\003\000\087\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\045\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\000\000\110\000\084\000\ - \000\000\037\000\000\000\035\000\000\000\000\000\003\000\084\000\ - \009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\036\000\000\000\003\000\003\000\003\000\000\000\000\000\ - \083\000\003\000\003\000\000\000\003\000\003\000\003\000\060\000\ - \000\000\000\000\060\000\000\000\044\000\000\000\085\000\084\000\ - \003\000\003\000\000\000\003\000\003\000\003\000\003\000\003\000\ - \000\000\037\000\000\000\035\000\000\000\000\000\060\000\061\000\ - \000\000\000\000\061\000\064\000\064\000\000\000\000\000\000\000\ - \065\000\061\000\000\000\061\000\062\000\064\000\144\000\000\000\ - \000\000\143\000\000\000\003\000\192\000\003\000\000\000\000\000\ - \063\000\000\000\062\000\062\000\062\000\061\000\064\000\039\000\ - \000\000\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\145\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\003\000\038\000\000\000\ - \000\000\000\000\061\000\000\000\064\000\036\000\215\000\000\000\ - \039\000\000\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\022\000\000\000\000\000\000\000\000\000\ - \022\000\000\000\000\000\000\000\040\000\000\000\038\000\038\000\ - \000\000\000\000\063\000\000\000\061\000\037\000\036\000\035\000\ - \141\000\041\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\042\000\000\000\000\000\000\000\105\000\102\000\ - \000\000\022\000\101\000\000\000\040\000\000\000\000\000\038\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\037\000\000\000\ - \035\000\041\000\024\000\000\000\000\000\105\000\000\000\104\000\ - \000\000\000\000\042\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\000\000\000\000\ - \000\000\000\000\024\000\000\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\049\000\ - \049\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\000\000\000\000\000\000\255\255\000\000\000\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\153\000\153\000\153\000\ - \153\000\153\000\153\000\153\000\153\000\153\000\153\000\000\000\ - \000\000\000\000\000\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\000\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\025\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\255\255\000\000\000\000\ - \000\000\000\000\000\000\000\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\000\000\000\000\ - \000\000\000\000\025\000\000\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\000\000\000\000\000\000\ - \000\000\000\000\036\000\154\000\154\000\154\000\154\000\154\000\ - \154\000\154\000\154\000\154\000\154\000\000\000\000\000\000\000\ - \163\000\000\000\000\000\162\000\000\000\043\000\000\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\000\000\000\000\000\000\ - \000\000\000\000\037\000\000\000\035\000\000\000\000\000\000\000\ - \165\000\000\000\000\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\000\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\164\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\003\000\000\000\000\000\003\000\003\000\ - \003\000\000\000\000\000\000\000\003\000\003\000\000\000\003\000\ - \003\000\003\000\172\000\172\000\172\000\172\000\172\000\172\000\ - \172\000\172\000\172\000\172\000\003\000\000\000\003\000\003\000\ - \003\000\003\000\003\000\173\000\173\000\173\000\173\000\173\000\ - \173\000\173\000\173\000\173\000\173\000\000\000\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \003\000\033\000\000\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\046\000\003\000\003\000\ - \003\000\000\000\003\000\003\000\003\000\000\000\000\000\000\000\ - \003\000\003\000\000\000\003\000\003\000\003\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\003\000\003\000\003\000\003\000\003\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\003\000\031\000\161\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\000\000\003\000\000\000\003\000\000\000\000\000\000\000\ - \000\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\100\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\059\000\000\000\000\000\000\000\000\000\ - \100\000\000\000\000\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ - \099\000\099\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\000\000\000\000\000\000\000\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \032\000\000\000\000\000\000\000\000\000\000\000\000\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\000\000\000\000\000\000\000\000\031\000\000\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\049\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \049\000\049\000\049\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\049\000\049\000\049\000\049\000\049\000\049\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\000\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\033\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \034\000\000\000\000\000\000\000\000\000\000\000\000\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\000\000\000\000\000\000\000\000\033\000\000\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\000\000\000\000\000\000\105\000\102\000\000\000\000\000\ - \101\000\000\000\000\000\000\000\000\000\156\000\156\000\156\000\ - \156\000\156\000\156\000\156\000\156\000\156\000\156\000\000\000\ - \000\000\000\000\000\000\105\000\000\000\104\000\156\000\156\000\ - \156\000\156\000\156\000\156\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\099\000\099\000\099\000\099\000\099\000\ - \099\000\099\000\099\000\099\000\099\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\156\000\156\000\ - \156\000\156\000\156\000\156\000\000\000\000\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\000\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\000\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\057\000\000\000\ - \057\000\000\000\000\000\000\000\000\000\057\000\000\000\000\000\ - \060\000\000\000\000\000\060\000\000\000\000\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\056\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\060\000\ - \078\000\000\000\000\000\078\000\078\000\078\000\000\000\000\000\ - \000\000\079\000\078\000\000\000\078\000\078\000\078\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\078\000\057\000\078\000\078\000\078\000\078\000\078\000\ - \057\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\068\000\057\000\000\000\068\000\000\000\ - \057\000\000\000\057\000\000\000\000\000\000\000\055\000\000\000\ - \000\000\000\000\000\000\078\000\000\000\078\000\000\000\000\000\ - \000\000\000\000\068\000\069\000\000\000\000\000\069\000\069\000\ - \069\000\000\000\000\000\072\000\071\000\069\000\000\000\069\000\ - \069\000\069\000\068\000\255\255\000\000\068\000\000\000\000\000\ - \000\000\000\000\000\000\078\000\069\000\078\000\069\000\069\000\ - \069\000\069\000\069\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\068\000\069\000\000\000\000\000\069\000\070\000\070\000\ - \000\000\000\000\072\000\071\000\069\000\000\000\069\000\077\000\ - \070\000\000\000\000\000\000\000\000\000\000\000\069\000\000\000\ - \069\000\000\000\000\000\077\000\000\000\077\000\077\000\077\000\ - \069\000\070\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\068\000\000\000\000\000\ - \068\000\000\000\000\000\000\000\000\000\000\000\069\000\000\000\ - \069\000\000\000\000\000\000\000\000\000\069\000\000\000\070\000\ - \000\000\000\000\000\000\000\000\068\000\069\000\000\000\000\000\ - \069\000\076\000\076\000\000\000\000\000\072\000\071\000\069\000\ - \000\000\069\000\075\000\076\000\068\000\000\000\255\255\068\000\ - \000\000\000\000\000\000\000\000\000\000\077\000\075\000\069\000\ - \075\000\075\000\075\000\069\000\076\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\068\000\069\000\000\000\000\000\069\000\ - \070\000\070\000\000\000\067\000\072\000\071\000\069\000\000\000\ - \069\000\070\000\070\000\000\000\000\000\000\000\000\000\000\000\ - \069\000\000\000\076\000\067\000\067\000\070\000\067\000\070\000\ - \070\000\070\000\069\000\070\000\067\000\067\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \067\000\000\000\067\000\067\000\067\000\000\000\067\000\000\000\ - \075\000\000\000\069\000\000\000\000\000\000\000\067\000\069\000\ - \000\000\070\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\067\000\000\000\068\000\067\000\000\000\068\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\067\000\070\000\ - \000\000\069\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\068\000\069\000\000\000\000\000\069\000\069\000\ - \069\000\067\000\067\000\073\000\071\000\069\000\000\000\069\000\ - \069\000\069\000\068\000\000\000\000\000\068\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\069\000\000\000\069\000\069\000\ - \069\000\069\000\069\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\068\000\069\000\000\000\000\000\069\000\070\000\070\000\ - \000\000\067\000\073\000\071\000\069\000\000\000\069\000\070\000\ - \070\000\000\000\000\000\000\000\000\000\000\000\069\000\000\000\ - \069\000\000\000\000\000\070\000\000\000\070\000\070\000\070\000\ - \069\000\070\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\068\000\000\000\000\000\ - \068\000\000\000\000\000\000\000\000\000\000\000\069\000\000\000\ - \069\000\000\000\000\000\000\000\067\000\069\000\000\000\070\000\ - \000\000\000\000\000\000\000\000\068\000\069\000\000\000\000\000\ - \069\000\069\000\069\000\000\000\000\000\000\000\071\000\069\000\ - \000\000\069\000\069\000\069\000\068\000\000\000\000\000\068\000\ - \000\000\000\000\000\000\000\000\067\000\070\000\069\000\069\000\ - \069\000\069\000\069\000\069\000\069\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\068\000\069\000\000\000\000\000\069\000\ - \076\000\076\000\000\000\000\000\073\000\071\000\069\000\000\000\ - \069\000\075\000\076\000\000\000\000\000\000\000\000\000\000\000\ - \069\000\000\000\069\000\000\000\000\000\075\000\000\000\075\000\ - \075\000\075\000\069\000\076\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\068\000\ - \000\000\000\000\068\000\000\000\000\000\000\000\000\000\000\000\ - \069\000\000\000\069\000\000\000\000\000\000\000\000\000\069\000\ - \000\000\076\000\000\000\000\000\000\000\000\000\068\000\069\000\ - \000\000\000\000\069\000\076\000\076\000\000\000\067\000\073\000\ - \071\000\069\000\000\000\069\000\076\000\076\000\068\000\000\000\ - \000\000\068\000\000\000\000\000\000\000\000\000\000\000\075\000\ - \076\000\069\000\076\000\076\000\076\000\069\000\076\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\068\000\069\000\000\000\ - \000\000\069\000\070\000\070\000\000\000\000\000\073\000\071\000\ - \069\000\000\000\069\000\077\000\070\000\000\000\000\000\000\000\ - \000\000\067\000\069\000\000\000\076\000\000\000\000\000\077\000\ - \000\000\077\000\077\000\077\000\069\000\070\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\080\000\000\000\000\000\080\000\000\000\000\000\000\000\ - \000\000\067\000\076\000\000\000\069\000\000\000\000\000\000\000\ - \000\000\069\000\000\000\070\000\000\000\000\000\000\000\000\000\ - \080\000\078\000\000\000\000\000\078\000\078\000\078\000\000\000\ - \000\000\082\000\079\000\078\000\000\000\078\000\078\000\078\000\ - \080\000\000\000\000\000\080\000\000\000\000\000\000\000\000\000\ - \000\000\077\000\078\000\069\000\078\000\078\000\078\000\078\000\ - \078\000\000\000\000\000\000\000\000\000\000\000\000\000\080\000\ - \078\000\000\000\000\000\078\000\078\000\078\000\000\000\000\000\ - \000\000\079\000\078\000\000\000\078\000\078\000\078\000\000\000\ - \000\000\000\000\000\000\000\000\078\000\000\000\078\000\000\000\ - \000\000\078\000\000\000\078\000\078\000\078\000\078\000\078\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\096\000\ - \096\000\000\000\000\000\084\000\000\000\000\000\000\000\000\000\ - \084\000\096\000\000\000\000\000\078\000\000\000\078\000\000\000\ - \000\000\000\000\000\000\078\000\084\000\078\000\084\000\084\000\ - \084\000\000\000\096\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\000\000\003\000\009\000\009\000\000\000\000\000\ - \005\000\003\000\003\000\000\000\003\000\006\000\009\000\000\000\ - \000\000\000\000\000\000\078\000\000\000\078\000\000\000\084\000\ - \096\000\085\000\000\000\006\000\006\000\006\000\003\000\009\000\ - \000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\ - \003\000\009\000\009\000\000\000\000\000\005\000\003\000\003\000\ - \000\000\003\000\006\000\009\000\000\000\000\000\084\000\084\000\ - \000\000\000\000\000\000\003\000\084\000\009\000\085\000\000\000\ - \006\000\006\000\006\000\003\000\009\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\000\000\003\000\009\000\009\000\ - \000\000\000\000\094\000\003\000\003\000\000\000\003\000\009\000\ - \009\000\000\000\000\000\085\000\005\000\003\000\000\000\000\000\ - \003\000\084\000\009\000\098\000\000\000\009\000\009\000\009\000\ - \003\000\009\000\000\000\000\000\000\000\000\000\000\000\090\000\ - \000\000\000\000\003\000\093\000\093\000\000\000\000\000\084\000\ - \090\000\090\000\000\000\090\000\091\000\093\000\000\000\000\000\ - \085\000\005\000\003\000\000\000\000\000\003\000\094\000\009\000\ - \092\000\000\000\006\000\091\000\089\000\090\000\093\000\000\000\ - \000\000\000\000\000\000\000\000\003\000\000\000\000\000\003\000\ - \009\000\009\000\000\000\000\000\084\000\003\000\003\000\000\000\ - \003\000\006\000\009\000\000\000\000\000\098\000\094\000\003\000\ - \000\000\000\000\090\000\084\000\093\000\085\000\000\000\006\000\ - \006\000\097\000\003\000\009\000\000\000\000\000\000\000\000\000\ - \000\000\090\000\000\000\000\000\003\000\090\000\090\000\000\000\ - \000\000\000\000\090\000\090\000\000\000\090\000\090\000\090\000\ - \000\000\000\000\092\000\084\000\090\000\000\000\000\000\003\000\ - \084\000\009\000\090\000\000\000\003\000\090\000\003\000\090\000\ - \090\000\000\000\000\000\000\000\090\000\000\000\000\000\003\000\ - \093\000\093\000\000\000\000\000\084\000\090\000\090\000\000\000\ - \090\000\091\000\093\000\000\000\000\000\000\000\000\000\085\000\ - \084\000\003\000\000\000\000\000\090\000\092\000\090\000\006\000\ - \091\000\006\000\090\000\093\000\000\000\000\000\000\000\000\000\ - \000\000\090\000\000\000\000\000\003\000\093\000\093\000\000\000\ - \000\000\005\000\090\000\090\000\000\000\090\000\091\000\093\000\ - \000\000\000\000\000\000\000\000\090\000\000\000\090\000\090\000\ - \084\000\093\000\092\000\000\000\006\000\091\000\006\000\090\000\ - \093\000\000\000\000\000\000\000\000\000\000\000\090\000\000\000\ - \000\000\003\000\093\000\093\000\000\000\000\000\094\000\090\000\ - \090\000\000\000\090\000\093\000\093\000\000\000\000\000\092\000\ - \084\000\090\000\000\000\000\000\090\000\084\000\093\000\095\000\ - \000\000\009\000\093\000\009\000\090\000\093\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\096\000\ - \096\000\000\000\000\000\094\000\000\000\000\000\000\000\000\000\ - \096\000\096\000\000\000\000\000\092\000\005\000\090\000\000\000\ - \000\000\090\000\094\000\093\000\096\000\000\000\096\000\096\000\ - \096\000\000\000\096\000\000\000\000\000\000\000\000\000\000\000\ - \090\000\000\000\000\000\003\000\093\000\093\000\000\000\000\000\ - \094\000\090\000\090\000\000\000\090\000\093\000\093\000\000\000\ - \000\000\095\000\094\000\090\000\000\000\000\000\000\000\094\000\ - \096\000\095\000\000\000\009\000\093\000\009\000\090\000\093\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\096\000\096\000\000\000\000\000\094\000\000\000\000\000\ - \000\000\000\000\096\000\096\000\000\000\000\000\096\000\094\000\ - \000\000\000\000\000\000\090\000\094\000\093\000\096\000\000\000\ - \096\000\096\000\096\000\000\000\096\000\000\000\000\000\000\000\ - \000\000\000\000\003\000\000\000\000\000\003\000\009\000\009\000\ - \000\000\000\000\084\000\003\000\003\000\000\000\003\000\006\000\ - \009\000\000\000\000\000\095\000\094\000\090\000\000\000\000\000\ - \000\000\094\000\096\000\085\000\000\000\006\000\006\000\006\000\ - \003\000\009\000\000\000\000\000\000\000\000\000\000\000\003\000\ - \000\000\000\000\003\000\009\000\009\000\000\000\000\000\094\000\ - \003\000\003\000\000\000\003\000\009\000\009\000\000\000\000\000\ - \096\000\094\000\000\000\000\000\000\000\003\000\084\000\009\000\ - \098\000\000\000\009\000\009\000\009\000\003\000\009\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \111\000\111\000\000\000\000\000\084\000\000\000\000\000\111\000\ - \111\000\109\000\111\000\005\000\000\000\085\000\084\000\003\000\ - \109\000\111\000\003\000\094\000\009\000\110\000\000\000\109\000\ - \109\000\109\000\000\000\111\000\110\000\000\000\109\000\109\000\ - \109\000\000\000\111\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\111\000\111\000\000\000\000\000\ - \094\000\000\000\098\000\094\000\003\000\111\000\111\000\000\000\ - \084\000\111\000\000\000\000\000\000\000\000\000\000\000\084\000\ - \111\000\113\000\000\000\111\000\111\000\111\000\000\000\111\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\111\000\111\000\000\000\000\000\084\000\000\000\110\000\ - \084\000\000\000\109\000\111\000\000\000\000\000\110\000\005\000\ - \000\000\000\000\000\000\000\000\094\000\111\000\110\000\000\000\ - \109\000\109\000\109\000\000\000\111\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\111\000\111\000\ - \000\000\000\000\094\000\000\000\000\000\111\000\111\000\111\000\ - \111\000\005\000\000\000\113\000\094\000\000\000\109\000\111\000\ - \000\000\084\000\111\000\113\000\000\000\111\000\111\000\111\000\ - \000\000\111\000\110\000\000\000\109\000\109\000\109\000\000\000\ - \111\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\117\000\117\000\000\000\000\000\000\000\000\000\ - \110\000\084\000\000\000\115\000\117\000\000\000\094\000\111\000\ - \000\000\000\000\000\000\000\000\000\000\084\000\111\000\115\000\ - \000\000\116\000\115\000\115\000\000\000\117\000\000\000\000\000\ - \000\000\117\000\117\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\115\000\117\000\000\000\113\000\094\000\000\000\ - \000\000\000\000\000\000\000\000\110\000\005\000\115\000\000\000\ - \116\000\115\000\115\000\117\000\117\000\117\000\117\000\000\000\ - \067\000\000\000\000\000\000\000\000\000\000\000\117\000\117\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\117\000\000\000\117\000\117\000\117\000\000\000\ - \117\000\115\000\117\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\119\000\119\000\000\000\000\000\000\000\119\000\ - \119\000\000\000\067\000\118\000\119\000\000\000\000\000\000\000\ - \119\000\119\000\000\000\067\000\000\000\000\000\117\000\118\000\ - \115\000\118\000\118\000\118\000\119\000\119\000\119\000\119\000\ - \119\000\000\000\119\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\067\000\117\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\119\000\000\000\067\000\000\000\000\000\ - \119\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\ - \000\000\003\000\121\000\121\000\000\000\000\000\005\000\003\000\ - \003\000\000\000\003\000\007\000\121\000\000\000\000\000\000\000\ - \000\000\118\000\000\000\000\000\000\000\067\000\119\000\120\000\ - \000\000\007\000\007\000\007\000\003\000\121\000\000\000\000\000\ - \000\000\000\000\000\000\003\000\000\000\000\000\003\000\121\000\ - \121\000\000\000\000\000\094\000\003\000\003\000\000\000\003\000\ - \121\000\121\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\005\000\121\000\122\000\000\000\121\000\121\000\ - \121\000\003\000\121\000\000\000\000\000\000\000\000\000\000\000\ - \003\000\000\000\000\000\003\000\121\000\121\000\000\000\000\000\ - \094\000\003\000\003\000\000\000\003\000\121\000\121\000\000\000\ - \000\000\120\000\005\000\003\000\000\000\000\000\003\000\094\000\ - \121\000\122\000\000\000\121\000\121\000\121\000\003\000\121\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\126\000\ - \000\000\000\000\125\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\122\000\094\000\ - \003\000\000\000\000\000\003\000\094\000\121\000\000\000\129\000\ - \000\000\000\000\000\000\000\000\128\000\133\000\000\000\132\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\131\000\000\000\122\000\094\000\003\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \000\000\000\000\000\000\000\000\130\000\000\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \157\000\157\000\157\000\157\000\157\000\157\000\157\000\157\000\ - \157\000\157\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\157\000\157\000\157\000\157\000\157\000\157\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\157\000\157\000\157\000\157\000\157\000\157\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\000\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\000\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\127\000\130\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\000\000\000\000\000\000\000\000\130\000\000\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\000\000\000\000\000\000\000\000\140\000\000\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\000\000\000\000\000\000\000\000\000\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\000\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\000\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\000\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\000\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\000\000\000\000\000\000\000\000\139\000\000\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ - \174\000\174\000\174\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\174\000\174\000\174\000\174\000\174\000\174\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\174\000\174\000\174\000\174\000\174\000\174\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\000\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \000\000\000\000\136\000\000\000\000\000\000\000\137\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\000\000\000\000\000\000\000\000\139\000\000\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\175\000\175\000\175\000\175\000\175\000\175\000\175\000\ - \175\000\175\000\175\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\175\000\175\000\175\000\175\000\175\000\175\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\175\000\175\000\175\000\175\000\175\000\175\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\000\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\140\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \000\000\000\000\136\000\000\000\000\000\000\000\000\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\000\000\000\000\000\000\000\000\140\000\000\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\000\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\000\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\151\000\000\000\ - \151\000\000\000\000\000\171\000\000\000\151\000\170\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\150\000\150\000\ - \150\000\150\000\150\000\150\000\150\000\150\000\150\000\150\000\ - \000\000\169\000\000\000\169\000\000\000\000\000\000\000\000\000\ - \169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\168\000\168\000\168\000\168\000\168\000\168\000\168\000\ - \168\000\168\000\168\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\151\000\000\000\000\000\000\000\000\000\000\000\ - \151\000\176\000\000\000\000\000\176\000\176\000\176\000\000\000\ - \000\000\000\000\176\000\176\000\151\000\176\000\176\000\176\000\ - \151\000\000\000\151\000\000\000\000\000\169\000\149\000\000\000\ - \000\000\000\000\176\000\169\000\176\000\176\000\176\000\176\000\ - \176\000\000\000\000\000\000\000\000\000\000\000\000\000\169\000\ - \000\000\000\000\000\000\169\000\000\000\169\000\000\000\000\000\ - \000\000\167\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\176\000\000\000\176\000\000\000\ - \000\000\000\000\000\000\000\000\178\000\000\000\000\000\178\000\ - \178\000\178\000\000\000\000\000\000\000\178\000\178\000\000\000\ - \178\000\178\000\178\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\176\000\178\000\176\000\178\000\ - \178\000\178\000\178\000\178\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\000\000\178\000\ - \000\000\178\000\179\000\000\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\000\000\178\000\ - \000\000\178\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\255\255\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\000\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\000\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\178\000\000\000\000\000\178\000\178\000\ - \178\000\000\000\000\000\000\000\178\000\178\000\000\000\178\000\ - \178\000\178\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\178\000\000\000\178\000\178\000\ - \178\000\178\000\178\000\000\000\000\000\000\000\000\000\179\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\000\000\000\000\180\000\000\000\178\000\000\000\ - \178\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\000\000\000\000\000\000\178\000\179\000\ - \178\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\000\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\000\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \182\000\000\000\000\000\182\000\182\000\182\000\000\000\000\000\ - \000\000\182\000\182\000\000\000\182\000\182\000\182\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\182\000\000\000\182\000\182\000\182\000\182\000\182\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\000\000\182\000\000\000\182\000\183\000\000\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\000\000\182\000\000\000\182\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\182\000\ - \000\000\000\000\182\000\182\000\182\000\000\000\000\000\000\000\ - \182\000\182\000\000\000\182\000\182\000\182\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \182\000\000\000\182\000\182\000\182\000\182\000\182\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\183\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\000\000\182\000\185\000\182\000\000\000\000\000\184\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\182\000\000\000\182\000\000\000\183\000\000\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\000\000\000\000\000\000\000\000\186\000\000\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\000\000\000\000\000\000\000\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\000\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\000\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\000\000\000\000\187\000\000\000\000\000\000\000\000\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\000\000\000\000\000\000\000\000\186\000\000\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\000\000\000\000\000\000\000\000\199\000\000\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\000\000\000\000\000\000\000\000\000\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\000\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\000\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\000\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\000\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\000\000\000\000\000\000\000\000\198\000\000\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\000\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \000\000\000\000\195\000\000\000\000\000\000\000\196\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\000\000\000\000\000\000\000\000\198\000\000\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\000\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\199\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \000\000\000\000\195\000\000\000\000\000\000\000\000\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\000\000\000\000\000\000\000\000\199\000\000\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\000\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\000\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\204\000\ - \202\000\202\000\207\000\202\000\202\000\000\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\204\000\202\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \203\000\202\000\202\000\202\000\202\000\202\000\202\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\202\000\202\000\202\000\202\000\000\000\206\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\202\000\202\000\ - \202\000\202\000\202\000\202\000\202\000\202\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\202\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\202\000\209\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\255\255\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\203\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\000\000\000\000\000\000\000\000\209\000\000\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\208\000\ - \000\000\000\000\000\000\000\000\000\000\209\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\208\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \203\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\000\000\000\000\000\000\000\000\209\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \203\000\000\000\000\000\000\000\000\000\000\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\000\000\000\000\000\000\000\000\209\000\000\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\000\000\000\000\000\000\000\000\000\000\000\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\000\000\000\000\000\000\000\000\221\000\000\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\000\000\000\000\000\000\000\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\000\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\000\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\000\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \000\000\000\000\000\000\000\000\220\000\000\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\000\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\000\000\ - \000\000\217\000\000\000\000\000\000\000\218\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \000\000\000\000\000\000\000\000\220\000\000\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\000\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\221\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\000\000\ - \000\000\217\000\000\000\000\000\000\000\000\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \000\000\000\000\000\000\000\000\221\000\000\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\000\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\000\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\000\000"; - Lexing.lex_check = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\000\000\000\000\029\000\000\000\000\000\101\000\107\000\ - \125\000\162\000\103\000\106\000\190\000\103\000\106\000\213\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\ - \010\000\010\000\049\000\016\000\051\000\028\000\040\000\040\000\ - \028\000\010\000\010\000\041\000\041\000\041\000\041\000\041\000\ - \041\000\041\000\041\000\057\000\065\000\010\000\132\000\010\000\ - \010\000\010\000\016\000\010\000\028\000\047\000\047\000\047\000\ - \047\000\047\000\047\000\047\000\047\000\047\000\047\000\133\000\ - \142\000\144\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\016\000\016\000\145\000\131\000\151\000\131\000\ - \154\000\010\000\020\000\131\000\157\000\020\000\193\000\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\255\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\003\000\255\255\255\255\003\000\003\000\003\000\050\000\ - \103\000\106\000\003\000\003\000\020\000\003\000\003\000\003\000\ - \039\000\039\000\039\000\039\000\039\000\039\000\039\000\039\000\ - \039\000\039\000\003\000\143\000\003\000\003\000\003\000\003\000\ - \003\000\255\255\005\000\005\000\050\000\039\000\005\000\255\255\ - \038\000\255\255\038\000\005\000\005\000\038\000\038\000\038\000\ - \038\000\038\000\038\000\038\000\038\000\038\000\038\000\005\000\ - \143\000\005\000\005\000\005\000\003\000\005\000\003\000\039\000\ - \104\000\255\255\171\000\104\000\006\000\039\000\255\255\006\000\ - \006\000\006\000\255\255\255\255\006\000\006\000\006\000\255\255\ - \006\000\006\000\006\000\255\255\068\000\255\255\255\255\068\000\ - \104\000\171\000\005\000\005\000\003\000\006\000\003\000\006\000\ - \006\000\006\000\006\000\006\000\170\000\170\000\255\255\255\255\ - \255\255\007\000\255\255\068\000\007\000\007\000\007\000\255\255\ - \255\255\007\000\007\000\007\000\068\000\007\000\007\000\007\000\ - \255\255\005\000\005\000\170\000\255\255\255\255\255\255\006\000\ - \006\000\006\000\007\000\255\255\007\000\007\000\007\000\007\000\ - \007\000\194\000\212\000\194\000\212\000\255\255\008\000\194\000\ - \212\000\008\000\008\000\008\000\255\255\255\255\008\000\008\000\ - \008\000\255\255\008\000\008\000\008\000\255\255\255\255\006\000\ - \006\000\006\000\255\255\255\255\007\000\007\000\007\000\008\000\ - \255\255\008\000\008\000\008\000\008\000\008\000\188\000\255\255\ - \020\000\188\000\255\255\009\000\255\255\255\255\009\000\009\000\ - \009\000\255\255\204\000\009\000\009\000\009\000\255\255\009\000\ - \009\000\009\000\255\255\255\255\007\000\007\000\007\000\204\000\ - \208\000\008\000\008\000\008\000\009\000\255\255\009\000\009\000\ - \009\000\009\000\009\000\204\000\255\255\208\000\255\255\255\255\ - \210\000\255\255\255\255\210\000\011\000\011\000\255\255\255\255\ - \188\000\208\000\188\000\013\000\013\000\011\000\011\000\013\000\ - \255\255\008\000\008\000\008\000\013\000\013\000\009\000\009\000\ - \009\000\011\000\210\000\011\000\011\000\011\000\255\255\011\000\ - \013\000\255\255\013\000\013\000\013\000\255\255\013\000\014\000\ - \014\000\255\255\080\000\014\000\255\255\080\000\255\255\255\255\ - \014\000\014\000\210\000\255\255\255\255\255\255\009\000\009\000\ - \009\000\255\255\255\255\255\255\014\000\011\000\014\000\014\000\ - \014\000\080\000\014\000\013\000\013\000\045\000\045\000\255\255\ - \255\255\255\255\080\000\017\000\255\255\255\255\017\000\017\000\ - \017\000\255\255\255\255\017\000\017\000\017\000\255\255\017\000\ - \017\000\017\000\255\255\011\000\255\255\255\255\104\000\014\000\ - \014\000\045\000\013\000\013\000\017\000\255\255\017\000\017\000\ - \017\000\017\000\017\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\045\000\044\000\044\000\044\000\ - \044\000\044\000\044\000\044\000\044\000\255\255\014\000\014\000\ - \255\255\045\000\255\255\045\000\255\255\255\255\017\000\017\000\ - \017\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \018\000\044\000\255\255\018\000\018\000\018\000\255\255\255\255\ - \018\000\018\000\018\000\255\255\018\000\018\000\018\000\019\000\ - \255\255\255\255\019\000\255\255\044\000\255\255\017\000\017\000\ - \017\000\018\000\255\255\018\000\018\000\018\000\018\000\018\000\ - \255\255\044\000\255\255\044\000\255\255\255\255\019\000\019\000\ - \255\255\255\255\019\000\019\000\019\000\255\255\255\255\255\255\ - \019\000\019\000\255\255\019\000\019\000\019\000\128\000\255\255\ - \255\255\128\000\255\255\018\000\188\000\018\000\255\255\255\255\ - \019\000\255\255\019\000\019\000\019\000\019\000\019\000\022\000\ - \255\255\022\000\022\000\022\000\022\000\022\000\022\000\022\000\ - \022\000\022\000\022\000\128\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\018\000\255\255\018\000\022\000\255\255\ - \255\255\255\255\019\000\255\255\019\000\022\000\210\000\255\255\ - \023\000\255\255\023\000\023\000\023\000\023\000\023\000\023\000\ - \023\000\023\000\023\000\023\000\255\255\255\255\255\255\255\255\ - \022\000\255\255\255\255\255\255\023\000\255\255\022\000\023\000\ - \255\255\255\255\019\000\255\255\019\000\022\000\023\000\022\000\ - \128\000\023\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\023\000\255\255\255\255\255\255\105\000\105\000\ - \255\255\023\000\105\000\255\255\023\000\255\255\255\255\023\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\023\000\255\255\ - \023\000\023\000\024\000\255\255\255\255\105\000\255\255\105\000\ - \255\255\255\255\023\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\255\255\255\255\ - \255\255\255\255\024\000\255\255\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\042\000\042\000\ - \042\000\042\000\042\000\042\000\042\000\042\000\042\000\042\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\042\000\ - \042\000\042\000\042\000\042\000\042\000\056\000\056\000\056\000\ - \056\000\056\000\056\000\056\000\056\000\056\000\056\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\255\255\255\255\255\255\128\000\255\255\255\255\042\000\ - \042\000\042\000\042\000\042\000\042\000\150\000\150\000\150\000\ - \150\000\150\000\150\000\150\000\150\000\150\000\150\000\255\255\ - \255\255\255\255\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\255\255\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\025\000\024\000\024\000\024\000\024\000\024\000\ - \024\000\024\000\024\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\105\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\255\255\255\255\ - \255\255\255\255\025\000\255\255\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\043\000\043\000\ - \043\000\043\000\043\000\043\000\043\000\043\000\043\000\043\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\043\000\ - \043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\ - \255\255\255\255\043\000\153\000\153\000\153\000\153\000\153\000\ - \153\000\153\000\153\000\153\000\153\000\255\255\255\255\255\255\ - \159\000\255\255\255\255\159\000\255\255\043\000\255\255\043\000\ - \043\000\043\000\043\000\043\000\043\000\255\255\255\255\255\255\ - \255\255\255\255\043\000\255\255\043\000\255\255\255\255\255\255\ - \159\000\255\255\255\255\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\255\255\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\159\000\025\000\025\000\025\000\025\000\025\000\ - \025\000\025\000\025\000\026\000\255\255\255\255\026\000\026\000\ - \026\000\255\255\255\255\255\255\026\000\026\000\255\255\026\000\ - \026\000\026\000\168\000\168\000\168\000\168\000\168\000\168\000\ - \168\000\168\000\168\000\168\000\026\000\255\255\026\000\026\000\ - \026\000\026\000\026\000\172\000\172\000\172\000\172\000\172\000\ - \172\000\172\000\172\000\172\000\172\000\255\255\046\000\046\000\ - \046\000\046\000\046\000\046\000\046\000\046\000\046\000\046\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\026\000\255\255\ - \026\000\026\000\255\255\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\046\000\026\000\027\000\ - \026\000\255\255\027\000\027\000\027\000\255\255\255\255\255\255\ - \027\000\027\000\255\255\027\000\027\000\027\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \027\000\255\255\027\000\027\000\027\000\027\000\027\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\027\000\255\255\027\000\027\000\159\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\255\255\027\000\255\255\027\000\255\255\255\255\255\255\ - \255\255\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\100\000\026\000\026\000\026\000\026\000\026\000\026\000\ - \026\000\026\000\055\000\055\000\055\000\055\000\055\000\055\000\ - \055\000\055\000\055\000\055\000\255\255\255\255\255\255\255\255\ - \100\000\255\255\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ - \100\000\100\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\055\000\055\000\055\000\055\000\055\000\ - \055\000\255\255\255\255\255\255\255\255\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\031\000\027\000\027\000\ - \027\000\027\000\027\000\027\000\027\000\027\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\255\255\255\255\255\255\255\255\255\255\255\255\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\255\255\255\255\255\255\255\255\031\000\255\255\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\059\000\059\000\059\000\059\000\059\000\059\000\059\000\ - \059\000\059\000\059\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\059\000\059\000\059\000\059\000\059\000\059\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\059\000\059\000\059\000\059\000\059\000\059\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\255\255\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\033\000\031\000\031\000\ - \031\000\031\000\031\000\031\000\031\000\031\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\255\255\255\255\255\255\255\255\255\255\255\255\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\255\255\255\255\255\255\255\255\033\000\255\255\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\255\255\255\255\255\255\099\000\099\000\255\255\255\255\ - \099\000\255\255\255\255\255\255\255\255\149\000\149\000\149\000\ - \149\000\149\000\149\000\149\000\149\000\149\000\149\000\255\255\ - \255\255\255\255\255\255\099\000\255\255\099\000\149\000\149\000\ - \149\000\149\000\149\000\149\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\099\000\099\000\099\000\099\000\099\000\ - \099\000\099\000\099\000\099\000\099\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\149\000\149\000\ - \149\000\149\000\149\000\149\000\255\255\255\255\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\255\255\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\255\255\033\000\033\000\ - \033\000\033\000\033\000\033\000\033\000\033\000\048\000\255\255\ - \048\000\255\255\255\255\255\255\255\255\048\000\255\255\255\255\ - \060\000\255\255\255\255\060\000\255\255\255\255\048\000\048\000\ - \048\000\048\000\048\000\048\000\048\000\048\000\048\000\048\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\060\000\ - \060\000\255\255\255\255\060\000\060\000\060\000\255\255\255\255\ - \255\255\060\000\060\000\255\255\060\000\060\000\060\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\060\000\048\000\060\000\060\000\060\000\060\000\060\000\ - \048\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\061\000\048\000\255\255\061\000\255\255\ - \048\000\255\255\048\000\255\255\255\255\255\255\048\000\255\255\ - \255\255\255\255\255\255\060\000\255\255\060\000\255\255\255\255\ - \255\255\255\255\061\000\061\000\255\255\255\255\061\000\061\000\ - \061\000\255\255\255\255\061\000\061\000\061\000\255\255\061\000\ - \061\000\061\000\062\000\099\000\255\255\062\000\255\255\255\255\ - \255\255\255\255\255\255\060\000\061\000\060\000\061\000\061\000\ - \061\000\061\000\061\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\062\000\062\000\255\255\255\255\062\000\062\000\062\000\ - \255\255\255\255\062\000\062\000\062\000\255\255\062\000\062\000\ - \062\000\255\255\255\255\255\255\255\255\255\255\061\000\255\255\ - \061\000\255\255\255\255\062\000\255\255\062\000\062\000\062\000\ - \062\000\062\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\063\000\255\255\255\255\ - \063\000\255\255\255\255\255\255\255\255\255\255\061\000\255\255\ - \061\000\255\255\255\255\255\255\255\255\062\000\255\255\062\000\ - \255\255\255\255\255\255\255\255\063\000\063\000\255\255\255\255\ - \063\000\063\000\063\000\255\255\255\255\063\000\063\000\063\000\ - \255\255\063\000\063\000\063\000\064\000\255\255\048\000\064\000\ - \255\255\255\255\255\255\255\255\255\255\062\000\063\000\062\000\ - \063\000\063\000\063\000\063\000\063\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\064\000\064\000\255\255\255\255\064\000\ - \064\000\064\000\255\255\064\000\064\000\064\000\064\000\255\255\ - \064\000\064\000\064\000\255\255\255\255\255\255\255\255\255\255\ - \063\000\255\255\063\000\067\000\067\000\064\000\067\000\064\000\ - \064\000\064\000\064\000\064\000\067\000\067\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \067\000\255\255\067\000\067\000\067\000\255\255\067\000\255\255\ - \063\000\255\255\063\000\255\255\255\255\255\255\064\000\064\000\ - \255\255\064\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\067\000\255\255\069\000\067\000\255\255\069\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\064\000\064\000\ - \255\255\064\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\069\000\069\000\255\255\255\255\069\000\069\000\ - \069\000\067\000\067\000\069\000\069\000\069\000\255\255\069\000\ - \069\000\069\000\070\000\255\255\255\255\070\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\069\000\255\255\069\000\069\000\ - \069\000\069\000\069\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\070\000\070\000\255\255\255\255\070\000\070\000\070\000\ - \255\255\070\000\070\000\070\000\070\000\255\255\070\000\070\000\ - \070\000\255\255\255\255\255\255\255\255\255\255\069\000\255\255\ - \069\000\255\255\255\255\070\000\255\255\070\000\070\000\070\000\ - \070\000\070\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\071\000\255\255\255\255\ - \071\000\255\255\255\255\255\255\255\255\255\255\069\000\255\255\ - \069\000\255\255\255\255\255\255\070\000\070\000\255\255\070\000\ - \255\255\255\255\255\255\255\255\071\000\071\000\255\255\255\255\ - \071\000\071\000\071\000\255\255\255\255\255\255\071\000\071\000\ - \255\255\071\000\071\000\071\000\075\000\255\255\255\255\075\000\ - \255\255\255\255\255\255\255\255\070\000\070\000\071\000\070\000\ - \071\000\071\000\071\000\071\000\071\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\075\000\075\000\255\255\255\255\075\000\ - \075\000\075\000\255\255\255\255\075\000\075\000\075\000\255\255\ - \075\000\075\000\075\000\255\255\255\255\255\255\255\255\255\255\ - \071\000\255\255\071\000\255\255\255\255\075\000\255\255\075\000\ - \075\000\075\000\075\000\075\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\076\000\ - \255\255\255\255\076\000\255\255\255\255\255\255\255\255\255\255\ - \071\000\255\255\071\000\255\255\255\255\255\255\255\255\075\000\ - \255\255\075\000\255\255\255\255\255\255\255\255\076\000\076\000\ - \255\255\255\255\076\000\076\000\076\000\255\255\076\000\076\000\ - \076\000\076\000\255\255\076\000\076\000\076\000\077\000\255\255\ - \255\255\077\000\255\255\255\255\255\255\255\255\255\255\075\000\ - \076\000\075\000\076\000\076\000\076\000\076\000\076\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\077\000\077\000\255\255\ - \255\255\077\000\077\000\077\000\255\255\255\255\077\000\077\000\ - \077\000\255\255\077\000\077\000\077\000\255\255\255\255\255\255\ - \255\255\076\000\076\000\255\255\076\000\255\255\255\255\077\000\ - \255\255\077\000\077\000\077\000\077\000\077\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\078\000\255\255\255\255\078\000\255\255\255\255\255\255\ - \255\255\076\000\076\000\255\255\076\000\255\255\255\255\255\255\ - \255\255\077\000\255\255\077\000\255\255\255\255\255\255\255\255\ - \078\000\078\000\255\255\255\255\078\000\078\000\078\000\255\255\ - \255\255\078\000\078\000\078\000\255\255\078\000\078\000\078\000\ - \079\000\255\255\255\255\079\000\255\255\255\255\255\255\255\255\ - \255\255\077\000\078\000\077\000\078\000\078\000\078\000\078\000\ - \078\000\255\255\255\255\255\255\255\255\255\255\255\255\079\000\ - \079\000\255\255\255\255\079\000\079\000\079\000\255\255\255\255\ - \255\255\079\000\079\000\255\255\079\000\079\000\079\000\255\255\ - \255\255\255\255\255\255\255\255\078\000\255\255\078\000\255\255\ - \255\255\079\000\255\255\079\000\079\000\079\000\079\000\079\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\084\000\ - \084\000\255\255\255\255\084\000\255\255\255\255\255\255\255\255\ - \084\000\084\000\255\255\255\255\078\000\255\255\078\000\255\255\ - \255\255\255\255\255\255\079\000\084\000\079\000\084\000\084\000\ - \084\000\255\255\084\000\255\255\255\255\255\255\255\255\255\255\ - \085\000\255\255\255\255\085\000\085\000\085\000\255\255\255\255\ - \085\000\085\000\085\000\255\255\085\000\085\000\085\000\255\255\ - \255\255\255\255\255\255\079\000\255\255\079\000\255\255\084\000\ - \084\000\085\000\255\255\085\000\085\000\085\000\085\000\085\000\ - \255\255\255\255\255\255\255\255\255\255\086\000\255\255\255\255\ - \086\000\086\000\086\000\255\255\255\255\086\000\086\000\086\000\ - \255\255\086\000\086\000\086\000\255\255\255\255\084\000\084\000\ - \255\255\255\255\255\255\085\000\085\000\085\000\086\000\255\255\ - \086\000\086\000\086\000\086\000\086\000\255\255\255\255\255\255\ - \255\255\255\255\087\000\255\255\255\255\087\000\087\000\087\000\ - \255\255\255\255\087\000\087\000\087\000\255\255\087\000\087\000\ - \087\000\255\255\255\255\085\000\085\000\085\000\255\255\255\255\ - \086\000\086\000\086\000\087\000\255\255\087\000\087\000\087\000\ - \087\000\087\000\255\255\255\255\255\255\255\255\255\255\088\000\ - \255\255\255\255\088\000\088\000\088\000\255\255\255\255\088\000\ - \088\000\088\000\255\255\088\000\088\000\088\000\255\255\255\255\ - \086\000\086\000\086\000\255\255\255\255\087\000\087\000\087\000\ - \088\000\255\255\088\000\088\000\088\000\088\000\088\000\255\255\ - \255\255\255\255\255\255\255\255\089\000\255\255\255\255\089\000\ - \089\000\089\000\255\255\255\255\089\000\089\000\089\000\255\255\ - \089\000\089\000\089\000\255\255\255\255\087\000\087\000\087\000\ - \255\255\255\255\088\000\088\000\088\000\089\000\255\255\089\000\ - \089\000\089\000\089\000\089\000\255\255\255\255\255\255\255\255\ - \255\255\090\000\255\255\255\255\090\000\090\000\090\000\255\255\ - \255\255\255\255\090\000\090\000\255\255\090\000\090\000\090\000\ - \255\255\255\255\088\000\088\000\088\000\255\255\255\255\089\000\ - \089\000\089\000\090\000\255\255\090\000\090\000\090\000\090\000\ - \090\000\255\255\255\255\255\255\091\000\255\255\255\255\091\000\ - \091\000\091\000\255\255\255\255\091\000\091\000\091\000\255\255\ - \091\000\091\000\091\000\255\255\255\255\255\255\255\255\089\000\ - \089\000\089\000\255\255\255\255\090\000\091\000\090\000\091\000\ - \091\000\091\000\091\000\091\000\255\255\255\255\255\255\255\255\ - \255\255\092\000\255\255\255\255\092\000\092\000\092\000\255\255\ - \255\255\092\000\092\000\092\000\255\255\092\000\092\000\092\000\ - \255\255\255\255\255\255\255\255\090\000\255\255\090\000\091\000\ - \091\000\091\000\092\000\255\255\092\000\092\000\092\000\092\000\ - \092\000\255\255\255\255\255\255\255\255\255\255\093\000\255\255\ - \255\255\093\000\093\000\093\000\255\255\255\255\093\000\093\000\ - \093\000\255\255\093\000\093\000\093\000\255\255\255\255\091\000\ - \091\000\091\000\255\255\255\255\092\000\092\000\092\000\093\000\ - \255\255\093\000\093\000\093\000\093\000\093\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\094\000\ - \094\000\255\255\255\255\094\000\255\255\255\255\255\255\255\255\ - \094\000\094\000\255\255\255\255\092\000\092\000\092\000\255\255\ - \255\255\093\000\093\000\093\000\094\000\255\255\094\000\094\000\ - \094\000\255\255\094\000\255\255\255\255\255\255\255\255\255\255\ - \095\000\255\255\255\255\095\000\095\000\095\000\255\255\255\255\ - \095\000\095\000\095\000\255\255\095\000\095\000\095\000\255\255\ - \255\255\093\000\093\000\093\000\255\255\255\255\255\255\094\000\ - \094\000\095\000\255\255\095\000\095\000\095\000\095\000\095\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\096\000\096\000\255\255\255\255\096\000\255\255\255\255\ - \255\255\255\255\096\000\096\000\255\255\255\255\094\000\094\000\ - \255\255\255\255\255\255\095\000\095\000\095\000\096\000\255\255\ - \096\000\096\000\096\000\255\255\096\000\255\255\255\255\255\255\ - \255\255\255\255\097\000\255\255\255\255\097\000\097\000\097\000\ - \255\255\255\255\097\000\097\000\097\000\255\255\097\000\097\000\ - \097\000\255\255\255\255\095\000\095\000\095\000\255\255\255\255\ - \255\255\096\000\096\000\097\000\255\255\097\000\097\000\097\000\ - \097\000\097\000\255\255\255\255\255\255\255\255\255\255\098\000\ - \255\255\255\255\098\000\098\000\098\000\255\255\255\255\098\000\ - \098\000\098\000\255\255\098\000\098\000\098\000\255\255\255\255\ - \096\000\096\000\255\255\255\255\255\255\097\000\097\000\097\000\ - \098\000\255\255\098\000\098\000\098\000\098\000\098\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \109\000\109\000\255\255\255\255\109\000\255\255\255\255\110\000\ - \110\000\109\000\109\000\110\000\255\255\097\000\097\000\097\000\ - \110\000\110\000\098\000\098\000\098\000\109\000\255\255\109\000\ - \109\000\109\000\255\255\109\000\110\000\255\255\110\000\110\000\ - \110\000\255\255\110\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\111\000\111\000\255\255\255\255\ - \111\000\255\255\098\000\098\000\098\000\111\000\111\000\255\255\ - \109\000\109\000\255\255\255\255\255\255\255\255\255\255\110\000\ - \110\000\111\000\255\255\111\000\111\000\111\000\255\255\111\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\112\000\112\000\255\255\255\255\112\000\255\255\109\000\ - \109\000\255\255\112\000\112\000\255\255\255\255\110\000\110\000\ - \255\255\255\255\255\255\255\255\111\000\111\000\112\000\255\255\ - \112\000\112\000\112\000\255\255\112\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\113\000\113\000\ - \255\255\255\255\113\000\255\255\255\255\114\000\114\000\113\000\ - \113\000\114\000\255\255\111\000\111\000\255\255\114\000\114\000\ - \255\255\112\000\112\000\113\000\255\255\113\000\113\000\113\000\ - \255\255\113\000\114\000\255\255\114\000\114\000\114\000\255\255\ - \114\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\115\000\115\000\255\255\255\255\255\255\255\255\ - \112\000\112\000\255\255\115\000\115\000\255\255\113\000\113\000\ - \255\255\255\255\255\255\255\255\255\255\114\000\114\000\115\000\ - \255\255\115\000\115\000\115\000\255\255\115\000\255\255\255\255\ - \255\255\116\000\116\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\116\000\116\000\255\255\113\000\113\000\255\255\ - \255\255\255\255\255\255\255\255\114\000\114\000\116\000\255\255\ - \116\000\116\000\116\000\115\000\116\000\117\000\117\000\255\255\ - \117\000\255\255\255\255\255\255\255\255\255\255\117\000\117\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\117\000\255\255\117\000\117\000\117\000\255\255\ - \117\000\115\000\116\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\118\000\118\000\255\255\255\255\255\255\119\000\ - \119\000\255\255\119\000\118\000\118\000\255\255\255\255\255\255\ - \119\000\119\000\255\255\117\000\255\255\255\255\117\000\118\000\ - \116\000\118\000\118\000\118\000\119\000\118\000\119\000\119\000\ - \119\000\255\255\119\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\117\000\117\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\118\000\255\255\119\000\255\255\255\255\ - \119\000\255\255\255\255\255\255\255\255\255\255\120\000\255\255\ - \255\255\120\000\120\000\120\000\255\255\255\255\120\000\120\000\ - \120\000\255\255\120\000\120\000\120\000\255\255\255\255\255\255\ - \255\255\118\000\255\255\255\255\255\255\119\000\119\000\120\000\ - \255\255\120\000\120\000\120\000\120\000\120\000\255\255\255\255\ - \255\255\255\255\255\255\121\000\255\255\255\255\121\000\121\000\ - \121\000\255\255\255\255\121\000\121\000\121\000\255\255\121\000\ - \121\000\121\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\120\000\120\000\120\000\121\000\255\255\121\000\121\000\ - \121\000\121\000\121\000\255\255\255\255\255\255\255\255\255\255\ - \122\000\255\255\255\255\122\000\122\000\122\000\255\255\255\255\ - \122\000\122\000\122\000\255\255\122\000\122\000\122\000\255\255\ - \255\255\120\000\120\000\120\000\255\255\255\255\121\000\121\000\ - \121\000\122\000\255\255\122\000\122\000\122\000\122\000\122\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\123\000\ - \255\255\255\255\123\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\121\000\121\000\ - \121\000\255\255\255\255\122\000\122\000\122\000\255\255\123\000\ - \255\255\255\255\255\255\255\255\123\000\123\000\255\255\123\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\123\000\255\255\122\000\122\000\122\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \255\255\255\255\255\255\255\255\123\000\255\255\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \156\000\156\000\156\000\156\000\156\000\156\000\156\000\156\000\ - \156\000\156\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\156\000\156\000\156\000\156\000\156\000\156\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\156\000\156\000\156\000\156\000\156\000\156\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\255\255\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\255\255\123\000\123\000\123\000\ - \123\000\123\000\123\000\123\000\123\000\123\000\130\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\255\255\255\255\255\255\255\255\130\000\255\255\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\255\255\255\255\255\255\255\255\137\000\255\255\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\255\255\255\255\255\255\255\255\255\255\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\255\255\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\255\255\130\000\ - \130\000\130\000\130\000\130\000\130\000\130\000\130\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\255\255\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\255\255\137\000\ - \137\000\137\000\137\000\137\000\137\000\137\000\137\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\255\255\255\255\255\255\255\255\138\000\255\255\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\167\000\167\000\167\000\167\000\167\000\167\000\167\000\ - \167\000\167\000\167\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\167\000\167\000\167\000\167\000\167\000\167\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\167\000\167\000\167\000\167\000\167\000\167\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\255\255\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\139\000\138\000\138\000\ - \138\000\138\000\138\000\138\000\138\000\138\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \255\255\255\255\139\000\255\255\255\255\255\255\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\255\255\255\255\255\255\255\255\139\000\255\255\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\174\000\174\000\174\000\174\000\174\000\174\000\174\000\ - \174\000\174\000\174\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\174\000\174\000\174\000\174\000\174\000\174\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\174\000\174\000\174\000\174\000\174\000\174\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\255\255\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\140\000\139\000\139\000\ - \139\000\139\000\139\000\139\000\139\000\139\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \255\255\255\255\140\000\255\255\255\255\255\255\255\255\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\255\255\255\255\255\255\255\255\140\000\255\255\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\255\255\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\255\255\140\000\140\000\ - \140\000\140\000\140\000\140\000\140\000\140\000\141\000\255\255\ - \141\000\255\255\255\255\164\000\255\255\141\000\164\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\141\000\141\000\ - \141\000\141\000\141\000\141\000\141\000\141\000\141\000\141\000\ - \255\255\164\000\255\255\164\000\255\255\255\255\255\255\255\255\ - \164\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\164\000\164\000\164\000\164\000\164\000\164\000\164\000\ - \164\000\164\000\164\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\141\000\255\255\255\255\255\255\255\255\255\255\ - \141\000\176\000\255\255\255\255\176\000\176\000\176\000\255\255\ - \255\255\255\255\176\000\176\000\141\000\176\000\176\000\176\000\ - \141\000\255\255\141\000\255\255\255\255\164\000\141\000\255\255\ - \255\255\255\255\176\000\164\000\176\000\176\000\176\000\176\000\ - \176\000\255\255\255\255\255\255\255\255\255\255\255\255\164\000\ - \255\255\255\255\255\255\164\000\255\255\164\000\255\255\255\255\ - \255\255\164\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\176\000\255\255\176\000\255\255\ - \255\255\255\255\255\255\255\255\177\000\255\255\255\255\177\000\ - \177\000\177\000\255\255\255\255\255\255\177\000\177\000\255\255\ - \177\000\177\000\177\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\176\000\177\000\176\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\255\255\177\000\ - \255\255\177\000\177\000\255\255\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\255\255\177\000\ - \255\255\177\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\164\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\255\255\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\255\255\177\000\177\000\177\000\177\000\177\000\ - \177\000\177\000\177\000\178\000\255\255\255\255\178\000\178\000\ - \178\000\255\255\255\255\255\255\178\000\178\000\255\255\178\000\ - \178\000\178\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\178\000\255\255\178\000\178\000\ - \178\000\178\000\178\000\255\255\255\255\255\255\255\255\179\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\255\255\255\255\179\000\255\255\178\000\255\255\ - \178\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\255\255\255\255\255\255\178\000\179\000\ - \178\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\255\255\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\255\255\ - \179\000\179\000\179\000\179\000\179\000\179\000\179\000\179\000\ - \181\000\255\255\255\255\181\000\181\000\181\000\255\255\255\255\ - \255\255\181\000\181\000\255\255\181\000\181\000\181\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\181\000\255\255\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\255\255\181\000\255\255\181\000\181\000\255\255\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\255\255\181\000\255\255\181\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\255\255\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\255\255\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\182\000\ - \255\255\255\255\182\000\182\000\182\000\255\255\255\255\255\255\ - \182\000\182\000\255\255\182\000\182\000\182\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \182\000\255\255\182\000\182\000\182\000\182\000\182\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\183\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\255\255\182\000\183\000\182\000\255\255\255\255\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\182\000\255\255\182\000\255\255\183\000\255\255\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\255\255\255\255\255\255\255\255\184\000\255\255\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\255\255\255\255\255\255\255\255\255\255\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\255\255\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\255\255\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\255\255\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\186\000\184\000\ - \184\000\184\000\184\000\184\000\184\000\184\000\184\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\255\255\255\255\186\000\255\255\255\255\255\255\255\255\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\255\255\255\255\255\255\255\255\186\000\255\255\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\255\255\255\255\255\255\255\255\196\000\255\255\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\255\255\255\255\255\255\255\255\255\255\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\255\255\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\255\255\186\000\ - \186\000\186\000\186\000\186\000\186\000\186\000\186\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\255\255\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\255\255\196\000\ - \196\000\196\000\196\000\196\000\196\000\196\000\196\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\255\255\255\255\255\255\255\255\197\000\255\255\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\255\255\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\198\000\197\000\197\000\ - \197\000\197\000\197\000\197\000\197\000\197\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \255\255\255\255\198\000\255\255\255\255\255\255\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\255\255\255\255\255\255\255\255\198\000\255\255\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\255\255\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\199\000\198\000\198\000\ - \198\000\198\000\198\000\198\000\198\000\198\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \255\255\255\255\199\000\255\255\255\255\255\255\255\255\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\255\255\255\255\255\255\255\255\199\000\255\255\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\255\255\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\255\255\199\000\199\000\ - \199\000\199\000\199\000\199\000\199\000\199\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\255\255\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\201\000\201\000\201\000\201\000\255\255\201\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\201\000\201\000\ - \201\000\201\000\201\000\201\000\201\000\201\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\201\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\201\000\205\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\201\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\255\255\255\255\255\255\255\255\205\000\255\255\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\255\255\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\255\255\205\000\ - \205\000\205\000\205\000\205\000\205\000\205\000\205\000\206\000\ - \255\255\255\255\255\255\255\255\255\255\206\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\206\000\255\255\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\255\255\255\255\255\255\255\255\255\255\255\255\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\255\255\255\255\255\255\255\255\206\000\255\255\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\255\255\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\209\000\206\000\206\000\ - \206\000\206\000\206\000\206\000\206\000\206\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\255\255\255\255\255\255\255\255\255\255\255\255\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\255\255\255\255\255\255\255\255\209\000\255\255\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\255\255\255\255\255\255\255\255\255\255\255\255\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\255\255\255\255\255\255\255\255\218\000\255\255\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\255\255\255\255\255\255\255\255\255\255\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\255\255\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\255\255\209\000\209\000\ - \209\000\209\000\209\000\209\000\209\000\209\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\255\255\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\255\255\218\000\218\000\ - \218\000\218\000\218\000\218\000\218\000\218\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \255\255\255\255\255\255\255\255\219\000\255\255\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\255\255\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\220\000\219\000\219\000\219\000\ - \219\000\219\000\219\000\219\000\219\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\255\255\ - \255\255\220\000\255\255\255\255\255\255\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \255\255\255\255\255\255\255\255\220\000\255\255\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\255\255\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\221\000\220\000\220\000\220\000\ - \220\000\220\000\220\000\220\000\220\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\255\255\ - \255\255\221\000\255\255\255\255\255\255\255\255\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \255\255\255\255\255\255\255\255\221\000\255\255\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\255\255\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\255\255\221\000\221\000\221\000\ - \221\000\221\000\221\000\221\000\221\000\255\255"; - Lexing.lex_base_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\027\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\066\000\101\000\136\000\171\000\ - \206\000\000\000\000\000\000\000\000\000\241\000\020\001\055\001\ - \000\000\000\000\018\000\090\001\125\001\160\001\195\001\230\001\ - \000\000\021\000\026\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\247\001\040\002\000\000\034\000\000\000\ - \000\000\003\000\000\000\000\000\049\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\ - \000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\036\002\000\000\244\002\ - \000\000\000\000\000\000\061\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_backtrk_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\034\000\000\000\000\000\ - \000\000\000\000\000\000\049\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\061\000\061\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_default_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \041\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000"; - Lexing.lex_trans_code = - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\001\000\000\000\058\000\058\000\000\000\058\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \001\000\000\000\000\000\001\000\007\000\044\000\000\000\007\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\000\000\007\000\012\000\000\000\000\000\012\000\ - \012\000\012\000\000\000\000\000\000\000\000\000\012\000\000\000\ - \012\000\012\000\012\000\007\000\000\000\000\000\007\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\ - \012\000\012\000\012\000\012\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\007\000\015\000\000\000\000\000\015\000\015\000\ - \015\000\000\000\000\000\000\000\015\000\015\000\000\000\015\000\ - \015\000\015\000\000\000\000\000\000\000\000\000\000\000\012\000\ - \000\000\012\000\000\000\000\000\015\000\000\000\015\000\015\000\ - \015\000\015\000\015\000\000\000\000\000\000\000\012\000\000\000\ - \000\000\012\000\012\000\012\000\000\000\000\000\000\000\012\000\ - \012\000\000\000\012\000\012\000\012\000\000\000\000\000\012\000\ - \000\000\012\000\000\000\000\000\000\000\000\000\015\000\012\000\ - \015\000\012\000\012\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\012\000\000\000\000\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\012\000\012\000\000\000\012\000\012\000\012\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\015\000\000\000\ - \015\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\000\000\000\000\000\000\012\000\000\000\000\000\012\000\ - \012\000\012\000\000\000\000\000\000\000\012\000\012\000\000\000\ - \012\000\012\000\012\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\012\000\000\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\000\000\000\000\000\000\012\000\ - \000\000\000\000\012\000\012\000\012\000\000\000\000\000\000\000\ - \012\000\012\000\000\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\012\000\000\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\012\000\000\000\000\000\012\000\012\000\012\000\ - \000\000\000\000\000\000\012\000\012\000\000\000\012\000\012\000\ - \012\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\ - \000\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\000\000\000\000\000\000\012\000\000\000\000\000\ - \012\000\012\000\012\000\000\000\000\000\000\000\012\000\012\000\ - \000\000\012\000\012\000\012\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\012\000\000\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\000\000\000\000\000\000\ - \012\000\000\000\000\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\012\000\012\000\000\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\012\000\000\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \000\000\000\000\000\000\012\000\000\000\000\000\012\000\012\000\ - \012\000\000\000\000\000\000\000\012\000\012\000\000\000\012\000\ - \012\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \012\000\000\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\000\000\000\000\000\000\012\000\000\000\ - \000\000\012\000\012\000\012\000\000\000\000\000\000\000\012\000\ - \012\000\000\000\012\000\012\000\012\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\012\000\000\000\012\000\012\000\012\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\000\000\000\000\ - \000\000\012\000\000\000\000\000\012\000\012\000\012\000\000\000\ - \000\000\000\000\012\000\012\000\000\000\012\000\012\000\012\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\ - \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ - \012\000\000\000\000\000\000\000\015\000\000\000\000\000\015\000\ - \015\000\015\000\000\000\000\000\000\000\015\000\015\000\000\000\ - \015\000\015\000\015\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\012\000\000\000\012\000\012\000\015\000\012\000\015\000\ - \015\000\015\000\015\000\015\000\000\000\000\000\000\000\015\000\ - \000\000\000\000\015\000\015\000\015\000\000\000\000\000\000\000\ - \015\000\015\000\000\000\015\000\015\000\015\000\000\000\000\000\ - \000\000\029\000\000\000\000\000\012\000\000\000\012\000\015\000\ - \015\000\015\000\015\000\015\000\015\000\015\000\015\000\004\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\ - \000\000\015\000\015\000\000\000\015\000\000\000\000\000\000\000\ - \001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \004\000\004\000\004\000\004\000\004\000\004\000\004\000\004\000\ - \004\000\004\000\015\000\000\000\015\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\000\000\ - \000\000\000\000\000\000\058\000\000\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\000\000\ - \000\000\000\000\000\000\058\000\000\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ - \000\000\000\000\000\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\000\000\058\000\058\000\058\000\058\000\ - \058\000\058\000\058\000\058\000\000\000"; - Lexing.lex_check_code = - "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\016\000\104\000\164\000\170\000\104\000\164\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \016\000\255\255\104\000\000\000\019\000\105\000\255\255\019\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\ - \016\000\016\000\255\255\019\000\019\000\255\255\255\255\019\000\ - \019\000\019\000\255\255\255\255\255\255\255\255\019\000\255\255\ - \019\000\019\000\019\000\060\000\255\255\255\255\060\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\019\000\255\255\019\000\ - \019\000\019\000\019\000\019\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\060\000\060\000\255\255\255\255\060\000\060\000\ - \060\000\255\255\255\255\255\255\060\000\060\000\255\255\060\000\ - \060\000\060\000\255\255\255\255\255\255\255\255\255\255\019\000\ - \255\255\019\000\255\255\255\255\060\000\255\255\060\000\060\000\ - \060\000\060\000\060\000\255\255\255\255\255\255\061\000\255\255\ - \255\255\061\000\061\000\061\000\255\255\255\255\255\255\061\000\ - \061\000\255\255\061\000\061\000\061\000\255\255\255\255\019\000\ - \255\255\019\000\255\255\255\255\255\255\255\255\060\000\061\000\ - \060\000\061\000\061\000\061\000\061\000\061\000\255\255\255\255\ - \255\255\062\000\255\255\255\255\062\000\062\000\062\000\255\255\ - \255\255\255\255\062\000\062\000\255\255\062\000\062\000\062\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\060\000\255\255\ - \060\000\061\000\062\000\061\000\062\000\062\000\062\000\062\000\ - \062\000\255\255\255\255\255\255\063\000\255\255\255\255\063\000\ - \063\000\063\000\255\255\255\255\255\255\063\000\063\000\255\255\ - \063\000\063\000\063\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\061\000\255\255\061\000\062\000\063\000\062\000\063\000\ - \063\000\063\000\063\000\063\000\255\255\255\255\255\255\064\000\ - \255\255\255\255\064\000\064\000\064\000\255\255\255\255\255\255\ - \064\000\064\000\255\255\064\000\064\000\064\000\255\255\255\255\ - \104\000\255\255\255\255\255\255\062\000\255\255\062\000\063\000\ - \064\000\063\000\064\000\064\000\064\000\064\000\064\000\255\255\ - \255\255\255\255\069\000\255\255\255\255\069\000\069\000\069\000\ - \255\255\255\255\255\255\069\000\069\000\255\255\069\000\069\000\ - \069\000\255\255\255\255\255\255\255\255\255\255\255\255\063\000\ - \255\255\063\000\064\000\069\000\064\000\069\000\069\000\069\000\ - \069\000\069\000\255\255\255\255\255\255\070\000\255\255\255\255\ - \070\000\070\000\070\000\255\255\255\255\255\255\070\000\070\000\ - \255\255\070\000\070\000\070\000\255\255\255\255\255\255\255\255\ - \255\255\255\255\064\000\255\255\064\000\069\000\070\000\069\000\ - \070\000\070\000\070\000\070\000\070\000\255\255\255\255\255\255\ - \071\000\255\255\255\255\071\000\071\000\071\000\255\255\255\255\ - \255\255\071\000\071\000\255\255\071\000\071\000\071\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\069\000\255\255\069\000\ - \070\000\071\000\070\000\071\000\071\000\071\000\071\000\071\000\ - \255\255\255\255\255\255\075\000\255\255\255\255\075\000\075\000\ - \075\000\255\255\255\255\255\255\075\000\075\000\255\255\075\000\ - \075\000\075\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \070\000\255\255\070\000\071\000\075\000\071\000\075\000\075\000\ - \075\000\075\000\075\000\255\255\255\255\255\255\076\000\255\255\ - \255\255\076\000\076\000\076\000\255\255\255\255\255\255\076\000\ - \076\000\255\255\076\000\076\000\076\000\255\255\255\255\255\255\ - \255\255\255\255\255\255\071\000\255\255\071\000\075\000\076\000\ - \075\000\076\000\076\000\076\000\076\000\076\000\255\255\255\255\ - \255\255\077\000\255\255\255\255\077\000\077\000\077\000\255\255\ - \255\255\255\255\077\000\077\000\255\255\077\000\077\000\077\000\ - \255\255\255\255\255\255\255\255\255\255\255\255\075\000\255\255\ - \075\000\076\000\077\000\076\000\077\000\077\000\077\000\077\000\ - \077\000\255\255\255\255\255\255\078\000\255\255\255\255\078\000\ - \078\000\078\000\255\255\255\255\255\255\078\000\078\000\255\255\ - \078\000\078\000\078\000\255\255\255\255\255\255\255\255\255\255\ - \255\255\076\000\255\255\076\000\077\000\078\000\077\000\078\000\ - \078\000\078\000\078\000\078\000\255\255\255\255\255\255\079\000\ - \255\255\255\255\079\000\079\000\079\000\255\255\255\255\255\255\ - \079\000\079\000\255\255\079\000\079\000\079\000\255\255\255\255\ - \255\255\099\000\255\255\255\255\077\000\255\255\077\000\078\000\ - \079\000\078\000\079\000\079\000\079\000\079\000\079\000\099\000\ - \099\000\099\000\099\000\099\000\099\000\099\000\099\000\099\000\ - \099\000\100\000\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\078\000\ - \255\255\078\000\079\000\255\255\079\000\255\255\255\255\255\255\ - \100\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \100\000\100\000\100\000\100\000\100\000\100\000\100\000\100\000\ - \100\000\100\000\079\000\255\255\079\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\255\255\ - \255\255\255\255\255\255\181\000\255\255\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\255\255\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\183\000\181\000\181\000\181\000\181\000\ - \181\000\181\000\181\000\181\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\255\255\ - \255\255\255\255\255\255\183\000\255\255\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ - \255\255\255\255\255\255\255\255\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\255\255\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\255\255\183\000\183\000\183\000\183\000\ - \183\000\183\000\183\000\183\000\255\255"; - Lexing.lex_code = - "\255\004\255\255\009\255\255\006\255\005\255\255\007\255\255\008\ - \255\255\000\007\255\000\006\001\008\255\000\005\255\011\255\010\ - \255\255\003\255\000\004\001\009\255\011\255\255\010\255\011\255\ - \255\000\004\001\009\003\010\002\011\255\001\255\255\000\001\255\ - "; - } - - let rec token c lexbuf = - (lexbuf.Lexing.lex_mem <- Array.create 12 (-1); - __ocaml_lex_token_rec c lexbuf 0) - and __ocaml_lex_token_rec c lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state - lexbuf - with - | 0 -> (update_loc c None 1 false 0; NEWLINE) - | 1 -> - let x = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in BLANKS x - | 2 -> - let x = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in LABEL x - | 3 -> - let x = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in OPTLABEL x - | 4 -> - let x = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in LIDENT x - | 5 -> - let x = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in UIDENT x - | 6 -> - let i = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in - (try INT ((cvt_int_literal i), i) - with - | Failure _ -> - err (Literal_overflow "int") (Loc.of_lexbuf lexbuf)) - | 7 -> - let f = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in - (try FLOAT ((float_of_string f), f) - with - | Failure _ -> - err (Literal_overflow "float") - (Loc.of_lexbuf lexbuf)) - | 8 -> - let i = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - (try INT32 ((cvt_int32_literal i), i) - with - | Failure _ -> - err (Literal_overflow "int32") - (Loc.of_lexbuf lexbuf)) - | 9 -> - let i = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - (try INT64 ((cvt_int64_literal i), i) - with - | Failure _ -> - err (Literal_overflow "int64") - (Loc.of_lexbuf lexbuf)) - | 10 -> - let i = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - (try NATIVEINT ((cvt_nativeint_literal i), i) - with - | Failure _ -> - err (Literal_overflow "nativeint") - (Loc.of_lexbuf lexbuf)) - | 11 -> - (with_curr_loc string c; - let s = buff_contents c - in STRING ((TokenEval.string s), s)) - | 12 -> - let x = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - (update_loc c None 1 false 1; - CHAR ((TokenEval.char x), x)) - | 13 -> - let x = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in CHAR ((TokenEval.char x), x) - | 14 -> - let c = - Lexing.sub_lexeme_char lexbuf - (lexbuf.Lexing.lex_start_pos + 2) - in - err (Illegal_escape (String.make 1 c)) - (Loc.of_lexbuf lexbuf) - | 15 -> - (store c; COMMENT (parse_nested comment (in_comment c))) - | 16 -> - (warn Comment_start (Loc.of_lexbuf lexbuf); - parse comment (in_comment c); - COMMENT (buff_contents c)) - | 17 -> - (warn Comment_not_end (Loc.of_lexbuf lexbuf); - move_start_p (-1) c; - SYMBOL "*") - | 18 -> - let beginning = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 2) - lexbuf.Lexing.lex_curr_pos - in - if quotations c - then - (move_start_p (- (String.length beginning)); - mk_quotation quotation c "" "" 2) - else parse (symbolchar_star ("<<" ^ beginning)) c - | 19 -> - if quotations c - then - QUOTATION - { - q_name = ""; - q_loc = ""; - q_shift = 2; - q_contents = ""; - } - else parse (symbolchar_star "<<>>") c - | 20 -> - if quotations c - then with_curr_loc maybe_quotation_at c - else parse (symbolchar_star "<@") c - | 21 -> - if quotations c - then with_curr_loc maybe_quotation_colon c - else parse (symbolchar_star "<:") c - | 22 -> - let num = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) - lexbuf.Lexing.lex_mem.(1) - and name = - Lexing.sub_lexeme_opt lexbuf lexbuf.Lexing.lex_mem.(3) - lexbuf.Lexing.lex_mem.(2) in - let inum = int_of_string num - in - (update_loc c name inum true 0; - LINE_DIRECTIVE (inum, name)) - | 23 -> - let op = - Lexing.sub_lexeme_char lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - in ESCAPED_IDENT (String.make 1 op) - | 24 -> - let op = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in ESCAPED_IDENT op - | 25 -> - let op = - Lexing.sub_lexeme lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - lexbuf.Lexing.lex_mem.(0) - in ESCAPED_IDENT op - | 26 -> - let op = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in ESCAPED_IDENT op - | 27 -> - let op = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) - lexbuf.Lexing.lex_mem.(1) - in ESCAPED_IDENT op - | 28 -> - let x = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in SYMBOL x - | 29 -> - if antiquots c - then with_curr_loc dollar (shift 1 c) - else parse (symbolchar_star "$") c - | 30 -> - let x = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in SYMBOL x - | 31 -> - let pos = lexbuf.lex_curr_p - in - (lexbuf.lex_curr_p <- - { - (pos) - with - pos_bol = pos.pos_bol + 1; - pos_cnum = pos.pos_cnum + 1; - }; - EOI) - | 32 -> - let c = - Lexing.sub_lexeme_char lexbuf lexbuf.Lexing.lex_start_pos - in err (Illegal_character c) (Loc.of_lexbuf lexbuf) - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_token_rec c lexbuf __ocaml_lex_state) - and comment c lexbuf = __ocaml_lex_comment_rec c lexbuf 123 - and __ocaml_lex_comment_rec c lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> (store c; with_curr_loc comment c; parse comment c) - | 1 -> store c - | 2 -> - (store c; - if quotations c then with_curr_loc quotation c else (); - parse comment c) - | 3 -> store_parse comment c - | 4 -> - (store c; - (try with_curr_loc string c - with - | Loc.Exc_located (_, (Error.E Unterminated_string)) -> - err Unterminated_string_in_comment (loc c)); - Buffer.add_char c.buffer '"'; - parse comment c) - | 5 -> store_parse comment c - | 6 -> store_parse comment c - | 7 -> (update_loc c None 1 false 1; store_parse comment c) - | 8 -> store_parse comment c - | 9 -> store_parse comment c - | 10 -> store_parse comment c - | 11 -> store_parse comment c - | 12 -> err Unterminated_comment (loc c) - | 13 -> (update_loc c None 1 false 0; store_parse comment c) - | 14 -> store_parse comment c - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_comment_rec c lexbuf __ocaml_lex_state) - and string c lexbuf = - (lexbuf.Lexing.lex_mem <- Array.create 2 (-1); - __ocaml_lex_string_rec c lexbuf 159) - and __ocaml_lex_string_rec c lexbuf __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state - lexbuf - with - | 0 -> set_start_p c - | 1 -> - let space = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_mem.(0) - lexbuf.Lexing.lex_curr_pos - in - (update_loc c None 1 false (String.length space); - store_parse string c) - | 2 -> store_parse string c - | 3 -> store_parse string c - | 4 -> store_parse string c - | 5 -> - let x = - Lexing.sub_lexeme_char lexbuf - (lexbuf.Lexing.lex_start_pos + 1) - in - if is_in_comment c - then store_parse string c - else - (warn (Illegal_escape (String.make 1 x)) - (Loc.of_lexbuf lexbuf); - store_parse string c) - | 6 -> (update_loc c None 1 false 0; store_parse string c) - | 7 -> err Unterminated_string (loc c) - | 8 -> store_parse string c - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_string_rec c lexbuf __ocaml_lex_state) - and symbolchar_star beginning c lexbuf = - __ocaml_lex_symbolchar_star_rec beginning c lexbuf 176 - and - __ocaml_lex_symbolchar_star_rec beginning c lexbuf - __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> - let tok = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in - (move_start_p (- (String.length beginning)) c; - SYMBOL (beginning ^ tok)) - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_symbolchar_star_rec beginning c lexbuf - __ocaml_lex_state) - and maybe_quotation_at c lexbuf = - __ocaml_lex_maybe_quotation_at_rec c lexbuf 177 - and - __ocaml_lex_maybe_quotation_at_rec c lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> - let loc = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - mk_quotation quotation c "" loc (1 + (String.length loc)) - | 1 -> - let tok = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in SYMBOL ("<@" ^ tok) - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_maybe_quotation_at_rec c lexbuf - __ocaml_lex_state) - and maybe_quotation_colon c lexbuf = - (lexbuf.Lexing.lex_mem <- Array.create 2 (-1); - __ocaml_lex_maybe_quotation_colon_rec c lexbuf 181) - and - __ocaml_lex_maybe_quotation_colon_rec c lexbuf - __ocaml_lex_state = - match Lexing.new_engine __ocaml_lex_tables __ocaml_lex_state - lexbuf - with - | 0 -> - let name = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - mk_quotation quotation c name "" - (1 + (String.length name)) - | 1 -> - let name = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_mem.(0) - and loc = - Lexing.sub_lexeme lexbuf (lexbuf.Lexing.lex_mem.(0) + 1) - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - mk_quotation quotation c name loc - ((2 + (String.length loc)) + (String.length name)) - | 2 -> - let tok = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - lexbuf.Lexing.lex_curr_pos - in SYMBOL ("<:" ^ tok) - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_maybe_quotation_colon_rec c lexbuf - __ocaml_lex_state) - and quotation c lexbuf = __ocaml_lex_quotation_rec c lexbuf 188 - and __ocaml_lex_quotation_rec c lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> (store c; with_curr_loc quotation c; parse quotation c) - | 1 -> store c - | 2 -> err Unterminated_quotation (loc c) - | 3 -> (update_loc c None 1 false 0; store_parse quotation c) - | 4 -> store_parse quotation c - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_quotation_rec c lexbuf __ocaml_lex_state) - and dollar c lexbuf = __ocaml_lex_dollar_rec c lexbuf 201 - and __ocaml_lex_dollar_rec c lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> (set_start_p c; ANTIQUOT ("", "")) - | 1 -> - let name = - Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos - (lexbuf.Lexing.lex_curr_pos + (-1)) - in - with_curr_loc (antiquot name) - (shift (1 + (String.length name)) c) - | 2 -> store_parse (antiquot "") c - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_dollar_rec c lexbuf __ocaml_lex_state) - and antiquot name c lexbuf = - __ocaml_lex_antiquot_rec name c lexbuf 210 - and __ocaml_lex_antiquot_rec name c lexbuf __ocaml_lex_state = - match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf - with - | 0 -> (set_start_p c; ANTIQUOT (name, (buff_contents c))) - | 1 -> err Unterminated_antiquot (loc c) - | 2 -> - (update_loc c None 1 false 0; - store_parse (antiquot name) c) - | 3 -> - (store c; - with_curr_loc quotation c; - parse (antiquot name) c) - | 4 -> store_parse (antiquot name) c - | __ocaml_lex_state -> - (lexbuf.Lexing.refill_buff lexbuf; - __ocaml_lex_antiquot_rec name c lexbuf __ocaml_lex_state) - - let lexing_store s buff max = - let rec self n s = - if n >= max - then n - else - (match Stream.peek s with - | Some x -> (Stream.junk s; buff.[n] <- x; succ n) - | _ -> n) - in self 0 s - - let from_context c = - let next _ = - let tok = with_curr_loc token c in - let loc = Loc.of_lexbuf c.lexbuf in Some (tok, loc) - in Stream.from next - - let from_lexbuf ?(quotations = true) lb = - let c = - { - (default_context lb) - with - loc = Loc.of_lexbuf lb; - antiquots = !Camlp4_config.antiquotations; - quotations = quotations; - } - in from_context c - - let setup_loc lb loc = - let start_pos = Loc.start_pos loc - in - (lb.lex_abs_pos <- start_pos.pos_cnum; - lb.lex_curr_p <- start_pos) - - let from_string ?quotations loc str = - let lb = Lexing.from_string str - in (setup_loc lb loc; from_lexbuf ?quotations lb) - - let from_stream ?quotations loc strm = - let lb = Lexing.from_function (lexing_store strm) - in (setup_loc lb loc; from_lexbuf ?quotations lb) - - let mk () loc strm = - from_stream ~quotations: !Camlp4_config.quotations loc strm - - end - - end - - module Camlp4Ast = - struct - module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = - struct - module Loc = Loc - - module Ast = - struct - include Sig.MakeCamlp4Ast(Loc) - - let safe_string_escaped s = - if - ((String.length s) > 2) && - ((s.[0] = '\\') && (s.[1] = '$')) - then s - else String.escaped s - - end - - include Ast - - external loc_of_ctyp : ctyp -> Loc.t = "%field0" - - external loc_of_patt : patt -> Loc.t = "%field0" - - external loc_of_expr : expr -> Loc.t = "%field0" - - external loc_of_module_type : module_type -> Loc.t = "%field0" - - external loc_of_module_expr : module_expr -> Loc.t = "%field0" - - external loc_of_sig_item : sig_item -> Loc.t = "%field0" - - external loc_of_str_item : str_item -> Loc.t = "%field0" - - external loc_of_class_type : class_type -> Loc.t = "%field0" - - external loc_of_class_sig_item : class_sig_item -> Loc.t = - "%field0" - - external loc_of_class_expr : class_expr -> Loc.t = "%field0" - - external loc_of_class_str_item : class_str_item -> Loc.t = - "%field0" - - external loc_of_with_constr : with_constr -> Loc.t = "%field0" - - external loc_of_binding : binding -> Loc.t = "%field0" - - external loc_of_rec_binding : rec_binding -> Loc.t = "%field0" - - external loc_of_module_binding : module_binding -> Loc.t = - "%field0" - - external loc_of_match_case : match_case -> Loc.t = "%field0" - - external loc_of_ident : ident -> Loc.t = "%field0" - - let ghost = Loc.ghost - - let rec is_module_longident = - function - | Ast.IdAcc (_, _, i) -> is_module_longident i - | Ast.IdApp (_, i1, i2) -> - (is_module_longident i1) && (is_module_longident i2) - | Ast.IdUid (_, _) -> true - | _ -> false - - let ident_of_expr = - let error () = - invalid_arg - "ident_of_expr: this expression is not an identifier" in - let rec self = - function - | Ast.ExApp (_loc, e1, e2) -> - Ast.IdApp (_loc, (self e1), (self e2)) - | Ast.ExAcc (_loc, e1, e2) -> - Ast.IdAcc (_loc, (self e1), (self e2)) - | Ast.ExId (_, (Ast.IdLid (_, _))) -> error () - | Ast.ExId (_, i) -> - if is_module_longident i then i else error () - | _ -> error () - in - function - | Ast.ExId (_, i) -> i - | Ast.ExApp (_, _, _) -> error () - | t -> self t - - let ident_of_ctyp = - let error () = - invalid_arg "ident_of_ctyp: this type is not an identifier" in - let rec self = - function - | Ast.TyApp (_loc, t1, t2) -> - Ast.IdApp (_loc, (self t1), (self t2)) - | Ast.TyId (_, (Ast.IdLid (_, _))) -> error () - | Ast.TyId (_, i) -> - if is_module_longident i then i else error () - | _ -> error () - in function | Ast.TyId (_, i) -> i | t -> self t - - let ident_of_patt = - let error () = - invalid_arg - "ident_of_patt: this pattern is not an identifier" in - let rec self = - function - | Ast.PaApp (_loc, p1, p2) -> - Ast.IdApp (_loc, (self p1), (self p2)) - | Ast.PaId (_, (Ast.IdLid (_, _))) -> error () - | Ast.PaId (_, i) -> - if is_module_longident i then i else error () - | _ -> error () - in function | Ast.PaId (_, i) -> i | p -> self p - - let rec is_irrefut_patt = - function - | Ast.PaId (_, (Ast.IdLid (_, _))) -> true - | Ast.PaId (_, (Ast.IdUid (_, "()"))) -> true - | Ast.PaAny _ -> true - | Ast.PaNil _ -> true - | Ast.PaAli (_, x, y) -> - (is_irrefut_patt x) && (is_irrefut_patt y) - | Ast.PaRec (_, p) -> is_irrefut_patt p - | Ast.PaEq (_, _, p) -> is_irrefut_patt p - | Ast.PaSem (_, p1, p2) -> - (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaCom (_, p1, p2) -> - (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaOrp (_, p1, p2) -> - (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaApp (_, p1, p2) -> - (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaTyc (_, p, _) -> is_irrefut_patt p - | Ast.PaTup (_, pl) -> is_irrefut_patt pl - | Ast.PaOlb (_, _, (Ast.PaNil _)) -> true - | Ast.PaOlb (_, _, p) -> is_irrefut_patt p - | Ast.PaOlbi (_, _, p, _) -> is_irrefut_patt p - | Ast.PaLab (_, _, (Ast.PaNil _)) -> true - | Ast.PaLab (_, _, p) -> is_irrefut_patt p - | Ast.PaLaz (_, p) -> is_irrefut_patt p - | Ast.PaId (_, _) -> false - | Ast.PaMod (_, _) -> true - | Ast.PaVrn (_, _) | Ast.PaStr (_, _) | Ast.PaRng (_, _, _) | - Ast.PaFlo (_, _) | Ast.PaNativeInt (_, _) | - Ast.PaInt64 (_, _) | Ast.PaInt32 (_, _) | Ast.PaInt (_, _) - | Ast.PaChr (_, _) | Ast.PaTyp (_, _) | Ast.PaArr (_, _) | - Ast.PaAnt (_, _) -> false - - let rec is_constructor = - function - | Ast.IdAcc (_, _, i) -> is_constructor i - | Ast.IdUid (_, _) -> true - | Ast.IdLid (_, _) | Ast.IdApp (_, _, _) -> false - | Ast.IdAnt (_, _) -> assert false - - let is_patt_constructor = - function - | Ast.PaId (_, i) -> is_constructor i - | Ast.PaVrn (_, _) -> true - | _ -> false - - let rec is_expr_constructor = - function - | Ast.ExId (_, i) -> is_constructor i - | Ast.ExAcc (_, e1, e2) -> - (is_expr_constructor e1) && (is_expr_constructor e2) - | Ast.ExVrn (_, _) -> true - | _ -> false - - let rec tyOr_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TyOr (_loc, t, (tyOr_of_list ts)) - - let rec tyAnd_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TyAnd (_loc, t, (tyAnd_of_list ts)) - - let rec tySem_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TySem (_loc, t, (tySem_of_list ts)) - - let rec tyCom_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TyCom (_loc, t, (tyCom_of_list ts)) - - let rec tyAmp_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TyAmp (_loc, t, (tyAmp_of_list ts)) - - let rec tySta_of_list = - function - | [] -> Ast.TyNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_ctyp t - in Ast.TySta (_loc, t, (tySta_of_list ts)) - - let rec stSem_of_list = - function - | [] -> Ast.StNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_str_item t - in Ast.StSem (_loc, t, (stSem_of_list ts)) - - let rec sgSem_of_list = - function - | [] -> Ast.SgNil ghost - | [ t ] -> t - | t :: ts -> - let _loc = loc_of_sig_item t - in Ast.SgSem (_loc, t, (sgSem_of_list ts)) - - let rec biAnd_of_list = - function - | [] -> Ast.BiNil ghost - | [ b ] -> b - | b :: bs -> - let _loc = loc_of_binding b - in Ast.BiAnd (_loc, b, (biAnd_of_list bs)) - - let rec rbSem_of_list = - function - | [] -> Ast.RbNil ghost - | [ b ] -> b - | b :: bs -> - let _loc = loc_of_rec_binding b - in Ast.RbSem (_loc, b, (rbSem_of_list bs)) - - let rec wcAnd_of_list = - function - | [] -> Ast.WcNil ghost - | [ w ] -> w - | w :: ws -> - let _loc = loc_of_with_constr w - in Ast.WcAnd (_loc, w, (wcAnd_of_list ws)) - - let rec idAcc_of_list = - function - | [] -> assert false - | [ i ] -> i - | i :: is -> - let _loc = loc_of_ident i - in Ast.IdAcc (_loc, i, (idAcc_of_list is)) - - let rec idApp_of_list = - function - | [] -> assert false - | [ i ] -> i - | i :: is -> - let _loc = loc_of_ident i - in Ast.IdApp (_loc, i, (idApp_of_list is)) - - let rec mcOr_of_list = - function - | [] -> Ast.McNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_match_case x - in Ast.McOr (_loc, x, (mcOr_of_list xs)) - - let rec mbAnd_of_list = - function - | [] -> Ast.MbNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_module_binding x - in Ast.MbAnd (_loc, x, (mbAnd_of_list xs)) - - let rec meApp_of_list = - function - | [] -> assert false - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_module_expr x - in Ast.MeApp (_loc, x, (meApp_of_list xs)) - - let rec ceAnd_of_list = - function - | [] -> Ast.CeNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_class_expr x - in Ast.CeAnd (_loc, x, (ceAnd_of_list xs)) - - let rec ctAnd_of_list = - function - | [] -> Ast.CtNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_class_type x - in Ast.CtAnd (_loc, x, (ctAnd_of_list xs)) - - let rec cgSem_of_list = - function - | [] -> Ast.CgNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_class_sig_item x - in Ast.CgSem (_loc, x, (cgSem_of_list xs)) - - let rec crSem_of_list = - function - | [] -> Ast.CrNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_class_str_item x - in Ast.CrSem (_loc, x, (crSem_of_list xs)) - - let rec paSem_of_list = - function - | [] -> Ast.PaNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_patt x - in Ast.PaSem (_loc, x, (paSem_of_list xs)) - - let rec paCom_of_list = - function - | [] -> Ast.PaNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_patt x - in Ast.PaCom (_loc, x, (paCom_of_list xs)) - - let rec exSem_of_list = - function - | [] -> Ast.ExNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_expr x - in Ast.ExSem (_loc, x, (exSem_of_list xs)) - - let rec exCom_of_list = - function - | [] -> Ast.ExNil ghost - | [ x ] -> x - | x :: xs -> - let _loc = loc_of_expr x - in Ast.ExCom (_loc, x, (exCom_of_list xs)) - - let ty_of_stl = - function - | (_loc, s, []) -> Ast.TyId (_loc, (Ast.IdUid (_loc, s))) - | (_loc, s, tl) -> - Ast.TyOf (_loc, (Ast.TyId (_loc, (Ast.IdUid (_loc, s)))), - (tyAnd_of_list tl)) - - let ty_of_sbt = - function - | (_loc, s, true, t) -> - Ast.TyCol (_loc, (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), - (Ast.TyMut (_loc, t))) - | (_loc, s, false, t) -> - Ast.TyCol (_loc, (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), - t) - - let bi_of_pe (p, e) = - let _loc = loc_of_patt p in Ast.BiEq (_loc, p, e) - - let sum_type_of_list l = tyOr_of_list (List.map ty_of_stl l) - - let record_type_of_list l = tySem_of_list (List.map ty_of_sbt l) - - let binding_of_pel l = biAnd_of_list (List.map bi_of_pe l) - - let rec pel_of_binding = - function - | Ast.BiAnd (_, b1, b2) -> - (pel_of_binding b1) @ (pel_of_binding b2) - | Ast.BiEq (_, p, e) -> [ (p, e) ] - | _ -> assert false - - let rec list_of_binding x acc = - match x with - | Ast.BiAnd (_, b1, b2) -> - list_of_binding b1 (list_of_binding b2 acc) - | t -> t :: acc - - let rec list_of_rec_binding x acc = - match x with - | Ast.RbSem (_, b1, b2) -> - list_of_rec_binding b1 (list_of_rec_binding b2 acc) - | t -> t :: acc - - let rec list_of_with_constr x acc = - match x with - | Ast.WcAnd (_, w1, w2) -> - list_of_with_constr w1 (list_of_with_constr w2 acc) - | t -> t :: acc - - let rec list_of_ctyp x acc = - match x with - | Ast.TyNil _ -> acc - | Ast.TyAmp (_, x, y) | Ast.TyCom (_, x, y) | - Ast.TySta (_, x, y) | Ast.TySem (_, x, y) | - Ast.TyAnd (_, x, y) | Ast.TyOr (_, x, y) -> - list_of_ctyp x (list_of_ctyp y acc) - | x -> x :: acc - - let rec list_of_patt x acc = - match x with - | Ast.PaNil _ -> acc - | Ast.PaCom (_, x, y) | Ast.PaSem (_, x, y) -> - list_of_patt x (list_of_patt y acc) - | x -> x :: acc - - let rec list_of_expr x acc = - match x with - | Ast.ExNil _ -> acc - | Ast.ExCom (_, x, y) | Ast.ExSem (_, x, y) -> - list_of_expr x (list_of_expr y acc) - | x -> x :: acc - - let rec list_of_str_item x acc = - match x with - | Ast.StNil _ -> acc - | Ast.StSem (_, x, y) -> - list_of_str_item x (list_of_str_item y acc) - | x -> x :: acc - - let rec list_of_sig_item x acc = - match x with - | Ast.SgNil _ -> acc - | Ast.SgSem (_, x, y) -> - list_of_sig_item x (list_of_sig_item y acc) - | x -> x :: acc - - let rec list_of_class_sig_item x acc = - match x with - | Ast.CgNil _ -> acc - | Ast.CgSem (_, x, y) -> - list_of_class_sig_item x (list_of_class_sig_item y acc) - | x -> x :: acc - - let rec list_of_class_str_item x acc = - match x with - | Ast.CrNil _ -> acc - | Ast.CrSem (_, x, y) -> - list_of_class_str_item x (list_of_class_str_item y acc) - | x -> x :: acc - - let rec list_of_class_type x acc = - match x with - | Ast.CtAnd (_, x, y) -> - list_of_class_type x (list_of_class_type y acc) - | x -> x :: acc - - let rec list_of_class_expr x acc = - match x with - | Ast.CeAnd (_, x, y) -> - list_of_class_expr x (list_of_class_expr y acc) - | x -> x :: acc - - let rec list_of_module_expr x acc = - match x with - | Ast.MeApp (_, x, y) -> - list_of_module_expr x (list_of_module_expr y acc) - | x -> x :: acc - - let rec list_of_match_case x acc = - match x with - | Ast.McNil _ -> acc - | Ast.McOr (_, x, y) -> - list_of_match_case x (list_of_match_case y acc) - | x -> x :: acc - - let rec list_of_ident x acc = - match x with - | Ast.IdAcc (_, x, y) | Ast.IdApp (_, x, y) -> - list_of_ident x (list_of_ident y acc) - | x -> x :: acc - - let rec list_of_module_binding x acc = - match x with - | Ast.MbAnd (_, x, y) -> - list_of_module_binding x (list_of_module_binding y acc) - | x -> x :: acc - - module Meta = - struct - module type META_LOC = - sig - val meta_loc_patt : Loc.t -> Loc.t -> Ast.patt - - val meta_loc_expr : Loc.t -> Loc.t -> Ast.expr - - end - - module MetaLoc = - struct - let meta_loc_patt _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location - in - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "of_tuple")))))), - (Ast.PaTup (_loc, - (Ast.PaCom (_loc, - (Ast.PaStr (_loc, - (Ast.safe_string_escaped a))), - (Ast.PaCom (_loc, - (Ast.PaCom (_loc, - (Ast.PaCom (_loc, - (Ast.PaCom (_loc, - (Ast.PaCom (_loc, - (Ast.PaCom (_loc, - (Ast.PaInt (_loc, - (string_of_int b))), - (Ast.PaInt (_loc, - (string_of_int c))))), - (Ast.PaInt (_loc, - (string_of_int d))))), - (Ast.PaInt (_loc, - (string_of_int e))))), - (Ast.PaInt (_loc, (string_of_int f))))), - (Ast.PaInt (_loc, (string_of_int g))))), - (if h - then - Ast.PaId (_loc, - (Ast.IdUid (_loc, "True"))) - else - Ast.PaId (_loc, - (Ast.IdUid (_loc, "False"))))))))))) - - let meta_loc_expr _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "of_tuple")))))), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, - (Ast.ExStr (_loc, - (Ast.safe_string_escaped a))), - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExInt (_loc, - (string_of_int b))), - (Ast.ExInt (_loc, - (string_of_int c))))), - (Ast.ExInt (_loc, - (string_of_int d))))), - (Ast.ExInt (_loc, - (string_of_int e))))), - (Ast.ExInt (_loc, (string_of_int f))))), - (Ast.ExInt (_loc, (string_of_int g))))), - (if h - then - Ast.ExId (_loc, - (Ast.IdUid (_loc, "True"))) - else - Ast.ExId (_loc, - (Ast.IdUid (_loc, "False"))))))))))) - - end - - module MetaGhostLoc = - struct - let meta_loc_patt _loc _ = - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "ghost"))))) - - let meta_loc_expr _loc _ = - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "ghost"))))) - - end - - module MetaLocVar = - struct - let meta_loc_patt _loc _ = - Ast.PaId (_loc, (Ast.IdLid (_loc, !Loc.name))) - - let meta_loc_expr _loc _ = - Ast.ExId (_loc, (Ast.IdLid (_loc, !Loc.name))) - - end - - module Make (MetaLoc : META_LOC) = - struct - open MetaLoc - - let meta_loc = meta_loc_expr - - module Expr = - struct - let meta_string _loc s = - Ast.ExStr (_loc, (safe_string_escaped s)) - - let meta_int _loc s = Ast.ExInt (_loc, s) - - let meta_float _loc s = Ast.ExFlo (_loc, s) - - let meta_char _loc s = - Ast.ExChr (_loc, (String.escaped s)) - - let meta_bool _loc = - function - | false -> - Ast.ExId (_loc, (Ast.IdUid (_loc, "False"))) - | true -> - Ast.ExId (_loc, (Ast.IdUid (_loc, "True"))) - - let rec meta_list mf_a _loc = - function - | [] -> Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))) - | x :: xs -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), - (mf_a _loc x))), - (meta_list mf_a _loc xs)) - - let rec meta_binding _loc = - function - | Ast.BiAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.BiEq (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiEq")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_expr _loc x2)) - | Ast.BiAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiAnd")))))), - (meta_loc _loc x0))), - (meta_binding _loc x1))), - (meta_binding _loc x2)) - | Ast.BiNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiNil")))))), - (meta_loc _loc x0)) - and meta_class_expr _loc = - function - | Ast.CeAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.CeEq (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeEq")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeAnd")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeTyc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeTyc")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_type _loc x2)) - | Ast.CeStr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeStr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.CeLet (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeLet")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2))), - (meta_class_expr _loc x3)) - | Ast.CeFun (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeFun")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeCon (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeCon")))))), - (meta_loc _loc x0))), - (meta_virtual_flag _loc x1))), - (meta_ident _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CeApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeApp")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.CeNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeNil")))))), - (meta_loc _loc x0)) - and meta_class_sig_item _loc = - function - | Ast.CgAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.CgVir (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgVir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CgVal (x0, x1, x2, x3, x4) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_mutable_flag _loc x2))), - (meta_virtual_flag _loc x3))), - (meta_ctyp _loc x4)) - | Ast.CgMth (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgMth")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CgInh (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgInh")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.CgSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgSem")))))), - (meta_loc _loc x0))), - (meta_class_sig_item _loc x1))), - (meta_class_sig_item _loc x2)) - | Ast.CgCtr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgCtr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.CgNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgNil")))))), - (meta_loc _loc x0)) - and meta_class_str_item _loc = - function - | Ast.CrAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.CrVvr (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVvr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_mutable_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CrVir (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CrVal (x0, x1, x2, x3, x4) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_override_flag _loc x2))), - (meta_mutable_flag _loc x3))), - (meta_expr _loc x4)) - | Ast.CrMth (x0, x1, x2, x3, x4, x5) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, - "CrMth")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_override_flag _loc x2))), - (meta_private_flag _loc x3))), - (meta_expr _loc x4))), - (meta_ctyp _loc x5)) - | Ast.CrIni (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrIni")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.CrInh (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrInh")))))), - (meta_loc _loc x0))), - (meta_override_flag _loc x1))), - (meta_class_expr _loc x2))), - (meta_string _loc x3)) - | Ast.CrCtr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrCtr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.CrSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrSem")))))), - (meta_loc _loc x0))), - (meta_class_str_item _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.CrNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrNil")))))), - (meta_loc _loc x0)) - and meta_class_type _loc = - function - | Ast.CtAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.CtEq (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtEq")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtCol (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtCol")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtAnd")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtSig (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtSig")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_class_sig_item _loc x2)) - | Ast.CtFun (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtFun")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtCon (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtCon")))))), - (meta_loc _loc x0))), - (meta_virtual_flag _loc x1))), - (meta_ident _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CtNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtNil")))))), - (meta_loc _loc x0)) - and meta_ctyp _loc = - function - | Ast.TyAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.TyPkg (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPkg")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1)) - | Ast.TyOfAmp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOfAmp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAmp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAmp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyVrnInfSup (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnInfSup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyVrnInf (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnInf")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrnSup (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnSup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrnEq (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnEq")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TySta (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySta")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyTup (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyTup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyMut (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyMut")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyPrv (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPrv")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyOr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnd")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyOf (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOf")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TySum (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySum")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyCom (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCom")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TySem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySem")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyCol (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyRec (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyRec")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrn (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyAnM x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnM")))))), - (meta_loc _loc x0)) - | Ast.TyAnP x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnP")))))), - (meta_loc _loc x0)) - | Ast.TyQuM (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuM")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyQuP (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuP")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyQuo (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyTypePol (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyTypePol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyPol (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyOlb (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyObj (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyObj")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_row_var_flag _loc x2)) - | Ast.TyDcl (x0, x1, x2, x3, x4) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyDcl")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_list meta_ctyp _loc x2))), - (meta_ctyp _loc x3))), - (meta_list - (fun _loc (x1, x2) -> - Ast.ExTup (_loc, - (Ast.ExCom (_loc, - (meta_ctyp _loc x1), - (meta_ctyp _loc x2))))) - _loc x4)) - | Ast.TyMan (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyMan")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyId (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.TyLab (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyCls (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCls")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.TyArr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyArr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyApp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAny x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAny")))))), - (meta_loc _loc x0)) - | Ast.TyAli (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAli")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyNil")))))), - (meta_loc _loc x0)) - and meta_direction_flag _loc = - function - | Ast.DiAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.DiDownto -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "DiDownto"))))) - | Ast.DiTo -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "DiTo"))))) - and meta_expr _loc = - function - | Ast.ExPkg (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExPkg")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.ExFUN (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFUN")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExOpI (x0, x1, x2) -> - 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.ExWhi (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExWhi")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExVrn (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExTyc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTyc")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_ctyp _loc x2)) - | Ast.ExCom (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExCom")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExTup (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTup")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExTry (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTry")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_match_case _loc x2)) - | Ast.ExStr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExStr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExSte (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSte")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExSnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSnd")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_string _loc x2)) - | Ast.ExSeq (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSeq")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExRec (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExRec")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1))), - (meta_expr _loc x2)) - | Ast.ExOvr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOvr")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1)) - | Ast.ExOlb (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExObj (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExObj")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.ExNew (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNew")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.ExMat (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExMat")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_match_case _loc x2)) - | Ast.ExLmd (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLmd")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.ExLet (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLet")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2))), - (meta_expr _loc x3)) - | Ast.ExLaz (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLaz")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExLab (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExNativeInt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNativeInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt64 (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt64")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt32 (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt32")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExIfe (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExIfe")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.ExFun (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFun")))))), - (meta_loc _loc x0))), - (meta_match_case _loc x1)) - | Ast.ExFor (x0, x1, x2, x3, x4, x5) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, - "ExFor")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3))), - (meta_direction_flag _loc x4))), - (meta_expr _loc x5)) - | Ast.ExFlo (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFlo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExCoe (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExCoe")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_ctyp _loc x2))), - (meta_ctyp _loc x3)) - | Ast.ExChr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExChr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExAss (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAss")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExAsr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAsr")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExAsf x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAsf")))))), - (meta_loc _loc x0)) - | Ast.ExSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSem")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExArr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExArr")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExAre (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAre")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExApp")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.ExAcc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAcc")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExId (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.ExNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNil")))))), - (meta_loc _loc x0)) - and meta_ident _loc = - function - | Ast.IdAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.IdUid (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdUid")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.IdLid (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdLid")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.IdApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdApp")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.IdAcc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdAcc")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - and meta_match_case _loc = - function - | Ast.McAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.McArr (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McArr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.McOr (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McOr")))))), - (meta_loc _loc x0))), - (meta_match_case _loc x1))), - (meta_match_case _loc x2)) - | Ast.McNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McNil")))))), - (meta_loc _loc x0)) - and meta_meta_bool _loc = - function - | Ast.BAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.BFalse -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BFalse"))))) - | Ast.BTrue -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BTrue"))))) - and meta_meta_list mf_a _loc = - function - | Ast.LAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.LCons (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "LCons")))))), - (mf_a _loc x0))), - (meta_meta_list mf_a _loc x1)) - | Ast.LNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "LNil"))))) - and meta_meta_option mf_a _loc = - function - | Ast.OAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.OSome x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OSome")))))), - (mf_a _loc x0)) - | Ast.ONone -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ONone"))))) - and meta_module_binding _loc = - function - | Ast.MbAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.MbCol (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbCol")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.MbColEq (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbColEq")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_expr _loc x3)) - | Ast.MbAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbAnd")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1))), - (meta_module_binding _loc x2)) - | Ast.MbNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbNil")))))), - (meta_loc _loc x0)) - and meta_module_expr _loc = - function - | Ast.MeAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.MePkg (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MePkg")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.MeTyc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeTyc")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1))), - (meta_module_type _loc x2)) - | Ast.MeStr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeStr")))))), - (meta_loc _loc x0))), - (meta_str_item _loc x1)) - | Ast.MeFun (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeFun")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_expr _loc x3)) - | Ast.MeApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeApp")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1))), - (meta_module_expr _loc x2)) - | Ast.MeId (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.MeNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeNil")))))), - (meta_loc _loc x0)) - and meta_module_type _loc = - function - | Ast.MtAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.MtOf (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtOf")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.MtWit (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtWit")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1))), - (meta_with_constr _loc x2)) - | Ast.MtSig (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtSig")))))), - (meta_loc _loc x0))), - (meta_sig_item _loc x1)) - | Ast.MtQuo (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtQuo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.MtFun (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtFun")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_type _loc x3)) - | Ast.MtId (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.MtNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtNil")))))), - (meta_loc _loc x0)) - and meta_mutable_flag _loc = - function - | Ast.MuAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.MuNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MuNil"))))) - | Ast.MuMutable -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MuMutable"))))) - and meta_override_flag _loc = - function - | Ast.OvAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.OvNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OvNil"))))) - | Ast.OvOverride -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OvOverride"))))) - and meta_patt _loc = - function - | Ast.PaMod (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaLaz (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaLaz")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaVrn (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaTyp (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTyp")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.PaTyc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTyc")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_ctyp _loc x2)) - | Ast.PaTup (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTup")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaStr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaStr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaEq (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaEq")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_patt _loc x2)) - | Ast.PaRec (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaRec")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaRng (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaRng")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaOrp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOrp")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaOlbi (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOlbi")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2))), - (meta_expr _loc x3)) - | Ast.PaOlb (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2)) - | Ast.PaLab (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2)) - | Ast.PaFlo (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaFlo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaNativeInt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaNativeInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt64 (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt64")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt32 (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt32")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaChr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaChr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaSem")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaCom (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaCom")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaArr (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaArr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaApp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaApp")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaAny x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAny")))))), - (meta_loc _loc x0)) - | Ast.PaAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.PaAli (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAli")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaId (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.PaNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaNil")))))), - (meta_loc _loc x0)) - and meta_private_flag _loc = - function - | Ast.PrAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.PrNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PrNil"))))) - | Ast.PrPrivate -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PrPrivate"))))) - and meta_rec_binding _loc = - function - | Ast.RbAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.RbEq (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbEq")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_expr _loc x2)) - | Ast.RbSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbSem")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1))), - (meta_rec_binding _loc x2)) - | Ast.RbNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbNil")))))), - (meta_loc _loc x0)) - and meta_rec_flag _loc = - function - | Ast.ReAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.ReNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ReNil"))))) - | Ast.ReRecursive -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ReRecursive"))))) - and meta_row_var_flag _loc = - function - | Ast.RvAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.RvNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RvNil"))))) - | Ast.RvRowVar -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RvRowVar"))))) - and meta_sig_item _loc = - function - | Ast.SgAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.SgVal (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.SgTyp (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.SgOpn (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgOpn")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.SgMty (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgMty")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.SgRecMod (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgRecMod")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1)) - | Ast.SgMod (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.SgInc (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgInc")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1)) - | Ast.SgExt (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgExt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2))), - (meta_meta_list meta_string _loc x3)) - | Ast.SgExc (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgExc")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.SgDir (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgDir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.SgSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgSem")))))), - (meta_loc _loc x0))), - (meta_sig_item _loc x1))), - (meta_sig_item _loc x2)) - | Ast.SgClt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgClt")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.SgCls (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgCls")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.SgNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgNil")))))), - (meta_loc _loc x0)) - and meta_str_item _loc = - function - | Ast.StAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.StVal (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StVal")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2)) - | Ast.StTyp (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.StOpn (x0, x1) -> - 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.StMty (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StMty")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.StRecMod (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StRecMod")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1)) - | Ast.StMod (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_expr _loc x2)) - | Ast.StInc (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StInc")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.StExt (x0, x1, x2, x3) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2))), - (meta_meta_list meta_string _loc x3)) - | Ast.StExp (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExp")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.StExc (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExc")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_meta_option meta_ident _loc x2)) - | Ast.StDir (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StDir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.StSem (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StSem")))))), - (meta_loc _loc x0))), - (meta_str_item _loc x1))), - (meta_str_item _loc x2)) - | Ast.StClt (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StClt")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.StCls (x0, x1) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StCls")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1)) - | Ast.StNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StNil")))))), - (meta_loc _loc x0)) - and meta_virtual_flag _loc = - function - | Ast.ViAnt x0 -> Ast.ExAnt (_loc, x0) - | Ast.ViNil -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ViNil"))))) - | Ast.ViVirtual -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ViVirtual"))))) - and meta_with_constr _loc = - function - | Ast.WcAnt (x0, x1) -> Ast.ExAnt (x0, x1) - | Ast.WcAnd (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcAnd")))))), - (meta_loc _loc x0))), - (meta_with_constr _loc x1))), - (meta_with_constr _loc x2)) - | Ast.WcMoS (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcMoS")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.WcTyS (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcTyS")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.WcMod (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcMod")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.WcTyp (x0, x1, x2) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.WcNil x0 -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcNil")))))), - (meta_loc _loc x0)) - - end - - let meta_loc = meta_loc_patt - - module Patt = - struct - let meta_string _loc s = - Ast.PaStr (_loc, (safe_string_escaped s)) - - let meta_int _loc s = Ast.PaInt (_loc, s) - - let meta_float _loc s = Ast.PaFlo (_loc, s) - - let meta_char _loc s = - Ast.PaChr (_loc, (String.escaped s)) - - let meta_bool _loc = - function - | false -> - Ast.PaId (_loc, (Ast.IdUid (_loc, "False"))) - | true -> - Ast.PaId (_loc, (Ast.IdUid (_loc, "True"))) - - let rec meta_list mf_a _loc = - function - | [] -> Ast.PaId (_loc, (Ast.IdUid (_loc, "[]"))) - | x :: xs -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "::")))), - (mf_a _loc x))), - (meta_list mf_a _loc xs)) - - let rec meta_binding _loc = - function - | Ast.BiAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.BiEq (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiEq")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_expr _loc x2)) - | Ast.BiAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiAnd")))))), - (meta_loc _loc x0))), - (meta_binding _loc x1))), - (meta_binding _loc x2)) - | Ast.BiNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiNil")))))), - (meta_loc _loc x0)) - and meta_class_expr _loc = - function - | Ast.CeAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.CeEq (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeEq")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeAnd")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeTyc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeTyc")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_class_type _loc x2)) - | Ast.CeStr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeStr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.CeLet (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeLet")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2))), - (meta_class_expr _loc x3)) - | Ast.CeFun (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeFun")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_expr _loc x2)) - | Ast.CeCon (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeCon")))))), - (meta_loc _loc x0))), - (meta_virtual_flag _loc x1))), - (meta_ident _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CeApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeApp")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.CeNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeNil")))))), - (meta_loc _loc x0)) - and meta_class_sig_item _loc = - function - | Ast.CgAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.CgVir (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgVir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CgVal (x0, x1, x2, x3, x4) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_mutable_flag _loc x2))), - (meta_virtual_flag _loc x3))), - (meta_ctyp _loc x4)) - | Ast.CgMth (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgMth")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CgInh (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgInh")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.CgSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgSem")))))), - (meta_loc _loc x0))), - (meta_class_sig_item _loc x1))), - (meta_class_sig_item _loc x2)) - | Ast.CgCtr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgCtr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.CgNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgNil")))))), - (meta_loc _loc x0)) - and meta_class_str_item _loc = - function - | Ast.CrAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.CrVvr (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVvr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_mutable_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CrVir (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_private_flag _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CrVal (x0, x1, x2, x3, x4) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_override_flag _loc x2))), - (meta_mutable_flag _loc x3))), - (meta_expr _loc x4)) - | Ast.CrMth (x0, x1, x2, x3, x4, x5) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, - "CrMth")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_override_flag _loc x2))), - (meta_private_flag _loc x3))), - (meta_expr _loc x4))), - (meta_ctyp _loc x5)) - | Ast.CrIni (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrIni")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.CrInh (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrInh")))))), - (meta_loc _loc x0))), - (meta_override_flag _loc x1))), - (meta_class_expr _loc x2))), - (meta_string _loc x3)) - | Ast.CrCtr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrCtr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.CrSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrSem")))))), - (meta_loc _loc x0))), - (meta_class_str_item _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.CrNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrNil")))))), - (meta_loc _loc x0)) - and meta_class_type _loc = - function - | Ast.CtAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.CtEq (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtEq")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtCol (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtCol")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtAnd")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtSig (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtSig")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_class_sig_item _loc x2)) - | Ast.CtFun (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtFun")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_class_type _loc x2)) - | Ast.CtCon (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtCon")))))), - (meta_loc _loc x0))), - (meta_virtual_flag _loc x1))), - (meta_ident _loc x2))), - (meta_ctyp _loc x3)) - | Ast.CtNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtNil")))))), - (meta_loc _loc x0)) - and meta_ctyp _loc = - function - | Ast.TyAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.TyPkg (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPkg")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1)) - | Ast.TyOfAmp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOfAmp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAmp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAmp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyVrnInfSup (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnInfSup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyVrnInf (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnInf")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrnSup (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnSup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrnEq (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrnEq")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TySta (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySta")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyTup (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyTup")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyMut (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyMut")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyPrv (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPrv")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyOr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnd")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyOf (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOf")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TySum (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySum")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyCom (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCom")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TySem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TySem")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyCol (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyRec (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyRec")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.TyVrn (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyAnM x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnM")))))), - (meta_loc _loc x0)) - | Ast.TyAnP x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnP")))))), - (meta_loc _loc x0)) - | Ast.TyQuM (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuM")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyQuP (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuP")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyQuo (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyQuo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.TyTypePol (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyTypePol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyPol (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyPol")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyOlb (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyObj (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyObj")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_row_var_flag _loc x2)) - | Ast.TyDcl (x0, x1, x2, x3, x4) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyDcl")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_list meta_ctyp _loc x2))), - (meta_ctyp _loc x3))), - (meta_list - (fun _loc (x1, x2) -> - Ast.PaTup (_loc, - (Ast.PaCom (_loc, - (meta_ctyp _loc x1), - (meta_ctyp _loc x2))))) - _loc x4)) - | Ast.TyMan (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyMan")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyId (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.TyLab (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyCls (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyCls")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.TyArr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyArr")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyApp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyAny x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAny")))))), - (meta_loc _loc x0)) - | Ast.TyAli (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAli")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.TyNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyNil")))))), - (meta_loc _loc x0)) - and meta_direction_flag _loc = - function - | Ast.DiAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.DiDownto -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "DiDownto"))))) - | Ast.DiTo -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "DiTo"))))) - and meta_expr _loc = - function - | Ast.ExPkg (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExPkg")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.ExFUN (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFUN")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExOpI (x0, x1, x2) -> - 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.ExWhi (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExWhi")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExVrn (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExTyc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTyc")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_ctyp _loc x2)) - | Ast.ExCom (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExCom")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExTup (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTup")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExTry (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExTry")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_match_case _loc x2)) - | Ast.ExStr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExStr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExSte (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSte")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExSnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSnd")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_string _loc x2)) - | Ast.ExSeq (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSeq")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExRec (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExRec")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1))), - (meta_expr _loc x2)) - | Ast.ExOvr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOvr")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1)) - | Ast.ExOlb (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExObj (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExObj")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_class_str_item _loc x2)) - | Ast.ExNew (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNew")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.ExMat (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExMat")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_match_case _loc x2)) - | Ast.ExLmd (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLmd")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.ExLet (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLet")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2))), - (meta_expr _loc x3)) - | Ast.ExLaz (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLaz")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExLab (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.ExNativeInt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNativeInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt64 (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt64")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt32 (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt32")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExInt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExIfe (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExIfe")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.ExFun (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFun")))))), - (meta_loc _loc x0))), - (meta_match_case _loc x1)) - | Ast.ExFor (x0, x1, x2, x3, x4, x5) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, - "ExFor")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3))), - (meta_direction_flag _loc x4))), - (meta_expr _loc x5)) - | Ast.ExFlo (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExFlo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExCoe (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExCoe")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_ctyp _loc x2))), - (meta_ctyp _loc x3)) - | Ast.ExChr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExChr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.ExAss (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAss")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExAsr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAsr")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExAsf x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAsf")))))), - (meta_loc _loc x0)) - | Ast.ExSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExSem")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExArr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExArr")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.ExAre (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAre")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExApp")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.ExAcc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAcc")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1))), - (meta_expr _loc x2)) - | Ast.ExId (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.ExNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExNil")))))), - (meta_loc _loc x0)) - and meta_ident _loc = - function - | Ast.IdAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.IdUid (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdUid")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.IdLid (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdLid")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.IdApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdApp")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.IdAcc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdAcc")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - and meta_match_case _loc = - function - | Ast.McAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.McArr (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McArr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_expr _loc x2))), - (meta_expr _loc x3)) - | Ast.McOr (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McOr")))))), - (meta_loc _loc x0))), - (meta_match_case _loc x1))), - (meta_match_case _loc x2)) - | Ast.McNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McNil")))))), - (meta_loc _loc x0)) - and meta_meta_bool _loc = - function - | Ast.BAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.BFalse -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BFalse"))))) - | Ast.BTrue -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BTrue"))))) - and meta_meta_list mf_a _loc = - function - | Ast.LAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.LCons (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "LCons")))))), - (mf_a _loc x0))), - (meta_meta_list mf_a _loc x1)) - | Ast.LNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "LNil"))))) - and meta_meta_option mf_a _loc = - function - | Ast.OAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.OSome x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OSome")))))), - (mf_a _loc x0)) - | Ast.ONone -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ONone"))))) - and meta_module_binding _loc = - function - | Ast.MbAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.MbCol (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbCol")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.MbColEq (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbColEq")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_expr _loc x3)) - | Ast.MbAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbAnd")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1))), - (meta_module_binding _loc x2)) - | Ast.MbNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbNil")))))), - (meta_loc _loc x0)) - and meta_module_expr _loc = - function - | Ast.MeAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.MePkg (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MePkg")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.MeTyc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeTyc")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1))), - (meta_module_type _loc x2)) - | Ast.MeStr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeStr")))))), - (meta_loc _loc x0))), - (meta_str_item _loc x1)) - | Ast.MeFun (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeFun")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_expr _loc x3)) - | Ast.MeApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeApp")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1))), - (meta_module_expr _loc x2)) - | Ast.MeId (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.MeNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeNil")))))), - (meta_loc _loc x0)) - and meta_module_type _loc = - function - | Ast.MtAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.MtOf (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtOf")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.MtWit (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtWit")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1))), - (meta_with_constr _loc x2)) - | Ast.MtSig (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtSig")))))), - (meta_loc _loc x0))), - (meta_sig_item _loc x1)) - | Ast.MtQuo (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtQuo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.MtFun (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtFun")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2))), - (meta_module_type _loc x3)) - | Ast.MtId (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.MtNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtNil")))))), - (meta_loc _loc x0)) - and meta_mutable_flag _loc = - function - | Ast.MuAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.MuNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MuNil"))))) - | Ast.MuMutable -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MuMutable"))))) - and meta_override_flag _loc = - function - | Ast.OvAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.OvNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OvNil"))))) - | Ast.OvOverride -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "OvOverride"))))) - and meta_patt _loc = - function - | Ast.PaMod (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaLaz (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaLaz")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaVrn (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaVrn")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaTyp (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTyp")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.PaTyc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTyc")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_ctyp _loc x2)) - | Ast.PaTup (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaTup")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaStr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaStr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaEq (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaEq")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_patt _loc x2)) - | Ast.PaRec (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaRec")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaRng (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaRng")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaOrp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOrp")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaOlbi (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOlbi")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2))), - (meta_expr _loc x3)) - | Ast.PaOlb (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaOlb")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2)) - | Ast.PaLab (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaLab")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_patt _loc x2)) - | Ast.PaFlo (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaFlo")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaNativeInt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaNativeInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt64 (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt64")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt32 (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt32")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaInt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaInt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaChr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaChr")))))), - (meta_loc _loc x0))), - (meta_string _loc x1)) - | Ast.PaSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaSem")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaCom (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaCom")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaArr (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaArr")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1)) - | Ast.PaApp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaApp")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaAny x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAny")))))), - (meta_loc _loc x0)) - | Ast.PaAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.PaAli (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAli")))))), - (meta_loc _loc x0))), - (meta_patt _loc x1))), - (meta_patt _loc x2)) - | Ast.PaId (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaId")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.PaNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaNil")))))), - (meta_loc _loc x0)) - and meta_private_flag _loc = - function - | Ast.PrAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.PrNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PrNil"))))) - | Ast.PrPrivate -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PrPrivate"))))) - and meta_rec_binding _loc = - function - | Ast.RbAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.RbEq (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbEq")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_expr _loc x2)) - | Ast.RbSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbSem")))))), - (meta_loc _loc x0))), - (meta_rec_binding _loc x1))), - (meta_rec_binding _loc x2)) - | Ast.RbNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbNil")))))), - (meta_loc _loc x0)) - and meta_rec_flag _loc = - function - | Ast.ReAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.ReNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ReNil"))))) - | Ast.ReRecursive -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ReRecursive"))))) - and meta_row_var_flag _loc = - function - | Ast.RvAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.RvNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RvNil"))))) - | Ast.RvRowVar -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RvRowVar"))))) - and meta_sig_item _loc = - function - | Ast.SgAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.SgVal (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgVal")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2)) - | Ast.SgTyp (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.SgOpn (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgOpn")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1)) - | Ast.SgMty (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgMty")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.SgRecMod (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgRecMod")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1)) - | Ast.SgMod (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.SgInc (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgInc")))))), - (meta_loc _loc x0))), - (meta_module_type _loc x1)) - | Ast.SgExt (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgExt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2))), - (meta_meta_list meta_string _loc x3)) - | Ast.SgExc (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgExc")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.SgDir (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgDir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.SgSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgSem")))))), - (meta_loc _loc x0))), - (meta_sig_item _loc x1))), - (meta_sig_item _loc x2)) - | Ast.SgClt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgClt")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.SgCls (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgCls")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.SgNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgNil")))))), - (meta_loc _loc x0)) - and meta_str_item _loc = - function - | Ast.StAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.StVal (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StVal")))))), - (meta_loc _loc x0))), - (meta_rec_flag _loc x1))), - (meta_binding _loc x2)) - | Ast.StTyp (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1)) - | Ast.StOpn (x0, x1) -> - 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.StMty (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StMty")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_type _loc x2)) - | Ast.StRecMod (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StRecMod")))))), - (meta_loc _loc x0))), - (meta_module_binding _loc x1)) - | Ast.StMod (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StMod")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_module_expr _loc x2)) - | Ast.StInc (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StInc")))))), - (meta_loc _loc x0))), - (meta_module_expr _loc x1)) - | Ast.StExt (x0, x1, x2, x3) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExt")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_ctyp _loc x2))), - (meta_meta_list meta_string _loc x3)) - | Ast.StExp (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExp")))))), - (meta_loc _loc x0))), - (meta_expr _loc x1)) - | Ast.StExc (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StExc")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_meta_option meta_ident _loc x2)) - | Ast.StDir (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StDir")))))), - (meta_loc _loc x0))), - (meta_string _loc x1))), - (meta_expr _loc x2)) - | Ast.StSem (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StSem")))))), - (meta_loc _loc x0))), - (meta_str_item _loc x1))), - (meta_str_item _loc x2)) - | Ast.StClt (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StClt")))))), - (meta_loc _loc x0))), - (meta_class_type _loc x1)) - | Ast.StCls (x0, x1) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StCls")))))), - (meta_loc _loc x0))), - (meta_class_expr _loc x1)) - | Ast.StNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StNil")))))), - (meta_loc _loc x0)) - and meta_virtual_flag _loc = - function - | Ast.ViAnt x0 -> Ast.PaAnt (_loc, x0) - | Ast.ViNil -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ViNil"))))) - | Ast.ViVirtual -> - Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ViVirtual"))))) - and meta_with_constr _loc = - function - | Ast.WcAnt (x0, x1) -> Ast.PaAnt (x0, x1) - | Ast.WcAnd (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcAnd")))))), - (meta_loc _loc x0))), - (meta_with_constr _loc x1))), - (meta_with_constr _loc x2)) - | Ast.WcMoS (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcMoS")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.WcTyS (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcTyS")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.WcMod (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcMod")))))), - (meta_loc _loc x0))), - (meta_ident _loc x1))), - (meta_ident _loc x2)) - | Ast.WcTyp (x0, x1, x2) -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcTyp")))))), - (meta_loc _loc x0))), - (meta_ctyp _loc x1))), - (meta_ctyp _loc x2)) - | Ast.WcNil x0 -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcNil")))))), - (meta_loc _loc x0)) - - end - - end - - end - - class map = - object ((o : 'self_type)) - method string : string -> string = o#unknown - method list : - 'a 'a_out. - ('self_type -> 'a -> 'a_out) -> 'a list -> 'a_out list = - fun _f_a -> - function - | [] -> [] - | _x :: _x_i1 -> - let _x = _f_a o _x in - let _x_i1 = o#list _f_a _x_i1 in _x :: _x_i1 - method with_constr : with_constr -> with_constr = - function - | WcNil _x -> let _x = o#loc _x in WcNil _x - | WcTyp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in WcTyp (_x, _x_i1, _x_i2) - | WcMod (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in WcMod (_x, _x_i1, _x_i2) - | WcTyS (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in WcTyS (_x, _x_i1, _x_i2) - | WcMoS (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in WcMoS (_x, _x_i1, _x_i2) - | WcAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#with_constr _x_i1 in - let _x_i2 = o#with_constr _x_i2 - in WcAnd (_x, _x_i1, _x_i2) - | WcAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in WcAnt (_x, _x_i1) - method virtual_flag : virtual_flag -> virtual_flag = - function - | ViVirtual -> ViVirtual - | ViNil -> ViNil - | ViAnt _x -> let _x = o#string _x in ViAnt _x - method str_item : str_item -> str_item = - function - | StNil _x -> let _x = o#loc _x in StNil _x - | StCls (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in StCls (_x, _x_i1) - | StClt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in StClt (_x, _x_i1) - | StSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#str_item _x_i1 in - let _x_i2 = o#str_item _x_i2 - in StSem (_x, _x_i1, _x_i2) - | StDir (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in StDir (_x, _x_i1, _x_i2) - | StExc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#meta_option (fun o -> o#ident) _x_i2 - in StExc (_x, _x_i1, _x_i2) - | StExp (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in StExp (_x, _x_i1) - | StExt (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#meta_list (fun o -> o#string) _x_i3 - in StExt (_x, _x_i1, _x_i2, _x_i3) - | StInc (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in StInc (_x, _x_i1) - | StMod (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_expr _x_i2 - in StMod (_x, _x_i1, _x_i2) - | StRecMod (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 - in StRecMod (_x, _x_i1) - | StMty (_x, _x_i1, _x_i2) -> - 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) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in StOpn (_x, _x_i1) - | 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) -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in StVal (_x, _x_i1, _x_i2) - | StAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in StAnt (_x, _x_i1) - method sig_item : sig_item -> sig_item = - function - | SgNil _x -> let _x = o#loc _x in SgNil _x - | SgCls (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in SgCls (_x, _x_i1) - | SgClt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in SgClt (_x, _x_i1) - | SgSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#sig_item _x_i1 in - let _x_i2 = o#sig_item _x_i2 - in SgSem (_x, _x_i1, _x_i2) - | SgDir (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in SgDir (_x, _x_i1, _x_i2) - | SgExc (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in SgExc (_x, _x_i1) - | SgExt (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#meta_list (fun o -> o#string) _x_i3 - in SgExt (_x, _x_i1, _x_i2, _x_i3) - | SgInc (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in SgInc (_x, _x_i1) - | SgMod (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 - in SgMod (_x, _x_i1, _x_i2) - | SgRecMod (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 - in SgRecMod (_x, _x_i1) - | SgMty (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 - in SgMty (_x, _x_i1, _x_i2) - | SgOpn (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in SgOpn (_x, _x_i1) - | SgTyp (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in SgTyp (_x, _x_i1) - | SgVal (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in SgVal (_x, _x_i1, _x_i2) - | SgAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in SgAnt (_x, _x_i1) - method row_var_flag : row_var_flag -> row_var_flag = - function - | RvRowVar -> RvRowVar - | RvNil -> RvNil - | RvAnt _x -> let _x = o#string _x in RvAnt _x - method rec_flag : rec_flag -> rec_flag = - function - | ReRecursive -> ReRecursive - | ReNil -> ReNil - | ReAnt _x -> let _x = o#string _x in ReAnt _x - method rec_binding : rec_binding -> rec_binding = - function - | RbNil _x -> let _x = o#loc _x in RbNil _x - | RbSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in - let _x_i2 = o#rec_binding _x_i2 - in RbSem (_x, _x_i1, _x_i2) - | RbEq (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#expr _x_i2 in RbEq (_x, _x_i1, _x_i2) - | RbAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in RbAnt (_x, _x_i1) - method private_flag : private_flag -> private_flag = - function - | PrPrivate -> PrPrivate - | PrNil -> PrNil - | PrAnt _x -> let _x = o#string _x in PrAnt _x - method patt : patt -> patt = - function - | PaNil _x -> let _x = o#loc _x in PaNil _x - | PaId (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in PaId (_x, _x_i1) - | PaAli (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaAli (_x, _x_i1, _x_i2) - | PaAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaAnt (_x, _x_i1) - | PaAny _x -> let _x = o#loc _x in PaAny _x - | PaApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaApp (_x, _x_i1, _x_i2) - | PaArr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in PaArr (_x, _x_i1) - | PaCom (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaCom (_x, _x_i1, _x_i2) - | PaSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaSem (_x, _x_i1, _x_i2) - | PaChr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaChr (_x, _x_i1) - | PaInt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt (_x, _x_i1) - | PaInt32 (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt32 (_x, _x_i1) - | PaInt64 (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt64 (_x, _x_i1) - | PaNativeInt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaNativeInt (_x, _x_i1) - | PaFlo (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaFlo (_x, _x_i1) - | PaLab (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in PaLab (_x, _x_i1, _x_i2) - | PaOlb (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in PaOlb (_x, _x_i1, _x_i2) - | PaOlbi (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in - let _x_i3 = o#expr _x_i3 - in PaOlbi (_x, _x_i1, _x_i2, _x_i3) - | PaOrp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaOrp (_x, _x_i1, _x_i2) - | PaRng (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaRng (_x, _x_i1, _x_i2) - | PaRec (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in PaRec (_x, _x_i1) - | PaEq (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#patt _x_i2 in PaEq (_x, _x_i1, _x_i2) - | PaStr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaStr (_x, _x_i1) - | PaTup (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in PaTup (_x, _x_i1) - | PaTyc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#ctyp _x_i2 in PaTyc (_x, _x_i1, _x_i2) - | PaTyp (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in PaTyp (_x, _x_i1) - | PaVrn (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaVrn (_x, _x_i1) - | PaLaz (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in PaLaz (_x, _x_i1) - | PaMod (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaMod (_x, _x_i1) - method override_flag : override_flag -> override_flag = - function - | OvOverride -> OvOverride - | OvNil -> OvNil - | OvAnt _x -> let _x = o#string _x in OvAnt _x - method mutable_flag : mutable_flag -> mutable_flag = - function - | MuMutable -> MuMutable - | MuNil -> MuNil - | MuAnt _x -> let _x = o#string _x in MuAnt _x - method module_type : module_type -> module_type = - function - | MtNil _x -> let _x = o#loc _x in MtNil _x - | MtId (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in MtId (_x, _x_i1) - | MtFun (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_type _x_i3 - in MtFun (_x, _x_i1, _x_i2, _x_i3) - | MtQuo (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MtQuo (_x, _x_i1) - | MtSig (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#sig_item _x_i1 in MtSig (_x, _x_i1) - | MtWit (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in - let _x_i2 = o#with_constr _x_i2 - in MtWit (_x, _x_i1, _x_i2) - | MtOf (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in MtOf (_x, _x_i1) - | MtAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MtAnt (_x, _x_i1) - method module_expr : module_expr -> module_expr = - function - | MeNil _x -> let _x = o#loc _x in MeNil _x - | MeId (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in MeId (_x, _x_i1) - | MeApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in - let _x_i2 = o#module_expr _x_i2 - in MeApp (_x, _x_i1, _x_i2) - | MeFun (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_expr _x_i3 - in MeFun (_x, _x_i1, _x_i2, _x_i3) - | MeStr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#str_item _x_i1 in MeStr (_x, _x_i1) - | MeTyc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in - let _x_i2 = o#module_type _x_i2 - in MeTyc (_x, _x_i1, _x_i2) - | MePkg (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in MePkg (_x, _x_i1) - | MeAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MeAnt (_x, _x_i1) - method module_binding : module_binding -> module_binding = - function - | MbNil _x -> let _x = o#loc _x in MbNil _x - | MbAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 in - let _x_i2 = o#module_binding _x_i2 - in MbAnd (_x, _x_i1, _x_i2) - | MbColEq (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_expr _x_i3 - in MbColEq (_x, _x_i1, _x_i2, _x_i3) - | MbCol (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 - in MbCol (_x, _x_i1, _x_i2) - | MbAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MbAnt (_x, _x_i1) - method meta_option : - 'a 'a_out. - ('self_type -> 'a -> 'a_out) -> - 'a meta_option -> 'a_out meta_option = - fun _f_a -> - function - | ONone -> ONone - | OSome _x -> let _x = _f_a o _x in OSome _x - | OAnt _x -> let _x = o#string _x in OAnt _x - method meta_list : - 'a 'a_out. - ('self_type -> 'a -> 'a_out) -> - 'a meta_list -> 'a_out meta_list = - fun _f_a -> - function - | LNil -> LNil - | LCons (_x, _x_i1) -> - let _x = _f_a o _x in - let _x_i1 = o#meta_list _f_a _x_i1 - in LCons (_x, _x_i1) - | LAnt _x -> let _x = o#string _x in LAnt _x - method meta_bool : meta_bool -> meta_bool = - function - | BTrue -> BTrue - | BFalse -> BFalse - | BAnt _x -> let _x = o#string _x in BAnt _x - method match_case : match_case -> match_case = - function - | McNil _x -> let _x = o#loc _x in McNil _x - | McOr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#match_case _x_i1 in - let _x_i2 = o#match_case _x_i2 - in McOr (_x, _x_i1, _x_i2) - | McArr (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 - in McArr (_x, _x_i1, _x_i2, _x_i3) - | McAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in McAnt (_x, _x_i1) - method loc : loc -> loc = o#unknown - method ident : ident -> ident = - function - | IdAcc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in IdAcc (_x, _x_i1, _x_i2) - | IdApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in IdApp (_x, _x_i1, _x_i2) - | IdLid (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdLid (_x, _x_i1) - | IdUid (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdUid (_x, _x_i1) - | IdAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdAnt (_x, _x_i1) - method expr : expr -> expr = - function - | ExNil _x -> let _x = o#loc _x in ExNil _x - | ExId (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in ExId (_x, _x_i1) - | ExAcc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAcc (_x, _x_i1, _x_i2) - | ExAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExAnt (_x, _x_i1) - | ExApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExApp (_x, _x_i1, _x_i2) - | ExAre (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAre (_x, _x_i1, _x_i2) - | ExArr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in ExArr (_x, _x_i1) - | ExSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExSem (_x, _x_i1, _x_i2) - | ExAsf _x -> let _x = o#loc _x in ExAsf _x - | ExAsr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in ExAsr (_x, _x_i1) - | ExAss (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAss (_x, _x_i1, _x_i2) - | ExChr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExChr (_x, _x_i1) - | ExCoe (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in ExCoe (_x, _x_i1, _x_i2, _x_i3) - | ExFlo (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExFlo (_x, _x_i1) - | ExFor (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 in - let _x_i4 = o#direction_flag _x_i4 in - let _x_i5 = o#expr _x_i5 - in ExFor (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) - | ExFun (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#match_case _x_i1 in ExFun (_x, _x_i1) - | ExIfe (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 - in ExIfe (_x, _x_i1, _x_i2, _x_i3) - | ExInt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt (_x, _x_i1) - | ExInt32 (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt32 (_x, _x_i1) - | ExInt64 (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt64 (_x, _x_i1) - | ExNativeInt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExNativeInt (_x, _x_i1) - | ExLab (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExLab (_x, _x_i1, _x_i2) - | ExLaz (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in ExLaz (_x, _x_i1) - | ExLet (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in - let _x_i3 = o#expr _x_i3 - in ExLet (_x, _x_i1, _x_i2, _x_i3) - | ExLmd (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_expr _x_i2 in - let _x_i3 = o#expr _x_i3 - in ExLmd (_x, _x_i1, _x_i2, _x_i3) - | ExMat (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#match_case _x_i2 - in ExMat (_x, _x_i1, _x_i2) - | ExNew (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in ExNew (_x, _x_i1) - | ExObj (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_str_item _x_i2 - in ExObj (_x, _x_i1, _x_i2) - | ExOlb (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExOlb (_x, _x_i1, _x_i2) - | ExOvr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in ExOvr (_x, _x_i1) - | ExRec (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in - let _x_i2 = o#expr _x_i2 in ExRec (_x, _x_i1, _x_i2) - | ExSeq (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in ExSeq (_x, _x_i1) - | ExSnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#string _x_i2 in ExSnd (_x, _x_i1, _x_i2) - | ExSte (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExSte (_x, _x_i1, _x_i2) - | ExStr (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExStr (_x, _x_i1) - | ExTry (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#match_case _x_i2 - in ExTry (_x, _x_i1, _x_i2) - | ExTup (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in ExTup (_x, _x_i1) - | ExCom (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExCom (_x, _x_i1, _x_i2) - | ExTyc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#ctyp _x_i2 in ExTyc (_x, _x_i1, _x_i2) - | ExVrn (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExVrn (_x, _x_i1) - | ExWhi (_x, _x_i1, _x_i2) -> - 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) -> - 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) - | ExFUN (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExFUN (_x, _x_i1, _x_i2) - | ExPkg (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in ExPkg (_x, _x_i1) - method direction_flag : direction_flag -> direction_flag = - function - | DiTo -> DiTo - | DiDownto -> DiDownto - | DiAnt _x -> let _x = o#string _x in DiAnt _x - method ctyp : ctyp -> ctyp = - function - | TyNil _x -> let _x = o#loc _x in TyNil _x - | TyAli (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAli (_x, _x_i1, _x_i2) - | TyAny _x -> let _x = o#loc _x in TyAny _x - | TyApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyApp (_x, _x_i1, _x_i2) - | TyArr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyArr (_x, _x_i1, _x_i2) - | TyCls (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in TyCls (_x, _x_i1) - | TyLab (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyLab (_x, _x_i1, _x_i2) - | TyId (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in TyId (_x, _x_i1) - | TyMan (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyMan (_x, _x_i1, _x_i2) - | TyDcl (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#list (fun o -> o#ctyp) _x_i2 in - let _x_i3 = o#ctyp _x_i3 in - let _x_i4 = - o#list - (fun o (_x, _x_i1) -> - let _x = o#ctyp _x in - let _x_i1 = o#ctyp _x_i1 in (_x, _x_i1)) - _x_i4 - in TyDcl (_x, _x_i1, _x_i2, _x_i3, _x_i4) - | TyObj (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#row_var_flag _x_i2 - in TyObj (_x, _x_i1, _x_i2) - | TyOlb (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOlb (_x, _x_i1, _x_i2) - | TyPol (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyPol (_x, _x_i1, _x_i2) - | TyTypePol (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 - in TyTypePol (_x, _x_i1, _x_i2) - | TyQuo (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuo (_x, _x_i1) - | TyQuP (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuP (_x, _x_i1) - | TyQuM (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuM (_x, _x_i1) - | TyAnP _x -> let _x = o#loc _x in TyAnP _x - | TyAnM _x -> let _x = o#loc _x in TyAnM _x - | TyVrn (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyVrn (_x, _x_i1) - | TyRec (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyRec (_x, _x_i1) - | TyCol (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyCol (_x, _x_i1, _x_i2) - | TySem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TySem (_x, _x_i1, _x_i2) - | TyCom (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyCom (_x, _x_i1, _x_i2) - | TySum (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TySum (_x, _x_i1) - | TyOf (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOf (_x, _x_i1, _x_i2) - | TyAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAnd (_x, _x_i1, _x_i2) - | TyOr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOr (_x, _x_i1, _x_i2) - | TyPrv (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyPrv (_x, _x_i1) - | TyMut (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyMut (_x, _x_i1) - | TyTup (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyTup (_x, _x_i1) - | TySta (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TySta (_x, _x_i1, _x_i2) - | TyVrnEq (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnEq (_x, _x_i1) - | TyVrnSup (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnSup (_x, _x_i1) - | TyVrnInf (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnInf (_x, _x_i1) - | TyVrnInfSup (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 - in TyVrnInfSup (_x, _x_i1, _x_i2) - | TyAmp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAmp (_x, _x_i1, _x_i2) - | TyOfAmp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOfAmp (_x, _x_i1, _x_i2) - | TyPkg (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in TyPkg (_x, _x_i1) - | TyAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyAnt (_x, _x_i1) - method class_type : class_type -> class_type = - function - | CtNil _x -> let _x = o#loc _x in CtNil _x - | CtCon (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#virtual_flag _x_i1 in - let _x_i2 = o#ident _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CtCon (_x, _x_i1, _x_i2, _x_i3) - | CtFun (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#class_type _x_i2 - in CtFun (_x, _x_i1, _x_i2) - | CtSig (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#class_sig_item _x_i2 - in CtSig (_x, _x_i1, _x_i2) - | CtAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 - in CtAnd (_x, _x_i1, _x_i2) - | CtCol (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 - in CtCol (_x, _x_i1, _x_i2) - | CtEq (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 - in CtEq (_x, _x_i1, _x_i2) - | CtAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CtAnt (_x, _x_i1) - method class_str_item : class_str_item -> class_str_item = - function - | CrNil _x -> let _x = o#loc _x in CrNil _x - | CrSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_str_item _x_i1 in - let _x_i2 = o#class_str_item _x_i2 - in CrSem (_x, _x_i1, _x_i2) - | CrCtr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in CrCtr (_x, _x_i1, _x_i2) - | CrInh (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#override_flag _x_i1 in - let _x_i2 = o#class_expr _x_i2 in - let _x_i3 = o#string _x_i3 - in CrInh (_x, _x_i1, _x_i2, _x_i3) - | CrIni (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in CrIni (_x, _x_i1) - | CrMth (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#override_flag _x_i2 in - let _x_i3 = o#private_flag _x_i3 in - let _x_i4 = o#expr _x_i4 in - let _x_i5 = o#ctyp _x_i5 - in CrMth (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) - | CrVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#override_flag _x_i2 in - let _x_i3 = o#mutable_flag _x_i3 in - let _x_i4 = o#expr _x_i4 - in CrVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) - | CrVir (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CrVir (_x, _x_i1, _x_i2, _x_i3) - | CrVvr (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#mutable_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CrVvr (_x, _x_i1, _x_i2, _x_i3) - | CrAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CrAnt (_x, _x_i1) - method class_sig_item : class_sig_item -> class_sig_item = - function - | CgNil _x -> let _x = o#loc _x in CgNil _x - | CgCtr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in CgCtr (_x, _x_i1, _x_i2) - | CgSem (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_sig_item _x_i1 in - let _x_i2 = o#class_sig_item _x_i2 - in CgSem (_x, _x_i1, _x_i2) - | CgInh (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in CgInh (_x, _x_i1) - | CgMth (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CgMth (_x, _x_i1, _x_i2, _x_i3) - | CgVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#mutable_flag _x_i2 in - let _x_i3 = o#virtual_flag _x_i3 in - let _x_i4 = o#ctyp _x_i4 - in CgVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) - | CgVir (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CgVir (_x, _x_i1, _x_i2, _x_i3) - | CgAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CgAnt (_x, _x_i1) - method class_expr : class_expr -> class_expr = - function - | CeNil _x -> let _x = o#loc _x in CeNil _x - | CeApp (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#expr _x_i2 in CeApp (_x, _x_i1, _x_i2) - | CeCon (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#virtual_flag _x_i1 in - let _x_i2 = o#ident _x_i2 in - let _x_i3 = o#ctyp _x_i3 - in CeCon (_x, _x_i1, _x_i2, _x_i3) - | CeFun (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_expr _x_i2 - in CeFun (_x, _x_i1, _x_i2) - | CeLet (_x, _x_i1, _x_i2, _x_i3) -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in - let _x_i3 = o#class_expr _x_i3 - in CeLet (_x, _x_i1, _x_i2, _x_i3) - | CeStr (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_str_item _x_i2 - in CeStr (_x, _x_i1, _x_i2) - | CeTyc (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_type _x_i2 - in CeTyc (_x, _x_i1, _x_i2) - | CeAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_expr _x_i2 - in CeAnd (_x, _x_i1, _x_i2) - | CeEq (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_expr _x_i2 - in CeEq (_x, _x_i1, _x_i2) - | CeAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CeAnt (_x, _x_i1) - method binding : binding -> binding = - function - | BiNil _x -> let _x = o#loc _x in BiNil _x - | BiAnd (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#binding _x_i1 in - let _x_i2 = o#binding _x_i2 in BiAnd (_x, _x_i1, _x_i2) - | BiEq (_x, _x_i1, _x_i2) -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#expr _x_i2 in BiEq (_x, _x_i1, _x_i2) - | BiAnt (_x, _x_i1) -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in BiAnt (_x, _x_i1) - method unknown : 'a. 'a -> 'a = fun x -> x - end - - class fold = - object ((o : 'self_type)) - method string : string -> 'self_type = o#unknown - method list : - 'a. - ('self_type -> 'a -> 'self_type) -> 'a list -> 'self_type = - fun _f_a -> - function - | [] -> o - | _x :: _x_i1 -> - let o = _f_a o _x in let o = o#list _f_a _x_i1 in o - method with_constr : with_constr -> 'self_type = - function - | WcNil _x -> let o = o#loc _x in o - | WcTyp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | WcMod (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | WcTyS (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | WcMoS (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | WcAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#with_constr _x_i1 in - let o = o#with_constr _x_i2 in o - | WcAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method virtual_flag : virtual_flag -> 'self_type = - function - | ViVirtual -> o - | ViNil -> o - | ViAnt _x -> let o = o#string _x in o - method str_item : str_item -> 'self_type = - function - | StNil _x -> let o = o#loc _x in o - | StCls (_x, _x_i1) -> - let o = o#loc _x in let o = o#class_expr _x_i1 in o - | StClt (_x, _x_i1) -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | StSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#str_item _x_i1 in - let o = o#str_item _x_i2 in o - | StDir (_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 - | StExc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in - let o = o#meta_option (fun o -> o#ident) _x_i2 in o - | StExp (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | StExt (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#ctyp _x_i2 in - let o = o#meta_list (fun o -> o#string) _x_i3 in o - | StInc (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o - | StMod (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_expr _x_i2 in o - | StRecMod (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_binding _x_i1 in o - | 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 - | 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 - let o = o#rec_flag _x_i1 in - let o = o#binding _x_i2 in o - | StAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method sig_item : sig_item -> 'self_type = - function - | SgNil _x -> let o = o#loc _x in o - | SgCls (_x, _x_i1) -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | SgClt (_x, _x_i1) -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | SgSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#sig_item _x_i1 in - let o = o#sig_item _x_i2 in o - | SgDir (_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 - | SgExc (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | SgExt (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#ctyp _x_i2 in - let o = o#meta_list (fun o -> o#string) _x_i3 in o - | SgInc (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_type _x_i1 in o - | SgMod (_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 - | SgRecMod (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_binding _x_i1 in o - | SgMty (_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 - | SgOpn (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | SgTyp (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | SgVal (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | SgAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method row_var_flag : row_var_flag -> 'self_type = - function - | RvRowVar -> o - | RvNil -> o - | RvAnt _x -> let o = o#string _x in o - method rec_flag : rec_flag -> 'self_type = - function - | ReRecursive -> o - | ReNil -> o - | ReAnt _x -> let o = o#string _x in o - method rec_binding : rec_binding -> 'self_type = - function - | RbNil _x -> let o = o#loc _x in o - | RbSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#rec_binding _x_i1 in - let o = o#rec_binding _x_i2 in o - | RbEq (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 in o - | RbAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method private_flag : private_flag -> 'self_type = - function - | PrPrivate -> o - | PrNil -> o - | PrAnt _x -> let o = o#string _x in o - method patt : patt -> 'self_type = - function - | PaNil _x -> let o = o#loc _x in o - | PaId (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | PaAli (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaAny _x -> let o = o#loc _x in o - | PaApp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaArr (_x, _x_i1) -> - let o = o#loc _x in let o = o#patt _x_i1 in o - | PaCom (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaChr (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt32 (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt64 (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaNativeInt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaFlo (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaLab (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#patt _x_i2 in o - | PaOlb (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#patt _x_i2 in o - | PaOlbi (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#patt _x_i2 in let o = o#expr _x_i3 in o - | PaOrp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaRng (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaRec (_x, _x_i1) -> - let o = o#loc _x in let o = o#patt _x_i1 in o - | PaEq (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#patt _x_i2 in o - | PaStr (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaTup (_x, _x_i1) -> - let o = o#loc _x in let o = o#patt _x_i1 in o - | PaTyc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#ctyp _x_i2 in o - | PaTyp (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | PaVrn (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaLaz (_x, _x_i1) -> - let o = o#loc _x in let o = o#patt _x_i1 in o - | PaMod (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method override_flag : override_flag -> 'self_type = - function - | OvOverride -> o - | OvNil -> o - | OvAnt _x -> let o = o#string _x in o - method mutable_flag : mutable_flag -> 'self_type = - function - | MuMutable -> o - | MuNil -> o - | MuAnt _x -> let o = o#string _x in o - method module_type : module_type -> 'self_type = - function - | MtNil _x -> let o = o#loc _x in o - | MtId (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | MtFun (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in - let o = o#module_type _x_i3 in o - | MtQuo (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | MtSig (_x, _x_i1) -> - let o = o#loc _x in let o = o#sig_item _x_i1 in o - | MtWit (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#module_type _x_i1 in - let o = o#with_constr _x_i2 in o - | MtOf (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o - | MtAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method module_expr : module_expr -> 'self_type = - function - | MeNil _x -> let o = o#loc _x in o - | MeId (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | MeApp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#module_expr _x_i1 in - let o = o#module_expr _x_i2 in o - | MeFun (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in - let o = o#module_expr _x_i3 in o - | MeStr (_x, _x_i1) -> - let o = o#loc _x in let o = o#str_item _x_i1 in o - | MeTyc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#module_expr _x_i1 in - let o = o#module_type _x_i2 in o - | MePkg (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | MeAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method module_binding : module_binding -> 'self_type = - function - | MbNil _x -> let o = o#loc _x in o - | MbAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#module_binding _x_i1 in - let o = o#module_binding _x_i2 in o - | MbColEq (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in - let o = o#module_expr _x_i3 in o - | MbCol (_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 - | MbAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method meta_option : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_option -> 'self_type = - fun _f_a -> - function - | ONone -> o - | OSome _x -> let o = _f_a o _x in o - | OAnt _x -> let o = o#string _x in o - method meta_list : - 'a. - ('self_type -> 'a -> 'self_type) -> - 'a meta_list -> 'self_type = - fun _f_a -> - function - | LNil -> o - | LCons (_x, _x_i1) -> - let o = _f_a o _x in - let o = o#meta_list _f_a _x_i1 in o - | LAnt _x -> let o = o#string _x in o - method meta_bool : meta_bool -> 'self_type = - function - | BTrue -> o - | BFalse -> o - | BAnt _x -> let o = o#string _x in o - method match_case : match_case -> 'self_type = - function - | McNil _x -> let o = o#loc _x in o - | McOr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#match_case _x_i1 in - let o = o#match_case _x_i2 in o - | McArr (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#patt _x_i1 in - let o = o#expr _x_i2 in let o = o#expr _x_i3 in o - | McAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method loc : loc -> 'self_type = o#unknown - method ident : ident -> 'self_type = - function - | IdAcc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | IdApp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | IdLid (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | IdUid (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | IdAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method expr : expr -> 'self_type = - function - | ExNil _x -> let o = o#loc _x in o - | ExId (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | ExAcc (_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 - | ExAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExApp (_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 - | ExAre (_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 - | ExArr (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | ExSem (_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 - | ExAsf _x -> let o = o#loc _x in o - | ExAsr (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | ExAss (_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 - | ExChr (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExCoe (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#expr _x_i1 in - let o = o#ctyp _x_i2 in let o = o#ctyp _x_i3 in o - | ExFlo (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExFor (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#expr _x_i2 in - let o = o#expr _x_i3 in - let o = o#direction_flag _x_i4 in - let o = o#expr _x_i5 in o - | ExFun (_x, _x_i1) -> - let o = o#loc _x in let o = o#match_case _x_i1 in o - | ExIfe (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#expr _x_i1 in - let o = o#expr _x_i2 in let o = o#expr _x_i3 in o - | ExInt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExInt32 (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExInt64 (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExNativeInt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExLab (_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 - | ExLaz (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | ExLet (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#rec_flag _x_i1 in - let o = o#binding _x_i2 in let o = o#expr _x_i3 in o - | ExLmd (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_expr _x_i2 in - let o = o#expr _x_i3 in o - | ExMat (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#match_case _x_i2 in o - | ExNew (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | ExObj (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in - let o = o#class_str_item _x_i2 in o - | ExOlb (_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 - | ExOvr (_x, _x_i1) -> - let o = o#loc _x in let o = o#rec_binding _x_i1 in o - | ExRec (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#rec_binding _x_i1 in - let o = o#expr _x_i2 in o - | ExSeq (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | ExSnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#string _x_i2 in o - | ExSte (_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 - | ExStr (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExTry (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#match_case _x_i2 in o - | ExTup (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | ExCom (_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 - | ExTyc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#ctyp _x_i2 in o - | ExVrn (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | 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) -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 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 - | ExPkg (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o - method direction_flag : direction_flag -> 'self_type = - function - | DiTo -> o - | DiDownto -> o - | DiAnt _x -> let o = o#string _x in o - method ctyp : ctyp -> 'self_type = - function - | TyNil _x -> let o = o#loc _x in o - | TyAli (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAny _x -> let o = o#loc _x in o - | TyApp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyArr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyCls (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | TyLab (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | TyId (_x, _x_i1) -> - let o = o#loc _x in let o = o#ident _x_i1 in o - | TyMan (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyDcl (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#list (fun o -> o#ctyp) _x_i2 in - let o = o#ctyp _x_i3 in - let o = - o#list - (fun o (_x, _x_i1) -> - let o = o#ctyp _x in let o = o#ctyp _x_i1 in o) - _x_i4 - in o - | TyObj (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in - let o = o#row_var_flag _x_i2 in o - | TyOlb (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | TyPol (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyTypePol (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyQuo (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | TyQuP (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | TyQuM (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | TyAnP _x -> let o = o#loc _x in o - | TyAnM _x -> let o = o#loc _x in o - | TyVrn (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - | TyRec (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyCol (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TySem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyCom (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TySum (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyOf (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyOr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyPrv (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyMut (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyTup (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TySta (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyVrnEq (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnSup (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnInf (_x, _x_i1) -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnInfSup (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAmp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyOfAmp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyPkg (_x, _x_i1) -> - let o = o#loc _x in let o = o#module_type _x_i1 in o - | TyAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method class_type : class_type -> 'self_type = - function - | CtNil _x -> let o = o#loc _x in o - | CtCon (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#virtual_flag _x_i1 in - let o = o#ident _x_i2 in let o = o#ctyp _x_i3 in o - | CtFun (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#class_type _x_i2 in o - | CtSig (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in - let o = o#class_sig_item _x_i2 in o - | CtAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_type _x_i1 in - let o = o#class_type _x_i2 in o - | CtCol (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_type _x_i1 in - let o = o#class_type _x_i2 in o - | CtEq (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_type _x_i1 in - let o = o#class_type _x_i2 in o - | CtAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method class_str_item : class_str_item -> 'self_type = - function - | CrNil _x -> let o = o#loc _x in o - | CrSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_str_item _x_i1 in - let o = o#class_str_item _x_i2 in o - | CrCtr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | CrInh (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#override_flag _x_i1 in - let o = o#class_expr _x_i2 in - let o = o#string _x_i3 in o - | CrIni (_x, _x_i1) -> - let o = o#loc _x in let o = o#expr _x_i1 in o - | CrMth (_x, _x_i1, _x_i2, _x_i3, _x_i4, _x_i5) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#override_flag _x_i2 in - let o = o#private_flag _x_i3 in - let o = o#expr _x_i4 in let o = o#ctyp _x_i5 in o - | CrVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#override_flag _x_i2 in - let o = o#mutable_flag _x_i3 in - let o = o#expr _x_i4 in o - | CrVir (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in - let o = o#ctyp _x_i3 in o - | CrVvr (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#mutable_flag _x_i2 in - let o = o#ctyp _x_i3 in o - | CrAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method class_sig_item : class_sig_item -> 'self_type = - function - | CgNil _x -> let o = o#loc _x in o - | CgCtr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | CgSem (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_sig_item _x_i1 in - let o = o#class_sig_item _x_i2 in o - | CgInh (_x, _x_i1) -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | CgMth (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in - let o = o#ctyp _x_i3 in o - | CgVal (_x, _x_i1, _x_i2, _x_i3, _x_i4) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#mutable_flag _x_i2 in - let o = o#virtual_flag _x_i3 in - let o = o#ctyp _x_i4 in o - | CgVir (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in - let o = o#ctyp _x_i3 in o - | CgAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method class_expr : class_expr -> 'self_type = - function - | CeNil _x -> let o = o#loc _x in o - | CeApp (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in let o = o#expr _x_i2 in o - | CeCon (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#virtual_flag _x_i1 in - let o = o#ident _x_i2 in let o = o#ctyp _x_i3 in o - | CeFun (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#class_expr _x_i2 in o - | CeLet (_x, _x_i1, _x_i2, _x_i3) -> - let o = o#loc _x in - let o = o#rec_flag _x_i1 in - let o = o#binding _x_i2 in - let o = o#class_expr _x_i3 in o - | CeStr (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in - let o = o#class_str_item _x_i2 in o - | CeTyc (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in - let o = o#class_type _x_i2 in o - | CeAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in - let o = o#class_expr _x_i2 in o - | CeEq (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in - let o = o#class_expr _x_i2 in o - | CeAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method binding : binding -> 'self_type = - function - | BiNil _x -> let o = o#loc _x in o - | BiAnd (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#binding _x_i1 in let o = o#binding _x_i2 in o - | BiEq (_x, _x_i1, _x_i2) -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#expr _x_i2 in o - | BiAnt (_x, _x_i1) -> - let o = o#loc _x in let o = o#string _x_i1 in o - method unknown : 'a. 'a -> 'self_type = fun _ -> o - end - - let map_expr f = - object - inherit map as super - method expr = fun x -> f (super#expr x) - end - - let map_patt f = - object - inherit map as super - method patt = fun x -> f (super#patt x) - end - - let map_ctyp f = - object - inherit map as super - method ctyp = fun x -> f (super#ctyp x) - end - - let map_str_item f = - object - inherit map as super - method str_item = fun x -> f (super#str_item x) - end - - let map_sig_item f = - object - inherit map as super - method sig_item = fun x -> f (super#sig_item x) - end - - let map_loc f = - object - inherit map as super - method loc = fun x -> f (super#loc x) - end - - end - - end - - module DynAst = - struct - module Make (Ast : Sig.Ast) : Sig.DynAst with module Ast = Ast = - struct - module Ast = Ast - - type 'a tag = - | Tag_ctyp - | Tag_patt - | Tag_expr - | Tag_module_type - | Tag_sig_item - | Tag_with_constr - | Tag_module_expr - | Tag_str_item - | Tag_class_type - | Tag_class_sig_item - | Tag_class_expr - | Tag_class_str_item - | Tag_match_case - | Tag_ident - | Tag_binding - | Tag_rec_binding - | Tag_module_binding - - let string_of_tag = - function - | Tag_ctyp -> "ctyp" - | Tag_patt -> "patt" - | Tag_expr -> "expr" - | Tag_module_type -> "module_type" - | Tag_sig_item -> "sig_item" - | Tag_with_constr -> "with_constr" - | Tag_module_expr -> "module_expr" - | Tag_str_item -> "str_item" - | Tag_class_type -> "class_type" - | Tag_class_sig_item -> "class_sig_item" - | Tag_class_expr -> "class_expr" - | Tag_class_str_item -> "class_str_item" - | Tag_match_case -> "match_case" - | Tag_ident -> "ident" - | Tag_binding -> "binding" - | Tag_rec_binding -> "rec_binding" - | Tag_module_binding -> "module_binding" - - let ctyp_tag = Tag_ctyp - - let patt_tag = Tag_patt - - let expr_tag = Tag_expr - - let module_type_tag = Tag_module_type - - let sig_item_tag = Tag_sig_item - - let with_constr_tag = Tag_with_constr - - let module_expr_tag = Tag_module_expr - - let str_item_tag = Tag_str_item - - let class_type_tag = Tag_class_type - - let class_sig_item_tag = Tag_class_sig_item - - let class_expr_tag = Tag_class_expr - - let class_str_item_tag = Tag_class_str_item - - let match_case_tag = Tag_match_case - - let ident_tag = Tag_ident - - let binding_tag = Tag_binding - - let rec_binding_tag = Tag_rec_binding - - let module_binding_tag = Tag_module_binding - - type dyn - - external dyn_tag : 'a tag -> dyn tag = "%identity" - - module Pack (X : sig type 'a t - end) = - struct - type pack = ((dyn tag) * Obj.t) - - exception Pack_error - - let pack tag v = ((dyn_tag tag), (Obj.repr v)) - - let unpack (tag : 'a tag) (tag', obj) = - if (dyn_tag tag) = tag' - then (Obj.obj obj : 'a X.t) - else raise Pack_error - - let print_tag f (tag, _) = - Format.pp_print_string f (string_of_tag tag) - - end - - end - - end - - module Quotation = - struct - module Make (Ast : Sig.Camlp4Ast) : - Sig.Quotation with module Ast = Ast = - struct - module Ast = Ast - - module DynAst = DynAst.Make(Ast) - - module Loc = Ast.Loc - - open Format - - open Sig - - type 'a expand_fun = Loc.t -> string option -> string -> 'a - - module Exp_key = DynAst.Pack(struct type 'a t = unit - end) - - module Exp_fun = - DynAst.Pack(struct type 'a t = 'a expand_fun - end) - - let expanders_table : - (((string * Exp_key.pack) * Exp_fun.pack) list) ref = ref [] - - let default = ref "" - - let translate = ref (fun x -> x) - - let expander_name name = - match !translate name with | "" -> !default | name -> name - - let find name tag = - let key = ((expander_name name), (Exp_key.pack tag ())) - in Exp_fun.unpack tag (List.assoc key !expanders_table) - - let add name tag f = - let elt = ((name, (Exp_key.pack tag ())), (Exp_fun.pack tag f)) - in expanders_table := elt :: !expanders_table - - let dump_file = ref None - - module Error = - struct - type error = - | Finding - | Expanding - | ParsingResult of Loc.t * string - | Locating - - type t = (string * string * error * exn) - - exception E of t - - let print ppf (name, position, ctx, exn) = - let name = if name = "" then !default else name in - let pp x = - fprintf ppf "@?@[<2>While %s %S in a position of %S:" x - name position in - let () = - match ctx with - | Finding -> - (pp "finding quotation"; - if !expanders_table = [] - then - fprintf ppf - "@ There is no quotation expander available." - else - (fprintf ppf - "@ @[Available quotation expanders are:@\n"; - List.iter - (fun ((s, t), _) -> - fprintf ppf - "@[<2>%s@ (in@ a@ position@ of %a)@]@ " s - Exp_key.print_tag t) - !expanders_table; - fprintf ppf "@]")) - | Expanding -> pp "expanding quotation" - | Locating -> pp "parsing" - | ParsingResult (loc, str) -> - let () = pp "parsing result of quotation" - in - (match !dump_file with - | Some dump_file -> - let () = fprintf ppf " dumping result...\n" - in - (try - let oc = open_out_bin dump_file - in - (output_string oc str; - output_string oc "\n"; - flush oc; - close_out oc; - fprintf ppf "%a:" Loc.print - (Loc.set_file_name dump_file loc)) - with - | _ -> - fprintf ppf - "Error while dumping result in file %S; dump aborted" - dump_file) - | None -> - fprintf ppf - "\n(consider setting variable Quotation.dump_file, or using the -QD option)") - in fprintf ppf "@\n%a@]@." ErrorHandler.print exn - - let to_string x = - let b = Buffer.create 50 in - let () = bprintf b "%a" print x in Buffer.contents b - - end - - let _ = let module M = ErrorHandler.Register(Error) in () - - open Error - - let expand_quotation loc expander pos_tag quot = - let loc_name_opt = - if quot.q_loc = "" then None else Some quot.q_loc - in - try expander loc loc_name_opt quot.q_contents - with | (Loc.Exc_located (_, (Error.E _)) as exc) -> raise exc - | Loc.Exc_located (iloc, exc) -> - let exc1 = - Error.E (((quot.q_name), pos_tag, Expanding, exc)) - in raise (Loc.Exc_located (iloc, exc1)) - | exc -> - let exc1 = - Error.E (((quot.q_name), pos_tag, Expanding, exc)) - in raise (Loc.Exc_located (loc, exc1)) - - let parse_quotation_result parse loc quot pos_tag str = - try parse loc str - with - | Loc.Exc_located (iloc, - (Error.E ((n, pos_tag, Expanding, exc)))) -> - let ctx = ParsingResult (iloc, quot.q_contents) in - let exc1 = Error.E ((n, pos_tag, ctx, exc)) - in raise (Loc.Exc_located (iloc, exc1)) - | Loc.Exc_located (iloc, ((Error.E _ as exc))) -> - raise (Loc.Exc_located (iloc, exc)) - | Loc.Exc_located (iloc, exc) -> - let ctx = ParsingResult (iloc, quot.q_contents) in - let exc1 = Error.E (((quot.q_name), pos_tag, ctx, exc)) - in raise (Loc.Exc_located (iloc, exc1)) - - let expand loc quotation tag = - let pos_tag = DynAst.string_of_tag tag in - let name = quotation.q_name in - let expander = - try find name tag - with | (Loc.Exc_located (_, (Error.E _)) as exc) -> raise exc - | Loc.Exc_located (qloc, exc) -> - raise - (Loc.Exc_located (qloc, - (Error.E ((name, pos_tag, Finding, exc))))) - | exc -> - raise - (Loc.Exc_located (loc, - (Error.E ((name, pos_tag, Finding, exc))))) in - let loc = Loc.join (Loc.move `start quotation.q_shift loc) - in expand_quotation loc expander pos_tag quotation - - end - - end - - module AstFilters = - struct - module Make (Ast : Sig.Camlp4Ast) : - Sig.AstFilters with module Ast = Ast = - struct - module Ast = Ast - - type 'a filter = 'a -> 'a - - let interf_filters = Queue.create () - - let fold_interf_filters f i = Queue.fold f i interf_filters - - let implem_filters = Queue.create () - - let fold_implem_filters f i = Queue.fold f i implem_filters - - let topphrase_filters = Queue.create () - - let fold_topphrase_filters f i = Queue.fold f i topphrase_filters - - let register_sig_item_filter f = Queue.add f interf_filters - - let register_str_item_filter f = Queue.add f implem_filters - - let register_topphrase_filter f = Queue.add f topphrase_filters - - end - - end - - module Camlp4Ast2OCamlAst : - sig - module Make (Camlp4Ast : Sig.Camlp4Ast) : - sig - open Camlp4Ast - - val sig_item : sig_item -> Camlp4_import.Parsetree.signature - - val str_item : str_item -> Camlp4_import.Parsetree.structure - - val phrase : str_item -> Camlp4_import.Parsetree.toplevel_phrase - - end - - end = - struct - module Make (Ast : Sig.Camlp4Ast) = - struct - open Format - - open Camlp4_import.Parsetree - - open Camlp4_import.Longident - - open Camlp4_import.Asttypes - - open Ast - - let constructors_arity () = !Camlp4_config.constructors_arity - - let error loc str = Loc.raise loc (Failure str) - - let char_of_char_token loc s = - try Token.Eval.char s - with | (Failure _ as exn) -> Loc.raise loc exn - - let string_of_string_token loc s = - try Token.Eval.string s - with | (Failure _ as exn) -> Loc.raise loc exn - - let remove_underscores s = - let l = String.length s in - let rec remove src dst = - if src >= l - then if dst >= l then s else String.sub s 0 dst - else - (match s.[src] with - | '_' -> remove (src + 1) dst - | c -> (s.[dst] <- c; remove (src + 1) (dst + 1))) - in remove 0 0 - - let mkloc = Loc.to_ocaml_location - - let mkghloc loc = Loc.to_ocaml_location (Loc.ghostify loc) - - let with_loc txt loc = - Camlp4_import.Location.mkloc txt (mkloc loc) - - let mktyp loc d = { ptyp_desc = d; ptyp_loc = mkloc loc; } - - let mkpat loc d = { ppat_desc = d; ppat_loc = mkloc loc; } - - let mkghpat loc d = { ppat_desc = d; ppat_loc = mkghloc loc; } - - let mkexp loc d = { pexp_desc = d; pexp_loc = mkloc loc; } - - let mkmty loc d = { pmty_desc = d; pmty_loc = mkloc loc; } - - let mksig loc d = { psig_desc = d; psig_loc = mkloc loc; } - - let mkmod loc d = { pmod_desc = d; pmod_loc = mkloc loc; } - - let mkstr loc d = { pstr_desc = d; pstr_loc = mkloc loc; } - - let mkfield loc d = { pfield_desc = d; pfield_loc = mkloc loc; } - - let mkcty loc d = { pcty_desc = d; pcty_loc = mkloc loc; } - - let mkcl loc d = { pcl_desc = d; pcl_loc = mkloc loc; } - - let mkcf loc d = { pcf_desc = d; pcf_loc = mkloc loc; } - - let mkctf loc d = { pctf_desc = d; pctf_loc = mkloc loc; } - - let mkpolytype t = - match t.ptyp_desc with - | Ptyp_poly (_, _) -> t - | _ -> { (t) with ptyp_desc = Ptyp_poly ([], t); } - - let mkvirtual = - function - | Ast.ViVirtual -> Virtual - | Ast.ViNil -> Concrete - | _ -> assert false - - let mkdirection = - function - | Ast.DiTo -> Upto - | Ast.DiDownto -> Downto - | _ -> assert false - - let lident s = Lident s - - let lident_with_loc s loc = with_loc (Lident s) loc - - let ldot l s = Ldot (l, s) - - let lapply l s = Lapply (l, s) - - let conv_con = - let t = Hashtbl.create 73 - in - (List.iter (fun (s, s') -> Hashtbl.add t s s') - [ ("True", "true"); ("False", "false"); (" True", "True"); - (" False", "False") ]; - fun s -> try Hashtbl.find t s with | Not_found -> s) - - let conv_lab = - let t = Hashtbl.create 73 - in - (List.iter (fun (s, s') -> Hashtbl.add t s s') - [ ("val", "contents") ]; - fun s -> try Hashtbl.find t s with | Not_found -> s) - - let array_function_no_loc str name = - ldot (lident str) - (if !Camlp4_config.unsafe then "unsafe_" ^ name else name) - - let array_function loc str name = - with_loc (array_function_no_loc str name) loc - - let mkrf = - function - | Ast.ReRecursive -> Recursive - | Ast.ReNil -> Nonrecursive - | _ -> assert false - - let mkli sloc s list = - let rec loop f = - function | i :: il -> loop (ldot (f i)) il | [] -> f s - in with_loc (loop lident list) sloc - - let rec ctyp_fa al = - function - | TyApp (_, f, a) -> ctyp_fa (a :: al) f - | f -> (f, al) - - let ident_tag ?(conv_lid = fun x -> x) i = - let rec self i acc = - match i with - | Ast.IdAcc (_, (Ast.IdLid (_, "*predef*")), - (Ast.IdLid (_, "option"))) -> - ((ldot (lident "*predef*") "option"), `lident) - | Ast.IdAcc (_, i1, i2) -> self i2 (Some (self i1 acc)) - | Ast.IdApp (_, i1, i2) -> - let i' = - Lapply ((fst (self i1 None)), (fst (self i2 None))) in - let x = - (match acc with - | None -> i' - | _ -> - error (loc_of_ident i) "invalid long identifier") - in (x, `app) - | Ast.IdUid (_, s) -> - let x = - (match acc with - | None -> lident s - | Some ((acc, (`uident | `app))) -> ldot acc s - | _ -> - error (loc_of_ident i) "invalid long identifier") - in (x, `uident) - | Ast.IdLid (_, s) -> - let x = - (match acc with - | None -> lident (conv_lid s) - | Some ((acc, (`uident | `app))) -> - ldot acc (conv_lid s) - | _ -> - error (loc_of_ident i) "invalid long identifier") - in (x, `lident) - | _ -> error (loc_of_ident i) "invalid long identifier" - in self i None - - let ident_noloc ?conv_lid i = fst (ident_tag ?conv_lid i) - - let ident ?conv_lid i = - with_loc (ident_noloc ?conv_lid i) (loc_of_ident i) - - let long_lident msg id = - match ident_tag id with - | (i, `lident) -> with_loc i (loc_of_ident id) - | _ -> error (loc_of_ident id) msg - - let long_type_ident = long_lident "invalid long identifier type" - - let long_class_ident = long_lident "invalid class name" - - let long_uident_noloc ?(conv_con = fun x -> x) i = - match ident_tag i with - | (Ldot (i, s), `uident) -> ldot i (conv_con s) - | (Lident s, `uident) -> lident (conv_con s) - | (i, `app) -> i - | _ -> error (loc_of_ident i) "uppercase identifier expected" - - let long_uident ?conv_con i = - with_loc (long_uident_noloc ?conv_con i) (loc_of_ident i) - - let rec ctyp_long_id_prefix t = - match t with - | Ast.TyId (_, i) -> ident_noloc i - | Ast.TyApp (_, m1, m2) -> - let li1 = ctyp_long_id_prefix m1 in - let li2 = ctyp_long_id_prefix m2 in Lapply (li1, li2) - | t -> error (loc_of_ctyp t) "invalid module expression" - - let ctyp_long_id t = - match t with - | Ast.TyId (_, i) -> (false, (long_type_ident i)) - | TyApp (loc, _, _) -> error loc "invalid type name" - | TyCls (_, i) -> (true, (ident i)) - | t -> error (loc_of_ctyp t) "invalid type" - - let rec ty_var_list_of_ctyp = - function - | Ast.TyApp (_, t1, t2) -> - (ty_var_list_of_ctyp t1) @ (ty_var_list_of_ctyp t2) - | Ast.TyQuo (_, s) -> [ s ] - | _ -> assert false - - let predef_option loc = - TyId - ((loc, - (IdAcc - ((loc, (IdLid ((loc, "*predef*"))), - (IdLid ((loc, "option")))))))) - - let rec ctyp = - function - | TyId (loc, i) -> - let li = long_type_ident i - in mktyp loc (Ptyp_constr (li, [])) - | TyAli (loc, t1, t2) -> - let (t, i) = - (match (t1, t2) with - | (t, TyQuo (_, s)) -> (t, s) - | (TyQuo (_, s), t) -> (t, s) - | _ -> error loc "invalid alias type") - in mktyp loc (Ptyp_alias ((ctyp t), i)) - | TyAny loc -> mktyp loc Ptyp_any - | (TyApp (loc, _, _) as f) -> - let (f, al) = ctyp_fa [] f in - let (is_cls, li) = ctyp_long_id f - in - if is_cls - then mktyp loc (Ptyp_class (li, (List.map ctyp al), [])) - else mktyp loc (Ptyp_constr (li, (List.map ctyp al))) - | TyArr (loc, (TyLab (_, lab, t1)), t2) -> - mktyp loc (Ptyp_arrow (lab, (ctyp t1), (ctyp t2))) - | TyArr (loc, (TyOlb (loc1, lab, t1)), t2) -> - let t1 = TyApp (loc1, (predef_option loc1), t1) - in - mktyp loc - (Ptyp_arrow (("?" ^ lab), (ctyp t1), (ctyp t2))) - | TyArr (loc, t1, t2) -> - mktyp loc (Ptyp_arrow ("", (ctyp t1), (ctyp t2))) - | Ast.TyObj (loc, fl, Ast.RvNil) -> - mktyp loc (Ptyp_object (meth_list fl [])) - | Ast.TyObj (loc, fl, Ast.RvRowVar) -> - mktyp loc - (Ptyp_object (meth_list fl [ mkfield loc Pfield_var ])) - | TyCls (loc, id) -> - mktyp loc (Ptyp_class ((ident id), [], [])) - | Ast.TyPkg (loc, pt) -> - let (i, cs) = package_type pt - in mktyp loc (Ptyp_package (i, cs)) - | TyLab (loc, _, _) -> - error loc "labelled type not allowed here" - | TyMan (loc, _, _) -> - error loc "manifest type not allowed here" - | TyOlb (loc, _, _) -> - error loc "labelled type not allowed here" - | TyPol (loc, t1, t2) -> - mktyp loc (Ptyp_poly ((ty_var_list_of_ctyp t1), (ctyp t2))) - | TyQuo (loc, s) -> mktyp loc (Ptyp_var s) - | TyRec (loc, _) -> error loc "record type not allowed here" - | TySum (loc, _) -> error loc "sum type not allowed here" - | TyPrv (loc, _) -> error loc "private type not allowed here" - | TyMut (loc, _) -> error loc "mutable type not allowed here" - | TyOr (loc, _, _) -> - error loc "type1 | type2 not allowed here" - | TyAnd (loc, _, _) -> - error loc "type1 and type2 not allowed here" - | TyOf (loc, _, _) -> - error loc "type1 of type2 not allowed here" - | TyCol (loc, _, _) -> - error loc "type1 : type2 not allowed here" - | TySem (loc, _, _) -> - error loc "type1 ; type2 not allowed here" - | Ast.TyTup (loc, (Ast.TySta (_, t1, t2))) -> - mktyp loc - (Ptyp_tuple - (List.map ctyp (list_of_ctyp t1 (list_of_ctyp t2 [])))) - | Ast.TyVrnEq (loc, t) -> - mktyp loc (Ptyp_variant ((row_field t), true, None)) - | Ast.TyVrnSup (loc, t) -> - mktyp loc (Ptyp_variant ((row_field t), false, None)) - | Ast.TyVrnInf (loc, t) -> - mktyp loc (Ptyp_variant ((row_field t), true, (Some []))) - | Ast.TyVrnInfSup (loc, t, t') -> - mktyp loc - (Ptyp_variant ((row_field t), true, - (Some (name_tags t')))) - | TyAnt (loc, _) -> error loc "antiquotation not allowed here" - | TyOfAmp (_, _, _) | TyAmp (_, _, _) | TySta (_, _, _) | - TyCom (_, _, _) | TyVrn (_, _) | TyQuM (_, _) | - TyQuP (_, _) | TyDcl (_, _, _, _, _) | TyAnP _ | TyAnM _ | - TyTypePol (_, _, _) | TyObj (_, _, (RvAnt _)) | TyNil _ | - TyTup (_, _) -> assert false - and row_field = - function - | Ast.TyNil _ -> [] - | Ast.TyVrn (_, i) -> [ Rtag (i, true, []) ] - | Ast.TyOfAmp (_, (Ast.TyVrn (_, i)), t) -> - [ Rtag (i, true, (List.map ctyp (list_of_ctyp t []))) ] - | Ast.TyOf (_, (Ast.TyVrn (_, i)), t) -> - [ Rtag (i, false, (List.map ctyp (list_of_ctyp t []))) ] - | Ast.TyOr (_, t1, t2) -> (row_field t1) @ (row_field t2) - | t -> [ Rinherit (ctyp t) ] - and name_tags = - function - | Ast.TyApp (_, t1, t2) -> (name_tags t1) @ (name_tags t2) - | Ast.TyVrn (_, s) -> [ s ] - | _ -> assert false - and meth_list fl acc = - match fl with - | Ast.TyNil _ -> acc - | Ast.TySem (_, t1, t2) -> meth_list t1 (meth_list t2 acc) - | Ast.TyCol (loc, (Ast.TyId (_, (Ast.IdLid (_, lab)))), t) -> - (mkfield loc (Pfield (lab, (mkpolytype (ctyp t))))) :: acc - | _ -> assert false - and package_type_constraints wc acc = - match wc with - | Ast.WcNil _ -> acc - | Ast.WcTyp (_, (Ast.TyId (_, id)), ct) -> - ((ident id), (ctyp ct)) :: acc - | Ast.WcAnd (_, wc1, wc2) -> - package_type_constraints wc1 - (package_type_constraints wc2 acc) - | _ -> - error (loc_of_with_constr wc) - "unexpected `with constraint' for a package type" - and package_type : module_type -> package_type = - function - | Ast.MtWit (_, (Ast.MtId (_, i)), wc) -> - ((long_uident i), (package_type_constraints wc [])) - | Ast.MtId (_, i) -> ((long_uident i), []) - | mt -> error (loc_of_module_type mt) "unexpected package type" - - let mktype loc tl cl tk tp tm = - let (params, variance) = List.split tl - in - { - ptype_params = params; - ptype_cstrs = cl; - ptype_kind = tk; - ptype_private = tp; - ptype_manifest = tm; - ptype_loc = mkloc loc; - ptype_variance = variance; - } - - let mkprivate' m = if m then Private else Public - - let mkprivate = - function - | Ast.PrPrivate -> Private - | Ast.PrNil -> Public - | _ -> assert false - - let mktrecord = - function - | Ast.TyCol (loc, (Ast.TyId (_, (Ast.IdLid (sloc, s)))), - (Ast.TyMut (_, t))) -> - ((with_loc s sloc), Mutable, (mkpolytype (ctyp t)), - (mkloc loc)) - | Ast.TyCol (loc, (Ast.TyId (_, (Ast.IdLid (sloc, s)))), t) -> - ((with_loc s sloc), Immutable, (mkpolytype (ctyp t)), - (mkloc loc)) - | _ -> assert false - - let mkvariant = - function - | Ast.TyId (loc, (Ast.IdUid (sloc, s))) -> - ((with_loc (conv_con s) sloc), [], None, (mkloc loc)) - | Ast.TyOf (loc, (Ast.TyId (_, (Ast.IdUid (sloc, s)))), t) -> - ((with_loc (conv_con s) sloc), - (List.map ctyp (list_of_ctyp t [])), None, (mkloc loc)) - | Ast.TyCol (loc, (Ast.TyId (_, (Ast.IdUid (sloc, s)))), - (Ast.TyArr (_, t, u))) -> - ((with_loc (conv_con s) sloc), - (List.map ctyp (list_of_ctyp t [])), (Some (ctyp u)), - (mkloc loc)) - | Ast.TyCol (loc, (Ast.TyId (_, (Ast.IdUid (sloc, s)))), t) -> - ((with_loc (conv_con s) sloc), [], (Some (ctyp t)), - (mkloc loc)) - | _ -> assert false - - let rec type_decl tl cl loc m pflag = - function - | Ast.TyMan (_, t1, t2) -> - type_decl tl cl loc (Some (ctyp t1)) pflag t2 - | Ast.TyPrv (_loc, t) -> - if pflag - then - error _loc - "multiple private keyword used, use only one instead" - else type_decl tl cl loc m true t - | Ast.TyRec (_, t) -> - mktype loc tl cl - (Ptype_record (List.map mktrecord (list_of_ctyp t []))) - (mkprivate' pflag) m - | Ast.TySum (_, t) -> - mktype loc tl cl - (Ptype_variant (List.map mkvariant (list_of_ctyp t []))) - (mkprivate' pflag) m - | t -> - if m <> None - then - error loc "only one manifest type allowed by definition" - else - (let m = - match t with - | Ast.TyNil _ -> None - | _ -> Some (ctyp t) - in mktype loc tl cl Ptype_abstract (mkprivate' pflag) m) - - let type_decl tl cl t loc = type_decl tl cl loc None false t - - let mkvalue_desc loc t p = - { pval_type = ctyp t; pval_prim = p; pval_loc = mkloc loc; } - - let rec list_of_meta_list = - function - | Ast.LNil -> [] - | Ast.LCons (x, xs) -> x :: (list_of_meta_list xs) - | Ast.LAnt _ -> assert false - - let mkmutable = - function - | Ast.MuMutable -> Mutable - | Ast.MuNil -> Immutable - | _ -> assert false - - let paolab lab p = - match (lab, p) with - | ("", - (Ast.PaId (_, (Ast.IdLid (_, i))) | - Ast.PaTyc (_, (Ast.PaId (_, (Ast.IdLid (_, i)))), _))) - -> i - | ("", p) -> error (loc_of_patt p) "bad ast in label" - | _ -> lab - - let opt_private_ctyp = - function - | Ast.TyPrv (_, t) -> (Ptype_abstract, Private, (ctyp t)) - | t -> (Ptype_abstract, Public, (ctyp t)) - - let rec type_parameters t acc = - match t with - | Ast.TyApp (_, t1, t2) -> - type_parameters t1 (type_parameters t2 acc) - | Ast.TyQuP (_, s) -> (s, (true, false)) :: acc - | Ast.TyQuM (_, s) -> (s, (false, true)) :: acc - | Ast.TyQuo (_, s) -> (s, (false, false)) :: acc - | _ -> assert false - - let rec optional_type_parameters t acc = - match t with - | Ast.TyApp (_, t1, t2) -> - optional_type_parameters t1 - (optional_type_parameters t2 acc) - | Ast.TyQuP (loc, s) -> - ((Some (with_loc s loc)), (true, false)) :: acc - | Ast.TyAnP _loc -> (None, (true, false)) :: acc - | Ast.TyQuM (loc, s) -> - ((Some (with_loc s loc)), (false, true)) :: acc - | Ast.TyAnM _loc -> (None, (false, true)) :: acc - | Ast.TyQuo (loc, s) -> - ((Some (with_loc s loc)), (false, false)) :: acc - | Ast.TyAny _loc -> (None, (false, false)) :: acc - | _ -> assert false - - let rec class_parameters t acc = - match t with - | Ast.TyCom (_, t1, t2) -> - class_parameters t1 (class_parameters t2 acc) - | Ast.TyQuP (loc, s) -> - ((with_loc s loc), (true, false)) :: acc - | Ast.TyQuM (loc, s) -> - ((with_loc s loc), (false, true)) :: acc - | Ast.TyQuo (loc, s) -> - ((with_loc s loc), (false, false)) :: acc - | _ -> assert false - - let rec type_parameters_and_type_name t acc = - match t with - | Ast.TyApp (_, t1, t2) -> - type_parameters_and_type_name t1 - (optional_type_parameters t2 acc) - | Ast.TyId (_, i) -> ((ident i), acc) - | _ -> assert false - - let mkwithtyp pwith_type loc id_tpl ct = - let (id, tpl) = type_parameters_and_type_name id_tpl [] in - let (params, variance) = List.split tpl in - let (kind, priv, ct) = opt_private_ctyp ct - in - (id, - (pwith_type - { - ptype_params = params; - ptype_cstrs = []; - ptype_kind = kind; - ptype_private = priv; - ptype_manifest = Some ct; - ptype_loc = mkloc loc; - ptype_variance = variance; - })) - - let rec mkwithc wc acc = - match wc with - | Ast.WcNil _ -> acc - | Ast.WcTyp (loc, id_tpl, ct) -> - (mkwithtyp (fun x -> Pwith_type x) loc id_tpl ct) :: acc - | Ast.WcMod (_, i1, i2) -> - ((long_uident i1), (Pwith_module (long_uident i2))) :: acc - | Ast.WcTyS (loc, id_tpl, ct) -> - (mkwithtyp (fun x -> Pwith_typesubst x) loc id_tpl ct) :: - acc - | Ast.WcMoS (_, i1, i2) -> - ((long_uident i1), (Pwith_modsubst (long_uident i2))) :: - acc - | Ast.WcAnd (_, wc1, wc2) -> mkwithc wc1 (mkwithc wc2 acc) - | Ast.WcAnt (loc, _) -> - error loc "bad with constraint (antiquotation)" - - let rec patt_fa al = - function - | PaApp (_, f, a) -> patt_fa (a :: al) f - | f -> (f, al) - - let rec deep_mkrangepat loc c1 c2 = - if c1 = c2 - then mkghpat loc (Ppat_constant (Const_char c1)) - else - mkghpat loc - (Ppat_or ((mkghpat loc (Ppat_constant (Const_char c1))), - (deep_mkrangepat loc (Char.chr ((Char.code c1) + 1)) c2))) - - let rec mkrangepat loc c1 c2 = - if c1 > c2 - then mkrangepat loc c2 c1 - else - if c1 = c2 - then mkpat loc (Ppat_constant (Const_char c1)) - else - mkpat loc - (Ppat_or ((mkghpat loc (Ppat_constant (Const_char c1))), - (deep_mkrangepat loc (Char.chr ((Char.code c1) + 1)) - c2))) - - let rec patt = - function - | Ast.PaId (loc, (Ast.IdLid (sloc, s))) -> - mkpat loc (Ppat_var (with_loc s sloc)) - | Ast.PaId (loc, i) -> - let p = - Ppat_construct ((long_uident ~conv_con i), None, - (constructors_arity ())) - in mkpat loc p - | PaAli (loc, p1, p2) -> - let (p, i) = - (match (p1, p2) with - | (p, Ast.PaId (_, (Ast.IdLid (sloc, s)))) -> - (p, (with_loc s sloc)) - | (Ast.PaId (_, (Ast.IdLid (sloc, s))), p) -> - (p, (with_loc s sloc)) - | _ -> error loc "invalid alias pattern") - in mkpat loc (Ppat_alias ((patt p), i)) - | PaAnt (loc, _) -> error loc "antiquotation not allowed here" - | PaAny loc -> mkpat loc Ppat_any - | Ast.PaApp (loc, (Ast.PaId (_, (Ast.IdUid (sloc, s)))), - (Ast.PaTup (_, (Ast.PaAny loc_any)))) -> - mkpat loc - (Ppat_construct ((lident_with_loc (conv_con s) sloc), - (Some (mkpat loc_any Ppat_any)), false)) - | (PaApp (loc, _, _) as f) -> - let (f, al) = patt_fa [] f in - let al = List.map patt al - in - (match (patt f).ppat_desc with - | Ppat_construct (li, None, _) -> - if constructors_arity () - then - mkpat loc - (Ppat_construct (li, - (Some (mkpat loc (Ppat_tuple al))), true)) - else - (let a = - match al with - | [ a ] -> a - | _ -> mkpat loc (Ppat_tuple al) - in - mkpat loc - (Ppat_construct (li, (Some a), false))) - | Ppat_variant (s, None) -> - let a = - if constructors_arity () - then mkpat loc (Ppat_tuple al) - else - (match al with - | [ a ] -> a - | _ -> mkpat loc (Ppat_tuple al)) - in mkpat loc (Ppat_variant (s, (Some a))) - | _ -> - error (loc_of_patt f) - "this is not a constructor, it cannot be applied in a pattern") - | PaArr (loc, p) -> - mkpat loc (Ppat_array (List.map patt (list_of_patt p []))) - | PaChr (loc, s) -> - mkpat loc - (Ppat_constant (Const_char (char_of_char_token loc s))) - | PaInt (loc, s) -> - let i = - (try int_of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int") - in mkpat loc (Ppat_constant (Const_int i)) - | PaInt32 (loc, s) -> - let i32 = - (try Int32.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int32") - in mkpat loc (Ppat_constant (Const_int32 i32)) - | PaInt64 (loc, s) -> - let i64 = - (try Int64.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int64") - in mkpat loc (Ppat_constant (Const_int64 i64)) - | PaNativeInt (loc, s) -> - let nati = - (try Nativeint.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type nativeint") - in mkpat loc (Ppat_constant (Const_nativeint nati)) - | PaFlo (loc, s) -> - mkpat loc - (Ppat_constant (Const_float (remove_underscores s))) - | PaLab (loc, _, _) -> - error loc "labeled pattern not allowed here" - | PaOlb (loc, _, _) | PaOlbi (loc, _, _, _) -> - error loc "labeled pattern not allowed here" - | PaOrp (loc, p1, p2) -> - mkpat loc (Ppat_or ((patt p1), (patt p2))) - | PaRng (loc, p1, p2) -> - (match (p1, p2) with - | (PaChr (loc1, c1), PaChr (loc2, c2)) -> - let c1 = char_of_char_token loc1 c1 in - let c2 = char_of_char_token loc2 c2 - in mkrangepat loc c1 c2 - | _ -> - error loc "range pattern allowed only for characters") - | PaRec (loc, p) -> - 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 - (Const_string (string_of_string_token loc s))) - | Ast.PaTup (loc, (Ast.PaCom (_, p1, p2))) -> - mkpat loc - (Ppat_tuple - (List.map patt (list_of_patt p1 (list_of_patt p2 [])))) - | Ast.PaTup (loc, _) -> error loc "singleton tuple pattern" - | PaTyc (loc, p, t) -> - mkpat loc (Ppat_constraint ((patt p), (ctyp t))) - | PaTyp (loc, i) -> mkpat loc (Ppat_type (long_type_ident i)) - | PaVrn (loc, s) -> - mkpat loc (Ppat_variant ((conv_con s), None)) - | PaLaz (loc, p) -> mkpat loc (Ppat_lazy (patt p)) - | PaMod (loc, m) -> mkpat loc (Ppat_unpack (with_loc m loc)) - | (PaEq (_, _, _) | PaSem (_, _, _) | PaCom (_, _, _) | PaNil _ - as p) -> error (loc_of_patt p) "invalid pattern" - and mklabpat = - function - | Ast.PaEq (_, i, p) -> - ((ident ~conv_lid: conv_lab i), (patt p)) - | p -> error (loc_of_patt p) "invalid pattern" - - let rec expr_fa al = - function - | ExApp (_, f, a) -> expr_fa (a :: al) f - | f -> (f, al) - - let rec class_expr_fa al = - function - | CeApp (_, ce, a) -> class_expr_fa (a :: al) ce - | ce -> (ce, al) - - let rec sep_expr_acc l = - function - | ExAcc (_, e1, e2) -> sep_expr_acc (sep_expr_acc l e2) e1 - | (Ast.ExId (loc, (Ast.IdUid (_, s))) as e) -> - (match l with - | [] -> [ (loc, [], e) ] - | (loc', sl, e) :: l -> - ((Loc.merge loc loc'), (s :: sl), e) :: l) - | Ast.ExId (_, ((Ast.IdAcc (_, _, _) as i))) -> - let rec normalize_acc = - (function - | Ast.IdAcc (_loc, i1, i2) -> - Ast.ExAcc (_loc, (normalize_acc i1), - (normalize_acc i2)) - | Ast.IdApp (_loc, i1, i2) -> - Ast.ExApp (_loc, (normalize_acc i1), - (normalize_acc i2)) - | (Ast.IdAnt (_loc, _) | Ast.IdUid (_loc, _) | - Ast.IdLid (_loc, _) - as i) -> Ast.ExId (_loc, i)) - in sep_expr_acc l (normalize_acc i) - | e -> ((loc_of_expr e), [], e) :: l - - let override_flag loc = - function - | Ast.OvOverride -> Override - | Ast.OvNil -> Fresh - | _ -> error loc "antiquotation not allowed here" - - let list_of_opt_ctyp ot acc = - match ot with | Ast.TyNil _ -> acc | t -> list_of_ctyp t acc - - let varify_constructors var_names = - let rec loop t = - let desc = - match t.ptyp_desc with - | Ptyp_any -> Ptyp_any - | Ptyp_var x -> Ptyp_var x - | Ptyp_arrow (label, core_type, core_type') -> - Ptyp_arrow (label, (loop core_type), (loop core_type')) - | Ptyp_tuple lst -> Ptyp_tuple (List.map loop lst) - | Ptyp_constr ({ txt = Lident s }, []) when - List.mem s var_names -> Ptyp_var ("&" ^ s) - | Ptyp_constr (longident, lst) -> - Ptyp_constr (longident, (List.map loop lst)) - | Ptyp_object lst -> - Ptyp_object (List.map loop_core_field lst) - | Ptyp_class (longident, lst, lbl_list) -> - Ptyp_class ((longident, (List.map loop lst), lbl_list)) - | Ptyp_alias (core_type, string) -> - Ptyp_alias (((loop core_type), string)) - | Ptyp_variant (row_field_list, flag, lbl_lst_option) -> - Ptyp_variant - (((List.map loop_row_field row_field_list), flag, - lbl_lst_option)) - | Ptyp_poly (string_lst, core_type) -> - Ptyp_poly ((string_lst, (loop core_type))) - | Ptyp_package (longident, lst) -> - Ptyp_package - ((longident, - (List.map (fun (n, typ) -> (n, (loop typ))) lst))) - in { (t) with ptyp_desc = desc; } - and loop_core_field t = - let desc = - match t.pfield_desc with - | Pfield ((n, typ)) -> Pfield ((n, (loop typ))) - | Pfield_var -> Pfield_var - in { (t) with pfield_desc = desc; } - and loop_row_field x = - match x with - | Rtag ((label, flag, lst)) -> - Rtag ((label, flag, (List.map loop lst))) - | Rinherit t -> Rinherit (loop t) - in loop - - let rec expr = - function - | Ast.ExAcc (loc, x, (Ast.ExId (_, (Ast.IdLid (_, "val"))))) -> - mkexp loc - (Pexp_apply - ((mkexp loc (Pexp_ident (lident_with_loc "!" loc))), - [ ("", (expr x)) ])) - | (ExAcc (loc, _, _) | Ast.ExId (loc, (Ast.IdAcc (_, _, _))) as - e) -> - let (e, l) = - (match sep_expr_acc [] e with - | (loc, ml, Ast.ExId (sloc, (Ast.IdUid (_, s)))) :: l -> - let ca = constructors_arity () - in - ((mkexp loc - (Pexp_construct ((mkli sloc (conv_con s) ml), - None, ca))), - l) - | (loc, ml, Ast.ExId (sloc, (Ast.IdLid (_, s)))) :: l -> - ((mkexp loc (Pexp_ident (mkli sloc s ml))), l) - | (_, [], e) :: l -> ((expr e), l) - | _ -> error loc "bad ast in expression") in - let (_, e) = - List.fold_left - (fun (loc_bp, e1) (loc_ep, ml, e2) -> - match e2 with - | Ast.ExId (sloc, (Ast.IdLid (_, s))) -> - let loc = Loc.merge loc_bp loc_ep - in - (loc, - (mkexp loc - (Pexp_field (e1, - (mkli sloc (conv_lab s) ml))))) - | _ -> - error (loc_of_expr e2) - "lowercase identifier expected") - (loc, e) l - in e - | ExAnt (loc, _) -> error loc "antiquotation not allowed here" - | (ExApp (loc, _, _) as f) -> - let (f, al) = expr_fa [] f in - let al = List.map label_expr al - in - (match (expr f).pexp_desc with - | Pexp_construct (li, None, _) -> - let al = List.map snd al - in - if constructors_arity () - then - mkexp loc - (Pexp_construct (li, - (Some (mkexp loc (Pexp_tuple al))), true)) - else - (let a = - match al with - | [ a ] -> a - | _ -> mkexp loc (Pexp_tuple al) - in - mkexp loc - (Pexp_construct (li, (Some a), false))) - | Pexp_variant (s, None) -> - let al = List.map snd al in - let a = - if constructors_arity () - then mkexp loc (Pexp_tuple al) - else - (match al with - | [ a ] -> a - | _ -> mkexp loc (Pexp_tuple al)) - in mkexp loc (Pexp_variant (s, (Some a))) - | _ -> mkexp loc (Pexp_apply ((expr f), al))) - | ExAre (loc, e1, e2) -> - mkexp loc - (Pexp_apply - ((mkexp loc - (Pexp_ident (array_function loc "Array" "get"))), - [ ("", (expr e1)); ("", (expr e2)) ])) - | ExArr (loc, e) -> - mkexp loc (Pexp_array (List.map expr (list_of_expr e []))) - | ExAsf loc -> mkexp loc Pexp_assertfalse - | ExAss (loc, e, v) -> - let e = - (match e with - | Ast.ExAcc (loc, x, - (Ast.ExId (_, (Ast.IdLid (_, "val"))))) -> - Pexp_apply - ((mkexp loc - (Pexp_ident (lident_with_loc ":=" loc))), - [ ("", (expr x)); ("", (expr v)) ]) - | ExAcc (loc, _, _) -> - (match (expr e).pexp_desc with - | Pexp_field (e, lab) -> - Pexp_setfield (e, lab, (expr v)) - | _ -> error loc "bad record access") - | ExAre (loc, e1, e2) -> - Pexp_apply - ((mkexp loc - (Pexp_ident (array_function loc "Array" "set"))), - [ ("", (expr e1)); ("", (expr e2)); ("", (expr v)) ]) - | Ast.ExId (_, (Ast.IdLid (lloc, lab))) -> - Pexp_setinstvar ((with_loc lab lloc), (expr v)) - | ExSte (loc, e1, e2) -> - Pexp_apply - ((mkexp loc - (Pexp_ident - (array_function loc "String" "set"))), - [ ("", (expr e1)); ("", (expr e2)); ("", (expr v)) ]) - | _ -> error loc "bad left part of assignment") - in mkexp loc e - | ExAsr (loc, e) -> mkexp loc (Pexp_assert (expr e)) - | ExChr (loc, s) -> - mkexp loc - (Pexp_constant (Const_char (char_of_char_token loc s))) - | ExCoe (loc, e, t1, t2) -> - let t1 = - (match t1 with | Ast.TyNil _ -> None | t -> Some (ctyp t)) - in - mkexp loc - (Pexp_constraint ((expr e), t1, (Some (ctyp t2)))) - | ExFlo (loc, s) -> - mkexp loc - (Pexp_constant (Const_float (remove_underscores s))) - | ExFor (loc, i, e1, e2, df, el) -> - let e3 = ExSeq (loc, el) - in - mkexp loc - (Pexp_for ((with_loc i loc), (expr e1), (expr e2), - (mkdirection df), (expr e3))) - | Ast.ExFun (loc, (Ast.McArr (_, (PaLab (_, lab, po)), w, e))) - -> - mkexp loc - (Pexp_function (lab, None, - [ ((patt_of_lab loc lab po), (when_expr e w)) ])) - | Ast.ExFun (loc, - (Ast.McArr (_, (PaOlbi (_, lab, p, e1)), w, e2))) -> - let lab = paolab lab p - in - mkexp loc - (Pexp_function (("?" ^ lab), (Some (expr e1)), - [ ((patt p), (when_expr e2 w)) ])) - | Ast.ExFun (loc, (Ast.McArr (_, (PaOlb (_, lab, p)), w, e))) - -> - let lab = paolab lab p - in - mkexp loc - (Pexp_function (("?" ^ lab), None, - [ ((patt_of_lab loc lab p), (when_expr e w)) ])) - | ExFun (loc, a) -> - mkexp loc (Pexp_function ("", None, (match_case a []))) - | ExIfe (loc, e1, e2, e3) -> - mkexp loc - (Pexp_ifthenelse ((expr e1), (expr e2), (Some (expr e3)))) - | ExInt (loc, s) -> - let i = - (try int_of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int") - in mkexp loc (Pexp_constant (Const_int i)) - | ExInt32 (loc, s) -> - let i32 = - (try Int32.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int32") - in mkexp loc (Pexp_constant (Const_int32 i32)) - | ExInt64 (loc, s) -> - let i64 = - (try Int64.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type int64") - in mkexp loc (Pexp_constant (Const_int64 i64)) - | ExNativeInt (loc, s) -> - let nati = - (try Nativeint.of_string s - with - | Failure _ -> - error loc - "Integer literal exceeds the range of representable integers of type nativeint") - in mkexp loc (Pexp_constant (Const_nativeint nati)) - | ExLab (loc, _, _) -> - error loc "labeled expression not allowed here" - | ExLaz (loc, e) -> mkexp loc (Pexp_lazy (expr e)) - | ExLet (loc, rf, bi, e) -> - mkexp loc (Pexp_let ((mkrf rf), (binding bi []), (expr e))) - | ExLmd (loc, i, me, e) -> - mkexp loc - (Pexp_letmodule ((with_loc i loc), (module_expr me), - (expr e))) - | ExMat (loc, e, a) -> - mkexp loc (Pexp_match ((expr e), (match_case a []))) - | ExNew (loc, id) -> mkexp loc (Pexp_new (long_type_ident id)) - | ExObj (loc, po, cfl) -> - let p = - (match po with | Ast.PaNil _ -> Ast.PaAny loc | p -> p) in - let cil = class_str_item cfl [] - in - mkexp loc - (Pexp_object - { pcstr_pat = patt p; pcstr_fields = cil; }) - | ExOlb (loc, _, _) -> - error loc "labeled expression not allowed here" - | ExOvr (loc, iel) -> - mkexp loc (Pexp_override (mkideexp iel [])) - | ExRec (loc, lel, eo) -> - (match lel with - | Ast.RbNil _ -> error loc "empty record" - | _ -> - let eo = - (match eo with - | Ast.ExNil _ -> None - | e -> Some (expr e)) - in mkexp loc (Pexp_record ((mklabexp lel []), eo))) - | ExSeq (_loc, e) -> - let rec loop = - (function - | [] -> expr (Ast.ExId (_loc, (Ast.IdUid (_loc, "()")))) - | [ e ] -> expr e - | e :: el -> - let _loc = Loc.merge (loc_of_expr e) _loc - in mkexp _loc (Pexp_sequence ((expr e), (loop el)))) - in loop (list_of_expr e []) - | ExSnd (loc, e, s) -> mkexp loc (Pexp_send ((expr e), s)) - | ExSte (loc, e1, e2) -> - mkexp loc - (Pexp_apply - ((mkexp loc - (Pexp_ident (array_function loc "String" "get"))), - [ ("", (expr e1)); ("", (expr e2)) ])) - | ExStr (loc, s) -> - mkexp loc - (Pexp_constant - (Const_string (string_of_string_token loc s))) - | ExTry (loc, e, a) -> - mkexp loc (Pexp_try ((expr e), (match_case a []))) - | Ast.ExTup (loc, (Ast.ExCom (_, e1, e2))) -> - mkexp loc - (Pexp_tuple - (List.map expr (list_of_expr e1 (list_of_expr e2 [])))) - | Ast.ExTup (loc, _) -> error loc "singleton tuple" - | ExTyc (loc, e, t) -> - mkexp loc - (Pexp_constraint ((expr e), (Some (ctyp t)), None)) - | Ast.ExId (loc, (Ast.IdUid (_, "()"))) -> - mkexp loc - (Pexp_construct ((lident_with_loc "()" loc), None, true)) - | Ast.ExId (loc, (Ast.IdLid (_, s))) -> - mkexp loc (Pexp_ident (lident_with_loc s loc)) - | Ast.ExId (loc, (Ast.IdUid (_, s))) -> - mkexp loc - (Pexp_construct ((lident_with_loc (conv_con s) loc), - None, true)) - | ExVrn (loc, s) -> - mkexp loc (Pexp_variant ((conv_con s), None)) - | 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))) - | Ast.ExPkg (loc, (Ast.MeTyc (_, me, pt))) -> - mkexp loc - (Pexp_constraint - (((mkexp loc (Pexp_pack (module_expr me))), - (Some (mktyp loc (Ptyp_package (package_type pt)))), - None))) - | Ast.ExPkg (loc, me) -> mkexp loc (Pexp_pack (module_expr me)) - | ExFUN (loc, i, e) -> mkexp loc (Pexp_newtype (i, (expr e))) - | Ast.ExCom (loc, _, _) -> - error loc "expr, expr: not allowed here" - | Ast.ExSem (loc, _, _) -> - error loc - "expr; expr: not allowed here, use do {...} or [|...|] to surround them" - | (ExId (_, _) | ExNil _ as e) -> - error (loc_of_expr e) "invalid expr" - and patt_of_lab _loc lab = - function - | Ast.PaNil _ -> - patt (Ast.PaId (_loc, (Ast.IdLid (_loc, lab)))) - | p -> patt p - and expr_of_lab _loc lab = - function - | Ast.ExNil _ -> - expr (Ast.ExId (_loc, (Ast.IdLid (_loc, lab)))) - | e -> expr e - and label_expr = - function - | ExLab (loc, lab, eo) -> (lab, (expr_of_lab loc lab eo)) - | ExOlb (loc, lab, eo) -> - (("?" ^ lab), (expr_of_lab loc lab eo)) - | e -> ("", (expr e)) - and binding x acc = - match x with - | Ast.BiAnd (_, x, y) -> binding x (binding y acc) - | Ast.BiEq (_loc, - (Ast.PaId (sloc, (Ast.IdLid (_, bind_name)))), - (Ast.ExTyc (_, e, (TyTypePol (_, vs, ty))))) -> - let rec id_to_string x = - (match x with - | Ast.TyId (_, (Ast.IdLid (_, x))) -> [ x ] - | Ast.TyApp (_, x, y) -> - (id_to_string x) @ (id_to_string y) - | _ -> assert false) in - let vars = id_to_string vs in - let ampersand_vars = List.map (fun x -> "&" ^ x) vars in - let ty' = varify_constructors vars (ctyp ty) in - let mkexp = mkexp _loc in - let mkpat = mkpat _loc in - let e = - mkexp - (Pexp_constraint ((expr e), (Some (ctyp ty)), None)) in - let rec mk_newtypes x = - (match x with - | [ newtype ] -> mkexp (Pexp_newtype ((newtype, e))) - | newtype :: newtypes -> - mkexp - (Pexp_newtype ((newtype, (mk_newtypes newtypes)))) - | [] -> assert false) in - let pat = - mkpat - (Ppat_constraint - (((mkpat (Ppat_var (with_loc bind_name sloc))), - (mktyp _loc (Ptyp_poly (ampersand_vars, ty')))))) in - let e = mk_newtypes vars in (pat, e) :: acc - | Ast.BiEq (_loc, p, - (Ast.ExTyc (_, e, (Ast.TyPol (_, vs, ty))))) -> - ((patt (Ast.PaTyc (_loc, p, (Ast.TyPol (_loc, vs, ty))))), - (expr e)) :: acc - | Ast.BiEq (_, p, e) -> ((patt p), (expr e)) :: acc - | Ast.BiNil _ -> acc - | _ -> assert false - and match_case x acc = - match x with - | Ast.McOr (_, x, y) -> match_case x (match_case y acc) - | Ast.McArr (_, p, w, e) -> ((patt p), (when_expr e w)) :: acc - | Ast.McNil _ -> acc - | _ -> assert false - and when_expr e w = - match w with - | Ast.ExNil _ -> expr e - | w -> mkexp (loc_of_expr w) (Pexp_when ((expr w), (expr e))) - and mklabexp x acc = - match x with - | Ast.RbSem (_, x, y) -> mklabexp x (mklabexp y acc) - | Ast.RbEq (_, i, e) -> - ((ident ~conv_lid: conv_lab i), (expr e)) :: acc - | _ -> assert false - and mkideexp x acc = - match x with - | Ast.RbNil _ -> acc - | Ast.RbSem (_, x, y) -> mkideexp x (mkideexp y acc) - | Ast.RbEq (_, (Ast.IdLid (sloc, s)), e) -> - ((with_loc s sloc), (expr e)) :: acc - | _ -> assert false - and mktype_decl x acc = - match x with - | Ast.TyAnd (_, x, y) -> mktype_decl x (mktype_decl y acc) - | Ast.TyDcl (cloc, c, tl, td, cl) -> - let cl = - List.map - (fun (t1, t2) -> - let loc = - Loc.merge (loc_of_ctyp t1) (loc_of_ctyp t2) - in ((ctyp t1), (ctyp t2), (mkloc loc))) - cl - in - ((with_loc c cloc), - (type_decl - (List.fold_right optional_type_parameters tl []) cl - td cloc)) :: - acc - | _ -> assert false - and module_type = - function - | Ast.MtNil loc -> - error loc "abstract/nil module type not allowed here" - | Ast.MtId (loc, i) -> mkmty loc (Pmty_ident (long_uident i)) - | Ast.MtFun (loc, n, nt, mt) -> - mkmty loc - (Pmty_functor ((with_loc n loc), (module_type nt), - (module_type mt))) - | Ast.MtQuo (loc, _) -> - error loc "module type variable not allowed here" - | Ast.MtSig (loc, sl) -> - mkmty loc (Pmty_signature (sig_item sl [])) - | Ast.MtWit (loc, mt, wc) -> - mkmty loc (Pmty_with ((module_type mt), (mkwithc wc []))) - | Ast.MtOf (loc, me) -> - mkmty loc (Pmty_typeof (module_expr me)) - | Ast.MtAnt (_, _) -> assert false - and sig_item s l = - match s with - | Ast.SgNil _ -> l - | SgCls (loc, cd) -> - (mksig loc - (Psig_class - (List.map class_info_class_type - (list_of_class_type cd [])))) :: - l - | SgClt (loc, ctd) -> - (mksig loc - (Psig_class_type - (List.map class_info_class_type - (list_of_class_type ctd [])))) :: - l - | Ast.SgSem (_, sg1, sg2) -> sig_item sg1 (sig_item sg2 l) - | SgDir (_, _, _) -> l - | Ast.SgExc (loc, (Ast.TyId (_, (Ast.IdUid (_, s))))) -> - (mksig loc - (Psig_exception ((with_loc (conv_con s) loc), []))) :: - l - | Ast.SgExc (loc, - (Ast.TyOf (_, (Ast.TyId (_, (Ast.IdUid (_, s)))), t))) -> - (mksig loc - (Psig_exception ((with_loc (conv_con s) loc), - (List.map ctyp (list_of_ctyp t []))))) :: - l - | SgExc (_, _) -> assert false - | SgExt (loc, n, t, sl) -> - (mksig loc - (Psig_value ((with_loc n loc), - (mkvalue_desc loc t (list_of_meta_list sl))))) :: - l - | SgInc (loc, mt) -> - (mksig loc (Psig_include (module_type mt))) :: l - | SgMod (loc, n, mt) -> - (mksig loc - (Psig_module ((with_loc n loc), (module_type mt)))) :: - l - | SgRecMod (loc, mb) -> - (mksig loc (Psig_recmodule (module_sig_binding mb []))) :: - l - | SgMty (loc, n, mt) -> - let si = - (match mt with - | MtQuo (_, _) -> Pmodtype_abstract - | _ -> Pmodtype_manifest (module_type mt)) - in (mksig loc (Psig_modtype ((with_loc n loc), si))) :: l - | SgOpn (loc, id) -> - (mksig loc (Psig_open (Fresh, (long_uident id)))) :: l - | SgTyp (loc, tdl) -> - (mksig loc (Psig_type (mktype_decl tdl []))) :: l - | SgVal (loc, n, t) -> - (mksig loc - (Psig_value ((with_loc n loc), (mkvalue_desc loc t [])))) :: - l - | Ast.SgAnt (loc, _) -> error loc "antiquotation in sig_item" - and module_sig_binding x acc = - match x with - | Ast.MbAnd (_, x, y) -> - module_sig_binding x (module_sig_binding y acc) - | Ast.MbCol (loc, s, mt) -> - ((with_loc s loc), (module_type mt)) :: acc - | _ -> assert false - and module_str_binding x acc = - match x with - | Ast.MbAnd (_, x, y) -> - module_str_binding x (module_str_binding y acc) - | Ast.MbColEq (loc, s, mt, me) -> - ((with_loc s loc), (module_type mt), (module_expr me)) :: - acc - | _ -> assert false - and module_expr = - function - | Ast.MeNil loc -> error loc "nil module expression" - | Ast.MeId (loc, i) -> mkmod loc (Pmod_ident (long_uident i)) - | Ast.MeApp (loc, me1, me2) -> - mkmod loc - (Pmod_apply ((module_expr me1), (module_expr me2))) - | Ast.MeFun (loc, n, mt, me) -> - mkmod loc - (Pmod_functor ((with_loc n loc), (module_type mt), - (module_expr me))) - | Ast.MeStr (loc, sl) -> - mkmod loc (Pmod_structure (str_item sl [])) - | Ast.MeTyc (loc, me, mt) -> - mkmod loc - (Pmod_constraint ((module_expr me), (module_type mt))) - | Ast.MePkg (loc, (Ast.ExTyc (_, e, (Ast.TyPkg (_, pt))))) -> - mkmod loc - (Pmod_unpack - (mkexp loc - (Pexp_constraint - (((expr e), - (Some - (mktyp loc (Ptyp_package (package_type pt)))), - None))))) - | Ast.MePkg (loc, e) -> mkmod loc (Pmod_unpack (expr e)) - | Ast.MeAnt (loc, _) -> - error loc "antiquotation in module_expr" - and str_item s l = - match s with - | Ast.StNil _ -> l - | StCls (loc, cd) -> - (mkstr loc - (Pstr_class - (List.map class_info_class_expr - (list_of_class_expr cd [])))) :: - l - | StClt (loc, ctd) -> - (mkstr loc - (Pstr_class_type - (List.map class_info_class_type - (list_of_class_type ctd [])))) :: - l - | Ast.StSem (_, st1, st2) -> str_item st1 (str_item st2 l) - | StDir (_, _, _) -> l - | Ast.StExc (loc, (Ast.TyId (_, (Ast.IdUid (_, s)))), Ast. - ONone) -> - (mkstr loc - (Pstr_exception ((with_loc (conv_con s) loc), []))) :: - l - | Ast.StExc (loc, - (Ast.TyOf (_, (Ast.TyId (_, (Ast.IdUid (_, s)))), t)), Ast. - ONone) -> - (mkstr loc - (Pstr_exception ((with_loc (conv_con s) loc), - (List.map ctyp (list_of_ctyp t []))))) :: - l - | Ast.StExc (loc, (Ast.TyId (_, (Ast.IdUid (_, s)))), - (Ast.OSome i)) -> - (mkstr loc - (Pstr_exn_rebind ((with_loc (conv_con s) loc), - (long_uident ~conv_con i)))) :: - l - | Ast.StExc (loc, - (Ast.TyOf (_, (Ast.TyId (_, (Ast.IdUid (_, _)))), _)), - (Ast.OSome _)) -> error loc "type in exception alias" - | StExc (_, _, _) -> assert false - | StExp (loc, e) -> (mkstr loc (Pstr_eval (expr e))) :: l - | StExt (loc, n, t, sl) -> - (mkstr loc - (Pstr_primitive ((with_loc n loc), - (mkvalue_desc loc t (list_of_meta_list sl))))) :: - l - | StInc (loc, me) -> - (mkstr loc (Pstr_include (module_expr me))) :: l - | StMod (loc, n, me) -> - (mkstr loc - (Pstr_module ((with_loc n loc), (module_expr me)))) :: - l - | 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 - | StTyp (loc, tdl) -> - (mkstr loc (Pstr_type (mktype_decl tdl []))) :: l - | StVal (loc, rf, bi) -> - (mkstr loc (Pstr_value ((mkrf rf), (binding bi [])))) :: l - | Ast.StAnt (loc, _) -> error loc "antiquotation in str_item" - and class_type = - function - | CtCon (loc, ViNil, id, tl) -> - mkcty loc - (Pcty_constr ((long_class_ident id), - (List.map ctyp (list_of_opt_ctyp tl [])))) - | CtFun (loc, (TyLab (_, lab, t)), ct) -> - mkcty loc (Pcty_fun (lab, (ctyp t), (class_type ct))) - | CtFun (loc, (TyOlb (loc1, lab, t)), ct) -> - let t = TyApp (loc1, (predef_option loc1), t) - in - mkcty loc - (Pcty_fun (("?" ^ lab), (ctyp t), (class_type ct))) - | CtFun (loc, t, ct) -> - mkcty loc (Pcty_fun ("", (ctyp t), (class_type ct))) - | CtSig (loc, t_o, ctfl) -> - let t = - (match t_o with | Ast.TyNil _ -> Ast.TyAny loc | t -> t) in - let cil = class_sig_item ctfl [] - in - mkcty loc - (Pcty_signature - { - pcsig_self = ctyp t; - pcsig_fields = cil; - pcsig_loc = mkloc loc; - }) - | CtCon (loc, _, _, _) -> - error loc "invalid virtual class inside a class type" - | CtAnt (_, _) | CtEq (_, _, _) | CtCol (_, _, _) | - CtAnd (_, _, _) | CtNil _ -> assert false - and class_info_class_expr ci = - match ci with - | CeEq (_, (CeCon (loc, vir, (IdLid (nloc, name)), params)), - ce) -> - let (loc_params, (params, variance)) = - (match params with - | Ast.TyNil _ -> (loc, ([], [])) - | t -> - ((loc_of_ctyp t), - (List.split (class_parameters t [])))) - in - { - pci_virt = mkvirtual vir; - pci_params = (params, (mkloc loc_params)); - pci_name = with_loc name nloc; - pci_expr = class_expr ce; - pci_loc = mkloc loc; - pci_variance = variance; - } - | ce -> error (loc_of_class_expr ce) "bad class definition" - and class_info_class_type ci = - match ci with - | CtEq (_, (CtCon (loc, vir, (IdLid (nloc, name)), params)), - ct) | - CtCol (_, (CtCon (loc, vir, (IdLid (nloc, name)), params)), - ct) - -> - let (loc_params, (params, variance)) = - (match params with - | Ast.TyNil _ -> (loc, ([], [])) - | t -> - ((loc_of_ctyp t), - (List.split (class_parameters t [])))) - in - { - pci_virt = mkvirtual vir; - pci_params = (params, (mkloc loc_params)); - pci_name = with_loc name nloc; - pci_expr = class_type ct; - pci_loc = mkloc loc; - pci_variance = variance; - } - | ct -> - error (loc_of_class_type ct) - "bad class/class type declaration/definition" - and class_sig_item c l = - match c with - | Ast.CgNil _ -> l - | CgCtr (loc, t1, t2) -> - (mkctf loc (Pctf_cstr (((ctyp t1), (ctyp t2))))) :: l - | Ast.CgSem (_, csg1, csg2) -> - class_sig_item csg1 (class_sig_item csg2 l) - | CgInh (loc, ct) -> - (mkctf loc (Pctf_inher (class_type ct))) :: l - | CgMth (loc, s, pf, t) -> - (mkctf loc - (Pctf_meth ((s, (mkprivate pf), (mkpolytype (ctyp t)))))) :: - l - | CgVal (loc, s, b, v, t) -> - (mkctf loc - (Pctf_val ((s, (mkmutable b), (mkvirtual v), (ctyp t))))) :: - l - | CgVir (loc, s, b, t) -> - (mkctf loc - (Pctf_virt ((s, (mkprivate b), (mkpolytype (ctyp t)))))) :: - l - | CgAnt (_, _) -> assert false - and class_expr = - function - | (CeApp (loc, _, _) as c) -> - let (ce, el) = class_expr_fa [] c in - let el = List.map label_expr el - in mkcl loc (Pcl_apply ((class_expr ce), el)) - | CeCon (loc, ViNil, id, tl) -> - mkcl loc - (Pcl_constr ((long_class_ident id), - (List.map ctyp (list_of_opt_ctyp tl [])))) - | CeFun (loc, (PaLab (_, lab, po)), ce) -> - mkcl loc - (Pcl_fun (lab, None, (patt_of_lab loc lab po), - (class_expr ce))) - | CeFun (loc, (PaOlbi (_, lab, p, e)), ce) -> - let lab = paolab lab p - in - mkcl loc - (Pcl_fun (("?" ^ lab), (Some (expr e)), (patt p), - (class_expr ce))) - | CeFun (loc, (PaOlb (_, lab, p)), ce) -> - let lab = paolab lab p - in - mkcl loc - (Pcl_fun (("?" ^ lab), None, (patt_of_lab loc lab p), - (class_expr ce))) - | CeFun (loc, p, ce) -> - mkcl loc (Pcl_fun ("", None, (patt p), (class_expr ce))) - | CeLet (loc, rf, bi, ce) -> - mkcl loc - (Pcl_let ((mkrf rf), (binding bi []), (class_expr ce))) - | CeStr (loc, po, cfl) -> - let p = - (match po with | Ast.PaNil _ -> Ast.PaAny loc | p -> p) in - let cil = class_str_item cfl [] - in - mkcl loc - (Pcl_structure - { pcstr_pat = patt p; pcstr_fields = cil; }) - | CeTyc (loc, ce, ct) -> - mkcl loc - (Pcl_constraint ((class_expr ce), (class_type ct))) - | CeCon (loc, _, _, _) -> - error loc "invalid virtual class inside a class expression" - | CeAnt (_, _) | CeEq (_, _, _) | CeAnd (_, _, _) | CeNil _ -> - assert false - and class_str_item c l = - match c with - | CrNil _ -> l - | CrCtr (loc, t1, t2) -> - (mkcf loc (Pcf_constr (((ctyp t1), (ctyp t2))))) :: l - | Ast.CrSem (_, cst1, cst2) -> - class_str_item cst1 (class_str_item cst2 l) - | CrInh (loc, ov, ce, pb) -> - let opb = if pb = "" then None else Some pb - in - (mkcf loc - (Pcf_inher ((override_flag loc ov), (class_expr ce), - opb))) :: - l - | CrIni (loc, e) -> (mkcf loc (Pcf_init (expr e))) :: l - | CrMth (loc, s, ov, pf, e, t) -> - let t = - (match t with - | Ast.TyNil _ -> None - | t -> Some (mkpolytype (ctyp t))) in - let e = mkexp loc (Pexp_poly ((expr e), t)) - in - (mkcf loc - (Pcf_meth - (((with_loc s loc), (mkprivate pf), - (override_flag loc ov), e)))) :: - l - | CrVal (loc, s, ov, mf, e) -> - (mkcf loc - (Pcf_val - (((with_loc s loc), (mkmutable mf), - (override_flag loc ov), (expr e))))) :: - l - | CrVir (loc, s, pf, t) -> - (mkcf loc - (Pcf_virt - (((with_loc s loc), (mkprivate pf), - (mkpolytype (ctyp t)))))) :: - l - | CrVvr (loc, s, mf, t) -> - (mkcf loc - (Pcf_valvirt - (((with_loc s loc), (mkmutable mf), (ctyp t))))) :: - l - | CrAnt (_, _) -> assert false - - let sig_item ast = sig_item ast [] - - let str_item ast = str_item ast [] - - let directive = - function - | Ast.ExNil _ -> Pdir_none - | ExStr (_, s) -> Pdir_string s - | ExInt (_, i) -> Pdir_int (int_of_string i) - | Ast.ExId (_, (Ast.IdUid (_, "True"))) -> Pdir_bool true - | Ast.ExId (_, (Ast.IdUid (_, "False"))) -> Pdir_bool false - | e -> Pdir_ident (ident_noloc (ident_of_expr e)) - - let phrase = - function - | StDir (_, d, dp) -> Ptop_dir (d, (directive dp)) - | si -> Ptop_def (str_item si) - - end - - end - - module CleanAst = - struct - module Make (Ast : Sig.Camlp4Ast) = - struct - class clean_ast = - object inherit Ast.map as super - method with_constr = - fun wc -> - match super#with_constr wc with - | Ast.WcAnd (_, (Ast.WcNil _), wc) | - Ast.WcAnd (_, wc, (Ast.WcNil _)) -> wc - | wc -> wc - method expr = - fun e -> - match super#expr e with - | Ast.ExLet (_, _, (Ast.BiNil _), e) | - Ast.ExRec (_, (Ast.RbNil _), e) | - Ast.ExCom (_, (Ast.ExNil _), e) | - Ast.ExCom (_, e, (Ast.ExNil _)) | - Ast.ExSem (_, (Ast.ExNil _), e) | - Ast.ExSem (_, e, (Ast.ExNil _)) -> e - | e -> e - method patt = - fun p -> - match super#patt p with - | Ast.PaAli (_, p, (Ast.PaNil _)) | - Ast.PaOrp (_, (Ast.PaNil _), p) | - Ast.PaOrp (_, p, (Ast.PaNil _)) | - Ast.PaCom (_, (Ast.PaNil _), p) | - Ast.PaCom (_, p, (Ast.PaNil _)) | - Ast.PaSem (_, (Ast.PaNil _), p) | - Ast.PaSem (_, p, (Ast.PaNil _)) -> p - | p -> p - method match_case = - fun mc -> - match super#match_case mc with - | Ast.McOr (_, (Ast.McNil _), mc) | - Ast.McOr (_, mc, (Ast.McNil _)) -> mc - | mc -> mc - method binding = - fun bi -> - match super#binding bi with - | Ast.BiAnd (_, (Ast.BiNil _), bi) | - Ast.BiAnd (_, bi, (Ast.BiNil _)) -> bi - | bi -> bi - method rec_binding = - fun rb -> - match super#rec_binding rb with - | Ast.RbSem (_, (Ast.RbNil _), bi) | - Ast.RbSem (_, bi, (Ast.RbNil _)) -> bi - | bi -> bi - method module_binding = - fun mb -> - match super#module_binding mb with - | Ast.MbAnd (_, (Ast.MbNil _), mb) | - Ast.MbAnd (_, mb, (Ast.MbNil _)) -> mb - | mb -> mb - method ctyp = - fun t -> - match super#ctyp t with - | Ast.TyPol (_, (Ast.TyNil _), t) | - Ast.TyAli (_, (Ast.TyNil _), t) | - Ast.TyAli (_, t, (Ast.TyNil _)) | - Ast.TyArr (_, t, (Ast.TyNil _)) | - Ast.TyArr (_, (Ast.TyNil _), t) | - Ast.TyOr (_, (Ast.TyNil _), t) | - Ast.TyOr (_, t, (Ast.TyNil _)) | - Ast.TyOf (_, t, (Ast.TyNil _)) | - Ast.TyAnd (_, (Ast.TyNil _), t) | - Ast.TyAnd (_, t, (Ast.TyNil _)) | - Ast.TySem (_, t, (Ast.TyNil _)) | - Ast.TySem (_, (Ast.TyNil _), t) | - Ast.TyCom (_, (Ast.TyNil _), t) | - Ast.TyCom (_, t, (Ast.TyNil _)) | - Ast.TyAmp (_, t, (Ast.TyNil _)) | - Ast.TyAmp (_, (Ast.TyNil _), t) | - Ast.TySta (_, (Ast.TyNil _), t) | - Ast.TySta (_, t, (Ast.TyNil _)) -> t - | t -> t - method sig_item = - fun sg -> - match super#sig_item sg with - | Ast.SgSem (_, (Ast.SgNil _), sg) | - Ast.SgSem (_, sg, (Ast.SgNil _)) -> sg - | Ast.SgTyp (loc, (Ast.TyNil _)) -> Ast.SgNil loc - | sg -> sg - method str_item = - fun st -> - match super#str_item st with - | Ast.StSem (_, (Ast.StNil _), st) | - Ast.StSem (_, st, (Ast.StNil _)) -> st - | Ast.StTyp (loc, (Ast.TyNil _)) -> Ast.StNil loc - | Ast.StVal (loc, _, (Ast.BiNil _)) -> Ast.StNil loc - | st -> st - method module_type = - fun mt -> - match super#module_type mt with - | Ast.MtWit (_, mt, (Ast.WcNil _)) -> mt - | mt -> mt - method class_expr = - fun ce -> - match super#class_expr ce with - | Ast.CeAnd (_, (Ast.CeNil _), ce) | - Ast.CeAnd (_, ce, (Ast.CeNil _)) -> ce - | ce -> ce - method class_type = - fun ct -> - match super#class_type ct with - | Ast.CtAnd (_, (Ast.CtNil _), ct) | - Ast.CtAnd (_, ct, (Ast.CtNil _)) -> ct - | ct -> ct - method class_sig_item = - fun csg -> - match super#class_sig_item csg with - | Ast.CgSem (_, (Ast.CgNil _), csg) | - Ast.CgSem (_, csg, (Ast.CgNil _)) -> csg - | csg -> csg - method class_str_item = - fun cst -> - match super#class_str_item cst with - | Ast.CrSem (_, (Ast.CrNil _), cst) | - Ast.CrSem (_, cst, (Ast.CrNil _)) -> cst - | cst -> cst - end - - end - - end - - module CommentFilter : - sig - module Make (Token : Sig.Camlp4Token) : - sig - open Token - - type t - - val mk : unit -> t - - val define : Token.Filter.t -> t -> unit - - val filter : - t -> (Token.t * Loc.t) Stream.t -> (Token.t * Loc.t) Stream.t - - val take_list : t -> (string * Loc.t) list - - val take_stream : t -> (string * Loc.t) Stream.t - - end - - end = - struct - module Make (Token : Sig.Camlp4Token) = - struct - open Token - - type t = - (((string * Loc.t) Stream.t) * ((string * Loc.t) Queue.t)) - - let mk () = - let q = Queue.create () in - let f _ = try Some (Queue.take q) with | Queue.Empty -> None - in ((Stream.from f), q) - - let filter (_, q) = - let rec self (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some ((Sig.COMMENT x, loc)) -> - (Stream.junk __strm; - let xs = __strm in (Queue.add (x, loc) q; self xs)) - | Some x -> - (Stream.junk __strm; - let xs = __strm - in Stream.icons x (Stream.slazy (fun _ -> self xs))) - | _ -> Stream.sempty - in self - - let take_list (_, q) = - let rec self accu = - if Queue.is_empty q - then accu - else self ((Queue.take q) :: accu) - in self [] - - let take_stream = fst - - let define token_fiter comments_strm = - Token.Filter.define_filter token_fiter - (fun previous strm -> previous (filter comments_strm strm)) - - end - - end - - module DynLoader : sig include Sig.DynLoader - end = - struct - type t = string Queue.t - - exception Error of string * string - - let include_dir x y = Queue.add y x - - let fold_load_path x f acc = Queue.fold (fun x y -> f y x) acc x - - let mk ?(ocaml_stdlib = true) ?(camlp4_stdlib = true) () = - let q = Queue.create () - in - (if ocaml_stdlib - then include_dir q Camlp4_config.ocaml_standard_library - else (); - if camlp4_stdlib - then - (include_dir q Camlp4_config.camlp4_standard_library; - include_dir q - (Filename.concat Camlp4_config.camlp4_standard_library - "Camlp4Parsers"); - include_dir q - (Filename.concat Camlp4_config.camlp4_standard_library - "Camlp4Printers"); - include_dir q - (Filename.concat Camlp4_config.camlp4_standard_library - "Camlp4Filters")) - else (); - include_dir q "."; - q) - - let find_in_path x name = - if not (Filename.is_implicit name) - then if Sys.file_exists name then name else raise Not_found - else - (let res = - fold_load_path x - (fun dir -> - function - | None -> - let fullname = Filename.concat dir name - in - if Sys.file_exists fullname - then Some fullname - else None - | x -> x) - None - in match res with | None -> raise Not_found | Some x -> x) - - let load = - let _initialized = ref false - in - fun _path file -> - (if not !_initialized - then - (try - (Dynlink.init (); - Dynlink.allow_unsafe_modules true; - _initialized := true) - with - | Dynlink.Error e -> - raise - (Error ("Camlp4's dynamic loader initialization", - (Dynlink.error_message e)))) - else (); - let fname = - try find_in_path _path file - with - | Not_found -> - raise (Error (file, "file not found in path")) - in - try Dynlink.loadfile fname - with - | Dynlink.Error e -> - raise (Error (fname, (Dynlink.error_message e)))) - - let is_native = Dynlink.is_native - - end - - module EmptyError : sig include Sig.Error - end = - struct - type t = unit - - exception E of t - - let print _ = assert false - - let to_string _ = assert false - - end - - module EmptyPrinter : - sig module Make (Ast : Sig.Ast) : Sig.Printer(Ast).S - end = - struct - module Make (Ast : Sig.Ast) = - struct - let print_interf ?input_file:(_) ?output_file:(_) _ = - failwith "No interface printer" - - let print_implem ?input_file:(_) ?output_file:(_) _ = - failwith "No implementation printer" - - end - - end - - module FreeVars : - sig - module Make (Ast : Sig.Camlp4Ast) : - sig - module S : Set.S with type elt = string - - val fold_binding_vars : - (string -> 'accu -> 'accu) -> Ast.binding -> 'accu -> 'accu - - class ['accu] c_fold_pattern_vars : - (string -> 'accu -> 'accu) -> - 'accu -> - object inherit Ast.fold val acc : 'accu method acc : 'accu - end - - val fold_pattern_vars : - (string -> 'accu -> 'accu) -> Ast.patt -> 'accu -> 'accu - - class ['accu] fold_free_vars : - (string -> 'accu -> 'accu) -> - ?env_init: S.t -> - 'accu -> - object ('self_type) - inherit Ast.fold - val free : 'accu - val env : S.t - method free : 'accu - method set_env : S.t -> 'self_type - method add_atom : string -> 'self_type - method add_patt : Ast.patt -> 'self_type - method add_binding : Ast.binding -> 'self_type - end - - val free_vars : S.t -> Ast.expr -> S.t - - end - - end = - struct - module Make (Ast : Sig.Camlp4Ast) = - struct - module S = Set.Make(String) - - class ['accu] c_fold_pattern_vars f init = - object inherit Ast.fold as super - val acc = init - method acc : 'accu = acc - method patt = - function - | Ast.PaId (_, (Ast.IdLid (_, s))) | - Ast.PaLab (_, s, (Ast.PaNil _)) | - Ast.PaOlb (_, s, (Ast.PaNil _)) -> {< acc = f s acc; >} - | p -> super#patt p - end - - let fold_pattern_vars f p init = - ((new c_fold_pattern_vars f init)#patt p)#acc - - let rec fold_binding_vars f bi acc = - match bi with - | Ast.BiAnd (_, bi1, bi2) -> - fold_binding_vars f bi1 (fold_binding_vars f bi2 acc) - | Ast.BiEq (_, p, _) -> fold_pattern_vars f p acc - | Ast.BiNil _ -> acc - | Ast.BiAnt (_, _) -> assert false - - class ['accu] fold_free_vars (f : string -> 'accu -> 'accu) - ?(env_init = S.empty) free_init = - object (o) - inherit Ast.fold as super - val free = (free_init : 'accu) - val env = (env_init : S.t) - method free = free - method set_env = fun env -> {< env = env; >} - method add_atom = fun s -> {< env = S.add s env; >} - method add_patt = - fun p -> {< env = fold_pattern_vars S.add p env; >} - method add_binding = - fun bi -> {< env = fold_binding_vars S.add bi env; >} - method expr = - function - | Ast.ExId (_, (Ast.IdLid (_, s))) | - Ast.ExLab (_, s, (Ast.ExNil _)) | - Ast.ExOlb (_, s, (Ast.ExNil _)) -> - if S.mem s env then o else {< free = f s free; >} - | Ast.ExLet (_, Ast.ReNil, bi, e) -> - (((o#add_binding bi)#expr e)#set_env env)#binding bi - | Ast.ExLet (_, Ast.ReRecursive, bi, e) -> - (((o#add_binding bi)#expr e)#binding bi)#set_env env - | Ast.ExFor (_, s, e1, e2, _, e3) -> - ((((o#expr e1)#expr e2)#add_atom s)#expr e3)#set_env - env - | Ast.ExId (_, _) | Ast.ExNew (_, _) -> o - | Ast.ExObj (_, p, cst) -> - ((o#add_patt p)#class_str_item cst)#set_env env - | e -> super#expr e - method match_case = - function - | Ast.McArr (_, p, e1, e2) -> - (((o#add_patt p)#expr e1)#expr e2)#set_env env - | m -> super#match_case m - method str_item = - function - | Ast.StExt (_, s, t, _) -> (o#ctyp t)#add_atom s - | Ast.StVal (_, Ast.ReNil, bi) -> - (o#binding bi)#add_binding bi - | Ast.StVal (_, Ast.ReRecursive, bi) -> - (o#add_binding bi)#binding bi - | st -> super#str_item st - method class_expr = - function - | Ast.CeFun (_, p, ce) -> - ((o#add_patt p)#class_expr ce)#set_env env - | Ast.CeLet (_, Ast.ReNil, bi, ce) -> - (((o#binding bi)#add_binding bi)#class_expr ce)#set_env - env - | Ast.CeLet (_, Ast.ReRecursive, bi, ce) -> - (((o#add_binding bi)#binding bi)#class_expr ce)#set_env - env - | Ast.CeStr (_, p, cst) -> - ((o#add_patt p)#class_str_item cst)#set_env env - | ce -> super#class_expr ce - method class_str_item = - function - | (Ast.CrInh (_, _, _, "") as cst) -> - super#class_str_item cst - | Ast.CrInh (_, _, ce, s) -> (o#class_expr ce)#add_atom s - | Ast.CrVal (_, s, _, _, e) -> (o#expr e)#add_atom s - | Ast.CrVvr (_, s, _, t) -> (o#ctyp t)#add_atom s - | cst -> super#class_str_item cst - method module_expr = - function - | Ast.MeStr (_, st) -> (o#str_item st)#set_env env - | me -> super#module_expr me - end - - let free_vars env_init e = - let fold = new fold_free_vars S.add ~env_init S.empty - in (fold#expr e)#free - - end - - end - - module Grammar = - struct - module Structure = - struct - open Sig.Grammar - - module type S = - sig - module Loc : Sig.Loc - - module Token : Sig.Token with module Loc = Loc - - module Lexer : Sig.Lexer with module Loc = Loc - and module Token = Token - - module Action : Sig.Grammar.Action - - type gram = - { gfilter : Token.Filter.t; - gkeywords : (string, int ref) Hashtbl.t; - glexer : - Loc.t -> char Stream.t -> (Token.t * Loc.t) Stream.t; - warning_verbose : bool ref; error_verbose : bool ref - } - - type token_info = - { prev_loc : Loc.t; cur_loc : Loc.t; prev_loc_only : bool - } - - type token_stream = (Token.t * token_info) Stream.t - - type efun = token_stream -> Action.t - - type token_pattern = ((Token.t -> bool) * string) - - type internal_entry = - { egram : gram; ename : string; - mutable estart : int -> efun; - mutable econtinue : int -> Loc.t -> Action.t -> efun; - mutable edesc : desc - } - and desc = - | Dlevels of level list - | Dparser of (token_stream -> Action.t) - and level = - { assoc : assoc; lname : string option; lsuffix : tree; - lprefix : tree - } - and symbol = - | Smeta of string * symbol list * Action.t - | Snterm of internal_entry - | Snterml of internal_entry * string - | Slist0 of symbol - | Slist0sep of symbol * symbol - | Slist1 of symbol - | Slist1sep of symbol * symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree - and tree = - | Node of node - | LocAct of Action.t * Action.t list - | DeadEnd - and node = - { node : symbol; son : tree; brother : tree - } - - type production_rule = ((symbol list) * Action.t) - - type single_extend_statment = - ((string option) * (assoc option) * (production_rule list)) - - type extend_statment = - ((position option) * (single_extend_statment list)) - - type delete_statment = symbol list - - type ('a, 'b, 'c) fold = - internal_entry -> - symbol list -> ('a Stream.t -> 'b) -> 'a Stream.t -> 'c - - type ('a, 'b, 'c) foldsep = - internal_entry -> - symbol list -> - ('a Stream.t -> 'b) -> - ('a Stream.t -> unit) -> 'a Stream.t -> 'c - - val get_filter : gram -> Token.Filter.t - - val using : gram -> string -> unit - - val removing : gram -> string -> unit - - end - - module Make (Lexer : Sig.Lexer) = - struct - module Loc = Lexer.Loc - - module Token = Lexer.Token - - module Action : Sig.Grammar.Action = - struct - type t = Obj.t - - let mk = Obj.repr - - let get = Obj.obj - - let getf = Obj.obj - - let getf2 = Obj.obj - - end - - module Lexer = Lexer - - type gram = - { gfilter : Token.Filter.t; - gkeywords : (string, int ref) Hashtbl.t; - glexer : - Loc.t -> char Stream.t -> (Token.t * Loc.t) Stream.t; - warning_verbose : bool ref; error_verbose : bool ref - } - - type token_info = - { prev_loc : Loc.t; cur_loc : Loc.t; prev_loc_only : bool - } - - type token_stream = (Token.t * token_info) Stream.t - - type efun = token_stream -> Action.t - - type token_pattern = ((Token.t -> bool) * string) - - type internal_entry = - { egram : gram; ename : string; - mutable estart : int -> efun; - mutable econtinue : int -> Loc.t -> Action.t -> efun; - mutable edesc : desc - } - and desc = - | Dlevels of level list - | Dparser of (token_stream -> Action.t) - and level = - { assoc : assoc; lname : string option; lsuffix : tree; - lprefix : tree - } - and symbol = - | Smeta of string * symbol list * Action.t - | Snterm of internal_entry - | Snterml of internal_entry * string - | Slist0 of symbol - | Slist0sep of symbol * symbol - | Slist1 of symbol - | Slist1sep of symbol * symbol - | Sopt of symbol - | Stry of symbol - | Sself - | Snext - | Stoken of token_pattern - | Skeyword of string - | Stree of tree - and tree = - | Node of node - | LocAct of Action.t * Action.t list - | DeadEnd - and node = - { node : symbol; son : tree; brother : tree - } - - type production_rule = ((symbol list) * Action.t) - - type single_extend_statment = - ((string option) * (assoc option) * (production_rule list)) - - type extend_statment = - ((position option) * (single_extend_statment list)) - - type delete_statment = symbol list - - type ('a, 'b, 'c) fold = - internal_entry -> - symbol list -> ('a Stream.t -> 'b) -> 'a Stream.t -> 'c - - type ('a, 'b, 'c) foldsep = - internal_entry -> - symbol list -> - ('a Stream.t -> 'b) -> - ('a Stream.t -> unit) -> 'a Stream.t -> 'c - - let get_filter g = g.gfilter - - let token_location r = r.cur_loc - - type 'a not_filtered = 'a - - let using { gkeywords = table; gfilter = filter } kwd = - let r = - try Hashtbl.find table kwd - with - | Not_found -> - let r = ref 0 in (Hashtbl.add table kwd r; r) - in (Token.Filter.keyword_added filter kwd (!r = 0); incr r) - - let removing { gkeywords = table; gfilter = filter } kwd = - let r = Hashtbl.find table kwd in - let () = decr r - in - if !r = 0 - then - (Token.Filter.keyword_removed filter kwd; - Hashtbl.remove table kwd) - else () - - end - - end - - module Search = - struct - module Make (Structure : Structure.S) = - struct - open Structure - - let tree_in_entry prev_symb tree = - function - | Dlevels levels -> - let rec search_levels = - (function - | [] -> tree - | level :: levels -> - (match search_level level with - | Some tree -> tree - | None -> search_levels levels)) - and search_level level = - (match search_tree level.lsuffix with - | Some t -> - Some - (Node - { node = Sself; son = t; brother = DeadEnd; - }) - | None -> search_tree level.lprefix) - and search_tree t = - if (tree <> DeadEnd) && (t == tree) - then Some t - else - (match t with - | Node n -> - (match search_symbol n.node with - | Some symb -> - Some - (Node - { - node = symb; - son = n.son; - brother = DeadEnd; - }) - | None -> - (match search_tree n.son with - | Some t -> - Some - (Node - { - node = n.node; - son = t; - brother = DeadEnd; - }) - | None -> search_tree n.brother)) - | LocAct (_, _) | DeadEnd -> None) - and search_symbol symb = - (match symb with - | Snterm _ | Snterml (_, _) | Slist0 _ | - Slist0sep (_, _) | Slist1 _ | Slist1sep (_, _) | - Sopt _ | Stry _ | Stoken _ | Stree _ | - Skeyword _ when symb == prev_symb -> Some symb - | Slist0 symb -> - (match search_symbol symb with - | Some symb -> Some (Slist0 symb) - | None -> None) - | Slist0sep (symb, sep) -> - (match search_symbol symb with - | Some symb -> Some (Slist0sep (symb, sep)) - | None -> - (match search_symbol sep with - | Some sep -> Some (Slist0sep (symb, sep)) - | None -> None)) - | Slist1 symb -> - (match search_symbol symb with - | Some symb -> Some (Slist1 symb) - | None -> None) - | Slist1sep (symb, sep) -> - (match search_symbol symb with - | Some symb -> Some (Slist1sep (symb, sep)) - | None -> - (match search_symbol sep with - | Some sep -> Some (Slist1sep (symb, sep)) - | None -> None)) - | Sopt symb -> - (match search_symbol symb with - | Some symb -> Some (Sopt symb) - | None -> None) - | Stry symb -> - (match search_symbol symb with - | Some symb -> Some (Stry symb) - | None -> None) - | Stree t -> - (match search_tree t with - | Some t -> Some (Stree t) - | None -> None) - | _ -> None) - in search_levels levels - | Dparser _ -> tree - - end - - end - - module Tools = - struct - let get_prev_loc_only = ref false - - module Make (Structure : Structure.S) = - struct - open Structure - - let empty_entry ename _ = - raise (Stream.Error ("entry [" ^ (ename ^ "] is empty"))) - - let rec stream_map f (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some x -> - (Stream.junk __strm; - let strm = __strm - in - Stream.lcons (fun _ -> f x) - (Stream.slazy (fun _ -> stream_map f strm))) - | _ -> Stream.sempty - - let keep_prev_loc strm = - match Stream.peek strm with - | None -> Stream.sempty - | Some ((tok0, init_loc)) -> - let rec go prev_loc strm1 = - if !get_prev_loc_only - then - Stream.lcons - (fun _ -> - (tok0, - { - prev_loc = prev_loc; - cur_loc = prev_loc; - prev_loc_only = true; - })) - (Stream.slazy (fun _ -> go prev_loc strm1)) - else - (let (__strm : _ Stream.t) = strm1 - in - match Stream.peek __strm with - | Some ((tok, cur_loc)) -> - (Stream.junk __strm; - let strm = __strm - in - Stream.lcons - (fun _ -> - (tok, - { - prev_loc = prev_loc; - cur_loc = cur_loc; - prev_loc_only = false; - })) - (Stream.slazy - (fun _ -> go cur_loc strm))) - | _ -> Stream.sempty) - in go init_loc strm - - let drop_prev_loc strm = - stream_map (fun (tok, r) -> (tok, (r.cur_loc))) strm - - let get_cur_loc strm = - match Stream.peek strm with - | Some ((_, r)) -> r.cur_loc - | None -> Loc.ghost - - let get_prev_loc strm = - (get_prev_loc_only := true; - let result = - match Stream.peek strm with - | Some - ((_, { prev_loc = prev_loc; prev_loc_only = true })) - -> (Stream.junk strm; prev_loc) - | Some - ((_, { prev_loc = prev_loc; prev_loc_only = false })) - -> prev_loc - | None -> Loc.ghost - in (get_prev_loc_only := false; result)) - - let is_level_labelled n lev = - match lev.lname with | Some n1 -> n = n1 | None -> false - - let warning_verbose = ref true - - let rec get_token_list entry tokl last_tok tree = - match tree with - | Node - { - node = (Stoken _ | Skeyword _ as tok); - son = son; - brother = DeadEnd - } -> get_token_list entry (last_tok :: tokl) tok son - | _ -> - if tokl = [] - then None - else - Some - (((List.rev (last_tok :: tokl)), last_tok, tree)) - - let is_antiquot s = - let len = String.length s in (len > 1) && (s.[0] = '$') - - let eq_Stoken_ids s1 s2 = - (not (is_antiquot s1)) && - ((not (is_antiquot s2)) && (s1 = s2)) - - let logically_eq_symbols entry = - let rec eq_symbols s1 s2 = - match (s1, s2) with - | (Snterm e1, Snterm e2) -> e1.ename = e2.ename - | (Snterm e1, Sself) -> e1.ename = entry.ename - | (Sself, Snterm e2) -> entry.ename = e2.ename - | (Snterml (e1, l1), Snterml (e2, l2)) -> - (e1.ename = e2.ename) && (l1 = l2) - | (Slist0 s1, Slist0 s2) | (Slist1 s1, Slist1 s2) | - (Sopt s1, Sopt s2) | (Stry s1, Stry s2) -> - eq_symbols s1 s2 - | (Slist0sep (s1, sep1), Slist0sep (s2, sep2)) | - (Slist1sep (s1, sep1), Slist1sep (s2, sep2)) -> - (eq_symbols s1 s2) && (eq_symbols sep1 sep2) - | (Stree t1, Stree t2) -> eq_trees t1 t2 - | (Stoken ((_, s1)), Stoken ((_, s2))) -> - eq_Stoken_ids s1 s2 - | _ -> s1 = s2 - and eq_trees t1 t2 = - match (t1, t2) with - | (Node n1, Node n2) -> - (eq_symbols n1.node n2.node) && - ((eq_trees n1.son n2.son) && - (eq_trees n1.brother n2.brother)) - | ((LocAct (_, _) | DeadEnd), (LocAct (_, _) | DeadEnd)) - -> true - | _ -> false - in eq_symbols - - let rec eq_symbol s1 s2 = - match (s1, s2) with - | (Snterm e1, Snterm e2) -> e1 == e2 - | (Snterml (e1, l1), Snterml (e2, l2)) -> - (e1 == e2) && (l1 = l2) - | (Slist0 s1, Slist0 s2) | (Slist1 s1, Slist1 s2) | - (Sopt s1, Sopt s2) | (Stry s1, Stry s2) -> - eq_symbol s1 s2 - | (Slist0sep (s1, sep1), Slist0sep (s2, sep2)) | - (Slist1sep (s1, sep1), Slist1sep (s2, sep2)) -> - (eq_symbol s1 s2) && (eq_symbol sep1 sep2) - | (Stree _, Stree _) -> false - | (Stoken ((_, s1)), Stoken ((_, s2))) -> - eq_Stoken_ids s1 s2 - | _ -> s1 = s2 - - end - - end - - module Print : - sig - module Make (Structure : Structure.S) : - sig - val flatten_tree : - Structure.tree -> (Structure.symbol list) list - - val print_symbol : - Format.formatter -> Structure.symbol -> unit - - val print_meta : - Format.formatter -> string -> Structure.symbol list -> unit - - val print_symbol1 : - Format.formatter -> Structure.symbol -> unit - - val print_rule : - Format.formatter -> Structure.symbol list -> unit - - val print_level : - Format.formatter -> - (Format.formatter -> unit -> unit) -> - (Structure.symbol list) list -> unit - - val levels : Format.formatter -> Structure.level list -> unit - - val entry : - Format.formatter -> Structure.internal_entry -> unit - - end - - module MakeDump (Structure : Structure.S) : - sig - val print_symbol : - Format.formatter -> Structure.symbol -> unit - - val print_meta : - Format.formatter -> string -> Structure.symbol list -> unit - - val print_symbol1 : - Format.formatter -> Structure.symbol -> unit - - val print_rule : - Format.formatter -> Structure.symbol list -> unit - - val print_level : - Format.formatter -> - (Format.formatter -> unit -> unit) -> - (Structure.symbol list) list -> unit - - val levels : Format.formatter -> Structure.level list -> unit - - val entry : - Format.formatter -> Structure.internal_entry -> unit - - end - - end = - struct - module Make (Structure : Structure.S) = - struct - open Structure - - open Format - - open Sig.Grammar - - let rec flatten_tree = - function - | DeadEnd -> [] - | LocAct (_, _) -> [ [] ] - | Node { node = n; brother = b; son = s } -> - (List.map (fun l -> n :: l) (flatten_tree s)) @ - (flatten_tree b) - - let rec print_symbol ppf = - function - | Smeta (n, sl, _) -> print_meta ppf n sl - | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s - | Slist0sep (s, t) -> - fprintf ppf "LIST0 %a SEP %a" print_symbol1 s - print_symbol1 t - | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s - | Slist1sep (s, t) -> - fprintf ppf "LIST1 %a SEP %a" print_symbol1 s - print_symbol1 t - | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s - | Stry s -> fprintf ppf "TRY %a" print_symbol1 s - | Snterml (e, l) -> fprintf ppf "%s@ LEVEL@ %S" e.ename l - | (Snterm _ | Snext | Sself | Stree _ | Stoken _ | - Skeyword _ - as s) -> print_symbol1 ppf s - and print_meta ppf n sl = - let rec loop i = - function - | [] -> () - | s :: sl -> - let j = - (try String.index_from n i ' ' - with | Not_found -> String.length n) - in - (fprintf ppf "%s %a" (String.sub n i (j - i)) - print_symbol1 s; - if sl = [] - then () - else - (fprintf ppf " "; - loop (min (j + 1) (String.length n)) sl)) - in loop 0 sl - and print_symbol1 ppf = - function - | Snterm e -> pp_print_string ppf e.ename - | Sself -> pp_print_string ppf "SELF" - | Snext -> pp_print_string ppf "NEXT" - | Stoken ((_, descr)) -> pp_print_string ppf descr - | Skeyword s -> fprintf ppf "%S" s - | Stree t -> - print_level ppf pp_print_space (flatten_tree t) - | (Smeta (_, _, _) | Snterml (_, _) | Slist0 _ | - Slist0sep (_, _) | Slist1 _ | Slist1sep (_, _) | - Sopt _ | Stry _ - as s) -> fprintf ppf "(%a)" print_symbol s - and print_rule ppf symbols = - (fprintf ppf "@["; - let _ = - List.fold_left - (fun sep symbol -> - (fprintf ppf "%t%a" sep print_symbol symbol; - fun ppf -> fprintf ppf ";@ ")) - (fun _ -> ()) symbols - in fprintf ppf "@]") - and print_level ppf pp_print_space rules = - (fprintf ppf "@[[ "; - let _ = - List.fold_left - (fun sep rule -> - (fprintf ppf "%t%a" sep print_rule rule; - fun ppf -> fprintf ppf "%a| " pp_print_space ())) - (fun _ -> ()) rules - in fprintf ppf " ]@]") - - let levels ppf elev = - let _ = - List.fold_left - (fun sep lev -> - let rules = - (List.map (fun t -> Sself :: t) - (flatten_tree lev.lsuffix)) - @ (flatten_tree lev.lprefix) - in - (fprintf ppf "%t@[" sep; - (match lev.lname with - | Some n -> fprintf ppf "%S@;<1 2>" n - | None -> ()); - (match lev.assoc with - | LeftA -> fprintf ppf "LEFTA" - | RightA -> fprintf ppf "RIGHTA" - | NonA -> fprintf ppf "NONA"); - fprintf ppf "@]@;<1 2>"; - print_level ppf pp_force_newline rules; - fun ppf -> fprintf ppf "@,| ")) - (fun _ -> ()) elev - in () - - let entry ppf e = - (fprintf ppf "@[%s: [ " e.ename; - (match e.edesc with - | Dlevels elev -> levels ppf elev - | Dparser _ -> fprintf ppf ""); - fprintf ppf " ]@]") - - end - - module MakeDump (Structure : Structure.S) = - struct - open Structure - - open Format - - open Sig.Grammar - - type brothers = | Bro of symbol * brothers list - - let rec print_tree ppf tree = - let rec get_brothers acc = - function - | DeadEnd -> List.rev acc - | LocAct (_, _) -> List.rev acc - | Node { node = n; brother = b; son = s } -> - get_brothers ((Bro (n, (get_brothers [] s))) :: acc) - b - and print_brothers ppf brothers = - if brothers = [] - then fprintf ppf "@ []" - else - List.iter - (function - | Bro (n, xs) -> - (fprintf ppf "@ @[- %a" print_symbol n; - (match xs with - | [] -> () - | [ _ ] -> - (try - print_children ppf (get_children [] xs) - with - | Exit -> - fprintf ppf ":%a" print_brothers xs) - | _ -> fprintf ppf ":%a" print_brothers xs); - fprintf ppf "@]")) - brothers - and print_children ppf = - List.iter (fprintf ppf ";@ %a" print_symbol) - and get_children acc = - function - | [] -> List.rev acc - | [ Bro (n, x) ] -> get_children (n :: acc) x - | _ -> raise Exit - in print_brothers ppf (get_brothers [] tree) - and print_symbol ppf = - function - | Smeta (n, sl, _) -> print_meta ppf n sl - | Slist0 s -> fprintf ppf "LIST0 %a" print_symbol1 s - | Slist0sep (s, t) -> - fprintf ppf "LIST0 %a SEP %a" print_symbol1 s - print_symbol1 t - | Slist1 s -> fprintf ppf "LIST1 %a" print_symbol1 s - | Slist1sep (s, t) -> - fprintf ppf "LIST1 %a SEP %a" print_symbol1 s - print_symbol1 t - | Sopt s -> fprintf ppf "OPT %a" print_symbol1 s - | Stry s -> fprintf ppf "TRY %a" print_symbol1 s - | Snterml (e, l) -> fprintf ppf "%s@ LEVEL@ %S" e.ename l - | (Snterm _ | Snext | Sself | Stree _ | Stoken _ | - Skeyword _ - as s) -> print_symbol1 ppf s - and print_meta ppf n sl = - let rec loop i = - function - | [] -> () - | s :: sl -> - let j = - (try String.index_from n i ' ' - with | Not_found -> String.length n) - in - (fprintf ppf "%s %a" (String.sub n i (j - i)) - print_symbol1 s; - if sl = [] - then () - else - (fprintf ppf " "; - loop (min (j + 1) (String.length n)) sl)) - in loop 0 sl - and print_symbol1 ppf = - function - | Snterm e -> pp_print_string ppf e.ename - | Sself -> pp_print_string ppf "SELF" - | Snext -> pp_print_string ppf "NEXT" - | Stoken ((_, descr)) -> pp_print_string ppf descr - | Skeyword s -> fprintf ppf "%S" s - | Stree t -> print_tree ppf t - | (Smeta (_, _, _) | Snterml (_, _) | Slist0 _ | - Slist0sep (_, _) | Slist1 _ | Slist1sep (_, _) | - Sopt _ | Stry _ - as s) -> fprintf ppf "(%a)" print_symbol s - and print_rule ppf symbols = - (fprintf ppf "@["; - let _ = - List.fold_left - (fun sep symbol -> - (fprintf ppf "%t%a" sep print_symbol symbol; - fun ppf -> fprintf ppf ";@ ")) - (fun _ -> ()) symbols - in fprintf ppf "@]") - and print_level ppf pp_print_space rules = - (fprintf ppf "@[[ "; - let _ = - List.fold_left - (fun sep rule -> - (fprintf ppf "%t%a" sep print_rule rule; - fun ppf -> fprintf ppf "%a| " pp_print_space ())) - (fun _ -> ()) rules - in fprintf ppf " ]@]") - - let levels ppf elev = - let _ = - List.fold_left - (fun sep lev -> - (fprintf ppf "%t@[" sep; - (match lev.lname with - | Some n -> fprintf ppf "%S@;<1 2>" n - | None -> ()); - (match lev.assoc with - | LeftA -> fprintf ppf "LEFTA" - | RightA -> fprintf ppf "RIGHTA" - | NonA -> fprintf ppf "NONA"); - fprintf ppf "@]@;<1 2>"; - fprintf ppf "@[suffix:@ "; - print_tree ppf lev.lsuffix; - fprintf ppf "@]@ @[prefix:@ "; - print_tree ppf lev.lprefix; - fprintf ppf "@]"; - fun ppf -> fprintf ppf "@,| ")) - (fun _ -> ()) elev - in () - - let entry ppf e = - (fprintf ppf "@[%s: [ " e.ename; - (match e.edesc with - | Dlevels elev -> levels ppf elev - | Dparser _ -> fprintf ppf ""); - fprintf ppf " ]@]") - - end - - end - - module Failed = - struct - module Make (Structure : Structure.S) = - struct - module Tools = Tools.Make(Structure) - - module Search = Search.Make(Structure) - - module Print = Print.Make(Structure) - - open Structure - - open Format - - let rec name_of_symbol entry = - function - | Snterm e -> "[" ^ (e.ename ^ "]") - | Snterml (e, l) -> - "[" ^ (e.ename ^ (" level " ^ (l ^ "]"))) - | Sself | Snext -> "[" ^ (entry.ename ^ "]") - | Stoken ((_, descr)) -> descr - | Skeyword kwd -> "\"" ^ (kwd ^ "\"") - | _ -> "???" - - let rec name_of_symbol_failed entry = - function - | Slist0 s | Slist0sep (s, _) | Slist1 s | Slist1sep (s, _) - | Sopt s | Stry s -> name_of_symbol_failed entry s - | Stree t -> name_of_tree_failed entry t - | s -> name_of_symbol entry s - and name_of_tree_failed entry = - function - | Node { node = s; brother = bro; son = son } -> - let tokl = - (match s with - | Stoken _ | Skeyword _ -> - Tools.get_token_list entry [] s son - | _ -> None) - in - (match tokl with - | None -> - let txt = name_of_symbol_failed entry s in - let txt = - (match (s, son) with - | (Sopt _, Node _) -> - txt ^ - (" or " ^ - (name_of_tree_failed entry son)) - | _ -> txt) in - let txt = - (match bro with - | DeadEnd | LocAct (_, _) -> txt - | Node _ -> - txt ^ - (" or " ^ - (name_of_tree_failed entry bro))) - in txt - | Some ((tokl, _, _)) -> - List.fold_left - (fun s tok -> - (if s = "" then "" else s ^ " then ") ^ - (match tok with - | Stoken ((_, descr)) -> descr - | Skeyword kwd -> kwd - | _ -> assert false)) - "" tokl) - | DeadEnd | LocAct (_, _) -> "???" - - let magic _s x = Obj.magic x - - let tree_failed entry prev_symb_result prev_symb tree = - let txt = name_of_tree_failed entry tree in - let txt = - match prev_symb with - | Slist0 s -> - let txt1 = name_of_symbol_failed entry s - in txt1 ^ (" or " ^ (txt ^ " expected")) - | Slist1 s -> - let txt1 = name_of_symbol_failed entry s - in txt1 ^ (" or " ^ (txt ^ " expected")) - | Slist0sep (s, sep) -> - (match magic "tree_failed: 'a -> list 'b" - prev_symb_result - with - | [] -> - let txt1 = name_of_symbol_failed entry s - in txt1 ^ (" or " ^ (txt ^ " expected")) - | _ -> - let txt1 = name_of_symbol_failed entry sep - in txt1 ^ (" or " ^ (txt ^ " expected"))) - | Slist1sep (s, sep) -> - (match magic "tree_failed: 'a -> list 'b" - prev_symb_result - with - | [] -> - let txt1 = name_of_symbol_failed entry s - in txt1 ^ (" or " ^ (txt ^ " expected")) - | _ -> - let txt1 = name_of_symbol_failed entry sep - in txt1 ^ (" or " ^ (txt ^ " expected"))) - | Stry _ | Sopt _ | Stree _ -> txt ^ " expected" - | _ -> - txt ^ - (" expected after " ^ - (name_of_symbol entry prev_symb)) - in - (if !(entry.egram.error_verbose) - then - (let tree = - Search.tree_in_entry prev_symb tree entry.edesc in - let ppf = err_formatter - in - (fprintf ppf "@[@,"; - fprintf ppf "----------------------------------@,"; - fprintf ppf - "Parse error in entry [%s], rule:@;<0 2>" - entry.ename; - fprintf ppf "@["; - Print.print_level ppf pp_force_newline - (Print.flatten_tree tree); - fprintf ppf "@]@,"; - fprintf ppf "----------------------------------@,"; - fprintf ppf "@]@.")) - else (); - txt ^ (" (in [" ^ (entry.ename ^ "])"))) - - let symb_failed entry prev_symb_result prev_symb symb = - let tree = - Node { node = symb; brother = DeadEnd; son = DeadEnd; } - in tree_failed entry prev_symb_result prev_symb tree - - let symb_failed_txt e s1 s2 = symb_failed e 0 s1 s2 - - end - - end - - module Parser = - struct - module Make (Structure : Structure.S) = - struct - module Tools = Tools.Make(Structure) - - module Failed = Failed.Make(Structure) - - module Print = Print.Make(Structure) - - open Structure - - open Sig.Grammar - - module StreamOrig = Stream - - let njunk strm n = for i = 1 to n do Stream.junk strm done - - let loc_bp = Tools.get_cur_loc - - let loc_ep = Tools.get_prev_loc - - let drop_prev_loc = Tools.drop_prev_loc - - let add_loc bp parse_fun strm = - let x = parse_fun strm in - let ep = loc_ep strm in - let loc = - if (Loc.start_off bp) > (Loc.stop_off ep) - then Loc.join bp - else Loc.merge bp ep - in (x, loc) - - let stream_peek_nth strm n = - let rec loop i = - function - | x :: xs -> if i = 1 then Some x else loop (i - 1) xs - | [] -> None - in loop n (Stream.npeek n strm) - - module Stream = - struct - type 'a t = 'a StreamOrig.t - - exception Failure = StreamOrig.Failure - - exception Error = StreamOrig.Error - - let peek = StreamOrig.peek - - let junk = StreamOrig.junk - - let dup strm = - let peek_nth n = - let rec loop n = - function - | [] -> None - | [ x ] -> if n = 0 then Some x else None - | _ :: l -> loop (n - 1) l - in loop n (Stream.npeek (n + 1) strm) - in Stream.from peek_nth - - end - - let try_parser ps strm = - let strm' = Stream.dup strm in - let r = - try ps strm' - with - | Stream.Error _ | Loc.Exc_located (_, (Stream.Error _)) - -> raise Stream.Failure - | exc -> raise exc - in (njunk strm (StreamOrig.count strm'); r) - - let level_number entry lab = - let rec lookup levn = - function - | [] -> failwith ("unknown level " ^ lab) - | lev :: levs -> - if Tools.is_level_labelled lab lev - then levn - else lookup (succ levn) levs - in - match entry.edesc with - | Dlevels elev -> lookup 0 elev - | Dparser _ -> raise Not_found - - let strict_parsing = ref false - - let strict_parsing_warning = ref false - - let rec top_symb entry = - function - | Sself | Snext -> Snterm entry - | Snterml (e, _) -> Snterm e - | Slist1sep (s, sep) -> Slist1sep ((top_symb entry s), sep) - | _ -> raise Stream.Failure - - let top_tree entry = - function - | Node { node = s; brother = bro; son = son } -> - Node - { node = top_symb entry s; brother = bro; son = son; - } - | LocAct (_, _) | DeadEnd -> raise Stream.Failure - - let entry_of_symb entry = - function - | Sself | Snext -> entry - | Snterm e -> e - | Snterml (e, _) -> e - | _ -> raise Stream.Failure - - let continue entry loc a s son p1 (__strm : _ Stream.t) = - let a = (entry_of_symb entry s).econtinue 0 loc a __strm in - let act = - try p1 __strm - with - | Stream.Failure -> - raise - (Stream.Error (Failed.tree_failed entry a s son)) - in Action.mk (fun _ -> Action.getf act a) - - let skip_if_empty bp strm = - if (loc_bp strm) = bp - then Action.mk (fun _ -> raise Stream.Failure) - else raise Stream.Failure - - let do_recover parser_of_tree entry nlevn alevn loc a s son - (__strm : _ Stream.t) = - try - parser_of_tree entry nlevn alevn (top_tree entry son) - __strm - with - | Stream.Failure -> - (try skip_if_empty loc __strm - with - | Stream.Failure -> - continue entry loc a s son - (parser_of_tree entry nlevn alevn son) __strm) - - let recover parser_of_tree entry nlevn alevn loc a s son strm - = - if !strict_parsing - then - raise (Stream.Error (Failed.tree_failed entry a s son)) - else - (let _ = - if !strict_parsing_warning - then - (let msg = Failed.tree_failed entry a s son - in - (Format.eprintf - "Warning: trying to recover from syntax error"; - if entry.ename <> "" - then Format.eprintf " in [%s]" entry.ename - else (); - Format.eprintf "\n%s%a@." msg Loc.print loc)) - else () - in - do_recover parser_of_tree entry nlevn alevn loc a s - son strm) - - let rec parser_of_tree entry nlevn alevn = - function - | DeadEnd -> - (fun (__strm : _ Stream.t) -> raise Stream.Failure) - | LocAct (act, _) -> (fun (__strm : _ Stream.t) -> act) - | Node - { - node = Sself; - son = LocAct (act, _); - brother = DeadEnd - } -> - (fun (__strm : _ Stream.t) -> - let a = entry.estart alevn __strm - in Action.getf act a) - | Node { node = Sself; son = LocAct (act, _); brother = bro - } -> - let p2 = parser_of_tree entry nlevn alevn bro - in - (fun (__strm : _ Stream.t) -> - match try Some (entry.estart alevn __strm) - with | Stream.Failure -> None - with - | Some a -> Action.getf act a - | _ -> p2 __strm) - | Node { node = s; son = son; brother = DeadEnd } -> - let tokl = - (match s with - | Stoken _ | Skeyword _ -> - Tools.get_token_list entry [] s son - | _ -> None) - in - (match tokl with - | None -> - let ps = parser_of_symbol entry nlevn s in - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = parser_cont p1 entry nlevn alevn s son - in - (fun strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm in - let a = ps __strm in - let act = - try p1 bp a __strm - with - | Stream.Failure -> - raise (Stream.Error "") - in Action.getf act a) - | Some ((tokl, last_tok, son)) -> - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = - parser_cont p1 entry nlevn alevn last_tok son - in parser_of_token_list p1 tokl) - | Node { node = s; son = son; brother = bro } -> - let tokl = - (match s with - | Stoken _ | Skeyword _ -> - Tools.get_token_list entry [] s son - | _ -> None) - in - (match tokl with - | None -> - let ps = parser_of_symbol entry nlevn s in - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = - parser_cont p1 entry nlevn alevn s son in - let p2 = parser_of_tree entry nlevn alevn bro - in - (fun strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm - in - match try Some (ps __strm) - with | Stream.Failure -> None - with - | Some a -> - let act = - (try p1 bp a __strm - with - | Stream.Failure -> - raise (Stream.Error "")) - in Action.getf act a - | _ -> p2 __strm) - | Some ((tokl, last_tok, son)) -> - let p1 = parser_of_tree entry nlevn alevn son in - let p1 = - parser_cont p1 entry nlevn alevn last_tok son in - let p1 = parser_of_token_list p1 tokl in - let p2 = parser_of_tree entry nlevn alevn bro - in - (fun (__strm : _ Stream.t) -> - try p1 __strm - with | Stream.Failure -> p2 __strm)) - and - parser_cont p1 entry nlevn alevn s son loc a - (__strm : _ Stream.t) = - try p1 __strm - with - | Stream.Failure -> - (try - recover parser_of_tree entry nlevn alevn loc a s son - __strm - with - | Stream.Failure -> - raise - (Stream.Error (Failed.tree_failed entry a s son))) - and parser_of_token_list p1 tokl = - let rec loop n = - function - | Stoken ((tematch, _)) :: tokl -> - (match tokl with - | [] -> - let ps strm = - (match stream_peek_nth strm n with - | Some ((tok, _)) when tematch tok -> - (njunk strm n; Action.mk tok) - | _ -> raise Stream.Failure) - in - (fun strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm in - let a = ps __strm in - let act = - try p1 bp a __strm - with - | Stream.Failure -> - raise (Stream.Error "") - in Action.getf act a) - | _ -> - let ps strm = - (match stream_peek_nth strm n with - | Some ((tok, _)) when tematch tok -> tok - | _ -> raise Stream.Failure) in - let p1 = loop (n + 1) tokl - in - (fun (__strm : _ Stream.t) -> - let tok = ps __strm in - let s = __strm in - let act = p1 s in Action.getf act tok)) - | Skeyword kwd :: tokl -> - (match tokl with - | [] -> - let ps strm = - (match stream_peek_nth strm n with - | Some ((tok, _)) when - Token.match_keyword kwd tok -> - (njunk strm n; Action.mk tok) - | _ -> raise Stream.Failure) - in - (fun strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm in - let a = ps __strm in - let act = - try p1 bp a __strm - with - | Stream.Failure -> - raise (Stream.Error "") - in Action.getf act a) - | _ -> - let ps strm = - (match stream_peek_nth strm n with - | Some ((tok, _)) when - Token.match_keyword kwd tok -> tok - | _ -> raise Stream.Failure) in - let p1 = loop (n + 1) tokl - in - (fun (__strm : _ Stream.t) -> - let tok = ps __strm in - let s = __strm in - let act = p1 s in Action.getf act tok)) - | _ -> invalid_arg "parser_of_token_list" - in loop 1 tokl - and parser_of_symbol entry nlevn = - function - | Smeta (_, symbl, act) -> - let act = Obj.magic act entry symbl in - let pl = List.map (parser_of_symbol entry nlevn) symbl - in - Obj.magic - (List.fold_left (fun act p -> Obj.magic act p) act - pl) - | Slist0 s -> - let ps = parser_of_symbol entry nlevn s in - let rec loop al (__strm : _ Stream.t) = - (match try Some (ps __strm) - with | Stream.Failure -> None - with - | Some a -> loop (a :: al) __strm - | _ -> al) - in - (fun (__strm : _ Stream.t) -> - let a = loop [] __strm in Action.mk (List.rev a)) - | Slist0sep (symb, sep) -> - let ps = parser_of_symbol entry nlevn symb in - let pt = parser_of_symbol entry nlevn sep in - let rec kont al (__strm : _ Stream.t) = - (match try Some (pt __strm) - with | Stream.Failure -> None - with - | Some v -> - let a = - (try ps __strm - with - | Stream.Failure -> - raise - (Stream.Error - (Failed.symb_failed entry v sep symb))) - in kont (a :: al) __strm - | _ -> al) - in - (fun (__strm : _ Stream.t) -> - match try Some (ps __strm) - with | Stream.Failure -> None - with - | Some a -> - let s = __strm - in Action.mk (List.rev (kont [ a ] s)) - | _ -> Action.mk []) - | Slist1 s -> - let ps = parser_of_symbol entry nlevn s in - let rec loop al (__strm : _ Stream.t) = - (match try Some (ps __strm) - with | Stream.Failure -> None - with - | Some a -> loop (a :: al) __strm - | _ -> al) - in - (fun (__strm : _ Stream.t) -> - let a = ps __strm in - let s = __strm - in Action.mk (List.rev (loop [ a ] s))) - | Slist1sep (symb, sep) -> - let ps = parser_of_symbol entry nlevn symb in - let pt = parser_of_symbol entry nlevn sep in - let rec kont al (__strm : _ Stream.t) = - (match try Some (pt __strm) - with | Stream.Failure -> None - with - | Some v -> - let a = - (try ps __strm - with - | Stream.Failure -> - (try parse_top_symb entry symb __strm - with - | Stream.Failure -> - raise - (Stream.Error - (Failed.symb_failed entry v sep - symb)))) - in kont (a :: al) __strm - | _ -> al) - in - (fun (__strm : _ Stream.t) -> - let a = ps __strm in - let s = __strm - in Action.mk (List.rev (kont [ a ] s))) - | Sopt s -> - let ps = parser_of_symbol entry nlevn s - in - (fun (__strm : _ Stream.t) -> - match try Some (ps __strm) - with | Stream.Failure -> None - with - | Some a -> Action.mk (Some a) - | _ -> Action.mk None) - | Stry s -> - let ps = parser_of_symbol entry nlevn s - in try_parser ps - | Stree t -> - let pt = parser_of_tree entry 1 0 t - in - (fun strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm in - let (act, loc) = add_loc bp pt __strm - in Action.getf act loc) - | Snterm e -> - (fun (__strm : _ Stream.t) -> e.estart 0 __strm) - | Snterml (e, l) -> - (fun (__strm : _ Stream.t) -> - e.estart (level_number e l) __strm) - | Sself -> - (fun (__strm : _ Stream.t) -> entry.estart 0 __strm) - | Snext -> - (fun (__strm : _ Stream.t) -> entry.estart nlevn __strm) - | Skeyword kwd -> - (fun (__strm : _ Stream.t) -> - match Stream.peek __strm with - | Some ((tok, _)) when Token.match_keyword kwd tok - -> (Stream.junk __strm; Action.mk tok) - | _ -> raise Stream.Failure) - | Stoken ((f, _)) -> - (fun (__strm : _ Stream.t) -> - match Stream.peek __strm with - | Some ((tok, _)) when f tok -> - (Stream.junk __strm; Action.mk tok) - | _ -> raise Stream.Failure) - and parse_top_symb entry symb strm = - parser_of_symbol entry 0 (top_symb entry symb) strm - - let rec start_parser_of_levels entry clevn = - function - | [] -> - (fun _ (__strm : _ Stream.t) -> raise Stream.Failure) - | lev :: levs -> - let p1 = start_parser_of_levels entry (succ clevn) levs - in - (match lev.lprefix with - | DeadEnd -> p1 - | tree -> - let alevn = - (match lev.assoc with - | LeftA | NonA -> succ clevn - | RightA -> clevn) in - let p2 = - parser_of_tree entry (succ clevn) alevn tree - in - (match levs with - | [] -> - (fun levn strm -> - let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm in - let (act, loc) = - add_loc bp p2 __strm in - let strm = __strm in - let a = Action.getf act loc - in entry.econtinue levn loc a strm) - | _ -> - (fun levn strm -> - if levn > clevn - then p1 levn strm - else - (let bp = loc_bp strm in - let (__strm : _ Stream.t) = strm - in - match try - Some - (add_loc bp p2 __strm) - with - | Stream.Failure -> None - with - | Some ((act, loc)) -> - let a = Action.getf act loc - in - entry.econtinue levn loc a - strm - | _ -> p1 levn __strm)))) - - let start_parser_of_entry entry = - match entry.edesc with - | Dlevels [] -> Tools.empty_entry entry.ename - | Dlevels elev -> start_parser_of_levels entry 0 elev - | Dparser p -> (fun _ -> p) - - let rec continue_parser_of_levels entry clevn = - function - | [] -> - (fun _ _ _ (__strm : _ Stream.t) -> - raise Stream.Failure) - | lev :: levs -> - let p1 = - continue_parser_of_levels entry (succ clevn) levs - in - (match lev.lsuffix with - | DeadEnd -> p1 - | tree -> - let alevn = - (match lev.assoc with - | LeftA | NonA -> succ clevn - | RightA -> clevn) in - let p2 = - parser_of_tree entry (succ clevn) alevn tree - in - (fun levn bp a strm -> - if levn > clevn - then p1 levn bp a strm - else - (let (__strm : _ Stream.t) = strm - in - try p1 levn bp a __strm - with - | Stream.Failure -> - let (act, loc) = - add_loc bp p2 __strm in - let a = Action.getf2 act a loc - in entry.econtinue levn loc a strm))) - - let continue_parser_of_entry entry = - match entry.edesc with - | Dlevels elev -> - let p = continue_parser_of_levels entry 0 elev - in - (fun levn bp a (__strm : _ Stream.t) -> - try p levn bp a __strm with | Stream.Failure -> a) - | Dparser _ -> - (fun _ _ _ (__strm : _ Stream.t) -> - raise Stream.Failure) - - end - - end - - module Insert = - struct - module Make (Structure : Structure.S) = - struct - module Tools = Tools.Make(Structure) - - module Parser = Parser.Make(Structure) - - open Structure - - open Format - - open Sig.Grammar - - let is_before s1 s2 = - match (s1, s2) with - | ((Skeyword _ | Stoken _), (Skeyword _ | Stoken _)) -> - false - | ((Skeyword _ | Stoken _), _) -> true - | _ -> false - - let rec derive_eps = - function - | Slist0 _ | Slist0sep (_, _) | Sopt _ -> true - | Stry s -> derive_eps s - | Stree t -> tree_derive_eps t - | Slist1 _ | Slist1sep (_, _) | Stoken _ | Skeyword _ -> - false - | Smeta (_, _, _) | Snterm _ | Snterml (_, _) | Snext | - Sself -> false - and tree_derive_eps = - function - | LocAct (_, _) -> true - | Node { node = s; brother = bro; son = son } -> - ((derive_eps s) && (tree_derive_eps son)) || - (tree_derive_eps bro) - | DeadEnd -> false - - let empty_lev lname assoc = - let assoc = match assoc with | Some a -> a | None -> LeftA - in - { - assoc = assoc; - lname = lname; - lsuffix = DeadEnd; - lprefix = DeadEnd; - } - - let change_lev entry lev n lname assoc = - let a = - match assoc with - | None -> lev.assoc - | Some a -> - (if - (a <> lev.assoc) && !(entry.egram.warning_verbose) - then - (eprintf - " Changing associativity of level \"%s\"\n" - n; - flush Pervasives.stderr) - else (); - a) - in - ((match lname with - | Some n -> - if - (lname <> lev.lname) && - !(entry.egram.warning_verbose) - then - (eprintf " Level label \"%s\" ignored\n" n; - flush Pervasives.stderr) - else () - | None -> ()); - { - assoc = a; - lname = lev.lname; - lsuffix = lev.lsuffix; - lprefix = lev.lprefix; - }) - - let change_to_self entry = - function | Snterm e when e == entry -> Sself | x -> x - - let get_level entry position levs = - match position with - | Some First -> ([], empty_lev, levs) - | Some Last -> (levs, empty_lev, []) - | Some (Level n) -> - let rec get = - (function - | [] -> - (eprintf - "No level labelled \"%s\" in entry \"%s\"\n" - n entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend") - | lev :: levs -> - if Tools.is_level_labelled n lev - then ([], (change_lev entry lev n), levs) - else - (let (levs1, rlev, levs2) = get levs - in ((lev :: levs1), rlev, levs2))) - in get levs - | Some (Before n) -> - let rec get = - (function - | [] -> - (eprintf - "No level labelled \"%s\" in entry \"%s\"\n" - n entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend") - | lev :: levs -> - if Tools.is_level_labelled n lev - then ([], empty_lev, (lev :: levs)) - else - (let (levs1, rlev, levs2) = get levs - in ((lev :: levs1), rlev, levs2))) - in get levs - | Some (After n) -> - let rec get = - (function - | [] -> - (eprintf - "No level labelled \"%s\" in entry \"%s\"\n" - n entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend") - | lev :: levs -> - if Tools.is_level_labelled n lev - then ([ lev ], empty_lev, levs) - else - (let (levs1, rlev, levs2) = get levs - in ((lev :: levs1), rlev, levs2))) - in get levs - | None -> - (match levs with - | lev :: levs -> - ([], (change_lev entry lev ""), levs) - | [] -> ([], empty_lev, [])) - - let rec check_gram entry = - function - | Snterm e -> - if ( != ) e.egram entry.egram - then - (eprintf - "\ - Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" - entry.ename e.ename; - flush Pervasives.stderr; - failwith "Grammar.extend error") - else () - | Snterml (e, _) -> - if ( != ) e.egram entry.egram - then - (eprintf - "\ - Error: entries \"%s\" and \"%s\" do not belong to the same grammar.\n" - entry.ename e.ename; - flush Pervasives.stderr; - failwith "Grammar.extend error") - else () - | Smeta (_, sl, _) -> List.iter (check_gram entry) sl - | Slist0sep (s, t) -> - (check_gram entry t; check_gram entry s) - | Slist1sep (s, t) -> - (check_gram entry t; check_gram entry s) - | Slist0 s | Slist1 s | Sopt s | Stry s -> - check_gram entry s - | Stree t -> tree_check_gram entry t - | Snext | Sself | Stoken _ | Skeyword _ -> () - and tree_check_gram entry = - function - | Node { node = n; brother = bro; son = son } -> - (check_gram entry n; - tree_check_gram entry bro; - tree_check_gram entry son) - | LocAct (_, _) | DeadEnd -> () - - let get_initial = - function - | Sself :: symbols -> (true, symbols) - | symbols -> (false, symbols) - - let insert_tokens gram symbols = - let rec insert = - function - | Smeta (_, sl, _) -> List.iter insert sl - | Slist0 s | Slist1 s | Sopt s | Stry s -> insert s - | Slist0sep (s, t) -> (insert s; insert t) - | Slist1sep (s, t) -> (insert s; insert t) - | Stree t -> tinsert t - | Skeyword kwd -> using gram kwd - | Snterm _ | Snterml (_, _) | Snext | Sself | Stoken _ -> - () - and tinsert = - function - | Node { node = s; brother = bro; son = son } -> - (insert s; tinsert bro; tinsert son) - | LocAct (_, _) | DeadEnd -> () - in List.iter insert symbols - - let insert_tree entry gsymbols action tree = - let rec insert symbols tree = - match symbols with - | s :: sl -> insert_in_tree s sl tree - | [] -> - (match tree with - | Node { node = s; son = son; brother = bro } -> - Node - { - node = s; - son = son; - brother = insert [] bro; - } - | LocAct (old_action, action_list) -> - let () = - if !(entry.egram.warning_verbose) - then - eprintf - " Grammar extension: in [%s] some rule has been masked@." - entry.ename - else () - in LocAct (action, (old_action :: action_list)) - | DeadEnd -> LocAct (action, [])) - and insert_in_tree s sl tree = - match try_insert s sl tree with - | Some t -> t - | None -> - Node - { - node = s; - son = insert sl DeadEnd; - brother = tree; - } - and try_insert s sl tree = - match tree with - | Node { node = s1; son = son; brother = bro } -> - if Tools.eq_symbol s s1 - then - (let t = - Node - { - node = s1; - son = insert sl son; - brother = bro; - } - in Some t) - else - if - (is_before s1 s) || - ((derive_eps s) && (not (derive_eps s1))) - then - (let bro = - match try_insert s sl bro with - | Some bro -> bro - | None -> - Node - { - node = s; - son = insert sl DeadEnd; - brother = bro; - } in - let t = - Node { node = s1; son = son; brother = bro; } - in Some t) - else - (match try_insert s sl bro with - | Some bro -> - let t = - Node - { node = s1; son = son; brother = bro; } - in Some t - | None -> None) - | LocAct (_, _) | DeadEnd -> None - in insert gsymbols tree - - let insert_level entry e1 symbols action slev = - match e1 with - | true -> - { - assoc = slev.assoc; - lname = slev.lname; - lsuffix = - insert_tree entry symbols action slev.lsuffix; - lprefix = slev.lprefix; - } - | false -> - { - assoc = slev.assoc; - lname = slev.lname; - lsuffix = slev.lsuffix; - lprefix = - insert_tree entry symbols action slev.lprefix; - } - - let levels_of_rules entry position rules = - let elev = - match entry.edesc with - | Dlevels elev -> elev - | Dparser _ -> - (eprintf "Error: entry not extensible: \"%s\"\n" - entry.ename; - flush Pervasives.stderr; - failwith "Grammar.extend") - in - if rules = [] - then elev - else - (let (levs1, make_lev, levs2) = - get_level entry position elev in - let (levs, _) = - List.fold_left - (fun (levs, make_lev) (lname, assoc, level) -> - let lev = make_lev lname assoc in - let lev = - List.fold_left - (fun lev (symbols, action) -> - let symbols = - List.map (change_to_self entry) - symbols - in - (List.iter (check_gram entry) symbols; - let (e1, symbols) = - get_initial symbols - in - (insert_tokens entry.egram symbols; - insert_level entry e1 symbols - action lev))) - lev level - in ((lev :: levs), empty_lev)) - ([], make_lev) rules - in levs1 @ ((List.rev levs) @ levs2)) - - let extend entry (position, rules) = - let elev = levels_of_rules entry position rules - in - (entry.edesc <- Dlevels elev; - entry.estart <- - (fun lev strm -> - let f = Parser.start_parser_of_entry entry - in (entry.estart <- f; f lev strm)); - entry.econtinue <- - fun lev bp a strm -> - let f = Parser.continue_parser_of_entry entry - in (entry.econtinue <- f; f lev bp a strm)) - - end - - end - - module Delete = - struct - exception Rule_not_found of (string * string) - - let _ = - let () = - Printexc.register_printer - (function - | Rule_not_found ((symbols, entry)) -> - let msg = - Printf.sprintf - "rule %S cannot be found in entry\n%s" symbols - entry - in Some msg - | _ -> None) - in () - - module Make (Structure : Structure.S) = - struct - module Tools = Tools.Make(Structure) - - module Parser = Parser.Make(Structure) - - module Print = Print.Make(Structure) - - open Structure - - let raise_rule_not_found entry symbols = - let to_string f x = - let buff = Buffer.create 128 in - let ppf = Format.formatter_of_buffer buff - in - (f ppf x; - Format.pp_print_flush ppf (); - Buffer.contents buff) in - let entry = to_string Print.entry entry in - let symbols = to_string Print.print_rule symbols - in raise (Rule_not_found ((symbols, entry))) - - let delete_rule_in_tree entry = - let rec delete_in_tree symbols tree = - match (symbols, tree) with - | (s :: sl, Node n) -> - if Tools.logically_eq_symbols entry s n.node - then delete_son sl n - else - (match delete_in_tree symbols n.brother with - | Some ((dsl, t)) -> - Some - ((dsl, - (Node - { - node = n.node; - son = n.son; - brother = t; - }))) - | None -> None) - | (_ :: _, _) -> None - | ([], Node n) -> - (match delete_in_tree [] n.brother with - | Some ((dsl, t)) -> - Some - ((dsl, - (Node - { - node = n.node; - son = n.son; - brother = t; - }))) - | None -> None) - | ([], DeadEnd) -> None - | ([], LocAct (_, [])) -> Some (((Some []), DeadEnd)) - | ([], LocAct (_, (action :: list))) -> - Some ((None, (LocAct (action, list)))) - and delete_son sl n = - match delete_in_tree sl n.son with - | Some ((Some dsl, DeadEnd)) -> - Some (((Some (n.node :: dsl)), (n.brother))) - | Some ((Some dsl, t)) -> - let t = - Node - { node = n.node; son = t; brother = n.brother; } - in Some (((Some (n.node :: dsl)), t)) - | Some ((None, t)) -> - let t = - Node - { node = n.node; son = t; brother = n.brother; } - in Some ((None, t)) - | None -> None - in delete_in_tree - - let rec decr_keyw_use gram = - function - | Skeyword kwd -> removing gram kwd - | Smeta (_, sl, _) -> List.iter (decr_keyw_use gram) sl - | Slist0 s | Slist1 s | Sopt s | Stry s -> - decr_keyw_use gram s - | Slist0sep (s1, s2) -> - (decr_keyw_use gram s1; decr_keyw_use gram s2) - | Slist1sep (s1, s2) -> - (decr_keyw_use gram s1; decr_keyw_use gram s2) - | Stree t -> decr_keyw_use_in_tree gram t - | Sself | Snext | Snterm _ | Snterml (_, _) | Stoken _ -> - () - and decr_keyw_use_in_tree gram = - function - | DeadEnd | LocAct (_, _) -> () - | Node n -> - (decr_keyw_use gram n.node; - decr_keyw_use_in_tree gram n.son; - decr_keyw_use_in_tree gram n.brother) - - let rec delete_rule_in_suffix entry symbols = - function - | lev :: levs -> - (match delete_rule_in_tree entry symbols lev.lsuffix - with - | Some ((dsl, t)) -> - ((match dsl with - | Some dsl -> - List.iter (decr_keyw_use entry.egram) dsl - | None -> ()); - (match t with - | DeadEnd when lev.lprefix == DeadEnd -> levs - | _ -> - let lev = - { - assoc = lev.assoc; - lname = lev.lname; - lsuffix = t; - lprefix = lev.lprefix; - } - in lev :: levs)) - | None -> - let levs = - delete_rule_in_suffix entry symbols levs - in lev :: levs) - | [] -> raise_rule_not_found entry symbols - - let rec delete_rule_in_prefix entry symbols = - function - | lev :: levs -> - (match delete_rule_in_tree entry symbols lev.lprefix - with - | Some ((dsl, t)) -> - ((match dsl with - | Some dsl -> - List.iter (decr_keyw_use entry.egram) dsl - | None -> ()); - (match t with - | DeadEnd when lev.lsuffix == DeadEnd -> levs - | _ -> - let lev = - { - assoc = lev.assoc; - lname = lev.lname; - lsuffix = lev.lsuffix; - lprefix = t; - } - in lev :: levs)) - | None -> - let levs = - delete_rule_in_prefix entry symbols levs - in lev :: levs) - | [] -> raise_rule_not_found entry symbols - - let rec delete_rule_in_level_list entry symbols levs = - match symbols with - | Sself :: symbols -> - delete_rule_in_suffix entry symbols levs - | Snterm e :: symbols when e == entry -> - delete_rule_in_suffix entry symbols levs - | _ -> delete_rule_in_prefix entry symbols levs - - let delete_rule entry sl = - match entry.edesc with - | Dlevels levs -> - let levs = delete_rule_in_level_list entry sl levs - in - (entry.edesc <- Dlevels levs; - entry.estart <- - (fun lev strm -> - let f = Parser.start_parser_of_entry entry - in (entry.estart <- f; f lev strm)); - entry.econtinue <- - (fun lev bp a strm -> - let f = Parser.continue_parser_of_entry entry - in (entry.econtinue <- f; f lev bp a strm))) - | Dparser _ -> () - - end - - end - - module Fold : - sig - module Make (Structure : Structure.S) : - sig - open Structure - - val sfold0 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold1 : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) fold - - val sfold0sep : ('a -> 'b -> 'b) -> 'b -> (_, 'a, 'b) foldsep - - end - - end = - struct - module Make (Structure : Structure.S) = - struct - open Structure - - open Format - - module Parse = Parser.Make(Structure) - - module Fail = Failed.Make(Structure) - - open Sig.Grammar - - module Stream = - struct - type 'a t = 'a Stream.t - - exception Failure = Stream.Failure - - exception Error = Stream.Error - - end - - let sfold0 f e _entry _symbl psymb = - let rec fold accu (__strm : _ Stream.t) = - match try Some (psymb __strm) - with | Stream.Failure -> None - with - | Some a -> fold (f a accu) __strm - | _ -> accu - in fun (__strm : _ Stream.t) -> fold e __strm - - let sfold1 f e _entry _symbl psymb = - let rec fold accu (__strm : _ Stream.t) = - match try Some (psymb __strm) - with | Stream.Failure -> None - with - | Some a -> fold (f a accu) __strm - | _ -> accu - in - fun (__strm : _ Stream.t) -> - let a = psymb __strm - in - try fold (f a e) __strm - with | Stream.Failure -> raise (Stream.Error "") - - let sfold0sep f e entry symbl psymb psep = - let failed = - function - | [ symb; sep ] -> Fail.symb_failed_txt entry sep symb - | _ -> "failed" in - let rec kont accu (__strm : _ Stream.t) = - match try Some (psep __strm) - with | Stream.Failure -> None - with - | Some () -> - let a = - (try psymb __strm - with - | Stream.Failure -> - raise (Stream.Error (failed symbl))) - in kont (f a accu) __strm - | _ -> accu - in - fun (__strm : _ Stream.t) -> - match try Some (psymb __strm) - with | Stream.Failure -> None - with - | Some a -> kont (f a e) __strm - | _ -> e - - let sfold1sep f e entry symbl psymb psep = - let failed = - function - | [ symb; sep ] -> Fail.symb_failed_txt entry sep symb - | _ -> "failed" in - let parse_top = - function - | [ symb; _ ] -> Parse.parse_top_symb entry symb - | _ -> raise Stream.Failure in - let rec kont accu (__strm : _ Stream.t) = - match try Some (psep __strm) - with | Stream.Failure -> None - with - | Some () -> - let a = - (try - try psymb __strm - with - | Stream.Failure -> - let a = - (try parse_top symbl __strm - with - | Stream.Failure -> - raise (Stream.Error (failed symbl))) - in Obj.magic a - with | Stream.Failure -> raise (Stream.Error "")) - in kont (f a accu) __strm - | _ -> accu - in - fun (__strm : _ Stream.t) -> - let a = psymb __strm in kont (f a e) __strm - - end - - end - - module Entry = - struct - module Make (Structure : Structure.S) = - struct - module Dump = Print.MakeDump(Structure) - - module Print = Print.Make(Structure) - - module Tools = Tools.Make(Structure) - - open Format - - open Structure - - open Tools - - type 'a t = internal_entry - - let name e = e.ename - - let print ppf e = fprintf ppf "%a@\n" Print.entry e - - let dump ppf e = fprintf ppf "%a@\n" Dump.entry e - - let mk g n = - { - egram = g; - ename = n; - estart = empty_entry n; - econtinue = - (fun _ _ _ (__strm : _ Stream.t) -> - raise Stream.Failure); - edesc = Dlevels []; - } - - let action_parse entry ts : Action.t = - try entry.estart 0 ts - with - | Stream.Failure -> - Loc.raise (get_prev_loc ts) - (Stream.Error ("illegal begin of " ^ entry.ename)) - | (Loc.Exc_located (_, _) as exc) -> raise exc - | exc -> Loc.raise (get_prev_loc ts) exc - - let lex entry loc cs = entry.egram.glexer loc cs - - let lex_string entry loc str = - lex entry loc (Stream.of_string str) - - let filter entry ts = - keep_prev_loc - (Token.Filter.filter (get_filter entry.egram) ts) - - let parse_tokens_after_filter entry ts = - Action.get (action_parse entry ts) - - let parse_tokens_before_filter entry ts = - parse_tokens_after_filter entry (filter entry ts) - - let parse entry loc cs = - parse_tokens_before_filter entry (lex entry loc cs) - - let parse_string entry loc str = - parse_tokens_before_filter entry (lex_string entry loc str) - - let of_parser g n - (p : (Token.t * token_info) Stream.t -> 'a) : 'a t = - let f ts = Action.mk (p ts) - in - { - egram = g; - ename = n; - estart = (fun _ -> f); - econtinue = - (fun _ _ _ (__strm : _ Stream.t) -> - raise Stream.Failure); - edesc = Dparser f; - } - - let setup_parser e - (p : (Token.t * token_info) Stream.t -> 'a) - = - let f ts = Action.mk (p ts) - in - (e.estart <- (fun _ -> f); - e.econtinue <- - (fun _ _ _ (__strm : _ Stream.t) -> - raise Stream.Failure); - e.edesc <- Dparser f) - - let clear e = - (e.estart <- - (fun _ (__strm : _ Stream.t) -> raise Stream.Failure); - e.econtinue <- - (fun _ _ _ (__strm : _ Stream.t) -> raise Stream.Failure); - e.edesc <- Dlevels []) - - let obj x = x - - end - - end - - module Static = - struct - let uncurry f (x, y) = f x y - - let flip f x y = f y x - - module Make (Lexer : Sig.Lexer) : - Sig.Grammar.Static with module Loc = Lexer.Loc - and module Token = Lexer.Token = - struct - module Structure = Structure.Make(Lexer) - - module Delete = Delete.Make(Structure) - - module Insert = Insert.Make(Structure) - - module Fold = Fold.Make(Structure) - - module Tools = Tools.Make(Structure) - - include Structure - - let gram = - let gkeywords = Hashtbl.create 301 - in - { - gkeywords = gkeywords; - gfilter = Token.Filter.mk (Hashtbl.mem gkeywords); - glexer = Lexer.mk (); - warning_verbose = ref true; - error_verbose = Camlp4_config.verbose; - } - - module Entry = - struct - module E = Entry.Make(Structure) - - type 'a t = 'a E.t - - let mk = E.mk gram - - let of_parser name strm = E.of_parser gram name strm - - let setup_parser = E.setup_parser - - let name = E.name - - let print = E.print - - let clear = E.clear - - let dump = E.dump - - let obj x = x - - end - - let get_filter () = gram.gfilter - - let lex loc cs = gram.glexer loc cs - - let lex_string loc str = lex loc (Stream.of_string str) - - let filter ts = - Tools.keep_prev_loc (Token.Filter.filter gram.gfilter ts) - - let parse_tokens_after_filter entry ts = - Entry.E.parse_tokens_after_filter entry ts - - let parse_tokens_before_filter entry ts = - parse_tokens_after_filter entry (filter ts) - - let parse entry loc cs = - parse_tokens_before_filter entry (lex loc cs) - - let parse_string entry loc str = - parse_tokens_before_filter entry (lex_string loc str) - - let delete_rule = Delete.delete_rule - - let srules e rl = - Stree - (List.fold_left (flip (uncurry (Insert.insert_tree e))) - DeadEnd rl) - - let sfold0 = Fold.sfold0 - - let sfold1 = Fold.sfold1 - - let sfold0sep = Fold.sfold0sep - - let extend = Insert.extend - - end - - end - - module Dynamic = - struct - module Make (Lexer : Sig.Lexer) : - Sig.Grammar.Dynamic with module Loc = Lexer.Loc - and module Token = Lexer.Token = - struct - module Structure = Structure.Make(Lexer) - - module Delete = Delete.Make(Structure) - - module Insert = Insert.Make(Structure) - - module Entry = Entry.Make(Structure) - - module Fold = Fold.Make(Structure) - - module Tools = Tools.Make(Structure) - - include Structure - - let mk () = - let gkeywords = Hashtbl.create 301 - in - { - gkeywords = gkeywords; - gfilter = Token.Filter.mk (Hashtbl.mem gkeywords); - glexer = Lexer.mk (); - warning_verbose = ref true; - error_verbose = Camlp4_config.verbose; - } - - let get_filter g = g.gfilter - - let lex g loc cs = g.glexer loc cs - - let lex_string g loc str = lex g loc (Stream.of_string str) - - let filter g ts = - Tools.keep_prev_loc (Token.Filter.filter g.gfilter ts) - - let parse_tokens_after_filter entry ts = - Entry.parse_tokens_after_filter entry ts - - let parse_tokens_before_filter entry ts = - parse_tokens_after_filter entry (filter entry.egram ts) - - let parse entry loc cs = - parse_tokens_before_filter entry (lex entry.egram loc cs) - - let parse_string entry loc str = - parse_tokens_before_filter entry - (lex_string entry.egram loc str) - - let delete_rule = Delete.delete_rule - - let srules e rl = - let t = - List.fold_left - (fun tree (symbols, action) -> - Insert.insert_tree e symbols action tree) - DeadEnd rl - in Stree t - - let sfold0 = Fold.sfold0 - - let sfold1 = Fold.sfold1 - - let sfold0sep = Fold.sfold0sep - - let extend = Insert.extend - - end - - end - - end - - end - -module Printers = - struct - module DumpCamlp4Ast : - sig - module Id : Sig.Id - - module Make (Syntax : Sig.Syntax) : Sig.Printer(Syntax.Ast).S - - end = - struct - module Id = - struct - let name = "Camlp4Printers.DumpCamlp4Ast" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Syntax) : Sig.Printer(Syntax.Ast).S = - struct - include Syntax - - let with_open_out_file x f = - match x with - | Some file -> - let oc = open_out_bin file - in (f oc; flush oc; close_out oc) - | None -> - (set_binary_mode_out stdout true; f stdout; flush stdout) - - let dump_ast magic ast oc = - (output_string oc magic; output_value oc ast) - - let print_interf ?input_file:(_) ?output_file ast = - with_open_out_file output_file - (dump_ast Camlp4_config.camlp4_ast_intf_magic_number ast) - - let print_implem ?input_file:(_) ?output_file ast = - with_open_out_file output_file - (dump_ast Camlp4_config.camlp4_ast_impl_magic_number ast) - - end - - end - - module DumpOCamlAst : - sig - module Id : Sig.Id - - module Make (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax.Ast).S - - end = - struct - module Id : Sig.Id = - struct - let name = "Camlp4Printers.DumpOCamlAst" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax.Ast).S = - struct - include Syntax - - module Ast2pt = Struct.Camlp4Ast2OCamlAst.Make(Ast) - - let with_open_out_file x f = - match x with - | Some file -> - let oc = open_out_bin file - in (f oc; flush oc; close_out oc) - | None -> - (set_binary_mode_out stdout true; f stdout; flush stdout) - - let dump_pt magic fname pt oc = - (output_string oc magic; - output_value oc (if fname = "-" then "" else fname); - output_value oc pt) - - let print_interf ?(input_file = "-") ?output_file ast = - let pt = Ast2pt.sig_item ast - in - with_open_out_file output_file - (dump_pt Camlp4_config.ocaml_ast_intf_magic_number - input_file pt) - - let print_implem ?(input_file = "-") ?output_file ast = - let pt = Ast2pt.str_item ast - in - with_open_out_file output_file - (dump_pt Camlp4_config.ocaml_ast_impl_magic_number - input_file pt) - - end - - end - - module Null : - sig - module Id : Sig.Id - - module Make (Syntax : Sig.Syntax) : Sig.Printer(Syntax.Ast).S - - end = - struct - module Id = - struct - let name = "Camlp4.Printers.Null" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Syntax) = - struct - include Syntax - - let print_interf ?input_file:(_) ?output_file:(_) _ = () - - let print_implem ?input_file:(_) ?output_file:(_) _ = () - - end - - end - - module OCaml : - sig - module Id : Sig.Id - - module Make (Syntax : Sig.Camlp4Syntax) : - sig - open Format - - include Sig.Camlp4Syntax with module Loc = Syntax.Loc - and module Token = Syntax.Token and module Ast = Syntax.Ast - and module Gram = Syntax.Gram - - type sep = (unit, formatter, unit) format - - type fun_binding = [ | `patt of Ast.patt | `newtype of string ] - - val list' : - (formatter -> 'a -> unit) -> - ('b, formatter, unit) format -> - (unit, formatter, unit) format -> - formatter -> 'a list -> unit - - val list : - (formatter -> 'a -> unit) -> - ('b, formatter, unit) format -> formatter -> 'a list -> unit - - val lex_string : string -> Token.t - - val is_infix : string -> bool - - val is_keyword : string -> bool - - val ocaml_char : string -> string - - val get_expr_args : - Ast.expr -> Ast.expr list -> (Ast.expr * (Ast.expr list)) - - val get_patt_args : - Ast.patt -> Ast.patt list -> (Ast.patt * (Ast.patt list)) - - val get_ctyp_args : - Ast.ctyp -> Ast.ctyp list -> (Ast.ctyp * (Ast.ctyp list)) - - val expr_fun_args : Ast.expr -> ((fun_binding list) * Ast.expr) - - class printer : - ?curry_constr: bool -> - ?comments: bool -> - unit -> - object ('a) - method interf : formatter -> Ast.sig_item -> unit - method implem : formatter -> Ast.str_item -> unit - method sig_item : formatter -> Ast.sig_item -> unit - method str_item : formatter -> Ast.str_item -> unit - val pipe : bool - val semi : bool - val semisep : sep - val no_semisep : sep - method value_val : string - method value_let : string - method andsep : sep - method anti : formatter -> string -> unit - method class_declaration : - formatter -> Ast.class_expr -> unit - method class_expr : formatter -> Ast.class_expr -> unit - method class_sig_item : - formatter -> Ast.class_sig_item -> unit - method class_str_item : - formatter -> Ast.class_str_item -> unit - method class_type : formatter -> Ast.class_type -> unit - method constrain : - formatter -> (Ast.ctyp * Ast.ctyp) -> unit - method ctyp : formatter -> Ast.ctyp -> unit - method ctyp1 : formatter -> Ast.ctyp -> unit - method constructor_type : formatter -> Ast.ctyp -> unit - method dot_expr : formatter -> Ast.expr -> unit - method apply_expr : formatter -> Ast.expr -> unit - method expr : formatter -> Ast.expr -> unit - method expr_list : formatter -> Ast.expr list -> unit - method expr_list_cons : - bool -> formatter -> Ast.expr -> unit - method fun_binding : formatter -> fun_binding -> unit - method functor_arg : - formatter -> (string * Ast.module_type) -> unit - method functor_args : - formatter -> (string * Ast.module_type) list -> unit - method ident : formatter -> Ast.ident -> unit - method numeric : formatter -> string -> string -> unit - method binding : formatter -> Ast.binding -> unit - method record_binding : - formatter -> Ast.rec_binding -> unit - method match_case : formatter -> Ast.match_case -> unit - method match_case_aux : - formatter -> Ast.match_case -> unit - method mk_expr_list : - Ast.expr -> ((Ast.expr list) * (Ast.expr option)) - method mk_patt_list : - Ast.patt -> ((Ast.patt list) * (Ast.patt option)) - method simple_module_expr : - formatter -> Ast.module_expr -> unit - method module_expr : - formatter -> Ast.module_expr -> unit - method module_expr_get_functor_args : - (string * Ast.module_type) list -> - Ast.module_expr -> - (((string * Ast.module_type) list) * Ast. - module_expr * (Ast.module_type option)) - method module_rec_binding : - formatter -> Ast.module_binding -> unit - method module_type : - formatter -> Ast.module_type -> unit - method override_flag : - formatter -> Ast.override_flag -> unit - method mutable_flag : - formatter -> Ast.mutable_flag -> unit - method direction_flag : - formatter -> Ast.direction_flag -> unit - method rec_flag : formatter -> Ast.rec_flag -> unit - method node : formatter -> 'b -> ('b -> Loc.t) -> unit - method patt : formatter -> Ast.patt -> unit - method patt1 : formatter -> Ast.patt -> unit - method patt2 : formatter -> Ast.patt -> unit - method patt3 : formatter -> Ast.patt -> unit - method patt4 : formatter -> Ast.patt -> unit - method patt5 : formatter -> Ast.patt -> unit - method patt_tycon : formatter -> Ast.patt -> unit - method patt_expr_fun_args : - formatter -> (fun_binding * Ast.expr) -> unit - method patt_class_expr_fun_args : - formatter -> (Ast.patt * Ast.class_expr) -> unit - method print_comments_before : - Loc.t -> formatter -> unit - method private_flag : - formatter -> Ast.private_flag -> unit - method virtual_flag : - formatter -> Ast.virtual_flag -> unit - method quoted_string : formatter -> string -> unit - method raise_match_failure : formatter -> Loc.t -> unit - method reset : 'a - method reset_semi : 'a - method semisep : sep - method set_comments : bool -> 'a - method set_curry_constr : bool -> 'a - method set_loc_and_comments : 'a - method set_semisep : sep -> 'a - method simple_ctyp : formatter -> Ast.ctyp -> unit - method simple_expr : formatter -> Ast.expr -> unit - method simple_patt : formatter -> Ast.patt -> unit - method seq : formatter -> Ast.expr -> unit - method string : formatter -> string -> unit - method sum_type : formatter -> Ast.ctyp -> unit - method type_params : formatter -> Ast.ctyp list -> unit - method class_params : formatter -> Ast.ctyp -> unit - method under_pipe : 'a - method under_semi : 'a - method var : formatter -> string -> unit - method with_constraint : - formatter -> Ast.with_constr -> unit - end - - val with_outfile : - string option -> (formatter -> 'a -> unit) -> 'a -> unit - - val print : - string option -> - (printer -> formatter -> 'a -> unit) -> 'a -> unit - - end - - module MakeMore (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax. - Ast).S - - end = - struct - open Format - - module Id = - struct - let name = "Camlp4.Printers.OCaml" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - include Syntax - - type sep = (unit, formatter, unit) format - - type fun_binding = [ | `patt of Ast.patt | `newtype of string ] - - let pp = fprintf - - let cut f = fprintf f "@ " - - let list' elt sep sep' f = - let rec loop = - function - | [] -> () - | x :: xs -> (pp f sep; elt f x; pp f sep'; loop xs) - in - function - | [] -> () - | [ x ] -> (elt f x; pp f sep') - | x :: xs -> (elt f x; pp f sep'; loop xs) - - let list elt sep f = - let rec loop = - function | [] -> () | x :: xs -> (pp f sep; elt f x; loop xs) - in - function - | [] -> () - | [ x ] -> elt f x - | x :: xs -> (elt f x; loop xs) - - let rec list_of_meta_list = - function - | Ast.LNil -> [] - | Ast.LCons (x, xs) -> x :: (list_of_meta_list xs) - | Ast.LAnt _ -> assert false - - let meta_list elt sep f mxs = - let xs = list_of_meta_list mxs in list elt sep f xs - - module CommentFilter = Struct.CommentFilter.Make(Token) - - let comment_filter = CommentFilter.mk () - - let _ = CommentFilter.define (Gram.get_filter ()) comment_filter - - module StringSet = Set.Make(String) - - let infix_lidents = - [ "asr"; "land"; "lor"; "lsl"; "lsr"; "lxor"; "mod"; "or" ] - - let is_infix = - let first_chars = - [ '='; '<'; '>'; '|'; '&'; '$'; '@'; '^'; '+'; '-'; '*'; '/'; - '%'; '\\' ] - and infixes = - List.fold_right StringSet.add infix_lidents StringSet.empty - in - fun s -> - (StringSet.mem s infixes) || - ((s <> "") && (List.mem s.[0] first_chars)) - - let is_keyword = - let keywords = - List.fold_right StringSet.add - [ "and"; "as"; "assert"; "begin"; "class"; "constraint"; - "do"; "done"; "downto"; "else"; "end"; "exception"; - "external"; "false"; "for"; "fun"; "function"; "functor"; - "if"; "in"; "include"; "inherit"; "initializer"; "lazy"; - "let"; "match"; "method"; "module"; "mutable"; "new"; - "object"; "of"; "open"; "parser"; "private"; "rec"; - "sig"; "struct"; "then"; "to"; "true"; "try"; "type"; - "val"; "virtual"; "when"; "while"; "with" ] - StringSet.empty - in fun s -> StringSet.mem s keywords - - module Lexer = Struct.Lexer.Make(Token) - - let _ = let module M = ErrorHandler.Register(Lexer.Error) in () - - open Sig - - let lexer s = - Lexer.from_string ~quotations: !Camlp4_config.quotations Loc. - ghost s - - let lex_string str = - try - let (__strm : _ Stream.t) = lexer str - in - match Stream.peek __strm with - | Some ((tok, _)) -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some ((EOI, _)) -> (Stream.junk __strm; tok) - | _ -> raise (Stream.Error ""))) - | _ -> raise Stream.Failure - with - | Stream.Failure | Stream.Error _ -> - failwith - (sprintf - "Cannot print %S this string contains more than one token" - str) - | Lexer.Error.E exn -> - failwith - (sprintf - "Cannot print %S this identifier does not respect OCaml lexing rules (%s)" - str (Lexer.Error.to_string exn)) - - let ocaml_char x = Char.escaped (Struct.Token.Eval.char x) - - let rec get_expr_args a al = - match a with - | Ast.ExApp (_, a1, a2) -> get_expr_args a1 (a2 :: al) - | _ -> (a, al) - - let rec get_patt_args a al = - match a with - | Ast.PaApp (_, a1, a2) -> get_patt_args a1 (a2 :: al) - | _ -> (a, al) - - let rec get_ctyp_args a al = - match a with - | Ast.TyApp (_, a1, a2) -> get_ctyp_args a1 (a2 :: al) - | _ -> (a, al) - - let is_irrefut_patt = Ast.is_irrefut_patt - - let rec expr_fun_args = - function - | (Ast.ExFun (_, (Ast.McArr (_, p, (Ast.ExNil _), e))) as ge) - -> - if is_irrefut_patt p - then - (let (pl, e) = expr_fun_args e in (((`patt p) :: pl), e)) - else ([], ge) - | Ast.ExFUN (_, i, e) -> - let (pl, e) = expr_fun_args e in (((`newtype i) :: pl), e) - | ge -> ([], ge) - - let rec class_expr_fun_args = - function - | (Ast.CeFun (_, p, ce) as ge) -> - if is_irrefut_patt p - then - (let (pl, ce) = class_expr_fun_args ce in ((p :: pl), ce)) - else ([], ge) - | ge -> ([], ge) - - let rec do_print_comments_before loc f (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some ((comm, comm_loc)) when Loc.strictly_before comm_loc loc - -> - (Stream.junk __strm; - let s = __strm in - let () = f comm comm_loc - in do_print_comments_before loc f s) - | _ -> () - - class printer ?curry_constr:(init_curry_constr = false) - ?(comments = true) () = - object (o) - val pipe = false - val semi = false - method under_pipe = {< pipe = true; >} - method under_semi = {< semi = true; >} - method reset_semi = {< semi = false; >} - method reset = {< pipe = false; semi = false; >} - val semisep = (";;" : sep) - val no_semisep = ("" : sep) - val mode = if comments then `comments else `no_comments - val curry_constr = init_curry_constr - val var_conversion = false - method andsep : sep = "@]@ @[<2>and@ " - method value_val = "val" - method value_let = "let" - method semisep = semisep - method set_semisep = fun s -> {< semisep = s; >} - method set_comments = - fun b -> - {< mode = if b then `comments else `no_comments; >} - method set_loc_and_comments = {< mode = `loc_and_comments; >} - method set_curry_constr = fun b -> {< curry_constr = b; >} - method print_comments_before = - fun loc f -> - match mode with - | `comments -> - do_print_comments_before loc - (fun c _ -> pp f "%s@ " c) - (CommentFilter.take_stream comment_filter) - | `loc_and_comments -> - let () = pp f "(*loc: %a*)@ " Loc.dump loc - in - do_print_comments_before loc - (fun s -> pp f "%s(*comm_loc: %a*)@ " s Loc.dump) - (CommentFilter.take_stream comment_filter) - | _ -> () - method var = - fun f -> - function - | "" -> pp f "$lid:\"\"$" - | "[]" -> pp f "[]" - | "()" -> pp f "()" - | " True" -> pp f "True" - | " False" -> pp f "False" - | v -> - (match (var_conversion, v) with - | (true, "val") -> pp f "contents" - | (true, "True") -> pp f "true" - | (true, "False") -> pp f "false" - | _ -> - (match lex_string v with - | LIDENT s | UIDENT s | ESCAPED_IDENT s when - is_keyword s -> pp f "%s__" s - | LIDENT s | ESCAPED_IDENT s when - List.mem s infix_lidents -> pp f "( %s )" s - | SYMBOL s -> pp f "( %s )" s - | LIDENT s | UIDENT s | ESCAPED_IDENT s -> - pp_print_string f s - | tok -> - failwith - (sprintf - "Bad token used as an identifier: %s" - (Token.to_string tok)))) - method type_params = - fun f -> - function - | [] -> () - | [ x ] -> pp f "%a@ " o#ctyp x - | l -> pp f "@[<1>(%a)@]@ " (list o#ctyp ",@ ") l - method class_params = - fun f -> - function - | Ast.TyCom (_, t1, t2) -> - pp f "@[<1>%a,@ %a@]" o#class_params t1 - o#class_params t2 - | x -> o#ctyp f x - method override_flag = - fun f -> - function - | Ast.OvOverride -> pp f "!" - | Ast.OvNil -> () - | Ast.OvAnt s -> o#anti f s - method mutable_flag = - fun f -> - function - | Ast.MuMutable -> pp f "mutable@ " - | Ast.MuNil -> () - | Ast.MuAnt s -> o#anti f s - method rec_flag = - fun f -> - function - | Ast.ReRecursive -> pp f "rec@ " - | Ast.ReNil -> () - | Ast.ReAnt s -> o#anti f s - method virtual_flag = - fun f -> - function - | Ast.ViVirtual -> pp f "virtual@ " - | Ast.ViNil -> () - | Ast.ViAnt s -> o#anti f s - method private_flag = - fun f -> - function - | Ast.PrPrivate -> pp f "private@ " - | Ast.PrNil -> () - | Ast.PrAnt s -> o#anti f s - method anti = fun f s -> pp f "$%s$" s - method seq = - fun f -> - function - | Ast.ExSem (_, e1, e2) -> - pp f "%a;@ %a" o#under_semi#seq e1 o#seq e2 - | Ast.ExSeq (_, e) -> o#seq f e - | e -> o#expr f e - method match_case = - fun f -> - function - | Ast.McNil _loc -> - pp f "@[<2>@ _ ->@ %a@]" o#raise_match_failure _loc - | a -> o#match_case_aux f a - method match_case_aux = - fun f -> - function - | Ast.McNil _ -> () - | Ast.McAnt (_, s) -> o#anti f s - | Ast.McOr (_, a1, a2) -> - pp f "%a%a" o#match_case_aux a1 o#match_case_aux a2 - | Ast.McArr (_, p, (Ast.ExNil _), e) -> - pp f "@ | @[<2>%a@ ->@ %a@]" o#patt p - o#under_pipe#expr e - | Ast.McArr (_, p, w, e) -> - pp f "@ | @[<2>%a@ when@ %a@ ->@ %a@]" o#patt p - o#under_pipe#expr w o#under_pipe#expr e - method fun_binding = - fun f -> - function - | `patt p -> o#simple_patt f p - | `newtype i -> pp f "(type %s)" i - method binding = - fun f bi -> - let () = o#node f bi Ast.loc_of_binding - in - match bi with - | Ast.BiNil _ -> () - | Ast.BiAnd (_, b1, b2) -> - (o#binding f b1; pp f o#andsep; o#binding f b2) - | Ast.BiEq (_, p, e) -> - let (pl, e') = - (match p with - | Ast.PaTyc (_, _, _) -> ([], e) - | _ -> expr_fun_args e) - in - (match (p, e') with - | (Ast.PaId (_, (Ast.IdLid (_, _))), - Ast.ExTyc (_, e', t)) -> - pp f "%a :@ %a =@ %a" - (list o#fun_binding "@ ") - ((`patt p) :: pl) o#ctyp t o#expr e' - | (Ast.PaId (_, (Ast.IdLid (_, _))), _) -> - pp f "%a @[<0>%a=@]@ %a" o#simple_patt p - (list' o#fun_binding "" "@ ") pl o#expr e' - | _ -> pp f "%a =@ %a" o#simple_patt p o#expr e) - | Ast.BiAnt (_, s) -> o#anti f s - method record_binding = - fun f bi -> - let () = o#node f bi Ast.loc_of_rec_binding - in - match bi with - | Ast.RbNil _ -> () - | Ast.RbEq (_, i, e) -> - pp f "@ @[<2>%a =@ %a@];" o#var_ident i o#expr e - | Ast.RbSem (_, b1, b2) -> - (o#under_semi#record_binding f b1; - o#under_semi#record_binding f b2) - | Ast.RbAnt (_, s) -> o#anti f s - method mk_patt_list = - function - | Ast.PaApp (_, - (Ast.PaApp (_, (Ast.PaId (_, (Ast.IdUid (_, "::")))), - p1)), - p2) -> - let (pl, c) = o#mk_patt_list p2 in ((p1 :: pl), c) - | Ast.PaId (_, (Ast.IdUid (_, "[]"))) -> ([], None) - | p -> ([], (Some p)) - method mk_expr_list = - function - | Ast.ExApp (_, - (Ast.ExApp (_, (Ast.ExId (_, (Ast.IdUid (_, "::")))), - e1)), - e2) -> - let (el, c) = o#mk_expr_list e2 in ((e1 :: el), c) - | Ast.ExId (_, (Ast.IdUid (_, "[]"))) -> ([], None) - | e -> ([], (Some e)) - method expr_list = - fun f -> - function - | [] -> pp f "[]" - | [ e ] -> pp f "[ %a ]" o#under_semi#expr e - | el -> - pp f "@[<2>[ %a@] ]" (list o#under_semi#expr ";@ ") - el - method expr_list_cons = - fun simple f e -> - let (el, c) = o#mk_expr_list e - in - match c with - | None -> o#expr_list f el - | Some x -> - (if simple - then pp f "@[<2>(%a)@]" - else pp f "@[<2>%a@]") - (list o#under_semi#dot_expr " ::@ ") (el @ [ x ]) - method patt_expr_fun_args = - fun f (p, e) -> - let (pl, e) = expr_fun_args e - in - pp f "%a@ ->@ %a" (list o#fun_binding "@ ") (p :: pl) - o#expr e - method patt_class_expr_fun_args = - fun f (p, ce) -> - let (pl, ce) = class_expr_fun_args ce - in - pp f "%a =@]@ %a" (list o#simple_patt "@ ") (p :: pl) - o#class_expr ce - method constrain = - fun f (t1, t2) -> - pp f "@[<2>constraint@ %a =@ %a@]" o#ctyp t1 o#ctyp t2 - method sum_type = - fun f t -> - match Ast.list_of_ctyp t [] with - | [] -> () - | ts -> - pp f "@[| %a@]" - (list o#constructor_declaration "@ | ") ts - method private constructor_declaration = - fun f t -> - match t with - | Ast.TyCol (_, t1, (Ast.TyArr (_, t2, t3))) -> - pp f "@[<2>%a :@ @[<2>%a@ ->@ %a@]@]" o#ctyp t1 - o#constructor_type t2 o#ctyp t3 - | t -> o#ctyp f t - method string = fun f -> pp f "%s" - method quoted_string = fun f -> pp f "%S" - method numeric = - fun f num suff -> - if num.[0] = '-' - then pp f "(%s%s)" num suff - else pp f "%s%s" num suff - method module_expr_get_functor_args = - fun accu -> - function - | Ast.MeFun (_, s, mt, me) -> - o#module_expr_get_functor_args ((s, mt) :: accu) me - | Ast.MeTyc (_, me, mt) -> - ((List.rev accu), me, (Some mt)) - | me -> ((List.rev accu), me, None) - method functor_args = fun f -> list o#functor_arg "@ " f - method functor_arg = - fun f (s, mt) -> - pp f "@[<2>(%a :@ %a)@]" o#var s o#module_type mt - method module_rec_binding = - fun f -> - function - | Ast.MbNil _ -> () - | Ast.MbColEq (_, s, mt, me) -> - pp f "@[<2>%a :@ %a =@ %a@]" o#var s o#module_type mt - o#module_expr me - | Ast.MbCol (_, s, mt) -> - pp f "@[<2>%a :@ %a@]" o#var s o#module_type mt - | Ast.MbAnd (_, mb1, mb2) -> - (o#module_rec_binding f mb1; - pp f o#andsep; - o#module_rec_binding f mb2) - | Ast.MbAnt (_, s) -> o#anti f s - method class_declaration = - fun f -> - function - | Ast.CeTyc (_, ce, ct) -> - pp f "%a :@ %a" o#class_expr ce o#class_type ct - | ce -> o#class_expr f ce - method raise_match_failure = - fun f _loc -> - let n = Loc.file_name _loc in - let l = Loc.start_line _loc in - let c = (Loc.start_off _loc) - (Loc.start_bol _loc) - in - o#expr f - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "Match_failure")))), - (Ast.ExStr (_loc, - (Ast.safe_string_escaped n))))), - (Ast.ExInt (_loc, (string_of_int l))))), - (Ast.ExInt (_loc, (string_of_int c))))))) - method node : 'a. formatter -> 'a -> ('a -> Loc.t) -> unit = - fun f node loc_of_node -> - o#print_comments_before (loc_of_node node) f - method ident = - fun f i -> - let () = o#node f i Ast.loc_of_ident - in - match i with - | Ast.IdAcc (_, i1, i2) -> - pp f "%a.@,%a" o#ident i1 o#ident i2 - | Ast.IdApp (_, i1, i2) -> - pp f "%a@,(%a)" o#ident i1 o#ident i2 - | Ast.IdAnt (_, s) -> o#anti f s - | Ast.IdLid (_, s) | Ast.IdUid (_, s) -> o#var f s - method private var_ident = {< var_conversion = true; >}#ident - method expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | (Ast.ExLet (_, _, _, _) | Ast.ExLmd (_, _, _, _) as - e) when semi -> pp f "(%a)" o#reset#expr e - | (Ast.ExMat (_, _, _) | Ast.ExTry (_, _, _) | - Ast.ExFun (_, _) - as e) when pipe || semi -> - pp f "(%a)" o#reset#expr e - | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "~-")))), - x) -> pp f "@[<2>-@ %a@]" o#dot_expr x - | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "~-.")))), - x) -> pp f "@[<2>-.@ %a@]" o#dot_expr x - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, (Ast.IdUid (_, "::")))), _)), - _) -> o#expr_list_cons false f e - | Ast.ExApp (_loc, - (Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, n)))), - x)), - y) when is_infix n -> - pp f "@[<2>%a@ %s@ %a@]" o#apply_expr x n - o#apply_expr y - | Ast.ExApp (_, x, y) -> - let (a, al) = get_expr_args x [ y ] - in - if - (not curry_constr) && - (Ast.is_expr_constructor a) - then - (match al with - | [ Ast.ExTup (_, _) ] -> - pp f "@[<2>%a@ (%a)@]" o#apply_expr x - o#expr y - | [ _ ] -> - pp f "@[<2>%a@ %a@]" o#apply_expr x - o#apply_expr y - | al -> - pp f "@[<2>%a@ (%a)@]" o#apply_expr a - (list o#under_pipe#apply_expr ",@ ") al) - else - pp f "@[<2>%a@]" (list o#apply_expr "@ ") - (a :: al) - | Ast.ExAss (_, - (Ast.ExAcc (_, e1, - (Ast.ExId (_, (Ast.IdLid (_, "val")))))), - e2) -> - pp f "@[<2>%a :=@ %a@]" o#dot_expr e1 o#expr e2 - | Ast.ExAss (_, e1, e2) -> - pp f "@[<2>%a@ <-@ %a@]" o#dot_expr e1 o#expr e2 - | Ast.ExFun (loc, (Ast.McNil _)) -> - pp f "@[<2>fun@ _@ ->@ %a@]" o#raise_match_failure - loc - | Ast.ExFun (_, (Ast.McArr (_, p, (Ast.ExNil _), e))) - when is_irrefut_patt p -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args - ((`patt p), e) - | Ast.ExFUN (_, i, e) -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args - ((`newtype i), e) - | Ast.ExFun (_, a) -> - pp f "@[function%a@]" o#match_case a - | Ast.ExIfe (_, e1, e2, e3) -> - pp f - "@[@[<2>if@ %a@]@ @[<2>then@ %a@]@ @[<2>else@ %a@]@]" - o#expr e1 o#under_semi#expr e2 o#under_semi#expr - e3 - | Ast.ExLaz (_, e) -> - pp f "@[<2>lazy@ %a@]" o#simple_expr e - | Ast.ExLet (_, r, bi, e) -> - (match e with - | Ast.ExLet (_, _, _, _) -> - pp f "@[<0>@[<2>let %a%a in@]@ %a@]" - o#rec_flag r o#binding bi o#reset_semi#expr - e - | _ -> - pp f - "@[@[<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.ExMat (_, e, a) -> - pp f "@[@[@[<2>match %a@]@ with@]%a@]" - o#expr e o#match_case a - | Ast.ExTry (_, e, a) -> - pp f "@[<0>@[try@ %a@]@ @[<0>with%a@]@]" - o#expr e o#match_case a - | Ast.ExAsf _ -> pp f "@[<2>assert@ false@]" - | Ast.ExAsr (_, e) -> - pp f "@[<2>assert@ %a@]" o#dot_expr e - | Ast.ExLmd (_, s, me, e) -> - pp f "@[<2>let module %a =@ %a@]@ @[<2>in@ %a@]" - o#var s o#module_expr me o#reset_semi#expr e - | Ast.ExObj (_, (Ast.PaNil _), cst) -> - pp f "@[@[object@ %a@]@ end@]" - o#class_str_item cst - | Ast.ExObj (_, (Ast.PaTyc (_, p, t)), cst) -> - pp f - "@[@[object @[<1>(%a :@ %a)@]@ %a@]@ end@]" - o#patt p o#ctyp t o#class_str_item cst - | Ast.ExObj (_, p, cst) -> - pp f - "@[@[object @[<2>(%a)@]@ %a@]@ end@]" - o#patt p o#class_str_item cst - | e -> o#apply_expr f e - method apply_expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | Ast.ExNew (_, i) -> pp f "@[<2>new@ %a@]" o#ident i - | e -> o#dot_expr f e - method dot_expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | Ast.ExAcc (_, e, - (Ast.ExId (_, (Ast.IdLid (_, "val"))))) -> - pp f "@[<2>!@,%a@]" o#simple_expr e - | Ast.ExAcc (_, e1, e2) -> - pp f "@[<2>%a.@,%a@]" o#dot_expr e1 o#dot_expr e2 - | Ast.ExAre (_, e1, e2) -> - pp f "@[<2>%a.@,(%a)@]" o#dot_expr e1 o#expr e2 - | Ast.ExSte (_, e1, e2) -> - pp f "%a.@[<1>[@,%a@]@,]" o#dot_expr e1 o#expr e2 - | Ast.ExSnd (_, e, s) -> - pp f "@[<2>%a#@,%s@]" o#dot_expr e s - | e -> o#simple_expr f e - method simple_expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | Ast.ExNil _ -> () - | Ast.ExSeq (_, e) -> pp f "@[(%a)@]" o#seq e - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, (Ast.IdUid (_, "::")))), _)), - _) -> o#expr_list_cons true f e - | Ast.ExTup (_, e) -> pp f "@[<1>(%a)@]" o#expr e - | Ast.ExArr (_, e) -> - pp f "@[<0>@[<2>[|@ %a@]@ |]@]" o#under_semi#expr e - | Ast.ExCoe (_, e, (Ast.TyNil _), t) -> - pp f "@[<2>(%a :>@ %a)@]" o#expr e o#ctyp t - | Ast.ExCoe (_, e, t1, t2) -> - pp f "@[<2>(%a :@ %a :>@ %a)@]" o#expr e o#ctyp t1 - o#ctyp t2 - | Ast.ExTyc (_, e, t) -> - pp f "@[<2>(%a :@ %a)@]" o#expr e o#ctyp t - | Ast.ExAnt (_, s) -> o#anti f s - | Ast.ExFor (_, s, e1, e2, df, e3) -> - pp f - "@[@[@[<2>for %a =@ %a@ %a@ %a@ do@]@ %a@]@ done@]" - o#var s o#expr e1 o#direction_flag df o#expr e2 - o#seq e3 - | Ast.ExInt (_, s) -> o#numeric f s "" - | Ast.ExNativeInt (_, s) -> o#numeric f s "n" - | Ast.ExInt64 (_, s) -> o#numeric f s "L" - | Ast.ExInt32 (_, s) -> o#numeric f s "l" - | Ast.ExFlo (_, s) -> o#numeric f s "" - | Ast.ExChr (_, s) -> pp f "'%s'" (ocaml_char s) - | Ast.ExId (_, i) -> o#var_ident f i - | Ast.ExRec (_, b, (Ast.ExNil _)) -> - pp f "@[@[{%a@]@ }@]" o#record_binding b - | Ast.ExRec (_, b, e) -> - pp f "@[@[{@ (%a)@ with%a@]@ }@]" - o#expr e o#record_binding b - | Ast.ExStr (_, s) -> pp f "\"%s\"" s - | Ast.ExWhi (_, e1, e2) -> - pp f "@[<2>while@ %a@ do@ %a@ done@]" o#expr e1 - o#seq e2 - | Ast.ExLab (_, s, (Ast.ExNil _)) -> pp f "~%s" s - | Ast.ExLab (_, s, e) -> - pp f "@[<2>~%s:@ %a@]" s o#dot_expr e - | Ast.ExOlb (_, s, (Ast.ExNil _)) -> pp f "?%s" s - | Ast.ExOlb (_, s, e) -> - pp f "@[<2>?%s:@ %a@]" s o#dot_expr e - | Ast.ExVrn (_, s) -> pp f "`%a" o#var s - | Ast.ExOvr (_, b) -> - pp f "@[@[{<%a@]@ >}@]" o#record_binding - b - | Ast.ExCom (_, e1, e2) -> - pp f "%a,@ %a" o#simple_expr e1 o#simple_expr e2 - | Ast.ExSem (_, e1, e2) -> - pp f "%a;@ %a" o#under_semi#expr e1 o#expr e2 - | Ast.ExPkg (_, (Ast.MeTyc (_, me, mt))) -> - pp f "@[@[(module %a : %a@])@]" - o#module_expr me o#module_type mt - | Ast.ExPkg (_, me) -> - pp f "@[@[(module %a@])@]" o#module_expr - me - | Ast.ExApp (_, _, _) | Ast.ExAcc (_, _, _) | - Ast.ExAre (_, _, _) | Ast.ExSte (_, _, _) | - Ast.ExAss (_, _, _) | Ast.ExSnd (_, _, _) | - Ast.ExFun (_, _) | Ast.ExFUN (_, _, _) | - Ast.ExMat (_, _, _) | Ast.ExTry (_, _, _) | - Ast.ExIfe (_, _, _, _) | Ast.ExLet (_, _, _, _) | - Ast.ExLmd (_, _, _, _) | Ast.ExOpI (_, _, _) | - Ast.ExAsr (_, _) | Ast.ExAsf _ | Ast.ExLaz (_, _) | - Ast.ExNew (_, _) | Ast.ExObj (_, _, _) -> - pp f "(%a)" o#reset#expr e - method direction_flag = - fun f b -> - match b with - | Ast.DiTo -> pp_print_string f "to" - | Ast.DiDownto -> pp_print_string f "downto" - | Ast.DiAnt s -> o#anti f s - method patt = - fun f p -> - let () = o#node f p Ast.loc_of_patt - in - match p with - | Ast.PaAli (_, p1, p2) -> - pp f "@[<1>(%a@ as@ %a)@]" o#patt p1 o#patt p2 - | Ast.PaEq (_, i, p) -> - pp f "@[<2>%a =@ %a@]" o#var_ident i o#patt p - | Ast.PaSem (_, p1, p2) -> - pp f "%a;@ %a" o#patt p1 o#patt p2 - | p -> o#patt1 f p - method patt1 = - fun f -> - function - | Ast.PaOrp (_, p1, p2) -> - pp f "@[<2>%a@ |@ %a@]" o#patt1 p1 o#patt2 p2 - | p -> o#patt2 f p - method patt2 = fun f p -> o#patt3 f p - method patt3 = - fun f -> - function - | Ast.PaRng (_, p1, p2) -> - pp f "@[<2>%a@ ..@ %a@]" o#patt3 p1 o#patt4 p2 - | Ast.PaCom (_, p1, p2) -> - pp f "%a,@ %a" o#patt3 p1 o#patt3 p2 - | p -> o#patt4 f p - method patt4 = - fun f -> - function - | (Ast.PaApp (_, - (Ast.PaApp (_, - (Ast.PaId (_, (Ast.IdUid (_, "::")))), _)), - _) - as p) -> - let (pl, c) = o#mk_patt_list p - in - (match c with - | None -> - pp f "@[<2>[@ %a@]@ ]" (list o#patt ";@ ") pl - | Some x -> - pp f "@[<2>%a@]" (list o#patt5 " ::@ ") - (pl @ [ x ])) - | p -> o#patt5 f p - method patt5 = - fun f -> - function - | (Ast.PaApp (_, - (Ast.PaApp (_, - (Ast.PaId (_, (Ast.IdUid (_, "::")))), _)), - _) - as p) -> o#simple_patt f p - | Ast.PaLaz (_, p) -> - pp f "@[<2>lazy %a@]" o#simple_patt p - | Ast.PaApp (_, x, y) -> - let (a, al) = get_patt_args x [ y ] - in - if not (Ast.is_patt_constructor a) - then - Format.eprintf - "WARNING: strange pattern application of a non constructor@." - else - if curry_constr - then - pp f "@[<2>%a@]" (list o#simple_patt "@ ") - (a :: al) - else - (match al with - | [ Ast.PaTup (_, _) ] -> - pp f "@[<2>%a@ (%a)@]" o#simple_patt x - o#patt y - | [ _ ] -> - pp f "@[<2>%a@ %a@]" o#patt5 x - o#simple_patt y - | al -> - pp f "@[<2>%a@ (%a)@]" o#patt5 a - (list o#simple_patt ",@ ") al) - | p -> o#simple_patt f p - method simple_patt = - fun f p -> - let () = o#node f p Ast.loc_of_patt - in - match p with - | Ast.PaNil _ -> () - | Ast.PaId (_, i) -> o#var_ident f i - | Ast.PaAnt (_, s) -> o#anti f s - | Ast.PaAny _ -> pp f "_" - | Ast.PaMod (_, m) -> pp f "(module %s)" m - | Ast.PaTup (_, p) -> pp f "@[<1>(%a)@]" o#patt3 p - | Ast.PaRec (_, p) -> pp f "@[{@ %a@]@ }" o#patt p - | Ast.PaStr (_, s) -> pp f "\"%s\"" s - | Ast.PaTyc (_, p, t) -> - pp f "@[<1>(%a :@ %a)@]" o#patt p o#ctyp t - | Ast.PaNativeInt (_, s) -> o#numeric f s "n" - | Ast.PaInt64 (_, s) -> o#numeric f s "L" - | Ast.PaInt32 (_, s) -> o#numeric f s "l" - | Ast.PaInt (_, s) -> o#numeric f s "" - | Ast.PaFlo (_, s) -> o#numeric f s "" - | Ast.PaChr (_, s) -> pp f "'%s'" (ocaml_char s) - | Ast.PaLab (_, s, (Ast.PaNil _)) -> pp f "~%s" s - | Ast.PaVrn (_, s) -> pp f "`%a" o#var s - | Ast.PaTyp (_, i) -> pp f "@[<2>#%a@]" o#ident i - | Ast.PaArr (_, p) -> pp f "@[<2>[|@ %a@]@ |]" o#patt p - | Ast.PaLab (_, s, p) -> - pp f "@[<2>~%s:@ (%a)@]" s o#patt p - | Ast.PaOlb (_, s, (Ast.PaNil _)) -> pp f "?%s" s - | Ast.PaOlb (_, "", p) -> - pp f "@[<2>?(%a)@]" o#patt_tycon p - | Ast.PaOlb (_, s, p) -> - pp f "@[<2>?%s:@,@[<1>(%a)@]@]" s o#patt_tycon p - | Ast.PaOlbi (_, "", p, e) -> - pp f "@[<2>?(%a =@ %a)@]" o#patt_tycon p o#expr e - | Ast.PaOlbi (_, s, p, e) -> - pp f "@[<2>?%s:@,@[<1>(%a =@ %a)@]@]" s - o#patt_tycon p o#expr e - | (Ast.PaApp (_, _, _) | Ast.PaAli (_, _, _) | - Ast.PaOrp (_, _, _) | Ast.PaRng (_, _, _) | - Ast.PaCom (_, _, _) | Ast.PaSem (_, _, _) | - Ast.PaEq (_, _, _) | Ast.PaLaz (_, _) - as p) -> pp f "@[<1>(%a)@]" o#patt p - method patt_tycon = - fun f -> - function - | Ast.PaTyc (_, p, t) -> - pp f "%a :@ %a" o#patt p o#ctyp t - | p -> o#patt f p - method simple_ctyp = - fun f t -> - let () = o#node f t Ast.loc_of_ctyp - in - match t with - | Ast.TyId (_, i) -> o#ident f i - | Ast.TyAnt (_, s) -> o#anti f s - | Ast.TyAny _ -> pp f "_" - | Ast.TyAnP _ -> pp f "+_" - | Ast.TyAnM _ -> pp f "-_" - | Ast.TyLab (_, s, t) -> - pp f "@[<2>%s:@ %a@]" s o#simple_ctyp t - | Ast.TyOlb (_, s, t) -> - pp f "@[<2>?%s:@ %a@]" s o#simple_ctyp t - | Ast.TyObj (_, (Ast.TyNil _), Ast.RvNil) -> pp f "< >" - | Ast.TyObj (_, (Ast.TyNil _), Ast.RvRowVar) -> - pp f "< .. >" - | Ast.TyObj (_, t, Ast.RvRowVar) -> - pp f "@[<0>@[<2><@ %a;@ ..@]@ >@]" o#ctyp t - | Ast.TyObj (_, t, Ast.RvNil) -> - pp f "@[<0>@[<2><@ %a@]@ >@]" o#ctyp t - | Ast.TyQuo (_, s) -> pp f "'%a" o#var s - | Ast.TyRec (_, t) -> pp f "@[<2>{@ %a@]@ }" o#ctyp t - | Ast.TySum (_, t) -> pp f "@[<0>%a@]" o#sum_type t - | Ast.TyTup (_, t) -> pp f "@[<1>(%a)@]" o#ctyp t - | Ast.TyPkg (_, mt) -> - pp f "@[<2>(module@ %a@])" o#module_type mt - | Ast.TyVrnEq (_, t) -> - pp f "@[<2>[@ %a@]@ ]" o#sum_type t - | Ast.TyVrnInf (_, t) -> - pp f "@[<2>[<@ %a@]@,]" o#sum_type t - | Ast.TyVrnInfSup (_, t1, t2) -> - let (a, al) = get_ctyp_args t2 [] - in - pp f "@[<2>[<@ %a@ >@ %a@]@ ]" o#sum_type t1 - (list o#simple_ctyp "@ ") (a :: al) - | Ast.TyVrnSup (_, t) -> - pp f "@[<2>[>@ %a@]@,]" o#sum_type t - | Ast.TyCls (_, i) -> pp f "@[<2>#%a@]" o#ident i - | Ast.TyVrn (_, s) -> pp f "`%a" o#var s - | Ast.TySta (_, t1, t2) -> - pp f "%a *@ %a" o#simple_ctyp t1 o#simple_ctyp t2 - | Ast.TyNil _ -> assert false - | t -> pp f "@[<1>(%a)@]" o#ctyp t - method ctyp = - fun f t -> - let () = o#node f t Ast.loc_of_ctyp - in - match t with - | Ast.TyAli (_, t1, t2) -> - pp f "@[<2>%a@ as@ %a@]" o#simple_ctyp t1 - o#simple_ctyp t2 - | Ast.TyArr (_, t1, t2) -> - pp f "@[<2>%a@ ->@ %a@]" o#ctyp1 t1 o#ctyp t2 - | Ast.TyQuP (_, s) -> pp f "+'%a" o#var s - | Ast.TyQuM (_, s) -> pp f "-'%a" o#var s - | Ast.TyOr (_, t1, t2) -> - pp f "%a@ | %a" o#ctyp t1 o#ctyp t2 - | Ast.TyCol (_, t1, (Ast.TyMut (_, t2))) -> - pp f "@[mutable@ %a :@ %a@]" o#ctyp t1 o#ctyp t2 - | Ast.TyCol (_, t1, t2) -> - pp f "@[<2>%a :@ %a@]" o#ctyp t1 o#ctyp t2 - | Ast.TySem (_, t1, t2) -> - pp f "%a;@ %a" o#ctyp t1 o#ctyp t2 - | Ast.TyOf (_, t, (Ast.TyNil _)) -> o#ctyp f t - | Ast.TyOf (_, t1, t2) -> - pp f "@[%a@ @[<3>of@ %a@]@]" o#ctyp t1 - o#constructor_type t2 - | Ast.TyOfAmp (_, t1, t2) -> - pp f "@[%a@ @[<3>of &@ %a@]@]" o#ctyp t1 - o#constructor_type t2 - | Ast.TyAnd (_, t1, t2) -> - pp f "%a@ and %a" o#ctyp t1 o#ctyp t2 - | Ast.TyMut (_, t) -> - pp f "@[<2>mutable@ %a@]" o#ctyp t - | Ast.TyAmp (_, t1, t2) -> - pp f "%a@ &@ %a" o#ctyp t1 o#ctyp t2 - | Ast.TyMan (_, t1, t2) -> - pp f "@[<2>%a =@ %a@]" o#simple_ctyp t1 o#ctyp t2 - | Ast.TyDcl (_, tn, tp, te, cl) -> - (pp f "@[<2>%a%a@]" o#type_params tp o#var tn; - (match te with - | Ast.TyNil _ -> () - | _ -> pp f " =@ %a" o#ctyp te); - if cl <> [] - then pp f "@ %a" (list o#constrain "@ ") cl - else ()) - | t -> o#ctyp1 f t - method ctyp1 = - fun f -> - function - | Ast.TyApp (_, t1, t2) -> - (match get_ctyp_args t1 [ t2 ] with - | (_, [ _ ]) -> - pp f "@[<2>%a@ %a@]" o#simple_ctyp t2 - o#simple_ctyp t1 - | (a, al) -> - pp f "@[<2>(%a)@ %a@]" (list o#ctyp ",@ ") al - o#simple_ctyp a) - | Ast.TyPol (_, t1, t2) -> - let (a, al) = get_ctyp_args t1 [] - in - pp f "@[<2>%a.@ %a@]" (list o#ctyp "@ ") (a :: al) - o#ctyp t2 - | Ast.TyTypePol ((_, t1, t2)) -> - let (a, al) = get_ctyp_args t1 [] - in - pp f "@[<2>type %a.@ %a@]" (list o#ctyp "@ ") - (a :: al) o#ctyp t2 - | Ast.TyPrv (_, t) -> - pp f "@[private@ %a@]" o#simple_ctyp t - | t -> o#simple_ctyp f t - method constructor_type = - fun f t -> - match t with - | Ast.TyAnd (loc, t1, t2) -> - let () = o#node f t (fun _ -> loc) - in - pp f "%a@ * %a" o#constructor_type t1 - o#constructor_type t2 - | Ast.TyArr (_, _, _) -> pp f "(%a)" o#ctyp t - | t -> o#ctyp f t - method sig_item = - fun f sg -> - let () = o#node f sg Ast.loc_of_sig_item - in - match sg with - | Ast.SgNil _ -> () - | Ast.SgSem (_, sg, (Ast.SgNil _)) | - Ast.SgSem (_, (Ast.SgNil _), sg) -> o#sig_item f sg - | Ast.SgSem (_, sg1, sg2) -> - (o#sig_item f sg1; cut f; o#sig_item f sg2) - | Ast.SgExc (_, t) -> - pp f "@[<2>exception@ %a%(%)@]" o#ctyp t semisep - | Ast.SgExt (_, s, t, sl) -> - pp f "@[<2>external@ %a :@ %a =@ %a%(%)@]" - o#var s o#ctyp t (meta_list o#quoted_string "@ ") - sl semisep - | Ast.SgMod (_, s1, (Ast.MtFun (_, s2, mt1, mt2))) -> - let rec loop accu = - (function - | Ast.MtFun (_, s, mt1, mt2) -> - loop ((s, mt1) :: accu) mt2 - | mt -> ((List.rev accu), mt)) in - let (al, mt) = loop [ (s2, mt1) ] mt2 - in - pp f "@[<2>module %a@ @[<0>%a@] :@ %a%(%)@]" - o#var s1 o#functor_args al o#module_type mt - semisep - | Ast.SgMod (_, s, mt) -> - pp f "@[<2>module %a :@ %a%(%)@]" o#var s - o#module_type mt semisep - | Ast.SgMty (_, s, (Ast.MtNil _)) -> - pp f "@[<2>module type %a%(%)@]" o#var s semisep - | Ast.SgMty (_, s, mt) -> - pp f "@[<2>module type %a =@ %a%(%)@]" o#var s - o#module_type mt semisep - | Ast.SgOpn (_, sl) -> - pp f "@[<2>open@ %a%(%)@]" o#ident sl semisep - | Ast.SgTyp (_, t) -> - pp f "@[@[type %a@]%(%)@]" o#ctyp t - semisep - | Ast.SgVal (_, s, t) -> - pp f "@[<2>%s %a :@ %a%(%)@]" o#value_val o#var s - o#ctyp t semisep - | Ast.SgInc (_, mt) -> - pp f "@[<2>include@ %a%(%)@]" o#module_type mt - semisep - | Ast.SgClt (_, ct) -> - pp f "@[<2>class type %a%(%)@]" o#class_type ct - semisep - | Ast.SgCls (_, ce) -> - pp f "@[<2>class %a%(%)@]" o#class_type ce semisep - | Ast.SgRecMod (_, mb) -> - pp f "@[<2>module rec %a%(%)@]" - o#module_rec_binding mb semisep - | Ast.SgDir (_, _, _) -> () - | Ast.SgAnt (_, s) -> pp f "%a%(%)" o#anti s semisep - method str_item = - fun f st -> - let () = o#node f st Ast.loc_of_str_item - in - match st with - | Ast.StNil _ -> () - | Ast.StSem (_, st, (Ast.StNil _)) | - Ast.StSem (_, (Ast.StNil _), st) -> o#str_item f st - | Ast.StSem (_, st1, st2) -> - (o#str_item f st1; cut f; o#str_item f st2) - | Ast.StExc (_, t, Ast.ONone) -> - pp f "@[<2>exception@ %a%(%)@]" o#ctyp t semisep - | Ast.StExc (_, t, (Ast.OSome sl)) -> - pp f "@[<2>exception@ %a =@ %a%(%)@]" o#ctyp t - o#ident sl semisep - | Ast.StExt (_, s, t, sl) -> - pp f "@[<2>external@ %a :@ %a =@ %a%(%)@]" - o#var s o#ctyp t (meta_list o#quoted_string "@ ") - sl semisep - | Ast.StMod (_, s1, (Ast.MeFun (_, s2, mt1, me))) -> - (match o#module_expr_get_functor_args [ (s2, mt1) ] - me - with - | (al, me, Some mt2) -> - pp f - "@[<2>module %a@ @[<0>%a@] :@ %a =@ %a%(%)@]" - o#var s1 o#functor_args al o#module_type mt2 - o#module_expr me semisep - | (al, me, _) -> - pp f "@[<2>module %a@ @[<0>%a@] =@ %a%(%)@]" - o#var s1 o#functor_args al o#module_expr me - semisep) - | Ast.StMod (_, s, (Ast.MeTyc (_, me, mt))) -> - pp f "@[<2>module %a :@ %a =@ %a%(%)@]" o#var s - o#module_type mt o#module_expr me semisep - | Ast.StMod (_, s, me) -> - pp f "@[<2>module %a =@ %a%(%)@]" o#var s - o#module_expr me semisep - | 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.StTyp (_, t) -> - pp f "@[@[type %a@]%(%)@]" o#ctyp t - semisep - | Ast.StVal (_, r, bi) -> - pp f "@[<2>%s %a%a%(%)@]" o#value_let o#rec_flag r - o#binding bi semisep - | Ast.StExp (_, e) -> - pp f "@[<2>let _ =@ %a%(%)@]" o#expr e semisep - | Ast.StInc (_, me) -> - pp f "@[<2>include@ %a%(%)@]" o#simple_module_expr - me semisep - | Ast.StClt (_, ct) -> - pp f "@[<2>class type %a%(%)@]" o#class_type ct - semisep - | Ast.StCls (_, ce) -> - pp f "@[class %a%(%)@]" o#class_declaration ce - semisep - | Ast.StRecMod (_, mb) -> - pp f "@[<2>module rec %a%(%)@]" - o#module_rec_binding mb semisep - | Ast.StDir (_, _, _) -> () - | Ast.StAnt (_, s) -> pp f "%a%(%)" o#anti s semisep - | Ast.StExc (_, _, (Ast.OAnt _)) -> assert false - method module_type = - fun f mt -> - let () = o#node f mt Ast.loc_of_module_type - in - match mt with - | Ast.MtNil _ -> assert false - | Ast.MtOf (_, me) -> - pp f "@[<2>module type of@ %a@]" o#module_expr me - | Ast.MtId (_, i) -> o#ident f i - | Ast.MtAnt (_, s) -> o#anti f s - | Ast.MtFun (_, s, mt1, mt2) -> - pp f "@[<2>functor@ @[<1>(%a :@ %a)@]@ ->@ %a@]" - o#var s o#module_type mt1 o#module_type mt2 - | Ast.MtQuo (_, s) -> pp f "'%a" o#var s - | Ast.MtSig (_, sg) -> - pp f "@[@[sig@ %a@]@ end@]" o#sig_item sg - | Ast.MtWit (_, mt, wc) -> - pp f "@[<2>%a@ with@ %a@]" o#module_type mt - o#with_constraint wc - method with_constraint = - fun f wc -> - let () = o#node f wc Ast.loc_of_with_constr - in - match wc with - | Ast.WcNil _ -> () - | Ast.WcTyp (_, t1, t2) -> - pp f "@[<2>type@ %a =@ %a@]" o#ctyp t1 o#ctyp t2 - | Ast.WcMod (_, i1, i2) -> - pp f "@[<2>module@ %a =@ %a@]" o#ident i1 o#ident - i2 - | Ast.WcTyS (_, t1, t2) -> - pp f "@[<2>type@ %a :=@ %a@]" o#ctyp t1 o#ctyp t2 - | Ast.WcMoS (_, i1, i2) -> - pp f "@[<2>module@ %a :=@ %a@]" o#ident i1 - o#ident i2 - | Ast.WcAnd (_, wc1, wc2) -> - (o#with_constraint f wc1; - pp f o#andsep; - o#with_constraint f wc2) - | Ast.WcAnt (_, s) -> o#anti f s - method module_expr = - fun f me -> - let () = o#node f me Ast.loc_of_module_expr - in - match me with - | Ast.MeNil _ -> assert false - | Ast.MeTyc (_, (Ast.MeStr (_, st)), - (Ast.MtSig (_, sg))) -> - pp f - "@[<2>@[struct@ %a@]@ end :@ @[sig@ %a@]@ end@]" - o#str_item st o#sig_item sg - | _ -> o#simple_module_expr f me - method simple_module_expr = - fun f me -> - let () = o#node f me Ast.loc_of_module_expr - in - match me with - | Ast.MeNil _ -> assert false - | Ast.MeId (_, i) -> o#ident f i - | Ast.MeAnt (_, s) -> o#anti f s - | Ast.MeApp (_, me1, me2) -> - pp f "@[<2>%a@,(%a)@]" o#module_expr me1 - o#module_expr me2 - | Ast.MeFun (_, s, mt, me) -> - pp f "@[<2>functor@ @[<1>(%a :@ %a)@]@ ->@ %a@]" - o#var s o#module_type mt o#module_expr me - | Ast.MeStr (_, st) -> - pp f "@[@[struct@ %a@]@ end@]" o#str_item - st - | Ast.MeTyc (_, me, mt) -> - pp f "@[<1>(%a :@ %a)@]" o#module_expr me - o#module_type mt - | Ast.MePkg (_, - (Ast.ExTyc (_, e, (Ast.TyPkg (_, mt))))) -> - pp f "@[<1>(%s %a :@ %a)@]" o#value_val o#expr e - o#module_type mt - | Ast.MePkg (_, e) -> - pp f "@[<1>(%s %a)@]" o#value_val o#expr e - method class_expr = - fun f ce -> - let () = o#node f ce Ast.loc_of_class_expr - in - match ce with - | Ast.CeApp (_, ce, e) -> - pp f "@[<2>%a@ %a@]" o#class_expr ce o#apply_expr e - | Ast.CeCon (_, Ast.ViNil, i, (Ast.TyNil _)) -> - pp f "@[<2>%a@]" o#ident i - | Ast.CeCon (_, Ast.ViNil, i, t) -> - pp f "@[<2>@[<1>[%a]@]@ %a@]" o#class_params t - o#ident i - | Ast.CeCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), - (Ast.TyNil _)) -> pp f "@[<2>virtual@ %a@]" o#var i - | Ast.CeCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), t) - -> - pp f "@[<2>virtual@ @[<1>[%a]@]@ %a@]" - o#class_params t o#var i - | Ast.CeFun (_, p, ce) -> - pp f "@[<2>fun@ %a@ ->@ %a@]" o#simple_patt p - o#class_expr ce - | Ast.CeLet (_, r, bi, ce) -> - pp f "@[<2>let %a%a@]@ @[<2>in@ %a@]" o#rec_flag r - o#binding bi o#class_expr ce - | Ast.CeStr (_, (Ast.PaNil _), cst) -> - pp f "@[@[object %a@]@ end@]" - o#class_str_item cst - | Ast.CeStr (_, p, cst) -> - pp f - "@[@[object @[<1>(%a)@]@ %a@]@ end@]" - o#patt p o#class_str_item cst - | Ast.CeTyc (_, ce, ct) -> - pp f "@[<1>(%a :@ %a)@]" o#class_expr ce - o#class_type ct - | Ast.CeAnt (_, s) -> o#anti f s - | Ast.CeAnd (_, ce1, ce2) -> - (o#class_expr f ce1; - pp f o#andsep; - o#class_expr f ce2) - | Ast.CeEq (_, ce1, (Ast.CeFun (_, p, ce2))) when - is_irrefut_patt p -> - pp f "@[<2>%a@ %a" o#class_expr ce1 - o#patt_class_expr_fun_args (p, ce2) - | Ast.CeEq (_, ce1, ce2) -> - pp f "@[<2>%a =@]@ %a" o#class_expr ce1 - o#class_expr ce2 - | _ -> assert false - method class_type = - fun f ct -> - let () = o#node f ct Ast.loc_of_class_type - in - match ct with - | Ast.CtCon (_, Ast.ViNil, i, (Ast.TyNil _)) -> - pp f "@[<2>%a@]" o#ident i - | Ast.CtCon (_, Ast.ViNil, i, t) -> - pp f "@[<2>[@,%a@]@,]@ %a" o#class_params t - o#ident i - | Ast.CtCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), - (Ast.TyNil _)) -> pp f "@[<2>virtual@ %a@]" o#var i - | Ast.CtCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), t) - -> - pp f "@[<2>virtual@ [@,%a@]@,]@ %a" o#class_params - t o#var i - | Ast.CtFun (_, t, ct) -> - pp f "@[<2>%a@ ->@ %a@]" o#simple_ctyp t - o#class_type ct - | Ast.CtSig (_, (Ast.TyNil _), csg) -> - pp f "@[@[object@ %a@]@ end@]" - o#class_sig_item csg - | Ast.CtSig (_, t, csg) -> - pp f - "@[@[object @[<1>(%a)@]@ %a@]@ end@]" - o#ctyp t o#class_sig_item csg - | Ast.CtAnt (_, s) -> o#anti f s - | Ast.CtAnd (_, ct1, ct2) -> - (o#class_type f ct1; - pp f o#andsep; - o#class_type f ct2) - | Ast.CtCol (_, ct1, ct2) -> - pp f "%a :@ %a" o#class_type ct1 o#class_type ct2 - | Ast.CtEq (_, ct1, ct2) -> - pp f "%a =@ %a" o#class_type ct1 o#class_type ct2 - | _ -> assert false - method class_sig_item = - fun f csg -> - let () = o#node f csg Ast.loc_of_class_sig_item - in - match csg with - | Ast.CgNil _ -> () - | Ast.CgSem (_, csg, (Ast.CgNil _)) | - Ast.CgSem (_, (Ast.CgNil _), csg) -> - o#class_sig_item f csg - | Ast.CgSem (_, csg1, csg2) -> - (o#class_sig_item f csg1; - cut f; - o#class_sig_item f csg2) - | Ast.CgCtr (_, t1, t2) -> - pp f "@[<2>constraint@ %a =@ %a%(%)@]" o#ctyp t1 - o#ctyp t2 no_semisep - | Ast.CgInh (_, ct) -> - pp f "@[<2>inherit@ %a%(%)@]" o#class_type ct - no_semisep - | Ast.CgMth (_, s, pr, t) -> - pp f "@[<2>method %a%a :@ %a%(%)@]" o#private_flag - pr o#var s o#ctyp t no_semisep - | Ast.CgVir (_, s, pr, t) -> - pp f "@[<2>method virtual %a%a :@ %a%(%)@]" - o#private_flag pr o#var s o#ctyp t no_semisep - | Ast.CgVal (_, s, mu, vi, t) -> - pp f "@[<2>%s %a%a%a :@ %a%(%)@]" o#value_val - o#mutable_flag mu o#virtual_flag vi o#var s - o#ctyp t no_semisep - | Ast.CgAnt (_, s) -> pp f "%a%(%)" o#anti s no_semisep - method class_str_item = - fun f cst -> - let () = o#node f cst Ast.loc_of_class_str_item - in - match cst with - | Ast.CrNil _ -> () - | Ast.CrSem (_, cst, (Ast.CrNil _)) | - Ast.CrSem (_, (Ast.CrNil _), cst) -> - o#class_str_item f cst - | Ast.CrSem (_, cst1, cst2) -> - (o#class_str_item f cst1; - cut f; - o#class_str_item f cst2) - | Ast.CrCtr (_, t1, t2) -> - pp f "@[<2>constraint %a =@ %a%(%)@]" o#ctyp t1 - o#ctyp t2 no_semisep - | Ast.CrInh (_, ov, ce, "") -> - pp f "@[<2>inherit%a@ %a%(%)@]" o#override_flag ov - o#class_expr ce no_semisep - | Ast.CrInh (_, ov, ce, s) -> - pp f "@[<2>inherit%a@ %a as@ %a%(%)@]" - o#override_flag ov o#class_expr ce o#var s - no_semisep - | Ast.CrIni (_, e) -> - pp f "@[<2>initializer@ %a%(%)@]" o#expr e - no_semisep - | Ast.CrMth (_, s, ov, pr, e, (Ast.TyNil _)) -> - pp f "@[<2>method%a %a%a =@ %a%(%)@]" - o#override_flag ov o#private_flag pr o#var s - o#expr e no_semisep - | Ast.CrMth (_, s, ov, pr, e, t) -> - pp f "@[<2>method%a %a%a :@ %a =@ %a%(%)@]" - o#override_flag ov o#private_flag pr o#var s - o#ctyp t o#expr e no_semisep - | Ast.CrVir (_, s, pr, t) -> - pp f "@[<2>method virtual@ %a%a :@ %a%(%)@]" - o#private_flag pr o#var s o#ctyp t no_semisep - | Ast.CrVvr (_, s, mu, t) -> - pp f "@[<2>%s virtual %a%a :@ %a%(%)@]" o#value_val - o#mutable_flag mu o#var s o#ctyp t no_semisep - | Ast.CrVal (_, s, ov, mu, e) -> - pp f "@[<2>%s%a %a%a =@ %a%(%)@]" o#value_val - o#override_flag ov o#mutable_flag mu o#var s - o#expr e no_semisep - | Ast.CrAnt (_, s) -> pp f "%a%(%)" o#anti s no_semisep - method implem = - fun f st -> - match st with - | Ast.StExp (_, e) -> - pp f "@[<0>%a%(%)@]@." o#expr e semisep - | st -> pp f "@[%a@]@." o#str_item st - method interf = fun f sg -> pp f "@[%a@]@." o#sig_item sg - end - - let with_outfile output_file fct arg = - let call close f = - ((try fct f arg with | exn -> (close (); raise exn)); - close ()) - in - match output_file with - | None -> call (fun () -> ()) std_formatter - | Some s -> - let oc = open_out s in - let f = formatter_of_out_channel oc - in call (fun () -> close_out oc) f - - let print output_file fct = - let o = new printer () in with_outfile output_file (fct o) - - let print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg - - let print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st - - end - - module MakeMore (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax. - Ast).S = - struct - include Make(Syntax) - - let semisep : sep ref = ref ("@\n" : sep) - - let margin = ref 78 - - let comments = ref true - - let locations = ref false - - let curry_constr = ref false - - let print output_file fct = - let o = - new printer ~comments: !comments ~curry_constr: !curry_constr - () in - let o = o#set_semisep !semisep in - let o = if !locations then o#set_loc_and_comments else o - in - with_outfile output_file - (fun f -> - let () = Format.pp_set_margin f !margin - in Format.fprintf f "@[%a@]@." (fct o)) - - let print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg - - let print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st - - let check_sep s = - if String.contains s '%' - then failwith "-sep Format error, % found in string" - else (Obj.magic (Struct.Token.Eval.string s : string) : sep) - - let _ = - Options.add "-l" (Arg.Int (fun i -> margin := i)) - " line length for pretty printing." - - let _ = - Options.add "-ss" (Arg.Unit (fun () -> semisep := ";;")) - " Print double semicolons." - - let _ = - Options.add "-no_ss" (Arg.Unit (fun () -> semisep := "")) - " Do not print double semicolons (default)." - - let _ = - Options.add "-sep" - (Arg.String (fun s -> semisep := check_sep s)) - " Use this string between phrases." - - let _ = - Options.add "-curry-constr" (Arg.Set curry_constr) - "Use currified constructors." - - let _ = - Options.add "-no_comments" (Arg.Clear comments) - "Do not add comments." - - let _ = - Options.add "-add_locations" (Arg.Set locations) - "Add locations as comment." - - end - - end - - module OCamlr : - sig - module Id : Sig.Id - - module Make (Syntax : Sig.Camlp4Syntax) : - sig - open Format - - include Sig.Camlp4Syntax with module Loc = Syntax.Loc - and module Token = Syntax.Token and module Ast = Syntax.Ast - and module Gram = Syntax.Gram - - class printer : - ?curry_constr: bool -> - ?comments: bool -> - unit -> object ('a) inherit OCaml.Make(Syntax).printer end - - val with_outfile : - string option -> (formatter -> 'a -> unit) -> 'a -> unit - - val print : - string option -> - (printer -> formatter -> 'a -> unit) -> 'a -> unit - - end - - module MakeMore (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax. - Ast).S - - end = - struct - open Format - - module Id = - struct - let name = "Camlp4.Printers.OCamlr" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - include Syntax - - open Sig - - module PP_o = OCaml.Make(Syntax) - - open PP_o - - let pp = fprintf - - let is_keyword = - let keywords = [ "where" ] - and not_keywords = [ "false"; "function"; "true"; "val" ] - in - fun s -> - (not (List.mem s not_keywords)) && - ((is_keyword s) || (List.mem s keywords)) - - class printer ?curry_constr:(init_curry_constr = true) - ?(comments = true) () = - object (o) - inherit - PP_o.printer ~curry_constr: init_curry_constr ~comments () as - super - val! semisep = (";" : sep) - val! no_semisep = (";" : sep) - val mode = if comments then `comments else `no_comments - val curry_constr = init_curry_constr - val first_match_case = true - method andsep : sep = "@]@ @[<2>and@ " - method value_val = "value" - method value_let = "value" - method under_pipe = o - method under_semi = o - method reset_semi = o - method reset = o - method private unset_first_match_case = - {< first_match_case = false; >} - method private set_first_match_case = - {< first_match_case = true; >} - method seq = - fun f e -> - let rec self right f e = - let go_right = self right - and go_left = self false - in - match e with - | Ast.ExLet (_, r, bi, e1) -> - if right - then - pp f "@[<2>let %a%a@];@ %a" o#rec_flag r - o#binding bi go_right e1 - else pp f "(%a)" o#expr e - | Ast.ExSeq (_, e) -> go_right f e - | Ast.ExSem (_, e1, e2) -> - (pp f "%a;@ " go_left e1; - (match (right, e2) with - | (true, Ast.ExLet (_, r, bi, e3)) -> - pp f "@[<2>let %a%a@];@ %a" o#rec_flag r - o#binding bi go_right e3 - | _ -> go_right f e2)) - | e -> o#expr f e - in self true f e - method var = - fun f -> - function - | "" -> pp f "$lid:\"\"$" - | "[]" -> pp f "[]" - | "()" -> pp f "()" - | " True" -> pp f "True" - | " False" -> pp f "False" - | v -> - (match lex_string v with - | LIDENT s | UIDENT s | ESCAPED_IDENT s when - is_keyword s -> pp f "%s__" s - | SYMBOL s -> pp f "( %s )" s - | LIDENT s | UIDENT s | ESCAPED_IDENT s -> - pp_print_string f s - | tok -> - failwith - (sprintf "Bad token used as an identifier: %s" - (Token.to_string tok))) - method type_params = - fun f -> - function - | [] -> () - | [ x ] -> pp f "@ %a" o#ctyp x - | l -> pp f "@ @[<1>%a@]" (list o#ctyp "@ ") l - method match_case = - fun f -> - function - | Ast.McNil _ -> pp f "@ []" - | m -> - pp f "@ [ %a ]" o#set_first_match_case#match_case_aux - m - method match_case_aux = - fun f -> - function - | Ast.McNil _ -> () - | Ast.McAnt (_, s) -> o#anti f s - | Ast.McOr (_, a1, a2) -> - pp f "%a%a" o#match_case_aux a1 - o#unset_first_match_case#match_case_aux a2 - | Ast.McArr (_, p, (Ast.ExNil _), e) -> - let () = if first_match_case then () else pp f "@ | " - in - pp f "@[<2>%a@ ->@ %a@]" o#patt p o#under_pipe#expr - e - | Ast.McArr (_, p, w, e) -> - let () = if first_match_case then () else pp f "@ | " - in - pp f "@[<2>%a@ when@ %a@ ->@ %a@]" o#patt p - o#under_pipe#expr w o#under_pipe#expr e - method sum_type = - fun f -> - function - | Ast.TyNil _ -> pp f "[]" - | t -> pp f "@[[ %a ]@]" o#ctyp t - method ident = - fun f i -> - let () = o#node f i Ast.loc_of_ident - in - match i with - | Ast.IdApp (_, i1, i2) -> - pp f "%a@ %a" o#dot_ident i1 o#dot_ident i2 - | i -> o#dot_ident f i - method private dot_ident = - fun f i -> - let () = o#node f i Ast.loc_of_ident - in - match i with - | Ast.IdAcc (_, i1, i2) -> - pp f "%a.@,%a" o#dot_ident i1 o#dot_ident i2 - | Ast.IdAnt (_, s) -> o#anti f s - | Ast.IdLid (_, s) | Ast.IdUid (_, s) -> o#var f s - | i -> pp f "(%a)" o#ident i - method patt4 = - fun f -> - function - | (Ast.PaApp (_, - (Ast.PaApp (_, - (Ast.PaId (_, (Ast.IdUid (_, "::")))), _)), - _) - as p) -> - let (pl, c) = o#mk_patt_list p - in - (match c with - | None -> - pp f "@[<2>[@ %a@]@ ]" (list o#patt ";@ ") pl - | Some x -> - pp f "@[<2>[ %a ::@ %a ]@]" - (list o#patt ";@ ") pl o#patt x) - | p -> super#patt4 f p - method expr_list_cons = - fun _ f e -> - let (el, c) = o#mk_expr_list e - in - match c with - | None -> o#expr_list f el - | Some x -> - pp f "@[<2>[ %a ::@ %a ]@]" (list o#expr ";@ ") el - o#expr x - method expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | Ast.ExAss (_, e1, e2) -> - pp f "@[<2>%a@ :=@ %a@]" o#dot_expr e1 o#expr e2 - | Ast.ExFun (_, (Ast.McArr (_, p, (Ast.ExNil _), e))) - when Ast.is_irrefut_patt p -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args - ((`patt p), e) - | Ast.ExFUN (_, i, e) -> - pp f "@[<2>fun@ %a@]" o#patt_expr_fun_args - ((`newtype i), e) - | Ast.ExFun (_, a) -> - pp f "@[fun%a@]" o#match_case a - | Ast.ExAsf _ -> pp f "@[<2>assert@ False@]" - | e -> super#expr f e - method dot_expr = - fun f e -> - let () = o#node f e Ast.loc_of_expr - in - match e with - | Ast.ExAcc (_, e, - (Ast.ExId (_, (Ast.IdLid (_, "val"))))) -> - pp f "@[<2>%a.@,val@]" o#simple_expr e - | e -> super#dot_expr f e - method ctyp = - fun f t -> - let () = o#node f t Ast.loc_of_ctyp - in - match t with - | Ast.TyDcl (_, tn, tp, te, cl) -> - (pp f "@[<2>%a%a@]" o#var tn o#type_params tp; - (match te with - | Ast.TyNil _ -> () - | _ -> pp f " =@ %a" o#ctyp te); - if cl <> [] - then pp f "@ %a" (list o#constrain "@ ") cl - else ()) - | Ast.TyCol (_, t1, (Ast.TyMut (_, t2))) -> - pp f "@[%a :@ mutable %a@]" o#ctyp t1 o#ctyp t2 - | Ast.TyMan (_, t1, t2) -> - pp f "@[<2>%a ==@ %a@]" o#simple_ctyp t1 o#ctyp t2 - | t -> super#ctyp f t - method simple_ctyp = - fun f t -> - let () = o#node f t Ast.loc_of_ctyp - in - match t with - | Ast.TyVrnEq (_, t) -> - pp f "@[<2>[ =@ %a@]@ ]" o#ctyp t - | Ast.TyVrnInf (_, t) -> - pp f "@[<2>[ <@ %a@]@,]" o#ctyp t - | Ast.TyVrnInfSup (_, t1, t2) -> - pp f "@[<2>[ <@ %a@ >@ %a@]@ ]" o#ctyp t1 o#ctyp t2 - | Ast.TyVrnSup (_, t) -> - pp f "@[<2>[ >@ %a@]@,]" o#ctyp t - | Ast.TyMan (_, t1, t2) -> - pp f "@[<2>%a@ ==@ %a@]" o#simple_ctyp t1 - o#simple_ctyp t2 - | Ast.TyLab (_, s, t) -> - pp f "@[<2>~%s:@ %a@]" s o#simple_ctyp t - | t -> super#simple_ctyp f t - method ctyp1 = - fun f -> - function - | Ast.TyApp (_, t1, t2) -> - (match get_ctyp_args t1 [ t2 ] with - | (_, [ _ ]) -> - pp f "@[<2>%a@ %a@]" o#simple_ctyp t1 - o#simple_ctyp t2 - | (a, al) -> - pp f "@[<2>%a@]" (list o#simple_ctyp "@ ") - (a :: al)) - | Ast.TyPol (_, t1, t2) -> - let (a, al) = get_ctyp_args t1 [] - in - pp f "@[<2>! %a.@ %a@]" (list o#ctyp "@ ") - (a :: al) o#ctyp t2 - | t -> super#ctyp1 f t - method constructor_type = - fun f t -> - match t with - | Ast.TyAnd (loc, t1, t2) -> - let () = o#node f t (fun _ -> loc) - in - pp f "%a@ and %a" o#constructor_type t1 - o#constructor_type t2 - | t -> o#ctyp f t - method str_item = - fun f st -> - match st with - | Ast.StExp (_, e) -> - pp f "@[<2>%a%(%)@]" o#expr e semisep - | st -> super#str_item f st - method module_expr = - fun f me -> - let () = o#node f me Ast.loc_of_module_expr - in - match me with - | Ast.MeApp (_, me1, me2) -> - pp f "@[<2>%a@ %a@]" o#module_expr me1 - o#simple_module_expr me2 - | me -> super#module_expr f me - method simple_module_expr = - fun f me -> - let () = o#node f me Ast.loc_of_module_expr - in - match me with - | Ast.MeApp (_, _, _) -> pp f "(%a)" o#module_expr me - | _ -> super#simple_module_expr f me - method implem = fun f st -> pp f "@[%a@]@." o#str_item st - method class_type = - fun f ct -> - let () = o#node f ct Ast.loc_of_class_type - in - match ct with - | Ast.CtFun (_, t, ct) -> - pp f "@[<2>[ %a ] ->@ %a@]" o#simple_ctyp t - o#class_type ct - | Ast.CtCon (_, Ast.ViNil, i, (Ast.TyNil _)) -> - pp f "@[<2>%a@]" o#ident i - | Ast.CtCon (_, Ast.ViNil, i, t) -> - pp f "@[<2>%a [@,%a@]@,]" o#ident i o#class_params - t - | Ast.CtCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), - (Ast.TyNil _)) -> pp f "@[<2>virtual@ %a@]" o#var i - | Ast.CtCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), t) - -> - pp f "@[<2>virtual@ %a@ [@,%a@]@,]" o#var i - o#class_params t - | ct -> super#class_type f ct - method class_expr = - fun f ce -> - let () = o#node f ce Ast.loc_of_class_expr - in - match ce with - | Ast.CeCon (_, Ast.ViNil, i, (Ast.TyNil _)) -> - pp f "@[<2>%a@]" o#ident i - | Ast.CeCon (_, Ast.ViNil, i, t) -> - pp f "@[<2>%a@ @[<1>[%a]@]@]" o#ident i - o#class_params t - | Ast.CeCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), - (Ast.TyNil _)) -> pp f "@[<2>virtual@ %a@]" o#var i - | Ast.CeCon (_, Ast.ViVirtual, (Ast.IdLid (_, i)), t) - -> - pp f "@[<2>virtual@ %a@ @[<1>[%a]@]@]" o#var i - o#class_params t - | ce -> super#class_expr f ce - end - - let with_outfile = with_outfile - - let print output_file fct = - let o = new printer () in with_outfile output_file (fct o) - - let print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg - - let print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st - - end - - module MakeMore (Syntax : Sig.Camlp4Syntax) : Sig.Printer(Syntax. - Ast).S = - struct - include Make(Syntax) - - let margin = ref 78 - - let comments = ref true - - let locations = ref false - - let curry_constr = ref true - - let print output_file fct = - let o = - new printer ~comments: !comments ~curry_constr: !curry_constr - () in - let o = if !locations then o#set_loc_and_comments else o - in - with_outfile output_file - (fun f -> - let () = Format.pp_set_margin f !margin - in Format.fprintf f "@[%a@]@." (fct o)) - - let print_interf ?input_file:(_) ?output_file sg = - print output_file (fun o -> o#interf) sg - - let print_implem ?input_file:(_) ?output_file st = - print output_file (fun o -> o#implem) st - - let _ = - Options.add "-l" (Arg.Int (fun i -> margin := i)) - " line length for pretty printing." - - let _ = - Options.add "-no_comments" (Arg.Clear comments) - "Do not add comments." - - let _ = - Options.add "-add_locations" (Arg.Set locations) - "Add locations as comment." - - end - - end - - end - -module OCamlInitSyntax = - struct - module Make - (Ast : Sig.Camlp4Ast) - (Gram : - Sig.Grammar.Static with module Loc = Ast.Loc with - type Token.t = Sig.camlp4_token) - (Quotation : Sig.Quotation with module Ast = Sig.Camlp4AstToAst(Ast)) : - Sig.Camlp4Syntax with module Loc = Ast.Loc and module Ast = Ast - and module Token = Gram.Token and module Gram = Gram - and module Quotation = Quotation = - struct - module Loc = Ast.Loc - - module Ast = Ast - - module Gram = Gram - - module Token = Gram.Token - - open Sig - - type warning = Loc.t -> string -> unit - - let default_warning loc txt = - Format.eprintf " %a: %s@." Loc.print loc txt - - let current_warning = ref default_warning - - let print_warning loc txt = !current_warning loc txt - - let a_CHAR = Gram.Entry.mk "a_CHAR" - - let a_FLOAT = Gram.Entry.mk "a_FLOAT" - - let a_INT = Gram.Entry.mk "a_INT" - - let a_INT32 = Gram.Entry.mk "a_INT32" - - let a_INT64 = Gram.Entry.mk "a_INT64" - - let a_LABEL = Gram.Entry.mk "a_LABEL" - - let a_LIDENT = Gram.Entry.mk "a_LIDENT" - - let a_NATIVEINT = Gram.Entry.mk "a_NATIVEINT" - - let a_OPTLABEL = Gram.Entry.mk "a_OPTLABEL" - - let a_STRING = Gram.Entry.mk "a_STRING" - - let a_UIDENT = Gram.Entry.mk "a_UIDENT" - - let a_ident = Gram.Entry.mk "a_ident" - - let amp_ctyp = Gram.Entry.mk "amp_ctyp" - - let and_ctyp = Gram.Entry.mk "and_ctyp" - - let match_case = Gram.Entry.mk "match_case" - - let match_case0 = Gram.Entry.mk "match_case0" - - let binding = Gram.Entry.mk "binding" - - let class_declaration = Gram.Entry.mk "class_declaration" - - let class_description = Gram.Entry.mk "class_description" - - let class_expr = Gram.Entry.mk "class_expr" - - let class_fun_binding = Gram.Entry.mk "class_fun_binding" - - let class_fun_def = Gram.Entry.mk "class_fun_def" - - let class_info_for_class_expr = - Gram.Entry.mk "class_info_for_class_expr" - - let class_info_for_class_type = - Gram.Entry.mk "class_info_for_class_type" - - let class_longident = Gram.Entry.mk "class_longident" - - let class_longident_and_param = - Gram.Entry.mk "class_longident_and_param" - - let class_name_and_param = Gram.Entry.mk "class_name_and_param" - - let class_sig_item = Gram.Entry.mk "class_sig_item" - - let class_signature = Gram.Entry.mk "class_signature" - - let class_str_item = Gram.Entry.mk "class_str_item" - - let class_structure = Gram.Entry.mk "class_structure" - - let class_type = Gram.Entry.mk "class_type" - - let class_type_declaration = Gram.Entry.mk "class_type_declaration" - - let class_type_longident = Gram.Entry.mk "class_type_longident" - - let class_type_longident_and_param = - Gram.Entry.mk "class_type_longident_and_param" - - let class_type_plus = Gram.Entry.mk "class_type_plus" - - let comma_ctyp = Gram.Entry.mk "comma_ctyp" - - let comma_expr = Gram.Entry.mk "comma_expr" - - let comma_ipatt = Gram.Entry.mk "comma_ipatt" - - let comma_patt = Gram.Entry.mk "comma_patt" - - let comma_type_parameter = Gram.Entry.mk "comma_type_parameter" - - let constrain = Gram.Entry.mk "constrain" - - let constructor_arg_list = Gram.Entry.mk "constructor_arg_list" - - let constructor_declaration = Gram.Entry.mk "constructor_declaration" - - let constructor_declarations = - Gram.Entry.mk "constructor_declarations" - - let ctyp = Gram.Entry.mk "ctyp" - - let cvalue_binding = Gram.Entry.mk "cvalue_binding" - - let direction_flag = Gram.Entry.mk "direction_flag" - - let direction_flag_quot = Gram.Entry.mk "direction_flag_quot" - - let dummy = Gram.Entry.mk "dummy" - - let entry_eoi = Gram.Entry.mk "entry_eoi" - - let eq_expr = Gram.Entry.mk "eq_expr" - - let expr = Gram.Entry.mk "expr" - - let expr_eoi = Gram.Entry.mk "expr_eoi" - - let field_expr = Gram.Entry.mk "field_expr" - - let field_expr_list = Gram.Entry.mk "field_expr_list" - - let fun_binding = Gram.Entry.mk "fun_binding" - - let fun_def = Gram.Entry.mk "fun_def" - - let ident = Gram.Entry.mk "ident" - - let implem = Gram.Entry.mk "implem" - - let interf = Gram.Entry.mk "interf" - - let ipatt = Gram.Entry.mk "ipatt" - - let ipatt_tcon = Gram.Entry.mk "ipatt_tcon" - - let label = Gram.Entry.mk "label" - - let label_declaration = Gram.Entry.mk "label_declaration" - - let label_declaration_list = Gram.Entry.mk "label_declaration_list" - - let label_expr = Gram.Entry.mk "label_expr" - - let label_expr_list = Gram.Entry.mk "label_expr_list" - - let label_ipatt = Gram.Entry.mk "label_ipatt" - - let label_ipatt_list = Gram.Entry.mk "label_ipatt_list" - - let label_longident = Gram.Entry.mk "label_longident" - - let label_patt = Gram.Entry.mk "label_patt" - - let label_patt_list = Gram.Entry.mk "label_patt_list" - - let labeled_ipatt = Gram.Entry.mk "labeled_ipatt" - - let let_binding = Gram.Entry.mk "let_binding" - - let meth_list = Gram.Entry.mk "meth_list" - - let meth_decl = Gram.Entry.mk "meth_decl" - - let module_binding = Gram.Entry.mk "module_binding" - - let module_binding0 = Gram.Entry.mk "module_binding0" - - let module_declaration = Gram.Entry.mk "module_declaration" - - let module_expr = Gram.Entry.mk "module_expr" - - let module_longident = Gram.Entry.mk "module_longident" - - let module_longident_with_app = - Gram.Entry.mk "module_longident_with_app" - - let module_rec_declaration = Gram.Entry.mk "module_rec_declaration" - - let module_type = Gram.Entry.mk "module_type" - - let package_type = Gram.Entry.mk "package_type" - - let more_ctyp = Gram.Entry.mk "more_ctyp" - - let name_tags = Gram.Entry.mk "name_tags" - - let opt_as_lident = Gram.Entry.mk "opt_as_lident" - - let opt_class_self_patt = Gram.Entry.mk "opt_class_self_patt" - - let opt_class_self_type = Gram.Entry.mk "opt_class_self_type" - - let opt_class_signature = Gram.Entry.mk "opt_class_signature" - - let opt_class_structure = Gram.Entry.mk "opt_class_structure" - - let opt_comma_ctyp = Gram.Entry.mk "opt_comma_ctyp" - - let opt_dot_dot = Gram.Entry.mk "opt_dot_dot" - - let row_var_flag_quot = Gram.Entry.mk "row_var_flag_quot" - - let opt_eq_ctyp = Gram.Entry.mk "opt_eq_ctyp" - - let opt_expr = Gram.Entry.mk "opt_expr" - - let opt_meth_list = Gram.Entry.mk "opt_meth_list" - - let opt_mutable = Gram.Entry.mk "opt_mutable" - - let mutable_flag_quot = Gram.Entry.mk "mutable_flag_quot" - - let opt_polyt = Gram.Entry.mk "opt_polyt" - - let opt_private = Gram.Entry.mk "opt_private" - - let private_flag_quot = Gram.Entry.mk "private_flag_quot" - - let opt_rec = Gram.Entry.mk "opt_rec" - - let rec_flag_quot = Gram.Entry.mk "rec_flag_quot" - - let opt_sig_items = Gram.Entry.mk "opt_sig_items" - - let opt_str_items = Gram.Entry.mk "opt_str_items" - - let opt_virtual = Gram.Entry.mk "opt_virtual" - - let virtual_flag_quot = Gram.Entry.mk "virtual_flag_quot" - - let opt_override = Gram.Entry.mk "opt_override" - - let override_flag_quot = Gram.Entry.mk "override_flag_quot" - - let opt_when_expr = Gram.Entry.mk "opt_when_expr" - - let patt = Gram.Entry.mk "patt" - - let patt_as_patt_opt = Gram.Entry.mk "patt_as_patt_opt" - - let patt_eoi = Gram.Entry.mk "patt_eoi" - - let patt_tcon = Gram.Entry.mk "patt_tcon" - - let phrase = Gram.Entry.mk "phrase" - - let poly_type = Gram.Entry.mk "poly_type" - - let row_field = Gram.Entry.mk "row_field" - - let sem_expr = Gram.Entry.mk "sem_expr" - - let sem_expr_for_list = Gram.Entry.mk "sem_expr_for_list" - - let sem_patt = Gram.Entry.mk "sem_patt" - - let sem_patt_for_list = Gram.Entry.mk "sem_patt_for_list" - - let semi = Gram.Entry.mk "semi" - - let sequence = Gram.Entry.mk "sequence" - - let do_sequence = Gram.Entry.mk "do_sequence" - - let sig_item = Gram.Entry.mk "sig_item" - - let sig_items = Gram.Entry.mk "sig_items" - - let star_ctyp = Gram.Entry.mk "star_ctyp" - - let str_item = Gram.Entry.mk "str_item" - - let str_items = Gram.Entry.mk "str_items" - - let top_phrase = Gram.Entry.mk "top_phrase" - - let type_constraint = Gram.Entry.mk "type_constraint" - - let type_declaration = Gram.Entry.mk "type_declaration" - - let type_ident_and_parameters = - Gram.Entry.mk "type_ident_and_parameters" - - let type_kind = Gram.Entry.mk "type_kind" - - let type_longident = Gram.Entry.mk "type_longident" - - let type_longident_and_parameters = - Gram.Entry.mk "type_longident_and_parameters" - - let type_parameter = Gram.Entry.mk "type_parameter" - - let type_parameters = Gram.Entry.mk "type_parameters" - - let typevars = Gram.Entry.mk "typevars" - - let use_file = Gram.Entry.mk "use_file" - - let val_longident = Gram.Entry.mk "val_longident" - - let value_let = Gram.Entry.mk "value_let" - - let value_val = Gram.Entry.mk "value_val" - - let with_constr = Gram.Entry.mk "with_constr" - - let expr_quot = Gram.Entry.mk "quotation of expression" - - let patt_quot = Gram.Entry.mk "quotation of pattern" - - let ctyp_quot = Gram.Entry.mk "quotation of type" - - let str_item_quot = Gram.Entry.mk "quotation of structure item" - - let sig_item_quot = Gram.Entry.mk "quotation of signature item" - - let class_str_item_quot = - Gram.Entry.mk "quotation of class structure item" - - let class_sig_item_quot = - Gram.Entry.mk "quotation of class signature item" - - let module_expr_quot = Gram.Entry.mk "quotation of module expression" - - let module_type_quot = Gram.Entry.mk "quotation of module type" - - let class_type_quot = Gram.Entry.mk "quotation of class type" - - let class_expr_quot = Gram.Entry.mk "quotation of class expression" - - let with_constr_quot = Gram.Entry.mk "quotation of with constraint" - - let binding_quot = Gram.Entry.mk "quotation of binding" - - let rec_binding_quot = Gram.Entry.mk "quotation of record binding" - - let match_case_quot = - Gram.Entry.mk "quotation of match_case (try/match/function case)" - - let module_binding_quot = - Gram.Entry.mk "quotation of module rec binding" - - let ident_quot = Gram.Entry.mk "quotation of identifier" - - let prefixop = - Gram.Entry.mk "prefix operator (start with '!', '?', '~')" - - let infixop0 = - Gram.Entry.mk - "infix operator (level 0) (comparison operators, and some others)" - - let infixop1 = - Gram.Entry.mk "infix operator (level 1) (start with '^', '@')" - - let infixop2 = - Gram.Entry.mk "infix operator (level 2) (start with '+', '-')" - - let infixop3 = - Gram.Entry.mk "infix operator (level 3) (start with '*', '/', '%')" - - let infixop4 = - Gram.Entry.mk - "infix operator (level 4) (start with \"**\") (right assoc)" - - let _ = - Gram.extend (top_phrase : 'top_phrase Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | EOI -> true | _ -> false), "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (None : 'top_phrase) - | _ -> assert false))) ]) ])) - ()) - - module AntiquotSyntax = - struct - module Loc = Ast.Loc - - module Ast = Sig.Camlp4AstToAst(Ast) - - module Gram = Gram - - let antiquot_expr = Gram.Entry.mk "antiquot_expr" - - let antiquot_patt = Gram.Entry.mk "antiquot_patt" - - let _ = - (Gram.extend (antiquot_expr : 'antiquot_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) (x : 'expr) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (x : 'antiquot_expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (antiquot_patt : 'antiquot_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) (x : 'patt) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (x : 'antiquot_patt) - | _ -> assert false))) ]) ])) - ())) - - let parse_expr loc str = Gram.parse_string antiquot_expr loc str - - let parse_patt loc str = Gram.parse_string antiquot_patt loc str - - end - - module Quotation = Quotation - - let wrap directive_handler pa init_loc cs = - let rec loop loc = - let (pl, stopped_at_directive) = pa loc cs - in - match stopped_at_directive with - | Some new_loc -> - let pl = - (match List.rev pl with - | [] -> assert false - | x :: xs -> - (match directive_handler x with - | None -> xs - | Some x -> x :: xs)) - in (List.rev pl) @ (loop new_loc) - | None -> pl - in loop init_loc - - let parse_implem ?(directive_handler = fun _ -> None) _loc cs = - let l = wrap directive_handler (Gram.parse implem) _loc cs - in Ast.stSem_of_list l - - let parse_interf ?(directive_handler = fun _ -> None) _loc cs = - let l = wrap directive_handler (Gram.parse interf) _loc cs - in Ast.sgSem_of_list l - - let print_interf ?input_file:(_) ?output_file:(_) _ = - failwith "No interface printer" - - let print_implem ?input_file:(_) ?output_file:(_) _ = - failwith "No implementation printer" - - end - - end - -module PreCast : - sig - type camlp4_token = - Sig.camlp4_token = - | KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int * string - | INT32 of int32 * string - | INT64 of int64 * string - | NATIVEINT of nativeint * string - | FLOAT of float * string - | CHAR of char * string - | STRING of string * string - | LABEL of string - | OPTLABEL of string - | QUOTATION of Sig.quotation - | ANTIQUOT of string * string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int * string option - | EOI - - module Id : Sig.Id - - module Loc : Sig.Loc - - module Ast : Sig.Camlp4Ast with module Loc = Loc - - module Token : Sig.Token with module Loc = Loc and type t = camlp4_token - - module Lexer : Sig.Lexer with module Loc = Loc and module Token = Token - - module Gram : Sig.Grammar.Static with module Loc = Loc - and module Token = Token - - module Quotation : - Sig.Quotation with module Ast = Sig.Camlp4AstToAst(Ast) - - module DynLoader : Sig.DynLoader - - module AstFilters : Sig.AstFilters with module Ast = Ast - - module Syntax : Sig.Camlp4Syntax with module Loc = Loc - and module Token = Token and module Ast = Ast and module Gram = Gram - and module Quotation = Quotation - - module Printers : - sig - module OCaml : Sig.Printer(Ast).S - - module OCamlr : Sig.Printer(Ast).S - - module DumpOCamlAst : Sig.Printer(Ast).S - - module DumpCamlp4Ast : Sig.Printer(Ast).S - - module Null : Sig.Printer(Ast).S - - end - - module MakeGram (Lexer : Sig.Lexer with module Loc = Loc) : - Sig.Grammar.Static with module Loc = Loc and module Token = Lexer.Token - - module MakeSyntax (U : sig end) : Sig.Syntax - - end = - struct - module Id = - struct let name = "Camlp4.PreCast" - let version = Sys.ocaml_version - end - - type camlp4_token = - Sig.camlp4_token = - | KEYWORD of string - | SYMBOL of string - | LIDENT of string - | UIDENT of string - | ESCAPED_IDENT of string - | INT of int * string - | INT32 of int32 * string - | INT64 of int64 * string - | NATIVEINT of nativeint * string - | FLOAT of float * string - | CHAR of char * string - | STRING of string * string - | LABEL of string - | OPTLABEL of string - | QUOTATION of Sig.quotation - | ANTIQUOT of string * string - | COMMENT of string - | BLANKS of string - | NEWLINE - | LINE_DIRECTIVE of int * string option - | EOI - - module Loc = Struct.Loc - - module Ast = Struct.Camlp4Ast.Make(Loc) - - module Token = Struct.Token.Make(Loc) - - module Lexer = Struct.Lexer.Make(Token) - - module Gram = Struct.Grammar.Static.Make(Lexer) - - module DynLoader = Struct.DynLoader - - module Quotation = Struct.Quotation.Make(Ast) - - module MakeSyntax (U : sig end) = - OCamlInitSyntax.Make(Ast)(Gram)(Quotation) - - module Syntax = MakeSyntax(struct end) - - module AstFilters = Struct.AstFilters.Make(Ast) - - module MakeGram = Struct.Grammar.Static.Make - - module Printers = - struct - module OCaml = Printers.OCaml.Make(Syntax) - - module OCamlr = Printers.OCamlr.Make(Syntax) - - module DumpOCamlAst = Printers.DumpOCamlAst.Make(Syntax) - - module DumpCamlp4Ast = Printers.DumpCamlp4Ast.Make(Syntax) - - module Null = Printers.Null.Make(Syntax) - - end - - end - -module Register : - sig - module Plugin - (Id : Sig.Id) (Plugin : functor (Unit : sig end) -> sig end) : - sig end - - module SyntaxPlugin - (Id : Sig.Id) (SyntaxPlugin : functor (Syn : Sig.Syntax) -> sig end) : - sig end - - module SyntaxExtension - (Id : Sig.Id) (SyntaxExtension : Sig.SyntaxExtension) : sig end - - module OCamlSyntaxExtension - (Id : Sig.Id) - (SyntaxExtension : - functor (Syntax : Sig.Camlp4Syntax) -> Sig.Camlp4Syntax) : - sig end - - type 'a parser_fun = - ?directive_handler: ('a -> 'a option) -> - PreCast.Loc.t -> char Stream.t -> 'a - - val register_str_item_parser : PreCast.Ast.str_item parser_fun -> unit - - val register_sig_item_parser : PreCast.Ast.sig_item parser_fun -> unit - - val register_parser : - PreCast.Ast.str_item parser_fun -> - PreCast.Ast.sig_item parser_fun -> unit - - val current_parser : - unit -> - ((PreCast.Ast.str_item parser_fun) * - (PreCast.Ast.sig_item parser_fun)) - - module Parser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Ast) -> Sig.Parser(Ast).S) : - sig end - - module OCamlParser - (Id : Sig.Id) - (Maker : functor (Ast : Sig.Camlp4Ast) -> Sig.Parser(Ast).S) : - sig end - - module OCamlPreCastParser - (Id : Sig.Id) (Parser : Sig.Parser(PreCast.Ast).S) : sig end - - type 'a printer_fun = - ?input_file: string -> ?output_file: string -> 'a -> unit - - val register_str_item_printer : PreCast.Ast.str_item printer_fun -> unit - - val register_sig_item_printer : PreCast.Ast.sig_item printer_fun -> unit - - val register_printer : - PreCast.Ast.str_item printer_fun -> - PreCast.Ast.sig_item printer_fun -> unit - - val current_printer : - unit -> - ((PreCast.Ast.str_item printer_fun) * - (PreCast.Ast.sig_item printer_fun)) - - module Printer - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Syntax) -> Sig.Printer(Syn.Ast).S) : - sig end - - module OCamlPrinter - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Camlp4Syntax) -> Sig.Printer(Syn.Ast).S) : - sig end - - module OCamlPreCastPrinter - (Id : Sig.Id) (Printer : Sig.Printer(PreCast.Ast).S) : sig end - - module AstFilter - (Id : Sig.Id) (Maker : functor (F : Sig.AstFilters) -> sig end) : - sig end - - val declare_dyn_module : string -> (unit -> unit) -> unit - - val iter_and_take_callbacks : ((string * (unit -> unit)) -> unit) -> unit - - val loaded_modules : (string list) ref - - module CurrentParser : Sig.Parser(PreCast.Ast).S - - module CurrentPrinter : Sig.Printer(PreCast.Ast).S - - val enable_ocaml_printer : unit -> unit - - val enable_ocamlr_printer : unit -> unit - - val enable_null_printer : unit -> unit - - val enable_dump_ocaml_ast_printer : unit -> unit - - val enable_dump_camlp4_ast_printer : unit -> unit - - end = - struct - module PP = Printers - - open PreCast - - type 'a parser_fun = - ?directive_handler: ('a -> 'a option) -> - PreCast.Loc.t -> char Stream.t -> 'a - - type 'a printer_fun = - ?input_file: string -> ?output_file: string -> 'a -> unit - - let sig_item_parser = - ref (fun ?directive_handler:(_) _ _ -> failwith "No interface parser") - - let str_item_parser = - ref - (fun ?directive_handler:(_) _ _ -> - failwith "No implementation parser") - - let sig_item_printer = - ref - (fun ?input_file:(_) ?output_file:(_) _ -> - failwith "No interface printer") - - let str_item_printer = - ref - (fun ?input_file:(_) ?output_file:(_) _ -> - failwith "No implementation printer") - - let callbacks = Queue.create () - - let loaded_modules = ref [] - - let iter_and_take_callbacks f = - let rec loop () = loop (f (Queue.take callbacks)) - in try loop () with | Queue.Empty -> () - - let declare_dyn_module m f = - (loaded_modules := m :: !loaded_modules; Queue.add (m, f) callbacks) - - let register_str_item_parser f = str_item_parser := f - - let register_sig_item_parser f = sig_item_parser := f - - let register_parser f g = (str_item_parser := f; sig_item_parser := g) - - let current_parser () = ((!str_item_parser), (!sig_item_parser)) - - let register_str_item_printer f = str_item_printer := f - - let register_sig_item_printer f = sig_item_printer := f - - let register_printer f g = (str_item_printer := f; sig_item_printer := g) - - let current_printer () = ((!str_item_printer), (!sig_item_printer)) - - module Plugin - (Id : Sig.Id) (Maker : functor (Unit : sig end) -> sig end) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(struct end) in ()) - - end - - module SyntaxExtension (Id : Sig.Id) (Maker : Sig.SyntaxExtension) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(Syntax) in ()) - - end - - module OCamlSyntaxExtension - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Camlp4Syntax) -> Sig.Camlp4Syntax) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(Syntax) in ()) - - end - - module SyntaxPlugin - (Id : Sig.Id) (Maker : functor (Syn : Sig.Syntax) -> sig end) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(Syntax) in ()) - - end - - module Printer - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Syntax) -> Sig.Printer(Syn.Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(Syntax) - in register_printer M.print_implem M.print_interf) - - end - - module OCamlPrinter - (Id : Sig.Id) - (Maker : functor (Syn : Sig.Camlp4Syntax) -> Sig.Printer(Syn.Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(Syntax) - in register_printer M.print_implem M.print_interf) - - end - - module OCamlPreCastPrinter - (Id : Sig.Id) (P : Sig.Printer(PreCast.Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> register_printer P.print_implem P.print_interf) - - end - - module Parser - (Id : Sig.Id) (Maker : functor (Ast : Sig.Ast) -> Sig.Parser(Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(PreCast.Ast) - in register_parser M.parse_implem M.parse_interf) - - end - - module OCamlParser - (Id : Sig.Id) - (Maker : functor (Ast : Sig.Camlp4Ast) -> Sig.Parser(Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(PreCast.Ast) - in register_parser M.parse_implem M.parse_interf) - - end - - module OCamlPreCastParser (Id : Sig.Id) (P : Sig.Parser(PreCast.Ast).S) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> register_parser P.parse_implem P.parse_interf) - - end - - module AstFilter - (Id : Sig.Id) (Maker : functor (F : Sig.AstFilters) -> sig end) = - struct - let _ = - declare_dyn_module Id.name - (fun _ -> let module M = Maker(AstFilters) in ()) - - end - - let _ = sig_item_parser := Syntax.parse_interf - - let _ = str_item_parser := Syntax.parse_implem - - module CurrentParser = - struct - module Ast = Ast - - let parse_interf ?directive_handler loc strm = - !sig_item_parser ?directive_handler loc strm - - let parse_implem ?directive_handler loc strm = - !str_item_parser ?directive_handler loc strm - - end - - module CurrentPrinter = - struct - module Ast = Ast - - let print_interf ?input_file ?output_file ast = - !sig_item_printer ?input_file ?output_file ast - - let print_implem ?input_file ?output_file ast = - !str_item_printer ?input_file ?output_file ast - - end - - let enable_ocaml_printer () = - let module M = OCamlPrinter(PP.OCaml.Id)(PP.OCaml.MakeMore) in () - - let enable_ocamlr_printer () = - let module M = OCamlPrinter(PP.OCamlr.Id)(PP.OCamlr.MakeMore) in () - - let enable_dump_ocaml_ast_printer () = - let module M = OCamlPrinter(PP.DumpOCamlAst.Id)(PP.DumpOCamlAst.Make) - in () - - let enable_dump_camlp4_ast_printer () = - let module M = Printer(PP.DumpCamlp4Ast.Id)(PP.DumpCamlp4Ast.Make) - in () - - let enable_null_printer () = - let module M = Printer(PP.Null.Id)(PP.Null.Make) in () - - end - - diff --git a/camlp4/boot/Camlp4.ml4 b/camlp4/boot/Camlp4.ml4 deleted file mode 100644 index 3eb7978a..00000000 --- a/camlp4/boot/Camlp4.ml4 +++ /dev/null @@ -1,78 +0,0 @@ -module Debug : sig INCLUDE "camlp4/Camlp4/Debug.mli"; end = struct INCLUDE "camlp4/Camlp4/Debug.ml"; end; -module Options : sig INCLUDE "camlp4/Camlp4/Options.mli"; end = struct INCLUDE "camlp4/Camlp4/Options.ml"; end; -module Sig = struct INCLUDE "camlp4/Camlp4/Sig.ml"; end; -module ErrorHandler : sig INCLUDE "camlp4/Camlp4/ErrorHandler.mli"; end = struct INCLUDE "camlp4/Camlp4/ErrorHandler.ml"; end; - -module Struct = struct - module Loc : - sig INCLUDE "camlp4/Camlp4/Struct/Loc.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/Loc.ml"; end; - module Token : - sig INCLUDE "camlp4/Camlp4/Struct/Token.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/Token.ml"; end; - module Lexer = struct INCLUDE "camlp4/boot/Lexer.ml"; end; - module Camlp4Ast = struct INCLUDE "camlp4/Camlp4/Struct/Camlp4Ast.ml"; end; - module DynAst = struct INCLUDE "camlp4/Camlp4/Struct/DynAst.ml"; end; - module Quotation = struct INCLUDE "camlp4/Camlp4/Struct/Quotation.ml"; end; - module AstFilters = struct INCLUDE "camlp4/Camlp4/Struct/AstFilters.ml"; end; - module Camlp4Ast2OCamlAst : - sig INCLUDE "camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml"; end; - module CleanAst = struct INCLUDE "camlp4/Camlp4/Struct/CleanAst.ml"; end; - module CommentFilter : - sig INCLUDE "camlp4/Camlp4/Struct/CommentFilter.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/CommentFilter.ml"; end; - module DynLoader : - sig INCLUDE "camlp4/Camlp4/Struct/DynLoader.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/DynLoader.ml"; end; - module EmptyError : - sig INCLUDE "camlp4/Camlp4/Struct/EmptyError.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/EmptyError.ml"; end; - module EmptyPrinter : - sig INCLUDE "camlp4/Camlp4/Struct/EmptyPrinter.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/EmptyPrinter.ml"; end; - module FreeVars : - sig INCLUDE "camlp4/Camlp4/Struct/FreeVars.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/FreeVars.ml"; end; - module Grammar = struct - module Structure = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Structure.ml"; end; - module Search = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Search.ml"; end; - (* module Find = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Find.ml"; end; *) - module Tools = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Tools.ml"; end; - module Print : - sig INCLUDE "camlp4/Camlp4/Struct/Grammar/Print.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Print.ml"; end; - module Failed = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Failed.ml"; end; - module Parser = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Parser.ml"; end; - module Insert = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Insert.ml"; end; - module Delete = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Delete.ml"; end; - module Fold : - sig INCLUDE "camlp4/Camlp4/Struct/Grammar/Fold.mli"; end = - struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Fold.ml"; end; - module Entry = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Entry.ml"; end; - module Static = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Static.ml"; end; - module Dynamic = struct INCLUDE "camlp4/Camlp4/Struct/Grammar/Dynamic.ml"; end; - end; -end; - -module Printers = struct - module DumpCamlp4Ast : - sig INCLUDE "camlp4/Camlp4/Printers/DumpCamlp4Ast.mli"; end = - struct INCLUDE "camlp4/Camlp4/Printers/DumpCamlp4Ast.ml"; end; - module DumpOCamlAst : - sig INCLUDE "camlp4/Camlp4/Printers/DumpOCamlAst.mli"; end = - struct INCLUDE "camlp4/Camlp4/Printers/DumpOCamlAst.ml"; end; - module Null : - sig INCLUDE "camlp4/Camlp4/Printers/Null.mli"; end = - struct INCLUDE "camlp4/Camlp4/Printers/Null.ml"; end; - module OCaml : - sig INCLUDE "camlp4/Camlp4/Printers/OCaml.mli"; end = - struct INCLUDE "camlp4/Camlp4/Printers/OCaml.ml"; end; - module OCamlr : - sig INCLUDE "camlp4/Camlp4/Printers/OCamlr.mli"; end = - struct INCLUDE "camlp4/Camlp4/Printers/OCamlr.ml"; end; -end; - -module OCamlInitSyntax = struct INCLUDE "camlp4/Camlp4/OCamlInitSyntax.ml"; end; -module PreCast : sig INCLUDE "camlp4/Camlp4/PreCast.mli"; end = struct INCLUDE "camlp4/Camlp4/PreCast.ml"; end; -module Register : sig INCLUDE "camlp4/Camlp4/Register.mli"; end = struct INCLUDE "camlp4/Camlp4/Register.ml"; end; diff --git a/camlp4/boot/Camlp4Ast.ml b/camlp4/boot/Camlp4Ast.ml deleted file mode 100644 index 0b9a3de0..00000000 --- a/camlp4/boot/Camlp4Ast.ml +++ /dev/null @@ -1,6219 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) -(* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) -module Make (Loc : Sig.Loc) : Sig.Camlp4Ast with module Loc = Loc = - struct - module Loc = Loc; - module Ast = - struct - include (Sig.MakeCamlp4Ast Loc); - value safe_string_escaped s = - if ((String.length s) > 2) && ((s.[0] = '\\') && (s.[1] = '$')) - then s - else String.escaped s; - end; - include Ast; - external loc_of_ctyp : ctyp -> Loc.t = "%field0"; - external loc_of_patt : patt -> Loc.t = "%field0"; - external loc_of_expr : expr -> Loc.t = "%field0"; - external loc_of_module_type : module_type -> Loc.t = "%field0"; - external loc_of_module_expr : module_expr -> Loc.t = "%field0"; - external loc_of_sig_item : sig_item -> Loc.t = "%field0"; - external loc_of_str_item : str_item -> Loc.t = "%field0"; - external loc_of_class_type : class_type -> Loc.t = "%field0"; - external loc_of_class_sig_item : class_sig_item -> Loc.t = "%field0"; - external loc_of_class_expr : class_expr -> Loc.t = "%field0"; - external loc_of_class_str_item : class_str_item -> Loc.t = "%field0"; - external loc_of_with_constr : with_constr -> Loc.t = "%field0"; - external loc_of_binding : binding -> Loc.t = "%field0"; - external loc_of_rec_binding : rec_binding -> Loc.t = "%field0"; - external loc_of_module_binding : module_binding -> Loc.t = "%field0"; - external loc_of_match_case : match_case -> Loc.t = "%field0"; - external loc_of_ident : ident -> Loc.t = "%field0"; - value ghost = Loc.ghost; - value rec is_module_longident = - fun - [ Ast.IdAcc _ _ i -> is_module_longident i - | Ast.IdApp _ i1 i2 -> - (is_module_longident i1) && (is_module_longident i2) - | Ast.IdUid _ _ -> True - | _ -> False ]; - value ident_of_expr = - let error () = - invalid_arg "ident_of_expr: this expression is not an identifier" in - let rec self = - fun - [ Ast.ExApp _loc e1 e2 -> Ast.IdApp _loc (self e1) (self e2) - | Ast.ExAcc _loc e1 e2 -> Ast.IdAcc _loc (self e1) (self e2) - | Ast.ExId _ (Ast.IdLid _ _) -> error () - | Ast.ExId _ i -> if is_module_longident i then i else error () - | _ -> error () ] - in - fun [ Ast.ExId _ i -> i | Ast.ExApp _ _ _ -> error () | t -> self t ]; - value ident_of_ctyp = - let error () = - invalid_arg "ident_of_ctyp: this type is not an identifier" in - let rec self = - fun - [ Ast.TyApp _loc t1 t2 -> Ast.IdApp _loc (self t1) (self t2) - | Ast.TyId _ (Ast.IdLid _ _) -> error () - | Ast.TyId _ i -> if is_module_longident i then i else error () - | _ -> error () ] - in fun [ Ast.TyId _ i -> i | t -> self t ]; - value ident_of_patt = - let error () = - invalid_arg "ident_of_patt: this pattern is not an identifier" in - let rec self = - fun - [ Ast.PaApp _loc p1 p2 -> Ast.IdApp _loc (self p1) (self p2) - | Ast.PaId _ (Ast.IdLid _ _) -> error () - | Ast.PaId _ i -> if is_module_longident i then i else error () - | _ -> error () ] - in fun [ Ast.PaId _ i -> i | p -> self p ]; - value rec is_irrefut_patt = - fun - [ Ast.PaId _ (Ast.IdLid _ _) -> True - | Ast.PaId _ (Ast.IdUid _ "()") -> True - | Ast.PaAny _ -> True - | Ast.PaNil _ -> True - | (* why not *) Ast.PaAli _ x y -> - (is_irrefut_patt x) && (is_irrefut_patt y) - | Ast.PaRec _ p -> is_irrefut_patt p - | Ast.PaEq _ _ p -> is_irrefut_patt p - | Ast.PaSem _ p1 p2 -> (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaCom _ p1 p2 -> (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaOrp _ p1 p2 -> (is_irrefut_patt p1) && (is_irrefut_patt p2) - | (* could be more fine grained *) Ast.PaApp _ p1 p2 -> - (is_irrefut_patt p1) && (is_irrefut_patt p2) - | Ast.PaTyc _ p _ -> is_irrefut_patt p - | Ast.PaTup _ pl -> is_irrefut_patt pl - | Ast.PaOlb _ _ (Ast.PaNil _) -> True - | Ast.PaOlb _ _ p -> is_irrefut_patt p - | Ast.PaOlbi _ _ p _ -> is_irrefut_patt p - | Ast.PaLab _ _ (Ast.PaNil _) -> True - | Ast.PaLab _ _ p -> is_irrefut_patt p - | Ast.PaLaz _ p -> is_irrefut_patt p - | Ast.PaId _ _ -> False - | (* here one need to know the arity of constructors *) Ast.PaMod _ _ - -> True - | Ast.PaVrn _ _ | Ast.PaStr _ _ | Ast.PaRng _ _ _ | Ast.PaFlo _ _ | - Ast.PaNativeInt _ _ | Ast.PaInt64 _ _ | Ast.PaInt32 _ _ | - Ast.PaInt _ _ | Ast.PaChr _ _ | Ast.PaTyp _ _ | Ast.PaArr _ _ | - Ast.PaAnt _ _ -> False ]; - value rec is_constructor = - fun - [ Ast.IdAcc _ _ i -> is_constructor i - | Ast.IdUid _ _ -> True - | Ast.IdLid _ _ | Ast.IdApp _ _ _ -> False - | Ast.IdAnt _ _ -> assert False ]; - value is_patt_constructor = - fun - [ Ast.PaId _ i -> is_constructor i - | Ast.PaVrn _ _ -> True - | _ -> False ]; - value rec is_expr_constructor = - fun - [ Ast.ExId _ i -> is_constructor i - | Ast.ExAcc _ e1 e2 -> - (is_expr_constructor e1) && (is_expr_constructor e2) - | Ast.ExVrn _ _ -> True - | _ -> False ]; - value rec tyOr_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TyOr _loc t (tyOr_of_list ts) ]; - value rec tyAnd_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TyAnd _loc t (tyAnd_of_list ts) ]; - value rec tySem_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TySem _loc t (tySem_of_list ts) ]; - value rec tyCom_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TyCom _loc t (tyCom_of_list ts) ]; - value rec tyAmp_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TyAmp _loc t (tyAmp_of_list ts) ]; - value rec tySta_of_list = - fun - [ [] -> Ast.TyNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_ctyp t in Ast.TySta _loc t (tySta_of_list ts) ]; - value rec stSem_of_list = - fun - [ [] -> Ast.StNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_str_item t in Ast.StSem _loc t (stSem_of_list ts) ]; - value rec sgSem_of_list = - fun - [ [] -> Ast.SgNil ghost - | [ t ] -> t - | [ t :: ts ] -> - let _loc = loc_of_sig_item t in Ast.SgSem _loc t (sgSem_of_list ts) ]; - value rec biAnd_of_list = - fun - [ [] -> Ast.BiNil ghost - | [ b ] -> b - | [ b :: bs ] -> - let _loc = loc_of_binding b in Ast.BiAnd _loc b (biAnd_of_list bs) ]; - value rec rbSem_of_list = - fun - [ [] -> Ast.RbNil ghost - | [ b ] -> b - | [ b :: bs ] -> - let _loc = loc_of_rec_binding b - in Ast.RbSem _loc b (rbSem_of_list bs) ]; - value rec wcAnd_of_list = - fun - [ [] -> Ast.WcNil ghost - | [ w ] -> w - | [ w :: ws ] -> - let _loc = loc_of_with_constr w - in Ast.WcAnd _loc w (wcAnd_of_list ws) ]; - value rec idAcc_of_list = - fun - [ [] -> assert False - | [ i ] -> i - | [ i :: is ] -> - let _loc = loc_of_ident i in Ast.IdAcc _loc i (idAcc_of_list is) ]; - value rec idApp_of_list = - fun - [ [] -> assert False - | [ i ] -> i - | [ i :: is ] -> - let _loc = loc_of_ident i in Ast.IdApp _loc i (idApp_of_list is) ]; - value rec mcOr_of_list = - fun - [ [] -> Ast.McNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_match_case x in Ast.McOr _loc x (mcOr_of_list xs) ]; - value rec mbAnd_of_list = - fun - [ [] -> Ast.MbNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_module_binding x - in Ast.MbAnd _loc x (mbAnd_of_list xs) ]; - value rec meApp_of_list = - fun - [ [] -> assert False - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_module_expr x - in Ast.MeApp _loc x (meApp_of_list xs) ]; - value rec ceAnd_of_list = - fun - [ [] -> Ast.CeNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_class_expr x - in Ast.CeAnd _loc x (ceAnd_of_list xs) ]; - value rec ctAnd_of_list = - fun - [ [] -> Ast.CtNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_class_type x - in Ast.CtAnd _loc x (ctAnd_of_list xs) ]; - value rec cgSem_of_list = - fun - [ [] -> Ast.CgNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_class_sig_item x - in Ast.CgSem _loc x (cgSem_of_list xs) ]; - value rec crSem_of_list = - fun - [ [] -> Ast.CrNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_class_str_item x - in Ast.CrSem _loc x (crSem_of_list xs) ]; - value rec paSem_of_list = - fun - [ [] -> Ast.PaNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_patt x in Ast.PaSem _loc x (paSem_of_list xs) ]; - value rec paCom_of_list = - fun - [ [] -> Ast.PaNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_patt x in Ast.PaCom _loc x (paCom_of_list xs) ]; - value rec exSem_of_list = - fun - [ [] -> Ast.ExNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_expr x in Ast.ExSem _loc x (exSem_of_list xs) ]; - value rec exCom_of_list = - fun - [ [] -> Ast.ExNil ghost - | [ x ] -> x - | [ x :: xs ] -> - let _loc = loc_of_expr x in Ast.ExCom _loc x (exCom_of_list xs) ]; - value ty_of_stl = - fun - [ (_loc, s, []) -> Ast.TyId _loc (Ast.IdUid _loc s) - | (_loc, s, tl) -> - Ast.TyOf _loc (Ast.TyId _loc (Ast.IdUid _loc s)) (tyAnd_of_list tl) ]; - value ty_of_sbt = - fun - [ (_loc, s, True, t) -> - Ast.TyCol _loc (Ast.TyId _loc (Ast.IdLid _loc s)) - (Ast.TyMut _loc t) - | (_loc, s, False, t) -> - Ast.TyCol _loc (Ast.TyId _loc (Ast.IdLid _loc s)) t ]; - value bi_of_pe (p, e) = let _loc = loc_of_patt p in Ast.BiEq _loc p e; - value sum_type_of_list l = tyOr_of_list (List.map ty_of_stl l); - value record_type_of_list l = tySem_of_list (List.map ty_of_sbt l); - value binding_of_pel l = biAnd_of_list (List.map bi_of_pe l); - value rec pel_of_binding = - fun - [ Ast.BiAnd _ b1 b2 -> (pel_of_binding b1) @ (pel_of_binding b2) - | Ast.BiEq _ p e -> [ (p, e) ] - | _ -> assert False ]; - value rec list_of_binding x acc = - match x with - [ Ast.BiAnd _ b1 b2 -> list_of_binding b1 (list_of_binding b2 acc) - | t -> [ t :: acc ] ]; - value rec list_of_rec_binding x acc = - match x with - [ Ast.RbSem _ b1 b2 -> - list_of_rec_binding b1 (list_of_rec_binding b2 acc) - | t -> [ t :: acc ] ]; - value rec list_of_with_constr x acc = - match x with - [ Ast.WcAnd _ w1 w2 -> - list_of_with_constr w1 (list_of_with_constr w2 acc) - | t -> [ t :: acc ] ]; - value rec list_of_ctyp x acc = - match x with - [ Ast.TyNil _ -> acc - | Ast.TyAmp _ x y | Ast.TyCom _ x y | Ast.TySta _ x y | Ast.TySem _ x y - | Ast.TyAnd _ x y | Ast.TyOr _ x y -> - list_of_ctyp x (list_of_ctyp y acc) - | x -> [ x :: acc ] ]; - value rec list_of_patt x acc = - match x with - [ Ast.PaNil _ -> acc - | Ast.PaCom _ x y | Ast.PaSem _ x y -> - list_of_patt x (list_of_patt y acc) - | x -> [ x :: acc ] ]; - value rec list_of_expr x acc = - match x with - [ Ast.ExNil _ -> acc - | Ast.ExCom _ x y | Ast.ExSem _ x y -> - list_of_expr x (list_of_expr y acc) - | x -> [ x :: acc ] ]; - value rec list_of_str_item x acc = - match x with - [ Ast.StNil _ -> acc - | Ast.StSem _ x y -> list_of_str_item x (list_of_str_item y acc) - | x -> [ x :: acc ] ]; - value rec list_of_sig_item x acc = - match x with - [ Ast.SgNil _ -> acc - | Ast.SgSem _ x y -> list_of_sig_item x (list_of_sig_item y acc) - | x -> [ x :: acc ] ]; - value rec list_of_class_sig_item x acc = - match x with - [ Ast.CgNil _ -> acc - | Ast.CgSem _ x y -> - list_of_class_sig_item x (list_of_class_sig_item y acc) - | x -> [ x :: acc ] ]; - value rec list_of_class_str_item x acc = - match x with - [ Ast.CrNil _ -> acc - | Ast.CrSem _ x y -> - list_of_class_str_item x (list_of_class_str_item y acc) - | x -> [ x :: acc ] ]; - value rec list_of_class_type x acc = - match x with - [ Ast.CtAnd _ x y -> list_of_class_type x (list_of_class_type y acc) - | x -> [ x :: acc ] ]; - value rec list_of_class_expr x acc = - match x with - [ Ast.CeAnd _ x y -> list_of_class_expr x (list_of_class_expr y acc) - | x -> [ x :: acc ] ]; - value rec list_of_module_expr x acc = - match x with - [ Ast.MeApp _ x y -> list_of_module_expr x (list_of_module_expr y acc) - | x -> [ x :: acc ] ]; - value rec list_of_match_case x acc = - match x with - [ Ast.McNil _ -> acc - | Ast.McOr _ x y -> list_of_match_case x (list_of_match_case y acc) - | x -> [ x :: acc ] ]; - value rec list_of_ident x acc = - match x with - [ Ast.IdAcc _ x y | Ast.IdApp _ x y -> - list_of_ident x (list_of_ident y acc) - | x -> [ x :: acc ] ]; - value rec list_of_module_binding x acc = - match x with - [ Ast.MbAnd _ x y -> - list_of_module_binding x (list_of_module_binding y acc) - | x -> [ x :: acc ] ]; - module Meta = - struct - module type META_LOC = - sig - value meta_loc_patt : Loc.t -> Loc.t -> Ast.patt; - value meta_loc_expr : Loc.t -> Loc.t -> Ast.expr; - end; - module MetaLoc = - struct - value meta_loc_patt _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location - in - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Loc") - (Ast.IdLid _loc "of_tuple"))) - (Ast.PaTup _loc - (Ast.PaCom _loc - (Ast.PaStr _loc (Ast.safe_string_escaped a)) - (Ast.PaCom _loc - (Ast.PaCom _loc - (Ast.PaCom _loc - (Ast.PaCom _loc - (Ast.PaCom _loc - (Ast.PaCom _loc - (Ast.PaInt _loc (string_of_int b)) - (Ast.PaInt _loc (string_of_int c))) - (Ast.PaInt _loc (string_of_int d))) - (Ast.PaInt _loc (string_of_int e))) - (Ast.PaInt _loc (string_of_int f))) - (Ast.PaInt _loc (string_of_int g))) - (if h - then Ast.PaId _loc (Ast.IdUid _loc "True") - else Ast.PaId _loc (Ast.IdUid _loc "False"))))); - value meta_loc_expr _loc location = - let (a, b, c, d, e, f, g, h) = Loc.to_tuple location - in - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Loc") - (Ast.IdLid _loc "of_tuple"))) - (Ast.ExTup _loc - (Ast.ExCom _loc - (Ast.ExStr _loc (Ast.safe_string_escaped a)) - (Ast.ExCom _loc - (Ast.ExCom _loc - (Ast.ExCom _loc - (Ast.ExCom _loc - (Ast.ExCom _loc - (Ast.ExCom _loc - (Ast.ExInt _loc (string_of_int b)) - (Ast.ExInt _loc (string_of_int c))) - (Ast.ExInt _loc (string_of_int d))) - (Ast.ExInt _loc (string_of_int e))) - (Ast.ExInt _loc (string_of_int f))) - (Ast.ExInt _loc (string_of_int g))) - (if h - then Ast.ExId _loc (Ast.IdUid _loc "True") - else Ast.ExId _loc (Ast.IdUid _loc "False"))))); - end; - module MetaGhostLoc = - struct - value meta_loc_patt _loc _ = - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Loc") - (Ast.IdLid _loc "ghost")); - value meta_loc_expr _loc _ = - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Loc") - (Ast.IdLid _loc "ghost")); - end; - module MetaLocVar = - struct - value meta_loc_patt _loc _ = - Ast.PaId _loc (Ast.IdLid _loc Loc.name.val); - value meta_loc_expr _loc _ = - Ast.ExId _loc (Ast.IdLid _loc Loc.name.val); - end; - module Make (MetaLoc : META_LOC) = - struct - open MetaLoc; - value meta_loc = meta_loc_expr; - module Expr = - struct - value meta_string _loc s = - Ast.ExStr _loc (safe_string_escaped s); - value meta_int _loc s = Ast.ExInt _loc s; - value meta_float _loc s = Ast.ExFlo _loc s; - value meta_char _loc s = Ast.ExChr _loc (String.escaped s); - value meta_bool _loc = - fun - [ False -> Ast.ExId _loc (Ast.IdUid _loc "False") - | True -> Ast.ExId _loc (Ast.IdUid _loc "True") ]; - value rec meta_list mf_a _loc = - fun - [ [] -> Ast.ExId _loc (Ast.IdUid _loc "[]") - | [ x :: xs ] -> - Ast.ExApp _loc - (Ast.ExApp _loc (Ast.ExId _loc (Ast.IdUid _loc "::")) - (mf_a _loc x)) - (meta_list mf_a _loc xs) ]; - value rec meta_binding _loc = - fun - [ Ast.BiAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.BiEq x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiEq"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_expr _loc x2) - | Ast.BiAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiAnd"))) - (meta_loc _loc x0)) - (meta_binding _loc x1)) - (meta_binding _loc x2) - | Ast.BiNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiNil"))) - (meta_loc _loc x0) ] - and meta_class_expr _loc = - fun - [ Ast.CeAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.CeEq x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeEq"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeAnd"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeTyc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeTyc"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_type _loc x2) - | Ast.CeStr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeStr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_str_item _loc x2) - | Ast.CeLet x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeLet"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2)) - (meta_class_expr _loc x3) - | Ast.CeFun x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeFun"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeCon x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeCon"))) - (meta_loc _loc x0)) - (meta_virtual_flag _loc x1)) - (meta_ident _loc x2)) - (meta_ctyp _loc x3) - | Ast.CeApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeApp"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_expr _loc x2) - | Ast.CeNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeNil"))) - (meta_loc _loc x0) ] - and meta_class_sig_item _loc = - fun - [ Ast.CgAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.CgVir x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgVir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CgVal x0 x1 x2 x3 x4 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_mutable_flag _loc x2)) - (meta_virtual_flag _loc x3)) - (meta_ctyp _loc x4) - | Ast.CgMth x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgMth"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CgInh x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgInh"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.CgSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgSem"))) - (meta_loc _loc x0)) - (meta_class_sig_item _loc x1)) - (meta_class_sig_item _loc x2) - | Ast.CgCtr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgCtr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.CgNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgNil"))) - (meta_loc _loc x0) ] - and meta_class_str_item _loc = - fun - [ Ast.CrAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.CrVvr x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVvr"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_mutable_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CrVir x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CrVal x0 x1 x2 x3 x4 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_override_flag _loc x2)) - (meta_mutable_flag _loc x3)) - (meta_expr _loc x4) - | Ast.CrMth x0 x1 x2 x3 x4 x5 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc - (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrMth"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_override_flag _loc x2)) - (meta_private_flag _loc x3)) - (meta_expr _loc x4)) - (meta_ctyp _loc x5) - | Ast.CrIni x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrIni"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.CrInh x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrInh"))) - (meta_loc _loc x0)) - (meta_override_flag _loc x1)) - (meta_class_expr _loc x2)) - (meta_string _loc x3) - | Ast.CrCtr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrCtr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.CrSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrSem"))) - (meta_loc _loc x0)) - (meta_class_str_item _loc x1)) - (meta_class_str_item _loc x2) - | Ast.CrNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrNil"))) - (meta_loc _loc x0) ] - and meta_class_type _loc = - fun - [ Ast.CtAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.CtEq x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtEq"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtCol x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtCol"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtAnd"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtSig x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtSig"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_class_sig_item _loc x2) - | Ast.CtFun x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtFun"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_class_type _loc x2) - | Ast.CtCon x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtCon"))) - (meta_loc _loc x0)) - (meta_virtual_flag _loc x1)) - (meta_ident _loc x2)) - (meta_ctyp _loc x3) - | Ast.CtNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtNil"))) - (meta_loc _loc x0) ] - and meta_ctyp _loc = - fun - [ Ast.TyAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.TyPkg x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPkg"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1) - | Ast.TyOfAmp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOfAmp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAmp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAmp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyVrnInfSup x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnInfSup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyVrnInf x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnInf"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrnSup x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnSup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrnEq x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnEq"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TySta x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySta"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyTup x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyTup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyMut x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyMut"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyPrv x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPrv"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyOr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnd"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyOf x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOf"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TySum x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySum"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyCom x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCom"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TySem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySem"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyCol x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyRec x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyRec"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrn x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyAnM x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnM"))) - (meta_loc _loc x0) - | Ast.TyAnP x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnP"))) - (meta_loc _loc x0) - | Ast.TyQuM x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuM"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyQuP x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuP"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyQuo x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyTypePol x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyTypePol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyPol x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyOlb x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyObj x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyObj"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_row_var_flag _loc x2) - | Ast.TyDcl x0 x1 x2 x3 x4 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyDcl"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_list meta_ctyp _loc x2)) - (meta_ctyp _loc x3)) - (meta_list - (fun _loc (x1, x2) -> - Ast.ExTup _loc - (Ast.ExCom _loc (meta_ctyp _loc x1) - (meta_ctyp _loc x2))) - _loc x4) - | Ast.TyMan x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyMan"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyId x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.TyLab x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyCls x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCls"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.TyArr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyArr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyApp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAny x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAny"))) - (meta_loc _loc x0) - | Ast.TyAli x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAli"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyNil"))) - (meta_loc _loc x0) ] - and meta_direction_flag _loc = - fun - [ Ast.DiAnt x0 -> Ast.ExAnt _loc x0 - | Ast.DiDownto -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "DiDownto")) - | Ast.DiTo -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "DiTo")) ] - and meta_expr _loc = - fun - [ Ast.ExPkg x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExPkg"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.ExFUN x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFUN"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExOpI x0 x1 x2 -> - 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.ExWhi x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExWhi"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExVrn x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExTyc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTyc"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_ctyp _loc x2) - | Ast.ExCom x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExCom"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExTup x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTup"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExTry x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTry"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_match_case _loc x2) - | Ast.ExStr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExStr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExSte x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSte"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExSnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSnd"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_string _loc x2) - | Ast.ExSeq x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSeq"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExRec x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExRec"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1)) - (meta_expr _loc x2) - | Ast.ExOvr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOvr"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1) - | Ast.ExOlb x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExObj x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExObj"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_str_item _loc x2) - | Ast.ExNew x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNew"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.ExMat x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExMat"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_match_case _loc x2) - | Ast.ExLmd x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLmd"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_expr _loc x2)) - (meta_expr _loc x3) - | Ast.ExLet x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLet"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2)) - (meta_expr _loc x3) - | Ast.ExLaz x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLaz"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExLab x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExNativeInt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNativeInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt64 x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt64"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt32 x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt32"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExIfe x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExIfe"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3) - | Ast.ExFun x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFun"))) - (meta_loc _loc x0)) - (meta_match_case _loc x1) - | Ast.ExFor x0 x1 x2 x3 x4 x5 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc - (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFor"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3)) - (meta_direction_flag _loc x4)) - (meta_expr _loc x5) - | Ast.ExFlo x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFlo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExCoe x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExCoe"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_ctyp _loc x2)) - (meta_ctyp _loc x3) - | Ast.ExChr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExChr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExAss x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAss"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExAsr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAsr"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExAsf x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAsf"))) - (meta_loc _loc x0) - | Ast.ExSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSem"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExArr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExArr"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExAre x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAre"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExApp"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.ExAcc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAcc"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExId x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.ExNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNil"))) - (meta_loc _loc x0) ] - and meta_ident _loc = - fun - [ Ast.IdAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.IdUid x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdUid"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.IdLid x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdLid"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.IdApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdApp"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.IdAcc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdAcc"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) ] - and meta_match_case _loc = - fun - [ Ast.McAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.McArr x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McArr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3) - | Ast.McOr x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McOr"))) - (meta_loc _loc x0)) - (meta_match_case _loc x1)) - (meta_match_case _loc x2) - | Ast.McNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McNil"))) - (meta_loc _loc x0) ] - and meta_meta_bool _loc = - fun - [ Ast.BAnt x0 -> Ast.ExAnt _loc x0 - | Ast.BFalse -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BFalse")) - | Ast.BTrue -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BTrue")) ] - and meta_meta_list mf_a _loc = - fun - [ Ast.LAnt x0 -> Ast.ExAnt _loc x0 - | Ast.LCons x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "LCons"))) - (mf_a _loc x0)) - (meta_meta_list mf_a _loc x1) - | Ast.LNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "LNil")) ] - and meta_meta_option mf_a _loc = - fun - [ Ast.OAnt x0 -> Ast.ExAnt _loc x0 - | Ast.OSome x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OSome"))) - (mf_a _loc x0) - | Ast.ONone -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ONone")) ] - and meta_module_binding _loc = - fun - [ Ast.MbAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.MbCol x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbCol"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.MbColEq x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbColEq"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_expr _loc x3) - | Ast.MbAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbAnd"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1)) - (meta_module_binding _loc x2) - | Ast.MbNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbNil"))) - (meta_loc _loc x0) ] - and meta_module_expr _loc = - fun - [ Ast.MeAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.MePkg x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MePkg"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.MeTyc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeTyc"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1)) - (meta_module_type _loc x2) - | Ast.MeStr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeStr"))) - (meta_loc _loc x0)) - (meta_str_item _loc x1) - | Ast.MeFun x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeFun"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_expr _loc x3) - | Ast.MeApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeApp"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1)) - (meta_module_expr _loc x2) - | Ast.MeId x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.MeNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeNil"))) - (meta_loc _loc x0) ] - and meta_module_type _loc = - fun - [ Ast.MtAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.MtOf x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtOf"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.MtWit x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtWit"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1)) - (meta_with_constr _loc x2) - | Ast.MtSig x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtSig"))) - (meta_loc _loc x0)) - (meta_sig_item _loc x1) - | Ast.MtQuo x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtQuo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.MtFun x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtFun"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_type _loc x3) - | Ast.MtId x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.MtNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtNil"))) - (meta_loc _loc x0) ] - and meta_mutable_flag _loc = - fun - [ Ast.MuAnt x0 -> Ast.ExAnt _loc x0 - | Ast.MuNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MuNil")) - | Ast.MuMutable -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MuMutable")) ] - and meta_override_flag _loc = - fun - [ Ast.OvAnt x0 -> Ast.ExAnt _loc x0 - | Ast.OvNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OvNil")) - | Ast.OvOverride -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OvOverride")) ] - and meta_patt _loc = - fun - [ Ast.PaMod x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaLaz x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaLaz"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaVrn x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaTyp x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTyp"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.PaTyc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTyc"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_ctyp _loc x2) - | Ast.PaTup x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTup"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaStr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaStr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaEq x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaEq"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_patt _loc x2) - | Ast.PaRec x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaRec"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaRng x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaRng"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaOrp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOrp"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaOlbi x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOlbi"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2)) - (meta_expr _loc x3) - | Ast.PaOlb x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2) - | Ast.PaLab x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2) - | Ast.PaFlo x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaFlo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaNativeInt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaNativeInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt64 x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt64"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt32 x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt32"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaChr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaChr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaSem"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaCom x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaCom"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaArr x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaArr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaApp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaApp"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaAny x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaAny"))) - (meta_loc _loc x0) - | Ast.PaAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.PaAli x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaAli"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaId x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.PaNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaNil"))) - (meta_loc _loc x0) ] - and meta_private_flag _loc = - fun - [ Ast.PrAnt x0 -> Ast.ExAnt _loc x0 - | Ast.PrNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PrNil")) - | Ast.PrPrivate -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PrPrivate")) ] - and meta_rec_binding _loc = - fun - [ Ast.RbAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.RbEq x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbEq"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_expr _loc x2) - | Ast.RbSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbSem"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1)) - (meta_rec_binding _loc x2) - | Ast.RbNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbNil"))) - (meta_loc _loc x0) ] - and meta_rec_flag _loc = - fun - [ Ast.ReAnt x0 -> Ast.ExAnt _loc x0 - | Ast.ReNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ReNil")) - | Ast.ReRecursive -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ReRecursive")) ] - and meta_row_var_flag _loc = - fun - [ Ast.RvAnt x0 -> Ast.ExAnt _loc x0 - | Ast.RvNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RvNil")) - | Ast.RvRowVar -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RvRowVar")) ] - and meta_sig_item _loc = - fun - [ Ast.SgAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.SgVal x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.SgTyp x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.SgOpn x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgOpn"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.SgMty x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgMty"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.SgRecMod x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgRecMod"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1) - | Ast.SgMod x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.SgInc x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgInc"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1) - | Ast.SgExt x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgExt"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2)) - (meta_meta_list meta_string _loc x3) - | Ast.SgExc x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgExc"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.SgDir x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgDir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.SgSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgSem"))) - (meta_loc _loc x0)) - (meta_sig_item _loc x1)) - (meta_sig_item _loc x2) - | Ast.SgClt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgClt"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.SgCls x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgCls"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.SgNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgNil"))) - (meta_loc _loc x0) ] - and meta_str_item _loc = - fun - [ Ast.StAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.StVal x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StVal"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2) - | Ast.StTyp x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.StOpn x0 x1 -> - 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.StMty x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StMty"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.StRecMod x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StRecMod"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1) - | Ast.StMod x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_expr _loc x2) - | Ast.StInc x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StInc"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.StExt x0 x1 x2 x3 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExt"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2)) - (meta_meta_list meta_string _loc x3) - | Ast.StExp x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExp"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.StExc x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExc"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_meta_option meta_ident _loc x2) - | Ast.StDir x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StDir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.StSem x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StSem"))) - (meta_loc _loc x0)) - (meta_str_item _loc x1)) - (meta_str_item _loc x2) - | Ast.StClt x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StClt"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.StCls x0 x1 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StCls"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1) - | Ast.StNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StNil"))) - (meta_loc _loc x0) ] - and meta_virtual_flag _loc = - fun - [ Ast.ViAnt x0 -> Ast.ExAnt _loc x0 - | Ast.ViNil -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ViNil")) - | Ast.ViVirtual -> - Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ViVirtual")) ] - and meta_with_constr _loc = - fun - [ Ast.WcAnt x0 x1 -> Ast.ExAnt x0 x1 - | Ast.WcAnd x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcAnd"))) - (meta_loc _loc x0)) - (meta_with_constr _loc x1)) - (meta_with_constr _loc x2) - | Ast.WcMoS x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcMoS"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.WcTyS x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcTyS"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.WcMod x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcMod"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.WcTyp x0 x1 x2 -> - Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.WcNil x0 -> - Ast.ExApp _loc - (Ast.ExId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcNil"))) - (meta_loc _loc x0) ]; - end; - value meta_loc = meta_loc_patt; - module Patt = - struct - value meta_string _loc s = - Ast.PaStr _loc (safe_string_escaped s); - value meta_int _loc s = Ast.PaInt _loc s; - value meta_float _loc s = Ast.PaFlo _loc s; - value meta_char _loc s = Ast.PaChr _loc (String.escaped s); - value meta_bool _loc = - fun - [ False -> Ast.PaId _loc (Ast.IdUid _loc "False") - | True -> Ast.PaId _loc (Ast.IdUid _loc "True") ]; - value rec meta_list mf_a _loc = - fun - [ [] -> Ast.PaId _loc (Ast.IdUid _loc "[]") - | [ x :: xs ] -> - Ast.PaApp _loc - (Ast.PaApp _loc (Ast.PaId _loc (Ast.IdUid _loc "::")) - (mf_a _loc x)) - (meta_list mf_a _loc xs) ]; - value rec meta_binding _loc = - fun - [ Ast.BiAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.BiEq x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiEq"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_expr _loc x2) - | Ast.BiAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiAnd"))) - (meta_loc _loc x0)) - (meta_binding _loc x1)) - (meta_binding _loc x2) - | Ast.BiNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BiNil"))) - (meta_loc _loc x0) ] - and meta_class_expr _loc = - fun - [ Ast.CeAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.CeEq x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeEq"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeAnd"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeTyc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeTyc"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_class_type _loc x2) - | Ast.CeStr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeStr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_str_item _loc x2) - | Ast.CeLet x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeLet"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2)) - (meta_class_expr _loc x3) - | Ast.CeFun x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeFun"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_expr _loc x2) - | Ast.CeCon x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeCon"))) - (meta_loc _loc x0)) - (meta_virtual_flag _loc x1)) - (meta_ident _loc x2)) - (meta_ctyp _loc x3) - | Ast.CeApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeApp"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1)) - (meta_expr _loc x2) - | Ast.CeNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CeNil"))) - (meta_loc _loc x0) ] - and meta_class_sig_item _loc = - fun - [ Ast.CgAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.CgVir x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgVir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CgVal x0 x1 x2 x3 x4 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_mutable_flag _loc x2)) - (meta_virtual_flag _loc x3)) - (meta_ctyp _loc x4) - | Ast.CgMth x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgMth"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CgInh x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgInh"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.CgSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgSem"))) - (meta_loc _loc x0)) - (meta_class_sig_item _loc x1)) - (meta_class_sig_item _loc x2) - | Ast.CgCtr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgCtr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.CgNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CgNil"))) - (meta_loc _loc x0) ] - and meta_class_str_item _loc = - fun - [ Ast.CrAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.CrVvr x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVvr"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_mutable_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CrVir x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_private_flag _loc x2)) - (meta_ctyp _loc x3) - | Ast.CrVal x0 x1 x2 x3 x4 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_override_flag _loc x2)) - (meta_mutable_flag _loc x3)) - (meta_expr _loc x4) - | Ast.CrMth x0 x1 x2 x3 x4 x5 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc - (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrMth"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_override_flag _loc x2)) - (meta_private_flag _loc x3)) - (meta_expr _loc x4)) - (meta_ctyp _loc x5) - | Ast.CrIni x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrIni"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.CrInh x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrInh"))) - (meta_loc _loc x0)) - (meta_override_flag _loc x1)) - (meta_class_expr _loc x2)) - (meta_string _loc x3) - | Ast.CrCtr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrCtr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.CrSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrSem"))) - (meta_loc _loc x0)) - (meta_class_str_item _loc x1)) - (meta_class_str_item _loc x2) - | Ast.CrNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CrNil"))) - (meta_loc _loc x0) ] - and meta_class_type _loc = - fun - [ Ast.CtAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.CtEq x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtEq"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtCol x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtCol"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtAnd"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1)) - (meta_class_type _loc x2) - | Ast.CtSig x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtSig"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_class_sig_item _loc x2) - | Ast.CtFun x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtFun"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_class_type _loc x2) - | Ast.CtCon x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtCon"))) - (meta_loc _loc x0)) - (meta_virtual_flag _loc x1)) - (meta_ident _loc x2)) - (meta_ctyp _loc x3) - | Ast.CtNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "CtNil"))) - (meta_loc _loc x0) ] - and meta_ctyp _loc = - fun - [ Ast.TyAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.TyPkg x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPkg"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1) - | Ast.TyOfAmp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOfAmp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAmp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAmp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyVrnInfSup x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnInfSup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyVrnInf x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnInf"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrnSup x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnSup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrnEq x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrnEq"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TySta x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySta"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyTup x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyTup"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyMut x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyMut"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyPrv x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPrv"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyOr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnd"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyOf x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOf"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TySum x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySum"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyCom x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCom"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TySem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TySem"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyCol x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyRec x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyRec"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.TyVrn x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyAnM x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnM"))) - (meta_loc _loc x0) - | Ast.TyAnP x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAnP"))) - (meta_loc _loc x0) - | Ast.TyQuM x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuM"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyQuP x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuP"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyQuo x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyQuo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.TyTypePol x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyTypePol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyPol x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyPol"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyOlb x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyObj x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyObj"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_row_var_flag _loc x2) - | Ast.TyDcl x0 x1 x2 x3 x4 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyDcl"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_list meta_ctyp _loc x2)) - (meta_ctyp _loc x3)) - (meta_list - (fun _loc (x1, x2) -> - Ast.PaTup _loc - (Ast.PaCom _loc (meta_ctyp _loc x1) - (meta_ctyp _loc x2))) - _loc x4) - | Ast.TyMan x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyMan"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyId x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.TyLab x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyCls x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyCls"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.TyArr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyArr"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyApp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyAny x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAny"))) - (meta_loc _loc x0) - | Ast.TyAli x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyAli"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.TyNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "TyNil"))) - (meta_loc _loc x0) ] - and meta_direction_flag _loc = - fun - [ Ast.DiAnt x0 -> Ast.PaAnt _loc x0 - | Ast.DiDownto -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "DiDownto")) - | Ast.DiTo -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "DiTo")) ] - and meta_expr _loc = - fun - [ Ast.ExPkg x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExPkg"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.ExFUN x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFUN"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExOpI x0 x1 x2 -> - 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.ExWhi x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExWhi"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExVrn x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExTyc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTyc"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_ctyp _loc x2) - | Ast.ExCom x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExCom"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExTup x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTup"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExTry x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExTry"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_match_case _loc x2) - | Ast.ExStr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExStr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExSte x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSte"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExSnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSnd"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_string _loc x2) - | Ast.ExSeq x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSeq"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExRec x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExRec"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1)) - (meta_expr _loc x2) - | Ast.ExOvr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOvr"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1) - | Ast.ExOlb x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExObj x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExObj"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_class_str_item _loc x2) - | Ast.ExNew x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNew"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.ExMat x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExMat"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_match_case _loc x2) - | Ast.ExLmd x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLmd"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_expr _loc x2)) - (meta_expr _loc x3) - | Ast.ExLet x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLet"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2)) - (meta_expr _loc x3) - | Ast.ExLaz x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLaz"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExLab x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.ExNativeInt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNativeInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt64 x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt64"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt32 x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt32"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExInt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExIfe x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExIfe"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3) - | Ast.ExFun x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFun"))) - (meta_loc _loc x0)) - (meta_match_case _loc x1) - | Ast.ExFor x0 x1 x2 x3 x4 x5 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc - (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFor"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3)) - (meta_direction_flag _loc x4)) - (meta_expr _loc x5) - | Ast.ExFlo x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExFlo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExCoe x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExCoe"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_ctyp _loc x2)) - (meta_ctyp _loc x3) - | Ast.ExChr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExChr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.ExAss x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAss"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExAsr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAsr"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExAsf x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAsf"))) - (meta_loc _loc x0) - | Ast.ExSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExSem"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExArr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExArr"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.ExAre x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAre"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExApp"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.ExAcc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExAcc"))) - (meta_loc _loc x0)) - (meta_expr _loc x1)) - (meta_expr _loc x2) - | Ast.ExId x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.ExNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ExNil"))) - (meta_loc _loc x0) ] - and meta_ident _loc = - fun - [ Ast.IdAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.IdUid x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdUid"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.IdLid x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdLid"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.IdApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdApp"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.IdAcc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "IdAcc"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) ] - and meta_match_case _loc = - fun - [ Ast.McAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.McArr x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McArr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_expr _loc x2)) - (meta_expr _loc x3) - | Ast.McOr x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McOr"))) - (meta_loc _loc x0)) - (meta_match_case _loc x1)) - (meta_match_case _loc x2) - | Ast.McNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "McNil"))) - (meta_loc _loc x0) ] - and meta_meta_bool _loc = - fun - [ Ast.BAnt x0 -> Ast.PaAnt _loc x0 - | Ast.BFalse -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BFalse")) - | Ast.BTrue -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "BTrue")) ] - and meta_meta_list mf_a _loc = - fun - [ Ast.LAnt x0 -> Ast.PaAnt _loc x0 - | Ast.LCons x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "LCons"))) - (mf_a _loc x0)) - (meta_meta_list mf_a _loc x1) - | Ast.LNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "LNil")) ] - and meta_meta_option mf_a _loc = - fun - [ Ast.OAnt x0 -> Ast.PaAnt _loc x0 - | Ast.OSome x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OSome"))) - (mf_a _loc x0) - | Ast.ONone -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ONone")) ] - and meta_module_binding _loc = - fun - [ Ast.MbAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.MbCol x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbCol"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.MbColEq x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbColEq"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_expr _loc x3) - | Ast.MbAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbAnd"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1)) - (meta_module_binding _loc x2) - | Ast.MbNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MbNil"))) - (meta_loc _loc x0) ] - and meta_module_expr _loc = - fun - [ Ast.MeAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.MePkg x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MePkg"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.MeTyc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeTyc"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1)) - (meta_module_type _loc x2) - | Ast.MeStr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeStr"))) - (meta_loc _loc x0)) - (meta_str_item _loc x1) - | Ast.MeFun x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeFun"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_expr _loc x3) - | Ast.MeApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeApp"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1)) - (meta_module_expr _loc x2) - | Ast.MeId x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.MeNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MeNil"))) - (meta_loc _loc x0) ] - and meta_module_type _loc = - fun - [ Ast.MtAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.MtOf x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtOf"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.MtWit x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtWit"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1)) - (meta_with_constr _loc x2) - | Ast.MtSig x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtSig"))) - (meta_loc _loc x0)) - (meta_sig_item _loc x1) - | Ast.MtQuo x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtQuo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.MtFun x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtFun"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2)) - (meta_module_type _loc x3) - | Ast.MtId x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.MtNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MtNil"))) - (meta_loc _loc x0) ] - and meta_mutable_flag _loc = - fun - [ Ast.MuAnt x0 -> Ast.PaAnt _loc x0 - | Ast.MuNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MuNil")) - | Ast.MuMutable -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "MuMutable")) ] - and meta_override_flag _loc = - fun - [ Ast.OvAnt x0 -> Ast.PaAnt _loc x0 - | Ast.OvNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OvNil")) - | Ast.OvOverride -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "OvOverride")) ] - and meta_patt _loc = - fun - [ Ast.PaMod x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaLaz x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaLaz"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaVrn x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaVrn"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaTyp x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTyp"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.PaTyc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTyc"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_ctyp _loc x2) - | Ast.PaTup x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaTup"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaStr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaStr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaEq x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaEq"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_patt _loc x2) - | Ast.PaRec x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaRec"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaRng x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaRng"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaOrp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOrp"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaOlbi x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOlbi"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2)) - (meta_expr _loc x3) - | Ast.PaOlb x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaOlb"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2) - | Ast.PaLab x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaLab"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_patt _loc x2) - | Ast.PaFlo x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaFlo"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaNativeInt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaNativeInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt64 x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt64"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt32 x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt32"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaInt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaInt"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaChr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaChr"))) - (meta_loc _loc x0)) - (meta_string _loc x1) - | Ast.PaSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaSem"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaCom x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaCom"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaArr x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaArr"))) - (meta_loc _loc x0)) - (meta_patt _loc x1) - | Ast.PaApp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaApp"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaAny x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaAny"))) - (meta_loc _loc x0) - | Ast.PaAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.PaAli x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaAli"))) - (meta_loc _loc x0)) - (meta_patt _loc x1)) - (meta_patt _loc x2) - | Ast.PaId x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaId"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.PaNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PaNil"))) - (meta_loc _loc x0) ] - and meta_private_flag _loc = - fun - [ Ast.PrAnt x0 -> Ast.PaAnt _loc x0 - | Ast.PrNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PrNil")) - | Ast.PrPrivate -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "PrPrivate")) ] - and meta_rec_binding _loc = - fun - [ Ast.RbAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.RbEq x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbEq"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_expr _loc x2) - | Ast.RbSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbSem"))) - (meta_loc _loc x0)) - (meta_rec_binding _loc x1)) - (meta_rec_binding _loc x2) - | Ast.RbNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RbNil"))) - (meta_loc _loc x0) ] - and meta_rec_flag _loc = - fun - [ Ast.ReAnt x0 -> Ast.PaAnt _loc x0 - | Ast.ReNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ReNil")) - | Ast.ReRecursive -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ReRecursive")) ] - and meta_row_var_flag _loc = - fun - [ Ast.RvAnt x0 -> Ast.PaAnt _loc x0 - | Ast.RvNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RvNil")) - | Ast.RvRowVar -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "RvRowVar")) ] - and meta_sig_item _loc = - fun - [ Ast.SgAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.SgVal x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgVal"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2) - | Ast.SgTyp x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.SgOpn x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgOpn"))) - (meta_loc _loc x0)) - (meta_ident _loc x1) - | Ast.SgMty x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgMty"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.SgRecMod x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgRecMod"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1) - | Ast.SgMod x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.SgInc x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgInc"))) - (meta_loc _loc x0)) - (meta_module_type _loc x1) - | Ast.SgExt x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgExt"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2)) - (meta_meta_list meta_string _loc x3) - | Ast.SgExc x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgExc"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.SgDir x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgDir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.SgSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgSem"))) - (meta_loc _loc x0)) - (meta_sig_item _loc x1)) - (meta_sig_item _loc x2) - | Ast.SgClt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgClt"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.SgCls x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgCls"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.SgNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "SgNil"))) - (meta_loc _loc x0) ] - and meta_str_item _loc = - fun - [ Ast.StAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.StVal x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StVal"))) - (meta_loc _loc x0)) - (meta_rec_flag _loc x1)) - (meta_binding _loc x2) - | Ast.StTyp x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1) - | Ast.StOpn x0 x1 -> - 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.StMty x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StMty"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_type _loc x2) - | Ast.StRecMod x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StRecMod"))) - (meta_loc _loc x0)) - (meta_module_binding _loc x1) - | Ast.StMod x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StMod"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_module_expr _loc x2) - | Ast.StInc x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StInc"))) - (meta_loc _loc x0)) - (meta_module_expr _loc x1) - | Ast.StExt x0 x1 x2 x3 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExt"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_ctyp _loc x2)) - (meta_meta_list meta_string _loc x3) - | Ast.StExp x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExp"))) - (meta_loc _loc x0)) - (meta_expr _loc x1) - | Ast.StExc x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StExc"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_meta_option meta_ident _loc x2) - | Ast.StDir x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StDir"))) - (meta_loc _loc x0)) - (meta_string _loc x1)) - (meta_expr _loc x2) - | Ast.StSem x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StSem"))) - (meta_loc _loc x0)) - (meta_str_item _loc x1)) - (meta_str_item _loc x2) - | Ast.StClt x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StClt"))) - (meta_loc _loc x0)) - (meta_class_type _loc x1) - | Ast.StCls x0 x1 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StCls"))) - (meta_loc _loc x0)) - (meta_class_expr _loc x1) - | Ast.StNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "StNil"))) - (meta_loc _loc x0) ] - and meta_virtual_flag _loc = - fun - [ Ast.ViAnt x0 -> Ast.PaAnt _loc x0 - | Ast.ViNil -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ViNil")) - | Ast.ViVirtual -> - Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "ViVirtual")) ] - and meta_with_constr _loc = - fun - [ Ast.WcAnt x0 x1 -> Ast.PaAnt x0 x1 - | Ast.WcAnd x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcAnd"))) - (meta_loc _loc x0)) - (meta_with_constr _loc x1)) - (meta_with_constr _loc x2) - | Ast.WcMoS x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcMoS"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.WcTyS x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcTyS"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.WcMod x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcMod"))) - (meta_loc _loc x0)) - (meta_ident _loc x1)) - (meta_ident _loc x2) - | Ast.WcTyp x0 x1 x2 -> - Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcTyp"))) - (meta_loc _loc x0)) - (meta_ctyp _loc x1)) - (meta_ctyp _loc x2) - | Ast.WcNil x0 -> - Ast.PaApp _loc - (Ast.PaId _loc - (Ast.IdAcc _loc (Ast.IdUid _loc "Ast") - (Ast.IdUid _loc "WcNil"))) - (meta_loc _loc x0) ]; - end; - end; - end; - class map = - object ((o : 'self_type)) - method string : string -> string = o#unknown; - method list : - ! 'a 'a_out. ('self_type -> 'a -> 'a_out) -> list 'a -> list 'a_out = - fun _f_a -> - fun - [ [] -> [] - | [ _x :: _x_i1 ] -> - let _x = _f_a o _x in - let _x_i1 = o#list _f_a _x_i1 in [ _x :: _x_i1 ] ]; - method with_constr : with_constr -> with_constr = - fun - [ WcNil _x -> let _x = o#loc _x in WcNil _x - | WcTyp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in WcTyp _x _x_i1 _x_i2 - | WcMod _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in WcMod _x _x_i1 _x_i2 - | WcTyS _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in WcTyS _x _x_i1 _x_i2 - | WcMoS _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in WcMoS _x _x_i1 _x_i2 - | WcAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#with_constr _x_i1 in - let _x_i2 = o#with_constr _x_i2 in WcAnd _x _x_i1 _x_i2 - | WcAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in WcAnt _x _x_i1 ]; - method virtual_flag : virtual_flag -> virtual_flag = - fun - [ ViVirtual -> ViVirtual - | ViNil -> ViNil - | ViAnt _x -> let _x = o#string _x in ViAnt _x ]; - method str_item : str_item -> str_item = - fun - [ StNil _x -> let _x = o#loc _x in StNil _x - | StCls _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in StCls _x _x_i1 - | StClt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in StClt _x _x_i1 - | StSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#str_item _x_i1 in - let _x_i2 = o#str_item _x_i2 in StSem _x _x_i1 _x_i2 - | StDir _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in StDir _x _x_i1 _x_i2 - | StExc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#meta_option (fun o -> o#ident) _x_i2 - in StExc _x _x_i1 _x_i2 - | StExp _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in StExp _x _x_i1 - | StExt _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#meta_list (fun o -> o#string) _x_i3 - in StExt _x _x_i1 _x_i2 _x_i3 - | StInc _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in StInc _x _x_i1 - | StMod _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_expr _x_i2 in StMod _x _x_i1 _x_i2 - | StRecMod _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 in StRecMod _x _x_i1 - | StMty _x _x_i1 _x_i2 -> - 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 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in StOpn _x _x_i1 - | 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 -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in StVal _x _x_i1 _x_i2 - | StAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in StAnt _x _x_i1 ]; - method sig_item : sig_item -> sig_item = - fun - [ SgNil _x -> let _x = o#loc _x in SgNil _x - | SgCls _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in SgCls _x _x_i1 - | SgClt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in SgClt _x _x_i1 - | SgSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#sig_item _x_i1 in - let _x_i2 = o#sig_item _x_i2 in SgSem _x _x_i1 _x_i2 - | SgDir _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in SgDir _x _x_i1 _x_i2 - | SgExc _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in SgExc _x _x_i1 - | SgExt _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#meta_list (fun o -> o#string) _x_i3 - in SgExt _x _x_i1 _x_i2 _x_i3 - | SgInc _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in SgInc _x _x_i1 - | SgMod _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in SgMod _x _x_i1 _x_i2 - | SgRecMod _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 in SgRecMod _x _x_i1 - | SgMty _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in SgMty _x _x_i1 _x_i2 - | SgOpn _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in SgOpn _x _x_i1 - | SgTyp _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in SgTyp _x _x_i1 - | SgVal _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in SgVal _x _x_i1 _x_i2 - | SgAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in SgAnt _x _x_i1 ]; - method row_var_flag : row_var_flag -> row_var_flag = - fun - [ RvRowVar -> RvRowVar - | RvNil -> RvNil - | RvAnt _x -> let _x = o#string _x in RvAnt _x ]; - method rec_flag : rec_flag -> rec_flag = - fun - [ ReRecursive -> ReRecursive - | ReNil -> ReNil - | ReAnt _x -> let _x = o#string _x in ReAnt _x ]; - method rec_binding : rec_binding -> rec_binding = - fun - [ RbNil _x -> let _x = o#loc _x in RbNil _x - | RbSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in - let _x_i2 = o#rec_binding _x_i2 in RbSem _x _x_i1 _x_i2 - | RbEq _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#expr _x_i2 in RbEq _x _x_i1 _x_i2 - | RbAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in RbAnt _x _x_i1 ]; - method private_flag : private_flag -> private_flag = - fun - [ PrPrivate -> PrPrivate - | PrNil -> PrNil - | PrAnt _x -> let _x = o#string _x in PrAnt _x ]; - method patt : patt -> patt = - fun - [ PaNil _x -> let _x = o#loc _x in PaNil _x - | PaId _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in PaId _x _x_i1 - | PaAli _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaAli _x _x_i1 _x_i2 - | PaAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaAnt _x _x_i1 - | PaAny _x -> let _x = o#loc _x in PaAny _x - | PaApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaApp _x _x_i1 _x_i2 - | PaArr _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#patt _x_i1 in PaArr _x _x_i1 - | PaCom _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaCom _x _x_i1 _x_i2 - | PaSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaSem _x _x_i1 _x_i2 - | PaChr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaChr _x _x_i1 - | PaInt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt _x _x_i1 - | PaInt32 _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt32 _x _x_i1 - | PaInt64 _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaInt64 _x _x_i1 - | PaNativeInt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaNativeInt _x _x_i1 - | PaFlo _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaFlo _x _x_i1 - | PaLab _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in PaLab _x _x_i1 _x_i2 - | PaOlb _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in PaOlb _x _x_i1 _x_i2 - | PaOlbi _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#patt _x_i2 in - let _x_i3 = o#expr _x_i3 in PaOlbi _x _x_i1 _x_i2 _x_i3 - | PaOrp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaOrp _x _x_i1 _x_i2 - | PaRng _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#patt _x_i2 in PaRng _x _x_i1 _x_i2 - | PaRec _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#patt _x_i1 in PaRec _x _x_i1 - | PaEq _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#patt _x_i2 in PaEq _x _x_i1 _x_i2 - | PaStr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaStr _x _x_i1 - | PaTup _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#patt _x_i1 in PaTup _x _x_i1 - | PaTyc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#ctyp _x_i2 in PaTyc _x _x_i1 _x_i2 - | PaTyp _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in PaTyp _x _x_i1 - | PaVrn _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaVrn _x _x_i1 - | PaLaz _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#patt _x_i1 in PaLaz _x _x_i1 - | PaMod _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in PaMod _x _x_i1 ]; - method override_flag : override_flag -> override_flag = - fun - [ OvOverride -> OvOverride - | OvNil -> OvNil - | OvAnt _x -> let _x = o#string _x in OvAnt _x ]; - method mutable_flag : mutable_flag -> mutable_flag = - fun - [ MuMutable -> MuMutable - | MuNil -> MuNil - | MuAnt _x -> let _x = o#string _x in MuAnt _x ]; - method module_type : module_type -> module_type = - fun - [ MtNil _x -> let _x = o#loc _x in MtNil _x - | MtId _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in MtId _x _x_i1 - | MtFun _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_type _x_i3 in MtFun _x _x_i1 _x_i2 _x_i3 - | MtQuo _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MtQuo _x _x_i1 - | MtSig _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#sig_item _x_i1 in MtSig _x _x_i1 - | MtWit _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in - let _x_i2 = o#with_constr _x_i2 in MtWit _x _x_i1 _x_i2 - | MtOf _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in MtOf _x _x_i1 - | MtAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MtAnt _x _x_i1 ]; - method module_expr : module_expr -> module_expr = - fun - [ MeNil _x -> let _x = o#loc _x in MeNil _x - | MeId _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in MeId _x _x_i1 - | MeApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in - let _x_i2 = o#module_expr _x_i2 in MeApp _x _x_i1 _x_i2 - | MeFun _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_expr _x_i3 in MeFun _x _x_i1 _x_i2 _x_i3 - | MeStr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#str_item _x_i1 in MeStr _x _x_i1 - | MeTyc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in - let _x_i2 = o#module_type _x_i2 in MeTyc _x _x_i1 _x_i2 - | MePkg _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in MePkg _x _x_i1 - | MeAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MeAnt _x _x_i1 ]; - method module_binding : module_binding -> module_binding = - fun - [ MbNil _x -> let _x = o#loc _x in MbNil _x - | MbAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#module_binding _x_i1 in - let _x_i2 = o#module_binding _x_i2 in MbAnd _x _x_i1 _x_i2 - | MbColEq _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in - let _x_i3 = o#module_expr _x_i3 in MbColEq _x _x_i1 _x_i2 _x_i3 - | MbCol _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_type _x_i2 in MbCol _x _x_i1 _x_i2 - | MbAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in MbAnt _x _x_i1 ]; - method meta_option : - ! (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2007 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Note: when you modify these types you must increment - ast magic numbers defined in Camlp4_config.ml. *) - 'a 'a_out. - ('self_type -> 'a -> 'a_out) -> - meta_option 'a -> meta_option 'a_out = - fun _f_a -> - fun - [ ONone -> ONone - | OSome _x -> let _x = _f_a o _x in OSome _x - | OAnt _x -> let _x = o#string _x in OAnt _x ]; - method meta_list : - ! 'a 'a_out. - ('self_type -> 'a -> 'a_out) -> meta_list 'a -> meta_list 'a_out = - fun _f_a -> - fun - [ LNil -> LNil - | LCons _x _x_i1 -> - let _x = _f_a o _x in - let _x_i1 = o#meta_list _f_a _x_i1 in LCons _x _x_i1 - | LAnt _x -> let _x = o#string _x in LAnt _x ]; - method meta_bool : meta_bool -> meta_bool = - fun - [ BTrue -> BTrue - | BFalse -> BFalse - | BAnt _x -> let _x = o#string _x in BAnt _x ]; - method match_case : match_case -> match_case = - fun - [ McNil _x -> let _x = o#loc _x in McNil _x - | McOr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#match_case _x_i1 in - let _x_i2 = o#match_case _x_i2 in McOr _x _x_i1 _x_i2 - | McArr _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 in McArr _x _x_i1 _x_i2 _x_i3 - | McAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in McAnt _x _x_i1 ]; - method loc : loc -> loc = o#unknown; - method ident : ident -> ident = - fun - [ IdAcc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in IdAcc _x _x_i1 _x_i2 - | IdApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in - let _x_i2 = o#ident _x_i2 in IdApp _x _x_i1 _x_i2 - | IdLid _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdLid _x _x_i1 - | IdUid _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdUid _x _x_i1 - | IdAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in IdAnt _x _x_i1 ]; - method expr : expr -> expr = - fun - [ ExNil _x -> let _x = o#loc _x in ExNil _x - | ExId _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in ExId _x _x_i1 - | ExAcc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAcc _x _x_i1 _x_i2 - | ExAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExAnt _x _x_i1 - | ExApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExApp _x _x_i1 _x_i2 - | ExAre _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAre _x _x_i1 _x_i2 - | ExArr _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in ExArr _x _x_i1 - | ExSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExSem _x _x_i1 _x_i2 - | ExAsf _x -> let _x = o#loc _x in ExAsf _x - | ExAsr _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in ExAsr _x _x_i1 - | ExAss _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExAss _x _x_i1 _x_i2 - | ExChr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExChr _x _x_i1 - | ExCoe _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#ctyp _x_i2 in - let _x_i3 = o#ctyp _x_i3 in ExCoe _x _x_i1 _x_i2 _x_i3 - | ExFlo _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExFlo _x _x_i1 - | ExFor _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 in - let _x_i4 = o#direction_flag _x_i4 in - let _x_i5 = o#expr _x_i5 - in ExFor _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 - | ExFun _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#match_case _x_i1 in ExFun _x _x_i1 - | ExIfe _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in - let _x_i3 = o#expr _x_i3 in ExIfe _x _x_i1 _x_i2 _x_i3 - | ExInt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt _x _x_i1 - | ExInt32 _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt32 _x _x_i1 - | ExInt64 _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExInt64 _x _x_i1 - | ExNativeInt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExNativeInt _x _x_i1 - | ExLab _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExLab _x _x_i1 _x_i2 - | ExLaz _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in ExLaz _x _x_i1 - | ExLet _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in - let _x_i3 = o#expr _x_i3 in ExLet _x _x_i1 _x_i2 _x_i3 - | ExLmd _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#module_expr _x_i2 in - let _x_i3 = o#expr _x_i3 in ExLmd _x _x_i1 _x_i2 _x_i3 - | ExMat _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#match_case _x_i2 in ExMat _x _x_i1 _x_i2 - | ExNew _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in ExNew _x _x_i1 - | ExObj _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_str_item _x_i2 in ExObj _x _x_i1 _x_i2 - | ExOlb _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExOlb _x _x_i1 _x_i2 - | ExOvr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in ExOvr _x _x_i1 - | ExRec _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#rec_binding _x_i1 in - let _x_i2 = o#expr _x_i2 in ExRec _x _x_i1 _x_i2 - | ExSeq _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in ExSeq _x _x_i1 - | ExSnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#string _x_i2 in ExSnd _x _x_i1 _x_i2 - | ExSte _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExSte _x _x_i1 _x_i2 - | ExStr _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExStr _x _x_i1 - | ExTry _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#match_case _x_i2 in ExTry _x _x_i1 _x_i2 - | ExTup _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in ExTup _x _x_i1 - | ExCom _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#expr _x_i2 in ExCom _x _x_i1 _x_i2 - | ExTyc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#expr _x_i1 in - let _x_i2 = o#ctyp _x_i2 in ExTyc _x _x_i1 _x_i2 - | ExVrn _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in ExVrn _x _x_i1 - | ExWhi _x _x_i1 _x_i2 -> - 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 -> - 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 - | ExFUN _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#expr _x_i2 in ExFUN _x _x_i1 _x_i2 - | ExPkg _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_expr _x_i1 in ExPkg _x _x_i1 ]; - method direction_flag : direction_flag -> direction_flag = - fun - [ DiTo -> DiTo - | DiDownto -> DiDownto - | DiAnt _x -> let _x = o#string _x in DiAnt _x ]; - method ctyp : ctyp -> ctyp = - fun - [ TyNil _x -> let _x = o#loc _x in TyNil _x - | TyAli _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAli _x _x_i1 _x_i2 - | TyAny _x -> let _x = o#loc _x in TyAny _x - | TyApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyApp _x _x_i1 _x_i2 - | TyArr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyArr _x _x_i1 _x_i2 - | TyCls _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ident _x_i1 in TyCls _x _x_i1 - | TyLab _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyLab _x _x_i1 _x_i2 - | TyId _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ident _x_i1 in TyId _x _x_i1 - | TyMan _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyMan _x _x_i1 _x_i2 - | TyDcl _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#list (fun o -> o#ctyp) _x_i2 in - let _x_i3 = o#ctyp _x_i3 in - let _x_i4 = - o#list - (fun o (_x, _x_i1) -> - let _x = o#ctyp _x in - let _x_i1 = o#ctyp _x_i1 in (_x, _x_i1)) - _x_i4 - in TyDcl _x _x_i1 _x_i2 _x_i3 _x_i4 - | TyObj _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#row_var_flag _x_i2 in TyObj _x _x_i1 _x_i2 - | TyOlb _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOlb _x _x_i1 _x_i2 - | TyPol _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyPol _x _x_i1 _x_i2 - | TyTypePol _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyTypePol _x _x_i1 _x_i2 - | TyQuo _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuo _x _x_i1 - | TyQuP _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuP _x _x_i1 - | TyQuM _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyQuM _x _x_i1 - | TyAnP _x -> let _x = o#loc _x in TyAnP _x - | TyAnM _x -> let _x = o#loc _x in TyAnM _x - | TyVrn _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyVrn _x _x_i1 - | TyRec _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in TyRec _x _x_i1 - | TyCol _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyCol _x _x_i1 _x_i2 - | TySem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TySem _x _x_i1 _x_i2 - | TyCom _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyCom _x _x_i1 _x_i2 - | TySum _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in TySum _x _x_i1 - | TyOf _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOf _x _x_i1 _x_i2 - | TyAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAnd _x _x_i1 _x_i2 - | TyOr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOr _x _x_i1 _x_i2 - | TyPrv _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in TyPrv _x _x_i1 - | TyMut _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in TyMut _x _x_i1 - | TyTup _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#ctyp _x_i1 in TyTup _x _x_i1 - | TySta _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TySta _x _x_i1 _x_i2 - | TyVrnEq _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnEq _x _x_i1 - | TyVrnSup _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnSup _x _x_i1 - | TyVrnInf _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in TyVrnInf _x _x_i1 - | TyVrnInfSup _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyVrnInfSup _x _x_i1 _x_i2 - | TyAmp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyAmp _x _x_i1 _x_i2 - | TyOfAmp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in TyOfAmp _x _x_i1 _x_i2 - | TyPkg _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#module_type _x_i1 in TyPkg _x _x_i1 - | TyAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in TyAnt _x _x_i1 ]; - method class_type : class_type -> class_type = - fun - [ CtNil _x -> let _x = o#loc _x in CtNil _x - | CtCon _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#virtual_flag _x_i1 in - let _x_i2 = o#ident _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CtCon _x _x_i1 _x_i2 _x_i3 - | CtFun _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#class_type _x_i2 in CtFun _x _x_i1 _x_i2 - | CtSig _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#class_sig_item _x_i2 in CtSig _x _x_i1 _x_i2 - | CtAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 in CtAnd _x _x_i1 _x_i2 - | CtCol _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 in CtCol _x _x_i1 _x_i2 - | CtEq _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in - let _x_i2 = o#class_type _x_i2 in CtEq _x _x_i1 _x_i2 - | CtAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CtAnt _x _x_i1 ]; - method class_str_item : class_str_item -> class_str_item = - fun - [ CrNil _x -> let _x = o#loc _x in CrNil _x - | CrSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_str_item _x_i1 in - let _x_i2 = o#class_str_item _x_i2 in CrSem _x _x_i1 _x_i2 - | CrCtr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in CrCtr _x _x_i1 _x_i2 - | CrInh _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#override_flag _x_i1 in - let _x_i2 = o#class_expr _x_i2 in - let _x_i3 = o#string _x_i3 in CrInh _x _x_i1 _x_i2 _x_i3 - | CrIni _x _x_i1 -> - let _x = o#loc _x in let _x_i1 = o#expr _x_i1 in CrIni _x _x_i1 - | CrMth _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#override_flag _x_i2 in - let _x_i3 = o#private_flag _x_i3 in - let _x_i4 = o#expr _x_i4 in - let _x_i5 = o#ctyp _x_i5 - in CrMth _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 - | CrVal _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#override_flag _x_i2 in - let _x_i3 = o#mutable_flag _x_i3 in - let _x_i4 = o#expr _x_i4 in CrVal _x _x_i1 _x_i2 _x_i3 _x_i4 - | CrVir _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CrVir _x _x_i1 _x_i2 _x_i3 - | CrVvr _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#mutable_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CrVvr _x _x_i1 _x_i2 _x_i3 - | CrAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CrAnt _x _x_i1 ]; - method class_sig_item : class_sig_item -> class_sig_item = - fun - [ CgNil _x -> let _x = o#loc _x in CgNil _x - | CgCtr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#ctyp _x_i1 in - let _x_i2 = o#ctyp _x_i2 in CgCtr _x _x_i1 _x_i2 - | CgSem _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_sig_item _x_i1 in - let _x_i2 = o#class_sig_item _x_i2 in CgSem _x _x_i1 _x_i2 - | CgInh _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#class_type _x_i1 in CgInh _x _x_i1 - | CgMth _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CgMth _x _x_i1 _x_i2 _x_i3 - | CgVal _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#mutable_flag _x_i2 in - let _x_i3 = o#virtual_flag _x_i3 in - let _x_i4 = o#ctyp _x_i4 in CgVal _x _x_i1 _x_i2 _x_i3 _x_i4 - | CgVir _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in - let _x_i2 = o#private_flag _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CgVir _x _x_i1 _x_i2 _x_i3 - | CgAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CgAnt _x _x_i1 ]; - method class_expr : class_expr -> class_expr = - fun - [ CeNil _x -> let _x = o#loc _x in CeNil _x - | CeApp _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#expr _x_i2 in CeApp _x _x_i1 _x_i2 - | CeCon _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#virtual_flag _x_i1 in - let _x_i2 = o#ident _x_i2 in - let _x_i3 = o#ctyp _x_i3 in CeCon _x _x_i1 _x_i2 _x_i3 - | CeFun _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_expr _x_i2 in CeFun _x _x_i1 _x_i2 - | CeLet _x _x_i1 _x_i2 _x_i3 -> - let _x = o#loc _x in - let _x_i1 = o#rec_flag _x_i1 in - let _x_i2 = o#binding _x_i2 in - let _x_i3 = o#class_expr _x_i3 in CeLet _x _x_i1 _x_i2 _x_i3 - | CeStr _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#class_str_item _x_i2 in CeStr _x _x_i1 _x_i2 - | CeTyc _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_type _x_i2 in CeTyc _x _x_i1 _x_i2 - | CeAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_expr _x_i2 in CeAnd _x _x_i1 _x_i2 - | CeEq _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#class_expr _x_i1 in - let _x_i2 = o#class_expr _x_i2 in CeEq _x _x_i1 _x_i2 - | CeAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in CeAnt _x _x_i1 ]; - method binding : binding -> binding = - fun - [ BiNil _x -> let _x = o#loc _x in BiNil _x - | BiAnd _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#binding _x_i1 in - let _x_i2 = o#binding _x_i2 in BiAnd _x _x_i1 _x_i2 - | BiEq _x _x_i1 _x_i2 -> - let _x = o#loc _x in - let _x_i1 = o#patt _x_i1 in - let _x_i2 = o#expr _x_i2 in BiEq _x _x_i1 _x_i2 - | BiAnt _x _x_i1 -> - let _x = o#loc _x in - let _x_i1 = o#string _x_i1 in BiAnt _x _x_i1 ]; - method unknown : ! 'a. 'a -> 'a = fun x -> x; - end; - class fold = - object ((o : 'self_type)) - method string : string -> 'self_type = o#unknown; - method list : - ! 'a. ('self_type -> 'a -> 'self_type) -> list 'a -> 'self_type = - fun _f_a -> - fun - [ [] -> o - | [ _x :: _x_i1 ] -> - let o = _f_a o _x in let o = o#list _f_a _x_i1 in o ]; - method with_constr : with_constr -> 'self_type = - fun - [ WcNil _x -> let o = o#loc _x in o - | WcTyp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | WcMod _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | WcTyS _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | WcMoS _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | WcAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#with_constr _x_i1 in let o = o#with_constr _x_i2 in o - | WcAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method virtual_flag : virtual_flag -> 'self_type = - fun - [ ViVirtual -> o - | ViNil -> o - | ViAnt _x -> let o = o#string _x in o ]; - method str_item : str_item -> 'self_type = - fun - [ StNil _x -> let o = o#loc _x in o - | StCls _x _x_i1 -> - let o = o#loc _x in let o = o#class_expr _x_i1 in o - | StClt _x _x_i1 -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | StSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#str_item _x_i1 in let o = o#str_item _x_i2 in o - | StDir _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 - | StExc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in - let o = o#meta_option (fun o -> o#ident) _x_i2 in o - | StExp _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | StExt _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#ctyp _x_i2 in - let o = o#meta_list (fun o -> o#string) _x_i3 in o - | StInc _x _x_i1 -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o - | StMod _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#module_expr _x_i2 in o - | StRecMod _x _x_i1 -> - let o = o#loc _x in let o = o#module_binding _x_i1 in o - | 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 - | 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 - let o = o#rec_flag _x_i1 in let o = o#binding _x_i2 in o - | StAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method sig_item : sig_item -> 'self_type = - fun - [ SgNil _x -> let o = o#loc _x in o - | SgCls _x _x_i1 -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | SgClt _x _x_i1 -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | SgSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#sig_item _x_i1 in let o = o#sig_item _x_i2 in o - | SgDir _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 - | SgExc _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | SgExt _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#ctyp _x_i2 in - let o = o#meta_list (fun o -> o#string) _x_i3 in o - | SgInc _x _x_i1 -> - let o = o#loc _x in let o = o#module_type _x_i1 in o - | SgMod _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 - | SgRecMod _x _x_i1 -> - let o = o#loc _x in let o = o#module_binding _x_i1 in o - | SgMty _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 - | SgOpn _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | SgTyp _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | SgVal _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | SgAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method row_var_flag : row_var_flag -> 'self_type = - fun - [ RvRowVar -> o - | RvNil -> o - | RvAnt _x -> let o = o#string _x in o ]; - method rec_flag : rec_flag -> 'self_type = - fun - [ ReRecursive -> o - | ReNil -> o - | ReAnt _x -> let o = o#string _x in o ]; - method rec_binding : rec_binding -> 'self_type = - fun - [ RbNil _x -> let o = o#loc _x in o - | RbSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#rec_binding _x_i1 in let o = o#rec_binding _x_i2 in o - | RbEq _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 in o - | RbAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method private_flag : private_flag -> 'self_type = - fun - [ PrPrivate -> o - | PrNil -> o - | PrAnt _x -> let o = o#string _x in o ]; - method patt : patt -> 'self_type = - fun - [ PaNil _x -> let o = o#loc _x in o - | PaId _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | PaAli _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaAny _x -> let o = o#loc _x in o - | PaApp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaArr _x _x_i1 -> let o = o#loc _x in let o = o#patt _x_i1 in o - | PaCom _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaChr _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt32 _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaInt64 _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaNativeInt _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | PaFlo _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaLab _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#patt _x_i2 in o - | PaOlb _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#patt _x_i2 in o - | PaOlbi _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#patt _x_i2 in let o = o#expr _x_i3 in o - | PaOrp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaRng _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#patt _x_i2 in o - | PaRec _x _x_i1 -> let o = o#loc _x in let o = o#patt _x_i1 in o - | PaEq _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#patt _x_i2 in o - | PaStr _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaTup _x _x_i1 -> let o = o#loc _x in let o = o#patt _x_i1 in o - | PaTyc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#ctyp _x_i2 in o - | PaTyp _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | PaVrn _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | PaLaz _x _x_i1 -> let o = o#loc _x in let o = o#patt _x_i1 in o - | PaMod _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method override_flag : override_flag -> 'self_type = - fun - [ OvOverride -> o - | OvNil -> o - | OvAnt _x -> let o = o#string _x in o ]; - method mutable_flag : mutable_flag -> 'self_type = - fun - [ MuMutable -> o - | MuNil -> o - | MuAnt _x -> let o = o#string _x in o ]; - method module_type : module_type -> 'self_type = - fun - [ MtNil _x -> let o = o#loc _x in o - | MtId _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | MtFun _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in let o = o#module_type _x_i3 in o - | MtQuo _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | MtSig _x _x_i1 -> - let o = o#loc _x in let o = o#sig_item _x_i1 in o - | MtWit _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#module_type _x_i1 in let o = o#with_constr _x_i2 in o - | MtOf _x _x_i1 -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o - | MtAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method module_expr : module_expr -> 'self_type = - fun - [ MeNil _x -> let o = o#loc _x in o - | MeId _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | MeApp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#module_expr _x_i1 in let o = o#module_expr _x_i2 in o - | MeFun _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in let o = o#module_expr _x_i3 in o - | MeStr _x _x_i1 -> - let o = o#loc _x in let o = o#str_item _x_i1 in o - | MeTyc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#module_expr _x_i1 in let o = o#module_type _x_i2 in o - | MePkg _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | MeAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method module_binding : module_binding -> 'self_type = - fun - [ MbNil _x -> let o = o#loc _x in o - | MbAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#module_binding _x_i1 in - let o = o#module_binding _x_i2 in o - | MbColEq _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_type _x_i2 in let o = o#module_expr _x_i3 in o - | MbCol _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 - | MbAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method meta_option : - ! 'a. - ('self_type -> 'a -> 'self_type) -> meta_option 'a -> 'self_type = - fun _f_a -> - fun - [ ONone -> o - | OSome _x -> let o = _f_a o _x in o - | OAnt _x -> let o = o#string _x in o ]; - method meta_list : - ! 'a. - ('self_type -> 'a -> 'self_type) -> meta_list 'a -> 'self_type = - fun _f_a -> - fun - [ LNil -> o - | LCons _x _x_i1 -> - let o = _f_a o _x in let o = o#meta_list _f_a _x_i1 in o - | LAnt _x -> let o = o#string _x in o ]; - method meta_bool : meta_bool -> 'self_type = - fun - [ BTrue -> o - | BFalse -> o - | BAnt _x -> let o = o#string _x in o ]; - method match_case : match_case -> 'self_type = - fun - [ McNil _x -> let o = o#loc _x in o - | McOr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#match_case _x_i1 in let o = o#match_case _x_i2 in o - | McArr _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#patt _x_i1 in - let o = o#expr _x_i2 in let o = o#expr _x_i3 in o - | McAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method loc : loc -> 'self_type = o#unknown; - method ident : ident -> 'self_type = - fun - [ IdAcc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | IdApp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#ident _x_i2 in o - | IdLid _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | IdUid _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | IdAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method expr : expr -> 'self_type = - fun - [ ExNil _x -> let o = o#loc _x in o - | ExId _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | ExAcc _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 - | ExAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | ExApp _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 - | ExAre _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 - | ExArr _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | ExSem _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 - | ExAsf _x -> let o = o#loc _x in o - | ExAsr _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | ExAss _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 - | ExChr _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | ExCoe _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#expr _x_i1 in - let o = o#ctyp _x_i2 in let o = o#ctyp _x_i3 in o - | ExFlo _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | ExFor _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#expr _x_i2 in - let o = o#expr _x_i3 in - let o = o#direction_flag _x_i4 in let o = o#expr _x_i5 in o - | ExFun _x _x_i1 -> - let o = o#loc _x in let o = o#match_case _x_i1 in o - | ExIfe _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#expr _x_i1 in - let o = o#expr _x_i2 in let o = o#expr _x_i3 in o - | ExInt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | ExInt32 _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExInt64 _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExNativeInt _x _x_i1 -> - let o = o#loc _x in let o = o#string _x_i1 in o - | ExLab _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 - | ExLaz _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | ExLet _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#rec_flag _x_i1 in - let o = o#binding _x_i2 in let o = o#expr _x_i3 in o - | ExLmd _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#module_expr _x_i2 in let o = o#expr _x_i3 in o - | ExMat _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#match_case _x_i2 in o - | ExNew _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | ExObj _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#class_str_item _x_i2 in o - | ExOlb _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 - | ExOvr _x _x_i1 -> - let o = o#loc _x in let o = o#rec_binding _x_i1 in o - | ExRec _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#rec_binding _x_i1 in let o = o#expr _x_i2 in o - | ExSeq _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | ExSnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#string _x_i2 in o - | ExSte _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 - | ExStr _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | ExTry _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#match_case _x_i2 in o - | ExTup _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | ExCom _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 - | ExTyc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#expr _x_i1 in let o = o#ctyp _x_i2 in o - | ExVrn _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | 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 -> - let o = o#loc _x in - let o = o#ident _x_i1 in let o = o#expr _x_i2 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 - | ExPkg _x _x_i1 -> - let o = o#loc _x in let o = o#module_expr _x_i1 in o ]; - method direction_flag : direction_flag -> 'self_type = - fun - [ DiTo -> o - | DiDownto -> o - | DiAnt _x -> let o = o#string _x in o ]; - method ctyp : ctyp -> 'self_type = - fun - [ TyNil _x -> let o = o#loc _x in o - | TyAli _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAny _x -> let o = o#loc _x in o - | TyApp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyArr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyCls _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | TyLab _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | TyId _x _x_i1 -> let o = o#loc _x in let o = o#ident _x_i1 in o - | TyMan _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyDcl _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#list (fun o -> o#ctyp) _x_i2 in - let o = o#ctyp _x_i3 in - let o = - o#list - (fun o (_x, _x_i1) -> - let o = o#ctyp _x in let o = o#ctyp _x_i1 in o) - _x_i4 - in o - | TyObj _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#row_var_flag _x_i2 in o - | TyOlb _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#string _x_i1 in let o = o#ctyp _x_i2 in o - | TyPol _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyTypePol _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyQuo _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | TyQuP _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | TyQuM _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | TyAnP _x -> let o = o#loc _x in o - | TyAnM _x -> let o = o#loc _x in o - | TyVrn _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o - | TyRec _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyCol _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TySem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyCom _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TySum _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyOf _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyOr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyPrv _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyMut _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyTup _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TySta _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyVrnEq _x _x_i1 -> let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnSup _x _x_i1 -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnInf _x _x_i1 -> - let o = o#loc _x in let o = o#ctyp _x_i1 in o - | TyVrnInfSup _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyAmp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyOfAmp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | TyPkg _x _x_i1 -> - let o = o#loc _x in let o = o#module_type _x_i1 in o - | TyAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method class_type : class_type -> 'self_type = - fun - [ CtNil _x -> let o = o#loc _x in o - | CtCon _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#virtual_flag _x_i1 in - let o = o#ident _x_i2 in let o = o#ctyp _x_i3 in o - | CtFun _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#class_type _x_i2 in o - | CtSig _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#class_sig_item _x_i2 in o - | CtAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_type _x_i1 in let o = o#class_type _x_i2 in o - | CtCol _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_type _x_i1 in let o = o#class_type _x_i2 in o - | CtEq _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_type _x_i1 in let o = o#class_type _x_i2 in o - | CtAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method class_str_item : class_str_item -> 'self_type = - fun - [ CrNil _x -> let o = o#loc _x in o - | CrSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_str_item _x_i1 in - let o = o#class_str_item _x_i2 in o - | CrCtr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | CrInh _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#override_flag _x_i1 in - let o = o#class_expr _x_i2 in let o = o#string _x_i3 in o - | CrIni _x _x_i1 -> let o = o#loc _x in let o = o#expr _x_i1 in o - | CrMth _x _x_i1 _x_i2 _x_i3 _x_i4 _x_i5 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#override_flag _x_i2 in - let o = o#private_flag _x_i3 in - let o = o#expr _x_i4 in let o = o#ctyp _x_i5 in o - | CrVal _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#override_flag _x_i2 in - let o = o#mutable_flag _x_i3 in let o = o#expr _x_i4 in o - | CrVir _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in let o = o#ctyp _x_i3 in o - | CrVvr _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#mutable_flag _x_i2 in let o = o#ctyp _x_i3 in o - | CrAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method class_sig_item : class_sig_item -> 'self_type = - fun - [ CgNil _x -> let o = o#loc _x in o - | CgCtr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#ctyp _x_i1 in let o = o#ctyp _x_i2 in o - | CgSem _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_sig_item _x_i1 in - let o = o#class_sig_item _x_i2 in o - | CgInh _x _x_i1 -> - let o = o#loc _x in let o = o#class_type _x_i1 in o - | CgMth _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in let o = o#ctyp _x_i3 in o - | CgVal _x _x_i1 _x_i2 _x_i3 _x_i4 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#mutable_flag _x_i2 in - let o = o#virtual_flag _x_i3 in let o = o#ctyp _x_i4 in o - | CgVir _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#string _x_i1 in - let o = o#private_flag _x_i2 in let o = o#ctyp _x_i3 in o - | CgAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method class_expr : class_expr -> 'self_type = - fun - [ CeNil _x -> let o = o#loc _x in o - | CeApp _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in let o = o#expr _x_i2 in o - | CeCon _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#virtual_flag _x_i1 in - let o = o#ident _x_i2 in let o = o#ctyp _x_i3 in o - | CeFun _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#class_expr _x_i2 in o - | CeLet _x _x_i1 _x_i2 _x_i3 -> - let o = o#loc _x in - let o = o#rec_flag _x_i1 in - let o = o#binding _x_i2 in let o = o#class_expr _x_i3 in o - | CeStr _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#class_str_item _x_i2 in o - | CeTyc _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in let o = o#class_type _x_i2 in o - | CeAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in let o = o#class_expr _x_i2 in o - | CeEq _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#class_expr _x_i1 in let o = o#class_expr _x_i2 in o - | CeAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method binding : binding -> 'self_type = - fun - [ BiNil _x -> let o = o#loc _x in o - | BiAnd _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#binding _x_i1 in let o = o#binding _x_i2 in o - | BiEq _x _x_i1 _x_i2 -> - let o = o#loc _x in - let o = o#patt _x_i1 in let o = o#expr _x_i2 in o - | BiAnt _x _x_i1 -> let o = o#loc _x in let o = o#string _x_i1 in o ]; - method unknown : ! 'a. 'a -> 'self_type = fun _ -> o; - end; - value map_expr f = - object inherit map as super; method expr = fun x -> f (super#expr x); - end; - value map_patt f = - object inherit map as super; method patt = fun x -> f (super#patt x); - end; - value map_ctyp f = - object inherit map as super; method ctyp = fun x -> f (super#ctyp x); - end; - value map_str_item f = - object - inherit map as super; - method str_item = fun x -> f (super#str_item x); - end; - value map_sig_item f = - object - inherit map as super; - method sig_item = fun x -> f (super#sig_item x); - end; - value map_loc f = - object inherit map as super; method loc = fun x -> f (super#loc x); end; - end; - diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml deleted file mode 100644 index fff2a1f3..00000000 --- a/camlp4/boot/camlp4boot.ml +++ /dev/null @@ -1,16057 +0,0 @@ -module R = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - module Id = - struct - let name = "Camlp4OCamlRevisedParser" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - (* Camlp4_config.constructors_arity.val := True; *) - let _ = Camlp4_config.constructors_arity := false - - let help_sequences () = - (Printf.eprintf - "\ -New syntax:\ -\n (e1; e2; ... ; en) OR begin e1; e2; ... ; en end\ -\n while e do e1; e2; ... ; en done\ -\n for v = v1 to/downto v2 do e1; e2; ... ; en done\ -\nOld syntax (still supported):\ -\n do {e1; e2; ... ; en}\ -\n while e do {e1; e2; ... ; en}\ -\n for v = v1 to/downto v2 do {e1; e2; ... ; en}\ -\nVery old (no more supported) syntax:\ -\n do e1; e2; ... ; en-1; return en\ -\n while e do e1; e2; ... ; en; done\ -\n for v = v1 to/downto v2 do e1; e2; ... ; en; done\ -\n"; - flush stderr; - exit 1) - - let _ = - Options.add "-help_seq" (Arg.Unit help_sequences) - "Print explanations about new sequences and exit." - - let _ = Gram.Entry.clear a_CHAR - - let _ = Gram.Entry.clear a_FLOAT - - let _ = Gram.Entry.clear a_INT - - let _ = Gram.Entry.clear a_INT32 - - let _ = Gram.Entry.clear a_INT64 - - let _ = Gram.Entry.clear a_LABEL - - let _ = Gram.Entry.clear a_LIDENT - - let _ = Gram.Entry.clear a_NATIVEINT - - let _ = Gram.Entry.clear a_OPTLABEL - - let _ = Gram.Entry.clear a_STRING - - let _ = Gram.Entry.clear a_UIDENT - - let _ = Gram.Entry.clear a_ident - - let _ = Gram.Entry.clear amp_ctyp - - let _ = Gram.Entry.clear and_ctyp - - let _ = Gram.Entry.clear match_case - - let _ = Gram.Entry.clear match_case0 - - let _ = Gram.Entry.clear match_case_quot - - let _ = Gram.Entry.clear binding - - let _ = Gram.Entry.clear binding_quot - - let _ = Gram.Entry.clear rec_binding_quot - - let _ = Gram.Entry.clear class_declaration - - let _ = Gram.Entry.clear class_description - - let _ = Gram.Entry.clear class_expr - - let _ = Gram.Entry.clear class_expr_quot - - let _ = Gram.Entry.clear class_fun_binding - - let _ = Gram.Entry.clear class_fun_def - - let _ = Gram.Entry.clear class_info_for_class_expr - - let _ = Gram.Entry.clear class_info_for_class_type - - let _ = Gram.Entry.clear class_longident - - let _ = Gram.Entry.clear class_longident_and_param - - let _ = Gram.Entry.clear class_name_and_param - - let _ = Gram.Entry.clear class_sig_item - - let _ = Gram.Entry.clear class_sig_item_quot - - let _ = Gram.Entry.clear class_signature - - let _ = Gram.Entry.clear class_str_item - - let _ = Gram.Entry.clear class_str_item_quot - - let _ = Gram.Entry.clear class_structure - - let _ = Gram.Entry.clear class_type - - let _ = Gram.Entry.clear class_type_declaration - - let _ = Gram.Entry.clear class_type_longident - - let _ = Gram.Entry.clear class_type_longident_and_param - - let _ = Gram.Entry.clear class_type_plus - - let _ = Gram.Entry.clear class_type_quot - - let _ = Gram.Entry.clear comma_ctyp - - let _ = Gram.Entry.clear comma_expr - - let _ = Gram.Entry.clear comma_ipatt - - let _ = Gram.Entry.clear comma_patt - - let _ = Gram.Entry.clear comma_type_parameter - - let _ = Gram.Entry.clear constrain - - let _ = Gram.Entry.clear constructor_arg_list - - let _ = Gram.Entry.clear constructor_declaration - - let _ = Gram.Entry.clear constructor_declarations - - let _ = Gram.Entry.clear ctyp - - let _ = Gram.Entry.clear ctyp_quot - - let _ = Gram.Entry.clear cvalue_binding - - let _ = Gram.Entry.clear direction_flag - - let _ = Gram.Entry.clear dummy - - let _ = Gram.Entry.clear eq_expr - - let _ = Gram.Entry.clear expr - - let _ = Gram.Entry.clear expr_eoi - - let _ = Gram.Entry.clear expr_quot - - let _ = Gram.Entry.clear field_expr - - let _ = Gram.Entry.clear field_expr_list - - let _ = Gram.Entry.clear fun_binding - - let _ = Gram.Entry.clear fun_def - - let _ = Gram.Entry.clear ident - - let _ = Gram.Entry.clear ident_quot - - let _ = Gram.Entry.clear implem - - let _ = Gram.Entry.clear interf - - let _ = Gram.Entry.clear ipatt - - let _ = Gram.Entry.clear ipatt_tcon - - let _ = Gram.Entry.clear label - - let _ = Gram.Entry.clear label_declaration - - let _ = Gram.Entry.clear label_declaration_list - - let _ = Gram.Entry.clear label_expr_list - - let _ = Gram.Entry.clear label_expr - - let _ = Gram.Entry.clear label_ipatt - - let _ = Gram.Entry.clear label_ipatt_list - - let _ = Gram.Entry.clear label_longident - - let _ = Gram.Entry.clear label_patt - - let _ = Gram.Entry.clear label_patt_list - - let _ = Gram.Entry.clear labeled_ipatt - - let _ = Gram.Entry.clear let_binding - - let _ = Gram.Entry.clear meth_list - - let _ = Gram.Entry.clear meth_decl - - let _ = Gram.Entry.clear module_binding - - let _ = Gram.Entry.clear module_binding0 - - let _ = Gram.Entry.clear module_binding_quot - - let _ = Gram.Entry.clear module_declaration - - let _ = Gram.Entry.clear module_expr - - let _ = Gram.Entry.clear module_expr_quot - - let _ = Gram.Entry.clear module_longident - - let _ = Gram.Entry.clear module_longident_with_app - - let _ = Gram.Entry.clear module_rec_declaration - - let _ = Gram.Entry.clear module_type - - let _ = Gram.Entry.clear module_type_quot - - let _ = Gram.Entry.clear more_ctyp - - let _ = Gram.Entry.clear name_tags - - let _ = Gram.Entry.clear opt_as_lident - - let _ = Gram.Entry.clear opt_class_self_patt - - let _ = Gram.Entry.clear opt_class_self_type - - let _ = Gram.Entry.clear opt_comma_ctyp - - let _ = Gram.Entry.clear opt_dot_dot - - let _ = Gram.Entry.clear opt_eq_ctyp - - let _ = Gram.Entry.clear opt_expr - - let _ = Gram.Entry.clear opt_meth_list - - let _ = Gram.Entry.clear opt_mutable - - let _ = Gram.Entry.clear opt_polyt - - let _ = Gram.Entry.clear opt_private - - let _ = Gram.Entry.clear opt_rec - - let _ = Gram.Entry.clear opt_virtual - - let _ = Gram.Entry.clear opt_when_expr - - let _ = Gram.Entry.clear patt - - let _ = Gram.Entry.clear patt_as_patt_opt - - let _ = Gram.Entry.clear patt_eoi - - let _ = Gram.Entry.clear patt_quot - - let _ = Gram.Entry.clear patt_tcon - - let _ = Gram.Entry.clear phrase - - let _ = Gram.Entry.clear poly_type - - let _ = Gram.Entry.clear row_field - - let _ = Gram.Entry.clear sem_expr - - let _ = Gram.Entry.clear sem_expr_for_list - - let _ = Gram.Entry.clear sem_patt - - let _ = Gram.Entry.clear sem_patt_for_list - - let _ = Gram.Entry.clear semi - - let _ = Gram.Entry.clear sequence - - let _ = Gram.Entry.clear sig_item - - let _ = Gram.Entry.clear sig_item_quot - - let _ = Gram.Entry.clear sig_items - - let _ = Gram.Entry.clear star_ctyp - - let _ = Gram.Entry.clear str_item - - let _ = Gram.Entry.clear str_item_quot - - let _ = Gram.Entry.clear str_items - - let _ = Gram.Entry.clear top_phrase - - let _ = Gram.Entry.clear type_constraint - - let _ = Gram.Entry.clear type_declaration - - let _ = Gram.Entry.clear type_ident_and_parameters - - let _ = Gram.Entry.clear type_kind - - let _ = Gram.Entry.clear type_longident - - let _ = Gram.Entry.clear type_longident_and_parameters - - let _ = Gram.Entry.clear type_parameter - - let _ = Gram.Entry.clear type_parameters - - let _ = Gram.Entry.clear typevars - - let _ = Gram.Entry.clear use_file - - let _ = Gram.Entry.clear val_longident - - let _ = Gram.Entry.clear value_let - - let _ = Gram.Entry.clear value_val - - let _ = Gram.Entry.clear with_constr - - let _ = Gram.Entry.clear with_constr_quot - - let neg_string n = - let len = String.length n - in - if (len > 0) && (n.[0] = '-') - then String.sub n 1 (len - 1) - else "-" ^ n - - let mkumin _loc f arg = - match arg with - | Ast.ExInt (_, n) -> Ast.ExInt (_loc, (neg_string n)) - | Ast.ExInt32 (_, n) -> Ast.ExInt32 (_loc, (neg_string n)) - | Ast.ExInt64 (_, n) -> Ast.ExInt64 (_loc, (neg_string n)) - | Ast.ExNativeInt (_, n) -> Ast.ExNativeInt (_loc, (neg_string n)) - | Ast.ExFlo (_, n) -> Ast.ExFlo (_loc, (neg_string n)) - | _ -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, ("~" ^ f))))), arg) - - let mklistexp _loc last = - let rec loop top = - function - | [] -> - (match last with - | Some e -> e - | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) - | e1 :: el -> - let _loc = - if top then _loc else Loc.merge (Ast.loc_of_expr e1) _loc - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), e1)), - (loop false el)) - in loop true - - let mkassert _loc = - function - | Ast.ExId (_, (Ast.IdUid (_, "False"))) -> Ast.ExAsf _loc - | (* this case takes care about - the special assert false node *) - e -> Ast.ExAsr (_loc, e) - - let append_eLem el e = el @ [ e ] - - let mk_anti ?(c = "") n s = "\\$" ^ (n ^ (c ^ (":" ^ s))) - - let mksequence _loc = - function - | (Ast.ExSem (_, _, _) | Ast.ExAnt (_, _) as e) -> - Ast.ExSeq (_loc, e) - | e -> e - - let mksequence' _loc = - function - | (Ast.ExSem (_, _, _) as e) -> Ast.ExSeq (_loc, e) - | e -> e - - let rec lid_of_ident = - function - | Ast.IdAcc (_, _, i) -> lid_of_ident i - | Ast.IdLid (_, lid) -> lid - | _ -> assert false - - let module_type_app mt1 mt2 = - match (mt1, mt2) with - | (Ast.MtId (_loc, i1), Ast.MtId (_, i2)) -> - Ast.MtId (_loc, (Ast.IdApp (_loc, i1, i2))) - | _ -> raise Stream.Failure - - let module_type_acc mt1 mt2 = - match (mt1, mt2) with - | (Ast.MtId (_loc, i1), Ast.MtId (_, i2)) -> - Ast.MtId (_loc, (Ast.IdAcc (_loc, i1, i2))) - | _ -> raise Stream.Failure - - let bigarray_get _loc arr arg = - let coords = - match arg with - | Ast.ExTup (_, (Ast.ExCom (_, e1, e2))) | Ast.ExCom (_, e1, e2) - -> Ast.list_of_expr e1 (Ast.list_of_expr e2 []) - | _ -> [ arg ] - in - match coords with - | [ c1 ] -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Array1")), - (Ast.IdLid (_loc, "get")))))))), - arr)), - c1) - | [ c1; c2 ] -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Array2")), - (Ast.IdLid (_loc, "get")))))))), - arr)), - c1)), - c2) - | [ c1; c2; c3 ] -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Array3")), - (Ast.IdLid (_loc, "get")))))))), - arr)), - c1)), - c2)), - c3) - | (* | coords -> <:expr< Bigarray.Genarray.get $arr$ [| $list:coords$ |] >> ] *) - coords -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Genarray")), - (Ast.IdLid (_loc, "get")))))))), - arr)), - (Ast.ExArr (_loc, (Ast.exSem_of_list coords)))) - - let bigarray_set _loc var newval = - match var with - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), - (Ast.IdAcc (_, (Ast.IdUid (_, "Array1")), - (Ast.IdLid (_, "get")))))))), - arr)), - c1) -> - Some - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Array1")), - (Ast.IdLid (_loc, "set")))))))), - arr)), - c1)), - newval)) - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), - (Ast.IdAcc (_, (Ast.IdUid (_, "Array2")), - (Ast.IdLid (_, "get")))))))), - arr)), - c1)), - c2) -> - Some - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Array2")), - (Ast.IdLid (_loc, "set")))))))), - arr)), - c1)), - c2)), - newval)) - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), - (Ast.IdAcc (_, (Ast.IdUid (_, "Array3")), - (Ast.IdLid (_, "get")))))))), - arr)), - c1)), - c2)), - c3) -> - Some - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Array3")), - (Ast.IdLid (_loc, "set")))))))), - arr)), - c1)), - c2)), - c3)), - newval)) - | Ast.ExApp (_, - (Ast.ExApp (_, - (Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Bigarray")), - (Ast.IdAcc (_, (Ast.IdUid (_, "Genarray")), - (Ast.IdLid (_, "get")))))))), - arr)), - (Ast.ExArr (_, coords))) -> - Some - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Bigarray")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Genarray")), - (Ast.IdLid (_loc, "set")))))))), - arr)), - (Ast.ExArr (_loc, coords)))), - newval)) - | _ -> None - - let stopped_at _loc = Some (Loc.move_line 1 _loc) - - (* FIXME be more precise *) - let rec generalized_type_of_type = - function - | Ast.TyArr (_, t1, t2) -> - let (tl, rt) = generalized_type_of_type t2 in ((t1 :: tl), rt) - | t -> ([], t) - - let symbolchar = - let list = - [ '$'; '!'; '%'; '&'; '*'; '+'; '-'; '.'; '/'; ':'; '<'; '='; - '>'; '?'; '@'; '^'; '|'; '~'; '\\' ] in - let rec loop s i = - if i == (String.length s) - then true - else if List.mem s.[i] list then loop s (i + 1) else false - in loop - - let setup_op_parser entry p = - Gram.Entry.setup_parser entry - (fun (__strm : _ Stream.t) -> - match Stream.peek __strm with - | Some (((KEYWORD x | SYMBOL x), ti)) when p x -> - (Stream.junk __strm; - let _loc = Gram.token_location ti - in Ast.ExId (_loc, (Ast.IdLid (_loc, x)))) - | _ -> raise Stream.Failure) - - let _ = - let list = [ '!'; '?'; '~' ] in - let excl = [ "!="; "??" ] - in - setup_op_parser prefixop - (fun x -> - (not (List.mem x excl)) && - (((String.length x) >= 2) && - ((List.mem x.[0] list) && (symbolchar x 1)))) - - let _ = - let list_ok = - [ "<"; ">"; "<="; ">="; "="; "<>"; "=="; "!="; "$" ] in - let list_first_char_ok = [ '='; '<'; '>'; '|'; '&'; '$'; '!' ] in - let excl = [ "<-"; "||"; "&&" ] - in - setup_op_parser infixop0 - (fun x -> - (List.mem x list_ok) || - ((not (List.mem x excl)) && - (((String.length x) >= 2) && - ((List.mem x.[0] list_first_char_ok) && - (symbolchar x 1))))) - - let _ = - let list = [ '@'; '^' ] - in - setup_op_parser infixop1 - (fun x -> - ((String.length x) >= 1) && - ((List.mem x.[0] list) && (symbolchar x 1))) - - let _ = - let list = [ '+'; '-' ] - in - setup_op_parser infixop2 - (fun x -> - (x <> "->") && - (((String.length x) >= 1) && - ((List.mem x.[0] list) && (symbolchar x 1)))) - - let _ = - let list = [ '*'; '/'; '%'; '\\' ] - in - setup_op_parser infixop3 - (fun x -> - ((String.length x) >= 1) && - ((List.mem x.[0] list) && - (((x.[0] <> '*') || - (((String.length x) < 2) || (x.[1] <> '*'))) - && (symbolchar x 1)))) - - let _ = - setup_op_parser infixop4 - (fun x -> - ((String.length x) >= 2) && - ((x.[0] == '*') && ((x.[1] == '*') && (symbolchar x 2)))) - - let rec infix_kwds_filter (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some (((KEYWORD "(", _) as tok)) -> - (Stream.junk __strm; - let xs = __strm in - let (__strm : _ Stream.t) = xs - in - (match Stream.peek __strm with - | Some - ((KEYWORD - (("or" | "mod" | "land" | "lor" | "lxor" | "lsl" | - "lsr" | "asr" - as i)), - _loc)) - -> - (Stream.junk __strm; - (match Stream.peek __strm with - | Some ((KEYWORD ")", _)) -> - (Stream.junk __strm; - let xs = __strm - in - Stream.lcons (fun _ -> ((LIDENT i), _loc)) - (Stream.slazy - (fun _ -> infix_kwds_filter xs))) - | _ -> raise (Stream.Error ""))) - | _ -> - let xs = __strm - in - Stream.icons tok - (Stream.slazy (fun _ -> infix_kwds_filter xs)))) - | Some x -> - (Stream.junk __strm; - let xs = __strm - in - Stream.icons x - (Stream.slazy (fun _ -> infix_kwds_filter xs))) - | _ -> raise Stream.Failure - - let _ = - Token.Filter.define_filter (Gram.get_filter ()) - (fun f strm -> infix_kwds_filter (f strm)) - - let _ = - Gram.Entry.setup_parser sem_expr - (let symb1 = Gram.parse_tokens_after_filter expr in - let symb (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some ((ANTIQUOT ((("list" as n)), s), ti)) -> - (Stream.junk __strm; - let _loc = Gram.token_location ti - in Ast.ExAnt (_loc, (mk_anti ~c: "expr;" n s))) - | _ -> symb1 __strm in - let rec kont al (__strm : _ Stream.t) = - match Stream.peek __strm with - | Some ((KEYWORD ";", _)) -> - (Stream.junk __strm; - let a = - (try symb __strm - with | Stream.Failure -> raise (Stream.Error "")) in - let s = __strm in - let _loc = - Loc.merge (Ast.loc_of_expr al) (Ast.loc_of_expr a) - in kont (Ast.ExSem (_loc, al, a)) s) - | _ -> al - in - fun (__strm : _ Stream.t) -> - let a = symb __strm in kont a __strm) - - let _ = - let apply () = - let _ = (a_CHAR : 'a_CHAR Gram.Entry.t) - and _ = (override_flag_quot : 'override_flag_quot Gram.Entry.t) - and _ = (row_var_flag_quot : 'row_var_flag_quot Gram.Entry.t) - and _ = (virtual_flag_quot : 'virtual_flag_quot Gram.Entry.t) - and _ = (private_flag_quot : 'private_flag_quot Gram.Entry.t) - and _ = (mutable_flag_quot : 'mutable_flag_quot Gram.Entry.t) - and _ = (direction_flag_quot : 'direction_flag_quot Gram.Entry.t) - and _ = (rec_flag_quot : 'rec_flag_quot Gram.Entry.t) - and _ = (package_type : 'package_type Gram.Entry.t) - and _ = (do_sequence : 'do_sequence Gram.Entry.t) - and _ = (infixop4 : 'infixop4 Gram.Entry.t) - and _ = (infixop3 : 'infixop3 Gram.Entry.t) - and _ = (infixop2 : 'infixop2 Gram.Entry.t) - and _ = (infixop1 : 'infixop1 Gram.Entry.t) - and _ = (infixop0 : 'infixop0 Gram.Entry.t) - and _ = (with_constr_quot : 'with_constr_quot Gram.Entry.t) - and _ = (with_constr : 'with_constr Gram.Entry.t) - and _ = (value_val : 'value_val Gram.Entry.t) - and _ = (value_let : 'value_let Gram.Entry.t) - and _ = (val_longident : 'val_longident Gram.Entry.t) - and _ = (use_file : 'use_file Gram.Entry.t) - and _ = (typevars : 'typevars Gram.Entry.t) - and _ = (type_parameters : 'type_parameters Gram.Entry.t) - and _ = (type_parameter : 'type_parameter Gram.Entry.t) - and _ = - (type_longident_and_parameters : - 'type_longident_and_parameters Gram.Entry.t) - and _ = (type_longident : 'type_longident Gram.Entry.t) - and _ = (type_kind : 'type_kind Gram.Entry.t) - and _ = - (type_ident_and_parameters : - 'type_ident_and_parameters Gram.Entry.t) - and _ = (type_declaration : 'type_declaration Gram.Entry.t) - and _ = (type_constraint : 'type_constraint Gram.Entry.t) - and _ = (top_phrase : 'top_phrase Gram.Entry.t) - and _ = (str_items : 'str_items Gram.Entry.t) - and _ = (str_item_quot : 'str_item_quot Gram.Entry.t) - and _ = (str_item : 'str_item Gram.Entry.t) - and _ = (star_ctyp : 'star_ctyp Gram.Entry.t) - and _ = (sig_items : 'sig_items Gram.Entry.t) - and _ = (sig_item_quot : 'sig_item_quot Gram.Entry.t) - and _ = (sig_item : 'sig_item Gram.Entry.t) - and _ = (sequence : 'sequence Gram.Entry.t) - and _ = (semi : 'semi Gram.Entry.t) - and _ = (sem_patt_for_list : 'sem_patt_for_list Gram.Entry.t) - and _ = (sem_patt : 'sem_patt Gram.Entry.t) - and _ = (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t) - and _ = (sem_expr : 'sem_expr Gram.Entry.t) - and _ = (row_field : 'row_field Gram.Entry.t) - and _ = (poly_type : 'poly_type Gram.Entry.t) - and _ = (phrase : 'phrase Gram.Entry.t) - and _ = (patt_tcon : 'patt_tcon Gram.Entry.t) - and _ = (patt_quot : 'patt_quot Gram.Entry.t) - and _ = (patt_eoi : 'patt_eoi Gram.Entry.t) - and _ = (patt_as_patt_opt : 'patt_as_patt_opt Gram.Entry.t) - and _ = (patt : 'patt Gram.Entry.t) - and _ = (opt_when_expr : 'opt_when_expr Gram.Entry.t) - and _ = (opt_virtual : 'opt_virtual Gram.Entry.t) - and _ = (opt_rec : 'opt_rec Gram.Entry.t) - and _ = (opt_private : 'opt_private Gram.Entry.t) - and _ = (opt_polyt : 'opt_polyt Gram.Entry.t) - and _ = (opt_mutable : 'opt_mutable Gram.Entry.t) - and _ = (opt_meth_list : 'opt_meth_list Gram.Entry.t) - and _ = (opt_expr : 'opt_expr Gram.Entry.t) - and _ = (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t) - and _ = (opt_dot_dot : 'opt_dot_dot Gram.Entry.t) - and _ = (opt_comma_ctyp : 'opt_comma_ctyp Gram.Entry.t) - and _ = (opt_class_self_type : 'opt_class_self_type Gram.Entry.t) - and _ = (opt_class_self_patt : 'opt_class_self_patt Gram.Entry.t) - and _ = (opt_as_lident : 'opt_as_lident Gram.Entry.t) - and _ = (name_tags : 'name_tags Gram.Entry.t) - and _ = (more_ctyp : 'more_ctyp Gram.Entry.t) - and _ = (module_type_quot : 'module_type_quot Gram.Entry.t) - and _ = (module_type : 'module_type Gram.Entry.t) - and _ = - (module_rec_declaration : 'module_rec_declaration Gram.Entry.t) - and _ = - (module_longident_with_app : - 'module_longident_with_app Gram.Entry.t) - and _ = (module_longident : 'module_longident Gram.Entry.t) - and _ = (module_expr_quot : 'module_expr_quot Gram.Entry.t) - and _ = (module_expr : 'module_expr Gram.Entry.t) - and _ = (module_declaration : 'module_declaration Gram.Entry.t) - and _ = (module_binding_quot : 'module_binding_quot Gram.Entry.t) - and _ = (module_binding0 : 'module_binding0 Gram.Entry.t) - and _ = (module_binding : 'module_binding Gram.Entry.t) - and _ = (meth_decl : 'meth_decl Gram.Entry.t) - and _ = (meth_list : 'meth_list Gram.Entry.t) - and _ = (let_binding : 'let_binding Gram.Entry.t) - and _ = (labeled_ipatt : 'labeled_ipatt Gram.Entry.t) - and _ = (label_patt_list : 'label_patt_list Gram.Entry.t) - and _ = (label_patt : 'label_patt Gram.Entry.t) - and _ = (label_longident : 'label_longident Gram.Entry.t) - and _ = (label_ipatt_list : 'label_ipatt_list Gram.Entry.t) - and _ = (label_ipatt : 'label_ipatt Gram.Entry.t) - and _ = (label_expr_list : 'label_expr_list Gram.Entry.t) - and _ = (label_expr : 'label_expr Gram.Entry.t) - and _ = - (label_declaration_list : 'label_declaration_list Gram.Entry.t) - and _ = (label_declaration : 'label_declaration Gram.Entry.t) - and _ = (label : 'label Gram.Entry.t) - and _ = (ipatt_tcon : 'ipatt_tcon Gram.Entry.t) - and _ = (ipatt : 'ipatt Gram.Entry.t) - and _ = (interf : 'interf Gram.Entry.t) - and _ = (implem : 'implem Gram.Entry.t) - and _ = (ident_quot : 'ident_quot Gram.Entry.t) - and _ = (ident : 'ident Gram.Entry.t) - and _ = (fun_def : 'fun_def Gram.Entry.t) - and _ = (fun_binding : 'fun_binding Gram.Entry.t) - and _ = (field_expr_list : 'field_expr_list Gram.Entry.t) - and _ = (field_expr : 'field_expr Gram.Entry.t) - and _ = (expr_quot : 'expr_quot Gram.Entry.t) - and _ = (expr_eoi : 'expr_eoi Gram.Entry.t) - and _ = (expr : 'expr Gram.Entry.t) - and _ = (eq_expr : 'eq_expr Gram.Entry.t) - and _ = (dummy : 'dummy Gram.Entry.t) - and _ = (direction_flag : 'direction_flag Gram.Entry.t) - and _ = (cvalue_binding : 'cvalue_binding Gram.Entry.t) - and _ = (ctyp_quot : 'ctyp_quot Gram.Entry.t) - and _ = (ctyp : 'ctyp Gram.Entry.t) - and _ = - (constructor_declarations : - 'constructor_declarations Gram.Entry.t) - and _ = - (constructor_declaration : - 'constructor_declaration Gram.Entry.t) - and _ = - (constructor_arg_list : 'constructor_arg_list Gram.Entry.t) - and _ = (constrain : 'constrain Gram.Entry.t) - and _ = - (comma_type_parameter : 'comma_type_parameter Gram.Entry.t) - and _ = (comma_patt : 'comma_patt Gram.Entry.t) - and _ = (comma_ipatt : 'comma_ipatt Gram.Entry.t) - and _ = (comma_expr : 'comma_expr Gram.Entry.t) - and _ = (comma_ctyp : 'comma_ctyp Gram.Entry.t) - and _ = (class_type_quot : 'class_type_quot Gram.Entry.t) - and _ = (class_type_plus : 'class_type_plus Gram.Entry.t) - and _ = - (class_type_longident_and_param : - 'class_type_longident_and_param Gram.Entry.t) - and _ = - (class_type_longident : 'class_type_longident Gram.Entry.t) - and _ = - (class_type_declaration : 'class_type_declaration Gram.Entry.t) - and _ = (class_type : 'class_type Gram.Entry.t) - and _ = (class_structure : 'class_structure Gram.Entry.t) - and _ = (class_str_item_quot : 'class_str_item_quot Gram.Entry.t) - and _ = (class_str_item : 'class_str_item Gram.Entry.t) - and _ = (class_signature : 'class_signature Gram.Entry.t) - and _ = (class_sig_item_quot : 'class_sig_item_quot Gram.Entry.t) - and _ = (class_sig_item : 'class_sig_item Gram.Entry.t) - and _ = - (class_name_and_param : 'class_name_and_param Gram.Entry.t) - and _ = - (class_longident_and_param : - 'class_longident_and_param Gram.Entry.t) - and _ = (class_longident : 'class_longident Gram.Entry.t) - and _ = - (class_info_for_class_type : - 'class_info_for_class_type Gram.Entry.t) - and _ = - (class_info_for_class_expr : - 'class_info_for_class_expr Gram.Entry.t) - and _ = (class_fun_def : 'class_fun_def Gram.Entry.t) - and _ = (class_fun_binding : 'class_fun_binding Gram.Entry.t) - and _ = (class_expr_quot : 'class_expr_quot Gram.Entry.t) - and _ = (class_expr : 'class_expr Gram.Entry.t) - and _ = (class_description : 'class_description Gram.Entry.t) - and _ = (class_declaration : 'class_declaration Gram.Entry.t) - and _ = (binding_quot : 'binding_quot Gram.Entry.t) - and _ = (binding : 'binding Gram.Entry.t) - and _ = (match_case_quot : 'match_case_quot Gram.Entry.t) - and _ = (match_case0 : 'match_case0 Gram.Entry.t) - and _ = (match_case : 'match_case Gram.Entry.t) - and _ = (and_ctyp : 'and_ctyp Gram.Entry.t) - and _ = (amp_ctyp : 'amp_ctyp Gram.Entry.t) - and _ = (a_ident : 'a_ident Gram.Entry.t) - and _ = (a_UIDENT : 'a_UIDENT Gram.Entry.t) - and _ = (a_STRING : 'a_STRING Gram.Entry.t) - and _ = (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t) - and _ = (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t) - and _ = (rec_binding_quot : 'rec_binding_quot Gram.Entry.t) - and _ = (a_LIDENT : 'a_LIDENT Gram.Entry.t) - and _ = (a_LABEL : 'a_LABEL Gram.Entry.t) - and _ = (a_INT64 : 'a_INT64 Gram.Entry.t) - and _ = (a_INT32 : 'a_INT32 Gram.Entry.t) - 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 *) - (* Same remark for ?a:b *) infixop5 : 'infixop5 Gram.Entry.t = - grammar_entry_create "infixop5" - and (* | i = opt_label; "("; p = patt_tcon; ")" -> *) - (* <:patt< ? $i$ : ($p$) >> *) - (* | i = opt_label; "("; p = ipatt_tcon; ")" -> - <:patt< ? $i$ : ($p$) >> - | i = opt_label; "("; p = ipatt_tcon; "="; e = expr; ")" -> - <:patt< ? $i$ : ($p$ = $e$) >> *) - string_list : 'string_list Gram.Entry.t = - grammar_entry_create "string_list" - and opt_override : 'opt_override Gram.Entry.t = - grammar_entry_create "opt_override" - and unquoted_typevars : 'unquoted_typevars Gram.Entry.t = - grammar_entry_create "unquoted_typevars" - and value_val_opt_override : - 'value_val_opt_override Gram.Entry.t = - grammar_entry_create "value_val_opt_override" - and method_opt_override : 'method_opt_override Gram.Entry.t = - grammar_entry_create "method_opt_override" - and module_longident_dot_lparen : - 'module_longident_dot_lparen Gram.Entry.t = - grammar_entry_create "module_longident_dot_lparen" - and optional_type_parameter : - 'optional_type_parameter Gram.Entry.t = - grammar_entry_create "optional_type_parameter" - and fun_def_cont_no_when : 'fun_def_cont_no_when Gram.Entry.t = - grammar_entry_create "fun_def_cont_no_when" - and fun_def_cont : 'fun_def_cont Gram.Entry.t = - grammar_entry_create "fun_def_cont" - and sequence' : 'sequence' Gram.Entry.t = - grammar_entry_create "sequence'" - and infixop6 : 'infixop6 Gram.Entry.t = - grammar_entry_create "infixop6" - in - (Gram.extend (module_expr : 'module_expr Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), None, - [ ([ Gram.Skeyword "struct"; - Gram.Snterm - (Gram.Entry.obj - (str_items : 'str_items Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (st : 'str_items) _ (_loc : Gram.Loc.t) - -> (Ast.MeStr (_loc, st) : 'module_expr)))); - ([ Gram.Skeyword "functor"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword ")"; Gram.Skeyword "->"; Gram. - Sself ], - (Gram.Action.mk - (fun (me : 'module_expr) _ _ - (t : 'module_type) _ (i : 'a_UIDENT) _ _ - (_loc : Gram.Loc.t) -> - (Ast.MeFun (_loc, i, t, me) : 'module_expr)))) ]); - ((Some "apply"), None, - [ ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (me2 : 'module_expr) (me1 : 'module_expr) - (_loc : Gram.Loc.t) -> - (Ast.MeApp (_loc, me1, me2) : 'module_expr)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (package_type : - 'package_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'package_type) _ (e : 'expr) _ _ - (_loc : Gram.Loc.t) -> - (Ast.MePkg (_loc, - (Ast.ExTyc (_loc, e, - (Ast.TyPkg (_loc, p))))) : - 'module_expr)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'expr) _ _ (_loc : Gram.Loc.t) -> - (Ast.MePkg (_loc, e) : 'module_expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (me : 'module_expr) _ - (_loc : Gram.Loc.t) -> (me : 'module_expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (mt : 'module_type) _ - (me : 'module_expr) _ (_loc : Gram.Loc.t) - -> - (Ast.MeTyc (_loc, me, mt) : 'module_expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (module_longident : - 'module_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'module_longident) - (_loc : Gram.Loc.t) -> - (Ast.MeId (_loc, i) : 'module_expr)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.module_expr_tag : - 'module_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "mexp" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"mexp\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "mexp" | "anti" | "list" as n)), - s) -> - (Ast.MeAnt (_loc, - (mk_anti ~c: "module_expr" n s)) : - 'module_expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (str_item : 'str_item Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (Ast.StExp (_loc, e) : 'str_item)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.str_item_tag : - 'str_item) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "stri" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "stri" | "anti" | "list" as n)), - s) -> - (Ast.StAnt (_loc, - (mk_anti ~c: "str_item" n s)) : - 'str_item) - | _ -> assert false))); - ([ Gram.Skeyword "class"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (class_type_declaration : - 'class_type_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ctd : 'class_type_declaration) _ _ - (_loc : Gram.Loc.t) -> - (Ast.StClt (_loc, ctd) : 'str_item)))); - ([ Gram.Skeyword "class"; - Gram.Snterm - (Gram.Entry.obj - (class_declaration : - 'class_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (cd : 'class_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.StCls (_loc, cd) : 'str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_let : 'value_let Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (bi : 'binding) (r : 'opt_rec) _ - (_loc : Gram.Loc.t) -> - (Ast.StVal (_loc, r, bi) : 'str_item)))); - ([ Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (type_declaration : - 'type_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (td : 'type_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.StTyp (_loc, td) : 'str_item)))); - ([ Gram.Skeyword "open"; - 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, i) : 'str_item)))); - ([ Gram.Skeyword "module"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (i : 'a_ident) _ _ - (_loc : Gram.Loc.t) -> - (Ast.StMty (_loc, i, mt) : 'str_item)))); - ([ Gram.Skeyword "module"; Gram.Skeyword "rec"; - Gram.Snterm - (Gram.Entry.obj - (module_binding : - 'module_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mb : 'module_binding) _ _ - (_loc : Gram.Loc.t) -> - (Ast.StRecMod (_loc, mb) : 'str_item)))); - ([ Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (module_binding0 : - 'module_binding0 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mb : 'module_binding0) (i : 'a_UIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.StMod (_loc, i, mb) : 'str_item)))); - ([ Gram.Skeyword "include"; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (_loc : Gram.Loc.t) - -> (Ast.StInc (_loc, me) : 'str_item)))); - ([ Gram.Skeyword "external"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (string_list : 'string_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sl : 'string_list) _ (t : 'ctyp) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.StExt (_loc, i, t, sl) : 'str_item)))); - ([ Gram.Skeyword "exception"; - Gram.Snterm - (Gram.Entry.obj - (constructor_declaration : - 'constructor_declaration Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (type_longident : - 'type_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'type_longident) _ - (t : 'constructor_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.StExc (_loc, t, (Ast.OSome i)) : - 'str_item)))); - ([ Gram.Skeyword "exception"; - Gram.Snterm - (Gram.Entry.obj - (constructor_declaration : - 'constructor_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'constructor_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.StExc (_loc, t, Ast.ONone) : - 'str_item)))) ]) ])) - ()); - Gram.extend (module_binding0 : 'module_binding0 Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (_loc : Gram.Loc.t) - -> (me : 'module_binding0)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (mt : 'module_type) - _ (_loc : Gram.Loc.t) -> - (Ast.MeTyc (_loc, me, mt) : - 'module_binding0)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword ")"; Gram.Sself ], - (Gram.Action.mk - (fun (mb : 'module_binding0) _ - (mt : 'module_type) _ (m : 'a_UIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.MeFun (_loc, m, mt, mb) : - 'module_binding0)))) ]) ])) - ()); - Gram.extend (module_binding : 'module_binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (mt : 'module_type) - _ (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.MbColEq (_loc, m, mt, me) : - 'module_binding)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.module_binding_tag : - 'module_binding) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (mt : 'module_type) - _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), m) -> - (Ast.MbColEq (_loc, (mk_anti n m), mt, - me) : - 'module_binding) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), s) -> - (Ast.MbAnt (_loc, - (mk_anti ~c: "module_binding" n s)) : - 'module_binding) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("module_binding" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"module_binding\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("module_binding" | "anti" | "list" - as n)), - s) -> - (Ast.MbAnt (_loc, - (mk_anti ~c: "module_binding" n s)) : - 'module_binding) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (b2 : 'module_binding) _ - (b1 : 'module_binding) (_loc : Gram.Loc.t) - -> - (Ast.MbAnd (_loc, b1, b2) : - 'module_binding)))) ]) ])) - ()); - Gram.extend (module_type : 'module_type Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), None, - [ ([ Gram.Skeyword "functor"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Sself; - Gram.Skeyword ")"; Gram.Skeyword "->"; Gram. - Sself ], - (Gram.Action.mk - (fun (mt : 'module_type) _ _ - (t : 'module_type) _ (i : 'a_UIDENT) _ _ - (_loc : Gram.Loc.t) -> - (Ast.MtFun (_loc, i, t, mt) : 'module_type)))) ]); - ((Some "with"), None, - [ ([ Gram.Sself; Gram.Skeyword "with"; - Gram.Snterm - (Gram.Entry.obj - (with_constr : 'with_constr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (wc : 'with_constr) _ (mt : 'module_type) - (_loc : Gram.Loc.t) -> - (Ast.MtWit (_loc, mt, wc) : 'module_type)))) ]); - ((Some "apply"), None, - [ ([ Gram.Sself; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj (dummy : 'dummy Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (mt2 : 'module_type) - (mt1 : 'module_type) (_loc : Gram.Loc.t) -> - (module_type_app mt1 mt2 : 'module_type)))) ]); - ((Some "."), None, - [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (mt2 : 'module_type) _ - (mt1 : 'module_type) (_loc : Gram.Loc.t) -> - (module_type_acc mt1 mt2 : 'module_type)))) ]); - ((Some "sig"), None, - [ ([ Gram.Skeyword "sig"; - Gram.Snterm - (Gram.Entry.obj - (sig_items : 'sig_items Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (sg : 'sig_items) _ (_loc : Gram.Loc.t) - -> (Ast.MtSig (_loc, sg) : 'module_type)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "module"; Gram.Skeyword "type"; - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ _ _ - (_loc : Gram.Loc.t) -> - (Ast.MtOf (_loc, me) : 'module_type)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (mt : 'module_type) _ - (_loc : Gram.Loc.t) -> (mt : 'module_type)))); - ([ Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.MtQuo (_loc, i) : 'module_type)))); - ([ Gram.Snterm - (Gram.Entry.obj - (module_longident_with_app : - 'module_longident_with_app Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'module_longident_with_app) - (_loc : Gram.Loc.t) -> - (Ast.MtId (_loc, i) : 'module_type)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.module_type_tag : - 'module_type) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "mtyp" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"mtyp\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "mtyp" | "anti" | "list" as n)), - s) -> - (Ast.MtAnt (_loc, - (mk_anti ~c: "module_type" n s)) : - 'module_type) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (sig_item : 'sig_item Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), None, - [ ([ Gram.Skeyword "class"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (class_type_declaration : - 'class_type_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ctd : 'class_type_declaration) _ _ - (_loc : Gram.Loc.t) -> - (Ast.SgClt (_loc, ctd) : 'sig_item)))); - ([ Gram.Skeyword "class"; - Gram.Snterm - (Gram.Entry.obj - (class_description : - 'class_description Gram.Entry.t)) ], - (Gram.Action.mk - (fun (cd : 'class_description) _ - (_loc : Gram.Loc.t) -> - (Ast.SgCls (_loc, cd) : 'sig_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.SgVal (_loc, i, t) : 'sig_item)))); - ([ Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (type_declaration : - 'type_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'type_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.SgTyp (_loc, t) : 'sig_item)))); - ([ Gram.Skeyword "open"; - Gram.Snterm - (Gram.Entry.obj - (module_longident : - 'module_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'module_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.SgOpn (_loc, i) : 'sig_item)))); - ([ Gram.Skeyword "module"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> - (Ast.SgMty (_loc, i, (Ast.MtNil _loc)) : - 'sig_item)))); - ([ Gram.Skeyword "module"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (i : 'a_ident) _ _ - (_loc : Gram.Loc.t) -> - (Ast.SgMty (_loc, i, mt) : 'sig_item)))); - ([ Gram.Skeyword "module"; Gram.Skeyword "rec"; - Gram.Snterm - (Gram.Entry.obj - (module_rec_declaration : - 'module_rec_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mb : 'module_rec_declaration) _ _ - (_loc : Gram.Loc.t) -> - (Ast.SgRecMod (_loc, mb) : 'sig_item)))); - ([ Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (module_declaration : - 'module_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_declaration) - (i : 'a_UIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.SgMod (_loc, i, mt) : 'sig_item)))); - ([ Gram.Skeyword "include"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (_loc : Gram.Loc.t) - -> (Ast.SgInc (_loc, mt) : 'sig_item)))); - ([ Gram.Skeyword "external"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (string_list : 'string_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sl : 'string_list) _ (t : 'ctyp) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.SgExt (_loc, i, t, sl) : 'sig_item)))); - ([ Gram.Skeyword "exception"; - Gram.Snterm - (Gram.Entry.obj - (constructor_declaration : - 'constructor_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'constructor_declaration) _ - (_loc : Gram.Loc.t) -> - (Ast.SgExc (_loc, t) : 'sig_item)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.sig_item_tag : - 'sig_item) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "sigi" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "sigi" | "anti" | "list" as n)), - s) -> - (Ast.SgAnt (_loc, - (mk_anti ~c: "sig_item" n s)) : - 'sig_item) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (module_declaration : 'module_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword ")"; Gram.Sself ], - (Gram.Action.mk - (fun (mt : 'module_declaration) _ - (t : 'module_type) _ (i : 'a_UIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.MtFun (_loc, i, t, mt) : - 'module_declaration)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (_loc : Gram.Loc.t) - -> (mt : 'module_declaration)))) ]) ])) - ()); - Gram.extend - (module_rec_declaration : - 'module_rec_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (m : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (Ast.MbCol (_loc, m, mt) : - 'module_rec_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.module_binding_tag : - 'module_rec_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "module_binding" | "anti" | - "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"module_binding\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "module_binding" | "anti" | - "list" - as n)), - s) -> - (Ast.MbAnt (_loc, - (mk_anti ~c: "module_binding" n s)) : - 'module_rec_declaration) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (m2 : 'module_rec_declaration) _ - (m1 : 'module_rec_declaration) - (_loc : Gram.Loc.t) -> - (Ast.MbAnd (_loc, m1, m2) : - 'module_rec_declaration)))) ]) ])) - ()); - Gram.extend (with_constr : 'with_constr Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (module_longident : - 'module_longident Gram.Entry.t)); - Gram.Skeyword ":="; - Gram.Snterm - (Gram.Entry.obj - (module_longident_with_app : - 'module_longident_with_app Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i2 : 'module_longident_with_app) _ - (i1 : 'module_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.WcMoS (_loc, i1, i2) : 'with_constr)))); - ([ Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (type_longident_and_parameters : - 'type_longident_and_parameters Gram. - Entry.t)); - Gram.Skeyword ":="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ - (t1 : 'type_longident_and_parameters) _ - (_loc : Gram.Loc.t) -> - (Ast.WcTyS (_loc, t1, t2) : 'with_constr)))); - ([ Gram.Skeyword "type"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")); - Gram.Skeyword ":="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (__camlp4_0 : Gram.Token.t) - _ (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.WcTyS (_loc, - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s))), - t) : - 'with_constr) - | _ -> assert false))); - ([ Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (module_longident : - 'module_longident Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_longident_with_app : - 'module_longident_with_app Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i2 : 'module_longident_with_app) _ - (i1 : 'module_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.WcMod (_loc, i1, i2) : 'with_constr)))); - ([ Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (type_longident_and_parameters : - 'type_longident_and_parameters Gram. - Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ - (t1 : 'type_longident_and_parameters) _ - (_loc : Gram.Loc.t) -> - (Ast.WcTyp (_loc, t1, t2) : 'with_constr)))); - ([ Gram.Skeyword "type"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (__camlp4_0 : Gram.Token.t) - _ (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.WcTyp (_loc, - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s))), - t) : - 'with_constr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.with_constr_tag : - 'with_constr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "with_constr" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"with_constr\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "with_constr" | "anti" | "list" - as n)), - s) -> - (Ast.WcAnt (_loc, - (mk_anti ~c: "with_constr" n s)) : - 'with_constr) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (wc2 : 'with_constr) _ - (wc1 : 'with_constr) (_loc : Gram.Loc.t) -> - (Ast.WcAnd (_loc, wc1, wc2) : 'with_constr)))) ]) ])) - ()); - Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Skeyword "object"; - Gram.Snterm - (Gram.Entry.obj - (opt_class_self_patt : - 'opt_class_self_patt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_structure : - 'class_structure Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (cst : 'class_structure) - (csp : 'opt_class_self_patt) _ - (_loc : Gram.Loc.t) -> - (Ast.ExObj (_loc, csp, cst) : 'expr)))); - ([ Gram.Skeyword "while"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "do"; - Gram.Snterm - (Gram.Entry.obj - (do_sequence : 'do_sequence Gram.Entry.t)) ], - (Gram.Action.mk - (fun (seq : 'do_sequence) _ (e : 'sequence) _ - (_loc : Gram.Loc.t) -> - (Ast.ExWhi (_loc, (mksequence' _loc e), - seq) : - 'expr)))); - ([ Gram.Skeyword "for"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (direction_flag : - 'direction_flag Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "do"; - Gram.Snterm - (Gram.Entry.obj - (do_sequence : 'do_sequence Gram.Entry.t)) ], - (Gram.Action.mk - (fun (seq : 'do_sequence) _ (e2 : 'sequence) - (df : 'direction_flag) (e1 : 'sequence) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.ExFor (_loc, i, (mksequence' _loc e1), - (mksequence' _loc e2), df, seq) : - 'expr)))); - ([ Gram.Skeyword "do"; - Gram.Snterm - (Gram.Entry.obj - (do_sequence : 'do_sequence Gram.Entry.t)) ], - (Gram.Action.mk - (fun (seq : 'do_sequence) _ - (_loc : Gram.Loc.t) -> - (mksequence _loc seq : 'expr)))); - ([ Gram.Skeyword "if"; Gram.Sself; - Gram.Skeyword "then"; Gram.Sself; - Gram.Skeyword "else"; Gram.Sself ], - (Gram.Action.mk - (fun (e3 : 'expr) _ (e2 : 'expr) _ - (e1 : 'expr) _ (_loc : Gram.Loc.t) -> - (Ast.ExIfe (_loc, e1, e2, e3) : 'expr)))); - ([ Gram.Skeyword "try"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "with"; - Gram.Snterm - (Gram.Entry.obj - (match_case : 'match_case Gram.Entry.t)) ], - (Gram.Action.mk - (fun (a : 'match_case) _ (e : 'sequence) _ - (_loc : Gram.Loc.t) -> - (Ast.ExTry (_loc, (mksequence' _loc e), a) : - 'expr)))); - ([ Gram.Skeyword "match"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "with"; - Gram.Snterm - (Gram.Entry.obj - (match_case : 'match_case Gram.Entry.t)) ], - (Gram.Action.mk - (fun (a : 'match_case) _ (e : 'sequence) _ - (_loc : Gram.Loc.t) -> - (Ast.ExMat (_loc, (mksequence' _loc e), a) : - 'expr)))); - ([ Gram.Skeyword "fun"; - Gram.Snterm - (Gram.Entry.obj - (fun_def : 'fun_def Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_def) _ (_loc : Gram.Loc.t) -> - (e : 'expr)))); - ([ Gram.Skeyword "fun"; Gram.Skeyword "["; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (match_case0 : - 'match_case0 Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (a : 'match_case0 list) _ _ - (_loc : Gram.Loc.t) -> - (Ast.ExFun (_loc, (Ast.mcOr_of_list a)) : - 'expr)))); - ([ Gram.Skeyword "let"; Gram.Skeyword "open"; - 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, e) : 'expr)))); - ([ Gram.Skeyword "let"; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (module_binding0 : - 'module_binding0 Gram.Entry.t)); - Gram.Skeyword "in"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (mb : 'module_binding0) - (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) -> - (Ast.ExLmd (_loc, m, mb, e) : 'expr)))); - ([ Gram.Skeyword "let"; - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)); - Gram.Skeyword "in"; Gram.Sself ], - (Gram.Action.mk - (fun (x : 'expr) _ (bi : 'binding) - (r : 'opt_rec) _ (_loc : Gram.Loc.t) -> - (Ast.ExLet (_loc, r, bi, x) : 'expr)))) ]); - ((Some "where"), None, - [ ([ Gram.Sself; Gram.Skeyword "where"; - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (let_binding : 'let_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (lb : 'let_binding) (rf : 'opt_rec) _ - (e : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExLet (_loc, rf, lb, e) : 'expr)))) ]); - ((Some ":="), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Sself; Gram.Skeyword ":="; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj (dummy : 'dummy Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (match bigarray_set _loc e1 e2 with - | Some e -> e - | None -> Ast.ExAss (_loc, e1, e2) : - 'expr)))) ]); - ((Some "||"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop6 : 'infixop6 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop6) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))) ]); - ((Some "&&"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop5 : 'infixop5 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop5) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))) ]); - ((Some "<"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop0 : 'infixop0 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop0) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))) ]); - ((Some "^"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop1 : 'infixop1 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop1) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))) ]); - ((Some "+"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop2 : 'infixop2 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop2) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))) ]); - ((Some "*"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop3 : 'infixop3 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop3) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "mod"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "mod")))), - e1)), - e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "lxor"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "lxor")))), - e1)), - e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "lor"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "lor")))), - e1)), - e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "land"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "land")))), - e1)), - e2) : - 'expr)))) ]); - ((Some "**"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (infixop4 : 'infixop4 Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (op : 'infixop4) - (e1 : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, op, e1)), e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "lsr"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "lsr")))), - e1)), - e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "lsl"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "lsl")))), - e1)), - e2) : - 'expr)))); - ([ Gram.Sself; Gram.Skeyword "asr"; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "asr")))), - e1)), - e2) : - 'expr)))) ]); - ((Some "unary minus"), - (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Skeyword "-."; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (mkumin _loc "-." e : 'expr)))); - ([ Gram.Skeyword "-"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (mkumin _loc "-" e : 'expr)))) ]); - ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "lazy"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (Ast.ExLaz (_loc, e) : 'expr)))); - ([ Gram.Skeyword "new"; - Gram.Snterm - (Gram.Entry.obj - (class_longident : - 'class_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'class_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.ExNew (_loc, i) : 'expr)))); - ([ Gram.Skeyword "assert"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (mkassert _loc e : 'expr)))); - ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, e1, e2) : 'expr)))) ]); - ((Some "label"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Skeyword "?"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.ExOlb (_loc, i, (Ast.ExNil _loc)) : - 'expr)))); - ([ Gram.Skeyword "?"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.ExOlb (_loc, i, e) : 'expr)))); - ([ Gram.Stoken - (((function | OPTLABEL _ -> true | _ -> false), - "OPTLABEL _")); - Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | OPTLABEL i -> - (Ast.ExOlb (_loc, i, e) : 'expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function | LABEL _ -> true | _ -> false), - "LABEL _")); - Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LABEL i -> - (Ast.ExLab (_loc, i, e) : 'expr) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.ExLab (_loc, i, (Ast.ExNil _loc)) : - 'expr)))); - ([ Gram.Skeyword "~"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.ExLab (_loc, i, e) : 'expr)))) ]); - ((Some "."), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)) ], - (Gram.Action.mk - (fun (lab : 'label) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExSnd (_loc, e, lab) : 'expr)))); - ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExAcc (_loc, e1, e2) : 'expr)))); - ([ Gram.Sself; Gram.Skeyword "."; - Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (comma_expr : 'comma_expr Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (e2 : 'comma_expr) _ _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (bigarray_get _loc e1 e2 : 'expr)))); - ([ Gram.Sself; Gram.Skeyword "."; - Gram.Skeyword "["; Gram.Sself; - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (e2 : 'expr) _ _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExSte (_loc, e1, e2) : 'expr)))); - ([ Gram.Sself; Gram.Skeyword "."; - Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e2 : 'expr) _ _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExAre (_loc, e1, e2) : 'expr)))) ]); - ((Some "~-"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (prefixop : 'prefixop Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) (f : 'prefixop) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, f, e) : 'expr)))); - ([ Gram.Skeyword "!"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (Ast.ExAcc (_loc, e, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "val"))))) : - 'expr)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (package_type : - 'package_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (pt : 'package_type) _ - (me : 'module_expr) _ _ (_loc : Gram.Loc.t) - -> - (Ast.ExPkg (_loc, - (Ast.MeTyc (_loc, me, pt))) : - 'expr)))); - ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (me : 'module_expr) _ _ - (_loc : Gram.Loc.t) -> - (Ast.ExPkg (_loc, me) : 'expr)))); - ([ Gram.Skeyword "begin"; Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : - 'expr)))); - ([ Gram.Skeyword "begin"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (seq : 'sequence) _ (_loc : Gram.Loc.t) - -> (mksequence _loc seq : 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> - (e : 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":>"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (e : 'expr) _ - (_loc : Gram.Loc.t) -> - (Ast.ExCoe (_loc, e, (Ast.TyNil _loc), t) : - 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ":>"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t2 : 'ctyp) _ (t : 'ctyp) _ - (e : 'expr) _ (_loc : Gram.Loc.t) -> - (Ast.ExCoe (_loc, e, t, t2) : 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ";"; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ _ (e : 'expr) _ (_loc : Gram.Loc.t) -> - (mksequence _loc e : 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (seq : 'sequence) _ (e : 'expr) _ - (_loc : Gram.Loc.t) -> - (mksequence _loc (Ast.ExSem (_loc, e, seq)) : - 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_expr : 'comma_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (el : 'comma_expr) _ (e : 'expr) _ - (_loc : Gram.Loc.t) -> - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, e, el))) : - 'expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (e : 'expr) _ - (_loc : Gram.Loc.t) -> - (Ast.ExTyc (_loc, e, t) : 'expr)))); - ([ Gram.Skeyword "("; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : - 'expr)))); - ([ Gram.Skeyword "{<"; - Gram.Snterm - (Gram.Entry.obj - (field_expr_list : - 'field_expr_list Gram.Entry.t)); - Gram.Skeyword ">}" ], - (Gram.Action.mk - (fun _ (fel : 'field_expr_list) _ - (_loc : Gram.Loc.t) -> - (Ast.ExOvr (_loc, fel) : 'expr)))); - ([ Gram.Skeyword "{<"; Gram.Skeyword ">}" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.ExOvr (_loc, (Ast.RbNil _loc)) : - 'expr)))); - ([ Gram.Skeyword "{"; Gram.Skeyword "("; Gram. - Sself; Gram.Skeyword ")"; Gram.Skeyword "with"; - Gram.Snterm - (Gram.Entry.obj - (label_expr_list : - 'label_expr_list Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (el : 'label_expr_list) _ _ (e : 'expr) - _ _ (_loc : Gram.Loc.t) -> - (Ast.ExRec (_loc, el, e) : 'expr)))); - ([ Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (label_expr_list : - 'label_expr_list Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (el : 'label_expr_list) _ - (_loc : Gram.Loc.t) -> - (Ast.ExRec (_loc, el, (Ast.ExNil _loc)) : - 'expr)))); - ([ Gram.Skeyword "[|"; - Gram.Snterm - (Gram.Entry.obj - (sem_expr : 'sem_expr Gram.Entry.t)); - Gram.Skeyword "|]" ], - (Gram.Action.mk - (fun _ (el : 'sem_expr) _ (_loc : Gram.Loc.t) - -> (Ast.ExArr (_loc, el) : 'expr)))); - ([ Gram.Skeyword "[|"; Gram.Skeyword "|]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.ExArr (_loc, (Ast.ExNil _loc)) : - 'expr)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : - 'sem_expr_for_list Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (mk_list : 'sem_expr_for_list) _ - (_loc : Gram.Loc.t) -> - (mk_list - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "[]")))) : - 'expr)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : - 'sem_expr_for_list Gram.Entry.t)); - Gram.Skeyword "::"; Gram.Sself; - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (last : 'expr) _ - (mk_list : 'sem_expr_for_list) _ - (_loc : Gram.Loc.t) -> - (mk_list last : 'expr)))); - ([ Gram.Skeyword "["; Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))) : - 'expr)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.ExVrn (_loc, s) : 'expr)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (val_longident : - 'val_longident Gram.Entry.t))) ], - (Gram.Action.mk - (fun (i : 'val_longident) (_loc : Gram.Loc.t) - -> (Ast.ExId (_loc, i) : 'expr)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (module_longident_dot_lparen : - 'module_longident_dot_lparen Gram. - Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'sequence) - (i : 'module_longident_dot_lparen) - (_loc : Gram.Loc.t) -> - (Ast.ExOpI (_loc, i, e) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_CHAR : 'a_CHAR Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_CHAR) (_loc : Gram.Loc.t) -> - (Ast.ExChr (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_STRING : 'a_STRING Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_STRING) (_loc : Gram.Loc.t) -> - (Ast.ExStr (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_FLOAT) (_loc : Gram.Loc.t) -> - (Ast.ExFlo (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_NATIVEINT) (_loc : Gram.Loc.t) -> - (Ast.ExNativeInt (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_INT64 : 'a_INT64 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT64) (_loc : Gram.Loc.t) -> - (Ast.ExInt64 (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_INT32 : 'a_INT32 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT32) (_loc : Gram.Loc.t) -> - (Ast.ExInt32 (_loc, s) : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT) (_loc : Gram.Loc.t) -> - (Ast.ExInt (_loc, s) : 'expr)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("seq", _) -> true - | _ -> false), - "ANTIQUOT (\"seq\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("seq" as n)), s) -> - (Ast.ExSeq (_loc, - (Ast.ExAnt (_loc, - (mk_anti ~c: "expr" n s)))) : - 'expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("tup", _) -> true - | _ -> false), - "ANTIQUOT (\"tup\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("tup" as n)), s) -> - (Ast.ExTup (_loc, - (Ast.ExAnt (_loc, - (mk_anti ~c: "expr" n s)))) : - 'expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("`bool", _) -> true - | _ -> false), - "ANTIQUOT (\"`bool\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("`bool" as n)), s) -> - (Ast.ExId (_loc, - (Ast.IdAnt (_loc, (mk_anti n s)))) : - 'expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("exp" | "" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"exp\" | \"\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("exp" | "" | "anti" as n)), - s) -> - (Ast.ExAnt (_loc, - (mk_anti ~c: "expr" n s)) : - 'expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.expr_tag : - 'expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (do_sequence : 'do_sequence Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "done" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : - 'do_sequence)))); - ([ Gram.Stry - (Gram.srules do_sequence - [ ([ Gram.Snterm - (Gram.Entry.obj - (sequence : - 'sequence Gram.Entry.t)); - Gram.Skeyword "done" ], - (Gram.Action.mk - (fun _ (seq : 'sequence) - (_loc : Gram.Loc.t) -> - (seq : 'e__3)))) ]) ], - (Gram.Action.mk - (fun (seq : 'e__3) (_loc : Gram.Loc.t) -> - (seq : 'do_sequence)))); - ([ Gram.Stry - (Gram.srules do_sequence - [ ([ Gram.Skeyword "{"; Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (() : 'e__2)))) ]) ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : - 'do_sequence)))); - ([ Gram.Stry - (Gram.srules do_sequence - [ ([ Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (sequence : - 'sequence Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (seq : 'sequence) _ - (_loc : Gram.Loc.t) -> - (seq : 'e__1)))) ]) ], - (Gram.Action.mk - (fun (seq : 'e__1) (_loc : Gram.Loc.t) -> - (seq : 'do_sequence)))) ]) ])) - ()); - Gram.extend (infixop5 : 'infixop5 Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.srules infixop5 - [ ([ Gram.Skeyword "&&" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : - 'e__4)))); - ([ Gram.Skeyword "&" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : - 'e__4)))) ] ], - (Gram.Action.mk - (fun (x : 'e__4) (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdLid (_loc, x))) : - 'infixop5)))) ]) ])) - ()); - Gram.extend (infixop6 : 'infixop6 Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.srules infixop6 - [ ([ Gram.Skeyword "||" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : - 'e__5)))); - ([ Gram.Skeyword "or" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : - 'e__5)))) ] ], - (Gram.Action.mk - (fun (x : 'e__5) (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdLid (_loc, x))) : - 'infixop6)))) ]) ])) - ()); - Gram.extend - (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - acc) : - 'sem_expr_for_list)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (e : 'expr) (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - acc) : - 'sem_expr_for_list)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (el : 'sem_expr_for_list) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - (el acc)) : - 'sem_expr_for_list)))) ]) ])) - ()); - Gram.extend (comma_expr : 'comma_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top") ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (e : 'comma_expr)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.ExAnt (_loc, - (mk_anti ~c: "expr," n s)) : - 'comma_expr) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (e2 : 'comma_expr) _ (e1 : 'comma_expr) - (_loc : Gram.Loc.t) -> - (Ast.ExCom (_loc, e1, e2) : 'comma_expr)))) ]) ])) - ()); - Gram.extend (dummy : 'dummy Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> (() : 'dummy)))) ]) ])) - ()); - Gram.extend (sequence' : 'sequence' Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)) ], - (Gram.Action.mk - (fun (el : 'sequence) _ (_loc : Gram.Loc.t) -> - (fun e -> Ast.ExSem (_loc, e, el) : - 'sequence')))); - ([ Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (fun e -> e : 'sequence')))); - ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (fun e -> e : 'sequence')))) ]) ])) - ()); - Gram.extend (sequence : 'sequence Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (sequence' : 'sequence' Gram.Entry.t)) ], - (Gram.Action.mk - (fun (k : 'sequence') (e : 'expr) - (_loc : Gram.Loc.t) -> (k e : 'sequence)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.ExAnt (_loc, - (mk_anti ~c: "expr;" n s)) : - 'sequence) - | _ -> assert false))); - ([ Gram.Skeyword "let"; Gram.Skeyword "open"; - 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, e) : 'sequence)))); - ([ Gram.Skeyword "let"; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (module_binding0 : - 'module_binding0 Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (el : 'sequence) _ - (mb : 'module_binding0) (m : 'a_UIDENT) _ _ - (_loc : Gram.Loc.t) -> - (Ast.ExLmd (_loc, m, mb, - (mksequence _loc el)) : - 'sequence)))); - ([ Gram.Skeyword "let"; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (module_binding0 : - 'module_binding0 Gram.Entry.t)); - Gram.Skeyword "in"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (sequence' : 'sequence' Gram.Entry.t)) ], - (Gram.Action.mk - (fun (k : 'sequence') (e : 'expr) _ - (mb : 'module_binding0) (m : 'a_UIDENT) _ _ - (_loc : Gram.Loc.t) -> - (k (Ast.ExLmd (_loc, m, mb, e)) : - 'sequence)))); - ([ Gram.Skeyword "let"; - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (el : 'sequence) _ (bi : 'binding) - (rf : 'opt_rec) _ (_loc : Gram.Loc.t) -> - (Ast.ExLet (_loc, rf, bi, - (mksequence _loc el)) : - 'sequence)))); - ([ Gram.Skeyword "let"; - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)); - Gram.Skeyword "in"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (sequence' : 'sequence' Gram.Entry.t)) ], - (Gram.Action.mk - (fun (k : 'sequence') (e : 'expr) _ - (bi : 'binding) (rf : 'opt_rec) _ - (_loc : Gram.Loc.t) -> - (k (Ast.ExLet (_loc, rf, bi, e)) : - 'sequence)))) ]) ])) - ()); - Gram.extend (binding : 'binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (let_binding : 'let_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (b : 'let_binding) (_loc : Gram.Loc.t) -> - (b : 'binding)))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (b2 : 'binding) _ (b1 : 'binding) - (_loc : Gram.Loc.t) -> - (Ast.BiAnd (_loc, b1, b2) : 'binding)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.BiAnt (_loc, - (mk_anti ~c: "binding" n s)) : - 'binding) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.BiEq (_loc, - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s))), - e) : - 'binding) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("binding" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"binding\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("binding" | "list" as n)), s) - -> - (Ast.BiAnt (_loc, - (mk_anti ~c: "binding" n s)) : - 'binding) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (let_binding : 'let_binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (fun_binding : 'fun_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_binding) (p : 'ipatt) - (_loc : Gram.Loc.t) -> - (Ast.BiEq (_loc, p, e) : 'let_binding)))) ]) ])) - ()); - Gram.extend (fun_binding : 'fun_binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (cvalue_binding : - 'cvalue_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (bi : 'cvalue_binding) - (_loc : Gram.Loc.t) -> (bi : 'fun_binding)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t))); - Gram.Sself ], - (Gram.Action.mk - (fun (e : 'fun_binding) (p : 'labeled_ipatt) - (_loc : Gram.Loc.t) -> - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), - e))) : - 'fun_binding)))); - ([ Gram.Stry - (Gram.srules fun_binding - [ ([ Gram.Skeyword "("; - Gram.Skeyword "type" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (() : 'e__6)))) ]); - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ")"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'fun_binding) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.ExFUN (_loc, i, e) : 'fun_binding)))) ]) ])) - ()); - Gram.extend (match_case : 'match_case Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (p : 'ipatt) - (_loc : Gram.Loc.t) -> - (Ast.McArr (_loc, p, (Ast.ExNil _loc), e) : - 'match_case)))); - ([ Gram.Skeyword "["; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (match_case0 : - 'match_case0 Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (l : 'match_case0 list) _ - (_loc : Gram.Loc.t) -> - (Ast.mcOr_of_list l : 'match_case)))) ]) ])) - ()); - Gram.extend (match_case0 : 'match_case0 Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (patt_as_patt_opt : - 'patt_as_patt_opt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_when_expr : - 'opt_when_expr Gram.Entry.t)); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (w : 'opt_when_expr) - (p : 'patt_as_patt_opt) (_loc : Gram.Loc.t) - -> - (Ast.McArr (_loc, p, w, e) : 'match_case0)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")); - Gram.Skeyword "when"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (w : 'expr) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.McArr (_loc, - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s))), - w, e) : - 'match_case0) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.McArr (_loc, - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s))), - (Ast.ExNil _loc), e) : - 'match_case0) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.McAnt (_loc, - (mk_anti ~c: "match_case" n s)) : - 'match_case0) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("match_case" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"match_case\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("match_case" | "list" as n)), - s) -> - (Ast.McAnt (_loc, - (mk_anti ~c: "match_case" n s)) : - 'match_case0) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (opt_when_expr : 'opt_when_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.ExNil _loc : 'opt_when_expr)))); - ([ Gram.Skeyword "when"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (w : 'expr) _ (_loc : Gram.Loc.t) -> - (w : 'opt_when_expr)))) ]) ])) - ()); - Gram.extend - (patt_as_patt_opt : 'patt_as_patt_opt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (p : 'patt_as_patt_opt)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword "as"; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p2 : 'patt) _ (p1 : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaAli (_loc, p1, p2) : - 'patt_as_patt_opt)))) ]) ])) - ()); - Gram.extend (label_expr_list : 'label_expr_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_expr : 'label_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (b1 : 'label_expr) (_loc : Gram.Loc.t) -> - (b1 : 'label_expr_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_expr : 'label_expr Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (b1 : 'label_expr) (_loc : Gram.Loc.t) - -> (b1 : 'label_expr_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_expr : 'label_expr Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (b2 : 'label_expr_list) _ - (b1 : 'label_expr) (_loc : Gram.Loc.t) -> - (Ast.RbSem (_loc, b1, b2) : - 'label_expr_list)))) ]) ])) - ()); - Gram.extend (label_expr : 'label_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'label_longident) - (_loc : Gram.Loc.t) -> - (Ast.RbEq (_loc, i, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, (lid_of_ident i)))))) : - 'label_expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (fun_binding : 'fun_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_binding) (i : 'label_longident) - (_loc : Gram.Loc.t) -> - (Ast.RbEq (_loc, i, e) : 'label_expr)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.RbAnt (_loc, - (mk_anti ~c: "rec_binding" n s)) : - 'label_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.RbEq (_loc, - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s))), - e) : - 'label_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "anti" as n)), s) -> - (Ast.RbAnt (_loc, - (mk_anti ~c: "rec_binding" n s)) : - 'label_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("rec_binding", _) -> true - | _ -> false), - "ANTIQUOT (\"rec_binding\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("rec_binding" as n)), s) -> - (Ast.RbAnt (_loc, - (mk_anti ~c: "rec_binding" n s)) : - 'label_expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (fun_def : 'fun_def Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (fun_def_cont : - 'fun_def_cont Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((w, e) : 'fun_def_cont) - (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, w, e))) : - 'fun_def)))); - ([ Gram.Stry - (Gram.srules fun_def - [ ([ Gram.Skeyword "("; - Gram.Skeyword "type" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (() : 'e__7)))) ]); - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ")"; - Gram.Snterm - (Gram.Entry.obj - (fun_def_cont_no_when : - 'fun_def_cont_no_when Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_def_cont_no_when) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.ExFUN (_loc, i, e) : 'fun_def)))) ]) ])) - ()); - Gram.extend (fun_def_cont : 'fun_def_cont Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (((Ast.ExNil _loc), e) : 'fun_def_cont)))); - ([ Gram.Skeyword "when"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (w : 'expr) _ - (_loc : Gram.Loc.t) -> - ((w, e) : 'fun_def_cont)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t))); - Gram.Sself ], - (Gram.Action.mk - (fun ((w, e) : 'fun_def_cont) - (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> - (((Ast.ExNil _loc), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, w, e))))) : - 'fun_def_cont)))); - ([ Gram.Stry - (Gram.srules fun_def_cont - [ ([ Gram.Skeyword "("; - Gram.Skeyword "type" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (() : 'e__8)))) ]); - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ")"; - Gram.Snterm - (Gram.Entry.obj - (fun_def_cont_no_when : - 'fun_def_cont_no_when Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_def_cont_no_when) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (((Ast.ExNil _loc), - (Ast.ExFUN (_loc, i, e))) : - 'fun_def_cont)))) ]) ])) - ()); - Gram.extend - (fun_def_cont_no_when : 'fun_def_cont_no_when Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (e : 'fun_def_cont_no_when)))); - ([ Gram.Stry - (Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (fun_def_cont : - 'fun_def_cont Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((w, e) : 'fun_def_cont) - (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, w, e))) : - 'fun_def_cont_no_when)))); - ([ Gram.Stry - (Gram.srules fun_def_cont_no_when - [ ([ Gram.Skeyword "("; - Gram.Skeyword "type" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (() : 'e__9)))) ]); - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ")"; Gram.Sself ], - (Gram.Action.mk - (fun (e : 'fun_def_cont_no_when) _ - (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (Ast.ExFUN (_loc, i, e) : - 'fun_def_cont_no_when)))) ]) ])) - ()); - Gram.extend (patt : 'patt Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "|"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'patt) _ (p1 : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaOrp (_loc, p1, p2) : 'patt)))) ]); - ((Some ".."), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Sself; Gram.Skeyword ".."; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'patt) _ (p1 : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaRng (_loc, p1, p2) : 'patt)))) ]); - ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "lazy"; Gram.Sself ], - (Gram.Action.mk - (fun (p : 'patt) _ (_loc : Gram.Loc.t) -> - (Ast.PaLaz (_loc, p) : 'patt)))); - ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'patt) (p1 : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaApp (_loc, p1, p2) : 'patt)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "?"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (patt_tcon : 'patt_tcon Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'expr) _ (p : 'patt_tcon) _ _ - (_loc : Gram.Loc.t) -> - (Ast.PaOlbi (_loc, "", p, e) : 'patt)))); - ([ Gram.Skeyword "?"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (patt_tcon : 'patt_tcon Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'patt_tcon) _ _ - (_loc : Gram.Loc.t) -> - (Ast.PaOlb (_loc, "", p) : 'patt)))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaOlb (_loc, (mk_anti n i), - (Ast.PaNil _loc)) : - 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function | LIDENT _ -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT i -> - (Ast.PaOlb (_loc, i, (Ast.PaNil _loc)) : - 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")); - Gram.Skeyword ":"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (patt_tcon : 'patt_tcon Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (eq_expr : 'eq_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (f : 'eq_expr) (p : 'patt_tcon) _ _ - (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (f (mk_anti n i) p : 'patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function | OPTLABEL _ -> true | _ -> false), - "OPTLABEL _")); - Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (patt_tcon : 'patt_tcon Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (eq_expr : 'eq_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (f : 'eq_expr) (p : 'patt_tcon) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | OPTLABEL i -> (f i p : 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function | LIDENT _ -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT i -> - (Ast.PaLab (_loc, i, (Ast.PaNil _loc)) : - 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaLab (_loc, (mk_anti n i), - (Ast.PaNil _loc)) : - 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (p : 'patt) _ (__camlp4_0 : Gram.Token.t) - _ (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaLab (_loc, (mk_anti n i), p) : - 'patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function | LABEL _ -> true | _ -> false), - "LABEL _")); - Gram.Sself ], - (Gram.Action.mk - (fun (p : 'patt) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LABEL i -> - (Ast.PaLab (_loc, i, p) : 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (type_longident : - 'type_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'type_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTyp (_loc, i) : 'patt)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.PaVrn (_loc, s) : 'patt)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.patt_tag : - 'patt) - | _ -> assert false))); - ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.PaAny _loc : 'patt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_patt : 'comma_patt Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (pl : 'comma_patt) _ (p : 'patt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTup (_loc, - (Ast.PaCom (_loc, p, pl))) : - 'patt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword "as"; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p2 : 'patt) _ (p : 'patt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaAli (_loc, p, p2) : 'patt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (p : 'patt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, p, t) : 'patt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'patt) _ (_loc : Gram.Loc.t) -> - (p : 'patt)))); - ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (package_type : - 'package_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (pt : 'package_type) _ (m : 'a_UIDENT) - _ _ (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, (Ast.PaMod (_loc, m)), - (Ast.TyPkg (_loc, pt))) : - 'patt)))); - ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) - -> (Ast.PaMod (_loc, m) : 'patt)))); - ([ Gram.Skeyword "("; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, (Ast.IdUid (_loc, "()"))) : - 'patt)))); - ([ Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (label_patt_list : - 'label_patt_list Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (pl : 'label_patt_list) _ - (_loc : Gram.Loc.t) -> - (Ast.PaRec (_loc, pl) : 'patt)))); - ([ Gram.Skeyword "[|"; - Gram.Snterm - (Gram.Entry.obj - (sem_patt : 'sem_patt Gram.Entry.t)); - Gram.Skeyword "|]" ], - (Gram.Action.mk - (fun _ (pl : 'sem_patt) _ (_loc : Gram.Loc.t) - -> (Ast.PaArr (_loc, pl) : 'patt)))); - ([ Gram.Skeyword "[|"; Gram.Skeyword "|]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.PaArr (_loc, (Ast.PaNil _loc)) : - 'patt)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_patt_for_list : - 'sem_patt_for_list Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (mk_list : 'sem_patt_for_list) _ - (_loc : Gram.Loc.t) -> - (mk_list - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "[]")))) : - 'patt)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_patt_for_list : - 'sem_patt_for_list Gram.Entry.t)); - Gram.Skeyword "::"; Gram.Sself; - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (last : 'patt) _ - (mk_list : 'sem_patt_for_list) _ - (_loc : Gram.Loc.t) -> - (mk_list last : 'patt)))); - ([ Gram.Skeyword "["; Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, (Ast.IdUid (_loc, "[]"))) : - 'patt)))); - ([ Gram.Skeyword "-"; - Gram.Snterm - (Gram.Entry.obj - (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_FLOAT) _ (_loc : Gram.Loc.t) -> - (Ast.PaFlo (_loc, (neg_string s)) : 'patt)))); - ([ Gram.Skeyword "-"; - Gram.Snterm - (Gram.Entry.obj - (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_NATIVEINT) _ (_loc : Gram.Loc.t) - -> - (Ast.PaNativeInt (_loc, (neg_string s)) : - 'patt)))); - ([ Gram.Skeyword "-"; - Gram.Snterm - (Gram.Entry.obj - (a_INT64 : 'a_INT64 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT64) _ (_loc : Gram.Loc.t) -> - (Ast.PaInt64 (_loc, (neg_string s)) : - 'patt)))); - ([ Gram.Skeyword "-"; - Gram.Snterm - (Gram.Entry.obj - (a_INT32 : 'a_INT32 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT32) _ (_loc : Gram.Loc.t) -> - (Ast.PaInt32 (_loc, (neg_string s)) : - 'patt)))); - ([ Gram.Skeyword "-"; - Gram.Snterm - (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT) _ (_loc : Gram.Loc.t) -> - (Ast.PaInt (_loc, (neg_string s)) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_CHAR : 'a_CHAR Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_CHAR) (_loc : Gram.Loc.t) -> - (Ast.PaChr (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_STRING : 'a_STRING Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_STRING) (_loc : Gram.Loc.t) -> - (Ast.PaStr (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_FLOAT : 'a_FLOAT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_FLOAT) (_loc : Gram.Loc.t) -> - (Ast.PaFlo (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_NATIVEINT) (_loc : Gram.Loc.t) -> - (Ast.PaNativeInt (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_INT64 : 'a_INT64 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT64) (_loc : Gram.Loc.t) -> - (Ast.PaInt64 (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_INT32 : 'a_INT32 Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT32) (_loc : Gram.Loc.t) -> - (Ast.PaInt32 (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj (a_INT : 'a_INT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_INT) (_loc : Gram.Loc.t) -> - (Ast.PaInt (_loc, s) : 'patt)))); - ([ Gram.Snterm - (Gram.Entry.obj (ident : 'ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'ident) (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, i) : 'patt)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("`bool", _) -> true - | _ -> false), - "ANTIQUOT (\"`bool\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("`bool" as n)), s) -> - (Ast.PaId (_loc, - (Ast.IdAnt (_loc, (mk_anti n s)))) : - 'patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("tup", _) -> true - | _ -> false), - "ANTIQUOT (\"tup\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("tup" as n)), s) -> - (Ast.PaTup (_loc, - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)))) : - 'patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "pat" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "pat" | "anti" as n)), - s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)) : - 'patt) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (comma_patt : 'comma_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (p : 'comma_patt)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt," n s)) : - 'comma_patt) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'comma_patt) _ (p1 : 'comma_patt) - (_loc : Gram.Loc.t) -> - (Ast.PaCom (_loc, p1, p2) : 'comma_patt)))) ]) ])) - ()); - Gram.extend (sem_patt : 'sem_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (p : 'sem_patt)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (p : 'patt) (_loc : Gram.Loc.t) -> - (p : 'sem_patt)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt;" n s)) : - 'sem_patt) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'sem_patt) _ (p1 : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, p1, p2) : 'sem_patt)))) ]) ])) - ()); - Gram.extend - (sem_patt_for_list : 'sem_patt_for_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "::")))), - p)), - acc) : - 'sem_patt_for_list)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (p : 'patt) (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "::")))), - p)), - acc) : - 'sem_patt_for_list)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (pl : 'sem_patt_for_list) _ (p : 'patt) - (_loc : Gram.Loc.t) -> - (fun acc -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "::")))), - p)), - (pl acc)) : - 'sem_patt_for_list)))) ]) ])) - ()); - Gram.extend (label_patt_list : 'label_patt_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_patt : 'label_patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p1 : 'label_patt) (_loc : Gram.Loc.t) -> - (p1 : 'label_patt_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_patt : 'label_patt Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (p1 : 'label_patt) (_loc : Gram.Loc.t) - -> (p1 : 'label_patt_list)))); - ([ 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) _ - (p1 : 'label_patt) (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, p1, p2) : - 'label_patt_list)))) ]) ])) - ()); - Gram.extend (label_patt : 'label_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'label_longident) - (_loc : Gram.Loc.t) -> - (Ast.PaEq (_loc, i, - (Ast.PaId (_loc, - (Ast.IdLid (_loc, (lid_of_ident i)))))) : - 'label_patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) _ (i : 'label_longident) - (_loc : Gram.Loc.t) -> - (Ast.PaEq (_loc, i, p) : 'label_patt)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt;" n s)) : - 'label_patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.patt_tag : - 'label_patt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "pat" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "pat" | "anti" as n)), - s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)) : - 'label_patt) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (ipatt : 'ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.PaAny _loc : 'ipatt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, (Ast.IdLid (_loc, s))) : - 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_ipatt : 'comma_ipatt Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (pl : 'comma_ipatt) _ (p : 'ipatt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTup (_loc, - (Ast.PaCom (_loc, p, pl))) : - 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword "as"; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p2 : 'ipatt) _ (p : 'ipatt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaAli (_loc, p, p2) : 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (p : 'ipatt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, p, t) : 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'ipatt) _ (_loc : Gram.Loc.t) -> - (p : 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (package_type : - 'package_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (pt : 'package_type) _ (m : 'a_UIDENT) - _ _ (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, (Ast.PaMod (_loc, m)), - (Ast.TyPkg (_loc, pt))) : - 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (m : 'a_UIDENT) _ _ (_loc : Gram.Loc.t) - -> (Ast.PaMod (_loc, m) : 'ipatt)))); - ([ Gram.Skeyword "("; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, (Ast.IdUid (_loc, "()"))) : - 'ipatt)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.patt_tag : - 'ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("tup", _) -> true - | _ -> false), - "ANTIQUOT (\"tup\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("tup" as n)), s) -> - (Ast.PaTup (_loc, - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)))) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "pat" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "pat" | "anti" as n)), - s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (label_ipatt_list : - 'label_ipatt_list Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (pl : 'label_ipatt_list) _ - (_loc : Gram.Loc.t) -> - (Ast.PaRec (_loc, pl) : 'ipatt)))) ]) ])) - ()); - Gram.extend (labeled_ipatt : 'labeled_ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> - (p : 'labeled_ipatt)))) ]) ])) - ()); - Gram.extend (comma_ipatt : 'comma_ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> - (p : 'comma_ipatt)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt," n s)) : - 'comma_ipatt) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'comma_ipatt) _ (p1 : 'comma_ipatt) - (_loc : Gram.Loc.t) -> - (Ast.PaCom (_loc, p1, p2) : 'comma_ipatt)))) ]) ])) - ()); - Gram.extend - (label_ipatt_list : 'label_ipatt_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_ipatt : 'label_ipatt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p1 : 'label_ipatt) (_loc : Gram.Loc.t) - -> (p1 : 'label_ipatt_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_ipatt : 'label_ipatt Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (p1 : 'label_ipatt) (_loc : Gram.Loc.t) - -> (p1 : 'label_ipatt_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_ipatt : 'label_ipatt Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Skeyword "_"; - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ _ _ (p1 : 'label_ipatt) - (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, p1, (Ast.PaAny _loc)) : - 'label_ipatt_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_ipatt : 'label_ipatt Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ _ (p1 : 'label_ipatt) - (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, p1, (Ast.PaAny _loc)) : - 'label_ipatt_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_ipatt : 'label_ipatt Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'label_ipatt_list) _ - (p1 : 'label_ipatt) (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, p1, p2) : - 'label_ipatt_list)))) ]) ])) - ()); - Gram.extend (label_ipatt : 'label_ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'ipatt) _ (i : 'label_longident) - (_loc : Gram.Loc.t) -> - (Ast.PaEq (_loc, i, p) : 'label_ipatt)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.patt_tag : - 'label_ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt;" n s)) : - 'label_ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "pat" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"pat\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "pat" | "anti" as n)), - s) -> - (Ast.PaAnt (_loc, - (mk_anti ~c: "patt" n s)) : - 'label_ipatt) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (type_declaration : 'type_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_ident_and_parameters : - 'type_ident_and_parameters Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t)); - Gram.Slist0 - (Gram.Snterm - (Gram.Entry.obj - (constrain : 'constrain Gram.Entry.t))) ], - (Gram.Action.mk - (fun (cl : 'constrain list) - (tk : 'opt_eq_ctyp) - ((n, tpl) : 'type_ident_and_parameters) - (_loc : Gram.Loc.t) -> - (Ast.TyDcl (_loc, n, tpl, tk, cl) : - 'type_declaration)))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'type_declaration) _ - (t1 : 'type_declaration) - (_loc : Gram.Loc.t) -> - (Ast.TyAnd (_loc, t1, t2) : - 'type_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'type_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctypand" n s)) : - 'type_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'type_declaration) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (constrain : 'constrain Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "constraint"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ - (_loc : Gram.Loc.t) -> - ((t1, t2) : 'constrain)))) ]) ])) - ()); - Gram.extend (opt_eq_ctyp : 'opt_eq_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.TyNil _loc : 'opt_eq_ctyp)))); - ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (type_kind : 'type_kind Gram.Entry.t)) ], - (Gram.Action.mk - (fun (tk : 'type_kind) _ (_loc : Gram.Loc.t) - -> (tk : 'opt_eq_ctyp)))) ]) ])) - ()); - Gram.extend (type_kind : 'type_kind Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'type_kind)))) ]) ])) - ()); - Gram.extend - (type_ident_and_parameters : - 'type_ident_and_parameters Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Slist0 - (Gram.Snterm - (Gram.Entry.obj - (optional_type_parameter : - 'optional_type_parameter Gram.Entry.t))) ], - (Gram.Action.mk - (fun (tpl : 'optional_type_parameter list) - (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - ((i, tpl) : 'type_ident_and_parameters)))) ]) ])) - ()); - Gram.extend - (type_longident_and_parameters : - 'type_longident_and_parameters Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_longident : - 'type_longident Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (type_parameters : - 'type_parameters Gram.Entry.t)) ], - (Gram.Action.mk - (fun (tpl : 'type_parameters) - (i : 'type_longident) (_loc : Gram.Loc.t) - -> - (tpl (Ast.TyId (_loc, i)) : - 'type_longident_and_parameters)))) ]) ])) - ()); - Gram.extend (type_parameters : 'type_parameters Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (fun t -> t : 'type_parameters)))); - ([ Gram.Snterm - (Gram.Entry.obj - (type_parameter : - 'type_parameter Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'type_parameter) (_loc : Gram.Loc.t) - -> - (fun acc -> Ast.TyApp (_loc, acc, t) : - 'type_parameters)))); - ([ Gram.Snterm - (Gram.Entry.obj - (type_parameter : - 'type_parameter Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'type_parameters) - (t1 : 'type_parameter) (_loc : Gram.Loc.t) - -> - (fun acc -> t2 (Ast.TyApp (_loc, acc, t1)) : - 'type_parameters)))) ]) ])) - ()); - Gram.extend (type_parameter : 'type_parameter Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "-"; Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> - (Ast.TyQuM (_loc, i) : 'type_parameter)))); - ([ Gram.Skeyword "+"; Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> - (Ast.TyQuP (_loc, i) : 'type_parameter)))); - ([ Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyQuo (_loc, i) : 'type_parameter)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'type_parameter) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.TyAnt (_loc, (mk_anti n s)) : - 'type_parameter) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (optional_type_parameter : - 'optional_type_parameter Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.TyAny _loc : 'optional_type_parameter)))); - ([ Gram.Skeyword "-"; Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.TyAnM _loc : 'optional_type_parameter)))); - ([ Gram.Skeyword "+"; Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.TyAnP _loc : 'optional_type_parameter)))); - ([ Gram.Skeyword "-"; Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> - (Ast.TyQuM (_loc, i) : - 'optional_type_parameter)))); - ([ Gram.Skeyword "+"; Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ _ (_loc : Gram.Loc.t) -> - (Ast.TyQuP (_loc, i) : - 'optional_type_parameter)))); - ([ Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyQuo (_loc, i) : - 'optional_type_parameter)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'optional_type_parameter) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.TyAnt (_loc, (mk_anti n s)) : - 'optional_type_parameter) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (ctyp : 'ctyp Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "=="), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Skeyword "=="; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyMan (_loc, t1, t2) : 'ctyp)))) ]); - ((Some "private"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Skeyword "private"; - Gram.Snterml - ((Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)), - "alias") ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (_loc : Gram.Loc.t) -> - (Ast.TyPrv (_loc, t) : 'ctyp)))) ]); - ((Some "alias"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Skeyword "as"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyAli (_loc, t1, t2) : 'ctyp)))) ]); - ((Some "forall"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "!"; - Gram.Snterm - (Gram.Entry.obj - (typevars : 'typevars Gram.Entry.t)); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'typevars) _ - (_loc : Gram.Loc.t) -> - (Ast.TyPol (_loc, t1, t2) : 'ctyp)))) ]); - ((Some "arrow"), (Some Camlp4.Sig.Grammar.RightA), - [ ([ Gram.Sself; Gram.Skeyword "->"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyArr (_loc, t1, t2) : 'ctyp)))) ]); - ((Some "label"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (t : 'ctyp) (i : 'a_OPTLABEL) - (_loc : Gram.Loc.t) -> - (Ast.TyOlb (_loc, i, t) : 'ctyp)))); - ([ Gram.Skeyword "?"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.TyOlb (_loc, i, t) : 'ctyp)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LABEL : 'a_LABEL Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (t : 'ctyp) (i : 'a_LABEL) - (_loc : Gram.Loc.t) -> - (Ast.TyLab (_loc, i, t) : 'ctyp)))); - ([ Gram.Skeyword "~"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (i : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.TyLab (_loc, i, t) : 'ctyp)))) ]); - ((Some "apply"), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) (t1 : 'ctyp) - (_loc : Gram.Loc.t) -> - (let t = Ast.TyApp (_loc, t1, t2) - in - try - Ast.TyId (_loc, (Ast.ident_of_ctyp t)) - with | Invalid_argument _ -> t : - 'ctyp)))) ]); - ((Some "."), (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) - (_loc : Gram.Loc.t) -> - (try - Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.ident_of_ctyp t1), - (Ast.ident_of_ctyp t2)))) - with - | Invalid_argument s -> - raise (Stream.Error s) : - 'ctyp)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Skeyword "module"; - Gram.Snterm - (Gram.Entry.obj - (package_type : - 'package_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'package_type) _ _ - (_loc : Gram.Loc.t) -> - (Ast.TyPkg (_loc, p) : 'ctyp)))); - ([ Gram.Skeyword "<"; - Gram.Snterm - (Gram.Entry.obj - (opt_meth_list : - 'opt_meth_list Gram.Entry.t)); - Gram.Skeyword ">" ], - (Gram.Action.mk - (fun _ (t : 'opt_meth_list) _ - (_loc : Gram.Loc.t) -> (t : 'ctyp)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (class_longident : - 'class_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'class_longident) _ - (_loc : Gram.Loc.t) -> - (Ast.TyCls (_loc, i) : 'ctyp)))); - ([ Gram.Skeyword "{"; - Gram.Snterm - (Gram.Entry.obj - (label_declaration_list : - 'label_declaration_list Gram.Entry.t)); - Gram.Skeyword "}" ], - (Gram.Action.mk - (fun _ (t : 'label_declaration_list) _ - (_loc : Gram.Loc.t) -> - (Ast.TyRec (_loc, t) : 'ctyp)))); - ([ Gram.Skeyword "[<"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword ">"; - Gram.Snterm - (Gram.Entry.obj - (name_tags : 'name_tags Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (ntl : 'name_tags) _ (rfl : 'row_field) - _ (_loc : Gram.Loc.t) -> - (Ast.TyVrnInfSup (_loc, rfl, ntl) : 'ctyp)))); - ([ Gram.Skeyword "[<"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rfl : 'row_field) _ - (_loc : Gram.Loc.t) -> - (Ast.TyVrnInf (_loc, rfl) : 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword "<"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword ">"; - Gram.Snterm - (Gram.Entry.obj - (name_tags : 'name_tags Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (ntl : 'name_tags) _ (rfl : 'row_field) - _ _ (_loc : Gram.Loc.t) -> - (Ast.TyVrnInfSup (_loc, rfl, ntl) : 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword "<"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rfl : 'row_field) _ _ - (_loc : Gram.Loc.t) -> - (Ast.TyVrnInf (_loc, rfl) : 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword ">"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rfl : 'row_field) _ _ - (_loc : Gram.Loc.t) -> - (Ast.TyVrnSup (_loc, rfl) : 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword ">"; - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ _ _ (_loc : Gram.Loc.t) -> - (Ast.TyVrnSup (_loc, (Ast.TyNil _loc)) : - 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rfl : 'row_field) _ _ - (_loc : Gram.Loc.t) -> - (Ast.TyVrnEq (_loc, rfl) : 'ctyp)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (constructor_declarations : - 'constructor_declarations Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (t : 'constructor_declarations) _ - (_loc : Gram.Loc.t) -> - (Ast.TySum (_loc, t) : 'ctyp)))); - ([ Gram.Skeyword "["; Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.TySum (_loc, (Ast.TyNil _loc)) : - 'ctyp)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (_loc : Gram.Loc.t) -> - (t : 'ctyp)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword "*"; - Gram.Snterm - (Gram.Entry.obj - (star_ctyp : 'star_ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (tl : 'star_ctyp) _ (t : 'ctyp) _ - (_loc : Gram.Loc.t) -> - (Ast.TyTup (_loc, - (Ast.TySta (_loc, t, tl))) : - 'ctyp)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyId (_loc, (Ast.IdUid (_loc, i))) : - 'ctyp)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyId (_loc, (Ast.IdLid (_loc, i))) : - 'ctyp)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'ctyp) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("id", _) -> true - | _ -> false), - "ANTIQUOT (\"id\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("id" as n)), s) -> - (Ast.TyId (_loc, - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)))) : - 'ctyp) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("tup", _) -> true - | _ -> false), - "ANTIQUOT (\"tup\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("tup" as n)), s) -> - (Ast.TyTup (_loc, - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)))) : - 'ctyp) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" | "anti" as n)), - s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'ctyp) - | _ -> assert false))); - ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.TyAny _loc : 'ctyp)))); - ([ Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyQuo (_loc, i) : 'ctyp)))) ]) ])) - ()); - Gram.extend (star_ctyp : 'star_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'star_ctyp)))); - ([ Gram.Sself; Gram.Skeyword "*"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'star_ctyp) _ (t1 : 'star_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TySta (_loc, t1, t2) : 'star_ctyp)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp*" n s)) : - 'star_ctyp) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'star_ctyp) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (constructor_declarations : - 'constructor_declarations Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyId (_loc, (Ast.IdUid (_loc, s))) : - 'constructor_declarations)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (s : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (let (tl, rt) = generalized_type_of_type t - in - Ast.TyCol (_loc, - (Ast.TyId (_loc, - (Ast.IdUid (_loc, s)))), - (Ast.TyArr (_loc, - (Ast.tyAnd_of_list tl), rt))) : - 'constructor_declarations)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (constructor_arg_list : - 'constructor_arg_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'constructor_arg_list) _ - (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyOf (_loc, - (Ast.TyId (_loc, (Ast.IdUid (_loc, s)))), - t) : - 'constructor_declarations)))); - ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'constructor_declarations) _ - (t1 : 'constructor_declarations) - (_loc : Gram.Loc.t) -> - (Ast.TyOr (_loc, t1, t2) : - 'constructor_declarations)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'constructor_declarations) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp|" n s)) : - 'constructor_declarations) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'constructor_declarations) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (constructor_declaration : - 'constructor_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyId (_loc, (Ast.IdUid (_loc, s))) : - 'constructor_declaration)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (constructor_arg_list : - 'constructor_arg_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'constructor_arg_list) _ - (s : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.TyOf (_loc, - (Ast.TyId (_loc, (Ast.IdUid (_loc, s)))), - t) : - 'constructor_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'constructor_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'constructor_declaration) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (constructor_arg_list : 'constructor_arg_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'constructor_arg_list)))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'constructor_arg_list) _ - (t1 : 'constructor_arg_list) - (_loc : Gram.Loc.t) -> - (Ast.TyAnd (_loc, t1, t2) : - 'constructor_arg_list)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctypand" n s)) : - 'constructor_arg_list) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (label_declaration_list : - 'label_declaration_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_declaration : - 'label_declaration Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t1 : 'label_declaration) - (_loc : Gram.Loc.t) -> - (t1 : 'label_declaration_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_declaration : - 'label_declaration Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (t1 : 'label_declaration) - (_loc : Gram.Loc.t) -> - (t1 : 'label_declaration_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_declaration : - 'label_declaration Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'label_declaration_list) _ - (t1 : 'label_declaration) - (_loc : Gram.Loc.t) -> - (Ast.TySem (_loc, t1, t2) : - 'label_declaration_list)))) ]) ])) - ()); - Gram.extend - (label_declaration : 'label_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; Gram.Skeyword "mutable"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ _ (s : 'a_LIDENT) - (_loc : Gram.Loc.t) -> - (Ast.TyCol (_loc, - (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), - (Ast.TyMut (_loc, t))) : - 'label_declaration)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (s : 'a_LIDENT) - (_loc : Gram.Loc.t) -> - (Ast.TyCol (_loc, - (Ast.TyId (_loc, (Ast.IdLid (_loc, s)))), - t) : - 'label_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'label_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp;" n s)) : - 'label_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'label_declaration) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_ident : 'a_ident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (i : 'a_ident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (i : 'a_ident)))) ]) ])) - ()); - Gram.extend (ident : 'ident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'ident) _ (i : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, i)), j) : - 'ident)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (i : 'ident) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAcc (_loc, - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s))), - i) : - 'ident) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdLid (_loc, i) : 'ident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdUid (_loc, i) : 'ident)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'ident) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (module_longident : 'module_longident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdUid (_loc, i) : 'module_longident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (l : 'module_longident) _ (m : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : - 'module_longident)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'module_longident) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (module_longident_with_app : - 'module_longident_with_app Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "apply"), None, - [ ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'module_longident_with_app) - (i : 'module_longident_with_app) - (_loc : Gram.Loc.t) -> - (Ast.IdApp (_loc, i, j) : - 'module_longident_with_app)))) ]); - ((Some "."), None, - [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'module_longident_with_app) _ - (i : 'module_longident_with_app) - (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, i, j) : - 'module_longident_with_app)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (i : 'module_longident_with_app) _ - (_loc : Gram.Loc.t) -> - (i : 'module_longident_with_app)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdUid (_loc, i) : - 'module_longident_with_app)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'module_longident_with_app) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (module_longident_dot_lparen : - 'module_longident_dot_lparen Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "."; Gram.Skeyword "(" ], - (Gram.Action.mk - (fun _ _ (i : 'a_UIDENT) (_loc : Gram.Loc.t) - -> - (Ast.IdUid (_loc, i) : - 'module_longident_dot_lparen)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (l : 'module_longident_dot_lparen) _ - (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : - 'module_longident_dot_lparen)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); - Gram.Skeyword "."; Gram.Skeyword "(" ], - (Gram.Action.mk - (fun _ _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'module_longident_dot_lparen) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (type_longident : 'type_longident Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "apply"), None, - [ ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'type_longident) - (i : 'type_longident) (_loc : Gram.Loc.t) - -> - (Ast.IdApp (_loc, i, j) : 'type_longident)))) ]); - ((Some "."), None, - [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'type_longident) _ - (i : 'type_longident) (_loc : Gram.Loc.t) - -> - (Ast.IdAcc (_loc, i, j) : 'type_longident)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (i : 'type_longident) _ - (_loc : Gram.Loc.t) -> - (i : 'type_longident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdUid (_loc, i) : 'type_longident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdLid (_loc, i) : 'type_longident)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'type_longident) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (label_longident : 'label_longident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdLid (_loc, i) : 'label_longident)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (l : 'label_longident) _ (m : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), l) : - 'label_longident)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'label_longident) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (class_type_longident : 'class_type_longident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_longident : - 'type_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'type_longident) (_loc : Gram.Loc.t) - -> (x : 'class_type_longident)))) ]) ])) - ()); - Gram.extend (val_longident : 'val_longident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ident : 'ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'ident) (_loc : Gram.Loc.t) -> - (x : 'val_longident)))) ]) ])) - ()); - Gram.extend (class_longident : 'class_longident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (label_longident : - 'label_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'label_longident) - (_loc : Gram.Loc.t) -> - (x : 'class_longident)))) ]) ])) - ()); - Gram.extend - (class_declaration : 'class_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_info_for_class_expr : - 'class_info_for_class_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_fun_binding : - 'class_fun_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_fun_binding) - (ci : 'class_info_for_class_expr) - (_loc : Gram.Loc.t) -> - (Ast.CeEq (_loc, ci, ce) : - 'class_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_expr_tag : - 'class_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "cdcl" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"cdcl\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "cdcl" | "anti" | "list" as n)), - s) -> - (Ast.CeAnt (_loc, - (mk_anti ~c: "class_expr" n s)) : - 'class_declaration) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (c2 : 'class_declaration) _ - (c1 : 'class_declaration) - (_loc : Gram.Loc.t) -> - (Ast.CeAnd (_loc, c1, c2) : - 'class_declaration)))) ]) ])) - ()); - Gram.extend - (class_fun_binding : 'class_fun_binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (cfb : 'class_fun_binding) - (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> - (Ast.CeFun (_loc, p, cfb) : - 'class_fun_binding)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (class_type_plus : - 'class_type_plus Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (class_expr : 'class_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_expr) _ - (ct : 'class_type_plus) _ - (_loc : Gram.Loc.t) -> - (Ast.CeTyc (_loc, ce, ct) : - 'class_fun_binding)))); - ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (class_expr : 'class_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_expr) _ (_loc : Gram.Loc.t) - -> (ce : 'class_fun_binding)))) ]) ])) - ()); - Gram.extend - (class_info_for_class_type : - 'class_info_for_class_type Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_virtual : 'opt_virtual Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_name_and_param : - 'class_name_and_param Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((i, ot) : 'class_name_and_param) - (mv : 'opt_virtual) (_loc : Gram.Loc.t) -> - (Ast.CtCon (_loc, mv, - (Ast.IdLid (_loc, i)), ot) : - 'class_info_for_class_type)))) ]) ])) - ()); - Gram.extend - (class_info_for_class_expr : - 'class_info_for_class_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_virtual : 'opt_virtual Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_name_and_param : - 'class_name_and_param Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((i, ot) : 'class_name_and_param) - (mv : 'opt_virtual) (_loc : Gram.Loc.t) -> - (Ast.CeCon (_loc, mv, - (Ast.IdLid (_loc, i)), ot) : - 'class_info_for_class_expr)))) ]) ])) - ()); - Gram.extend - (class_name_and_param : 'class_name_and_param Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - ((i, (Ast.TyNil _loc)) : - 'class_name_and_param)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (comma_type_parameter : - 'comma_type_parameter Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (x : 'comma_type_parameter) _ - (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - ((i, x) : 'class_name_and_param)))) ]) ])) - ()); - Gram.extend - (comma_type_parameter : 'comma_type_parameter Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_parameter : - 'type_parameter Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'type_parameter) (_loc : Gram.Loc.t) - -> (t : 'comma_type_parameter)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp," n s)) : - 'comma_type_parameter) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'comma_type_parameter) _ - (t1 : 'comma_type_parameter) - (_loc : Gram.Loc.t) -> - (Ast.TyCom (_loc, t1, t2) : - 'comma_type_parameter)))) ]) ])) - ()); - Gram.extend (opt_comma_ctyp : 'opt_comma_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.TyNil _loc : 'opt_comma_ctyp)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (comma_ctyp : 'comma_ctyp Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (x : 'comma_ctyp) _ (_loc : Gram.Loc.t) - -> (x : 'opt_comma_ctyp)))) ]) ])) - ()); - Gram.extend (comma_ctyp : 'comma_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'comma_ctyp)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp," n s)) : - 'comma_ctyp) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'comma_ctyp) _ (t1 : 'comma_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyCom (_loc, t1, t2) : 'comma_ctyp)))) ]) ])) - ()); - Gram.extend (class_fun_def : 'class_fun_def Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj - (class_expr : 'class_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_expr) _ (_loc : Gram.Loc.t) - -> (ce : 'class_fun_def)))); - ([ Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (ce : 'class_fun_def) - (p : 'labeled_ipatt) (_loc : Gram.Loc.t) -> - (Ast.CeFun (_loc, p, ce) : 'class_fun_def)))) ]) ])) - ()); - Gram.extend (class_expr : 'class_expr Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), None, - [ ([ Gram.Skeyword "let"; - Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)); - Gram.Skeyword "in"; Gram.Sself ], - (Gram.Action.mk - (fun (ce : 'class_expr) _ (bi : 'binding) - (rf : 'opt_rec) _ (_loc : Gram.Loc.t) -> - (Ast.CeLet (_loc, rf, bi, ce) : - 'class_expr)))); - ([ Gram.Skeyword "fun"; - Gram.Snterm - (Gram.Entry.obj - (labeled_ipatt : - 'labeled_ipatt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_fun_def : - 'class_fun_def Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_fun_def) - (p : 'labeled_ipatt) _ (_loc : Gram.Loc.t) - -> (Ast.CeFun (_loc, p, ce) : 'class_expr)))) ]); - ((Some "apply"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Sself; - Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "label") ], - (Gram.Action.mk - (fun (e : 'expr) (ce : 'class_expr) - (_loc : Gram.Loc.t) -> - (Ast.CeApp (_loc, ce, e) : 'class_expr)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (ce : 'class_expr) _ - (_loc : Gram.Loc.t) -> (ce : 'class_expr)))); - ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (class_type : 'class_type Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (ct : 'class_type) _ (ce : 'class_expr) - _ (_loc : Gram.Loc.t) -> - (Ast.CeTyc (_loc, ce, ct) : 'class_expr)))); - ([ Gram.Skeyword "object"; - Gram.Snterm - (Gram.Entry.obj - (opt_class_self_patt : - 'opt_class_self_patt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_structure : - 'class_structure Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (cst : 'class_structure) - (csp : 'opt_class_self_patt) _ - (_loc : Gram.Loc.t) -> - (Ast.CeStr (_loc, csp, cst) : 'class_expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_longident_and_param : - 'class_longident_and_param Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ce : 'class_longident_and_param) - (_loc : Gram.Loc.t) -> (ce : 'class_expr)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_expr_tag : - 'class_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "cexp" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"cexp\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "cexp" | "anti" as n)), - s) -> - (Ast.CeAnt (_loc, - (mk_anti ~c: "class_expr" n s)) : - 'class_expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (class_longident_and_param : - 'class_longident_and_param Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_longident : - 'class_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ci : 'class_longident) - (_loc : Gram.Loc.t) -> - (Ast.CeCon (_loc, Ast.ViNil, ci, - (Ast.TyNil _loc)) : - 'class_longident_and_param)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_longident : - 'class_longident Gram.Entry.t)); - Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (comma_ctyp : 'comma_ctyp Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (t : 'comma_ctyp) _ - (ci : 'class_longident) (_loc : Gram.Loc.t) - -> - (Ast.CeCon (_loc, Ast.ViNil, ci, t) : - 'class_longident_and_param)))) ]) ])) - ()); - Gram.extend (class_structure : 'class_structure Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist0 - (Gram.srules class_structure - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_str_item : - 'class_str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (cst : 'class_str_item) - (_loc : Gram.Loc.t) -> - (cst : 'e__10)))) ]) ], - (Gram.Action.mk - (fun (l : 'e__10 list) (_loc : Gram.Loc.t) -> - (Ast.crSem_of_list l : 'class_structure)))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "cst" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (cst : 'class_structure) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "cst" | "anti" | "list" as n)), - s) -> - (Ast.CrSem (_loc, - (Ast.CrAnt (_loc, - (mk_anti ~c: "class_str_item" n s))), - cst) : - 'class_structure) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "cst" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "cst" | "anti" | "list" as n)), - s) -> - (Ast.CrAnt (_loc, - (mk_anti ~c: "class_str_item" n s)) : - 'class_structure) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (opt_class_self_patt : 'opt_class_self_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.PaNil _loc : 'opt_class_self_patt)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (p : 'patt) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, p, t) : - 'opt_class_self_patt)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'patt) _ (_loc : Gram.Loc.t) -> - (p : 'opt_class_self_patt)))) ]) ])) - ()); - Gram.extend (class_str_item : 'class_str_item Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "initializer"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (se : 'expr) _ (_loc : Gram.Loc.t) -> - (Ast.CrIni (_loc, se) : 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (type_constraint : - 'type_constraint Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ - (_loc : Gram.Loc.t) -> - (Ast.CrCtr (_loc, t1, t2) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (method_opt_override : - 'method_opt_override Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) _ - (pf : 'opt_private) - (o : 'method_opt_override) - (_loc : Gram.Loc.t) -> - (if o <> Ast.OvNil - then - raise - (Stream.Error - "override (!) is incompatible with virtual") - else Ast.CrVir (_loc, l, pf, t) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (method_opt_override : - 'method_opt_override Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_polyt : 'opt_polyt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (fun_binding : 'fun_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'fun_binding) (topt : 'opt_polyt) - (l : 'label) (pf : 'opt_private) - (o : 'method_opt_override) - (_loc : Gram.Loc.t) -> - (Ast.CrMth (_loc, l, o, pf, e, topt) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (method_opt_override : - 'method_opt_override Gram.Entry.t)); - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) - (pf : 'opt_private) _ - (o : 'method_opt_override) - (_loc : Gram.Loc.t) -> - (if o <> Ast.OvNil - then - raise - (Stream.Error - "override (!) is incompatible with virtual") - else Ast.CrVir (_loc, l, pf, t) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val_opt_override : - 'value_val_opt_override Gram.Entry.t)); - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj - (opt_mutable : 'opt_mutable Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) - (mf : 'opt_mutable) _ - (o : 'value_val_opt_override) - (_loc : Gram.Loc.t) -> - (if o <> Ast.OvNil - then - raise - (Stream.Error - "override (!) is incompatible with virtual") - else Ast.CrVvr (_loc, l, mf, t) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val_opt_override : - 'value_val_opt_override Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_mutable : 'opt_mutable Gram.Entry.t)); - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) _ - (mf : 'opt_mutable) - (o : 'value_val_opt_override) - (_loc : Gram.Loc.t) -> - (if o <> Ast.OvNil - then - raise - (Stream.Error - "override (!) is incompatible with virtual") - else Ast.CrVvr (_loc, l, mf, t) : - 'class_str_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val_opt_override : - 'value_val_opt_override Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_mutable : 'opt_mutable Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (cvalue_binding : - 'cvalue_binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'cvalue_binding) (lab : 'label) - (mf : 'opt_mutable) - (o : 'value_val_opt_override) - (_loc : Gram.Loc.t) -> - (Ast.CrVal (_loc, lab, o, mf, e) : - 'class_str_item)))); - ([ Gram.Skeyword "inherit"; - Gram.Snterm - (Gram.Entry.obj - (opt_override : - 'opt_override Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_expr : 'class_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_as_lident : - 'opt_as_lident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (pb : 'opt_as_lident) (ce : 'class_expr) - (o : 'opt_override) _ (_loc : Gram.Loc.t) - -> - (Ast.CrInh (_loc, o, ce, pb) : - 'class_str_item)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_str_item_tag : - 'class_str_item) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "cst" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"cst\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "cst" | "anti" | "list" as n)), - s) -> - (Ast.CrAnt (_loc, - (mk_anti ~c: "class_str_item" n s)) : - 'class_str_item) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (method_opt_override : 'method_opt_override Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "method" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.OvNil : 'method_opt_override)))); - ([ Gram.Skeyword "method"; - Gram.Stoken - (((function - | ANTIQUOT (("!" | "override" | "anti"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("!" | "override" | "anti" as n)), s) - -> - (Ast.OvAnt (mk_anti n s) : - 'method_opt_override) - | _ -> assert false))); - ([ Gram.Skeyword "method"; Gram.Skeyword "!" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.OvOverride : 'method_opt_override)))) ]) ])) - ()); - Gram.extend - (value_val_opt_override : - 'value_val_opt_override Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.OvNil : 'value_val_opt_override)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Stoken - (((function - | ANTIQUOT (("!" | "override" | "anti"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("!" | "override" | "anti" as n)), s) - -> - (Ast.OvAnt (mk_anti n s) : - 'value_val_opt_override) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Skeyword "!" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (Ast.OvOverride : 'value_val_opt_override)))) ]) ])) - ()); - Gram.extend (opt_as_lident : 'opt_as_lident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - ("" : 'opt_as_lident)))); - ([ Gram.Skeyword "as"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) _ (_loc : Gram.Loc.t) -> - (i : 'opt_as_lident)))) ]) ])) - ()); - Gram.extend (opt_polyt : 'opt_polyt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.TyNil _loc : 'opt_polyt)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (_loc : Gram.Loc.t) -> - (t : 'opt_polyt)))) ]) ])) - ()); - Gram.extend (cvalue_binding : 'cvalue_binding Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword ":>"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (t : 'ctyp) _ - (_loc : Gram.Loc.t) -> - (Ast.ExCoe (_loc, e, (Ast.TyNil _loc), t) : - 'cvalue_binding)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)); - Gram.Skeyword ":>"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (t2 : 'ctyp) _ - (t : 'poly_type) _ (_loc : Gram.Loc.t) -> - (match t with - | Ast.TyPol (_, _, _) -> - raise - (Stream.Error - "unexpected polytype here") - | _ -> Ast.ExCoe (_loc, e, t, t2) : - 'cvalue_binding)))); - ([ Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (t : 'poly_type) _ - (_loc : Gram.Loc.t) -> - (Ast.ExTyc (_loc, e, t) : 'cvalue_binding)))); - ([ Gram.Skeyword ":"; Gram.Skeyword "type"; - Gram.Snterm - (Gram.Entry.obj - (unquoted_typevars : - 'unquoted_typevars Gram.Entry.t)); - Gram.Skeyword "."; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (t2 : 'ctyp) _ - (t1 : 'unquoted_typevars) _ _ - (_loc : Gram.Loc.t) -> - (let u = Ast.TyTypePol (_loc, t1, t2) - in Ast.ExTyc (_loc, e, u) : - 'cvalue_binding)))); - ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (e : 'cvalue_binding)))) ]) ])) - ()); - Gram.extend (label : 'label Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (i : 'label)))) ]) ])) - ()); - Gram.extend (class_type : 'class_type Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "object"; - Gram.Snterm - (Gram.Entry.obj - (opt_class_self_type : - 'opt_class_self_type Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (class_signature : - 'class_signature Gram.Entry.t)); - Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (csg : 'class_signature) - (cst : 'opt_class_self_type) _ - (_loc : Gram.Loc.t) -> - (Ast.CtSig (_loc, cst, csg) : 'class_type)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_type_longident_and_param : - 'class_type_longident_and_param Gram. - Entry.t)) ], - (Gram.Action.mk - (fun (ct : 'class_type_longident_and_param) - (_loc : Gram.Loc.t) -> (ct : 'class_type)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_type_tag : - 'class_type) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "ctyp" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"ctyp\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "ctyp" | "anti" as n)), - s) -> - (Ast.CtAnt (_loc, - (mk_anti ~c: "class_type" n s)) : - 'class_type) - | _ -> assert false))) ]) ])) - ()); - Gram.extend - (class_type_longident_and_param : - 'class_type_longident_and_param Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_type_longident : - 'class_type_longident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'class_type_longident) - (_loc : Gram.Loc.t) -> - (Ast.CtCon (_loc, Ast.ViNil, i, - (Ast.TyNil _loc)) : - 'class_type_longident_and_param)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_type_longident : - 'class_type_longident Gram.Entry.t)); - Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (comma_ctyp : 'comma_ctyp Gram.Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (t : 'comma_ctyp) _ - (i : 'class_type_longident) - (_loc : Gram.Loc.t) -> - (Ast.CtCon (_loc, Ast.ViNil, i, t) : - 'class_type_longident_and_param)))) ]) ])) - ()); - Gram.extend (class_type_plus : 'class_type_plus Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_type : 'class_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ct : 'class_type) (_loc : Gram.Loc.t) -> - (ct : 'class_type_plus)))); - ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "]"; Gram.Skeyword "->"; Gram. - Sself ], - (Gram.Action.mk - (fun (ct : 'class_type_plus) _ _ (t : 'ctyp) _ - (_loc : Gram.Loc.t) -> - (Ast.CtFun (_loc, t, ct) : - 'class_type_plus)))) ]) ])) - ()); - Gram.extend - (opt_class_self_type : 'opt_class_self_type Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.TyNil _loc : 'opt_class_self_type)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 'ctyp) _ (_loc : Gram.Loc.t) -> - (t : 'opt_class_self_type)))) ]) ])) - ()); - Gram.extend (class_signature : 'class_signature Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist0 - (Gram.srules class_signature - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_sig_item : - 'class_sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (csg : 'class_sig_item) - (_loc : Gram.Loc.t) -> - (csg : 'e__11)))) ]) ], - (Gram.Action.mk - (fun (l : 'e__11 list) (_loc : Gram.Loc.t) -> - (Ast.cgSem_of_list l : 'class_signature)))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "csg" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (csg : 'class_signature) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "csg" | "anti" | "list" as n)), - s) -> - (Ast.CgSem (_loc, - (Ast.CgAnt (_loc, - (mk_anti ~c: "class_sig_item" n s))), - csg) : - 'class_signature) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "csg" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "csg" | "anti" | "list" as n)), - s) -> - (Ast.CgAnt (_loc, - (mk_anti ~c: "class_sig_item" n s)) : - 'class_signature) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (class_sig_item : 'class_sig_item Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_constraint : - 'type_constraint Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t2 : 'ctyp) _ (t1 : 'ctyp) _ - (_loc : Gram.Loc.t) -> - (Ast.CgCtr (_loc, t1, t2) : - 'class_sig_item)))); - ([ Gram.Skeyword "method"; - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) _ - (pf : 'opt_private) _ (_loc : Gram.Loc.t) - -> - (Ast.CgVir (_loc, l, pf, t) : - 'class_sig_item)))); - ([ Gram.Skeyword "method"; - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) - (pf : 'opt_private) _ (_loc : Gram.Loc.t) - -> - (Ast.CgMth (_loc, l, pf, t) : - 'class_sig_item)))); - ([ Gram.Skeyword "method"; - Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (l : 'label) - (pf : 'opt_private) _ _ (_loc : Gram.Loc.t) - -> - (Ast.CgVir (_loc, l, pf, t) : - 'class_sig_item)))); - ([ Gram.Snterm - (Gram.Entry.obj - (value_val : 'value_val Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_mutable : 'opt_mutable Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_virtual : 'opt_virtual Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (l : 'label) - (mv : 'opt_virtual) (mf : 'opt_mutable) _ - (_loc : Gram.Loc.t) -> - (Ast.CgVal (_loc, l, mf, mv, t) : - 'class_sig_item)))); - ([ Gram.Skeyword "inherit"; - Gram.Snterm - (Gram.Entry.obj - (class_type : 'class_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (cs : 'class_type) _ (_loc : Gram.Loc.t) - -> (Ast.CgInh (_loc, cs) : 'class_sig_item)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_sig_item_tag : - 'class_sig_item) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "csg" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"csg\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "csg" | "anti" | "list" as n)), - s) -> - (Ast.CgAnt (_loc, - (mk_anti ~c: "class_sig_item" n s)) : - 'class_sig_item) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (type_constraint : 'type_constraint Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "constraint" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'type_constraint)))); - ([ Gram.Skeyword "type" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'type_constraint)))) ]) ])) - ()); - Gram.extend - (class_description : 'class_description Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_info_for_class_type : - 'class_info_for_class_type Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (class_type_plus : - 'class_type_plus Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ct : 'class_type_plus) _ - (ci : 'class_info_for_class_type) - (_loc : Gram.Loc.t) -> - (Ast.CtCol (_loc, ci, ct) : - 'class_description)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_type_tag : - 'class_description) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "typ" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "typ" | "anti" | "list" as n)), - s) -> - (Ast.CtAnt (_loc, - (mk_anti ~c: "class_type" n s)) : - 'class_description) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (cd2 : 'class_description) _ - (cd1 : 'class_description) - (_loc : Gram.Loc.t) -> - (Ast.CtAnd (_loc, cd1, cd2) : - 'class_description)))) ]) ])) - ()); - Gram.extend - (class_type_declaration : - 'class_type_declaration Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (class_info_for_class_type : - 'class_info_for_class_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (class_type : 'class_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ct : 'class_type) _ - (ci : 'class_info_for_class_type) - (_loc : Gram.Loc.t) -> - (Ast.CtEq (_loc, ci, ct) : - 'class_type_declaration)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.class_type_tag : - 'class_type_declaration) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "typ" | "anti" | "list"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "typ" | "anti" | "list" as n)), - s) -> - (Ast.CtAnt (_loc, - (mk_anti ~c: "class_type" n s)) : - 'class_type_declaration) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (cd2 : 'class_type_declaration) _ - (cd1 : 'class_type_declaration) - (_loc : Gram.Loc.t) -> - (Ast.CtAnd (_loc, cd1, cd2) : - 'class_type_declaration)))) ]) ])) - ()); - Gram.extend (field_expr_list : 'field_expr_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (field_expr : 'field_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (b1 : 'field_expr) (_loc : Gram.Loc.t) -> - (b1 : 'field_expr_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (field_expr : 'field_expr Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (b1 : 'field_expr) (_loc : Gram.Loc.t) - -> (b1 : 'field_expr_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (field_expr : 'field_expr Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (b2 : 'field_expr_list) _ - (b1 : 'field_expr) (_loc : Gram.Loc.t) -> - (Ast.RbSem (_loc, b1, b2) : - 'field_expr_list)))) ]) ])) - ()); - Gram.extend (field_expr : 'field_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (label : 'label Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top") ], - (Gram.Action.mk - (fun (e : 'expr) _ (l : 'label) - (_loc : Gram.Loc.t) -> - (Ast.RbEq (_loc, (Ast.IdLid (_loc, l)), e) : - 'field_expr)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.RbAnt (_loc, - (mk_anti ~c: "rec_binding" n s)) : - 'field_expr) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "bi" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"bi\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "bi" | "anti" as n)), s) - -> - (Ast.RbAnt (_loc, - (mk_anti ~c: "rec_binding" n s)) : - 'field_expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (meth_list : 'meth_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (meth_decl : 'meth_decl Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], - (Gram.Action.mk - (fun (v : 'opt_dot_dot) (m : 'meth_decl) - (_loc : Gram.Loc.t) -> - ((m, v) : 'meth_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (meth_decl : 'meth_decl Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], - (Gram.Action.mk - (fun (v : 'opt_dot_dot) _ (m : 'meth_decl) - (_loc : Gram.Loc.t) -> - ((m, v) : 'meth_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (meth_decl : 'meth_decl Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun ((ml, v) : 'meth_list) _ (m : 'meth_decl) - (_loc : Gram.Loc.t) -> - (((Ast.TySem (_loc, m, ml)), v) : - 'meth_list)))) ]) ])) - ()); - Gram.extend (meth_decl : 'meth_decl Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (poly_type : 'poly_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'poly_type) _ (lab : 'a_LIDENT) - (_loc : Gram.Loc.t) -> - (Ast.TyCol (_loc, - (Ast.TyId (_loc, - (Ast.IdLid (_loc, lab)))), - t) : - 'meth_decl)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'meth_decl) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp;" n s)) : - 'meth_decl) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'meth_decl) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (opt_meth_list : 'opt_meth_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], - (Gram.Action.mk - (fun (v : 'opt_dot_dot) (_loc : Gram.Loc.t) -> - (Ast.TyObj (_loc, (Ast.TyNil _loc), v) : - 'opt_meth_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (meth_list : 'meth_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((ml, v) : 'meth_list) - (_loc : Gram.Loc.t) -> - (Ast.TyObj (_loc, ml, v) : 'opt_meth_list)))) ]) ])) - ()); - Gram.extend (poly_type : 'poly_type Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'poly_type)))) ]) ])) - ()); - Gram.extend (package_type : 'package_type Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'module_type) (_loc : Gram.Loc.t) -> - (p : 'package_type)))) ]) ])) - ()); - Gram.extend (typevars : 'typevars Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Skeyword "'"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyQuo (_loc, i) : 'typevars)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'typevars) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'typevars) - | _ -> assert false))); - ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'typevars) (t1 : 'typevars) - (_loc : Gram.Loc.t) -> - (Ast.TyApp (_loc, t1, t2) : 'typevars)))) ]) ])) - ()); - Gram.extend - (unquoted_typevars : 'unquoted_typevars Gram.Entry.t) - ((fun () -> - (None, - [ (None, (Some Camlp4.Sig.Grammar.LeftA), - [ ([ Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) (_loc : Gram.Loc.t) -> - (Ast.TyId (_loc, (Ast.IdLid (_loc, i))) : - 'unquoted_typevars)))); - ([ Gram.Stoken - (((function - | QUOTATION _ -> true - | _ -> false), - "QUOTATION _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | QUOTATION x -> - (Quotation.expand _loc x Quotation. - DynAst.ctyp_tag : - 'unquoted_typevars) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'unquoted_typevars) - | _ -> assert false))); - ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'unquoted_typevars) - (t1 : 'unquoted_typevars) - (_loc : Gram.Loc.t) -> - (Ast.TyApp (_loc, t1, t2) : - 'unquoted_typevars)))) ]) ])) - ()); - Gram.extend (row_field : 'row_field Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'row_field)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)); - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'amp_ctyp) _ (i : 'a_ident) _ - (_loc : Gram.Loc.t) -> - (Ast.TyOf (_loc, (Ast.TyVrn (_loc, i)), t) : - 'row_field)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)); - Gram.Skeyword "of"; Gram.Skeyword "&"; - Gram.Snterm - (Gram.Entry.obj - (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'amp_ctyp) _ _ (i : 'a_ident) _ - (_loc : Gram.Loc.t) -> - (Ast.TyOfAmp (_loc, (Ast.TyVrn (_loc, i)), - t) : - 'row_field)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyVrn (_loc, i) : 'row_field)))); - ([ Gram.Sself; Gram.Skeyword "|"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'row_field) _ (t1 : 'row_field) - (_loc : Gram.Loc.t) -> - (Ast.TyOr (_loc, t1, t2) : 'row_field)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp|" n s)) : - 'row_field) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'row_field) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (amp_ctyp : 'amp_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) (_loc : Gram.Loc.t) -> - (t : 'amp_ctyp)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("list", _) -> true - | _ -> false), - "ANTIQUOT (\"list\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("list" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp&" n s)) : - 'amp_ctyp) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "&"; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'amp_ctyp) _ (t1 : 'amp_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyAmp (_loc, t1, t2) : 'amp_ctyp)))) ]) ])) - ()); - Gram.extend (name_tags : 'name_tags Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyVrn (_loc, i) : 'name_tags)))); - ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (t2 : 'name_tags) (t1 : 'name_tags) - (_loc : Gram.Loc.t) -> - (Ast.TyApp (_loc, t1, t2) : 'name_tags)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "typ"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"typ\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "typ" as n)), s) -> - (Ast.TyAnt (_loc, - (mk_anti ~c: "ctyp" n s)) : - 'name_tags) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (eq_expr : 'eq_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (fun i p -> Ast.PaOlb (_loc, i, p) : - 'eq_expr)))); - ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (fun i p -> Ast.PaOlbi (_loc, i, p, e) : - 'eq_expr)))) ]) ])) - ()); - Gram.extend (patt_tcon : 'patt_tcon Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (p : 'patt_tcon)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (p : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, p, t) : 'patt_tcon)))) ]) ])) - ()); - Gram.extend (ipatt : 'ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "?"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'expr) _ (p : 'ipatt_tcon) _ _ - (_loc : Gram.Loc.t) -> - (Ast.PaOlbi (_loc, "", p, e) : 'ipatt)))); - ([ Gram.Skeyword "?"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'ipatt_tcon) _ _ - (_loc : Gram.Loc.t) -> - (Ast.PaOlb (_loc, "", p) : 'ipatt)))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaOlb (_loc, (mk_anti n i), - (Ast.PaNil _loc)) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function | LIDENT _ -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT i -> - (Ast.PaOlb (_loc, i, (Ast.PaNil _loc)) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")); - Gram.Skeyword ":"; Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (eq_expr : 'eq_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (f : 'eq_expr) (p : 'ipatt_tcon) _ _ - (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (f (mk_anti n i) p : 'ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function | OPTLABEL _ -> true | _ -> false), - "OPTLABEL _")); - Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj - (ipatt_tcon : 'ipatt_tcon Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (eq_expr : 'eq_expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (f : 'eq_expr) (p : 'ipatt_tcon) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | OPTLABEL i -> (f i p : 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function | LIDENT _ -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT i -> - (Ast.PaLab (_loc, i, (Ast.PaNil _loc)) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaLab (_loc, (mk_anti n i), - (Ast.PaNil _loc)) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")); - Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (p : 'ipatt) _ - (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), i) -> - (Ast.PaLab (_loc, (mk_anti n i), p) : - 'ipatt) - | _ -> assert false))); - ([ Gram.Stoken - (((function | LABEL _ -> true | _ -> false), - "LABEL _")); - Gram.Sself ], - (Gram.Action.mk - (fun (p : 'ipatt) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LABEL i -> - (Ast.PaLab (_loc, i, p) : 'ipatt) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (ipatt_tcon : 'ipatt_tcon Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'ipatt) (_loc : Gram.Loc.t) -> - (p : 'ipatt_tcon)))); - ([ Gram.Snterm - (Gram.Entry.obj (ipatt : 'ipatt Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'ctyp) _ (p : 'ipatt) - (_loc : Gram.Loc.t) -> - (Ast.PaTyc (_loc, p, t) : 'ipatt_tcon)))) ]) ])) - ()); - Gram.extend (direction_flag : 'direction_flag Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | ANTIQUOT (("to" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"to\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("to" | "anti" as n)), s) -> - (Ast.DiAnt (mk_anti n s) : - 'direction_flag) - | _ -> assert false))); - ([ Gram.Skeyword "downto" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.DiDownto : 'direction_flag)))); - ([ Gram.Skeyword "to" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.DiTo : 'direction_flag)))) ]) ])) - ()); - Gram.extend (opt_private : 'opt_private Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.PrNil : 'opt_private)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("private" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"private\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("private" | "anti" as n)), s) - -> - (Ast.PrAnt (mk_anti n s) : - 'opt_private) - | _ -> assert false))); - ([ Gram.Skeyword "private" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.PrPrivate : 'opt_private)))) ]) ])) - ()); - Gram.extend (opt_mutable : 'opt_mutable Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.MuNil : 'opt_mutable)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("mutable" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"mutable\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("mutable" | "anti" as n)), s) - -> - (Ast.MuAnt (mk_anti n s) : - 'opt_mutable) - | _ -> assert false))); - ([ Gram.Skeyword "mutable" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.MuMutable : 'opt_mutable)))) ]) ])) - ()); - Gram.extend (opt_virtual : 'opt_virtual Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.ViNil : 'opt_virtual)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("virtual" | "anti"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"virtual\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("virtual" | "anti" as n)), s) - -> - (Ast.ViAnt (mk_anti n s) : - 'opt_virtual) - | _ -> assert false))); - ([ Gram.Skeyword "virtual" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.ViVirtual : 'opt_virtual)))) ]) ])) - ()); - Gram.extend (opt_dot_dot : 'opt_dot_dot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.RvNil : 'opt_dot_dot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ((".." | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"..\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT (((".." | "anti" as n)), s) -> - (Ast.RvAnt (mk_anti n s) : - 'opt_dot_dot) - | _ -> assert false))); - ([ Gram.Skeyword ".." ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.RvRowVar : 'opt_dot_dot)))) ]) ])) - ()); - Gram.extend (opt_rec : 'opt_rec Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.ReNil : 'opt_rec)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("rec" | "anti"), _) -> true - | _ -> false), - "ANTIQUOT ((\"rec\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("rec" | "anti" as n)), s) -> - (Ast.ReAnt (mk_anti n s) : 'opt_rec) - | _ -> assert false))); - ([ Gram.Skeyword "rec" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.ReRecursive : 'opt_rec)))) ]) ])) - ()); - Gram.extend (opt_override : 'opt_override Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.OvNil : 'opt_override)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("!" | "override" | "anti"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"!\" | \"override\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("!" | "override" | "anti" as n)), s) - -> - (Ast.OvAnt (mk_anti n s) : - 'opt_override) - | _ -> assert false))); - ([ Gram.Skeyword "!" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.OvOverride : 'opt_override)))) ]) ])) - ()); - Gram.extend (opt_expr : 'opt_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.ExNil _loc : 'opt_expr)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (e : 'opt_expr)))) ]) ])) - ()); - Gram.extend (interf : 'interf Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (([], None) : 'interf) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : 'sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun ((sil, stopped) : 'interf) _ - (si : 'sig_item) (_loc : Gram.Loc.t) -> - (((si :: sil), stopped) : 'interf)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (([ Ast.SgDir (_loc, n, dp) ], - (stopped_at _loc)) : 'interf)))) ]) ])) - ()); - Gram.extend (sig_items : 'sig_items Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist0 - (Gram.srules sig_items - [ ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : - 'sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (sg : 'sig_item) - (_loc : Gram.Loc.t) -> - (sg : 'e__12)))) ]) ], - (Gram.Action.mk - (fun (l : 'e__12 list) (_loc : Gram.Loc.t) -> - (Ast.sgSem_of_list l : 'sig_items)))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "sigi" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (sg : 'sig_items) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "sigi" | "anti" | "list" as n)), - s) -> - (Ast.SgSem (_loc, - (Ast.SgAnt (_loc, - (mk_anti n ~c: "sig_item" s))), - sg) : - 'sig_items) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "sigi" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"sigi\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "sigi" | "anti" | "list" as n)), - s) -> - (Ast.SgAnt (_loc, - (mk_anti n ~c: "sig_item" s)) : - 'sig_items) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (implem : 'implem Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (([], None) : 'implem) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (str_item : 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun ((sil, stopped) : 'implem) _ - (si : 'str_item) (_loc : Gram.Loc.t) -> - (((si :: sil), stopped) : 'implem)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (([ Ast.StDir (_loc, n, dp) ], - (stopped_at _loc)) : 'implem)))) ]) ])) - ()); - Gram.extend (str_items : 'str_items Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist0 - (Gram.srules str_items - [ ([ Gram.Snterm - (Gram.Entry.obj - (str_item : - 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (st : 'str_item) - (_loc : Gram.Loc.t) -> - (st : 'e__13)))) ]) ], - (Gram.Action.mk - (fun (l : 'e__13 list) (_loc : Gram.Loc.t) -> - (Ast.stSem_of_list l : 'str_items)))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "stri" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (st : 'str_items) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "stri" | "anti" | "list" as n)), - s) -> - (Ast.StSem (_loc, - (Ast.StAnt (_loc, - (mk_anti n ~c: "str_item" s))), - st) : - 'str_items) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "stri" | "anti" | "list"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"stri\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "stri" | "anti" | "list" as n)), - s) -> - (Ast.StAnt (_loc, - (mk_anti n ~c: "str_item" s)) : - 'str_items) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (top_phrase : 'top_phrase Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (None : 'top_phrase) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (phrase : 'phrase Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ph : 'phrase) (_loc : Gram.Loc.t) -> - (Some ph : 'top_phrase)))) ]) ])) - ()); - Gram.extend (use_file : 'use_file Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (([], None) : 'use_file) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (str_item : 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun ((sil, stopped) : 'use_file) _ - (si : 'str_item) (_loc : Gram.Loc.t) -> - (((si :: sil), stopped) : 'use_file)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (([ Ast.StDir (_loc, n, dp) ], - (stopped_at _loc)) : 'use_file)))) ]) ])) - ()); - Gram.extend (phrase : 'phrase Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (str_item : 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (st : 'str_item) (_loc : Gram.Loc.t) -> - (st : 'phrase)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.StDir (_loc, n, dp) : 'phrase)))) ]) ])) - ()); - Gram.extend (a_INT : 'a_INT Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | INT (_, _) -> true | _ -> false), - "INT (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | INT (_, s) -> (s : 'a_INT) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "int" | "`int"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"int\" | \"`int\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "int" | "`int" as n)), - s) -> (mk_anti n s : 'a_INT) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_INT32 : 'a_INT32 Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | INT32 (_, _) -> true - | _ -> false), - "INT32 (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | INT32 (_, s) -> (s : 'a_INT32) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "int32" | "`int32"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"int32\" | \"`int32\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "int32" | "`int32" as n)), s) - -> (mk_anti n s : 'a_INT32) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_INT64 : 'a_INT64 Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | INT64 (_, _) -> true - | _ -> false), - "INT64 (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | INT64 (_, s) -> (s : 'a_INT64) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "int64" | "`int64"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"int64\" | \"`int64\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "int64" | "`int64" as n)), s) - -> (mk_anti n s : 'a_INT64) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_NATIVEINT : 'a_NATIVEINT Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | NATIVEINT (_, _) -> true - | _ -> false), - "NATIVEINT (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | NATIVEINT (_, s) -> (s : 'a_NATIVEINT) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT - (("" | "nativeint" | "`nativeint"), _) - -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"nativeint\" | \"`nativeint\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "nativeint" | "`nativeint" as - n)), - s) -> (mk_anti n s : 'a_NATIVEINT) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_FLOAT : 'a_FLOAT Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | FLOAT (_, _) -> true - | _ -> false), - "FLOAT (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | FLOAT (_, s) -> (s : 'a_FLOAT) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "flo" | "`flo"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"flo\" | \"`flo\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "flo" | "`flo" as n)), - s) -> (mk_anti n s : 'a_FLOAT) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_CHAR : 'a_CHAR Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | CHAR (_, _) -> true - | _ -> false), - "CHAR (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | CHAR (_, s) -> (s : 'a_CHAR) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "chr" | "`chr"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"chr\" | \"`chr\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "chr" | "`chr" as n)), - s) -> (mk_anti n s : 'a_CHAR) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_UIDENT : 'a_UIDENT Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | UIDENT _ -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT s -> (s : 'a_UIDENT) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "uid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"uid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "uid" as n)), s) -> - (mk_anti n s : 'a_UIDENT) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_LIDENT : 'a_LIDENT Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | LIDENT _ -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT s -> (s : 'a_LIDENT) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "lid"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"lid\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "lid" as n)), s) -> - (mk_anti n s : 'a_LIDENT) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_LABEL : 'a_LABEL Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | LABEL _ -> true | _ -> false), - "LABEL _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LABEL s -> (s : 'a_LABEL) - | _ -> assert false))); - ([ Gram.Skeyword "~"; - Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")); - Gram.Skeyword ":" ], - (Gram.Action.mk - (fun _ (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), s) -> - (mk_anti n s : 'a_LABEL) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_OPTLABEL : 'a_OPTLABEL Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | OPTLABEL _ -> true | _ -> false), - "OPTLABEL _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | OPTLABEL s -> (s : 'a_OPTLABEL) - | _ -> assert false))); - ([ Gram.Skeyword "?"; - Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")); - Gram.Skeyword ":" ], - (Gram.Action.mk - (fun _ (__camlp4_0 : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), s) -> - (mk_anti n s : 'a_OPTLABEL) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (a_STRING : 'a_STRING Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | STRING (_, _) -> true - | _ -> false), - "STRING (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | STRING (_, s) -> (s : 'a_STRING) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "str" | "`str"), _) -> - true - | _ -> false), - "ANTIQUOT ((\"\" | \"str\" | \"`str\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" | "str" | "`str" as n)), - s) -> (mk_anti n s : 'a_STRING) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (string_list : 'string_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | STRING (_, _) -> true - | _ -> false), - "STRING (_, _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | STRING (_, x) -> - (Ast.LCons (x, Ast.LNil) : - 'string_list) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | STRING (_, _) -> true - | _ -> false), - "STRING (_, _)")); - Gram.Sself ], - (Gram.Action.mk - (fun (xs : 'string_list) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | STRING (_, x) -> - (Ast.LCons (x, xs) : 'string_list) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "str_list"), _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"str_list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT (("" | "str_list"), s) -> - (Ast.LAnt (mk_anti "str_list" s) : - 'string_list) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (value_let : 'value_let Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "value" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'value_let)))) ]) ])) - ()); - Gram.extend (value_val : 'value_val Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "value" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'value_val)))) ]) ])) - ()); - Gram.extend (semi : 'semi Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> (() : 'semi)))) ]) ])) - ()); - Gram.extend (expr_quot : 'expr_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.ExNil _loc : 'expr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (e : 'expr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sem_expr : 'sem_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e2 : 'sem_expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExSem (_loc, e1, e2) : 'expr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_expr : 'comma_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e2 : 'comma_expr) _ (e1 : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExCom (_loc, e1, e2) : 'expr_quot)))) ]) ])) - ()); - Gram.extend (patt_quot : 'patt_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.PaNil _loc : 'patt_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'patt) (_loc : Gram.Loc.t) -> - (x : 'patt_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'patt) _ (x : 'patt) - (_loc : Gram.Loc.t) -> - (let i = - match x with - | Ast.PaAnt (loc, s) -> - Ast.IdAnt (loc, s) - | p -> Ast.ident_of_patt p - in Ast.PaEq (_loc, i, y) : 'patt_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sem_patt : 'sem_patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'sem_patt) _ (x : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaSem (_loc, x, y) : 'patt_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_patt : 'comma_patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'comma_patt) _ (x : 'patt) - (_loc : Gram.Loc.t) -> - (Ast.PaCom (_loc, x, y) : 'patt_quot)))) ]) ])) - ()); - Gram.extend (ctyp_quot : 'ctyp_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.TyNil _loc : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (x : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "and"; - Gram.Snterm - (Gram.Entry.obj - (constructor_arg_list : - 'constructor_arg_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'constructor_arg_list) _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TyAnd (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "&"; - Gram.Snterm - (Gram.Entry.obj - (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'amp_ctyp) _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyAmp (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "*"; - Gram.Snterm - (Gram.Entry.obj - (star_ctyp : 'star_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'star_ctyp) _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TySta (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (label_declaration_list : - 'label_declaration_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (z : 'label_declaration_list) _ - (y : 'more_ctyp) _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TySem (_loc, (Ast.TyCol (_loc, x, y)), - z) : - 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'more_ctyp) _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyCol (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "of"; Gram.Skeyword "&"; - Gram.Snterm - (Gram.Entry.obj - (amp_ctyp : 'amp_ctyp Gram.Entry.t)); - Gram.Skeyword "|"; - Gram.Snterm - (Gram.Entry.obj - (row_field : 'row_field Gram.Entry.t)) ], - (Gram.Action.mk - (fun (z : 'row_field) _ (y : 'amp_ctyp) _ _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TyOr (_loc, - (Ast.TyOfAmp (_loc, x, y)), z) : - 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "of"; Gram.Skeyword "&"; - Gram.Snterm - (Gram.Entry.obj - (amp_ctyp : 'amp_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'amp_ctyp) _ _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyOfAmp (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (constructor_arg_list : - 'constructor_arg_list Gram.Entry.t)); - Gram.Skeyword "|"; - Gram.Snterm - (Gram.Entry.obj - (constructor_declarations : - 'constructor_declarations Gram.Entry.t)) ], - (Gram.Action.mk - (fun (z : 'constructor_declarations) _ - (y : 'constructor_arg_list) _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TyOr (_loc, (Ast.TyOf (_loc, x, y)), - z) : - 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "of"; - Gram.Snterm - (Gram.Entry.obj - (constructor_arg_list : - 'constructor_arg_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'constructor_arg_list) _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TyOf (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword "|"; - Gram.Snterm - (Gram.Entry.obj - (constructor_declarations : - 'constructor_declarations Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'constructor_declarations) _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TyOr (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (label_declaration_list : - 'label_declaration_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'label_declaration_list) _ - (x : 'more_ctyp) (_loc : Gram.Loc.t) -> - (Ast.TySem (_loc, x, y) : 'ctyp_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (more_ctyp : 'more_ctyp Gram.Entry.t)); - Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_ctyp : 'comma_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (y : 'comma_ctyp) _ (x : 'more_ctyp) - (_loc : Gram.Loc.t) -> - (Ast.TyCom (_loc, x, y) : 'ctyp_quot)))) ]) ])) - ()); - Gram.extend (more_ctyp : 'more_ctyp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (type_parameter : - 'type_parameter Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'type_parameter) (_loc : Gram.Loc.t) - -> (x : 'more_ctyp)))); - ([ Gram.Snterm - (Gram.Entry.obj (ctyp : 'ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'ctyp) (_loc : Gram.Loc.t) -> - (x : 'more_ctyp)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.TyVrn (_loc, x) : 'more_ctyp)))); - ([ Gram.Skeyword "mutable"; Gram.Sself ], - (Gram.Action.mk - (fun (x : 'more_ctyp) _ (_loc : Gram.Loc.t) -> - (Ast.TyMut (_loc, x) : 'more_ctyp)))) ]) ])) - ()); - Gram.extend (str_item_quot : 'str_item_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.StNil _loc : 'str_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (str_item : 'str_item Gram.Entry.t)) ], - (Gram.Action.mk - (fun (st : 'str_item) (_loc : Gram.Loc.t) -> - (st : 'str_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (str_item : 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (st2 : 'str_item_quot) _ - (st1 : 'str_item) (_loc : Gram.Loc.t) -> - (match st2 with - | Ast.StNil _ -> st1 - | _ -> Ast.StSem (_loc, st1, st2) : - 'str_item_quot)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.StDir (_loc, n, dp) : 'str_item_quot)))) ]) ])) - ()); - Gram.extend (sig_item_quot : 'sig_item_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.SgNil _loc : 'sig_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : 'sig_item Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sg : 'sig_item) (_loc : Gram.Loc.t) -> - (sg : 'sig_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : 'sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (sg2 : 'sig_item_quot) _ - (sg1 : 'sig_item) (_loc : Gram.Loc.t) -> - (match sg2 with - | Ast.SgNil _ -> sg1 - | _ -> Ast.SgSem (_loc, sg1, sg2) : - 'sig_item_quot)))); - ([ Gram.Skeyword "#"; - Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_expr : 'opt_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (dp : 'opt_expr) (n : 'a_LIDENT) _ - (_loc : Gram.Loc.t) -> - (Ast.SgDir (_loc, n, dp) : 'sig_item_quot)))) ]) ])) - ()); - Gram.extend - (module_type_quot : 'module_type_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.MtNil _loc : 'module_type_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'module_type) (_loc : Gram.Loc.t) -> - (x : 'module_type_quot)))) ]) ])) - ()); - Gram.extend - (module_expr_quot : 'module_expr_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.MeNil _loc : 'module_expr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'module_expr) (_loc : Gram.Loc.t) -> - (x : 'module_expr_quot)))) ]) ])) - ()); - Gram.extend (match_case_quot : 'match_case_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.McNil _loc : 'match_case_quot)))); - ([ Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (match_case0 : - 'match_case0 Gram.Entry.t))), - (Gram.Skeyword "|")) ], - (Gram.Action.mk - (fun (x : 'match_case0 list) - (_loc : Gram.Loc.t) -> - (Ast.mcOr_of_list x : 'match_case_quot)))) ]) ])) - ()); - Gram.extend (binding_quot : 'binding_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.BiNil _loc : 'binding_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (binding : 'binding Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'binding) (_loc : Gram.Loc.t) -> - (x : 'binding_quot)))) ]) ])) - ()); - Gram.extend - (rec_binding_quot : 'rec_binding_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.RbNil _loc : 'rec_binding_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (label_expr_list : - 'label_expr_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'label_expr_list) - (_loc : Gram.Loc.t) -> - (x : 'rec_binding_quot)))) ]) ])) - ()); - Gram.extend - (module_binding_quot : 'module_binding_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.MbNil _loc : 'module_binding_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (mt : 'module_type) - _ (m : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.MbColEq (_loc, m, mt, me) : - 'module_binding_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ (m : 'a_UIDENT) - (_loc : Gram.Loc.t) -> - (Ast.MbCol (_loc, m, mt) : - 'module_binding_quot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (module_expr : 'module_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (me : 'module_expr) _ (mt : 'module_type) - _ (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), m) -> - (Ast.MbColEq (_loc, (mk_anti n m), mt, - me) : - 'module_binding_quot) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (module_type : 'module_type Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mt : 'module_type) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), m) -> - (Ast.MbCol (_loc, (mk_anti n m), mt) : - 'module_binding_quot) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("" as n)), s) -> - (Ast.MbAnt (_loc, - (mk_anti ~c: "module_binding" n s)) : - 'module_binding_quot) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("module_binding" | "anti"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"module_binding\" | \"anti\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("module_binding" | "anti" as n)), s) - -> - (Ast.MbAnt (_loc, - (mk_anti ~c: "module_binding" n s)) : - 'module_binding_quot) - | _ -> assert false))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (b2 : 'module_binding_quot) _ - (b1 : 'module_binding_quot) - (_loc : Gram.Loc.t) -> - (Ast.MbAnd (_loc, b1, b2) : - 'module_binding_quot)))) ]) ])) - ()); - Gram.extend (ident_quot : 'ident_quot Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "apply"), None, - [ ([ Gram.Sself; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'ident_quot) (i : 'ident_quot) - (_loc : Gram.Loc.t) -> - (Ast.IdApp (_loc, i, j) : 'ident_quot)))) ]); - ((Some "."), None, - [ ([ Gram.Sself; Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (j : 'ident_quot) _ (i : 'ident_quot) - (_loc : Gram.Loc.t) -> - (Ast.IdAcc (_loc, i, j) : 'ident_quot)))) ]); - ((Some "simple"), None, - [ ([ Gram.Skeyword "("; Gram.Sself; - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (i : 'ident_quot) _ (_loc : Gram.Loc.t) - -> (i : 'ident_quot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (i : 'ident_quot) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAcc (_loc, - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s))), - i) : - 'ident_quot) - | _ -> assert false))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdLid (_loc, i) : 'ident_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_UIDENT : 'a_UIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_UIDENT) (_loc : Gram.Loc.t) -> - (Ast.IdUid (_loc, i) : 'ident_quot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT (("" | "id" | "anti" | "list"), - _) -> true - | _ -> false), - "ANTIQUOT ((\"\" | \"id\" | \"anti\" | \"list\"), _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT - ((("" | "id" | "anti" | "list" as n)), - s) -> - (Ast.IdAnt (_loc, - (mk_anti ~c: "ident" n s)) : - 'ident_quot) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (class_expr_quot : 'class_expr_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.CeNil _loc : 'class_expr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_expr : 'class_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'class_expr) (_loc : Gram.Loc.t) -> - (x : 'class_expr_quot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("virtual", _) -> true - | _ -> false), - "ANTIQUOT (\"virtual\", _)")); - Gram.Snterm - (Gram.Entry.obj (ident : 'ident Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_comma_ctyp : - 'opt_comma_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ot : 'opt_comma_ctyp) (i : 'ident) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("virtual" as n)), s) -> - (let anti = - Ast.ViAnt - (mk_anti ~c: "class_expr" n s) - in Ast.CeCon (_loc, anti, i, ot) : - 'class_expr_quot) - | _ -> assert false))); - ([ Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj - (class_name_and_param : - 'class_name_and_param Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((i, ot) : 'class_name_and_param) _ - (_loc : Gram.Loc.t) -> - (Ast.CeCon (_loc, Ast.ViVirtual, - (Ast.IdLid (_loc, i)), ot) : - 'class_expr_quot)))); - ([ Gram.Sself; Gram.Skeyword "="; Gram.Sself ], - (Gram.Action.mk - (fun (ce2 : 'class_expr_quot) _ - (ce1 : 'class_expr_quot) - (_loc : Gram.Loc.t) -> - (Ast.CeEq (_loc, ce1, ce2) : - 'class_expr_quot)))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (ce2 : 'class_expr_quot) _ - (ce1 : 'class_expr_quot) - (_loc : Gram.Loc.t) -> - (Ast.CeAnd (_loc, ce1, ce2) : - 'class_expr_quot)))) ]) ])) - ()); - Gram.extend (class_type_quot : 'class_type_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.CtNil _loc : 'class_type_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_type_plus : - 'class_type_plus Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'class_type_plus) - (_loc : Gram.Loc.t) -> - (x : 'class_type_quot)))); - ([ Gram.Stoken - (((function - | ANTIQUOT ("virtual", _) -> true - | _ -> false), - "ANTIQUOT (\"virtual\", _)")); - Gram.Snterm - (Gram.Entry.obj (ident : 'ident Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_comma_ctyp : - 'opt_comma_ctyp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ot : 'opt_comma_ctyp) (i : 'ident) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ((("virtual" as n)), s) -> - (let anti = - Ast.ViAnt - (mk_anti ~c: "class_type" n s) - in Ast.CtCon (_loc, anti, i, ot) : - 'class_type_quot) - | _ -> assert false))); - ([ Gram.Skeyword "virtual"; - Gram.Snterm - (Gram.Entry.obj - (class_name_and_param : - 'class_name_and_param Gram.Entry.t)) ], - (Gram.Action.mk - (fun ((i, ot) : 'class_name_and_param) _ - (_loc : Gram.Loc.t) -> - (Ast.CtCon (_loc, Ast.ViVirtual, - (Ast.IdLid (_loc, i)), ot) : - 'class_type_quot)))); - ([ Gram.Sself; Gram.Skeyword ":"; Gram.Sself ], - (Gram.Action.mk - (fun (ct2 : 'class_type_quot) _ - (ct1 : 'class_type_quot) - (_loc : Gram.Loc.t) -> - (Ast.CtCol (_loc, ct1, ct2) : - 'class_type_quot)))); - ([ Gram.Sself; Gram.Skeyword "="; Gram.Sself ], - (Gram.Action.mk - (fun (ct2 : 'class_type_quot) _ - (ct1 : 'class_type_quot) - (_loc : Gram.Loc.t) -> - (Ast.CtEq (_loc, ct1, ct2) : - 'class_type_quot)))); - ([ Gram.Sself; Gram.Skeyword "and"; Gram.Sself ], - (Gram.Action.mk - (fun (ct2 : 'class_type_quot) _ - (ct1 : 'class_type_quot) - (_loc : Gram.Loc.t) -> - (Ast.CtAnd (_loc, ct1, ct2) : - 'class_type_quot)))) ]) ])) - ()); - Gram.extend - (class_str_item_quot : 'class_str_item_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.CrNil _loc : 'class_str_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_str_item : - 'class_str_item Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'class_str_item) (_loc : Gram.Loc.t) - -> (x : 'class_str_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_str_item : - 'class_str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (x2 : 'class_str_item_quot) _ - (x1 : 'class_str_item) (_loc : Gram.Loc.t) - -> - (match x2 with - | Ast.CrNil _ -> x1 - | _ -> Ast.CrSem (_loc, x1, x2) : - 'class_str_item_quot)))) ]) ])) - ()); - Gram.extend - (class_sig_item_quot : 'class_sig_item_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.CgNil _loc : 'class_sig_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_sig_item : - 'class_sig_item Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'class_sig_item) (_loc : Gram.Loc.t) - -> (x : 'class_sig_item_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (class_sig_item : - 'class_sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (semi : 'semi Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (x2 : 'class_sig_item_quot) _ - (x1 : 'class_sig_item) (_loc : Gram.Loc.t) - -> - (match x2 with - | Ast.CgNil _ -> x1 - | _ -> Ast.CgSem (_loc, x1, x2) : - 'class_sig_item_quot)))) ]) ])) - ()); - Gram.extend - (with_constr_quot : 'with_constr_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (Ast.WcNil _loc : 'with_constr_quot)))); - ([ Gram.Snterm - (Gram.Entry.obj - (with_constr : 'with_constr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'with_constr) (_loc : Gram.Loc.t) -> - (x : 'with_constr_quot)))) ]) ])) - ()); - Gram.extend (rec_flag_quot : 'rec_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_rec : 'opt_rec Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_rec) (_loc : Gram.Loc.t) -> - (x : 'rec_flag_quot)))) ]) ])) - ()); - Gram.extend - (direction_flag_quot : 'direction_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (direction_flag : - 'direction_flag Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'direction_flag) (_loc : Gram.Loc.t) - -> (x : 'direction_flag_quot)))) ]) ])) - ()); - Gram.extend - (mutable_flag_quot : 'mutable_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_mutable : 'opt_mutable Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_mutable) (_loc : Gram.Loc.t) -> - (x : 'mutable_flag_quot)))) ]) ])) - ()); - Gram.extend - (private_flag_quot : 'private_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_private : 'opt_private Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_private) (_loc : Gram.Loc.t) -> - (x : 'private_flag_quot)))) ]) ])) - ()); - Gram.extend - (virtual_flag_quot : 'virtual_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_virtual : 'opt_virtual Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_virtual) (_loc : Gram.Loc.t) -> - (x : 'virtual_flag_quot)))) ]) ])) - ()); - Gram.extend - (row_var_flag_quot : 'row_var_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_dot_dot : 'opt_dot_dot Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_dot_dot) (_loc : Gram.Loc.t) -> - (x : 'row_var_flag_quot)))) ]) ])) - ()); - Gram.extend - (override_flag_quot : 'override_flag_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (opt_override : - 'opt_override Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'opt_override) (_loc : Gram.Loc.t) - -> (x : 'override_flag_quot)))) ]) ])) - ()); - Gram.extend (patt_eoi : 'patt_eoi Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) (x : 'patt) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (x : 'patt_eoi) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (expr_eoi : 'expr_eoi Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Stoken - (((function | EOI -> true | _ -> false), - "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) (x : 'expr) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (x : 'expr_eoi) - | _ -> assert false))) ]) ])) - ())) - in apply () - - end - - let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () - - end - -module Camlp4QuotationCommon = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Nicolas Pouillard: initial version - *) - module Id = - struct - let name = "Camlp4QuotationCommon" - - let version = Sys.ocaml_version - - end - - module Make - (Syntax : Sig.Camlp4Syntax) - (TheAntiquotSyntax : Sig.Parser(Syntax.Ast).SIMPLE) = - struct - open Sig - - include Syntax - - (* Be careful an AntiquotSyntax module appears here *) - module MetaLocHere = Ast.Meta.MetaLoc - - module MetaLoc = - struct - module Ast = Ast - - let loc_name = ref None - - let meta_loc_expr _loc loc = - match !loc_name with - | None -> Ast.ExId (_loc, (Ast.IdLid (_loc, !Loc.name))) - | Some "here" -> MetaLocHere.meta_loc_expr _loc loc - | Some x -> Ast.ExId (_loc, (Ast.IdLid (_loc, x))) - - let meta_loc_patt _loc _ = Ast.PaAny _loc - - end - - module MetaAst = Ast.Meta.Make(MetaLoc) - - module ME = MetaAst.Expr - - module MP = MetaAst.Patt - - let is_antiquot s = - let len = String.length s - in (len > 2) && ((s.[0] = '\\') && (s.[1] = '$')) - - let handle_antiquot_in_string s term parse loc decorate = - if is_antiquot s - then - (let pos = String.index s ':' in - let name = String.sub s 2 (pos - 2) - and code = - String.sub s (pos + 1) (((String.length s) - pos) - 1) - in decorate name (parse loc code)) - else term - - let antiquot_expander = - object - inherit Ast.map as super - method patt = - function - | (Ast.PaAnt (_loc, s) | Ast.PaStr (_loc, s) as p) -> - let mloc _loc = MetaLoc.meta_loc_patt _loc _loc - in - handle_antiquot_in_string s p TheAntiquotSyntax. - parse_patt _loc - (fun n p -> - match n with - | "antisig_item" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgAnt")))))), - (mloc _loc))), - p) - | "antistr_item" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StAnt")))))), - (mloc _loc))), - p) - | "antictyp" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnt")))))), - (mloc _loc))), - p) - | "antipatt" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAnt")))))), - (mloc _loc))), - p) - | "antiexpr" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAnt")))))), - (mloc _loc))), - p) - | "antimodule_type" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtAnt")))))), - (mloc _loc))), - p) - | "antimodule_expr" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeAnt")))))), - (mloc _loc))), - p) - | "anticlass_type" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtAnt")))))), - (mloc _loc))), - p) - | "anticlass_expr" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeAnt")))))), - (mloc _loc))), - p) - | "anticlass_sig_item" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgAnt")))))), - (mloc _loc))), - p) - | "anticlass_str_item" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrAnt")))))), - (mloc _loc))), - p) - | "antiwith_constr" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcAnt")))))), - (mloc _loc))), - p) - | "antibinding" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiAnt")))))), - (mloc _loc))), - p) - | "antirec_binding" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbAnt")))))), - (mloc _loc))), - p) - | "antimatch_case" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McAnt")))))), - (mloc _loc))), - p) - | "antimodule_binding" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbAnt")))))), - (mloc _loc))), - p) - | "antiident" -> - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdAnt")))))), - (mloc _loc))), - p) - | _ -> p) - | p -> super#patt p - method expr = - function - | (Ast.ExAnt (_loc, s) | Ast.ExStr (_loc, s) as e) -> - let mloc _loc = MetaLoc.meta_loc_expr _loc _loc - in - handle_antiquot_in_string s e TheAntiquotSyntax. - parse_expr _loc - (fun n e -> - match n with - | "`int" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "string_of_int")))), - e) - | "`int32" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Int32")), - (Ast.IdLid (_loc, "to_string")))))), - e) - | "`int64" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Int64")), - (Ast.IdLid (_loc, "to_string")))))), - e) - | "`nativeint" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Nativeint")), - (Ast.IdLid (_loc, "to_string")))))), - e) - | "`flo" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4_import")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Oprint")), - (Ast.IdLid (_loc, "float_repres")))))))), - e) - | "`str" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "safe_string_escaped")))))), - e) - | "`chr" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Char")), - (Ast.IdLid (_loc, "escaped")))))), - e) - | "`bool" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdUid")))))), - (mloc _loc))), - (Ast.ExIfe (_loc, e, - (Ast.ExStr (_loc, "True")), - (Ast.ExStr (_loc, "False"))))) - | "liststr_item" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "stSem_of_list")))))), - e) - | "listsig_item" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "sgSem_of_list")))))), - e) - | "listclass_sig_item" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "cgSem_of_list")))))), - e) - | "listclass_str_item" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "crSem_of_list")))))), - e) - | "listmodule_expr" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "meApp_of_list")))))), - e) - | "listmodule_type" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "mtApp_of_list")))))), - e) - | "listmodule_binding" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "mbAnd_of_list")))))), - e) - | "listbinding" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "biAnd_of_list")))))), - e) - | "listbinding;" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "biSem_of_list")))))), - e) - | "listrec_binding" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "rbSem_of_list")))))), - e) - | "listclass_type" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "ctAnd_of_list")))))), - e) - | "listclass_expr" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "ceAnd_of_list")))))), - e) - | "listident" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "idAcc_of_list")))))), - e) - | "listctypand" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tyAnd_of_list")))))), - e) - | "listctyp;" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tySem_of_list")))))), - e) - | "listctyp*" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tySta_of_list")))))), - e) - | "listctyp|" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tyOr_of_list")))))), - e) - | "listctyp," -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tyCom_of_list")))))), - e) - | "listctyp&" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "tyAmp_of_list")))))), - e) - | "listwith_constr" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "wcAnd_of_list")))))), - e) - | "listmatch_case" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "mcOr_of_list")))))), - e) - | "listpatt," -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "paCom_of_list")))))), - e) - | "listpatt;" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "paSem_of_list")))))), - e) - | "listexpr," -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "exCom_of_list")))))), - e) - | "listexpr;" -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdLid (_loc, "exSem_of_list")))))), - e) - | "antisig_item" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "SgAnt")))))), - (mloc _loc))), - e) - | "antistr_item" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "StAnt")))))), - (mloc _loc))), - e) - | "antictyp" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "TyAnt")))))), - (mloc _loc))), - e) - | "antipatt" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "PaAnt")))))), - (mloc _loc))), - e) - | "antiexpr" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "ExAnt")))))), - (mloc _loc))), - e) - | "antimodule_type" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MtAnt")))))), - (mloc _loc))), - e) - | "antimodule_expr" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MeAnt")))))), - (mloc _loc))), - e) - | "anticlass_type" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CtAnt")))))), - (mloc _loc))), - e) - | "anticlass_expr" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CeAnt")))))), - (mloc _loc))), - e) - | "anticlass_sig_item" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CgAnt")))))), - (mloc _loc))), - e) - | "anticlass_str_item" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "CrAnt")))))), - (mloc _loc))), - e) - | "antiwith_constr" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "WcAnt")))))), - (mloc _loc))), - e) - | "antibinding" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "BiAnt")))))), - (mloc _loc))), - e) - | "antirec_binding" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "RbAnt")))))), - (mloc _loc))), - e) - | "antimatch_case" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "McAnt")))))), - (mloc _loc))), - e) - | "antimodule_binding" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "MbAnt")))))), - (mloc _loc))), - e) - | "antiident" -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, "IdAnt")))))), - (mloc _loc))), - e) - | _ -> e) - | e -> super#expr e - end - - let add_quotation name entry mexpr mpatt = - let entry_eoi = Gram.Entry.mk (Gram.Entry.name entry) in - let parse_quot_string entry loc s = - let q = !Camlp4_config.antiquotations in - let () = Camlp4_config.antiquotations := true in - let res = Gram.parse_string entry loc s in - let () = Camlp4_config.antiquotations := q in res in - let expand_expr loc loc_name_opt s = - let ast = parse_quot_string entry_eoi loc s in - let () = MetaLoc.loc_name := loc_name_opt in - let meta_ast = mexpr loc ast in - let exp_ast = antiquot_expander#expr meta_ast in exp_ast in - let expand_str_item loc loc_name_opt s = - let exp_ast = expand_expr loc loc_name_opt s - in Ast.StExp (loc, exp_ast) in - let expand_patt _loc loc_name_opt s = - let ast = parse_quot_string entry_eoi _loc s in - let meta_ast = mpatt _loc ast in - let exp_ast = antiquot_expander#patt meta_ast - in - match loc_name_opt with - | None -> exp_ast - | Some name -> - let rec subst_first_loc = - (function - | Ast.PaApp (_loc, - (Ast.PaId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Ast")), - (Ast.IdUid (_, u)))))), - _) -> - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Ast")), - (Ast.IdUid (_loc, u)))))), - (Ast.PaId (_loc, (Ast.IdLid (_loc, name))))) - | Ast.PaApp (_loc, a, b) -> - Ast.PaApp (_loc, (subst_first_loc a), b) - | p -> p) - in subst_first_loc exp_ast - in - (Gram.extend (entry_eoi : 'entry_eoi Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (entry : 'entry Gram.Entry.t)); - Gram.Stoken - (((function | EOI -> true | _ -> false), "EOI")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) (x : 'entry) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | EOI -> (x : 'entry_eoi) - | _ -> assert false))) ]) ])) - ()); - Quotation.add name Quotation.DynAst.expr_tag expand_expr; - Quotation.add name Quotation.DynAst.patt_tag expand_patt; - Quotation.add name Quotation.DynAst.str_item_tag expand_str_item) - - let _ = - add_quotation "sig_item" sig_item_quot ME.meta_sig_item MP. - meta_sig_item - - let _ = - add_quotation "str_item" str_item_quot ME.meta_str_item MP. - meta_str_item - - let _ = add_quotation "ctyp" ctyp_quot ME.meta_ctyp MP.meta_ctyp - - let _ = add_quotation "patt" patt_quot ME.meta_patt MP.meta_patt - - let _ = add_quotation "expr" expr_quot ME.meta_expr MP.meta_expr - - let _ = - add_quotation "module_type" module_type_quot ME.meta_module_type - MP.meta_module_type - - let _ = - add_quotation "module_expr" module_expr_quot ME.meta_module_expr - MP.meta_module_expr - - let _ = - add_quotation "class_type" class_type_quot ME.meta_class_type MP. - meta_class_type - - let _ = - add_quotation "class_expr" class_expr_quot ME.meta_class_expr MP. - meta_class_expr - - let _ = - add_quotation "class_sig_item" class_sig_item_quot ME. - meta_class_sig_item MP.meta_class_sig_item - - let _ = - add_quotation "class_str_item" class_str_item_quot ME. - meta_class_str_item MP.meta_class_str_item - - let _ = - add_quotation "with_constr" with_constr_quot ME.meta_with_constr - MP.meta_with_constr - - let _ = - add_quotation "binding" binding_quot ME.meta_binding MP. - meta_binding - - let _ = - add_quotation "rec_binding" rec_binding_quot ME.meta_rec_binding - MP.meta_rec_binding - - let _ = - add_quotation "match_case" match_case_quot ME.meta_match_case MP. - meta_match_case - - let _ = - add_quotation "module_binding" module_binding_quot ME. - meta_module_binding MP.meta_module_binding - - let _ = add_quotation "ident" ident_quot ME.meta_ident MP.meta_ident - - let _ = - add_quotation "rec_flag" rec_flag_quot ME.meta_rec_flag MP. - meta_rec_flag - - let _ = - add_quotation "private_flag" private_flag_quot ME.meta_private_flag - MP.meta_private_flag - - let _ = - add_quotation "row_var_flag" row_var_flag_quot ME.meta_row_var_flag - MP.meta_row_var_flag - - let _ = - add_quotation "mutable_flag" mutable_flag_quot ME.meta_mutable_flag - MP.meta_mutable_flag - - let _ = - add_quotation "virtual_flag" virtual_flag_quot ME.meta_virtual_flag - MP.meta_virtual_flag - - let _ = - add_quotation "override_flag" override_flag_quot ME. - meta_override_flag MP.meta_override_flag - - let _ = - add_quotation "direction_flag" direction_flag_quot ME. - meta_direction_flag MP.meta_direction_flag - - end - - end - -module Q = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - module Id = - struct - let name = "Camlp4QuotationExpander" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - module M = Camlp4QuotationCommon.Make(Syntax)(Syntax.AntiquotSyntax) - - include M - - end - - let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () - - end - -module Rp = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 1998-2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - module Id : Sig.Id = - struct - let name = "Camlp4OCamlRevisedParserParser" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - type spat_comp = - | SpTrm of Loc.t * Ast.patt * Ast.expr option - | SpNtr of Loc.t * Ast.patt * Ast.expr - | SpStr of Loc.t * Ast.patt - - type sexp_comp = - | SeTrm of Loc.t * Ast.expr | SeNtr of Loc.t * Ast.expr - - let stream_expr = Gram.Entry.mk "stream_expr" - - let stream_begin = Gram.Entry.mk "stream_begin" - - let stream_end = Gram.Entry.mk "stream_end" - - let stream_quot = Gram.Entry.mk "stream_quot" - - let parser_case = Gram.Entry.mk "parser_case" - - let parser_case_list = Gram.Entry.mk "parser_case_list" - - let strm_n = "__strm" - - let peek_fun _loc = - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "peek"))))) - - let junk_fun _loc = - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "junk"))))) - - (* Parsers. *) - (* In syntax generated, many cases are optimisations. *) - let rec pattern_eq_expression p e = - match (p, e) with - | (Ast.PaId (_, (Ast.IdLid (_, a))), - Ast.ExId (_, (Ast.IdLid (_, b)))) -> a = b - | (Ast.PaId (_, (Ast.IdUid (_, a))), - Ast.ExId (_, (Ast.IdUid (_, b)))) -> a = b - | (Ast.PaApp (_, p1, p2), Ast.ExApp (_, e1, e2)) -> - (pattern_eq_expression p1 e1) && (pattern_eq_expression p2 e2) - | _ -> false - - let is_raise e = - match e with - | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), _) -> - true - | _ -> false - - let is_raise_failure e = - match e with - | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), - (Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), - (Ast.IdUid (_, "Failure"))))))) - -> true - | _ -> false - - let rec handle_failure e = - match e with - | Ast.ExTry (_, _, - (Ast.McArr (_, - (Ast.PaId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), - (Ast.IdUid (_, "Failure")))))), - (Ast.ExNil _), e))) - -> handle_failure e - | Ast.ExMat (_, me, a) -> - let rec match_case_handle_failure = - (function - | Ast.McOr (_, a1, a2) -> - (match_case_handle_failure a1) && - (match_case_handle_failure a2) - | Ast.McArr (_, _, (Ast.ExNil _), e) -> handle_failure e - | _ -> false) - in (handle_failure me) && (match_case_handle_failure a) - | Ast.ExLet (_, Ast.ReNil, bi, e) -> - let rec binding_handle_failure = - (function - | Ast.BiAnd (_, b1, b2) -> - (binding_handle_failure b1) && - (binding_handle_failure b2) - | Ast.BiEq (_, _, e) -> handle_failure e - | _ -> false) - in (binding_handle_failure bi) && (handle_failure e) - | Ast.ExId (_, (Ast.IdLid (_, _))) | Ast.ExInt (_, _) | - Ast.ExStr (_, _) | Ast.ExChr (_, _) | Ast.ExFun (_, _) | - Ast.ExId (_, (Ast.IdUid (_, _))) -> true - | Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "raise")))), e) -> - (match e with - | Ast.ExId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), - (Ast.IdUid (_, "Failure"))))) - -> false - | _ -> true) - | Ast.ExApp (_, f, x) -> - (is_constr_apply f) && - ((handle_failure f) && (handle_failure x)) - | _ -> false - and is_constr_apply = - function - | Ast.ExId (_, (Ast.IdUid (_, _))) -> true - | Ast.ExId (_, (Ast.IdLid (_, _))) -> false - | Ast.ExApp (_, x, _) -> is_constr_apply x - | _ -> false - - let rec subst v e = - let _loc = Ast.loc_of_expr e - in - match e with - | Ast.ExId (_, (Ast.IdLid (_, x))) -> - let x = if x = v then strm_n else x - in Ast.ExId (_loc, (Ast.IdLid (_loc, x))) - | Ast.ExId (_, (Ast.IdUid (_, _))) -> e - | Ast.ExInt (_, _) -> e - | Ast.ExChr (_, _) -> e - | Ast.ExStr (_, _) -> e - | Ast.ExAcc (_, _, _) -> e - | Ast.ExLet (_, rf, bi, e) -> - Ast.ExLet (_loc, rf, (subst_binding v bi), (subst v e)) - | Ast.ExApp (_, e1, e2) -> - Ast.ExApp (_loc, (subst v e1), (subst v e2)) - | Ast.ExTup (_, e) -> Ast.ExTup (_loc, (subst v e)) - | Ast.ExCom (_, e1, e2) -> - Ast.ExCom (_loc, (subst v e1), (subst v e2)) - | _ -> raise Not_found - and subst_binding v = - function - | Ast.BiAnd (_loc, b1, b2) -> - Ast.BiAnd (_loc, (subst_binding v b1), (subst_binding v b2)) - | Ast.BiEq (_loc, (Ast.PaId (_, (Ast.IdLid (_, v')))), e) -> - Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, v')))), - (if v = v' then e else subst v e)) - | _ -> raise Not_found - - let stream_pattern_component skont ckont = - function - | SpTrm (_loc, p, None) -> - Ast.ExMat (_loc, - (Ast.ExApp (_loc, (peek_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - (Ast.McOr (_loc, - (Ast.McArr (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)), - (Ast.ExNil _loc), - (Ast.ExSeq (_loc, - (Ast.ExSem (_loc, - (Ast.ExApp (_loc, (junk_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - skont)))))), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - ckont))))) - | SpTrm (_loc, p, (Some w)) -> - Ast.ExMat (_loc, - (Ast.ExApp (_loc, (peek_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - (Ast.McOr (_loc, - (Ast.McArr (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)), - w, - (Ast.ExSeq (_loc, - (Ast.ExSem (_loc, - (Ast.ExApp (_loc, (junk_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - skont)))))), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - ckont))))) - | SpNtr (_loc, p, e) -> - let e = - (match e with - | Ast.ExFun (_, - (Ast.McArr (_, - (Ast.PaTyc (_, (Ast.PaId (_, (Ast.IdLid (_, v)))), - (Ast.TyApp (_, - (Ast.TyId (_, - (Ast.IdAcc (_, (Ast.IdUid (_, "Stream")), - (Ast.IdLid (_, "t")))))), - (Ast.TyAny _))))), - (Ast.ExNil _), e))) - when v = strm_n -> e - | _ -> - Ast.ExApp (_loc, e, - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))) - in - if pattern_eq_expression p skont - then - if is_raise_failure ckont - then e - else - if handle_failure e - then e - else - Ast.ExTry (_loc, e, - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Failure")))))), - (Ast.ExNil _loc), ckont))) - else - if is_raise_failure ckont - then - Ast.ExLet (_loc, Ast.ReNil, (Ast.BiEq (_loc, p, e)), - skont) - else - if - pattern_eq_expression - (Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p)) - skont - then - Ast.ExTry (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), e)), - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Failure")))))), - (Ast.ExNil _loc), ckont))) - else - if is_raise ckont - then - (let tst = - if handle_failure e - then e - else - Ast.ExTry (_loc, e, - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Failure")))))), - (Ast.ExNil _loc), ckont))) - in - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, p, tst)), skont)) - else - Ast.ExMat (_loc, - (Ast.ExTry (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), - e)), - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Failure")))))), - (Ast.ExNil _loc), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "None")))))))), - (Ast.McOr (_loc, - (Ast.McArr (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "Some")))), - p)), - (Ast.ExNil _loc), skont)), - (Ast.McArr (_loc, (Ast.PaAny _loc), - (Ast.ExNil _loc), ckont))))) - | SpStr (_loc, p) -> - (try - match p with - | Ast.PaId (_, (Ast.IdLid (_, v))) -> subst v skont - | _ -> raise Not_found - with - | Not_found -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, p, - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - skont)) - - let rec stream_pattern _loc epo e ekont = - function - | [] -> - (match epo with - | Some ep -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, ep, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "count")))))), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), - e) - | _ -> e) - | (spc, err) :: spcl -> - let skont = - let ekont err = - let str = - (match err with - | Some estr -> estr - | _ -> Ast.ExStr (_loc, "")) - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Error")))))), - str))) - in stream_pattern _loc epo e ekont spcl in - let ckont = ekont err - in stream_pattern_component skont ckont spc - - let stream_patterns_term _loc ekont tspel = - let pel = - List.fold_right - (fun (p, w, _loc, spcl, epo, e) acc -> - let p = - Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "Some")))), p) in - let e = - let ekont err = - let str = - match err with - | Some estr -> estr - | _ -> Ast.ExStr (_loc, "") - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Error")))))), - str))) in - let skont = stream_pattern _loc epo e ekont spcl - in - Ast.ExSeq (_loc, - (Ast.ExSem (_loc, - (Ast.ExApp (_loc, (junk_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - skont))) - in - match w with - | Some w -> - Ast.McOr (_loc, (Ast.McArr (_loc, p, w, e)), acc) - | None -> - Ast.McOr (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), e)), acc)) - tspel (Ast.McNil _loc) - in - Ast.ExMat (_loc, - (Ast.ExApp (_loc, (peek_fun _loc), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))), - (Ast.McOr (_loc, pel, - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - (ekont ())))))) - - let rec group_terms = - function - | ((SpTrm (_loc, p, w), None) :: spcl, epo, e) :: spel -> - let (tspel, spel) = group_terms spel - in (((p, w, _loc, spcl, epo, e) :: tspel), spel) - | spel -> ([], spel) - - let rec parser_cases _loc = - function - | [] -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, "raise")))), - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdUid (_loc, "Failure"))))))) - | spel -> - (match group_terms spel with - | ([], (spcl, epo, e) :: spel) -> - stream_pattern _loc epo e - (fun _ -> parser_cases _loc spel) spcl - | (tspel, spel) -> - stream_patterns_term _loc - (fun _ -> parser_cases _loc spel) tspel) - - let cparser _loc bpo pc = - let e = parser_cases _loc pc in - let e = - match bpo with - | Some bp -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, bp, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "count")))))), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), - e) - | None -> e in - let p = - Ast.PaTyc (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, strm_n)))), - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyAny _loc)))) - in Ast.ExFun (_loc, (Ast.McArr (_loc, p, (Ast.ExNil _loc), e))) - - let cparser_match _loc me bpo pc = - let pc = parser_cases _loc pc in - let e = - match bpo with - | Some bp -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, bp, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "count")))))), - (Ast.ExId (_loc, (Ast.IdLid (_loc, strm_n)))))))), - pc) - | None -> pc in - let me = - match me with - | (Ast.ExSem (_loc, _, _) as e) -> Ast.ExSeq (_loc, e) - | e -> e - in - match me with - | Ast.ExId (_, (Ast.IdLid (_, x))) when x = strm_n -> e - | _ -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, - (Ast.PaTyc (_loc, - (Ast.PaId (_loc, (Ast.IdLid (_loc, strm_n)))), - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyAny _loc))))), - me)), - e) - - (* streams *) - let rec not_computing = - function - | Ast.ExId (_, (Ast.IdLid (_, _))) | - Ast.ExId (_, (Ast.IdUid (_, _))) | Ast.ExInt (_, _) | - Ast.ExFlo (_, _) | Ast.ExChr (_, _) | Ast.ExStr (_, _) -> true - | Ast.ExApp (_, x, y) -> - (is_cons_apply_not_computing x) && (not_computing y) - | _ -> false - and is_cons_apply_not_computing = - function - | Ast.ExId (_, (Ast.IdUid (_, _))) -> true - | Ast.ExId (_, (Ast.IdLid (_, _))) -> false - | Ast.ExApp (_, x, y) -> - (is_cons_apply_not_computing x) && (not_computing y) - | _ -> false - - let slazy _loc e = - match e with - | Ast.ExApp (_, f, (Ast.ExId (_, (Ast.IdUid (_, "()"))))) -> - (match f with - | Ast.ExId (_, (Ast.IdLid (_, _))) -> f - | _ -> - Ast.ExFun (_loc, - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), e)))) - | _ -> - Ast.ExFun (_loc, - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), e))) - - let rec cstream gloc = - function - | [] -> - let _loc = gloc - in - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "sempty"))))) - | [ SeTrm (_loc, e) ] -> - if not_computing e - then - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "ising")))))), - e) - else - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "lsing")))))), - (slazy _loc e)) - | SeTrm (_loc, e) :: secl -> - if not_computing e - then - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "icons")))))), - e)), - (cstream gloc secl)) - else - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "lcons")))))), - (slazy _loc e))), - (cstream gloc secl)) - | [ SeNtr (_loc, e) ] -> - if not_computing e - then e - else - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "slazy")))))), - (slazy _loc e)) - | SeNtr (_loc, e) :: secl -> - if not_computing e - then - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "iapp")))))), - e)), - (cstream gloc secl)) - else - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Stream")), - (Ast.IdLid (_loc, "lapp")))))), - (slazy _loc e))), - (cstream gloc secl)) - - (* Syntax extensions in Revised Syntax grammar *) - let _ = - let _ = (expr : 'expr Gram.Entry.t) - and _ = (parser_case_list : 'parser_case_list Gram.Entry.t) - and _ = (parser_case : 'parser_case Gram.Entry.t) - and _ = (stream_quot : 'stream_quot Gram.Entry.t) - and _ = (stream_end : 'stream_end Gram.Entry.t) - and _ = (stream_begin : 'stream_begin Gram.Entry.t) - and _ = (stream_expr : 'stream_expr Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let stream_patt : 'stream_patt Gram.Entry.t = - grammar_entry_create "stream_patt" - and stream_expr_comp : 'stream_expr_comp Gram.Entry.t = - grammar_entry_create "stream_expr_comp" - and stream_expr_comp_list : 'stream_expr_comp_list Gram.Entry.t = - grammar_entry_create "stream_expr_comp_list" - and parser_ipatt : 'parser_ipatt Gram.Entry.t = - grammar_entry_create "parser_ipatt" - and stream_patt_comp : 'stream_patt_comp Gram.Entry.t = - grammar_entry_create "stream_patt_comp" - and stream_patt_comp_err_list : - 'stream_patt_comp_err_list Gram.Entry.t = - grammar_entry_create "stream_patt_comp_err_list" - and stream_patt_comp_err : 'stream_patt_comp_err Gram.Entry.t = - grammar_entry_create "stream_patt_comp_err" - in - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "top")), - [ (None, None, - [ ([ Gram.Skeyword "match"; - Gram.Snterm - (Gram.Entry.obj - (sequence : 'sequence Gram.Entry.t)); - Gram.Skeyword "with"; Gram.Skeyword "parser"; - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (parser_ipatt : - 'parser_ipatt Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (parser_case_list : - 'parser_case_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (pcl : 'parser_case_list) - (po : 'parser_ipatt option) _ _ - (e : 'sequence) _ (_loc : Gram.Loc.t) -> - (cparser_match _loc e po pcl : 'expr)))); - ([ Gram.Skeyword "parser"; - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (parser_ipatt : - 'parser_ipatt Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (parser_case_list : - 'parser_case_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (pcl : 'parser_case_list) - (po : 'parser_ipatt option) _ - (_loc : Gram.Loc.t) -> - (cparser _loc po pcl : 'expr)))) ]) ])) - ()); - Gram.extend (parser_case_list : 'parser_case_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (parser_case : 'parser_case Gram.Entry.t)) ], - (Gram.Action.mk - (fun (pc : 'parser_case) (_loc : Gram.Loc.t) -> - ([ pc ] : 'parser_case_list)))); - ([ Gram.Skeyword "["; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (parser_case : - 'parser_case Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (pcl : 'parser_case list) _ - (_loc : Gram.Loc.t) -> - (pcl : 'parser_case_list)))) ]) ])) - ()); - Gram.extend (parser_case : 'parser_case Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_begin : 'stream_begin Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_patt : 'stream_patt Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_end : 'stream_end Gram.Entry.t)); - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (parser_ipatt : - 'parser_ipatt Gram.Entry.t))); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (po : 'parser_ipatt option) _ - (sp : 'stream_patt) _ (_loc : Gram.Loc.t) -> - ((sp, po, e) : 'parser_case)))) ]) ])) - ()); - Gram.extend (stream_begin : 'stream_begin Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "[:" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'stream_begin)))) ]) ])) - ()); - Gram.extend (stream_end : 'stream_end Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword ":]" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> (() : 'stream_end)))) ]) ])) - ()); - Gram.extend (stream_quot : 'stream_quot Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "`" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (() : 'stream_quot)))) ]) ])) - ()); - Gram.extend (stream_expr : 'stream_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (e : 'stream_expr)))) ]) ])) - ()); - Gram.extend (stream_patt : 'stream_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> ([] : 'stream_patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp : - 'stream_patt_comp Gram.Entry.t)); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp_err_list : - 'stream_patt_comp_err_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sp : 'stream_patt_comp_err_list) _ - (spc : 'stream_patt_comp) (_loc : Gram.Loc.t) - -> ((spc, None) :: sp : 'stream_patt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp : - 'stream_patt_comp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (spc : 'stream_patt_comp) - (_loc : Gram.Loc.t) -> - ([ (spc, None) ] : 'stream_patt)))) ]) ])) - ()); - Gram.extend - (stream_patt_comp_err : 'stream_patt_comp_err Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp : - 'stream_patt_comp Gram.Entry.t)); - Gram.Sopt - (Gram.srules stream_patt_comp_err - [ ([ Gram.Skeyword "??"; - Gram.Snterm - (Gram.Entry.obj - (stream_expr : - 'stream_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'stream_expr) _ - (_loc : Gram.Loc.t) -> (e : 'e__14)))) ]) ], - (Gram.Action.mk - (fun (eo : 'e__14 option) - (spc : 'stream_patt_comp) (_loc : Gram.Loc.t) - -> ((spc, eo) : 'stream_patt_comp_err)))) ]) ])) - ()); - Gram.extend - (stream_patt_comp_err_list : - 'stream_patt_comp_err_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp_err : - 'stream_patt_comp_err Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (sp : 'stream_patt_comp_err_list) _ - (spc : 'stream_patt_comp_err) - (_loc : Gram.Loc.t) -> - (spc :: sp : 'stream_patt_comp_err_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp_err : - 'stream_patt_comp_err Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (spc : 'stream_patt_comp_err) - (_loc : Gram.Loc.t) -> - ([ spc ] : 'stream_patt_comp_err_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_patt_comp_err : - 'stream_patt_comp_err Gram.Entry.t)) ], - (Gram.Action.mk - (fun (spc : 'stream_patt_comp_err) - (_loc : Gram.Loc.t) -> - ([ spc ] : 'stream_patt_comp_err_list)))) ]) ])) - ()); - Gram.extend (stream_patt_comp : 'stream_patt_comp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) (_loc : Gram.Loc.t) -> - (SpStr (_loc, p) : 'stream_patt_comp)))); - ([ Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj - (stream_expr : 'stream_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'stream_expr) _ (p : 'patt) - (_loc : Gram.Loc.t) -> - (SpNtr (_loc, p, e) : 'stream_patt_comp)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_quot : 'stream_quot Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)); - Gram.Sopt - (Gram.srules stream_patt_comp - [ ([ Gram.Skeyword "when"; - Gram.Snterm - (Gram.Entry.obj - (stream_expr : - 'stream_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'stream_expr) _ - (_loc : Gram.Loc.t) -> (e : 'e__15)))) ]) ], - (Gram.Action.mk - (fun (eo : 'e__15 option) (p : 'patt) _ - (_loc : Gram.Loc.t) -> - (SpTrm (_loc, p, eo) : 'stream_patt_comp)))) ]) ])) - ()); - Gram.extend (parser_ipatt : 'parser_ipatt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.PaAny _loc : 'parser_ipatt)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.PaId (_loc, (Ast.IdLid (_loc, i))) : - 'parser_ipatt)))) ]) ])) - ()); - Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "simple")), - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_begin : 'stream_begin Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_expr_comp_list : - 'stream_expr_comp_list Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_end : 'stream_end Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (sel : 'stream_expr_comp_list) _ - (_loc : Gram.Loc.t) -> - (cstream _loc sel : 'expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_begin : 'stream_begin Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_end : 'stream_end Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - (cstream _loc [] : 'expr)))) ]) ])) - ()); - Gram.extend - (stream_expr_comp_list : 'stream_expr_comp_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_expr_comp : - 'stream_expr_comp Gram.Entry.t)) ], - (Gram.Action.mk - (fun (se : 'stream_expr_comp) - (_loc : Gram.Loc.t) -> - ([ se ] : 'stream_expr_comp_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_expr_comp : - 'stream_expr_comp Gram.Entry.t)); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (se : 'stream_expr_comp) - (_loc : Gram.Loc.t) -> - ([ se ] : 'stream_expr_comp_list)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_expr_comp : - 'stream_expr_comp Gram.Entry.t)); - Gram.Skeyword ";"; Gram.Sself ], - (Gram.Action.mk - (fun (sel : 'stream_expr_comp_list) _ - (se : 'stream_expr_comp) (_loc : Gram.Loc.t) - -> (se :: sel : 'stream_expr_comp_list)))) ]) ])) - ()); - Gram.extend (stream_expr_comp : 'stream_expr_comp Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (stream_expr : 'stream_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'stream_expr) (_loc : Gram.Loc.t) -> - (SeNtr (_loc, e) : 'stream_expr_comp)))); - ([ Gram.Snterm - (Gram.Entry.obj - (stream_quot : 'stream_quot Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (stream_expr : 'stream_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'stream_expr) _ (_loc : Gram.Loc.t) -> - (SeTrm (_loc, e) : 'stream_expr_comp)))) ]) ])) - ())) - - end - - module M = Register.OCamlSyntaxExtension(Id)(Make) - - end - -module G = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2002-2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - module Id = - struct let name = "Camlp4GrammarParser" - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - module MetaLoc = Ast.Meta.MetaGhostLoc - - module MetaAst = Ast.Meta.Make(MetaLoc) - - module PP = Camlp4.Printers.OCaml.Make(Syntax) - - let pp = new PP.printer ~comments: false () - - let string_of_patt patt = - let buf = Buffer.create 42 in - let () = Format.bprintf buf "%a@?" pp#patt patt in - let str = Buffer.contents buf - in if str = "" then assert false else str - - let split_ext = ref false - - type loc = Loc.t - - type 'e name = { expr : 'e; tvar : string; loc : loc } - - type styp = - | STlid of loc * string - | STapp of loc * styp * styp - | STquo of loc * string - | STself of loc * string - | STtok of loc - | STstring_tok of loc - | STtyp of Ast.ctyp - - type ('e, 'p) text = - | TXmeta of loc * string * (('e, 'p) text) list * 'e * styp - | TXlist of loc * bool * ('e, 'p) symbol * (('e, 'p) symbol) option - | TXnext of loc - | TXnterm of loc * 'e name * string option - | TXopt of loc * ('e, 'p) text - | TXtry of loc * ('e, 'p) text - | TXrules of loc * (((('e, 'p) text) list) * 'e) list - | TXself of loc - | TXkwd of loc * string - | TXtok of loc * 'e * string - and (** The first is the match function expr, - the second is the string description. - The description string will be used for - grammar insertion and left factoring. - Keep this string normalized and well comparable. *) - ('e, 'p) entry = - { name : 'e name; pos : 'e option; levels : (('e, 'p) level) list - } - and ('e, 'p) level = - { label : string option; assoc : 'e option; - rules : (('e, 'p) rule) list - } - and ('e, 'p) rule = - { prod : (('e, 'p) symbol) list; action : 'e option - } - and ('e, 'p) symbol = - { used : string list; text : ('e, 'p) text; styp : styp; - pattern : 'p option - } - - type used = | Unused | UsedScanned | UsedNotScanned - - let _loc = Loc.ghost - - let gm = "Camlp4Grammar__" - - let mark_used modif ht n = - try - let rll = Hashtbl.find_all ht n - in - List.iter - (fun (r, _) -> - if !r == Unused - then (r := UsedNotScanned; modif := true) - else ()) - rll - with | Not_found -> () - - let rec mark_symbol modif ht symb = - List.iter (fun e -> mark_used modif ht e) symb.used - - let check_use nl el = - let ht = Hashtbl.create 301 in - let modif = ref false - in - (List.iter - (fun e -> - let u = - match e.name.expr with - | Ast.ExId (_, (Ast.IdLid (_, _))) -> Unused - | _ -> UsedNotScanned - in Hashtbl.add ht e.name.tvar ((ref u), e)) - el; - List.iter - (fun n -> - try - let rll = Hashtbl.find_all ht n.tvar - in List.iter (fun (r, _) -> r := UsedNotScanned) rll - with | _ -> ()) - nl; - modif := true; - while !modif do modif := false; - Hashtbl.iter - (fun _ (r, e) -> - if !r = UsedNotScanned - then - (r := UsedScanned; - List.iter - (fun level -> - let rules = level.rules - in - List.iter - (fun rule -> - List.iter - (fun s -> mark_symbol modif ht s) - rule.prod) - rules) - e.levels) - else ()) - ht - done; - Hashtbl.iter - (fun s (r, e) -> - if !r = Unused - then - print_warning e.name.loc - ("Unused local entry \"" ^ (s ^ "\"")) - else ()) - ht) - - let new_type_var = - let i = ref 0 in fun () -> (incr i; "e__" ^ (string_of_int !i)) - - let used_of_rule_list rl = - List.fold_left - (fun nl r -> List.fold_left (fun nl s -> s.used @ nl) nl r.prod) - [] rl - - let retype_rule_list_without_patterns _loc rl = - try - List.map - (function - | (* ...; [ "foo" ]; ... ==> ...; (x = [ "foo" ] -> Gram.Token.extract_string x); ... *) - { - prod = [ ({ pattern = None; styp = STtok _ } as s) ]; - action = None - } -> - { - prod = - [ { - (s) - with - pattern = - Some (Ast.PaId (_loc, (Ast.IdLid (_loc, "x")))); - } ]; - action = - Some - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Token")), - (Ast.IdLid (_loc, "extract_string")))))))), - (Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))))); - } - | (* ...; [ symb ]; ... ==> ...; (x = [ symb ] -> x); ... *) - { prod = [ ({ pattern = None } as s) ]; action = None } -> - { - prod = - [ { - (s) - with - pattern = - Some (Ast.PaId (_loc, (Ast.IdLid (_loc, "x")))); - } ]; - action = Some (Ast.ExId (_loc, (Ast.IdLid (_loc, "x")))); - } - | (* ...; ([] -> a); ... *) - ({ prod = []; action = Some _ } as r) -> r - | _ -> raise Exit) - rl - with | Exit -> rl - - let meta_action = ref false - - let mklistexp _loc = - let rec loop top = - function - | [] -> Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))) - | e1 :: el -> - let _loc = - if top then _loc else Loc.merge (Ast.loc_of_expr e1) _loc - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), e1)), - (loop false el)) - in loop true - - let mklistpat _loc = - let rec loop top = - function - | [] -> Ast.PaId (_loc, (Ast.IdUid (_loc, "[]"))) - | p1 :: pl -> - let _loc = - if top then _loc else Loc.merge (Ast.loc_of_patt p1) _loc - in - Ast.PaApp (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "::")))), p1)), - (loop false pl)) - in loop true - - let rec expr_fa al = - function - | Ast.ExApp (_, f, a) -> expr_fa (a :: al) f - | f -> (f, al) - - let rec make_ctyp styp tvar = - match styp with - | STlid (_loc, s) -> Ast.TyId (_loc, (Ast.IdLid (_loc, s))) - | STapp (_loc, t1, t2) -> - Ast.TyApp (_loc, (make_ctyp t1 tvar), (make_ctyp t2 tvar)) - | STquo (_loc, s) -> Ast.TyQuo (_loc, s) - | STself (_loc, x) -> - if tvar = "" - then - Loc.raise _loc - (Stream.Error - ("'" ^ (x ^ "' illegal in anonymous entry level"))) - else Ast.TyQuo (_loc, tvar) - | STtok _loc -> - Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Token")))), - (Ast.IdLid (_loc, "t"))))) - | STstring_tok _loc -> - Ast.TyId (_loc, (Ast.IdLid (_loc, "string"))) - | STtyp t -> t - - let make_ctyp_patt styp tvar patt = - let styp = - match styp with | STstring_tok _loc -> STtok _loc | t -> t - in - match make_ctyp styp tvar with - | Ast.TyAny _ -> patt - | t -> - let _loc = Ast.loc_of_patt patt in Ast.PaTyc (_loc, patt, t) - - let make_ctyp_expr styp tvar expr = - match make_ctyp styp tvar with - | Ast.TyAny _ -> expr - | t -> let _loc = Ast.loc_of_expr expr in Ast.ExTyc (_loc, expr, t) - - let text_of_action _loc psl rtvar act tvar = - let locid = Ast.PaId (_loc, (Ast.IdLid (_loc, !Loc.name))) in - let act = - match act with - | Some act -> act - | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) in - let (tok_match_pl, act, _) = - List.fold_left - (fun (((tok_match_pl, act, i) as accu)) -> - function - | { pattern = None } -> accu - | { pattern = Some p } when Ast.is_irrefut_patt p -> accu - | { - pattern = - Some - (Ast.PaAli (_, - (Ast.PaApp (_, _, (Ast.PaTup (_, (Ast.PaAny _))))), - (Ast.PaId (_, (Ast.IdLid (_, s)))))) - } -> - (tok_match_pl, - (Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, - (Ast.PaId (_loc, (Ast.IdLid (_loc, s)))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Token")), - (Ast.IdLid (_loc, "extract_string")))))))), - (Ast.ExId (_loc, (Ast.IdLid (_loc, s)))))))), - act)), - i) - | { pattern = Some p; text = TXtok (_, _, _) } -> - let id = "__camlp4_" ^ (string_of_int i) - in - ((Some - (match tok_match_pl with - | None -> - ((Ast.ExId (_loc, (Ast.IdLid (_loc, id)))), - p) - | Some ((tok_pl, match_pl)) -> - ((Ast.ExCom (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, id)))), - tok_pl)), - (Ast.PaCom (_loc, p, match_pl))))), - act, (succ i)) - | _ -> accu) - (None, act, 0) psl in - let e = - let e1 = Ast.ExTyc (_loc, act, (Ast.TyQuo (_loc, rtvar))) in - let e2 = - match tok_match_pl with - | None -> e1 - | Some ((Ast.ExCom (_, t1, t2), Ast.PaCom (_, p1, p2))) -> - Ast.ExMat (_loc, - (Ast.ExTup (_loc, (Ast.ExCom (_loc, t1, t2)))), - (Ast.McOr (_loc, - (Ast.McArr (_loc, - (Ast.PaTup (_loc, (Ast.PaCom (_loc, p1, p2)))), - (Ast.ExNil _loc), e1)), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - (Ast.ExAsf _loc)))))) - | Some ((tok, match_)) -> - Ast.ExMat (_loc, tok, - (Ast.McOr (_loc, - (Ast.McArr (_loc, match_, (Ast.ExNil _loc), e1)), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - (Ast.ExAsf _loc)))))) - in - Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaTyc (_loc, locid, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Loc")))), - (Ast.IdLid (_loc, "t")))))))), - (Ast.ExNil _loc), e2))) in - let (txt, _) = - List.fold_left - (fun (txt, i) s -> - match s.pattern with - | None | Some (Ast.PaAny _) -> - ((Ast.ExFun (_loc, - (Ast.McArr (_loc, (Ast.PaAny _loc), - (Ast.ExNil _loc), txt)))), - i) - | Some - (Ast.PaAli (_, - (Ast.PaApp (_, _, (Ast.PaTup (_, (Ast.PaAny _))))), - p)) - -> - let p = make_ctyp_patt s.styp tvar p - in - ((Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), - i) - | Some p when Ast.is_irrefut_patt p -> - let p = make_ctyp_patt s.styp tvar p - in - ((Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), - i) - | Some _ -> - let p = - make_ctyp_patt s.styp tvar - (Ast.PaId (_loc, - (Ast.IdLid (_loc, - ("__camlp4_" ^ (string_of_int i)))))) - in - ((Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), txt)))), - (succ i))) - (e, 0) psl in - let txt = - if !meta_action - then - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Obj")), - (Ast.IdLid (_loc, "magic")))))), - (MetaAst.Expr.meta_expr _loc txt)) - else txt - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Action")), - (Ast.IdLid (_loc, "mk")))))))), - txt) - - let srules loc t rl tvar = - List.map - (fun r -> - let sl = List.map (fun s -> s.text) r.prod in - let ac = text_of_action loc r.prod t r.action tvar in (sl, ac)) - rl - - let rec make_expr entry tvar = - function - | TXmeta (_loc, n, tl, e, t) -> - let el = - List.fold_right - (fun t el -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), - (make_expr entry "" t))), - el)) - tl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Smeta")))))), - (Ast.ExStr (_loc, n)))), - el)), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Action")), - (Ast.IdLid (_loc, "mk")))))))), - (make_ctyp_expr t tvar e)))) - | TXlist (_loc, min, t, ts) -> - let txt = make_expr entry "" t.text - in - (match (min, ts) with - | (false, None) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Slist0")))))), - txt) - | (true, None) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Slist1")))))), - txt) - | (false, Some s) -> - let x = make_expr entry tvar s.text - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Slist0sep")))))), - txt)), - x) - | (true, Some s) -> - let x = make_expr entry tvar s.text - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Slist1sep")))))), - txt)), - x)) - | TXnext _loc -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Snext"))))) - | TXnterm (_loc, n, lev) -> - (match lev with - | Some lab -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Snterml")))))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Entry")), - (Ast.IdLid (_loc, "obj")))))))), - (Ast.ExTyc (_loc, n.expr, - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Entry")))), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyQuo (_loc, n.tvar)))))))))), - (Ast.ExStr (_loc, lab))) - | None -> - if n.tvar = tvar - then - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Sself"))))) - else - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Snterm")))))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Entry")), - (Ast.IdLid (_loc, "obj")))))))), - (Ast.ExTyc (_loc, n.expr, - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Entry")))), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyQuo (_loc, n.tvar)))))))))) - | TXopt (_loc, t) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Sopt")))))), - (make_expr entry "" t)) - | TXtry (_loc, t) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Stry")))))), - (make_expr entry "" t)) - | TXrules (_loc, rl) -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, "srules")))))), - entry.expr)), - (make_expr_rules _loc entry rl "")) - | TXself _loc -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Sself"))))) - | TXkwd (_loc, kwd) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Skeyword")))))), - (Ast.ExStr (_loc, kwd))) - | TXtok (_loc, match_fun, descr) -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Stoken")))))), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, match_fun, - (Ast.ExStr (_loc, (Ast.safe_string_escaped descr)))))))) - and make_expr_rules _loc n rl tvar = - List.fold_left - (fun txt (sl, ac) -> - let sl = - List.fold_right - (fun t txt -> - let x = make_expr n tvar t - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), x)), - txt)) - sl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), - (Ast.ExTup (_loc, (Ast.ExCom (_loc, sl, ac)))))), - txt)) - (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) rl - - let expr_of_delete_rule _loc n sl = - let sl = - List.fold_right - (fun s e -> - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), - (make_expr n "" s.text))), - e)) - sl (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) - in ((n.expr), sl) - - let rec tvar_of_ident = - function - | Ast.IdLid (_, x) | Ast.IdUid (_, x) -> x - | Ast.IdAcc (_, (Ast.IdUid (_, x)), xs) -> - x ^ ("__" ^ (tvar_of_ident xs)) - | _ -> failwith "internal error in the Grammar extension" - - let mk_name _loc i = - { expr = Ast.ExId (_loc, i); tvar = tvar_of_ident i; loc = _loc; } - - let slist loc min sep symb = TXlist (loc, min, symb, sep) - - (* - value sstoken _loc s = - let n = mk_name _loc <:ident< $lid:"a_" ^ s$ >> in - TXnterm _loc n None - ; - - value mk_symbol p s t = - {used = []; text = s; styp = t; pattern=Some p}; - - value sslist _loc min sep s = - let rl = - let r1 = - let prod = - let n = mk_name _loc <:ident< a_list >> in - [mk_symbol <:patt< a >> (TXnterm _loc n None) (STquo _loc "a_list")] - in - let act = <:expr< a >> in - {prod = prod; action = Some act} - in - let r2 = - let prod = - [mk_symbol <:patt< a >> (slist _loc min sep s) - (STapp _loc (STlid _loc "list") s.styp)] - in - let act = <:expr< Qast.List a >> in - {prod = prod; action = Some act} - in - [r1; r2] - in - let used = - match sep with - [ Some symb -> symb.used @ s.used - | None -> s.used ] - in - let used = ["a_list" :: used] in - let text = TXrules _loc (srules _loc "a_list" rl "") in - let styp = STquo _loc "a_list" in - {used = used; text = text; styp = styp; pattern = None} - ; - - value ssopt _loc s = - let rl = - let r1 = - let prod = - let n = mk_name _loc <:ident< a_opt >> in - [mk_symbol <:patt< a >> (TXnterm _loc n None) (STquo _loc "a_opt")] - in - let act = <:expr< a >> in - {prod = prod; action = Some act} - in - let r2 = - let s = - match s.text with - [ TXkwd _loc _ | TXtok _loc _ _ -> - let rl = - [{prod = [{ (s) with pattern = Some <:patt< x >> }]; - action = Some <:expr< Qast.Str (Token.extract_string x) >>}] - in - let t = new_type_var () in - {used = []; text = TXrules _loc (srules _loc t rl ""); - styp = STquo _loc t; pattern = None} - | _ -> s ] - in - let prod = - [mk_symbol <:patt< a >> (TXopt _loc s.text) - (STapp _loc (STlid _loc "option") s.styp)] - in - let act = <:expr< Qast.Option a >> in - {prod = prod; action = Some act} - in - [r1; r2] - in - let used = ["a_opt" :: s.used] in - let text = TXrules _loc (srules _loc "a_opt" rl "") in - let styp = STquo _loc "a_opt" in - {used = used; text = text; styp = styp; pattern = None} - ; - *) - let text_of_entry _loc e = - let ent = - let x = e.name in - let _loc = e.name.loc - in - Ast.ExTyc (_loc, x.expr, - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Entry")))), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyQuo (_loc, x.tvar))))) in - let pos = - match e.pos with - | Some pos -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), pos) - | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in - let txt = - List.fold_right - (fun level txt -> - let lab = - match level.label with - | Some lab -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), - (Ast.ExStr (_loc, lab))) - | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in - let ass = - match level.assoc with - | Some ass -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "Some")))), ass) - | None -> Ast.ExId (_loc, (Ast.IdUid (_loc, "None"))) in - let txt = - let rl = - srules _loc e.name.tvar level.rules e.name.tvar in - let e = make_expr_rules _loc e.name rl e.name.tvar - in - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "::")))), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, lab, - (Ast.ExCom (_loc, ass, e)))))))), - txt) - in txt) - e.levels (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]")))) - in (ent, pos, txt) - - let let_in_of_extend _loc gram gl el args = - match gl with - | None -> args - | Some nl -> - (check_use nl el; - let ll = - let same_tvar e n = e.name.tvar = n.tvar - in - List.fold_right - (fun e ll -> - match e.name.expr with - | Ast.ExId (_, (Ast.IdLid (_, _))) -> - if List.exists (same_tvar e) nl - then ll - else - if List.exists (same_tvar e) ll - then ll - else e.name :: ll - | _ -> ll) - el [] in - let local_binding_of_name { expr = e; tvar = x; loc = _loc } = - let i = - (match e with - | Ast.ExId (_, (Ast.IdLid (_, i))) -> i - | _ -> failwith "internal error in the Grammar extension") - in - Ast.BiEq (_loc, (Ast.PaId (_loc, (Ast.IdLid (_loc, i)))), - (Ast.ExTyc (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "grammar_entry_create")))), - (Ast.ExStr (_loc, i)))), - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Entry")))), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyQuo (_loc, x))))))) in - let expr_of_name { expr = e; tvar = x; loc = _loc } = - Ast.ExTyc (_loc, e, - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdUid (_loc, "Entry")))), - (Ast.IdLid (_loc, "t")))))), - (Ast.TyQuo (_loc, x))))) in - let e = - (match ll with - | [] -> args - | x :: xs -> - let locals = - List.fold_right - (fun name acc -> - Ast.BiAnd (_loc, acc, - (local_binding_of_name name))) - xs (local_binding_of_name x) in - let entry_mk = - (match gram with - | Some g -> - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Entry")), - (Ast.IdLid (_loc, "mk")))))))), - (Ast.ExId (_loc, g))) - | None -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Entry")), - (Ast.IdLid (_loc, "mk")))))))) - in - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, - (Ast.PaId (_loc, - (Ast.IdLid (_loc, "grammar_entry_create")))), - entry_mk)), - (Ast.ExLet (_loc, Ast.ReNil, locals, args)))) - in - (match nl with - | [] -> e - | x :: xs -> - let globals = - List.fold_right - (fun name acc -> - Ast.BiAnd (_loc, acc, - (Ast.BiEq (_loc, (Ast.PaAny _loc), - (expr_of_name name))))) - xs - (Ast.BiEq (_loc, (Ast.PaAny _loc), - (expr_of_name x))) - in Ast.ExLet (_loc, Ast.ReNil, globals, e))) - - class subst gmod = - object inherit Ast.map as super - method ident = - function - | Ast.IdUid (_, x) when x = gm -> gmod - | x -> super#ident x - end - - let subst_gmod ast gmod = (new subst gmod)#expr ast - - let text_of_functorial_extend _loc gmod gram gl el = - let args = - let el = - List.map - (fun e -> - let (ent, pos, txt) = text_of_entry e.name.loc e in - let e = - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, "extend")))))), - ent)), - (Ast.ExApp (_loc, - (Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "()")))), - (Ast.ExNil _loc), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, pos, txt)))))))), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))))) - in - if !split_ext - then - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, - (Ast.PaId (_loc, (Ast.IdLid (_loc, "aux")))), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaId (_loc, (Ast.IdUid (_loc, "()")))), - (Ast.ExNil _loc), e)))))), - (Ast.ExApp (_loc, - (Ast.ExId (_loc, (Ast.IdLid (_loc, "aux")))), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))))) - else e) - el - in - match el with - | [] -> Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) - | [ e ] -> e - | e :: el -> - Ast.ExSeq (_loc, - (List.fold_left (fun acc x -> Ast.ExSem (_loc, acc, x)) e - el)) - in subst_gmod (let_in_of_extend _loc gram gl el args) gmod - - let wildcarder = - object (self) - inherit Ast.map as super - method patt = - function - | Ast.PaId (_loc, (Ast.IdLid (_, _))) -> Ast.PaAny _loc - | Ast.PaAli (_, p, _) -> self#patt p - | p -> super#patt p - end - - let mk_tok _loc p t = - let p' = wildcarder#patt p in - let match_fun = - if Ast.is_irrefut_patt p' - then - Ast.ExFun (_loc, - (Ast.McArr (_loc, p', (Ast.ExNil _loc), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "True"))))))) - else - Ast.ExFun (_loc, - (Ast.McOr (_loc, - (Ast.McArr (_loc, p', (Ast.ExNil _loc), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))))), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "False"))))))))) in - let descr = string_of_patt p' in - let text = TXtok (_loc, match_fun, descr) - in { used = []; text = text; styp = t; pattern = Some p; } - - let symbol = Gram.Entry.mk "symbol" - - let check_not_tok s = - match s with - | { text = TXtok (_loc, _, _) } -> - Loc.raise _loc - (Stream.Error - ("Deprecated syntax, use a sub rule. " ^ - "LIST0 STRING becomes LIST0 [ x = STRING -> x ]")) - | _ -> () - - let _ = Camlp4_config.antiquotations := true - - let _ = - let _ = (expr : 'expr Gram.Entry.t) - and _ = (symbol : 'symbol Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let extend_header : 'extend_header Gram.Entry.t = - grammar_entry_create "extend_header" - and semi_sep : 'semi_sep Gram.Entry.t = - grammar_entry_create "semi_sep" - and string : 'string Gram.Entry.t = grammar_entry_create "string" - and name : 'name Gram.Entry.t = grammar_entry_create "name" - and comma_patt : 'comma_patt Gram.Entry.t = - grammar_entry_create "comma_patt" - and pattern : 'pattern Gram.Entry.t = - grammar_entry_create "pattern" - and psymbol : 'psymbol Gram.Entry.t = - grammar_entry_create "psymbol" - and rule : 'rule Gram.Entry.t = grammar_entry_create "rule" - and rule_list : 'rule_list Gram.Entry.t = - grammar_entry_create "rule_list" - and assoc : 'assoc Gram.Entry.t = grammar_entry_create "assoc" - and level : 'level Gram.Entry.t = grammar_entry_create "level" - and level_list : 'level_list Gram.Entry.t = - grammar_entry_create "level_list" - and position : 'position Gram.Entry.t = - grammar_entry_create "position" - and entry : 'entry Gram.Entry.t = grammar_entry_create "entry" - and global : 'global Gram.Entry.t = grammar_entry_create "global" - and t_qualid : 't_qualid Gram.Entry.t = - grammar_entry_create "t_qualid" - and qualid : 'qualid Gram.Entry.t = grammar_entry_create "qualid" - and qualuid : 'qualuid Gram.Entry.t = - grammar_entry_create "qualuid" - and delete_rule_body : 'delete_rule_body Gram.Entry.t = - grammar_entry_create "delete_rule_body" - and extend_body : 'extend_body Gram.Entry.t = - grammar_entry_create "extend_body" - in - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.After "top")), - [ (None, None, - [ ([ Gram.Skeyword "GEXTEND" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Loc.raise _loc - (Stream.Error - "Deprecated syntax, use EXTEND MyGramModule ... END instead") : - 'expr)))); - ([ Gram.Skeyword "GDELETE_RULE" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Loc.raise _loc - (Stream.Error - "Deprecated syntax, use DELETE_RULE MyGramModule ... END instead") : - 'expr)))); - ([ Gram.Skeyword "DELETE_RULE"; - Gram.Snterm - (Gram.Entry.obj - (delete_rule_body : - 'delete_rule_body Gram.Entry.t)); - Gram.Skeyword "END" ], - (Gram.Action.mk - (fun _ (e : 'delete_rule_body) _ - (_loc : Gram.Loc.t) -> (e : 'expr)))); - ([ Gram.Skeyword "EXTEND"; - Gram.Snterm - (Gram.Entry.obj - (extend_body : 'extend_body Gram.Entry.t)); - Gram.Skeyword "END" ], - (Gram.Action.mk - (fun _ (e : 'extend_body) _ (_loc : Gram.Loc.t) - -> (e : 'expr)))) ]) ])) - ()); - Gram.extend (extend_header : 'extend_header Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (qualuid : 'qualuid Gram.Entry.t)) ], - (Gram.Action.mk - (fun (g : 'qualuid) (_loc : Gram.Loc.t) -> - ((None, g) : 'extend_header)))); - ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Snterm - (Gram.Entry.obj - (t_qualid : 't_qualid Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (t : 't_qualid) _ (i : 'qualid) _ - (_loc : Gram.Loc.t) -> - (((Some i), t) : 'extend_header)))) ]) ])) - ()); - Gram.extend (extend_body : 'extend_body Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (extend_header : - 'extend_header Gram.Entry.t)); - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (global : 'global Gram.Entry.t))); - Gram.Slist1 - (Gram.srules extend_body - [ ([ Gram.Snterm - (Gram.Entry.obj - (entry : 'entry Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi_sep : - 'semi_sep Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (e : 'entry) - (_loc : Gram.Loc.t) -> (e : 'e__16)))) ]) ], - (Gram.Action.mk - (fun (el : 'e__16 list) - (global_list : 'global option) - ((gram, g) : 'extend_header) - (_loc : Gram.Loc.t) -> - (text_of_functorial_extend _loc g gram - global_list el : - 'extend_body)))) ]) ])) - ()); - Gram.extend (delete_rule_body : 'delete_rule_body Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (qualuid : 'qualuid Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (name : 'name Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (symbol : 'symbol Gram.Entry.t))), - (Gram.Snterm - (Gram.Entry.obj - (semi_sep : 'semi_sep Gram.Entry.t)))) ], - (Gram.Action.mk - (fun (sl : 'symbol list) _ (n : 'name) - (g : 'qualuid) (_loc : Gram.Loc.t) -> - (let (e, b) = expr_of_delete_rule _loc n sl - in - subst_gmod - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, - "delete_rule")))))), - e)), - b)) - g : - 'delete_rule_body)))) ]) ])) - ()); - Gram.extend (qualuid : 'qualuid Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.srules qualuid - [ ([ Gram.Stoken - (((function - | UIDENT "GLOBAL" -> true - | _ -> false), - "UIDENT \"GLOBAL\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "GLOBAL" -> (() : 'e__17) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | LIDENT ((_)) -> true - | _ -> false), - "LIDENT ((_))")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT ((_)) -> (() : 'e__17) - | _ -> assert false))) ] ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Loc.raise _loc - (Stream.Error - "Deprecated syntax, the grammar module is expected") : - 'qualuid)))) ]); - (None, None, - [ ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in Ast.IdUid (_loc, i) : 'qualuid)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (xs : 'qualuid) _ (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = Gram.Token.extract_string x - in - Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), - xs) : - 'qualuid)))) ]) ])) - ()); - Gram.extend (qualuid : 'qualuid Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.srules qualuid - [ ([ Gram.Stoken - (((function - | UIDENT "GLOBAL" -> true - | _ -> false), - "UIDENT \"GLOBAL\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "GLOBAL" -> (() : 'e__18) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | LIDENT ((_)) -> true - | _ -> false), - "LIDENT ((_))")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT ((_)) -> (() : 'e__18) - | _ -> assert false))) ] ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Loc.raise _loc - (Stream.Error - "Deprecated syntax, the grammar module is expected") : - 'qualuid)))) ]); - (None, None, - [ ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in Ast.IdUid (_loc, i) : 'qualuid)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (xs : 'qualuid) _ (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = Gram.Token.extract_string x - in - Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), - xs) : - 'qualuid)))) ]) ])) - ()); - Gram.extend (qualid : 'qualid Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in Ast.IdLid (_loc, i) : 'qualid)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in Ast.IdUid (_loc, i) : 'qualid)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (xs : 'qualid) _ (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = Gram.Token.extract_string x - in - Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), - xs) : - 'qualid)))) ]) ])) - ()); - Gram.extend (t_qualid : 't_qualid Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | LIDENT _ | UIDENT _ -> true - | _ -> false), - "LIDENT _ | UIDENT _")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT _ | UIDENT _ -> - (Loc.raise _loc - (Stream.Error - ("Wrong EXTEND header, the grammar type must finish by 't', " - ^ - "like in EXTEND (g : Gram.t) ... END")) : - 't_qualid) - | _ -> assert false))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; - Gram.Stoken - (((function | LIDENT "t" -> true | _ -> false), - "LIDENT \"t\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) _ - (x : Gram.Token.t) (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT "t" -> - (let x = Gram.Token.extract_string x - in Ast.IdUid (_loc, x) : 't_qualid) - | _ -> assert false))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; Gram.Sself ], - (Gram.Action.mk - (fun (xs : 't_qualid) _ (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = Gram.Token.extract_string x - in - Ast.IdAcc (_loc, (Ast.IdUid (_loc, x)), - xs) : - 't_qualid)))) ]) ])) - ()); - Gram.extend (global : 'global Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT "GLOBAL" -> true - | _ -> false), - "UIDENT \"GLOBAL\"")); - Gram.Skeyword ":"; - Gram.Slist1 - (Gram.Snterm - (Gram.Entry.obj (name : 'name Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (semi_sep : 'semi_sep Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (sl : 'name list) _ - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "GLOBAL" -> (sl : 'global) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (entry : 'entry Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (name : 'name Gram.Entry.t)); - Gram.Skeyword ":"; - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (position : 'position Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (level_list : 'level_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (ll : 'level_list) (pos : 'position option) - _ (n : 'name) (_loc : Gram.Loc.t) -> - ({ name = n; pos = pos; levels = ll; } : - 'entry)))) ]) ])) - ()); - Gram.extend (position : 'position Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT "LEVEL" -> true - | _ -> false), - "UIDENT \"LEVEL\"")); - Gram.Snterm - (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], - (Gram.Action.mk - (fun (n : 'string) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LEVEL" -> - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, - "Grammar")), - (Ast.IdUid (_loc, "Level")))))))))), - n) : - 'position) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "AFTER" -> true - | _ -> false), - "UIDENT \"AFTER\"")); - Gram.Snterm - (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], - (Gram.Action.mk - (fun (n : 'string) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "AFTER" -> - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, - "Grammar")), - (Ast.IdUid (_loc, "After")))))))))), - n) : - 'position) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "BEFORE" -> true - | _ -> false), - "UIDENT \"BEFORE\"")); - Gram.Snterm - (Gram.Entry.obj (string : 'string Gram.Entry.t)) ], - (Gram.Action.mk - (fun (n : 'string) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "BEFORE" -> - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, - "Grammar")), - (Ast.IdUid (_loc, - "Before")))))))))), - n) : - 'position) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "LAST" -> true - | _ -> false), - "UIDENT \"LAST\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LAST" -> - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Grammar")), - (Ast.IdUid (_loc, "Last"))))))))) : - 'position) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "FIRST" -> true - | _ -> false), - "UIDENT \"FIRST\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "FIRST" -> - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Grammar")), - (Ast.IdUid (_loc, "First"))))))))) : - 'position) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (level_list : 'level_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "["; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (level : 'level Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (ll : 'level list) _ (_loc : Gram.Loc.t) - -> (ll : 'level_list)))) ]) ])) - ()); - Gram.extend (level : 'level Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Sopt - (Gram.srules level - [ ([ Gram.Stoken - (((function - | STRING ((_)) -> true - | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = - Gram.Token.extract_string x - in x : 'e__19)))) ]); - Gram.Sopt - (Gram.Snterm - (Gram.Entry.obj - (assoc : 'assoc Gram.Entry.t))); - Gram.Snterm - (Gram.Entry.obj - (rule_list : 'rule_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (rules : 'rule_list) (ass : 'assoc option) - (lab : 'e__19 option) (_loc : Gram.Loc.t) -> - ({ label = lab; assoc = ass; rules = rules; } : - 'level)))) ]) ])) - ()); - Gram.extend (assoc : 'assoc Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT "NONA" -> true - | _ -> false), - "UIDENT \"NONA\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "NONA" -> - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Grammar")), - (Ast.IdUid (_loc, "NonA"))))))))) : - 'assoc) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "RIGHTA" -> true - | _ -> false), - "UIDENT \"RIGHTA\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "RIGHTA" -> - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Grammar")), - (Ast.IdUid (_loc, "RightA"))))))))) : - 'assoc) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "LEFTA" -> true - | _ -> false), - "UIDENT \"LEFTA\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LEFTA" -> - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Camlp4")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Sig")), - (Ast.IdAcc (_loc, - (Ast.IdUid (_loc, "Grammar")), - (Ast.IdUid (_loc, "LeftA"))))))))) : - 'assoc) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (rule_list : 'rule_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "["; - Gram.Slist1sep - ((Gram.Snterm - (Gram.Entry.obj (rule : 'rule Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rules : 'rule list) _ - (_loc : Gram.Loc.t) -> - (retype_rule_list_without_patterns _loc rules : - 'rule_list)))); - ([ Gram.Skeyword "["; Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ _ (_loc : Gram.Loc.t) -> - ([] : 'rule_list)))) ]) ])) - ()); - Gram.extend (rule : 'rule Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (psymbol : 'psymbol Gram.Entry.t))), - (Gram.Snterm - (Gram.Entry.obj - (semi_sep : 'semi_sep Gram.Entry.t)))) ], - (Gram.Action.mk - (fun (psl : 'psymbol list) (_loc : Gram.Loc.t) - -> ({ prod = psl; action = None; } : 'rule)))); - ([ Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj - (psymbol : 'psymbol Gram.Entry.t))), - (Gram.Snterm - (Gram.Entry.obj - (semi_sep : 'semi_sep Gram.Entry.t)))); - Gram.Skeyword "->"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (act : 'expr) _ (psl : 'psymbol list) - (_loc : Gram.Loc.t) -> - ({ prod = psl; action = Some act; } : 'rule)))) ]) ])) - ()); - Gram.extend (psymbol : 'psymbol Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'symbol) (_loc : Gram.Loc.t) -> - (s : 'psymbol)))); - ([ Gram.Snterm - (Gram.Entry.obj - (pattern : 'pattern Gram.Entry.t)); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'symbol) _ (p : 'pattern) - (_loc : Gram.Loc.t) -> - (match s.pattern with - | Some - (Ast.PaApp (_, - (Ast.PaId (_, (Ast.IdUid (_, u)))), - (Ast.PaTup (_, (Ast.PaAny _))))) - -> - mk_tok _loc - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, u)))), - p)) - s.styp - | _ -> { (s) with pattern = Some p; } : - 'psymbol)))); - ([ Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")); - Gram.Sopt - (Gram.srules psymbol - [ ([ Gram.Stoken - (((function - | UIDENT "LEVEL" -> true - | _ -> false), - "UIDENT \"LEVEL\"")); - Gram.Stoken - (((function - | STRING ((_)) -> true - | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LEVEL" -> - (let s = - Gram.Token.extract_string s - in s : 'e__20) - | _ -> assert false))) ]) ], - (Gram.Action.mk - (fun (lev : 'e__20 option) (i : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i in - let name = - mk_name _loc (Ast.IdLid (_loc, i)) in - let text = TXnterm (_loc, name, lev) in - let styp = STquo (_loc, i) - in - { - used = [ i ]; - text = text; - styp = styp; - pattern = None; - } : - 'psymbol)))); - ([ Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")); - Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (symbol : 'symbol Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'symbol) _ (p : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let p = Gram.Token.extract_string p - in - match s.pattern with - | Some - ((Ast.PaApp (_, - (Ast.PaId (_, (Ast.IdUid (_, u)))), - (Ast.PaTup (_, (Ast.PaAny _)))) - as p')) - -> - let match_fun = - Ast.ExFun (_loc, - (Ast.McOr (_loc, - (Ast.McArr (_loc, p', - (Ast.ExNil _loc), - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "True")))))), - (Ast.McArr (_loc, - (Ast.PaAny _loc), - (Ast.ExNil _loc), - (Ast.ExId (_loc, - (Ast.IdUid (_loc, - "False"))))))))) in - let p' = - Ast.PaAli (_loc, p', - (Ast.PaId (_loc, - (Ast.IdLid (_loc, p))))) in - let descr = u ^ " _" in - let text = - TXtok (_loc, match_fun, descr) - in - { - (s) - with - text = text; - pattern = Some p'; - } - | _ -> - { - (s) - with - pattern = - Some - (Ast.PaId (_loc, - (Ast.IdLid (_loc, p)))); - } : - 'psymbol)))) ]) ])) - ()); - Gram.extend (symbol : 'symbol Gram.Entry.t) - ((fun () -> - (None, - [ ((Some "top"), (Some Camlp4.Sig.Grammar.NonA), - [ ([ Gram.Stoken - (((function | UIDENT "TRY" -> true | _ -> false), - "UIDENT \"TRY\"")); - Gram.Sself ], - (Gram.Action.mk - (fun (s : 'symbol) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "TRY" -> - (let text = TXtry (_loc, s.text) - in - { - used = s.used; - text = text; - styp = s.styp; - pattern = None; - } : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function | UIDENT "OPT" -> true | _ -> false), - "UIDENT \"OPT\"")); - Gram.Sself ], - (Gram.Action.mk - (fun (s : 'symbol) (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "OPT" -> - (let () = check_not_tok s in - let styp = - STapp (_loc, (STlid (_loc, "option")), - s.styp) in - let text = TXopt (_loc, s.text) - in - { - used = s.used; - text = text; - styp = styp; - pattern = None; - } : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "LIST1" -> true - | _ -> false), - "UIDENT \"LIST1\"")); - Gram.Sself; - Gram.Sopt - (Gram.srules symbol - [ ([ Gram.Stoken - (((function - | UIDENT "SEP" -> true - | _ -> false), - "UIDENT \"SEP\"")); - Gram.Snterm - (Gram.Entry.obj - (symbol : 'symbol Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'symbol) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "SEP" -> (t : 'e__22) - | _ -> assert false))) ]) ], - (Gram.Action.mk - (fun (sep : 'e__22 option) (s : 'symbol) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LIST1" -> - (let () = check_not_tok s in - let used = - (match sep with - | Some symb -> symb.used @ s.used - | None -> s.used) in - let styp = - STapp (_loc, (STlid (_loc, "list")), - s.styp) in - let text = slist _loc true sep s - in - { - used = used; - text = text; - styp = styp; - pattern = None; - } : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "LIST0" -> true - | _ -> false), - "UIDENT \"LIST0\"")); - Gram.Sself; - Gram.Sopt - (Gram.srules symbol - [ ([ Gram.Stoken - (((function - | UIDENT "SEP" -> true - | _ -> false), - "UIDENT \"SEP\"")); - Gram.Snterm - (Gram.Entry.obj - (symbol : 'symbol Gram.Entry.t)) ], - (Gram.Action.mk - (fun (t : 'symbol) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "SEP" -> (t : 'e__21) - | _ -> assert false))) ]) ], - (Gram.Action.mk - (fun (sep : 'e__21 option) (s : 'symbol) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LIST0" -> - (let () = check_not_tok s in - let used = - (match sep with - | Some symb -> symb.used @ s.used - | None -> s.used) in - let styp = - STapp (_loc, (STlid (_loc, "list")), - s.styp) in - let text = slist _loc false sep s - in - { - used = used; - text = text; - styp = styp; - pattern = None; - } : - 'symbol) - | _ -> assert false))) ]); - (None, None, - [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (s_t : 'symbol) _ (_loc : Gram.Loc.t) -> - (s_t : 'symbol)))); - ([ Gram.Snterm - (Gram.Entry.obj (name : 'name Gram.Entry.t)); - Gram.Sopt - (Gram.srules symbol - [ ([ Gram.Stoken - (((function - | UIDENT "LEVEL" -> true - | _ -> false), - "UIDENT \"LEVEL\"")); - Gram.Stoken - (((function - | STRING ((_)) -> true - | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LEVEL" -> - (let s = - Gram.Token.extract_string s - in s : 'e__24) - | _ -> assert false))) ]) ], - (Gram.Action.mk - (fun (lev : 'e__24 option) (n : 'name) - (_loc : Gram.Loc.t) -> - ({ - used = [ n.tvar ]; - text = TXnterm (_loc, n, lev); - styp = STquo (_loc, n.tvar); - pattern = None; - } : 'symbol)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Skeyword "."; - Gram.Snterm - (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)); - Gram.Sopt - (Gram.srules symbol - [ ([ Gram.Stoken - (((function - | UIDENT "LEVEL" -> true - | _ -> false), - "UIDENT \"LEVEL\"")); - Gram.Stoken - (((function - | STRING ((_)) -> true - | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "LEVEL" -> - (let s = - Gram.Token.extract_string s - in s : 'e__23) - | _ -> assert false))) ]) ], - (Gram.Action.mk - (fun (lev : 'e__23 option) (il : 'qualid) _ - (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i in - let n = - mk_name _loc - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, i)), - il)) - in - { - used = [ n.tvar ]; - text = TXnterm (_loc, n, lev); - styp = STquo (_loc, n.tvar); - pattern = None; - } : - 'symbol)))); - ([ Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let s = Gram.Token.extract_string s - in - { - used = []; - text = TXkwd (_loc, s); - styp = STtok _loc; - pattern = None; - } : - 'symbol)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (x : Gram.Token.t) (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ("", s) -> - (let x = Gram.Token.extract_string x in - let e = - AntiquotSyntax.parse_expr _loc s in - let match_fun = - Ast.ExFun (_loc, - (Ast.McOr (_loc, - (Ast.McArr (_loc, - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, x)))), - (Ast.PaId (_loc, - (Ast.IdLid (_loc, - "camlp4_x")))))), - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdLid (_loc, - "=")))), - (Ast.ExId (_loc, - (Ast.IdLid (_loc, - "camlp4_x")))))), - e)), - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "True")))))), - (Ast.McArr (_loc, - (Ast.PaAny _loc), - (Ast.ExNil _loc), - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "False"))))))))) in - let descr = "$" ^ (x ^ (" " ^ s)) in - let text = - TXtok (_loc, match_fun, descr) in - let p = - Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, x)))), - (Ast.PaTup (_loc, (Ast.PaAny _loc)))) - in - { - used = []; - text = text; - styp = STtok _loc; - pattern = Some p; - } : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")); - Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let s = Gram.Token.extract_string s in - let x = Gram.Token.extract_string x - in - mk_tok _loc - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, x)))), - (Ast.PaStr (_loc, s)))) - (STtok _loc) : - 'symbol)))); - ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (x : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let x = Gram.Token.extract_string x - in - mk_tok _loc - (Ast.PaApp (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, x)))), - (Ast.PaTup (_loc, (Ast.PaAny _loc))))) - (STstring_tok _loc) : - 'symbol)))); - ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj (patt : 'patt Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'patt) _ (_loc : Gram.Loc.t) -> - (mk_tok _loc p (STtok _loc) : 'symbol)))); - ([ Gram.Skeyword "["; - Gram.Slist0sep - ((Gram.Snterm - (Gram.Entry.obj (rule : 'rule Gram.Entry.t))), - (Gram.Skeyword "|")); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (rl : 'rule list) _ (_loc : Gram.Loc.t) - -> - (let rl = - retype_rule_list_without_patterns _loc rl in - let t = new_type_var () - in - { - used = used_of_rule_list rl; - text = - TXrules (_loc, (srules _loc t rl "")); - styp = STquo (_loc, t); - pattern = None; - } : - 'symbol)))); - ([ Gram.Stoken - (((function - | UIDENT "NEXT" -> true - | _ -> false), - "UIDENT \"NEXT\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "NEXT" -> - ({ - used = []; - text = TXnext _loc; - styp = STself (_loc, "NEXT"); - pattern = None; - } : 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "SELF" -> true - | _ -> false), - "UIDENT \"SELF\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "SELF" -> - ({ - used = []; - text = TXself _loc; - styp = STself (_loc, "SELF"); - pattern = None; - } : 'symbol) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (pattern : 'pattern Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ","; - Gram.Snterm - (Gram.Entry.obj - (comma_patt : 'comma_patt Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p2 : 'comma_patt) _ (p1 : 'pattern) _ - (_loc : Gram.Loc.t) -> - (Ast.PaTup (_loc, (Ast.PaCom (_loc, p1, p2))) : - 'pattern)))); - ([ Gram.Skeyword "("; Gram.Sself; Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (p : 'pattern) _ (_loc : Gram.Loc.t) -> - (p : 'pattern)))); - ([ Gram.Skeyword "_" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.PaAny _loc : 'pattern)))); - ([ Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in Ast.PaId (_loc, (Ast.IdLid (_loc, i))) : - 'pattern)))) ]) ])) - ()); - Gram.extend (comma_patt : 'comma_patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (pattern : 'pattern Gram.Entry.t)) ], - (Gram.Action.mk - (fun (p : 'pattern) (_loc : Gram.Loc.t) -> - (p : 'comma_patt)))); - ([ Gram.Sself; Gram.Skeyword ","; Gram.Sself ], - (Gram.Action.mk - (fun (p2 : 'comma_patt) _ (p1 : 'comma_patt) - (_loc : Gram.Loc.t) -> - (Ast.PaCom (_loc, p1, p2) : 'comma_patt)))) ]) ])) - ()); - Gram.extend (name : 'name Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (qualid : 'qualid Gram.Entry.t)) ], - (Gram.Action.mk - (fun (il : 'qualid) (_loc : Gram.Loc.t) -> - (mk_name _loc il : 'name)))) ]) ])) - ()); - Gram.extend (string : 'string Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | ANTIQUOT ("", _) -> true - | _ -> false), - "ANTIQUOT (\"\", _)")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | ANTIQUOT ("", s) -> - (AntiquotSyntax.parse_expr _loc s : - 'string) - | _ -> assert false))); - ([ Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (s : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let s = Gram.Token.extract_string s - in Ast.ExStr (_loc, s) : 'string)))) ]) ])) - ()); - Gram.extend (semi_sep : 'semi_sep Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> (() : 'semi_sep)))) ]) ])) - ())) - - (* - EXTEND Gram - symbol: LEVEL "top" - [ NONA - [ min = [ UIDENT "SLIST0" -> False | UIDENT "SLIST1" -> True ]; - s = SELF; sep = OPT [ UIDENT "SEP"; t = symbol -> t ] -> - sslist _loc min sep s - | UIDENT "SOPT"; s = SELF -> - ssopt _loc s ] ] - ; - END; - *) - let sfold _loc n foldfun f e s = - let styp = STquo (_loc, (new_type_var ())) in - let e = - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, foldfun)))))), - f)), - e) in - let t = - STapp (_loc, - (STapp (_loc, - (STtyp - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, "fold")))))), - (Ast.TyAny _loc)))), - s.styp)), - styp) - in - { - used = s.used; - text = TXmeta (_loc, n, [ s.text ], e, t); - styp = styp; - pattern = None; - } - - let sfoldsep _loc n foldfun f e s sep = - let styp = STquo (_loc, (new_type_var ())) in - let e = - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, foldfun)))))), - f)), - e) in - let t = - STapp (_loc, - (STapp (_loc, - (STtyp - (Ast.TyApp (_loc, - (Ast.TyId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, gm)), - (Ast.IdLid (_loc, "foldsep")))))), - (Ast.TyAny _loc)))), - s.styp)), - styp) - in - { - used = s.used @ sep.used; - text = TXmeta (_loc, n, [ s.text; sep.text ], e, t); - styp = styp; - pattern = None; - } - - let _ = - let _ = (symbol : 'symbol Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let simple_expr : 'simple_expr Gram.Entry.t = - grammar_entry_create "simple_expr" - in - (Gram.extend (symbol : 'symbol Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "top")), - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT "FOLD1" -> true - | _ -> false), - "UIDENT \"FOLD1\"")); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Sself; - Gram.Stoken - (((function | UIDENT "SEP" -> true | _ -> false), - "UIDENT \"SEP\"")); - Gram.Sself ], - (Gram.Action.mk - (fun (sep : 'symbol) (__camlp4_1 : Gram.Token.t) - (s : 'symbol) (e : 'simple_expr) - (f : 'simple_expr) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match (__camlp4_1, __camlp4_0) with - | (UIDENT "SEP", UIDENT "FOLD1") -> - (sfoldsep _loc "FOLD1 SEP" "sfold1sep" f - e s sep : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "FOLD0" -> true - | _ -> false), - "UIDENT \"FOLD0\"")); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Sself; - Gram.Stoken - (((function | UIDENT "SEP" -> true | _ -> false), - "UIDENT \"SEP\"")); - Gram.Sself ], - (Gram.Action.mk - (fun (sep : 'symbol) (__camlp4_1 : Gram.Token.t) - (s : 'symbol) (e : 'simple_expr) - (f : 'simple_expr) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match (__camlp4_1, __camlp4_0) with - | (UIDENT "SEP", UIDENT "FOLD0") -> - (sfoldsep _loc "FOLD0 SEP" "sfold0sep" f - e s sep : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "FOLD1" -> true - | _ -> false), - "UIDENT \"FOLD1\"")); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (s : 'symbol) (e : 'simple_expr) - (f : 'simple_expr) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "FOLD1" -> - (sfold _loc "FOLD1" "sfold1" f e s : - 'symbol) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | UIDENT "FOLD0" -> true - | _ -> false), - "UIDENT \"FOLD0\"")); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (simple_expr : 'simple_expr Gram.Entry.t)); - Gram.Sself ], - (Gram.Action.mk - (fun (s : 'symbol) (e : 'simple_expr) - (f : 'simple_expr) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT "FOLD0" -> - (sfold _loc "FOLD0" "sfold0" f e s : - 'symbol) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (simple_expr : 'simple_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "("; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword ")" ], - (Gram.Action.mk - (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> - (e : 'simple_expr)))); - ([ Gram.Snterm - (Gram.Entry.obj - (a_LIDENT : 'a_LIDENT Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'a_LIDENT) (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdLid (_loc, i))) : - 'simple_expr)))) ]) ])) - ())) - - let _ = - Options.add "-split_ext" (Arg.Set split_ext) - "Split EXTEND by functions to turn around a PowerPC problem." - - let _ = - Options.add "-split_gext" (Arg.Set split_ext) - "Old name for the option -split_ext." - - let _ = - Options.add "-meta_action" (Arg.Set meta_action) "Undocumented" - - end - - (* FIXME *) - module M = Register.OCamlSyntaxExtension(Id)(Make) - - end - -module M = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - * - Aleksey Nogin: extra features and bug fixes. - * - Christopher Conway: extra feature (-D=) - * - Jean-vincent Loddo: definitions inside IFs. - *) - module Id = - struct let name = "Camlp4MacroParser" - let version = Sys.ocaml_version - - end - - (* -Added statements: - - At toplevel (structure item): - - DEFINE - DEFINE = - DEFINE () = - IFDEF THEN [ ELSE ] (END | ENDIF) - IFNDEF THEN [ ELSE ] (END | ENDIF) - INCLUDE - - At toplevel (signature item): - - DEFINE - IFDEF THEN [ ELSE ] (END | ENDIF) - IFNDEF THEN [ ELSE ] (END | ENDIF) - INCLUDE - - In expressions: - - IFDEF THEN [ ELSE ] (END | ENDIF) - IFNDEF THEN [ ELSE ] (END | ENDIF) - DEFINE = IN - __FILE__ - __LOCATION__ - LOCATION_OF - - In patterns: - - IFDEF THEN ELSE (END | ENDIF) - IFNDEF THEN ELSE (END | ENDIF) - - As Camlp4 options: - - -D or -D=expr define with optional value - -U undefine it - -I add to the search path for INCLUDE'd files - - After having used a DEFINE followed by "= ", you - can use it in expressions *and* in patterns. If the expression defining - the macro cannot be used as a pattern, there is an error message if - it is used in a pattern. - - You can also define a local macro in an expression usigng the DEFINE ... IN form. - Note that local macros have lowercase names and can not take parameters. - - If a macro is defined to = NOTHING, and then used as an argument to a function, - this will be equivalent to function taking one less argument. Similarly, - passing NOTHING as an argument to a macro is equivalent to "erasing" the - corresponding parameter from the macro body. - - The toplevel statement INCLUDE can be used to include a - file containing macro definitions and also any other toplevel items. - The included files are looked up in directories passed in via the -I - option, falling back to the current directory. - - The expression __FILE__ returns the current compiled file name. - The expression __LOCATION__ returns the current location of itself. - If used inside a macro, it returns the location where the macro is - called. - The expression (LOCATION_OF parameter) returns the location of the given - macro parameter. It cannot be used outside a macro definition. - -*) - open Camlp4 - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - type 'a item_or_def = - | SdStr of 'a - | SdDef of string * ((string list) * Ast.expr) option - | SdUnd of string - | SdITE of bool * ('a item_or_def) list * ('a item_or_def) list - | SdLazy of 'a Lazy.t - - let rec list_remove x = - function - | (y, _) :: l when y = x -> l - | d :: l -> d :: (list_remove x l) - | [] -> [] - - let defined = ref [] - - let is_defined i = List.mem_assoc i !defined - - let bad_patt _loc = - Loc.raise _loc - (Failure - "this macro cannot be used in a pattern (see its definition)") - - let substp _loc env = - let rec loop = - function - | Ast.ExApp (_, e1, e2) -> Ast.PaApp (_loc, (loop e1), (loop e2)) - | Ast.ExNil _ -> Ast.PaNil _loc - | Ast.ExId (_, (Ast.IdLid (_, x))) -> - (try List.assoc x env - with | Not_found -> Ast.PaId (_loc, (Ast.IdLid (_loc, x)))) - | Ast.ExId (_, (Ast.IdUid (_, x))) -> - (try List.assoc x env - with | Not_found -> Ast.PaId (_loc, (Ast.IdUid (_loc, x)))) - | Ast.ExInt (_, x) -> Ast.PaInt (_loc, x) - | Ast.ExStr (_, s) -> Ast.PaStr (_loc, s) - | Ast.ExTup (_, x) -> Ast.PaTup (_loc, (loop x)) - | Ast.ExCom (_, x1, x2) -> Ast.PaCom (_loc, (loop x1), (loop x2)) - | Ast.ExRec (_, bi, (Ast.ExNil _)) -> - let rec substbi = - (function - | Ast.RbSem (_, b1, b2) -> - Ast.PaSem (_loc, (substbi b1), (substbi b2)) - | Ast.RbEq (_, i, e) -> Ast.PaEq (_loc, i, (loop e)) - | _ -> bad_patt _loc) - in Ast.PaRec (_loc, (substbi bi)) - | _ -> bad_patt _loc - in loop - - class reloc _loc = - object inherit Ast.map as super method loc = fun _ -> _loc end - - (* method _Loc_t _ = _loc; *) - class subst _loc env = - object inherit reloc _loc as super - method expr = - function - | (Ast.ExId (_, (Ast.IdLid (_, x))) | - Ast.ExId (_, (Ast.IdUid (_, x))) - as e) -> - (try List.assoc x env with | Not_found -> super#expr e) - | (Ast.ExApp (_loc, - (Ast.ExId (_, (Ast.IdUid (_, "LOCATION_OF")))), - (Ast.ExId (_, (Ast.IdLid (_, x))))) | - Ast.ExApp (_loc, - (Ast.ExId (_, (Ast.IdUid (_, "LOCATION_OF")))), - (Ast.ExId (_, (Ast.IdUid (_, x))))) - as e) -> - (try - let loc = Ast.loc_of_expr (List.assoc x env) in - let (a, b, c, d, e, f, g, h) = Loc.to_tuple loc - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "of_tuple")))))), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, - (Ast.ExStr (_loc, (Ast.safe_string_escaped a))), - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExInt (_loc, - (string_of_int b))), - (Ast.ExInt (_loc, - (string_of_int c))))), - (Ast.ExInt (_loc, - (string_of_int d))))), - (Ast.ExInt (_loc, - (string_of_int e))))), - (Ast.ExInt (_loc, (string_of_int f))))), - (Ast.ExInt (_loc, (string_of_int g))))), - (if h - then - Ast.ExId (_loc, - (Ast.IdUid (_loc, "True"))) - else - Ast.ExId (_loc, - (Ast.IdUid (_loc, "False"))))))))))) - with | Not_found -> super#expr e) - | e -> super#expr e - method patt = - function - | (Ast.PaId (_, (Ast.IdLid (_, x))) | - Ast.PaId (_, (Ast.IdUid (_, x))) - as p) -> - (try substp _loc [] (List.assoc x env) - with | Not_found -> super#patt p) - | p -> super#patt p - end - - let incorrect_number loc l1 l2 = - Loc.raise loc - (Failure - (Printf.sprintf "expected %d parameters; found %d" - (List.length l2) (List.length l1))) - - let define eo x = - ((match eo with - | Some (([], e)) -> - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "simple")), - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> - true - | _ -> false), - "$UIDENT x")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT ((_)) -> - ((new reloc _loc)#expr e : 'expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (patt : 'patt Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "simple")), - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> - true - | _ -> false), - "$UIDENT x")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT ((_)) -> - (let p = substp _loc [] e - in (new reloc _loc)#patt p : 'patt) - | _ -> assert false))) ]) ])) - ())) - | Some ((sl, e)) -> - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "apply")), - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> - true - | _ -> false), - "$UIDENT x")); - Gram.Sself ], - (Gram.Action.mk - (fun (param : 'expr) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT ((_)) -> - (let el = - (match param with - | Ast.ExTup (_, e) -> - Ast.list_of_expr e [] - | e -> [ e ]) - in - if - (List.length el) = - (List.length sl) - then - (let env = List.combine sl el - in (new subst _loc env)#expr e) - else incorrect_number _loc el sl : - 'expr) - | _ -> assert false))) ]) ])) - ()); - Gram.extend (patt : 'patt Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "simple")), - [ (None, None, - [ ([ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> - true - | _ -> false), - "$UIDENT x")); - Gram.Sself ], - (Gram.Action.mk - (fun (param : 'patt) - (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | UIDENT ((_)) -> - (let pl = - (match param with - | Ast.PaTup (_, p) -> - Ast.list_of_patt p [] - | p -> [ p ]) - in - if - (List.length pl) = - (List.length sl) - then - (let env = List.combine sl pl in - let p = substp _loc env e - in (new reloc _loc)#patt p) - else incorrect_number _loc pl sl : - 'patt) - | _ -> assert false))) ]) ])) - ())) - | None -> ()); - defined := (x, eo) :: !defined) - - let undef x = - try - ((let eo = List.assoc x !defined - in - match eo with - | Some (([], _)) -> - (Gram.delete_rule expr - [ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> true - | _ -> false), - "$UIDENT x")) ]; - Gram.delete_rule patt - [ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> true - | _ -> false), - "$UIDENT x")) ]) - | Some ((_, _)) -> - (Gram.delete_rule expr - [ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> true - | _ -> false), - "$UIDENT x")); - Gram.Sself ]; - Gram.delete_rule patt - [ Gram.Stoken - (((function - | UIDENT camlp4_x when camlp4_x = x -> true - | _ -> false), - "$UIDENT x")); - Gram.Sself ]) - | None -> ()); - defined := list_remove x !defined) - with | Not_found -> () - - let parse_def s = - match Gram.parse_string expr (Loc.mk "") s with - | Ast.ExId (_, (Ast.IdUid (_, n))) -> define None n - | Ast.ExApp (_, - (Ast.ExApp (_, (Ast.ExId (_, (Ast.IdLid (_, "=")))), - (Ast.ExId (_, (Ast.IdUid (_, n)))))), - e) -> define (Some (([], e))) n - | _ -> invalid_arg s - - (* This is a list of directories to search for INCLUDE statements. *) - let include_dirs = ref [] - - (* Add something to the above, make sure it ends with a slash. *) - let add_include_dir str = - if str <> "" - then - (let str = - if (String.get str ((String.length str) - 1)) = '/' - then str - else str ^ "/" - in include_dirs := !include_dirs @ [ str ]) - else () - - let parse_include_file rule = - let dir_ok file dir = Sys.file_exists (dir ^ file) - in - fun file -> - let file = - try - (List.find (dir_ok file) (!include_dirs @ [ "./" ])) ^ file - with | Not_found -> file in - let ch = open_in file in - let st = Stream.of_channel ch - in Gram.parse rule (Loc.mk file) st - - let rec execute_macro nil cons = - function - | SdStr i -> i - | SdDef (x, eo) -> (define eo x; nil) - | SdUnd x -> (undef x; nil) - | SdITE (b, l1, l2) -> - execute_macro_list nil cons (if b then l1 else l2) - | SdLazy l -> Lazy.force l - and execute_macro_list nil cons = - function - | [] -> nil - | hd :: tl -> (* The evaluation order is important here *) - let il1 = execute_macro nil cons hd in - let il2 = execute_macro_list nil cons tl in cons il1 il2 - - (* Stack of conditionals. *) - let stack = Stack.create () - - (* Make an SdITE value by extracting the result of the test from the stack. *) - let make_SdITE_result st1 st2 = - let test = Stack.pop stack in SdITE (test, st1, st2) - - type branch = | Then | Else - - (* Execute macro only if it belongs to the currently active branch. *) - let execute_macro_if_active_branch _loc nil cons branch macro_def = - let test = Stack.top stack in - let item = - if (test && (branch = Then)) || ((not test) && (branch = Else)) - then execute_macro nil cons macro_def - else (* ignore the macro *) nil - in SdStr item - - let _ = - let _ = (expr : 'expr Gram.Entry.t) - and _ = (sig_item : 'sig_item Gram.Entry.t) - and _ = (str_item : 'str_item Gram.Entry.t) - and _ = (patt : 'patt Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let macro_def : 'macro_def Gram.Entry.t = - grammar_entry_create "macro_def" - and uident : 'uident Gram.Entry.t = grammar_entry_create "uident" - and opt_macro_value : 'opt_macro_value Gram.Entry.t = - grammar_entry_create "opt_macro_value" - and endif : 'endif Gram.Entry.t = grammar_entry_create "endif" - and sglist_else : 'sglist_else Gram.Entry.t = - grammar_entry_create "sglist_else" - and sglist_then : 'sglist_then Gram.Entry.t = - grammar_entry_create "sglist_then" - and smlist_else : 'smlist_else Gram.Entry.t = - grammar_entry_create "smlist_else" - and smlist_then : 'smlist_then Gram.Entry.t = - grammar_entry_create "smlist_then" - and else_expr : 'else_expr Gram.Entry.t = - grammar_entry_create "else_expr" - and else_macro_def_sig : 'else_macro_def_sig Gram.Entry.t = - grammar_entry_create "else_macro_def_sig" - and else_macro_def : 'else_macro_def Gram.Entry.t = - grammar_entry_create "else_macro_def" - and uident_eval_ifndef : 'uident_eval_ifndef Gram.Entry.t = - grammar_entry_create "uident_eval_ifndef" - and uident_eval_ifdef : 'uident_eval_ifdef Gram.Entry.t = - grammar_entry_create "uident_eval_ifdef" - and macro_def_sig : 'macro_def_sig Gram.Entry.t = - grammar_entry_create "macro_def_sig" - in - (Gram.extend (str_item : 'str_item Gram.Entry.t) - ((fun () -> - ((Some Camlp4.Sig.Grammar.First), - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (macro_def : 'macro_def Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'macro_def) (_loc : Gram.Loc.t) -> - (execute_macro (Ast.StNil _loc) - (fun a b -> Ast.StSem (_loc, a, b)) x : - 'str_item)))) ]) ])) - ()); - Gram.extend (sig_item : 'sig_item Gram.Entry.t) - ((fun () -> - ((Some Camlp4.Sig.Grammar.First), - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (macro_def_sig : - 'macro_def_sig Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'macro_def_sig) (_loc : Gram.Loc.t) -> - (execute_macro (Ast.SgNil _loc) - (fun a b -> Ast.SgSem (_loc, a, b)) x : - 'sig_item)))) ]) ])) - ()); - Gram.extend (macro_def : 'macro_def Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "INCLUDE"; - Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (fname : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - (let fname = Gram.Token.extract_string fname - in - SdLazy - (lazy - (parse_include_file str_items fname)) : - 'macro_def)))); - ([ Gram.Skeyword "IFNDEF"; - Gram.Snterm - (Gram.Entry.obj - (uident_eval_ifndef : - 'uident_eval_ifndef Gram.Entry.t)); - Gram.Skeyword "THEN"; - Gram.Snterm - (Gram.Entry.obj - (smlist_then : 'smlist_then Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (else_macro_def : - 'else_macro_def Gram.Entry.t)) ], - (Gram.Action.mk - (fun (st2 : 'else_macro_def) - (st1 : 'smlist_then) _ _ _ - (_loc : Gram.Loc.t) -> - (make_SdITE_result st1 st2 : 'macro_def)))); - ([ Gram.Skeyword "IFDEF"; - Gram.Snterm - (Gram.Entry.obj - (uident_eval_ifdef : - 'uident_eval_ifdef Gram.Entry.t)); - Gram.Skeyword "THEN"; - Gram.Snterm - (Gram.Entry.obj - (smlist_then : 'smlist_then Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (else_macro_def : - 'else_macro_def Gram.Entry.t)) ], - (Gram.Action.mk - (fun (st2 : 'else_macro_def) - (st1 : 'smlist_then) _ _ _ - (_loc : Gram.Loc.t) -> - (make_SdITE_result st1 st2 : 'macro_def)))); - ([ Gram.Skeyword "UNDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> - (SdUnd i : 'macro_def)))); - ([ Gram.Skeyword "DEFINE"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (opt_macro_value : - 'opt_macro_value Gram.Entry.t)) ], - (Gram.Action.mk - (fun (def : 'opt_macro_value) (i : 'uident) _ - (_loc : Gram.Loc.t) -> - (SdDef (i, def) : 'macro_def)))) ]) ])) - ()); - Gram.extend (macro_def_sig : 'macro_def_sig Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "INCLUDE"; - Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")) ], - (Gram.Action.mk - (fun (fname : Gram.Token.t) _ - (_loc : Gram.Loc.t) -> - (let fname = Gram.Token.extract_string fname - in - SdLazy - (lazy - (parse_include_file sig_items fname)) : - 'macro_def_sig)))); - ([ Gram.Skeyword "IFNDEF"; - Gram.Snterm - (Gram.Entry.obj - (uident_eval_ifndef : - 'uident_eval_ifndef Gram.Entry.t)); - Gram.Skeyword "THEN"; - Gram.Snterm - (Gram.Entry.obj - (sglist_then : 'sglist_then Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (else_macro_def_sig : - 'else_macro_def_sig Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sg2 : 'else_macro_def_sig) - (sg1 : 'sglist_then) _ _ _ - (_loc : Gram.Loc.t) -> - (make_SdITE_result sg1 sg2 : 'macro_def_sig)))); - ([ Gram.Skeyword "IFDEF"; - Gram.Snterm - (Gram.Entry.obj - (uident_eval_ifdef : - 'uident_eval_ifdef Gram.Entry.t)); - Gram.Skeyword "THEN"; - Gram.Snterm - (Gram.Entry.obj - (sglist_then : 'sglist_then Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (else_macro_def_sig : - 'else_macro_def_sig Gram.Entry.t)) ], - (Gram.Action.mk - (fun (sg2 : 'else_macro_def_sig) - (sg1 : 'sglist_then) _ _ _ - (_loc : Gram.Loc.t) -> - (make_SdITE_result sg1 sg2 : 'macro_def_sig)))); - ([ Gram.Skeyword "UNDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> - (SdUnd i : 'macro_def_sig)))); - ([ Gram.Skeyword "DEFINE"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'uident) _ (_loc : Gram.Loc.t) -> - (SdDef (i, None) : 'macro_def_sig)))) ]) ])) - ()); - Gram.extend - (uident_eval_ifdef : 'uident_eval_ifdef Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'uident) (_loc : Gram.Loc.t) -> - (Stack.push (is_defined i) stack : - 'uident_eval_ifdef)))) ]) ])) - ()); - Gram.extend - (uident_eval_ifndef : 'uident_eval_ifndef Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (i : 'uident) (_loc : Gram.Loc.t) -> - (Stack.push (not (is_defined i)) stack : - 'uident_eval_ifndef)))) ]) ])) - ()); - Gram.extend (else_macro_def : 'else_macro_def Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - ([] : 'else_macro_def)))); - ([ Gram.Skeyword "ELSE"; - Gram.Snterm - (Gram.Entry.obj - (smlist_else : 'smlist_else Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (st : 'smlist_else) _ (_loc : Gram.Loc.t) - -> (st : 'else_macro_def)))) ]) ])) - ()); - Gram.extend - (else_macro_def_sig : 'else_macro_def_sig Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - ([] : 'else_macro_def_sig)))); - ([ Gram.Skeyword "ELSE"; - Gram.Snterm - (Gram.Entry.obj - (sglist_else : 'sglist_else Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (st : 'sglist_else) _ (_loc : Gram.Loc.t) - -> (st : 'else_macro_def_sig)))) ]) ])) - ()); - Gram.extend (else_expr : 'else_expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))) : - 'else_expr)))); - ([ Gram.Skeyword "ELSE"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (e : 'expr) _ (_loc : Gram.Loc.t) -> - (e : 'else_expr)))) ]) ])) - ()); - Gram.extend (smlist_then : 'smlist_then Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist1 - (Gram.srules smlist_then - [ ([ Gram.Snterm - (Gram.Entry.obj - (str_item : - 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (si : 'str_item) - (_loc : Gram.Loc.t) -> - (SdStr si : 'e__25)))); - ([ Gram.Snterm - (Gram.Entry.obj - (macro_def : - 'macro_def Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (d : 'macro_def) - (_loc : Gram.Loc.t) -> - (execute_macro_if_active_branch - _loc (Ast.StNil _loc) - (fun a b -> - Ast.StSem (_loc, a, b)) - Then d : - 'e__25)))) ]) ], - (Gram.Action.mk - (fun (sml : 'e__25 list) (_loc : Gram.Loc.t) -> - (sml : 'smlist_then)))) ]) ])) - ()); - Gram.extend (smlist_else : 'smlist_else Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist1 - (Gram.srules smlist_else - [ ([ Gram.Snterm - (Gram.Entry.obj - (str_item : - 'str_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (si : 'str_item) - (_loc : Gram.Loc.t) -> - (SdStr si : 'e__26)))); - ([ Gram.Snterm - (Gram.Entry.obj - (macro_def : - 'macro_def Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (d : 'macro_def) - (_loc : Gram.Loc.t) -> - (execute_macro_if_active_branch - _loc (Ast.StNil _loc) - (fun a b -> - Ast.StSem (_loc, a, b)) - Else d : - 'e__26)))) ]) ], - (Gram.Action.mk - (fun (sml : 'e__26 list) (_loc : Gram.Loc.t) -> - (sml : 'smlist_else)))) ]) ])) - ()); - Gram.extend (sglist_then : 'sglist_then Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist1 - (Gram.srules sglist_then - [ ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : - 'sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (si : 'sig_item) - (_loc : Gram.Loc.t) -> - (SdStr si : 'e__27)))); - ([ Gram.Snterm - (Gram.Entry.obj - (macro_def_sig : - 'macro_def_sig Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (d : 'macro_def_sig) - (_loc : Gram.Loc.t) -> - (execute_macro_if_active_branch - _loc (Ast.SgNil _loc) - (fun a b -> - Ast.SgSem (_loc, a, b)) - Then d : - 'e__27)))) ]) ], - (Gram.Action.mk - (fun (sgl : 'e__27 list) (_loc : Gram.Loc.t) -> - (sgl : 'sglist_then)))) ]) ])) - ()); - Gram.extend (sglist_else : 'sglist_else Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Slist1 - (Gram.srules sglist_else - [ ([ Gram.Snterm - (Gram.Entry.obj - (sig_item : - 'sig_item Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (si : 'sig_item) - (_loc : Gram.Loc.t) -> - (SdStr si : 'e__28)))); - ([ Gram.Snterm - (Gram.Entry.obj - (macro_def_sig : - 'macro_def_sig Gram.Entry.t)); - Gram.Snterm - (Gram.Entry.obj - (semi : 'semi Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (d : 'macro_def_sig) - (_loc : Gram.Loc.t) -> - (execute_macro_if_active_branch - _loc (Ast.SgNil _loc) - (fun a b -> - Ast.SgSem (_loc, a, b)) - Else d : - 'e__28)))) ]) ], - (Gram.Action.mk - (fun (sgl : 'e__28 list) (_loc : Gram.Loc.t) -> - (sgl : 'sglist_else)))) ]) ])) - ()); - Gram.extend (endif : 'endif Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "ENDIF" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> (() : 'endif)))); - ([ Gram.Skeyword "END" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> (() : 'endif)))) ]) ])) - ()); - Gram.extend (opt_macro_value : 'opt_macro_value Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([], - (Gram.Action.mk - (fun (_loc : Gram.Loc.t) -> - (None : 'opt_macro_value)))); - ([ Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (Some (([], e)) : 'opt_macro_value)))); - ([ Gram.Skeyword "("; - Gram.Slist1sep - ((Gram.srules opt_macro_value - [ ([ Gram.Stoken - (((function - | LIDENT ((_)) -> true - | _ -> false), - "LIDENT _")) ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (let x = - Gram.Token.extract_string x - in x : 'e__29)))) ]), - (Gram.Skeyword ",")); - Gram.Skeyword ")"; Gram.Skeyword "="; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ _ (pl : 'e__29 list) _ - (_loc : Gram.Loc.t) -> - (Some ((pl, e)) : 'opt_macro_value)))) ]) ])) - ()); - Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "top")), - [ (None, None, - [ ([ Gram.Skeyword "DEFINE"; - Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")); - Gram.Skeyword "="; Gram.Sself; - Gram.Skeyword "IN"; Gram.Sself ], - (Gram.Action.mk - (fun (body : 'expr) _ (def : 'expr) _ - (i : Gram.Token.t) _ (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i - in (new subst _loc [ (i, def) ])#expr body : - 'expr)))); - ([ Gram.Skeyword "IFNDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); - Gram.Skeyword "THEN"; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (else_expr : 'else_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e2 : 'else_expr) (e1 : 'expr) _ - (i : 'uident) _ (_loc : Gram.Loc.t) -> - (if is_defined i then e2 else e1 : 'expr)))); - ([ Gram.Skeyword "IFDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); - Gram.Skeyword "THEN"; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj - (else_expr : 'else_expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e2 : 'else_expr) (e1 : 'expr) _ - (i : 'uident) _ (_loc : Gram.Loc.t) -> - (if is_defined i then e1 else e2 : 'expr)))) ]) ])) - ()); - Gram.extend (patt : 'patt Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "IFNDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); - Gram.Skeyword "THEN"; Gram.Sself; - Gram.Skeyword "ELSE"; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (p2 : 'patt) _ (p1 : 'patt) _ - (i : 'uident) _ (_loc : Gram.Loc.t) -> - (if is_defined i then p2 else p1 : 'patt)))); - ([ Gram.Skeyword "IFDEF"; - Gram.Snterm - (Gram.Entry.obj (uident : 'uident Gram.Entry.t)); - Gram.Skeyword "THEN"; Gram.Sself; - Gram.Skeyword "ELSE"; Gram.Sself; - Gram.Snterm - (Gram.Entry.obj (endif : 'endif Gram.Entry.t)) ], - (Gram.Action.mk - (fun _ (p2 : 'patt) _ (p1 : 'patt) _ - (i : 'uident) _ (_loc : Gram.Loc.t) -> - (if is_defined i then p1 else p2 : 'patt)))) ]) ])) - ()); - Gram.extend (uident : 'uident Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function | UIDENT ((_)) -> true | _ -> false), - "UIDENT _")) ], - (Gram.Action.mk - (fun (i : Gram.Token.t) (_loc : Gram.Loc.t) -> - (let i = Gram.Token.extract_string i in i : - 'uident)))) ]) ])) - ()); - Gram.extend - (* dirty hack to allow polymorphic variants using the introduced keywords. *) - (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Before "simple")), - [ (None, None, - [ ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.ExVrn (_loc, s) : 'expr)))); - ([ Gram.Skeyword "`"; - Gram.srules expr - [ ([ Gram.Skeyword "IN" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "DEFINE" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "ENDIF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "END" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "ELSE" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "THEN" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "IFNDEF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))); - ([ Gram.Skeyword "IFDEF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__30)))) ] ], - (Gram.Action.mk - (fun (kwd : 'e__30) _ (_loc : Gram.Loc.t) -> - (Ast.ExVrn (_loc, kwd) : 'expr)))) ]) ])) - ()); - Gram.extend (* idem *) (patt : 'patt Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Before "simple")), - [ (None, None, - [ ([ Gram.Skeyword "`"; - Gram.Snterm - (Gram.Entry.obj - (a_ident : 'a_ident Gram.Entry.t)) ], - (Gram.Action.mk - (fun (s : 'a_ident) _ (_loc : Gram.Loc.t) -> - (Ast.PaVrn (_loc, s) : 'patt)))); - ([ Gram.Skeyword "`"; - Gram.srules patt - [ ([ Gram.Skeyword "ENDIF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))); - ([ Gram.Skeyword "END" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))); - ([ Gram.Skeyword "ELSE" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))); - ([ Gram.Skeyword "THEN" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))); - ([ Gram.Skeyword "IFNDEF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))); - ([ Gram.Skeyword "IFDEF" ], - (Gram.Action.mk - (fun (x : Gram.Token.t) - (_loc : Gram.Loc.t) -> - (Gram.Token.extract_string x : 'e__31)))) ] ], - (Gram.Action.mk - (fun (kwd : 'e__31) _ (_loc : Gram.Loc.t) -> - (Ast.PaVrn (_loc, kwd) : 'patt)))) ]) ])) - ())) - - let _ = - Options.add "-D" (Arg.String parse_def) - " Define for IFDEF instruction." - - let _ = - Options.add "-U" (Arg.String undef) - " Undefine for IFDEF instruction." - - let _ = - Options.add "-I" (Arg.String add_include_dir) - " Add a directory to INCLUDE search path." - - end - - let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () - - module MakeNothing (AstFilters : Camlp4.Sig.AstFilters) = - struct - open AstFilters - - open Ast - - (* Remove NOTHING and expanse __FILE__ and __LOCATION__ *) - let map_expr = - function - | Ast.ExApp (_, e, (Ast.ExId (_, (Ast.IdUid (_, "NOTHING"))))) | - Ast.ExFun (_, - (Ast.McArr (_, (Ast.PaId (_, (Ast.IdUid (_, "NOTHING")))), - (Ast.ExNil _), e))) - -> e - | Ast.ExId (_loc, (Ast.IdLid (_, "__FILE__"))) -> - Ast.ExStr (_loc, - (Ast.safe_string_escaped (Loc.file_name _loc))) - | Ast.ExId (_loc, (Ast.IdLid (_, "__LOCATION__"))) -> - let (a, b, c, d, e, f, g, h) = Loc.to_tuple _loc - in - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Loc")), - (Ast.IdLid (_loc, "of_tuple")))))), - (Ast.ExTup (_loc, - (Ast.ExCom (_loc, - (Ast.ExStr (_loc, (Ast.safe_string_escaped a))), - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExCom (_loc, - (Ast.ExInt (_loc, - (string_of_int b))), - (Ast.ExInt (_loc, - (string_of_int c))))), - (Ast.ExInt (_loc, (string_of_int d))))), - (Ast.ExInt (_loc, (string_of_int e))))), - (Ast.ExInt (_loc, (string_of_int f))))), - (Ast.ExInt (_loc, (string_of_int g))))), - (if h - then Ast.ExId (_loc, (Ast.IdUid (_loc, "True"))) - else Ast.ExId (_loc, (Ast.IdUid (_loc, "False"))))))))))) - | e -> e - - let _ = register_str_item_filter (Ast.map_expr map_expr)#str_item - - end - - let _ = let module M = Camlp4.Register.AstFilter(Id)(MakeNothing) in () - - end - -module D = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Nicolas Pouillard: initial version - *) - module Id = - struct let name = "Camlp4DebugParser" - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - module StringSet = Set.Make(String) - - let debug_mode = - try - let str = Sys.getenv "STATIC_CAMLP4_DEBUG" in - let rec loop acc i = - try - let pos = String.index_from str i ':' - in - loop (StringSet.add (String.sub str i (pos - i)) acc) - (pos + 1) - with - | Not_found -> - StringSet.add (String.sub str i ((String.length str) - i)) - acc in - let sections = loop StringSet.empty 0 - in - if StringSet.mem "*" sections - then (fun _ -> true) - else (fun x -> StringSet.mem x sections) - with | Not_found -> (fun _ -> false) - - let rec apply accu = - function - | [] -> accu - | x :: xs -> - let _loc = Ast.loc_of_expr x - in apply (Ast.ExApp (_loc, accu, x)) xs - - let mk_debug_mode _loc = - function - | None -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), - (Ast.IdLid (_loc, "mode"))))) - | Some m -> - Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, m)), - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), - (Ast.IdLid (_loc, "mode"))))))) - - let mk_debug _loc m fmt section args = - let call = - apply - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "Debug")), - (Ast.IdLid (_loc, "printf")))))), - (Ast.ExStr (_loc, section)))), - (Ast.ExStr (_loc, fmt)))) - args - in - Ast.ExIfe (_loc, - (Ast.ExApp (_loc, (mk_debug_mode _loc m), - (Ast.ExStr (_loc, section)))), - call, (Ast.ExId (_loc, (Ast.IdUid (_loc, "()"))))) - - let _ = - let _ = (expr : 'expr Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let end_or_in : 'end_or_in Gram.Entry.t = - grammar_entry_create "end_or_in" - and start_debug : 'start_debug Gram.Entry.t = - grammar_entry_create "start_debug" - in - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterm - (Gram.Entry.obj - (start_debug : 'start_debug Gram.Entry.t)); - Gram.Stoken - (((function | LIDENT ((_)) -> true | _ -> false), - "LIDENT _")); - Gram.Stoken - (((function | STRING ((_)) -> true | _ -> false), - "STRING _")); - Gram.Slist0 - (Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - ".")); - Gram.Snterm - (Gram.Entry.obj - (end_or_in : 'end_or_in Gram.Entry.t)) ], - (Gram.Action.mk - (fun (x : 'end_or_in) (args : 'expr list) - (fmt : Gram.Token.t) (section : Gram.Token.t) - (m : 'start_debug) (_loc : Gram.Loc.t) -> - (let fmt = Gram.Token.extract_string fmt in - let section = - Gram.Token.extract_string section - in - match (x, (debug_mode section)) with - | (None, false) -> - Ast.ExId (_loc, - (Ast.IdUid (_loc, "()"))) - | (Some e, false) -> e - | (None, _) -> - mk_debug _loc m fmt section args - | (Some e, _) -> - Ast.ExLet (_loc, Ast.ReNil, - (Ast.BiEq (_loc, - (Ast.PaId (_loc, - (Ast.IdUid (_loc, "()")))), - (mk_debug _loc m fmt section args))), - e) : - 'expr)))) ]) ])) - ()); - Gram.extend (end_or_in : 'end_or_in Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Skeyword "in"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (e : 'expr) _ (_loc : Gram.Loc.t) -> - (Some e : 'end_or_in)))); - ([ Gram.Skeyword "end" ], - (Gram.Action.mk - (fun _ (_loc : Gram.Loc.t) -> - (None : 'end_or_in)))) ]) ])) - ()); - Gram.extend (start_debug : 'start_debug Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Stoken - (((function - | LIDENT "camlp4_debug" -> true - | _ -> false), - "LIDENT \"camlp4_debug\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT "camlp4_debug" -> - (Some "Camlp4" : 'start_debug) - | _ -> assert false))); - ([ Gram.Stoken - (((function - | LIDENT "debug" -> true - | _ -> false), - "LIDENT \"debug\"")) ], - (Gram.Action.mk - (fun (__camlp4_0 : Gram.Token.t) - (_loc : Gram.Loc.t) -> - match __camlp4_0 with - | LIDENT "debug" -> (None : 'start_debug) - | _ -> assert false))) ]) ])) - ())) - - end - - let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () - - end - -module L = - struct - open Camlp4 - - (* -*- camlp4r -*- *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2007 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Nao Hirokawa: initial version - * - Nicolas Pouillard: revised syntax version - *) - module Id = - struct - let name = "Camlp4ListComprehension" - - let version = Sys.ocaml_version - - end - - module Make (Syntax : Sig.Camlp4Syntax) = - struct - open Sig - - include Syntax - - let rec loop n = - function - | [] -> None - | [ (x, _) ] -> if n = 1 then Some x else None - | _ :: l -> loop (n - 1) l - - let stream_peek_nth n strm = loop n (Stream.npeek n strm) - - (* usual trick *) - let test_patt_lessminus = - Gram.Entry.of_parser "test_patt_lessminus" - (fun strm -> - let rec skip_patt n = - match stream_peek_nth n strm with - | Some (KEYWORD "<-") -> n - | Some (KEYWORD ("[" | "[<")) -> - skip_patt ((ignore_upto "]" (n + 1)) + 1) - | Some (KEYWORD "(") -> - skip_patt ((ignore_upto ")" (n + 1)) + 1) - | Some (KEYWORD "{") -> - skip_patt ((ignore_upto "}" (n + 1)) + 1) - | Some (KEYWORD ("as" | "::" | "," | "_")) | - Some (LIDENT _ | UIDENT _) -> skip_patt (n + 1) - | Some _ | None -> raise Stream.Failure - and ignore_upto end_kwd n = - match stream_peek_nth n strm with - | Some (KEYWORD prm) when prm = end_kwd -> n - | Some (KEYWORD ("[" | "[<")) -> - ignore_upto end_kwd ((ignore_upto "]" (n + 1)) + 1) - | Some (KEYWORD "(") -> - ignore_upto end_kwd ((ignore_upto ")" (n + 1)) + 1) - | Some (KEYWORD "{") -> - ignore_upto end_kwd ((ignore_upto "}" (n + 1)) + 1) - | Some _ -> ignore_upto end_kwd (n + 1) - | None -> raise Stream.Failure - in skip_patt 1) - - let map _loc p e l = - match (p, e) with - | (Ast.PaId (_, (Ast.IdLid (_, x))), - Ast.ExId (_, (Ast.IdLid (_, y)))) when x = y -> l - | _ -> - if Ast.is_irrefut_patt p - then - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), - (Ast.IdLid (_loc, "map")))))), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), e)))))), - l) - else - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), - (Ast.IdLid (_loc, "fold_right")))))), - (Ast.ExFun (_loc, - (Ast.McOr (_loc, - (Ast.McArr (_loc, p, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))), - (Ast.ExApp (_loc, - (Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdLid (_loc, "x")))), - (Ast.ExNil _loc), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdLid (_loc, "xs")))), - (Ast.ExNil _loc), - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, - "::")))), - (Ast.ExId (_loc, - (Ast.IdLid (_loc, - "x")))))), - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "xs")))))))))))))), - e)))), - (Ast.McArr (_loc, (Ast.PaAny _loc), - (Ast.ExNil _loc), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, - (Ast.PaId (_loc, - (Ast.IdLid (_loc, "l")))), - (Ast.ExNil _loc), - (Ast.ExId (_loc, - (Ast.IdLid (_loc, "l")))))))))))))))), - l)), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) - - let filter _loc p b l = - if Ast.is_irrefut_patt p - then - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), - (Ast.IdLid (_loc, "filter")))))), - (Ast.ExFun (_loc, - (Ast.McArr (_loc, p, (Ast.ExNil _loc), b)))))), - l) - else - Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), - (Ast.IdLid (_loc, "filter")))))), - (Ast.ExFun (_loc, - (Ast.McOr (_loc, - (Ast.McArr (_loc, p, - (Ast.ExId (_loc, (Ast.IdUid (_loc, "True")))), b)), - (Ast.McArr (_loc, (Ast.PaAny _loc), (Ast.ExNil _loc), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "False")))))))))))), - l) - - let concat _loc l = - Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdAcc (_loc, (Ast.IdUid (_loc, "List")), - (Ast.IdLid (_loc, "concat")))))), - l) - - let rec compr _loc e = - function - | [ `gen ((p, l)) ] -> map _loc p e l - | `gen ((p, l)) :: `cond b :: items -> - compr _loc e ((`gen ((p, (filter _loc p b l)))) :: items) - | `gen ((p, l)) :: ((`gen ((_, _)) :: _ as is)) -> - concat _loc (map _loc p (compr _loc e is) l) - | _ -> raise Stream.Failure - - let _ = - Gram.delete_rule expr - [ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t)); - Gram.Skeyword "]" ] - - let is_revised = - try - (Gram.delete_rule expr - [ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : 'sem_expr_for_list Gram.Entry.t)); - Gram.Skeyword "::"; - Gram.Snterm (Gram.Entry.obj (expr : 'expr Gram.Entry.t)); - Gram.Skeyword "]" ]; - true) - with | Struct.Grammar.Delete.Rule_not_found _ -> false - - let comprehension_or_sem_expr_for_list = - Gram.Entry.mk "comprehension_or_sem_expr_for_list" - - let _ = - let _ = (expr : 'expr Gram.Entry.t) - and _ = - (comprehension_or_sem_expr_for_list : - 'comprehension_or_sem_expr_for_list Gram.Entry.t) in - let grammar_entry_create = Gram.Entry.mk in - let item : 'item Gram.Entry.t = grammar_entry_create "item" - in - (Gram.extend (expr : 'expr Gram.Entry.t) - ((fun () -> - ((Some (Camlp4.Sig.Grammar.Level "simple")), - [ (None, None, - [ ([ Gram.Skeyword "["; - Gram.Snterm - (Gram.Entry.obj - (comprehension_or_sem_expr_for_list : - 'comprehension_or_sem_expr_for_list Gram. - Entry.t)); - Gram.Skeyword "]" ], - (Gram.Action.mk - (fun _ (e : 'comprehension_or_sem_expr_for_list) - _ (_loc : Gram.Loc.t) -> (e : 'expr)))) ]) ])) - ()); - Gram.extend - (comprehension_or_sem_expr_for_list : - 'comprehension_or_sem_expr_for_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top") ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) : - 'comprehension_or_sem_expr_for_list)))); - ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top"); - Gram.Skeyword "|"; - Gram.Slist1sep - ((Gram.Snterm - (Gram.Entry.obj (item : 'item Gram.Entry.t))), - (Gram.Skeyword ";")) ], - (Gram.Action.mk - (fun (l : 'item list) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (compr _loc e l : - 'comprehension_or_sem_expr_for_list)))); - ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top"); - Gram.Skeyword ";" ], - (Gram.Action.mk - (fun _ (e : 'expr) (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - (Ast.ExId (_loc, (Ast.IdUid (_loc, "[]"))))) : - 'comprehension_or_sem_expr_for_list)))); - ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top"); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : - 'sem_expr_for_list Gram.Entry.t)) ], - (Gram.Action.mk - (fun (mk : 'sem_expr_for_list) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - (mk - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "[]")))))) : - 'comprehension_or_sem_expr_for_list)))) ]) ])) - ()); - Gram.extend (item : 'item Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ (* NP: These rules rely on being on this particular order. Which should - be improved. *) - Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top") ], - (Gram.Action.mk - (fun (e : 'expr) (_loc : Gram.Loc.t) -> - (`cond e : 'item)))); - ([ Gram.Stry - (Gram.srules item - [ ([ Gram.Snterm - (Gram.Entry.obj - (patt : 'patt Gram.Entry.t)); - Gram.Skeyword "<-" ], - (Gram.Action.mk - (fun _ (p : 'patt) (_loc : Gram.Loc.t) - -> (p : 'e__32)))) ]); - Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top") ], - (Gram.Action.mk - (fun (e : 'expr) (p : 'e__32) - (_loc : Gram.Loc.t) -> - (`gen ((p, e)) : 'item)))) ]) ])) - ())) - - let _ = - if is_revised - then - (let _ = (expr : 'expr Gram.Entry.t) - and _ = - (comprehension_or_sem_expr_for_list : - 'comprehension_or_sem_expr_for_list Gram.Entry.t) - in - Gram.extend - (comprehension_or_sem_expr_for_list : - 'comprehension_or_sem_expr_for_list Gram.Entry.t) - ((fun () -> - (None, - [ (None, None, - [ ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top"); - Gram.Skeyword "::"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (last : 'expr) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - last) : - 'comprehension_or_sem_expr_for_list)))); - ([ Gram.Snterml - ((Gram.Entry.obj (expr : 'expr Gram.Entry.t)), - "top"); - Gram.Skeyword ";"; - Gram.Snterm - (Gram.Entry.obj - (sem_expr_for_list : - 'sem_expr_for_list Gram.Entry.t)); - Gram.Skeyword "::"; - Gram.Snterm - (Gram.Entry.obj (expr : 'expr Gram.Entry.t)) ], - (Gram.Action.mk - (fun (last : 'expr) _ - (mk : 'sem_expr_for_list) _ (e : 'expr) - (_loc : Gram.Loc.t) -> - (Ast.ExApp (_loc, - (Ast.ExApp (_loc, - (Ast.ExId (_loc, - (Ast.IdUid (_loc, "::")))), - e)), - (mk last)) : - 'comprehension_or_sem_expr_for_list)))) ]) ])) - ())) - else () - - end - - let _ = let module M = Register.OCamlSyntaxExtension(Id)(Make) in () - - end - -module P = - struct - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Nicolas Pouillard: initial version - *) - let _ = Camlp4.Register.enable_dump_ocaml_ast_printer () - - end - -module B = - struct - (* camlp4r *) - (****************************************************************************) - (* *) - (* OCaml *) - (* *) - (* INRIA Rocquencourt *) - (* *) - (* Copyright 2006 Institut National de Recherche en Informatique et *) - (* en Automatique. All rights reserved. This file is distributed under *) - (* the terms of the GNU Library General Public License, with the special *) - (* exception on linking described in LICENSE at the top of the OCaml *) - (* source tree. *) - (* *) - (****************************************************************************) - (* Authors: - * - Daniel de Rauglaudre: initial version - * - Nicolas Pouillard: refactoring - *) - open Camlp4 - - open PreCast.Syntax - - open PreCast - - open Format - - module CleanAst = Camlp4.Struct.CleanAst.Make(Ast) - - module SSet = Set.Make(String) - - let pa_r = "Camlp4OCamlRevisedParser" - - let pa_rr = "Camlp4OCamlReloadedParser" - - let pa_o = "Camlp4OCamlParser" - - let pa_rp = "Camlp4OCamlRevisedParserParser" - - let pa_op = "Camlp4OCamlParserParser" - - let pa_g = "Camlp4GrammarParser" - - let pa_m = "Camlp4MacroParser" - - let pa_qb = "Camlp4QuotationCommon" - - let pa_q = "Camlp4QuotationExpander" - - let pa_rq = "Camlp4OCamlRevisedQuotationExpander" - - let pa_oq = "Camlp4OCamlOriginalQuotationExpander" - - let pa_l = "Camlp4ListComprehension" - - open Register - - let dyn_loader = - ref (fun _ -> raise (Match_failure ("./camlp4/Camlp4Bin.ml", 45, 24))) - - let rcall_callback = ref (fun () -> ()) - - let loaded_modules = ref SSet.empty - - let add_to_loaded_modules name = - loaded_modules := SSet.add name !loaded_modules - - let (objext, libext) = - if DynLoader.is_native then (".cmxs", ".cmxs") else (".cmo", ".cma") - - let rewrite_and_load n x = - let dyn_loader = !dyn_loader () in - let find_in_path = DynLoader.find_in_path dyn_loader in - let real_load name = - (add_to_loaded_modules name; DynLoader.load dyn_loader name) in - let load = - List.iter - (fun n -> - if - (SSet.mem n !loaded_modules) || - (List.mem n !Register.loaded_modules) - then () - else - (add_to_loaded_modules n; - DynLoader.load dyn_loader (n ^ objext))) - in - ((match (n, (String.lowercase x)) with - | (("Parsers" | ""), - ("pa_r.cmo" | "r" | "ocamlr" | "ocamlrevised" | - "camlp4ocamlrevisedparser.cmo")) - -> load [ pa_r ] - | (("Parsers" | ""), - ("rr" | "reloaded" | "ocamlreloaded" | - "camlp4ocamlreloadedparser.cmo")) - -> load [ pa_rr ] - | (("Parsers" | ""), - ("pa_o.cmo" | "o" | "ocaml" | "camlp4ocamlparser.cmo")) -> - load [ pa_r; pa_o ] - | (("Parsers" | ""), - ("pa_rp.cmo" | "rp" | "rparser" | - "camlp4ocamlrevisedparserparser.cmo")) - -> load [ pa_r; pa_rp ] - | (("Parsers" | ""), - ("pa_op.cmo" | "op" | "parser" | "camlp4ocamlparserparser.cmo")) - -> load [ pa_r; pa_o; pa_rp; pa_op ] - | (("Parsers" | ""), - ("pa_extend.cmo" | "pa_extend_m.cmo" | "g" | "grammar" | - "camlp4grammarparser.cmo")) - -> load [ pa_g ] - | (("Parsers" | ""), - ("pa_macro.cmo" | "m" | "macro" | "camlp4macroparser.cmo")) -> - load [ pa_m ] - | (("Parsers" | ""), ("q" | "camlp4quotationexpander.cmo")) -> - load [ pa_qb; pa_q ] - | (("Parsers" | ""), - ("q_mlast.cmo" | "rq" | - "camlp4ocamlrevisedquotationexpander.cmo")) - -> load [ pa_qb; pa_rq ] - | (("Parsers" | ""), - ("oq" | "camlp4ocamloriginalquotationexpander.cmo")) -> - load [ pa_r; pa_o; pa_qb; pa_oq ] - | (("Parsers" | ""), "rf") -> - load [ pa_r; pa_rp; pa_qb; pa_q; pa_g; pa_l; pa_m ] - | (("Parsers" | ""), "of") -> - load - [ pa_r; pa_o; pa_rp; pa_op; pa_qb; pa_q; pa_g; pa_l; pa_m ] - | (("Parsers" | ""), ("comp" | "camlp4listcomprehension.cmo")) -> - load [ pa_l ] - | (("Filters" | ""), ("lift" | "camlp4astlifter.cmo")) -> - load [ "Camlp4AstLifter" ] - | (("Filters" | ""), ("exn" | "camlp4exceptiontracer.cmo")) -> - load [ "Camlp4ExceptionTracer" ] - | (("Filters" | ""), ("prof" | "camlp4profiler.cmo")) -> - load [ "Camlp4Profiler" ] - | (* map is now an alias of fold since fold handles map too *) - (("Filters" | ""), ("map" | "camlp4mapgenerator.cmo")) -> - load [ "Camlp4FoldGenerator" ] - | (("Filters" | ""), ("fold" | "camlp4foldgenerator.cmo")) -> - load [ "Camlp4FoldGenerator" ] - | (("Filters" | ""), ("meta" | "camlp4metagenerator.cmo")) -> - load [ "Camlp4MetaGenerator" ] - | (("Filters" | ""), ("trash" | "camlp4trashremover.cmo")) -> - load [ "Camlp4TrashRemover" ] - | (("Filters" | ""), ("striploc" | "camlp4locationstripper.cmo")) - -> load [ "Camlp4LocationStripper" ] - | (("Printers" | ""), - ("pr_r.cmo" | "r" | "ocamlr" | "camlp4ocamlrevisedprinter.cmo")) - -> Register.enable_ocamlr_printer () - | (("Printers" | ""), - ("pr_o.cmo" | "o" | "ocaml" | "camlp4ocamlprinter.cmo")) -> - Register.enable_ocaml_printer () - | (("Printers" | ""), - ("pr_dump.cmo" | "p" | "dumpocaml" | "camlp4ocamlastdumper.cmo")) - -> Register.enable_dump_ocaml_ast_printer () - | (("Printers" | ""), ("d" | "dumpcamlp4" | "camlp4astdumper.cmo")) - -> Register.enable_dump_camlp4_ast_printer () - | (("Printers" | ""), ("a" | "auto" | "camlp4autoprinter.cmo")) -> - load [ "Camlp4AutoPrinter" ] - | _ -> - let y = "Camlp4" ^ (n ^ ("/" ^ (x ^ objext))) - in real_load (try find_in_path y with | Not_found -> x)); - !rcall_callback ()) - - let print_warning = eprintf "%a:\n%s@." Loc.print - - let rec parse_file dyn_loader name pa getdir = - let directive_handler = - Some - (fun ast -> - match getdir ast with - | Some x -> - (match x with - | (_, "load", s) -> (rewrite_and_load "" s; None) - | (_, "directory", s) -> - (DynLoader.include_dir dyn_loader s; None) - | (_, "use", s) -> Some (parse_file dyn_loader s pa getdir) - | (_, "default_quotation", s) -> - (Quotation.default := s; None) - | (loc, _, _) -> - Loc.raise loc (Stream.Error "bad directive")) - | None -> None) in - let loc = Loc.mk name - in - (current_warning := print_warning; - let ic = if name = "-" then stdin else open_in_bin name in - let cs = Stream.of_channel ic in - let clear () = if name = "-" then () else close_in ic in - let phr = - try pa ?directive_handler loc cs with | x -> (clear (); raise x) - in (clear (); phr)) - - let output_file = ref None - - let process dyn_loader name pa pr clean fold_filters getdir = - let ast = parse_file dyn_loader name pa getdir in - let ast = fold_filters (fun t filter -> filter t) ast in - let ast = clean ast - in pr ?input_file: (Some name) ?output_file: !output_file ast - - let gind = - function - | Ast.SgDir (loc, n, (Ast.ExStr (_, s))) -> Some ((loc, n, s)) - | _ -> None - - let gimd = - function - | Ast.StDir (loc, n, (Ast.ExStr (_, s))) -> Some ((loc, n, s)) - | _ -> None - - let process_intf dyn_loader name = - process dyn_loader name CurrentParser.parse_interf CurrentPrinter. - print_interf (new CleanAst.clean_ast)#sig_item AstFilters. - fold_interf_filters gind - - let process_impl dyn_loader name = - process dyn_loader name CurrentParser.parse_implem CurrentPrinter. - print_implem (new CleanAst.clean_ast)#str_item AstFilters. - fold_implem_filters gimd - - let just_print_the_version () = - (printf "%s@." Camlp4_config.version; exit 0) - - let print_version () = - (eprintf "Camlp4 version %s@." Camlp4_config.version; exit 0) - - let print_stdlib () = - (printf "%s@." Camlp4_config.camlp4_standard_library; exit 0) - - let usage ini_sl ext_sl = - (eprintf - "\ -Usage: camlp4 [load-options] [--] [other-options]\n\ -Options:\n\ -.ml Parse this implementation file\n\ -.mli Parse this interface file\n\ -.%s Load this module inside the Camlp4 core@." - (if DynLoader.is_native then "cmxs " else "(cmo|cma)"); - Options.print_usage_list ini_sl; - (* loop (ini_sl @ ext_sl) where rec loop = - fun - [ [(y, _, _) :: _] when y = "-help" -> () - | [_ :: sl] -> loop sl - | [] -> eprintf " -help Display this list of options.@." ]; *) - if ext_sl <> [] - then - (eprintf "Options added by loaded object files:@."; - Options.print_usage_list ext_sl) - else ()) - - let warn_noassert () = - eprintf - "\ -camlp4 warning: option -noassert is obsolete\n\ -You should give the -noassert option to the ocaml compiler instead.@." - - type file_kind = - | Intf of string - | Impl of string - | Str of string - | ModuleImpl of string - | IncludeDir of string - - let search_stdlib = ref true - - let print_loaded_modules = ref false - - let (task, do_task) = - let t = ref None in - let task f x = - let () = Camlp4_config.current_input_file := x - in - t := - Some - (if !t = None then (fun _ -> f x) else (fun usage -> usage ())) in - let do_task usage = match !t with | Some f -> f usage | None -> () - in (task, do_task) - - let input_file x = - let dyn_loader = !dyn_loader () - in - (!rcall_callback (); - (match x with - | Intf file_name -> task (process_intf dyn_loader) file_name - | Impl file_name -> task (process_impl dyn_loader) file_name - | Str s -> - let (f, o) = Filename.open_temp_file "from_string" ".ml" - in - (output_string o s; - close_out o; - task (process_impl dyn_loader) f; - at_exit (fun () -> Sys.remove f)) - | ModuleImpl file_name -> rewrite_and_load "" file_name - | IncludeDir dir -> DynLoader.include_dir dyn_loader dir); - !rcall_callback ()) - - let initial_spec_list = - [ ("-I", (Arg.String (fun x -> input_file (IncludeDir x))), - " Add directory in search patch for object files."); - ("-where", (Arg.Unit print_stdlib), - "Print camlp4 library directory and exit."); - ("-nolib", (Arg.Clear search_stdlib), - "No automatic search for object files in library directory."); - ("-intf", (Arg.String (fun x -> input_file (Intf x))), - " Parse as an interface, whatever its extension."); - ("-impl", (Arg.String (fun x -> input_file (Impl x))), - " Parse as an implementation, whatever its extension."); - ("-str", (Arg.String (fun x -> input_file (Str x))), - " Parse as an implementation."); - ("-unsafe", (Arg.Set Camlp4_config.unsafe), - "Generate unsafe accesses to array and strings."); - ("-noassert", (Arg.Unit warn_noassert), - "Obsolete, do not use this option."); - ("-verbose", (Arg.Set Camlp4_config.verbose), - "More verbose in parsing errors."); - ("-loc", (Arg.Set_string Loc.name), - (" Name of the location variable (default: " ^ - (!Loc.name ^ ")."))); - ("-QD", (Arg.String (fun x -> Quotation.dump_file := Some x)), - " Dump quotation expander result in case of syntax error."); - ("-o", (Arg.String (fun x -> output_file := Some x)), - " Output on instead of standard output."); - ("-v", (Arg.Unit print_version), "Print Camlp4 version and exit."); - ("-version", (Arg.Unit just_print_the_version), - "Print Camlp4 version number and exit."); - ("-vnum", (Arg.Unit just_print_the_version), - "Print Camlp4 version number and exit."); - ("-no_quot", (Arg.Clear Camlp4_config.quotations), - "Don't parse quotations, allowing to use, e.g. \"<:>\" as token."); - ("-loaded-modules", (Arg.Set print_loaded_modules), - "Print the list of loaded modules."); - ("-parser", (Arg.String (rewrite_and_load "Parsers")), - " Load the parser Camlp4Parsers/.cm(o|a|xs)"); - ("-printer", (Arg.String (rewrite_and_load "Printers")), - " Load the printer Camlp4Printers/.cm(o|a|xs)"); - ("-filter", (Arg.String (rewrite_and_load "Filters")), - " Load the filter Camlp4Filters/.cm(o|a|xs)"); - ("-ignore", (Arg.String ignore), "ignore the next argument"); - ("--", (Arg.Unit ignore), "Deprecated, does nothing") ] - - let _ = Options.init initial_spec_list - - let anon_fun name = - input_file - (if Filename.check_suffix name ".mli" - then Intf name - else - if Filename.check_suffix name ".ml" - then Impl name - else - if Filename.check_suffix name objext - then ModuleImpl name - else - if Filename.check_suffix name libext - then ModuleImpl name - else raise (Arg.Bad ("don't know what to do with " ^ name))) - - let main argv = - let usage () = - (usage initial_spec_list (Options.ext_spec_list ()); exit 0) - in - try - let dynloader = - DynLoader.mk ~ocaml_stdlib: !search_stdlib - ~camlp4_stdlib: !search_stdlib () - in - (dyn_loader := (fun () -> dynloader); - let call_callback () = - Register.iter_and_take_callbacks - (fun (name, module_callback) -> - let () = add_to_loaded_modules name in module_callback ()) - in - (call_callback (); - rcall_callback := call_callback; - (match Options.parse anon_fun argv with - | [] -> () - | ("-help" | "--help" | "-h" | "-?") :: _ -> usage () - | s :: _ -> - (eprintf "%s: unknown or misused option\n" s; - eprintf "Use option -help for usage@."; - exit 2)); - do_task usage; - call_callback (); - if !print_loaded_modules - then SSet.iter (eprintf "%s@.") !loaded_modules - else ())) - with - | Arg.Bad s -> - (eprintf "Error: %s\n" s; - eprintf "Use option -help for usage@."; - exit 2) - | Arg.Help _ -> usage () - | exc -> (eprintf "@[%a@]@." ErrorHandler.print exc; exit 2) - - let _ = main Sys.argv - - end - - diff --git a/camlp4/boot/camlp4boot.ml4 b/camlp4/boot/camlp4boot.ml4 deleted file mode 100644 index 4c4c46d1..00000000 --- a/camlp4/boot/camlp4boot.ml4 +++ /dev/null @@ -1,10 +0,0 @@ -module R = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml"; end; -module Camlp4QuotationCommon = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml"; end; -module Q = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml"; end; -module Rp = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml"; end; -module G = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4GrammarParser.ml"; end; -module M = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4MacroParser.ml"; end; -module D = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4DebugParser.ml"; end; -module L = struct INCLUDE "camlp4/Camlp4Parsers/Camlp4ListComprehension.ml"; end; -module P = struct INCLUDE "camlp4/Camlp4Printers/Camlp4OCamlAstDumper.ml"; end; -module B = struct INCLUDE "camlp4/Camlp4Bin.ml"; end; diff --git a/camlp4/build/.ignore b/camlp4/build/.ignore deleted file mode 100644 index 5332d60b..00000000 --- a/camlp4/build/.ignore +++ /dev/null @@ -1,5 +0,0 @@ -camlp4_config.ml -location.ml -location.mli -terminfo.ml -terminfo.mli diff --git a/camlp4/camlp4.odocl b/camlp4/camlp4.odocl deleted file mode 100644 index 715f15e8..00000000 --- a/camlp4/camlp4.odocl +++ /dev/null @@ -1 +0,0 @@ -Camlp4/Sig diff --git a/camlp4/camlp4fulllib.mllib b/camlp4/camlp4fulllib.mllib deleted file mode 100644 index c7073c28..00000000 --- a/camlp4/camlp4fulllib.mllib +++ /dev/null @@ -1,35 +0,0 @@ -Camlp4 -Camlp4_import -Camlp4_config - -Camlp4Parsers/Camlp4AstLoader -Camlp4Parsers/Camlp4DebugParser -Camlp4Parsers/Camlp4GrammarParser -Camlp4Parsers/Camlp4ListComprehension -Camlp4Parsers/Camlp4MacroParser -Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander -Camlp4Parsers/Camlp4OCamlParser -Camlp4Parsers/Camlp4OCamlParserParser -Camlp4Parsers/Camlp4OCamlRevisedParser -Camlp4Parsers/Camlp4OCamlRevisedParserParser -Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander -Camlp4Parsers/Camlp4QuotationCommon -Camlp4Parsers/Camlp4QuotationExpander - -Camlp4Printers/Camlp4AstDumper -Camlp4Printers/Camlp4AutoPrinter -Camlp4Printers/Camlp4NullDumper -Camlp4Printers/Camlp4OCamlAstDumper -Camlp4Printers/Camlp4OCamlPrinter -Camlp4Printers/Camlp4OCamlRevisedPrinter - -Camlp4Filters/Camlp4AstLifter -Camlp4Filters/Camlp4ExceptionTracer -Camlp4Filters/Camlp4FoldGenerator -Camlp4Filters/Camlp4LocationStripper -Camlp4Filters/Camlp4MapGenerator -Camlp4Filters/Camlp4MetaGenerator -Camlp4Filters/Camlp4Profiler -Camlp4Filters/Camlp4TrashRemover - -Camlp4Top diff --git a/camlp4/camlp4lib.mllib b/camlp4/camlp4lib.mllib deleted file mode 100644 index 08dc97f0..00000000 --- a/camlp4/camlp4lib.mllib +++ /dev/null @@ -1,3 +0,0 @@ -Camlp4 -Camlp4_import -Camlp4_config diff --git a/camlp4/camlp4prof.ml b/camlp4/camlp4prof.ml deleted file mode 100644 index ec2ba8c5..00000000 --- a/camlp4/camlp4prof.ml +++ /dev/null @@ -1,38 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -module Debug = struct value mode _ = False; end; - -value count = - let h = Hashtbl.create 1007 in - let () = at_exit (fun () -> - let assoc = Hashtbl.fold (fun k v a -> [ (k, v.val) :: a ]) h [] in - let out = open_out "camlp4_profiler.out" in - let () = Marshal.to_channel out assoc [] in - close_out out) in - fun s -> - try incr (Hashtbl.find h s) - with [ Not_found -> Hashtbl.add h s (ref 1) ]; - -value load = Marshal.from_channel; - -value main () = - - let profile = List.sort (fun (_, v1) (_, v2) -> compare v1 v2) (load stdin) in - - List.iter - (fun (k, v) -> Format.printf "%-75s: %d@." k v) - profile; - -if Sys.argv.(0) = "camlp4prof" then main () else (); diff --git a/camlp4/camlp4prof.mli b/camlp4/camlp4prof.mli deleted file mode 100644 index b7de6450..00000000 --- a/camlp4/camlp4prof.mli +++ /dev/null @@ -1,17 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -value count : string -> unit; - -value load : in_channel -> list (string * int); diff --git a/camlp4/examples/_tags b/camlp4/examples/_tags deleted file mode 100644 index 296772b8..00000000 --- a/camlp4/examples/_tags +++ /dev/null @@ -1,32 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Nicolas Pouillard, projet Gallium, INRIA Rocquencourt # -# # -# Copyright 2007 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the GNU Library General Public License, with # -# the special exception on linking described in file ../LICENSE. # -# # -######################################################################### - -true: warn_A, warn_e -<{apply_operator,type_quotation,global_handler,expression_closure{,_filter}}.ml> or : camlp4rf, use_camlp4 -"lambda_quot.ml": camlp4rf, use_camlp4_full -<{fancy_,}lambda_{quot,quot_{expr,patt},parser}.ml>: camlp4of, use_camlp4_full -"macros.ml" or or "gen_match_case.ml": camlp4of, use_camlp4 -"test_macros.ml": pp(camlp4of ./macros.cmo) -"lambda_test.ml": pp(camlp4of ./lambda_quot_o.cmo) -"fancy_lambda_quot_test.ml": use_camlp4, pp(camlp4of ./fancy_lambda_quot.cmo) -: camlp4of, use_camlp4_full, use_dynlink -"test_type_quotation.ml": pp(camlp4of ./type_quotation.cmo) -"apply_operator_test.ml": pp(camlp4o ./apply_operator.cmo) -"expression_closure_test.ml": pp(camlp4o ./expression_closure_filter.cmo) -"gen_type_N.ml": camlp4orf, use_camlp4 -"syb_fold.ml": pp(camlp4o -filter fold), use_camlp4 -"syb_map.ml": pp(camlp4o -filter map), use_camlp4 -"ex_str.ml": camlp4of, use_camlp4, use_camlp4_full -"ex_str_test.ml": pp(camlp4o ./ex_str.cmo) -"poly_by_default.ml": camlp4of, use_camlp4 -"poly_by_default_test.ml": pp(camlp4of ./poly_by_default.cmo) diff --git a/camlp4/examples/all.itarget b/camlp4/examples/all.itarget deleted file mode 100644 index d8384bab..00000000 --- a/camlp4/examples/all.itarget +++ /dev/null @@ -1,11 +0,0 @@ -apply_operator.cmo -type_quotation.cmo -lambda_quot.cmo -lambda_quot_o.cmo -macros.cmo -parse_files.byte -parse_files.native -arith.cmo -expression_closure.cmo -expression_closure_filter.cmo -global_handler.cmo diff --git a/camlp4/examples/apply_operator.ml b/camlp4/examples/apply_operator.ml deleted file mode 100644 index 9afbf481..00000000 --- a/camlp4/examples/apply_operator.ml +++ /dev/null @@ -1,20 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast; -AstFilters.register_str_item_filter - (Ast.map_expr - (fun - [ <:expr@loc< $e1$ & $e2$ >> -> <:expr@loc< $e1$ $e2$ >> - | e -> e ]))#str_item; diff --git a/camlp4/examples/apply_operator_test.ml b/camlp4/examples/apply_operator_test.ml deleted file mode 100644 index 94e7355c..00000000 --- a/camlp4/examples/apply_operator_test.ml +++ /dev/null @@ -1,17 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -let ( & ) = ();; (* To force it to be inlined. If not it's not well typed. *) - -fun f g h x -> f& g& h x diff --git a/camlp4/examples/arith.ml b/camlp4/examples/arith.ml deleted file mode 100644 index 15953262..00000000 --- a/camlp4/examples/arith.ml +++ /dev/null @@ -1,63 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Please keep me in sync with brion.inria.fr/gallium/index.php/Arithmetic_Example *) - - open Camlp4.PreCast;; - module ArithGram = MakeGram(Lexer);; - - type t = Local of string * t * t - | Binop of t * (int -> int -> int) * t - | Int of int - | Var of string;; - - let expression = ArithGram.Entry.mk "expression";; - - EXTEND ArithGram - GLOBAL: expression; - - expression: (* A grammar entry for expressions *) - [ "top" - [ "let"; `LIDENT s; "="; e1 = SELF; "in"; e2 = SELF -> Local(s,e1,e2) ] - | "plus" - [ e1 = SELF; "+"; e2 = SELF -> Binop(e1, ( + ), e2) - | e1 = SELF; "-"; e2 = SELF -> Binop(e1, ( - ), e2) ] - | "times" - [ e1 = SELF; "*"; e2 = SELF -> Binop(e1, ( * ), e2) - | e1 = SELF; "/"; e2 = SELF -> Binop(e1, ( / ), e2) ] - | "simple" - [ `INT(i, _) -> Int(i) - | `LIDENT s -> Var(s) - | "("; e = expression; ")" -> e ] - ]; - - END;; - - let parse_arith s = - ArithGram.parse_string expression (Loc.mk "") s;; - - let rec eval env = - function - | Local(x, e1, e2) -> - let v1 = eval env e1 in - eval ((x, v1) :: env) e2 - | Binop(e1, op, e2) -> - op (eval env e1) (eval env e2) - | Int(i) -> i - | Var(x) -> List.assoc x env;; - - let calc s = - Format.printf "%s ==> %d@." s (eval [] (parse_arith s));; - - calc "42 * let x = 21 in x + x";; diff --git a/camlp4/examples/debug_extension.ml b/camlp4/examples/debug_extension.ml deleted file mode 100644 index a690044e..00000000 --- a/camlp4/examples/debug_extension.ml +++ /dev/null @@ -1,51 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* - * No debugging code at all: - * $ camlp4o -parser Camlp4DebugParser debug_extension.ml - * true - * Debugging code for lexing: - * $ STATIC_CAMLP4_DEBUG='lexing' camlp4o -parser Camlp4DebugParser debug_extension.ml - * let () = - * if Camlp4.Debug.mode "lexing" - * then Debug.printf "lexing" "TOKEN: Int %d" (2 * 21) - * else () - * in true - * - * Debugging code for lexing and parsing: - * $ STATIC_CAMLP4_DEBUG='lexing:parsing' camlp4o -parser Camlp4DebugParser debug_extension.ml - * let () = - * if Camlp4.Debug.mode "lexing" - * then Debug.printf "lexing" "TOKEN: Int %d" (2 * 21) - * else () in - * let () = - * if Camlp4.Debug.mode "parsing" - * then Debug.printf "parsing" "RULE: ..." - * else () - * in true - * - * Debugging code for any section: - * $ STATIC_CAMLP4_DEBUG='*' camlp4o -parser Camlp4DebugParser debug_extension.ml - * ... same output as above ... - * - * When you program is compiled you can use the CAMLP4_DEBUG variable to - * activate some debugging sections. - * - * CAMLP4_DEBUG_FILE manage where messages goes (default is stderr). - *) - -camlp4_debug lexing "TOKEN: Int %d" (2 * 21) in -camlp4_debug parsing "RULE: ..." in -true diff --git a/camlp4/examples/ex_str.ml b/camlp4/examples/ex_str.ml deleted file mode 100644 index 744cc33c..00000000 --- a/camlp4/examples/ex_str.ml +++ /dev/null @@ -1,36 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast;; -module Caml = - Camlp4OCamlParser.Make - (Camlp4OCamlRevisedParser.Make - (Camlp4.OCamlInitSyntax.Make(Ast)(Gram)(Quotation)));; - -let quotexpander str = - "[1; 2; 3]" (* ... do some real code on str *) - -let patt_quotexpander loc _loc_name_opt str = - Gram.parse_string Caml.patt loc (quotexpander str) - -let expr_quotexpander loc _loc_name_opt str = - Gram.parse_string Caml.expr loc (quotexpander str) - -let str_item_quotexpander loc loc_name_opt str = - <:str_item@loc< $exp: expr_quotexpander loc loc_name_opt str$ >> - -let () = - Syntax.Quotation.add "" Syntax.Quotation.DynAst.expr_tag expr_quotexpander; - Syntax.Quotation.add "" Syntax.Quotation.DynAst.str_item_tag str_item_quotexpander; - Syntax.Quotation.add "" Syntax.Quotation.DynAst.patt_tag patt_quotexpander diff --git a/camlp4/examples/ex_str_test.ml b/camlp4/examples/ex_str_test.ml deleted file mode 100644 index 7349c583..00000000 --- a/camlp4/examples/ex_str_test.ml +++ /dev/null @@ -1,15 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -function <> -> <> diff --git a/camlp4/examples/expression_closure.ml b/camlp4/examples/expression_closure.ml deleted file mode 100644 index 300d9710..00000000 --- a/camlp4/examples/expression_closure.ml +++ /dev/null @@ -1,37 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -#default_quotation "expr"; - -open Camlp4.PreCast; -open Format; - -module FV = Camlp4.Struct.FreeVars.Make Ast; -module PP = Camlp4.Printers.OCaml.Make Syntax; -module S = FV.S; - -value _loc = Loc.ghost; - -value pervasives = - let list = - [ "+"; "-"; "/"; "*" (* ... *) ] - in List.fold_right S.add list S.empty; - -value f e = - let fv = FV.free_vars pervasives e in - S.fold (fun x acc -> << fun ~ $x$ -> $acc$ >>) fv e; - -value print_expr = (new PP.printer ())#expr; - -printf "%a@." print_expr (f <>); diff --git a/camlp4/examples/expression_closure_filter.ml b/camlp4/examples/expression_closure_filter.ml deleted file mode 100644 index dec08b62..00000000 --- a/camlp4/examples/expression_closure_filter.ml +++ /dev/null @@ -1,64 +0,0 @@ -(* camlp4r *) -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -#default_quotation "expr"; - -open Camlp4.PreCast; -open Format; - -module FV = Camlp4.Struct.FreeVars.Make Ast; -module S = FV.S; - -value _loc = Loc.ghost; - -value pervasives = - let list = - [ "+"; "-"; "/"; "*" (* ... *) ] - in List.fold_right S.add list S.empty; - -value collect_free_vars_sets = - object (self) - inherit FV.fold_free_vars [S.t] S.add ~env_init:pervasives S.empty as super; - value free_sets = []; - method set_free free = {< free = free >}; - method expr = - fun - [ << close_expr $e$ >> -> (self#expr e)#add_current_free#set_free free - | e -> super#expr e ]; - method add_current_free = {< free_sets = [ free :: free_sets ] >}; - method free_sets = free_sets; - end; - -value apply_close_expr next_free_set = - object (self) - inherit Ast.map as super; - method expr = - fun - [ << close_expr $e$ >> -> - let e = self#expr e in - let fv = next_free_set () in - S.fold (fun x acc -> << fun ~ $x$ -> $acc$ >>) fv e - | e -> super#expr e ]; - end; - -value f st = - let fv_sets = ref (collect_free_vars_sets#str_item st)#free_sets in - let next_free_set () = - match fv_sets.val with - [ [] -> assert False - | [x::xs] -> let () = fv_sets.val := xs in x ] - in (apply_close_expr next_free_set)#str_item st; - -AstFilters.register_str_item_filter f; diff --git a/camlp4/examples/expression_closure_test.ml b/camlp4/examples/expression_closure_test.ml deleted file mode 100644 index 9e4cc536..00000000 --- a/camlp4/examples/expression_closure_test.ml +++ /dev/null @@ -1,28 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* x and y are free *) -close_expr(x y);; - -(* bind x *) -let x a = a + 42;; - -(* y is free *) -close_expr(x y);; - -(* bind y locally so the expr is closed *) -close_expr(let y = x 2 in x y);; - -(* bind y locally but outside, z is free *) -let y = x 2 in close_expr(x (z y));; diff --git a/camlp4/examples/fancy_lambda_quot.ml b/camlp4/examples/fancy_lambda_quot.ml deleted file mode 100644 index 8384dd19..00000000 --- a/camlp4/examples/fancy_lambda_quot.ml +++ /dev/null @@ -1,173 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2008 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* module LambdaSyntax = struct - module Loc = Camlp4.PreCast.Loc - type 'a antiquotable = - | Val of Loc.t * 'a - | Ant of Loc.t * string - type term' = - | Lam of var * term - | App of term * term - | Var of var - | Int of int antiquotable - |+ Why you don't want an antiquotation case here: - * Basically it seems natural that since an antiquotation of expression - * can be at any expression place. One can be a - * .... in fact not I not against that... - | Anti of Loc.t * string - +| - and term = term' antiquotable - and var = string antiquotable -end *) -module Antiquotable = struct - module Loc = Camlp4.PreCast.Loc - type 'a t = - | Val of Loc.t * 'a - | Ant of Loc.t * string -end -module Identity_type_functor = struct - type 'a t = 'a -end -module MakeLambdaSyntax(Node : sig type 'a t end) = struct - type term' = - | Lam of var * term - | App of term * term - | Var of var - | Int of num - and term = term' Node.t - and num = int Node.t - and var = string Node.t -end -module AntiquotableLambdaSyntax = MakeLambdaSyntax(Antiquotable);; -module LambdaSyntax = MakeLambdaSyntax(Identity_type_functor);; -module LambdaParser = struct - open Antiquotable;; - open AntiquotableLambdaSyntax;; - open Camlp4.PreCast;; - - module LambdaGram = MakeGram(Lexer);; - - let term = LambdaGram.Entry.mk "term";; - let term_eoi = LambdaGram.Entry.mk "lambda term quotation";; - - Camlp4_config.antiquotations := true;; - - let mkLam _loc v t = Val(_loc, Lam(v, t));; - let mkApp _loc f x = Val(_loc, App(f, x));; - let mkVar _loc x = Val(_loc, Var(x));; - let mkInt _loc v = Val(_loc, Int(v));; - - EXTEND LambdaGram - GLOBAL: term term_eoi; - term: - [ "top" - [ "fun"; v = var; "->"; t = term -> mkLam _loc v t ] - | "app" - [ t1 = SELF; t2 = SELF -> mkApp _loc t1 t2 ] - | "simple" - [ `ANTIQUOT((""|"term"), a) -> Ant(_loc, a) - | i = int -> mkInt _loc i - | v = var -> mkVar _loc v - | "("; t = term; ")" -> t ] - ]; - var: - [[ v = LIDENT -> Val(_loc, v) - | `ANTIQUOT((""|"var"), a) -> Ant(_loc, a) - ]]; - int: - [[ `INT(i, _) -> Val(_loc, i) - | `ANTIQUOT((""|"int"), a) -> Ant(_loc, a) - ]]; - term_eoi: - [[ t = term; `EOI -> t ]]; - END;; - - let parse_string = LambdaGram.parse_string term_eoi -end -module LambdaLifter = struct - open Antiquotable;; - open AntiquotableLambdaSyntax;; - module CamlSyntax = - Camlp4OCamlParser.Make( - Camlp4OCamlRevisedParser.Make( - Camlp4.PreCast.Syntax - ) - );; - module Ast = Camlp4.PreCast.Ast - let expr_of_string = CamlSyntax.Gram.parse_string CamlSyntax.expr_eoi;; - let patt_of_string = CamlSyntax.Gram.parse_string CamlSyntax.patt_eoi;; - - (* - << fun x -> $3$ >> -> Lam(VAtom"x", 3) - - (* compilo.ml -pp lam.cmo *) - match t with - | << (fun $x$ -> $e1$) $e2$ >> -> << $subst ...$ >> - *) - - (* This part can be generated use SwitchValRepr *) - let rec term_to_expr = function - | Val(_loc, Lam(v, t)) -> <:expr< Lam($var_to_expr v$, $term_to_expr t$) >> - | Val(_loc, App(t1, t2)) -> <:expr< App($term_to_expr t1$, $term_to_expr t2$) >> - | Val(_loc, Var(v)) -> <:expr< Var($var_to_expr v$) >> - | Val(_loc, Int(i)) -> <:expr< Int($int_to_expr i$) >> - | Ant(_loc, a) -> expr_of_string _loc a - and var_to_expr = function - | Val(_loc, v) -> <:expr< $str:v$ >> - | Ant(_loc, s) -> expr_of_string _loc s - and int_to_expr = function - | Val(_loc, v) -> <:expr< $`int:v$ >> - | Ant(_loc, s) -> expr_of_string _loc s - ;; - - let rec term_to_patt = function - | Val(_loc, Lam(v, t)) -> <:patt< Lam($var_to_patt v$, $term_to_patt t$) >> - | Val(_loc, App(t1, t2)) -> <:patt< App($term_to_patt t1$, $term_to_patt t2$) >> - | Val(_loc, Var(v)) -> <:patt< Var($var_to_patt v$) >> - | Val(_loc, Int(i)) -> <:patt< Int($int_to_patt i$) >> - | Ant(_loc, a) -> patt_of_string _loc a - and var_to_patt = function - | Val(_loc, v) -> <:patt< $str:v$ >> - | Ant(_loc, s) -> patt_of_string _loc s - and int_to_patt = function - | Val(_loc, v) -> <:patt< $`int:v$ >> - | Ant(_loc, s) -> patt_of_string _loc s - ;; - - (* -Arrow(Var"a", Var"b") -<:typ< 'a -> 'b >> - - let a = ... - let b = ... - let ( ^-> ) t1 t2 = Arrow(t1, t2) - a ^-> b - *) -end -module LambadExpander = struct - module Q = Camlp4.PreCast.Syntax.Quotation;; - let expand_lambda_quot_expr loc _loc_name_opt quotation_contents = - LambdaLifter.term_to_expr - (LambdaParser.parse_string loc quotation_contents) - ;; - Q.add "lam" Q.DynAst.expr_tag expand_lambda_quot_expr;; - let expand_lambda_quot_patt loc _loc_name_opt quotation_contents = - LambdaLifter.term_to_patt - (LambdaParser.parse_string loc quotation_contents) - ;; - Q.add "lam" Q.DynAst.patt_tag expand_lambda_quot_patt;; - - Q.default := "lam";; -end diff --git a/camlp4/examples/fancy_lambda_quot_test.ml b/camlp4/examples/fancy_lambda_quot_test.ml deleted file mode 100644 index 9f74deea..00000000 --- a/camlp4/examples/fancy_lambda_quot_test.ml +++ /dev/null @@ -1,36 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2008 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Fancy_lambda_quot.LambdaSyntax;; -let _loc = Camlp4.PreCast.Loc.ghost;; -let rec propagate = function - | << $f$ $x$ $y$ >> -> - begin match propagate f, propagate x, propagate y with - | f, << $int:i$ >>, << $int:j$ >> -> - begin match f with - | << plus >> -> << $int:i + j$ >> - | << minus >> -> << $int:i - j$ >> - | << times >> -> << $int:i * j$ >> - | << div >> -> << $int:i / j$ >> - | _ -> << $f$ $int:i$ $int:j$ >> - end - | f, x, y -> << $f$ $x$ $y$ >> - end - | << $f$ $x$ >> -> << $propagate f$ $propagate x$ >> - | << fun $x$ -> $e$ >> -> << fun $x$ -> $propagate e$ >> (* here x should not be a primitive like plus *) - | << $var:_$ >> | << $int:_$ >> as e -> e -;; - -let ex1 = propagate << f (fun x -> g (plus 3 (times 4 42)) (minus 1 (x 3))) >> -;; diff --git a/camlp4/examples/free_vars_test.ml b/camlp4/examples/free_vars_test.ml deleted file mode 100644 index 84d608b4..00000000 --- a/camlp4/examples/free_vars_test.ml +++ /dev/null @@ -1,86 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Format; -open Camlp4.PreCast; - -module FV = Camlp4.Struct.FreeVars.Make Ast; - -#default_quotation "expr"; - -value print_set f s = do { - fprintf f "@[<2>{ "; - FV.S.iter (fprintf f "%s@ ") s; - fprintf f "}@]"; -}; - -module PP = Camlp4.Printers.OCamlr.Make Syntax; -value print_expr = (new PP.printer ())#expr; - -value print_status f st = pp_print_string f (if st then "PASS" else "FAIL"); - -value _loc = Loc.ghost; - -value atoms e = - let o = object - inherit Ast.fold as super; - value accu = FV.S.empty; - method accu = accu; - method expr = - fun - [ << $lid:s$ >> -> {< accu = FV.S.add s accu >} - | e -> super#expr e ]; - end in (o#expr e)#accu; - -value fv e ref = - let s = FV.free_vars FV.S.empty e in - let ref = atoms ref in - let st = FV.S.equal s ref in do { - printf "%a: @[fv << %a >> = %a" - print_status st - print_expr e print_set s; - if st then () else printf "@ ref = %a@ diff = %a" - print_set ref print_set (FV.S.diff ref s); - printf "@]@ "; -}; - -printf "@["; - -fv << x >> << x >>; -fv << x y >> << x y >>; -fv << fun x -> x y >> << y >>; -fv << fun y -> fun x -> x y >> <<>>; -fv << let x = 42 and y = 44 in x y z >> << z >>; -fv << let z = g in let x = 42 and y = 44 in x y z >> << g >>; -fv << let rec f x = g (x + 1) and g y = f (y - 1) in fun x -> g x * f x >> << (+) (-) ( * ) >>; -fv << let rec f x = g (x + 1) and g y = f (g (y - 1)) in fun x -> g x * f x >> << (+) (-) ( * ) >>; - -fv << let i = 42 in let module M = struct value f x = y x; end in M.h >> << y >>; - -fv << fun [ A x -> x y ] >> << y >>; - -fv << fun [ A x -> x y | _ -> x ] >> << x y >>; - -fv << fun [ { x = A z; y = y } as q -> x z y a q ] >> << x a >>; - -fv << let module M = struct value a = 42; value b = a + 1; end in () >> <<(+)>>; - -fv << let module M = struct value rec a = 42; value b = a + 1; end in () >> <<(+)>>; - -fv << let rec f x = x and g = x in y >> << x y >>; -fv << let f x = x in x >> << x >>; -fv << let f x = x and g x = x in x >> << x >>; -fv << let (x, y) = (42, 44) in x y z >> << z >>; - -printf "@]@."; diff --git a/camlp4/examples/gen_match_case.ml b/camlp4/examples/gen_match_case.ml deleted file mode 100644 index cd402d4c..00000000 --- a/camlp4/examples/gen_match_case.ml +++ /dev/null @@ -1,26 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast;; - -let gen patts exprs = - let cases = - List.fold_right2 begin fun patt expr acc -> - let _loc = Loc.merge (Ast.loc_of_patt patt) (Ast.loc_of_expr expr) in - <:match_case< $patt$ -> $expr$ | $acc$ >> - end patts exprs <:match_case@here<>> - in - let _loc = Ast.loc_of_match_case cases in - <:expr< function $cases$ >> -;; diff --git a/camlp4/examples/gen_type_N.ml b/camlp4/examples/gen_type_N.ml deleted file mode 100644 index 361f7473..00000000 --- a/camlp4/examples/gen_type_N.ml +++ /dev/null @@ -1,47 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast;; - -let data_constructor_arguments _loc n t = - let rec self n = - if n <= 0 then <:ctyp<>> else <:ctyp< $t$ and $self (n-1)$ >> - in self n -;; - -let data_constructor _loc n t = - <:ctyp< $uid:"C"^string_of_int n$ of $data_constructor_arguments _loc n t$ >> -;; - -let gen_type _loc n t = - let rec self n = - if n <= 0 then <:ctyp<>> - else <:ctyp< $self (n-1)$ | $data_constructor _loc n t$ >> - in <:ctyp< [ $self n$ ] >> -;; - -let filter = - function - | <:ctyp@_loc< gen_type $lid:x$ >> | <:ctyp@_loc< $lid:x$ gen_type >> -> - Scanf.sscanf x "%[^0-9]%d" begin fun _ n -> - gen_type _loc n <:ctyp< $lid:x$ >> - end - | t -> t -;; - -AstFilters.register_str_item_filter (Ast.map_ctyp filter)#str_item;; - -IFDEF TEST THEN - type t7 = gen_type t7;; -ENDIF;; diff --git a/camlp4/examples/gettext_test.ml b/camlp4/examples/gettext_test.ml deleted file mode 100644 index 11d1f146..00000000 --- a/camlp4/examples/gettext_test.ml +++ /dev/null @@ -1,15 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2008 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -f "test", f "foo", "bar" diff --git a/camlp4/examples/global_handler.ml b/camlp4/examples/global_handler.ml deleted file mode 100644 index 08957fb8..00000000 --- a/camlp4/examples/global_handler.ml +++ /dev/null @@ -1,33 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast; - -value ghost = Loc.ghost; - -value global_handler_ref = ref <:expr@ghost<>>; - -value find_global_handler = - Ast.map_str_item begin - fun - [ <:str_item@_loc< value global_handler = $f$ >> -> - (global_handler_ref.val := f; <:str_item<>>) - | st -> st ] - end; - -AstFilters.register_str_item_filter begin fun st -> - let _ = find_global_handler#str_item st in - <:str_item@ghost< try let module Main = struct $st$ end in () - with e -> $global_handler_ref.val$ e >> -end; diff --git a/camlp4/examples/global_handler_test.ml b/camlp4/examples/global_handler_test.ml deleted file mode 100644 index 9c3e98ca..00000000 --- a/camlp4/examples/global_handler_test.ml +++ /dev/null @@ -1,26 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Format;; -let f1 x = printf "f1 %d@." x;; -let f2 x = printf "f2 %f@." x;; -let f3 x = printf "f3 %s@." x;; -f1 1;; -f2 1.1;; -f3 "1.1.1";; -raise (Failure "test");; -let global_handler e = - (* Note that I need to give the complete name for eprintf since - Format is not opened in the new environment of global_handler. *) - Format.eprintf "global_handler: %s@." (Printexc.to_string e) diff --git a/camlp4/examples/lambda_parser.ml b/camlp4/examples/lambda_parser.ml deleted file mode 100644 index 82ab3b8b..00000000 --- a/camlp4/examples/lambda_parser.ml +++ /dev/null @@ -1,48 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2008 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Please keep me in sync with brion.inria.fr/gallium/index.php/Lambda_calculus_quotations *) - -type term = - | Lam of var * term - | App of term * term - | Int of int - | Var of var -and var = string - -module LambdaGram = Camlp4.PreCast.MakeGram(Camlp4.PreCast.Lexer);; -module Loc = Camlp4.PreCast.Loc;; (* should not be necessary when camlp4 will be fixed *) -open Camlp4.Sig;; (* from tokens *) -let term = LambdaGram.Entry.mk "term";; -let term_eoi = LambdaGram.Entry.mk "lambda term quotation";; - -EXTEND LambdaGram - GLOBAL: term term_eoi; - term: - [ "top" - [ "fun"; v = var; "->"; t = term -> Lam(v, t) ] - | "app" - [ t1 = SELF; t2 = SELF -> App(t1, t2) ] - | "simple" - [ v = var -> Var(v) - | `INT(i, _) -> Int(i) - | "("; t = term; ")" -> t ] - ]; - var: - [[ `LIDENT v -> v ]]; - term_eoi: - [[ t = term; `EOI -> t ]]; -END;; - -let lambda_parser = LambdaGram.parse_string term_eoi;; diff --git a/camlp4/examples/lambda_quot.ml b/camlp4/examples/lambda_quot.ml deleted file mode 100644 index cf6485ab..00000000 --- a/camlp4/examples/lambda_quot.ml +++ /dev/null @@ -1,52 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast; -module CamlSyntax = Camlp4OCamlParser.Make (Camlp4OCamlRevisedParser.Make Syntax); - -value expr_of_string = CamlSyntax.Gram.parse_string CamlSyntax.expr_eoi; - -module LambdaGram = MakeGram Lexer; - -value term = LambdaGram.Entry.mk "term"; -value term_eoi = LambdaGram.Entry.mk "lambda term quotation"; - -Camlp4_config.antiquotations.val := True; - -EXTEND LambdaGram - GLOBAL: term term_eoi; - term: - [ "top" - [ "fun"; v = var; "->"; t = term -> <:expr< `Lam $v$ $t$ >> ] - | "app" - [ t1 = SELF; t2 = SELF -> <:expr< `App $t1$ $t2$ >> ] - | "simple" - [ `ANTIQUOT (""|"term") a -> expr_of_string _loc a - | v = var -> <:expr< `Var $v$ >> - | "("; t = term; ")" -> t ] - ]; - var: - [[ v = LIDENT -> <:expr< $str:v$ >> - | `ANTIQUOT (""|"var") a -> expr_of_string _loc a - ]]; - term_eoi: - [[ t = term; `EOI -> t ]]; -END; - -value expand_lambda_quot_expr loc _loc_name_opt quotation_contents = - LambdaGram.parse_string term_eoi loc quotation_contents; - -Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.expr_tag expand_lambda_quot_expr; - -Syntax.Quotation.default.val := "lam"; diff --git a/camlp4/examples/lambda_quot_expr.ml b/camlp4/examples/lambda_quot_expr.ml deleted file mode 100644 index d3eb22fe..00000000 --- a/camlp4/examples/lambda_quot_expr.ml +++ /dev/null @@ -1,55 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Please keep me in sync with brion.inria.fr/gallium/index.php/Lambda_calculus_quotations *) - -open Camlp4.PreCast;; -module CamlSyntax = Camlp4OCamlParser.Make(Camlp4OCamlRevisedParser.Make(Syntax));; - -let expr_of_string = CamlSyntax.Gram.parse_string CamlSyntax.expr_eoi;; - -module LambdaGram = MakeGram(Lexer);; - -let term = LambdaGram.Entry.mk "term";; -let term_eoi = LambdaGram.Entry.mk "lambda term quotation";; - -Camlp4_config.antiquotations := true;; - -EXTEND LambdaGram - GLOBAL: term term_eoi; - term: - [ "top" - [ "fun"; v = var; "->"; t = term -> <:expr< `Lam($v$, $t$) >> ] - | "app" - [ t1 = SELF; t2 = SELF -> <:expr< `App($t1$, $t2$) >> ] - | "simple" - [ `ANTIQUOT((""|"term"), a) -> expr_of_string _loc a - | v = var -> <:expr< `Var($v$) >> - | "("; t = term; ")" -> t ] - ]; - var: - [[ v = LIDENT -> <:expr< $str:v$ >> - | `ANTIQUOT((""|"var"), a) -> expr_of_string _loc a - ]]; - term_eoi: - [[ t = term; `EOI -> t ]]; -END;; - -let expand_lambda_quot_expr loc _loc_name_opt quotation_contents = - LambdaGram.parse_string term_eoi loc quotation_contents;; - -(* to have this syntax <:lam< fun k -> k >> *) -Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.expr_tag expand_lambda_quot_expr;; - -Syntax.Quotation.default := "lam";; diff --git a/camlp4/examples/lambda_quot_patt.ml b/camlp4/examples/lambda_quot_patt.ml deleted file mode 100644 index 044007b5..00000000 --- a/camlp4/examples/lambda_quot_patt.ml +++ /dev/null @@ -1,55 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2008 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Please keep me in sync with brion.inria.fr/gallium/index.php/Lambda_calculus_quotations *) - -open Camlp4.PreCast;; -module CamlSyntax = Camlp4OCamlParser.Make(Camlp4OCamlRevisedParser.Make(Syntax));; - -let patt_of_string = CamlSyntax.Gram.parse_string CamlSyntax.patt_eoi;; - -module LambdaGram = MakeGram(Lexer);; - -let term = LambdaGram.Entry.mk "term";; -let term_eoi = LambdaGram.Entry.mk "lambda term quotation";; - -Camlp4_config.antiquotations := true;; - -EXTEND LambdaGram - GLOBAL: term term_eoi; - term: - [ "top" - [ "fun"; v = var; "->"; t = term -> <:patt< `Lam($v$, $t$) >> ] - | "app" - [ t1 = SELF; t2 = SELF -> <:patt< `App($t1$, $t2$) >> ] - | "simple" - [ `ANTIQUOT((""|"term"), a) -> patt_of_string _loc a - | v = var -> <:patt< `Var($v$) >> - | "("; t = term; ")" -> t ] - ]; - var: - [[ v = LIDENT -> <:patt< $str:v$ >> - | `ANTIQUOT((""|"var"), a) -> patt_of_string _loc a - ]]; - term_eoi: - [[ t = term; `EOI -> t ]]; -END;; - -let expand_lambda_quot_patt loc _loc_name_opt quotation_contents = - LambdaGram.parse_string term_eoi loc quotation_contents;; - -(* function <:lam< fun x -> $(t|u)$ >> -> ... *) -Syntax.Quotation.add "lam" Syntax.Quotation.DynAst.patt_tag expand_lambda_quot_patt;; - -Syntax.Quotation.default := "lam";; diff --git a/camlp4/examples/lambda_test.ml b/camlp4/examples/lambda_test.ml deleted file mode 100644 index f56451fc..00000000 --- a/camlp4/examples/lambda_test.ml +++ /dev/null @@ -1,26 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -let id = << fun x -> x >> -(* Imported and traduced from CCT *) -let zero = << fun s -> fun z -> z >> -let succ = << fun n -> fun s -> fun z -> s n >> -let one = << $succ$ $zero$ >> -let iota = << fun x -> z >> -let rho = << fun m -> fun r -> (s m (m r $iota$ r)) >> -let rec_nat = - << fun n -> fun s -> fun z -> n $rho$ $iota$ $rho$ >> -let plus = << fun n -> fun m -> $rec_nat$ n (fun n -> fun p -> $succ$ p) m >> -let times = << fun n -> fun m -> $rec_nat$ n (fun n -> fun p -> $plus$ m p) $zero$ >> -let fact = << fun n -> $rec_nat$ n (fun n -> fun p -> $times$ ($succ$ n) p) $one$ >> diff --git a/camlp4/examples/macros.ml b/camlp4/examples/macros.ml deleted file mode 100644 index 3ad5687f..00000000 --- a/camlp4/examples/macros.ml +++ /dev/null @@ -1,81 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast;; -let foldr_funs = ref [];; -let foldl_funs = ref [];; -AstFilters.register_str_item_filter begin - Ast.map_expr begin function - | <:expr@loc< def_foldr $lid:name$ $e$ >> -> - foldr_funs := (name, e) :: !foldr_funs; <:expr@loc<()>> - | <:expr@loc< def_foldl $lid:name$ $e$ >> -> - foldl_funs := (name, e) :: !foldl_funs; <:expr@loc<()>> - | e -> e - end -end#str_item;; -AstFilters.register_str_item_filter begin - Ast.map_expr begin function - | <:expr@loc< $lid:name$($tup:e$) >> when List.mem_assoc name !foldl_funs -> - let op = List.assoc name !foldl_funs in - let rec foldl = - function - | [] -> assert false - | [x] -> x - | x :: xs -> <:expr@loc< $op$ $foldl xs$ $x$ >> - in foldl (List.rev (Ast.list_of_expr e [])) - | <:expr@loc< $lid:name$($tup:e$) >> when List.mem_assoc name !foldr_funs -> - let op = List.assoc name !foldr_funs in - let rec foldr = - function - | [] -> assert false - | [x] -> x - | x :: xs -> <:expr@loc< $op$ $x$ $foldr xs$ >> - in foldr (Ast.list_of_expr e []) - | e -> e - end -end#str_item;; -(* - -AstFilters.register_str_item_filter begin - Ast.map_expr begin function - | <:expr@loc< foldl($lid:op$, $e$) >> -> - let rec foldl = - function - | [] -> assert false - | [x] -> x - | x :: xs -> <:expr@loc< $lid:op$ $foldl xs$ $x$ >> - in foldl (List.rev (Ast.list_of_expr e [])) - | <:expr@loc< foldr($lid:op$, $e$) >> -> - let rec foldr = - function - | [] -> assert false - | [x] -> x - | x :: xs -> <:expr@loc< $lid:op$ $x$ $foldr xs$ >> - in foldr (Ast.list_of_expr e []) - | e -> e - end -end#str_item;; - -AstFilters.register_str_item_filter begin - Ast.map_expr begin function - | <:expr@loc< \!+ ($tup:e$) >> -> - begin match Ast.list_of_expr e [] with - | [] | [_] -> assert false - | x :: xs -> List.fold_left (fun acc x -> <:expr@loc< $acc$ + $x$ >>) x xs - end - | <:expr< \!+ $e$ >> -> e - | e -> e - end -end#str_item;; -*) diff --git a/camlp4/examples/parse_files.ml b/camlp4/examples/parse_files.ml deleted file mode 100644 index 46cf8420..00000000 --- a/camlp4/examples/parse_files.ml +++ /dev/null @@ -1,43 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast;; - -module Caml = - Camlp4.Printers.OCaml.Make - (Camlp4OCamlParser.Make - (Camlp4OCamlRevisedParser.Make - (Camlp4.OCamlInitSyntax.Make(Ast)(Gram)(Quotation))));; - -let parse f = - let ic = open_in f in - let strm = Stream.of_channel ic in - let res = Caml.parse_implem (Loc.mk f) strm in - close_in ic; res;; - -let ghost = Loc.ghost;; - -let main () = - let a = parse "apply_operator_test.ml" in - let b = parse "global_handler_test.ml" in - Caml.print_implem - <:str_item@ghost< - module Apply_operator_test = struct $a$ end;; - module Global_handler_test = struct $b$ end >> -;; - -try main () -with e -> - Format.eprintf "error: %a@." Camlp4.ErrorHandler.print e; - exit 1;; diff --git a/camlp4/examples/syb_fold.ml b/camlp4/examples/syb_fold.ml deleted file mode 100644 index f5abc698..00000000 --- a/camlp4/examples/syb_fold.ml +++ /dev/null @@ -1,104 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -type variable = string - and term = - | Var of variable - | Lam of variable * term - | App of term * term - | Const of constant - and constant = - | CInt of int - | CString of string -;; - -class fold = Camlp4Filters.GenerateFold.generated;; -(* class fold = Camlp4FoldGenerator.generated;; *) - -module VarSet = Set.Make(String);; - -(* Compute free variables with the fold class *) -let free_variables_v1 = - let o = - object (self) - inherit fold as super - val fv = VarSet.empty - method fv = fv - method empty_fv = {< fv = VarSet.empty >} - method term t = - match t with - | Var(v) -> {< fv = VarSet.add v fv >} - | Lam(v, t) -> - let fv1 = VarSet.remove v (self#empty_fv#term t)#fv in - {< fv = VarSet.union fv fv1 >} - | _ -> super#term t - end - in fun t -> VarSet.elements (o#term t)#fv -;; - -(* Let's try to abstract that a little *) - -let fold_term f t init = - let o = - object (self) - inherit fold as super - val acc = init - method get = acc - method reset = {< acc = init >} - method term t = - {< acc = f t acc (fun t -> (self#reset#term t)#get) - (fun t -> (super#term t)#get) >} - end - in - (o#term t)#get -;; - -(* A nicer version of free_variables *) -let free_variables_v2 t = - VarSet.elements begin - fold_term begin fun t fv self next -> - match t with - | Var(v) -> VarSet.add v fv - | Lam(v, t) -> VarSet.union fv (VarSet.remove v (self t)) - | _ -> next t - end t VarSet.empty - end -;; - -let term1 = - App( - App(Var"x1", - Lam("x", - App(Var"x", App(Var"y", (Lam("y", Lam("z", (App(Var"y", App(Var"x4",Var"z")))))))))), - Var"x3") - -;; - -let fv1 = free_variables_v1 term1;; -let fv2 = free_variables_v2 term1;; - -(* Low cost syntax *) -let ( ^-> ) v t = Lam(v, t) -let ( @ ) t1 t2 = App(t1, t2) -let ( ! ) s = Var s - -let term2 = - !"x1" @ - ("x" ^-> !"x" @ !"y" @ ("y" ^-> ("z" ^-> !"y" @ !"x4" @ !"z"))) @ - !"x3" - -;; - -let fv1' = free_variables_v1 term2;; -let fv2' = free_variables_v2 term2;; diff --git a/camlp4/examples/syb_map.ml b/camlp4/examples/syb_map.ml deleted file mode 100644 index 91856305..00000000 --- a/camlp4/examples/syb_map.ml +++ /dev/null @@ -1,65 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -type variable = string - and term = - | Var of variable - | Lam of variable * term - | App of term * term - | Const of constant - and constant = - | CInt of int - | CString of string - and program = - | Def of string * term - | Seq of program list -;; - -class map = Camlp4Filters.GenerateMap.generated;; -(* class map = Camlp4MapGenerator.generated;; *) - -let map_term f = object - inherit map as super - method term t = f (super#term t) -end;; - -let map_term' f = object (self) - inherit map as super - method term t = f t self#term super#term -end;; - -(* Suppress calls to the identity function... *) -let suppress_id = - map_term begin function - | App(Lam(v, Var(v')), t) when v = v' -> t - | x -> x - end;; - -(* Substitute blindly all occurences of v by t *) -let raw_subst v t = - map_term' begin fun t' _ next -> - match t' with - | Var(v') when v = v' -> t - | x -> next x - end;; - -let id = Lam("x", Var"x");; -let _42 = Const(CInt 42);; -let prog = - Seq[Def("foo", App(id, _42)); Def("bar", App(id, id))];; - -let prog2 = suppress_id#program prog;; -let term3 = suppress_id#term (App(id, _42));; - -let term4 = (raw_subst "x" _42)#term (App(Var"succ", Var"x"));; diff --git a/camlp4/examples/test.itarget b/camlp4/examples/test.itarget deleted file mode 100644 index 66c33d8f..00000000 --- a/camlp4/examples/test.itarget +++ /dev/null @@ -1,8 +0,0 @@ -test_macros.cmo -lambda_test.cmo -free_vars_test.byte -free_vars_test.native -global_handler_test.cmo -apply_operator_test.cmo -test_type_quotation.cmo -expression_closure_test.cmo diff --git a/camlp4/examples/test_macros.ml b/camlp4/examples/test_macros.ml deleted file mode 100644 index 955a7c21..00000000 --- a/camlp4/examples/test_macros.ml +++ /dev/null @@ -1,29 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* DEFINE F(x, y, z) = x + y * z;; *) -(* F(F(1, 2, 3), 4, 5);; *) - -(* !+ (1, 2, 3, 4);; *) - -(* foldl(( + ), 1, 2, 3, 4);; *) -(* foldr(cons, 1, 2, 3, []);; *) - -let cons x xs = x :: xs;; - -def_foldl ( !+ ) ( + );; -def_foldr ( !:: ) cons;; - -!+ (1, 2, 3, 4);; -!:: (1, 2, 3, []);; diff --git a/camlp4/examples/test_type_quotation.ml b/camlp4/examples/test_type_quotation.ml deleted file mode 100644 index 088924c8..00000000 --- a/camlp4/examples/test_type_quotation.ml +++ /dev/null @@ -1,17 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -type t1 = <:power< 6 | int >> -type t2 = <:power< 3 | int -> int >> -> int -type t3 = <:power< 3 | int -> <:power< 2 | int >> >> -> int diff --git a/camlp4/examples/type_quotation.ml b/camlp4/examples/type_quotation.ml deleted file mode 100644 index 5c569a94..00000000 --- a/camlp4/examples/type_quotation.ml +++ /dev/null @@ -1,32 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -open Camlp4.PreCast; - -value rec mk_tuple _loc t n = - if n <= 1 then t else <:ctyp< $t$ * $mk_tuple _loc t (n - 1)$ >>; - -value ctyp_eoi = Gram.Entry.mk "ctyp eoi"; - -EXTEND Gram - ctyp_eoi: [[ t = Syntax.ctyp; `EOI -> t ]]; -END; - -value exp _loc _ s = - Scanf.sscanf s " %d | %[^!]" begin fun n s -> - let t = Syntax.Gram.parse_string ctyp_eoi _loc(* not accurate *) s in - <:ctyp< $tup:mk_tuple _loc t n$ >> - end; - -Quotation.add "power" Quotation.DynAst.ctyp_tag exp; diff --git a/camlp4/man/.ignore b/camlp4/man/.ignore deleted file mode 100644 index 2dc933cb..00000000 --- a/camlp4/man/.ignore +++ /dev/null @@ -1,2 +0,0 @@ -camlp4.1 -camlp4.help diff --git a/camlp4/man/Makefile b/camlp4/man/Makefile deleted file mode 100644 index 64b3f970..00000000 --- a/camlp4/man/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -######################################################################### -# # -# OCaml # -# # -# Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt # -# # -# Copyright 2001 Institut National de Recherche en Informatique et # -# en Automatique. All rights reserved. This file is distributed # -# under the terms of the GNU Library General Public License, with # -# the special exception on linking described in file ../LICENSE. # -# # -######################################################################### - -include ../config/Makefile.cnf - -TARGET=camlp4.1 -ALIASES=camlp4o.1 camlp4r.1 mkcamlp4.1 ocpp.1 camlp4o.opt.1 camlp4r.opt.1 - -include ../config/Makefile.base - -install-local: - if test -n '$(MANDIR)'; then \ - $(MKDIR) $(MANDIR)/man1 ; \ - cp $(TARGET) $(MANDIR)/man1/. ; \ - for i in $(ALIASES); do \ - rm -f $(MANDIR)/man1/$$i; \ - echo '.so man1/$(TARGET)' > $(MANDIR)/man1/$$i; \ - done; \ - fi - -camlp4.1: camlp4.1.tpl - sed -e "s'LIBDIR'$(LIBDIR)'g" camlp4.1.tpl > camlp4.1 diff --git a/camlp4/man/camlp4.1.tpl b/camlp4/man/camlp4.1.tpl deleted file mode 100644 index 2a764345..00000000 --- a/camlp4/man/camlp4.1.tpl +++ /dev/null @@ -1,292 +0,0 @@ -.\"*********************************************************************** -.\"* * -.\"* OCaml * -.\"* * -.\"* Daniel de Rauglaudre, projet Cristal, INRIA Rocquencourt * -.\"* * -.\"* Copyright 2001 Institut National de Recherche en Informatique et * -.\"* en Automatique. All rights reserved. This file is distributed * -.\"* under the terms of the GNU Library General Public License, with * -.\"* the special exception on linking described in file ../LICENSE. * -.\"* * -.\"*********************************************************************** -.\" -.TH CAMLP4 1 "" "INRIA" -.SH NAME -camlp4 - Pre-Precessor-Pretty-Printer for OCaml -.br -mkcamlp4 - Create custom camlp4 -.br -ocpp - Universal preprocessor - -.SH SYNOPSIS -.B camlp4 -[ -load-options -] [--] [ -other-options -] -.br -.B camlp4o -[ -load-options -] [--] [ -other-options -] -.br -.B camlp4r -[ -load-options -] [--] [ -other-options -] -.br -.B camlp4o.cma -.br -.B camlp4r.cma -.br -.B mkcamlp4 -.br -.B ocpp -[ -load-options -] -file -.LP -.br -.B camlp4o.opt -[--] [ -other-options -] -.br -.B camlp4r.opt -[--] [ -other-options -] - -.SH DESCRIPTION -.B camlp4 -is a Pre-Processor-Pretty-Printer for OCaml, parsing a source -file and printing some result on standard output. -.LP -.B camlp4o -and -.B camlp4r -are versions of -.B camlp4 -with some files already loaded (see below). -.LP -.B camlp4o.cma -and -.B camlp4r.cma -are files to be loaded in ocaml toplevel to use the camlp4 machinery. -.LP -.B mkcamlp4 -creates camlp4 executables with almost the same options as ocamlmktop (see below). -.LP -.B ocpp -is an universal preprocessor, expanding quotations in any kind of text file. -.LP -.B camlp4o.opt -and -.B camlp4r.opt -are versions of camlp4o and camlp4r compiled by the native-code compiler -ocamlopt. They are faster but not extensible. And they are not available -in all installations of camlp4. - -.SH LOAD OPTIONS - -The load options select parsing and printing actions recorded in OCaml -object files (ending with .cmo or .cma). They must precede other -options. - -.LP -An optional -.B \-\- -may end the load options. - -.TP -.BI \-I\ directory -Add -.I directory -in the search path for files loaded. Unless the option \-nolib is used, -the camlp4 library directory is appended to the path. Note that there is -no automatic search in the current directory: add "\-I ." for this. -.TP -.B \-where -Print camlp4 library directory name and exit. -.TP -.B \-nolib -No automatic search for objects files in camlp4 library directory. -.TP -.I object-file -Load -.I object-file -in the camlp4 core. - -.SH OTHER OPTIONS - -.LP -The others options are: - -.TP -.I file -Treat -.I file -as an interface file if it ends with .mli and as an implementation file -if it ends with .ml. - -.TP -.BI \-intf\ file -Treat -.I file -as an interface file, whatever its extension is. -.TP -.BI \-impl\ file -Treat -.I file -as an implementation file, whatever its extension is. -.TP -.B \-unsafe -Generate unsafe accesses to arrays and strings. -.TP -.B \-noassert -Do not compile assertion checks. -.TP -.B \-verbose -More verbose in parsing errors. -.TP -.BI \-QD\ file -Dump in -.I file -in case of syntax error in the result of a quotation expansion. -.TP -.BI \-o\ out-file -Print the result in -.I out-file -instead of standard output. File is opened -with open_out_bin (see the documentation of the Pervasives OCaml library). -.TP -.B \-v -Print the version number and exit. -.TP -.B \-help -Print the available options and exit. The output includes the options -possibly added by the loaded object files. - -.LP -The others options can be extended by loaded object files. The provided -files add the following options: - -.TP -.BI \-l\ line-length -Added by pr_o.cmo and pr_r.cmo: set the line length (default 78). -.TP -.BI \-sep\ string -Added by pr_o.cmo and pr_r.cmo: print this string between phrases instead -of comments. -.TP -.BI \-no_ss -Added by pr_o.cmo: do not print double semicolons -.TP -.BI \-D\ ident -Added by pa_macro.cmo: define the ident. -.TP -.BI \-U\ ident -Added by pa_macro.cmo: undefine the ident. - -.SH "PROVIDED FILES" -These files are installed in LIBDIR/camlp4. - -.LP -Parsing files: -.nf -.ta 1c - pa_o.cmo: syntax of OCaml - pa_op.cmo: streams and parsers - pa_oop.cmo: streams and parsers (without code optimization) - pa_r.cmo: revised syntax - pa_rp.cmo: streams and parsers - pa_extend.cmo: syntax extension for grammars - pa_extfold.cmo: extension of pa_extend with FOLD0 and FOLD1 - pa_extfun.cmo: syntax extension for extensible functions - pa_fstream.cmo: syntax extension for functional streams - pa_macro.cmo: add macros (ifdef, define) like in C - pa_lefteval.cmo: left-to-right evaluation of parameters - pa_olabl.cmo: old syntax for labels -.fi -.LP -Printing files: -.nf -.ta 1c - pr_o.cmo: syntax of OCaml - pr_op.cmo: try to rebuild streams and parsers syntax - pr_r.cmo: revised syntax - pr_rp.cmo: try to rebuild streams and parsers syntax - pr_extend.cmo: try to rebuild EXTEND statements - pr_extfun.cmo: try to rebuild extfun statements - pr_dump.cmo: syntax tree - pr_depend.cmo: file dependencies - pr_null.cmo: no output -.fi -.LP -Quotation expanders: -.nf -.ta 1c - q_MLast.cmo: syntax tree nodes - q_phony.cmo: keeping quotations for pretty printing -.fi -.LP -The command -.B camlp4o -is a shortcut for: -.nf -.ta 1c - camlp4 pa_o.cmo pa_op.cmo pr_dump.cmo -.fi -.LP -The command -.B camlp4r -is a shortcut for: -.nf -.ta 1c - camlp4 pa_r.cmo pa_rp.cmo pr_dump.cmo -.fi -.LP -.LP -The file -.B camlp4o.cma -can be loaded in the toplevel to start camlp4 with OCaml syntax. -.LP -The file -.B camlp4r.cma -can be loaded in the toplevel to start camlp4 with revised syntax. - -.SH "MKCAMLP4" - -.B mkcamlp4 -creates camlp4 executables with almost the same options than ocamlmktop. -The only difference is that the interfaces to be visible must be explicitly -added in the command line as ".cmi" files. For example, how to add the -the OCaml module "str": - -.nf -.ta 1c 2c - mkcamlp4 -custom str.cmi str.cma -cclib -lstr \\ - -o camlp4str -.fi - -.SH "FILES" -Camlp4 library directory in the current installation: -.br -LIBDIR/camlp4 - -.SH "SEE ALSO" -Camlp4 - tutorial -.br -Camlp4 - reference manual -.br -ocamlc(1), ocaml(1). - -.SH AUTHOR -Daniel de Rauglaudre, INRIA Rocquencourt. diff --git a/camlp4/mkcamlp4.ml b/camlp4/mkcamlp4.ml deleted file mode 100644 index 180b17ef..00000000 --- a/camlp4/mkcamlp4.ml +++ /dev/null @@ -1,70 +0,0 @@ -(****************************************************************************) -(* *) -(* OCaml *) -(* *) -(* INRIA Rocquencourt *) -(* *) -(* Copyright 2006 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed under *) -(* the terms of the GNU Library General Public License, with the special *) -(* exception on linking described in LICENSE at the top of the OCaml *) -(* source tree. *) -(* *) -(****************************************************************************) - -(* Authors: - * - Daniel de Rauglaudre: initial shell version - * - Nicolas Pouillard: rewriting in OCaml - *) - - - -open Camlp4; -open Camlp4_config; -open Filename; -open Format; - -value (interfaces, options, includes) = - let rec self (interf, opts, incl) = - fun - [ [] -> (List.rev interf, List.rev opts, List.rev incl) - | ["-I"; dir :: args] -> self (interf, opts, [dir; "-I" :: incl]) args - | ["-version" :: _] -> - do { printf "mkcamlp4, version %s@." version; exit 0 } - | ["-vnum" :: _] -> - do { printf "%s@." version; exit 0 } - | [ arg :: args ] when check_suffix arg ".cmi" -> - let basename = String.capitalize (Filename.chop_suffix - (Filename.basename arg) ".cmi") in - self ([ basename :: interf ], opts, incl) args - | [ arg :: args ] -> - self (interf, [ arg :: opts ], incl) args ] - in self ([], [], ["."; "-I"]) (List.tl (Array.to_list Sys.argv)); - -value run l = - let cmd = String.concat " " l in - let () = Format.printf "%s@." cmd in - let st = - Sys.command cmd - (* 0 *) - in - if st <> 0 then failwith ("Exit: " ^ string_of_int st) else (); - -value crc_ml = Filename.temp_file "crc_" ".ml"; -value crc = Filename.chop_suffix crc_ml ".ml"; -value clean () = run ["rm"; "-f"; crc_ml; crc^".cmi"; crc^".cmo"]; - -try do { - run ([ocaml_standard_library^"/extract_crc"; "-I"; camlp4_standard_library] - @ includes @ interfaces @ [">"; crc_ml]); - - let cout = open_out_gen [Open_wronly; Open_append; Open_text] 0o666 crc_ml in do { - output_string cout "let _ = Dynlink.add_available_units crc_unit_list\n"; - close_out cout - }; - - run (["ocamlc"; "-I"; camlp4_standard_library; "dynlink.cma"; "camlp4lib.cma"; crc_ml] - @ includes @ options @ ["Camlp4Bin.cmo"; "-linkall"]); - clean(); -} -with exc -> do { clean (); raise exc }; diff --git a/config/.ignore b/config/.ignore index 9fc1c014..259ce3f6 100644 --- a/config/.ignore +++ b/config/.ignore @@ -1,4 +1,3 @@ m.h s.h Makefile -config.sh diff --git a/config/Makefile-templ b/config/Makefile-templ index 409cd01f..b9142c66 100644 --- a/config/Makefile-templ +++ b/config/Makefile-templ @@ -190,10 +190,9 @@ PARTIALLD=ld -r $(NATIVECCLINKOPTS) # systhreads Same as threads, requires POSIX threads # graph Portable drawing primitives for X11 # dynlink Dynamic linking of bytecode -# labltk Tcl/Tk interface # bigarray Large, multidimensional numerical arrays -OTHERLIBRARIES=unix str num threads graph dynlink labltk bigarray +OTHERLIBRARIES=unix str num threads graph dynlink bigarray ### Name of the target architecture for the "num" library # Known targets: @@ -215,28 +214,15 @@ BNG_ASM_LEVEL=1 #PTHREAD_LINK=-cclib -lpthread -cclib -lposix4 ### -I options for finding the X11/*.h includes -# Needed for the "graph" and "labltk" packages +# Needed for the "graph" package # Usually: #X11_INCLUDES=-I/usr/X11R6/include # For SunOS with OpenLook: #X11_INCLUDES=/usr/openwin/include ### Link-time options to ocamlc or ocamlopt for linking with X11 libraries -# Needed for the "graph" and "labltk" packages +# Needed for the "graph" package # Usually: #X11_LINK=-lX11 # For SunOS with OpenLook: #X11_LINK=-L$(X11_LIB) -lX11 - -### Preprocessor options for finding tcl.h and tk.h -# Needed for the "labltk" package -# Required only if not in the standard include path. -# For Tcl/Tk 8.0 on FreeBSD: -#TK_DEFS="-I/usr/local/include/tcl8.0 -I/usr/local/include/tk8.0" - -### Linker options for linking tcl and tk libraries -# Needed for the "labltk" package -# Usually (with appropriate version numbers): -#TK_LINK="-ltk8.0 -ltcl8.0" -# For Tcl/Tk 8.0 on FreeBSD: -#TK_LINK="-L/usr/local/lib -ltk8.0 -ltcl8.0" diff --git a/config/Makefile.mingw b/config/Makefile.mingw index 30b30b5a..d9e7607f 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -17,8 +17,14 @@ PREFIX=C:/ocamlmgw -### Remove this to disable compiling camlp4 -CAMLP4=camlp4 +### Remove this to disable compiling ocamldebug +WITH_DEBUGGER=ocamldebugger + +### Remove this to disable compiling ocamlbuild +WITH_OCAMLBUILD=ocamlbuild + +### Remove this to disable compiling ocamldoc +WITH_OCAMLDOC=ocamldoc ### Where to install the binaries BINDIR=$(PREFIX)/bin @@ -40,14 +46,16 @@ MANDIR=$(PREFIX)/man TOOLCHAIN=mingw ### Toolchain prefix -TOOLPREF=i686-w64-mingw32- +TARGET=i686-w64-mingw32 +HOST=i686-w64-mingw32 + +TOOLPREF=$(TARGET)- CCOMPTYPE=cc O=o A=a S=s SO=s.o -DO=d.o EXE=.exe EXT_DLL=.dll EXT_OBJ=.$(O) @@ -69,7 +77,6 @@ ASPP=$(TOOLPREF)gcc -c ASPPPROFFLAGS= PROFILING=noprof DYNLINKOPTS= -DEBUGGER=ocamldebugger CC_PROFILE= SYSTHREAD_SUPPORT=true EXTRALIBS= @@ -77,6 +84,8 @@ NATDYNLINK=true CMXS=cmxs RUNTIMED=noruntimed ASM_CFI_SUPPORTED=false +UNIXLIB=win32unix +GRAPHLIB=win32graph ########## Configuration for the bytecode compiler @@ -100,7 +109,7 @@ NATIVECCLIBS=-lws2_32 CPP=$(BYTECC) -E ### Flexlink -FLEXLINK=flexlink -chain mingw -stack 16777216 +FLEXLINK=flexlink -chain mingw -stack 16777216 -link -static-libgcc FLEXDIR=$(shell $(FLEXLINK) -where) IFLEXDIR=-I"$(FLEXDIR)" MKDLL=$(FLEXLINK) @@ -147,19 +156,12 @@ PACKLD=$(TOOLPREF)ld -r $(NATIVECCLINKOPTS) -o # must have a space after '-o' ############# Configuration for the contributed libraries -OTHERLIBRARIES=win32unix str num win32graph dynlink bigarray systhreads labltk +OTHERLIBRARIES=win32unix str num win32graph dynlink bigarray systhreads ### Name of the target architecture for the "num" library BNG_ARCH=ia32 BNG_ASM_LEVEL=1 -### Configuration for LablTk -# Set TK_ROOT to the directory where you installed TCL/TK 8.5 -# There must be no spaces or special characters in $(TK_ROOT) -TK_ROOT=c:/tcl -TK_DEFS=-I$(TK_ROOT)/include -TK_LINK=$(TK_ROOT)/bin/tk85.dll $(TK_ROOT)/bin/tcl85.dll -lws2_32 - ############# Aliases for common commands MAKEREC=$(MAKE) -f Makefile.nt diff --git a/config/Makefile.mingw64 b/config/Makefile.mingw64 index 956ff32a..44784b68 100644 --- a/config/Makefile.mingw64 +++ b/config/Makefile.mingw64 @@ -17,8 +17,14 @@ PREFIX=C:/ocamlmgw64 -### Remove this to disable compiling camlp4 -CAMLP4=camlp4 +### Remove this to disable compiling ocamldebug +WITH_DEBUGGER=ocamldebugger + +### Remove this to disable compiling ocamlbuild +WITH_OCAMLBUILD=ocamlbuild + +### Remove this to disable compiling ocamldoc +WITH_OCAMLDOC=ocamldoc ### Where to install the binaries BINDIR=$(PREFIX)/bin @@ -40,14 +46,16 @@ MANDIR=$(PREFIX)/man TOOLCHAIN=mingw ### Toolchain prefix -TOOLPREF=x86_64-w64-mingw32- +TARGET=x86_64-w64-mingw32 +HOST=$(TARGET) + +TOOLPREF=$(TARGET)- CCOMPTYPE=cc O=o A=a S=s SO=s.o -DO=d.o EXE=.exe EXT_DLL=.dll EXT_OBJ=.$(O) @@ -69,7 +77,6 @@ ASPP=$(TOOLPREF)gcc -c ASPPPROFFLAGS= PROFILING=noprof DYNLINKOPTS= -DEBUGGER=ocamldebugger CC_PROFILE= SYSTHREAD_SUPPORT=true EXTRALIBS= @@ -77,6 +84,8 @@ NATDYNLINK=true CMXS=cmxs RUNTIMED=noruntimed ASM_CFI_SUPPORTED=false +UNIXLIB=win32unix +GRAPHLIB=win32graph ########## Configuration for the bytecode compiler @@ -153,10 +162,6 @@ OTHERLIBRARIES=win32unix str num win32graph dynlink bigarray systhreads BNG_ARCH=amd64 BNG_ASM_LEVEL=1 -### Configuration for LablTk (not supported) -TK_DEFS= -TK_LINK= - ############# Aliases for common commands MAKEREC=$(MAKE) -f Makefile.nt diff --git a/config/Makefile.msvc b/config/Makefile.msvc index 80e8f2d1..3ab6c6eb 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -35,12 +35,19 @@ MANDIR=$(PREFIX)/man ########## Toolchain and OS dependencies TOOLCHAIN=msvc + +# It doesn't make much sense to set "TARGET" and "HOST" for msvc but it's needed +# for the myocamlbuild config. +# The only case these will be used currently is to check whether we're +# cross-compiling or not so setting them to the same value is what matters. +HOST=msvc +TARGET=$(HOST) + CCOMPTYPE=msvc O=obj A=lib S=asm SO=s.obj -DO=d.obj EXE=.exe EXT_DLL=.dll EXT_OBJ=.$(O) @@ -61,7 +68,6 @@ ASPP= ASPPPROFFLAGS= PROFILING=noprof DYNLINKOPTS= -DEBUGGER=ocamldebugger CC_PROFILE= SYSTHREAD_SUPPORT=true EXTRALIBS= @@ -69,6 +75,8 @@ CMXS=cmxs NATDYNLINK=true RUNTIMED=noruntimed ASM_CFI_SUPPORTED=false +UNIXLIB=win32unix +GRAPHLIB=win32graph ########## Configuration for the bytecode compiler @@ -138,34 +146,23 @@ NATIVECCLINKOPTS= ### Build partially-linked object file PACKLD=link /lib /nologo /out:# there must be no space after this '/out:' -############# Configuration for camlp4 +### Clear this to disable compiling ocamldebug +WITH_DEBUGGER=ocamldebugger -# This variable controls whether camlp4 will be built. -# If it is set to camlp4, then it will be built. -# If it is set to the empty string, then it will not be built. -CAMLP4=camlp4 +### Clear this to disable compiling ocamlbuild +WITH_OCAMLBUILD=ocamlbuild + +### Clear this to disable compiling ocamldoc +WITH_OCAMLDOC=ocamldoc ############# Configuration for the contributed libraries -OTHERLIBRARIES=win32unix systhreads str num win32graph dynlink bigarray labltk +OTHERLIBRARIES=win32unix systhreads str num win32graph dynlink bigarray ### Name of the target architecture for the "num" library BNG_ARCH=generic BNG_ASM_LEVEL=0 -### Configuration for LablTk -# Set TK_ROOT to the directory where you installed TCL/TK 8.5 -TK_ROOT=c:/tcl -TK_DEFS=-I$(TK_ROOT)/include -# The following definition avoids hard-wiring $(TK_ROOT) in the libraries -# produced by OCaml, and is therefore required for binary distribution -# of these libraries. However, $(TK_ROOT)/lib must be added to the LIB -# environment variable, as described in README.win32. -TK_LINK=tk85.lib tcl85.lib ws2_32.lib -# An alternative definition that avoids mucking with the LIB variable, -# but hard-wires the Tcl/Tk location in the binaries -# TK_LINK=$(TK_ROOT)/tk85.lib $(TK_ROOT)/tcl85.lib ws2_32.lib - ############# Aliases for common commands MAKEREC=$(MAKE) -f Makefile.nt diff --git a/config/Makefile.msvc64 b/config/Makefile.msvc64 index b85d9fed..8437cf4b 100644 --- a/config/Makefile.msvc64 +++ b/config/Makefile.msvc64 @@ -35,13 +35,19 @@ MANDIR=$(PREFIX)/man ########## Toolchain and OS dependencies TOOLCHAIN=msvc + +# It doesn't make much sense to set "TARGET" and "HOST" for msvc but it's needed +# for the myocamlbuild config. +# The only case these will be used currently is to check whether we're +# cross-compiling or not so setting them to the same value is what matters. +HOST=msvc64 +TARGET=$(HOST) + CCOMPTYPE=msvc O=obj A=lib S=asm SO=s.obj -DO=d.obj -DBGO=dbg.obj EXE=.exe EXT_DLL=.dll EXT_OBJ=.$(O) @@ -62,13 +68,14 @@ ASPP= ASPPPROFFLAGS= PROFILING=noprof DYNLINKOPTS= -DEBUGGER=ocamldebugger CC_PROFILE= SYSTHREAD_SUPPORT=true CMXS=cmxs NATDYNLINK=true RUNTIMED=noruntimed ASM_CFI_SUPPORTED=false +UNIXLIB=win32unix +GRAPHLIB=win32graph ########## Configuration for the bytecode compiler @@ -143,12 +150,14 @@ NATIVECCLINKOPTS= ### Build partially-linked object file PACKLD=link /lib /nologo /machine:AMD64 /out:# must have no space after '/out:' -############# Configuration for camlp4 +### Clear this to disable compiling ocamldebug +WITH_DEBUGGER=ocamldebugger -# This variable controls whether camlp4 will be built. -# If it is set to camlp4, then it will be built. -# If it is set to the empty string, then it will not be built. -CAMLP4=camlp4 +### Clear this to disable compiling ocamlbuild +WITH_OCAMLBUILD=ocamlbuild + +### Clear this to disable compiling ocamldoc +WITH_OCAMLDOC=ocamldoc ############# Configuration for the contributed libraries @@ -158,10 +167,6 @@ OTHERLIBRARIES=win32unix systhreads str num win32graph dynlink bigarray BNG_ARCH=generic BNG_ASM_LEVEL=0 -### Configuration for LablTk (not supported) -TK_DEFS= -TK_LINK= - ############# Aliases for common commands MAKEREC=$(MAKE) -f Makefile.nt diff --git a/config/auto-aux/int64align.c b/config/auto-aux/int64align.c index 9ae8a5bc..5795e484 100644 --- a/config/auto-aux/int64align.c +++ b/config/auto-aux/int64align.c @@ -16,9 +16,19 @@ #include #include "m.h" -ARCH_INT64_TYPE foo; +#if defined(ARCH_INT64_TYPE) +typedef ARCH_INT64_TYPE int64; +#elif SIZEOF_LONG == 8 +typedef long int64; +#elif SIZEOF_LONGLONG == 8 +typedef long long int64; +#else +#error "No 64-bit integer type available" +#endif + +int64 foo; -void access_int64(ARCH_INT64_TYPE *p) +void access_int64(int64 *p) { foo = *p; } @@ -39,8 +49,8 @@ int main(void) signal(SIGBUS, sig_handler); #endif if(setjmp(failure) == 0) { - access_int64((ARCH_INT64_TYPE *) n); - access_int64((ARCH_INT64_TYPE *) (n+1)); + access_int64((int64 *) n); + access_int64((int64 *) (n+1)); res = 0; } else { res = 1; diff --git a/config/auto-aux/sizes.c b/config/auto-aux/sizes.c index 2700729d..daa9615d 100644 --- a/config/auto-aux/sizes.c +++ b/config/auto-aux/sizes.c @@ -15,7 +15,8 @@ int main(int argc, char **argv) { - printf("%d %d %d %d\n", - sizeof(int), sizeof(long), sizeof(long *), sizeof(short)); + printf("%d %d %d %d %d\n", + sizeof(int), sizeof(long), sizeof(long *), sizeof(short), + sizeof(long long)); return 0; } diff --git a/config/auto-aux/tclversion.c b/config/auto-aux/tclversion.c deleted file mode 100644 index 4608ee9f..00000000 --- a/config/auto-aux/tclversion.c +++ /dev/null @@ -1,24 +0,0 @@ -/***********************************************************************/ -/* */ -/* MLTk, Tcl/Tk interface of OCaml */ -/* */ -/* Francois Rouaix, Francois Pessaux, Jun Furuse and Pierre Weis */ -/* projet Cristal, INRIA Rocquencourt */ -/* Jacques Garrigue, Kyoto University RIMS */ -/* */ -/* Copyright 2002 Institut National de Recherche en Informatique et */ -/* en Automatique and Kyoto University. All rights reserved. */ -/* This file is distributed under the terms of the GNU Library */ -/* General Public License, with the special exception on linking */ -/* described in file LICENSE found in the OCaml source tree. */ -/* */ -/***********************************************************************/ - -#include -#include -#include - -main () -{ - puts(TCL_VERSION); -} diff --git a/config/gnu/config.guess b/config/gnu/config.guess index 8152efd6..b79252d6 100755 --- a/config/gnu/config.guess +++ b/config/gnu/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011 Free Software Foundation, Inc. +# Copyright 1992-2013 Free Software Foundation, Inc. -timestamp='2011-11-11' +timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,26 +15,22 @@ timestamp='2011-11-11' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA -# 02110-1301, USA. +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# +# Please send patches with a ChangeLog entry to config-patches@gnu.org. + me=`echo "$0" | sed -e 's,.*/,,'` @@ -56,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. +Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -140,12 +132,33 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + ;; +esac + # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or - # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward @@ -202,6 +215,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} @@ -304,7 +321,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; - arm:riscos:*:*|arm:RISCOS:*:*) + arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) @@ -803,6 +820,9 @@ EOF i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; @@ -854,15 +874,22 @@ EOF exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; @@ -874,59 +901,54 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC="gnulibc1" ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) - echo cris-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) - echo crisv32-axis-linux-gnu + echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) - echo frv-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) - echo hexagon-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build @@ -945,54 +967,63 @@ EOF #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; + or1k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; or32:Linux:*:*) - echo or32-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) - echo x86_64-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1196,6 +1227,9 @@ EOF BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; @@ -1222,19 +1256,21 @@ EOF exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown - case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; - unknown) UNAME_PROCESSOR=powerpc ;; - esac + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) @@ -1251,7 +1287,7 @@ EOF NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; - NSE-?:NONSTOP_KERNEL:*:*) + NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) @@ -1320,11 +1356,11 @@ EOF i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; esac -#echo '(No uname command or uname output not recognized.)' 1>&2 -#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 - eval $set_cc_for_build cat >$dummy.c <. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches with a ChangeLog entry to config-patches@gnu.org. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -75,9 +68,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free -Software Foundation, Inc. +Copyright 1992-2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -125,13 +116,17 @@ esac maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] @@ -154,7 +149,7 @@ case $os in -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze) + -apple | -axis | -knuth | -cray | -microblaze*) os= basic_machine=$1 ;; @@ -223,6 +218,12 @@ case $os in -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; -lynx*) os=-lynxos ;; @@ -247,11 +248,14 @@ case $basic_machine in # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ + | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ - | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ - | be32 | be64 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ @@ -264,7 +268,7 @@ case $basic_machine in | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | mcore | mep | metag \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ @@ -282,16 +286,17 @@ case $basic_machine in | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ - | nios | nios2 \ + | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ - | or32 \ + | or1k | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ @@ -319,8 +324,7 @@ case $basic_machine in c6x) basic_machine=tic6x-unknown ;; - m6811 | m68hc11 | m6812 | m68hc12 | picochip) - # Motorola 68HC11/12. + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; @@ -333,7 +337,10 @@ case $basic_machine in strongarm | thumb | xscale) basic_machine=arm-unknown ;; - + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; xscaleeb) basic_machine=armeb-unknown ;; @@ -356,9 +363,10 @@ case $basic_machine in # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ + | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ @@ -377,7 +385,8 @@ case $basic_machine in | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ @@ -395,12 +404,13 @@ case $basic_machine in | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ @@ -719,7 +729,6 @@ case $basic_machine in i370-ibm* | ibm*) basic_machine=i370-ibm ;; -# I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 @@ -777,9 +786,13 @@ case $basic_machine in basic_machine=ns32k-utek os=-sysv ;; - microblaze) + microblaze*) basic_machine=microblaze-xilinx ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; mingw32) basic_machine=i386-pc os=-mingw32 @@ -1008,7 +1021,11 @@ case $basic_machine in basic_machine=i586-unknown os=-pw32 ;; - rdos) + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) basic_machine=i386-pc os=-rdos ;; @@ -1335,21 +1352,21 @@ case $os in -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ + | -sym* | -kopensolaris* | -plan9* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -openbsd* | -solidbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-uclibc* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ @@ -1481,9 +1498,6 @@ case $os in -aros*) os=-aros ;; - -kaos*) - os=-kaos - ;; -zvmoe) os=-zvmoe ;; @@ -1532,6 +1546,9 @@ case $basic_machine in c4x-* | tic4x-*) os=-coff ;; + hexagon-*) + os=-elf + ;; tic54x-*) os=-coff ;; @@ -1559,9 +1576,6 @@ case $basic_machine in ;; m68000-sun) os=-sunos3 - # This also exists in the configure program, but was not the - # default. - # os=-sunos4 ;; m68*-cisco) os=-aout @@ -1575,6 +1589,9 @@ case $basic_machine in mips*-*) os=-elf ;; + or1k-*) + os=-elf + ;; or32-*) os=-coff ;; diff --git a/configure b/configure index 07b1c350..dbc61780 100755 --- a/configure +++ b/configure @@ -20,6 +20,7 @@ libdir='' mandir='' manext=1 host_type=unknown +target_type="" ccoption='' asoption='' asppoption='' @@ -30,20 +31,20 @@ dllib='' x11_include_dir='' x11_lib_dir='' graph_wanted=yes -tk_wanted=yes pthread_wanted=yes -tk_defs='' -tk_libs='' -tk_x11=yes dl_defs='' verbose=no -withcurses=yes +with_curses=yes debugruntime=noruntimed -withsharedlibs=yes +with_sharedlibs=yes gcc_warnings="-Wall" partialld="ld -r" -withcamlp4=camlp4 +with_debugger=ocamldebugger +with_ocamldoc=ocamldoc +with_ocamlbuild=ocamlbuild with_frame_pointers=false +no_naked_pointers=false +TOOLPREF="" with_cfi=true # Try to turn internationalization off, can cause config.guess to malfunction! @@ -53,8 +54,41 @@ unset LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME # Turn off some MacOS X debugging stuff, same reason unset RC_TRACE_ARCHIVES RC_TRACE_DYLIBS RC_TRACE_PREBINDING_DISABLED +# The inf(), wrn(), err() functions below can be used to provide a consistent +# way to notify the user. The notification is always given to the stdout +# descriptor. +# +# Their output is redirected to a file-descriptor "3" which is then redirected +# to fd 1 at the level of the whole configure script. This is done to not +# conflict with how values are returned from functions in shell script. +# Consider the following where "It works!" would be mixed with "42". +# do_foo() { +# if some_command; then +# inf "It works!" +# echo "42" +# fi +# } +inf() { + printf "%b\n" "$*" 1>&3 +} + +wrn() { + printf "[WARNING] %b\n" "$*" 1>&3 +} + +err() { + printf "[ERROR!]%b\n" "$*" 1>&3 + exit 2 +} + +exec 3>&1 + # Parse command-line arguments +if echo "$configure_options" | grep -q -e '--\?[a-zA-Z0-9-]\+='; then + err "Arguments to this script look like '-prefix /foo/bar', not '-prefix=/foo/bar' (note the '=')." +fi + while : ; do case "$1" in "") break;; @@ -76,6 +110,8 @@ while : ; do shift;; -host*|--host*) host_type=$2; shift;; + -target*|--target*) + target_type=$2; shift;; -cc*) ccoption="$2"; shift;; -as) @@ -85,9 +121,9 @@ while : ; do -lib*) cclibs="$2 $cclibs"; shift;; -no-curses|--no-curses) - withcurses=no;; + with_curses=no;; -no-shared-libs|--no-shared-libs) - withsharedlibs=no;; + with_sharedlibs=no;; -x11include*|--x11include*) x11_include_dir=$2; shift;; -x11lib*|--x11lib*) @@ -97,16 +133,8 @@ while : ; do ;; # Ignored for backward compatibility -no-pthread*|--no-pthread*) pthread_wanted=no;; - -no-tk|--no-tk) - tk_wanted=no;; -partialld|--partialld) partialld="$2"; shift;; - -tkdefs*|--tkdefs*) - tk_defs=$2; shift;; - -tklibs*|--tklibs*) - tk_libs=$2; shift;; - -tk-no-x11|--tk-no-x11) - tk_x11=no;; -dldefs*|--dldefs*) dl_defs="$2"; shift;; -dllibs*|--dllibs*) @@ -115,13 +143,19 @@ while : ; do verbose=yes;; -with-debug-runtime|--with-debug-runtime) debugruntime=runtimed;; - -no-camlp4|--no-camlp4) - withcamlp4="";; + -no-debugger|--no-debugger) + with_debugger="";; + -no-ocamldoc|--no-ocamldoc) + with_ocamldoc="";; + -no-ocamlbuild|--no-ocamlbuild) + with_ocamlbuild="";; -with-frame-pointers|--with-frame-pointers) with_frame_pointers=true;; + -no-naked-pointers|--no-naked-pointers) + no_naked_pointers=true;; -no-cfi|--no-cfi) with_cfi=false;; - *) echo "Unknown option \"$1\"." 1>&2; exit 2;; + *) err "Unknown option \"$1\".";; esac shift done @@ -130,28 +164,25 @@ done case "$prefix" in /*) ;; - *) echo "The -prefix directory must be absolute." 1>&2; exit 2;; + *) err "The -prefix directory must be absolute.";; esac case "$bindir" in /*) ;; "") ;; '$(PREFIX)/'*) ;; - *) echo 'The -bindir directory must be absolute or relative to $(PREFIX).'>&2 - exit 2;; + *) err 'The -bindir directory must be absolute or relative to $(PREFIX).';; esac case "$libdir" in /*) ;; "") ;; '$(PREFIX)/'*) ;; - *) echo 'The -libdir directory must be absolute or relative to $(PREFIX).'>&2 - exit 2;; + *) err 'The -libdir directory must be absolute or relative to $(PREFIX).';; esac case "$mandir" in /*) ;; "") ;; '$(PREFIX)/'*) ;; - *) echo 'The -mandir directory must be absolute or relative to $(PREFIX).'>&2 - exit 2;; + *) err 'The -mandir directory must be absolute or relative to $(PREFIX).';; esac # Generate the files @@ -189,35 +220,49 @@ echo "MANEXT=$manext" >> Makefile if test "$host_type" = "unknown"; then if host_type=`../gnu/config.guess`; then :; else - echo "Cannot guess host type" - echo "You must specify one with the -host option" - exit 2 + err "Cannot guess host type. You must specify one with the -host option." fi fi if host=`../gnu/config.sub $host_type`; then :; else - echo "Please specify the correct host type with the -host option" - exit 2 + err "Please specify the correct host type with the -host option" +fi +inf "Configuring for host $host ..." + +if test -n "$target_type"; then + target="$target_type" + TOOLPREF="${target}-" +else + target="$host" fi -echo "Configuring for a $host ..." +inf "Configuring for target $target ..." # Do we have gcc? if test -z "$ccoption"; then - if sh ./searchpath gcc; then - echo "gcc found" - cc=gcc + if sh ./searchpath "${TOOLPREF}gcc"; then + cc="${TOOLPREF}gcc" else - cc=cc + if test x"$host" = x"$target"; then + cc="cc" + else + err "No cross-compiler found for ${target}.\n" \ + "It should be named ${TOOLPREF}gcc and be in the PATH." + fi fi else cc="$ccoption" fi +inf "Using compiler $cc." + # Check for buggy versions of GCC +# These checks are not done for cross-compilation (yet at least) because after +# 15 years, I doubt someone will try to use an experimental (2.96) or +# known-unstable (2.7.2.1) version for cross-compilation. buggycc="no" -case "$host,$cc" in +case "$target,$cc" in i[3456]86-*-*,gcc*) case `$cc --version` in 2.7.2.1) cat <<'EOF' @@ -267,8 +312,10 @@ dllccompopts="" ostype="Unix" exe="" iflexdir="" +SO="so" +TOOLCHAIN="cc" -case "$bytecc,$host" in +case "$bytecc,$target" in cc,*-*-nextstep*) # GNU C extensions disabled, but __GNUC__ still defined! bytecccompopts="-fno-defer-pop $gcc_warnings -U__GNUC__ -posix" @@ -278,7 +325,7 @@ case "$bytecc,$host" in bytecccompopts="-fno-defer-pop $gcc_warnings -DSHRINKED_GNUC" mathlib="";; *,*-*-darwin*) - bytecccompopts="-fno-defer-pop $gcc_warnings" + bytecccompopts="$gcc_warnings" mathlib="" mkexe="$mkexe -Wl,-no_compact_unwind" # Tell gcc that we can use 32-bit code addresses for threaded code @@ -290,7 +337,7 @@ case "$bytecc,$host" in bytecccompopts="-fno-defer-pop $gcc_warnings" # No -lm library mathlib="";; - gcc,alpha*-*-osf*) + *gcc,alpha*-*-osf*) bytecccompopts="-fno-defer-pop $gcc_warnings" if cc="$bytecc" sh ./hasgot -mieee; then bytecccompopts="-mieee $bytecccompopts"; @@ -301,7 +348,7 @@ case "$bytecc,$host" in echo "#define ARCH_CODE32" >> m.h;; cc,alpha*-*-osf*) bytecccompopts="-std1 -ieee";; - gcc,alpha*-*-linux*) + *gcc*,alpha*-*-linux*) if cc="$bytecc" sh ./hasgot -mieee; then bytecccompopts="-mieee $bytecccompopts"; fi;; @@ -317,36 +364,64 @@ case "$bytecc,$host" in *,alpha*-*-unicos*) # For the Cray T3E bytecccompopts="-DUMK";; - gcc*,powerpc-*-aix*) + *gcc*,powerpc-*-aix*) # Avoid name-space pollution by requiring Unix98-conformant includes bytecccompopts="-fno-defer-pop $gcc_warnings -D_XOPEN_SOURCE=500";; *,powerpc-*-aix*) bytecccompopts="-D_XOPEN_SOURCE=500";; - gcc*,*-*-cygwin*) + *gcc*,*-*-cygwin*) bytecccompopts="-fno-defer-pop $gcc_warnings -U_WIN32" dllccompopts="-U_WIN32 -DCAML_DLL" - if test $withsharedlibs = yes; then + if test $with_sharedlibs = yes; then flexlink="flexlink -chain cygwin -merge-manifest -stack 16777216" flexdir=`$flexlink -where | dos2unix` if test -z "$flexdir"; then - echo "flexlink not found: native shared libraries won't be available" - withsharedlibs=no + wrn "flexlink not found: native shared libraries won't be available." + with_sharedlibs=no else iflexdir="-I\"$flexdir\"" mkexe="$flexlink -exe" mkexedebugflag="-link -g" fi fi + if test $with_sharedlibs = no; then + mkexe="$mkexe -Wl,--stack,16777216" + bytecclinkopts="-Wl,--stack,16777216" + fi exe=".exe" ostype="Cygwin";; - gcc*,x86_64-*-linux*) + *gcc*,*-*-mingw*) + bytecccompopts="-fno-defer-pop $gcc_warnings" + dllccompopt="-DCAML_DLL" + if test $with_sharedlibs = yes; then + case "$target" in + i686-*-*) flexlink_chain="mingw";; + x86_64-*-*) flexlink_chain="mingw64";; + esac + flexlink="flexlink -chain $flexlink_chain -merge-manifest -stack 16777216" + flexdir=`$flexlink -where` + if test -z "$flexdir"; then + wrn "flexlink not found: native shared libraries won't be available." + with_sharedlibs=no + else + iflexdir="-I\"$flexdir\"" + mkexe="$flexlink -exe" + mkexedebugflag="-link -g" + fi + fi + exe=".exe" + ostype="Win32" + TOOLCHAIN="mingw" + SO="dll" + ;; + *gcc*,x86_64-*-linux*) bytecccompopts="-fno-defer-pop $gcc_warnings" # Tell gcc that we can use 32-bit code addresses for threaded code # unless we are compiled for a shared library (-fPIC option) echo "#ifndef __PIC__" >> m.h echo "# define ARCH_CODE32" >> m.h echo "#endif" >> m.h;; - gcc*) + *gcc*) bytecccompopts="-fno-defer-pop $gcc_warnings";; esac @@ -359,101 +434,125 @@ export cc cclibs verbose sh ./runtest ansi.c case $? in - 0) echo "The C compiler is ANSI-compliant.";; - 1) echo "The C compiler $cc is not ANSI-compliant." - echo "You need an ANSI C compiler to build OCaml." - exit 2;; - *) echo "Unable to compile the test program." - echo "Make sure the C compiler $cc is properly installed." - exit 2;; + 0) inf "The C compiler is ANSI-compliant." ;; + 1) err "The C compiler $cc is not ANSI-compliant.\n" \ + "You need an ANSI C compiler to build OCaml.";; + *) + if test x"$host" != x"$target"; then + wrn "Unable to compile the test program.\n" \ + "This failure is expected for cross-compilation:\n" \ + "we will assume the C compiler is ANSI-compliant." + else + err "Unable to compile the test program.\n" \ + "Make sure the C compiler $cc is properly installed." + fi;; esac -# Check the sizes of data types +# Determine which ocamlrun executable to use; for cross-compilation, a native +# "ocamlrun" executable must be available on the system. +if test x"$target" != x"$host"; then + if ! sh ./searchpath ocamlrun; then + err "Cross-compilation requires an ocaml runtime environment\n" \ + "(the ocamlrun binary). Moreover, its version must be the same\n" \ + "as the one you're trying to build (`cut -f1 -d+ < ../../VERSION`)." + else + ocaml_system_version=`ocamlrun -version | sed 's/[^0-9]*\([0-9.]\+\).*/\1/'` + ocaml_source_version=`sed -n '1 s/\([0-9\.]\+\).*/\1/ p' < ../../VERSION` + if test x"$ocaml_system_version" != x"$ocaml_source_version"; then + err "While you have an ocaml runtime environment, its version\n" \ + "($ocaml_system_version) doesn't match the version of these sources\n" \ + "($ocaml_source_version)." + else + CAMLRUN="ocamlrun" + fi + fi +else + CAMLRUN=`cd ../.. && pwd`/boot/ocamlrun +fi -echo "Checking the sizes of integers and pointers..." -set `sh ./runtest sizes.c` -case "$2,$3" in - 4,4) echo "OK, this is a regular 32 bit architecture." +echo "CAMLRUN=$CAMLRUN" >> Makefile + +# Check the sizes of data types +# OCaml needs a 32 or 64 bit architecture, a 32-bit integer type and +# a 64-bit integer type + +inf "Checking the sizes of integers and pointers..." +ret=`sh ./runtest sizes.c` +# $1 = sizeof(int) +# $2 = sizeof(long) +# $3 = sizeof(pointers) +# $4 = sizeof(short) +# $5 = sizeof(long long) + +if test "$?" -eq 0; then + set $ret + case "$3" in + 4) inf "OK, this is a regular 32 bit architecture." echo "#undef ARCH_SIXTYFOUR" >> m.h arch64=false;; - *,8) echo "Wow! A 64 bit architecture!" + 8) inf "Wow! A 64 bit architecture!" echo "#define ARCH_SIXTYFOUR" >> m.h arch64=true;; - *,*) echo "This architecture seems to be neither 32 bits nor 64 bits." - echo "OCaml won't run on this architecture." - exit 2;; - *) echo "Unable to compile the test program." - echo "Make sure the C compiler $cc is properly installed." - exit 2;; -esac + *) err "This architecture seems to be neither 32 bits nor 64 bits.\n" \ + "OCaml won't run on this architecture.";; + esac +else + # For cross-compilation, runtest always fails: add special handling. + case "$target" in + i686-*-mingw*) inf "OK, this is a regular 32 bit architecture." + echo "#undef ARCH_SIXTYFOUR" >> m.h + set 4 4 4 2 8 + arch64=false;; + x86_64-*-mingw*) inf "Wow! A 64 bit architecture!" + echo "#define ARCH_SIXTYFOUR" >> m.h + set 4 4 8 2 8 + arch64=true;; + *) err "Since datatype sizes cannot be guessed when cross-compiling,\n" \ + "a hardcoded list is used but your architecture isn't known yet.\n" \ + "You need to determine the sizes yourself.\n" \ + "Please submit a bug report in order to expand the list." ;; + esac +fi + if test $1 != 4 && test $2 != 4 && test $4 != 4; then - echo "Sorry, we can't find a 32-bit integer type" - echo "(sizeof(short) = $4, sizeof(int) = $1, sizeof(long) = $2)" - echo "OCaml won't run on this architecture." - exit 2 + err "Sorry, we can't find a 32-bit integer type\n" \ + "(sizeof(short) = $4, sizeof(int) = $1, sizeof(long) = $2)\n" \ + "OCaml won't run on this architecture." +fi + +if test $2 != 8 && test $5 != 8; then + err "Sorry, we can't find a 64-bit integer type\n" \ + "(sizeof(long) = $2, sizeof(long long) = $5)\n" \ + "OCaml won't run on this architecture." fi echo "#define SIZEOF_INT $1" >> m.h echo "#define SIZEOF_LONG $2" >> m.h echo "#define SIZEOF_PTR $3" >> m.h echo "#define SIZEOF_SHORT $4" >> m.h - -if test $2 = 8; then - echo "#define ARCH_INT64_TYPE long" >> m.h - echo "#define ARCH_UINT64_TYPE unsigned long" >> m.h - echo '#define ARCH_INT64_PRINTF_FORMAT "l"' >> m.h - int64_native=true -else - sh ./runtest longlong.c - case $? in - 0) echo "64-bit \"long long\" integer type found (printf with \"%ll\")." - echo "#define ARCH_INT64_TYPE long long" >> m.h - echo "#define ARCH_UINT64_TYPE unsigned long long" >> m.h - echo '#define ARCH_INT64_PRINTF_FORMAT "ll"' >> m.h - int64_native=true;; - 1) echo "64-bit \"long long\" integer type found (printf with \"%q\")." - echo "#define ARCH_INT64_TYPE long long" >> m.h - echo "#define ARCH_UINT64_TYPE unsigned long long" >> m.h - echo '#define ARCH_INT64_PRINTF_FORMAT "q"' >> m.h - int64_native=true;; - 2) echo "64-bit \"long long\" integer type found (but no printf)." - echo "#define ARCH_INT64_TYPE long long" >> m.h - echo "#define ARCH_UINT64_TYPE unsigned long long" >> m.h - echo '#undef ARCH_INT64_PRINTF_FORMAT' >> m.h - int64_native=true;; - *) echo "No suitable 64-bit integer type found, will use software emulation." - echo "#undef ARCH_INT64_TYPE" >> m.h - echo "#undef ARCH_UINT64_TYPE" >> m.h - echo '#undef ARCH_INT64_PRINTF_FORMAT' >> m.h - int64_native=false;; - esac -fi - -if test $3 = 8 && test $int64_native = false; then - echo "This architecture has 64-bit pointers but no 64-bit integer type." - echo "OCaml won't run on this architecture." - exit 2 -fi +echo "#define SIZEOF_LONGLONG $5" >> m.h # Determine endianness sh ./runtest endian.c case $? in - 0) echo "This is a big-endian architecture." + 0) inf "This is a big-endian architecture." echo "#define ARCH_BIG_ENDIAN" >> m.h;; - 1) echo "This is a little-endian architecture." + 1) inf "This is a little-endian architecture." echo "#undef ARCH_BIG_ENDIAN" >> m.h;; - 2) echo "This architecture seems to be neither big endian nor little endian." - echo "OCaml won't run on this architecture." - exit 2;; - *) echo "Something went wrong during endianness determination." - echo "You'll have to figure out endianness yourself" - echo "(option ARCH_BIG_ENDIAN in m.h).";; + 2) err "This architecture seems to be neither big endian nor little endian.\n" \ + "OCaml won't run on this architecture.";; + *) case $target in + *-*-mingw*) inf "This is a little-endian architecture." + echo "#undef ARCH_BIG_ENDIAN" >> m.h;; + *) wrn "Something went wrong during endianness determination.\n" \ + "You will have to figure out endianness yourself (option ARCH_BIG_ENDIAN in m.h).";; + esac;; esac # Determine alignment constraints -case "$host" in +case "$target" in sparc*-*-*|hppa*-*-*|arm*-*-*|mips*-*-*) # On Sparc V9 with certain versions of gcc, determination of double # alignment is not reliable (PR#1521), hence force it. @@ -464,69 +563,76 @@ case "$host" in # if we're in 64-bit mode (sizeof(long) == 8), # we must not doubleword-align floats... if test $2 = 8; then - echo "Doubles can be word-aligned." + inf "Doubles can be word-aligned." echo "#undef ARCH_ALIGN_DOUBLE" >> m.h else - echo "Doubles must be doubleword-aligned." + inf "Doubles must be doubleword-aligned." echo "#define ARCH_ALIGN_DOUBLE" >> m.h fi;; *) sh ./runtest dblalign.c case $? in - 0) echo "Doubles can be word-aligned." + 0) inf "Doubles can be word-aligned." echo "#undef ARCH_ALIGN_DOUBLE" >> m.h;; - 1) echo "Doubles must be doubleword-aligned." - echo "#define ARCH_ALIGN_DOUBLE" >> m.h;; - *) echo "Something went wrong during alignment determination for doubles." - echo "We will assume alignment constraints over doubles." - echo "That's a safe bet: OCaml will work even if" - echo "this architecture actually has no alignment constraints." + 1) inf "Doubles must be doubleword-aligned." echo "#define ARCH_ALIGN_DOUBLE" >> m.h;; + *) case "$target" in + *-*-mingw*) inf "Doubles can be word-aligned." + echo "#undef ARCH_ALIGN_DOUBLE" >> m.h;; + *) wrn "Something went wrong during alignment determination for doubles.\n" \ + "We will assume alignment constraints over doubles.\n" \ + "That's a safe bet: OCaml will work even if\n" \ + "this architecture actually has no alignment constraints." + echo "#define ARCH_ALIGN_DOUBLE" >> m.h;; + esac;; esac;; esac -if $int64_native; then - case "$host" in - # PR#5088: autodetection is unreliable on ARM. PR#5280: also on MIPS. - sparc*-*-*|hppa*-*-*|arm*-*-*|mips*-*-*) - if test $2 = 8; then - echo "64-bit integers can be word-aligned." - echo "#undef ARCH_ALIGN_INT64" >> m.h - else - echo "64-bit integers must be doubleword-aligned." - echo "#define ARCH_ALIGN_INT64" >> m.h - fi;; - *) - sh ./runtest int64align.c - case $? in - 0) echo "64-bit integers can be word-aligned." - echo "#undef ARCH_ALIGN_INT64" >> m.h;; - 1) echo "64-bit integers must be doubleword-aligned." - echo "#define ARCH_ALIGN_INT64" >> m.h;; - *) echo "Something went wrong during alignment determination for 64-bit" - echo "integers. I'm going to assume this architecture has alignment" - echo "constraints. That's a safe bet: OCaml will work even if" - echo "this architecture has actually no alignment constraints." - echo "#define ARCH_ALIGN_INT64" >> m.h;; - esac - esac -else - echo "#undef ARCH_ALIGN_INT64" >> m.h -fi +case "$target" in + # PR#5088: autodetection is unreliable on ARM. PR#5280: also on MIPS. + sparc*-*-*|hppa*-*-*|arm*-*-*|mips*-*-*) + if test $2 = 8; then + inf "64-bit integers can be word-aligned." + echo "#undef ARCH_ALIGN_INT64" >> m.h + else + inf "64-bit integers must be doubleword-aligned." + echo "#define ARCH_ALIGN_INT64" >> m.h + fi;; + *-*-mingw*) true;; # Nothing is in config/m-nt.h so don't add anything. + *) + sh ./runtest int64align.c + case $? in + 0) inf "64-bit integers can be word-aligned." + echo "#undef ARCH_ALIGN_INT64" >> m.h;; + 1) inf "64-bit integers must be doubleword-aligned." + echo "#define ARCH_ALIGN_INT64" >> m.h;; + *) wrn "Something went wrong during alignment determination for\n" \ + "64-bit integers. I'm going to assume this architecture has\n" \ + "alignment constraints. That's a safe bet: OCaml will work\n" \ + "even if this architecture has actually no alignment\n" \ + "constraints." \ + echo "#define ARCH_ALIGN_INT64" >> m.h;; + esac +esac # Check semantics of division and modulus sh ./runtest divmod.c case $? in - 0) echo "Native division and modulus have round-towards-zero semantics," - echo "will use them." + 0) inf "Native division and modulus have round-towards-zero semantics," \ + "will use them." echo "#undef NONSTANDARD_DIV_MOD" >> m.h;; - 1) echo "Native division and modulus do not have round-towards-zero" - echo "semantics, will use software emulation." - echo "#define NONSTANDARD_DIV_MOD" >> m.h;; - *) echo "Something went wrong while checking native division and modulus," - echo "please report it at http://http://caml.inria.fr/mantis/" + 1) inf "Native division and modulus do not have round-towards-zero" + "semantics, will use software emulation." echo "#define NONSTANDARD_DIV_MOD" >> m.h;; + *) case $target in + *-*-mingw*) inf "Native division and modulus have round-towards-zero" \ + "semantics, will use them." + echo "#undef NONSTANDARD_DIV_MOD" >> m.h;; + *) wrn "Something went wrong while checking native division and modulus"\ + "please report it at http://http://caml.inria.fr/mantis/" + echo "#define NONSTANDARD_DIV_MOD" >> m.h;; + esac;; esac # Shared library support @@ -539,12 +645,16 @@ byteccrpath='' mksharedlibrpath='' natdynlinkopts="" -if test $withsharedlibs = "yes"; then - case "$host" in +if test $with_sharedlibs = "yes"; then + case "$target" in *-*-cygwin*) mksharedlib="$flexlink" mkmaindll="$flexlink -maindll" shared_libraries_supported=true;; + *-*-mingw*) + mksharedlib="$flexlink" + mkmaindll="$flexlink -maindll" + shared_libraries_supported=true;; *-*-linux-gnu|*-*-linux|*-*-freebsd[3-9]*|*-*-freebsd[1-9][0-9]*|*-*-openbsd*|*-*-netbsd*|*-*-gnu*) sharedcccompopts="-fPIC" mksharedlib="$bytecc -shared" @@ -555,7 +665,7 @@ if test $withsharedlibs = "yes"; then shared_libraries_supported=true;; alpha*-*-osf*) case "$bytecc" in - gcc*) + *gcc*) sharedcccompopts="-fPIC" mksharedlib="$bytecc -shared" byteccrpath="-Wl,-rpath," @@ -570,7 +680,7 @@ if test $withsharedlibs = "yes"; then esac;; *-*-solaris2*) case "$bytecc" in - gcc*) + *gcc*) sharedcccompopts="-fPIC" if sh ./solaris-ld; then mksharedlib="$bytecc -shared" @@ -594,7 +704,7 @@ if test $withsharedlibs = "yes"; then mips*-*-irix[56]*) case "$bytecc" in cc*) sharedcccompopts="";; - gcc*) sharedcccompopts="-fPIC";; + *gcc*) sharedcccompopts="-fPIC";; esac mksharedlib="ld -shared -rdata_shared" byteccrpath="-Wl,-rpath," @@ -633,9 +743,10 @@ fi natdynlink=false -if test $withsharedlibs = "yes"; then - case "$host" in +if test $with_sharedlibs = "yes"; then + case "$target" in *-*-cygwin*) natdynlink=true;; + *-*-mingw*) natdynlink=true;; i[3456]86-*-linux*) natdynlink=true;; i[3456]86-*-gnu*) natdynlink=true;; x86_64-*-linux*) natdynlink=true;; @@ -649,14 +760,16 @@ if test $withsharedlibs = "yes"; then sparc*-*-linux*) natdynlink=true;; i686-*-kfreebsd*) natdynlink=true;; x86_64-*-kfreebsd*) natdynlink=true;; - i[345]86-*-freebsd*) natdynlink=true;; + i[3456]86-*-freebsd*) natdynlink=true;; x86_64-*-freebsd*) natdynlink=true;; - i[345]86-*-openbsd*) natdynlink=true;; + i[3456]86-*-openbsd*) natdynlink=true;; x86_64-*-openbsd*) natdynlink=true;; - i[345]86-*-netbsd*) natdynlink=true;; + i[3456]86-*-netbsd*) natdynlink=true;; x86_64-*-netbsd*) natdynlink=true;; i386-*-gnu0.3) natdynlink=true;; arm*-*-linux*) natdynlink=true;; + arm*-*-freebsd*) natdynlink=true;; + aarch64-*-linux*) natdynlink=true;; esac fi @@ -673,7 +786,7 @@ arch=none model=default system=unknown -case "$host" in +case "$target" in sparc*-*-solaris2.*) arch=sparc; system=solaris;; sparc*-*-*bsd*) arch=sparc; system=bsd;; sparc*-*-linux*) arch=sparc; system=linux;; @@ -694,6 +807,7 @@ case "$host" in arch=i386; system=macosx fi;; i[3456]86-*-gnu*) arch=i386; system=gnu;; + i[3456]86-*-mingw*) arch=i386; system=mingw;; powerpc*-*-linux*) arch=power; model=ppc; system=elf;; powerpc-*-netbsd*) arch=power; model=ppc; system=elf;; powerpc-*-openbsd*) arch=power; model=ppc; system=bsd_elf;; @@ -705,19 +819,25 @@ case "$host" in armv7*-*-linux-gnueabi) arch=arm; model=armv7; system=linux_eabi;; armv6t2*-*-linux-gnueabi) arch=arm; model=armv6t2; system=linux_eabi;; armv6*-*-linux-gnueabi) arch=arm; model=armv6; system=linux_eabi;; + armv6*-*-freebsd*) arch=arm; model=armv6; system=freebsd;; armv5te*-*-linux-gnueabi) arch=arm; model=armv5te; system=linux_eabi;; armv5*-*-linux-gnueabi) arch=arm; model=armv5; system=linux_eabi;; arm*-*-linux-gnueabi) arch=arm; system=linux_eabi;; + arm*-*-openbsd*) arch=arm; system=bsd;; + zaurus*-*-openbsd*) arch=arm; system=bsd;; x86_64-*-linux*) arch=amd64; system=linux;; x86_64-*-gnu*) arch=amd64; system=gnu;; x86_64-*-freebsd*) arch=amd64; system=freebsd;; x86_64-*-netbsd*) arch=amd64; system=netbsd;; x86_64-*-openbsd*) arch=amd64; system=openbsd;; x86_64-*-darwin*) arch=amd64; system=macosx;; + x86_64-*-mingw*) arch=amd64; system=mingw;; + aarch64-*-linux*) arch=arm64; system=linux;; + x86_64-*-cygwin*) arch=amd64; system=cygwin;; esac # Some platforms exist both in 32-bit and 64-bit variants, not distinguished -# by $host. Turn off native code compilation on platforms where 64-bit mode +# by $target. Turn off native code compilation on platforms where 64-bit mode # is not supported. (PR#4441) if $arch64; then @@ -739,7 +859,7 @@ nativecclinkopts='' # ld (for shared libs), not for cc nativeccrpath="$byteccrpath" -case "$arch,$nativecc,$system,$host_type" in +case "$arch,$nativecc,$system,$target" in *,*,nextstep,*) nativecccompopts="$gcc_warnings -U__GNUC__ -posix" nativecclinkopts="-posix";; *,*,rhapsody,*darwin[1-5].*) @@ -754,99 +874,103 @@ esac asppprofflags='-DPROFILING' -case "$arch,$model,$system" in - amd64,*,macosx) if ./searchpath clang; then +case "$arch,$system" in + amd64,macosx) if ./searchpath clang; then as='clang -arch x86_64 -c' aspp='clang -arch x86_64 -c' else - as='as -arch x86_64' - aspp='gcc -arch x86_64 -c' + as="${TOOLPREF}as -arch x86_64" + aspp="${TOOLPREF}gcc -arch x86_64 -c" fi;; - amd64,*,solaris) as='as --64' - aspp='gcc -m64 -c';; - amd64,*,*) as='as' - aspp='gcc -c';; - arm,*,*) as='as'; - aspp='gcc -c';; - i386,*,solaris) as='as' - aspp='/usr/ccs/bin/as -P';; - i386,*,*) as='as' - aspp='gcc -c';; - power,*,elf) as='as -u -m ppc' - aspp='gcc -c';; - power,*,bsd*) as='as' - aspp='gcc -c';; - power,*,rhapsody) as="as -arch $model" - aspp="$bytecc -c";; - sparc,*,solaris) as='as' - case "$cc" in - gcc*) aspp='gcc -c';; - *) aspp='as -P';; - esac;; - sparc,*,*) as='as' - aspp='gcc -c';; + amd64,solaris) as="${TOOLPREF}as --64" + aspp="${TOOLPREF}gcc -m64 -c";; + i386,solaris) as="${TOOLPREF}as" + aspp="/usr/ccs/bin/${TOOLPREF}as -P";; + power,elf) as="${TOOLPREF}as -u -m ppc" + aspp="${TOOLPREF}gcc -c";; + power,rhapsody) as="${TOOLPREF}as -arch $model" + aspp="$bytecc -c";; + sparc,solaris) as="${TOOLPREF}as" + case "$cc" in + *gcc*) aspp="${TOOLPREF}gcc -c";; + *) aspp="${TOOLPREF}as -P";; + esac;; + arm,freebsd) as="${TOOLPREF}cc -c" + aspp="${TOOLPREF}cc -c";; + *,freebsd) as="${TOOLPREF}as" + aspp="${TOOLPREF}cc -c";; + amd64,*|arm,*|arm64,*|i386,*|power,bsd*|sparc,*) + as="${TOOLPREF}as" + aspp="${TOOLPREF}gcc -c";; esac if test -n "$asoption"; then as="$asoption"; fi if test -n "$asppoption"; then aspp="$asppoption"; fi cc_profile='-pg' -case "$arch,$model,$system" in - i386,*,linux_elf) profiling='prof';; - i386,*,gnu) profiling='prof';; - i386,*,bsd_elf) profiling='prof';; - amd64,*,macosx) profiling='prof';; - i386,*,macosx) profiling='prof';; - sparc,*,solaris) +case "$arch,$system" in + i386,linux_elf) profiling='prof';; + i386,gnu) profiling='prof';; + i386,bsd_elf) profiling='prof';; + amd64,macosx) profiling='prof';; + i386,macosx) profiling='prof';; + sparc,bsd) profiling='prof';; + sparc,solaris) profiling='prof' case "$nativecc" in gcc*) ;; *) cc_profile='-xpg';; esac;; - amd64,*,linux) profiling='prof';; - amd64,*,gnu) profiling='prof';; - arm,*,linux*) profiling='prof';; + amd64,linux) profiling='prof';; + amd64,openbsd) profiling='prof';; + amd64,gnu) profiling='prof';; + arm,linux*) profiling='prof';; + power,elf) profiling='prof';; + power,bsd*) profiling='prof';; *) profiling='noprof';; esac # Where is ranlib? -if sh ./searchpath ranlib; then - echo "ranlib found" - echo "RANLIB=ranlib" >> Makefile - echo "RANLIBCMD=ranlib" >> Makefile +if sh ./searchpath ${TOOLPREF}ranlib; then + inf "ranlib found" + echo "RANLIB=${TOOLPREF}ranlib" >> Makefile + echo "RANLIBCMD=${TOOLPREF}ranlib" >> Makefile else - echo "ranlib not used" - echo "RANLIB=ar rs" >> Makefile + inf "ranlib not used" + echo "RANLIB=${TOOLPREF}ar rs" >> Makefile echo "RANLIBCMD=" >> Makefile fi -echo "ARCMD=ar" >> Makefile +echo "ARCMD=${TOOLPREF}ar" >> Makefile +# Write the OS type (Unix or Cygwin) + +echo "#define OCAML_OS_TYPE \"$ostype\"" >> s.h +echo "#define OCAML_STDLIB_DIR \"$libdir\"" >> s.h + # Do #! scripts work? if (SHELL=/bin/sh; export SHELL; (./sharpbang || ./sharpbang2) >/dev/null); then - echo "#! appears to work in shell scripts" - case "$host" in + inf "#! appears to work in shell scripts." + case "$target" in *-*-sunos*|*-*-unicos*) - echo "We won't use it, though, because under SunOS and Unicos it breaks" - echo "on pathnames longer than 30 characters" + wrn "We won't use it, though, because under SunOS and Unicos it breaks " \ + "on pathnames longer than 30 characters" echo "SHARPBANGSCRIPTS=false" >> Makefile;; *-*-cygwin*) - echo "We won't use it, though, because of conflicts with .exe extension" - echo " under Cygwin" + wrn "We won't use it, though, because of conflicts with .exe extension " \ + "under Cygwin" + echo "SHARPBANGSCRIPTS=false" >> Makefile;; + *-*-mingw*) + inf "We won't use it, though, because it's on the target platform it would be used and windows doesn't support it." echo "SHARPBANGSCRIPTS=false" >> Makefile;; *) echo "SHARPBANGSCRIPTS=true" >> Makefile;; esac else - echo "No support for #! in shell scripts" + inf "No support for #! in shell scripts" echo "SHARPBANGSCRIPTS=false" >> Makefile fi -# Write the OS type (Unix or Cygwin) - -echo "#define OCAML_OS_TYPE \"$ostype\"" >> s.h -echo "#define OCAML_STDLIB_DIR \"$libdir\"" >> s.h - # Use 64-bit file offset if possible bytecccompopts="$bytecccompopts -D_FILE_OFFSET_BITS=64" @@ -855,17 +979,17 @@ nativecccompopts="$nativecccompopts -D_FILE_OFFSET_BITS=64" # Check the semantics of signal handlers if sh ./hasgot sigaction sigprocmask; then - echo "POSIX signal handling found." + inf "POSIX signal handling found." echo "#define POSIX_SIGNALS" >> s.h else if sh ./runtest signals.c; then - echo "Signals have the BSD semantics." + inf "Signals have the BSD semantics." echo "#define BSD_SIGNALS" >> s.h else - echo "Signals have the System V semantics." + inf "Signals have the System V semantics." fi if sh ./hasgot sigsetmask; then - echo "sigsetmask() found" + inf "sigsetmask() found" echo "#define HAS_SIGSETMASK" >> s.h fi fi @@ -873,28 +997,28 @@ fi # For the Pervasives module if sh ./hasgot2 -i math.h $mathlib expm1 log1p hypot copysign; then - echo "expm1(), log1p(), hypot(), copysign() found." + inf "expm1(), log1p(), hypot(), copysign() found." echo "#define HAS_C99_FLOAT_OPS" >> s.h fi # For the Sys module if sh ./hasgot getrusage; then - echo "getrusage() found." + inf "getrusage() found." echo "#define HAS_GETRUSAGE" >> s.h fi if sh ./hasgot times; then - echo "times() found." + inf "times() found." echo "#define HAS_TIMES" >> s.h fi # For the terminfo module -if test "$withcurses" = "yes"; then +if test "$with_curses" = "yes"; then for libs in "" "-lcurses" "-ltermcap" "-lcurses -ltermcap" "-lncurses"; do if sh ./hasgot $libs tgetent tgetstr tgetnum tputs; then - echo "termcap functions found (with libraries '$libs')" + inf "termcap functions found (with libraries '$libs')" echo "#define HAS_TERMCAP" >> s.h curseslibs="${libs}" break @@ -904,112 +1028,130 @@ fi # Configuration for the libraries -otherlibraries="unix str num dynlink bigarray" +case "$system" in + mingw) unix_or_win32="win32"; unixlib="win32unix"; graphlib="win32graph";; + *) unix_or_win32="unix"; unixlib="unix"; graphlib="graph";; +esac + +echo "UNIX_OR_WIN32=$unix_or_win32" >> Makefile +echo "UNIXLIB=$unixlib" >> Makefile +echo "GRAPHLIB=$graphlib" >> Makefile + +otherlibraries="$unixlib str num dynlink bigarray" # For the Unix library has_sockets=no if sh ./hasgot socket socketpair bind listen accept connect; then - echo "You have BSD sockets." + inf "You have BSD sockets." echo "#define HAS_SOCKETS" >> s.h has_sockets=yes elif sh ./hasgot -lnsl -lsocket socket socketpair bind listen accept connect; then - echo "You have BSD sockets (with libraries '-lnsl -lsocket')" + inf "You have BSD sockets (with libraries '-lnsl -lsocket')" cclibs="$cclibs -lnsl -lsocket" echo "#define HAS_SOCKETS" >> s.h has_sockets=yes +else + case "$target" in + *-*-mingw*) + inf "You have BSD sockets (with libraries '-lws2_32')" + cclibs="$cclibs -lws2_32" + echo "#define HAS_SOCKETS" >> s.h + has_sockets=yes ;; + *) ;; + esac fi if sh ./hasgot -i sys/socket.h -t socklen_t; then - echo "socklen_t is defined in " + inf "socklen_t is defined in " echo "#define HAS_SOCKLEN_T" >> s.h fi if sh ./hasgot inet_aton; then - echo "inet_aton() found." + inf "inet_aton() found." echo "#define HAS_INET_ATON" >> s.h fi if sh ./hasgot -i sys/types.h -i sys/socket.h -i netinet/in.h \ -t 'struct sockaddr_in6' \ && sh ./hasgot getaddrinfo getnameinfo inet_pton inet_ntop; then - echo "IPv6 is supported." + inf "IPv6 is supported." echo "#define HAS_IPV6" >> s.h fi if sh ./hasgot -i unistd.h; then - echo "unistd.h found." + inf "unistd.h found." echo "#define HAS_UNISTD" >> s.h fi if sh ./hasgot -i sys/types.h -t off_t; then - echo "off_t is defined in " + inf "off_t is defined in " echo "#define HAS_OFF_T" >> s.h fi if sh ./hasgot -i sys/types.h -i dirent.h; then - echo "dirent.h found." + inf "dirent.h found." echo "#define HAS_DIRENT" >> s.h fi if sh ./hasgot rewinddir; then - echo "rewinddir() found." + inf "rewinddir() found." echo "#define HAS_REWINDDIR" >> s.h fi if sh ./hasgot lockf; then - echo "lockf() found." + inf "lockf() found." echo "#define HAS_LOCKF" >> s.h fi if sh ./hasgot mkfifo; then - echo "mkfifo() found." + inf "mkfifo() found." echo "#define HAS_MKFIFO" >> s.h fi if sh ./hasgot getcwd; then - echo "getcwd() found." + inf "getcwd() found." echo "#define HAS_GETCWD" >> s.h fi if sh ./hasgot getwd; then - echo "getwd() found." + inf "getwd() found." echo "#define HAS_GETWD" >> s.h fi if sh ./hasgot getpriority setpriority; then - echo "getpriority() found." + inf "getpriority() found." echo "#define HAS_GETPRIORITY" >> s.h fi if sh ./hasgot -i sys/types.h -i utime.h && sh ./hasgot utime; then - echo "utime() found." + inf "utime() found." echo "#define HAS_UTIME" >> s.h fi if sh ./hasgot utimes; then - echo "utimes() found." + inf "utimes() found." echo "#define HAS_UTIMES" >> s.h fi if sh ./hasgot dup2; then - echo "dup2() found." + inf "dup2() found." echo "#define HAS_DUP2" >> s.h fi if sh ./hasgot fchmod fchown; then - echo "fchmod() found." + inf "fchmod() found." echo "#define HAS_FCHMOD" >> s.h fi if sh ./hasgot truncate ftruncate; then - echo "truncate() found." + inf "truncate() found." echo "#define HAS_TRUNCATE" >> s.h fi select_include='' if sh ./hasgot -i sys/types.h -i sys/select.h; then - echo "sys/select.h found." + inf "sys/select.h found." echo "#define HAS_SYS_SELECT_H" >> s.h select_include='-i sys/select.h' fi @@ -1017,114 +1159,117 @@ fi has_select=no if sh ./hasgot select && \ sh ./hasgot -i sys/types.h $select_include -t fd_set ; then - echo "select() found." + inf "select() found." echo "#define HAS_SELECT" >> s.h has_select=yes fi if sh ./hasgot symlink readlink lstat; then - echo "symlink() found." + inf "symlink() found." echo "#define HAS_SYMLINK" >> s.h fi has_wait=no if sh ./hasgot waitpid; then - echo "waitpid() found." + inf "waitpid() found." echo "#define HAS_WAITPID" >> s.h has_wait=yes fi if sh ./hasgot wait4; then - echo "wait4() found." + inf "wait4() found." echo "#define HAS_WAIT4" >> s.h has_wait=yes fi if sh ./hasgot -i limits.h && sh ./runtest getgroups.c; then - echo "getgroups() found." + inf "getgroups() found." echo "#define HAS_GETGROUPS" >> s.h fi if sh ./hasgot -i limits.h -i grp.h && sh ./runtest setgroups.c; then - echo "setgroups() found." + inf "setgroups() found." echo "#define HAS_SETGROUPS" >> s.h fi if sh ./hasgot -i limits.h -i grp.h && sh ./runtest initgroups.c; then - echo "initgroups() found." + inf "initgroups() found." echo "#define HAS_INITGROUPS" >> s.h fi if sh ./hasgot -i termios.h && sh ./hasgot tcgetattr tcsetattr tcsendbreak tcflush tcflow; then - echo "POSIX termios found." + inf "POSIX termios found." echo "#define HAS_TERMIOS" >> s.h fi if sh ./runtest async_io.c; then - echo "Asynchronous I/O are supported." + inf "Asynchronous I/O are supported." echo "#define HAS_ASYNC_IO" >> s.h fi has_setitimer=no if sh ./hasgot setitimer; then - echo "setitimer() found." + inf "setitimer() found." echo "#define HAS_SETITIMER" >> s.h has_setitimer="yes" fi if sh ./hasgot gethostname; then - echo "gethostname() found." + inf "gethostname() found." echo "#define HAS_GETHOSTNAME" >> s.h fi if sh ./hasgot -i sys/utsname.h && sh ./hasgot uname; then - echo "uname() found." + inf "uname() found." echo "#define HAS_UNAME" >> s.h fi has_gettimeofday=no if sh ./hasgot gettimeofday; then - echo "gettimeofday() found." + inf "gettimeofday() found." echo "#define HAS_GETTIMEOFDAY" >> s.h has_gettimeofday="yes" fi if sh ./hasgot mktime; then - echo "mktime() found." + inf "mktime() found." echo "#define HAS_MKTIME" >> s.h fi -case "$host" in +case "$target" in *-*-cygwin*) ;; # setsid emulation under Cygwin breaks the debugger *) if sh ./hasgot setsid; then - echo "setsid() found." + inf "setsid() found." echo "#define HAS_SETSID" >> s.h fi;; esac if sh ./hasgot putenv; then - echo "putenv() found." + inf "putenv() found." echo "#define HAS_PUTENV" >> s.h fi if sh ./hasgot -i locale.h && sh ./hasgot setlocale; then - echo "setlocale() and found." + inf "setlocale() and found." echo "#define HAS_LOCALE" >> s.h fi if sh ./hasgot $dllib dlopen; then - echo "dlopen() found." + inf "dlopen() found." elif sh ./hasgot $dllib -ldl dlopen; then - echo "dlopen() found in -ldl." + inf "dlopen() found in -ldl." dllib="$dllib -ldl" else - shared_libraries_supported=false + case "$target" in + *-*-mingw*) ;; + *) shared_libraries_supported=false + esac fi if $shared_libraries_supported; then - echo "Dynamic loading of shared libraries is supported." + inf "Dynamic loading of shared libraries is supported." echo "#define SUPPORT_DYNAMIC_LINKING" >> s.h if $dl_needs_underscore; then echo '#define DL_NEEDS_UNDERSCORE' >>s.h @@ -1132,12 +1277,12 @@ if $shared_libraries_supported; then fi if sh ./hasgot -i sys/types.h -i sys/mman.h && sh ./hasgot mmap munmap; then - echo "mmap() found." + inf "mmap() found." echo "#define HAS_MMAP" >> s.h fi if sh ./hasgot pwrite; then - echo "pwrite() found" + inf "pwrite() found" echo "#define HAS_PWRITE" >> s.h fi @@ -1146,7 +1291,7 @@ for i in 5 6; do if sh ./trycompile -DNUM_ARGS=${i} gethostbyname.c; then nargs=$i; break; fi done if test $nargs != "none"; then - echo "gethostbyname_r() found (with ${nargs} arguments)." + inf "gethostbyname_r() found (with ${nargs} arguments)." echo "#define HAS_GETHOSTBYNAME_R $nargs" >> s.h fi @@ -1155,29 +1300,35 @@ for i in 7 8; do if sh ./trycompile -DNUM_ARGS=${i} gethostbyaddr.c; then nargs=$i; break; fi done if test $nargs != "none"; then - echo "gethostbyaddr_r() found (with ${nargs} arguments)." + inf "gethostbyaddr_r() found (with ${nargs} arguments)." echo "#define HAS_GETHOSTBYADDR_R $nargs" >> s.h fi +if sh ./hasgot mkstemp; then + inf "mkstemp() found" + echo "#define HAS_MKSTEMP" >> s.h +fi + # Determine if the debugger is supported -if test "$has_sockets" = "yes"; then - echo "Replay debugger supported." - debugger="ocamldebugger" -else - echo "No replay debugger (missing system calls)" - debugger="" +if test -n "$with_debugger"; then + if test "$has_sockets" = "yes"; then + inf "Replay debugger supported." + with_debugger="ocamldebugger" + else + inf "No replay debugger (missing system calls)" + with_debugger="" + fi fi - # Determine if system stack overflows can be detected case "$arch,$system" in i386,linux_elf|amd64,linux|power,rhapsody|amd64,macosx|i386,macosx) - echo "System stack overflow can be detected." + inf "System stack overflow can be detected." echo "#define HAS_STACK_OVERFLOW_DETECTION" >> s.h;; *) - echo "Cannot detect system stack overflow.";; + inf "Cannot detect system stack overflow.";; esac # Determine the target architecture for the "num" library @@ -1190,6 +1341,7 @@ case "$arch" in fi;; power) bng_arch=ppc; bng_asm_level=1;; amd64) bng_arch=amd64; bng_asm_level=1;; + arm64) bng_arch=arm64; bng_asm_level=1;; *) bng_arch=generic; bng_asm_level=0;; esac @@ -1201,7 +1353,7 @@ echo "BNG_ASM_LEVEL=$bng_asm_level" >> Makefile systhread_support=false if test "$pthread_wanted" = "yes"; then - case "$host" in + case "$target" in *-*-solaris*) pthread_link="-lpthread -lposix4" pthread_caml_link="-cclib -lpthread -cclib -lposix4";; *-*-freebsd*) pthread_link="-pthread" @@ -1212,12 +1364,12 @@ if test "$pthread_wanted" = "yes"; then pthread_caml_link="-cclib -lpthread";; esac if ./hasgot -i pthread.h $pthread_link pthread_self; then - echo "POSIX threads library supported." + inf "POSIX threads library supported." systhread_support=true otherlibraries="$otherlibraries systhreads" bytecccompopts="$bytecccompopts -D_REENTRANT" nativecccompopts="$nativecccompopts -D_REENTRANT" - case "$host" in + case "$target" in *-*-freebsd*) bytecccompopts="$bytecccompopts -D_THREAD_SAFE" nativecccompopts="$nativecccompopts -D_THREAD_SAFE";; @@ -1226,13 +1378,13 @@ if test "$pthread_wanted" = "yes"; then asppflags="$asppflags -pthread" nativecccompopts="$nativecccompopts -pthread";; esac - echo "Options for linking with POSIX threads: $pthread_link" + inf "Options for linking with POSIX threads: $pthread_link" if sh ./hasgot $pthread_link sigwait; then - echo "sigwait() found" + inf "sigwait() found" echo "#define HAS_SIGWAIT" >> s.h fi else - echo "POSIX threads not found." + inf "POSIX threads not found." pthread_link="" fi else @@ -1246,10 +1398,10 @@ if test "$has_select" = "yes" \ && test "$has_setitimer" = "yes" \ && test "$has_gettimeofday" = "yes" \ && test "$has_wait" = "yes"; then - echo "Bytecode threads library supported." + inf "Bytecode threads library supported." otherlibraries="$otherlibraries threads" else - echo "Bytecode threads library not supported (missing system calls)" + inf "Bytecode threads library not supported (missing system calls)" fi # Determine the location of X include files and libraries @@ -1386,7 +1538,7 @@ if test "$x11_include" = "not found"; then x11_link="-lX11" else x11_libs="-L$dir" - case "$host" in + case "$target" in *-kfreebsd*-gnu) x11_link="-L$dir -lX11";; *-*-*bsd*) x11_link="-R$dir -L$dir -lX11";; *) x11_link="-L$dir -lX11";; @@ -1402,9 +1554,9 @@ if test "x11_include" != "not found"; then x11_include="" fi if ./hasgot $x11_include $x11_link -i X11/Xlib.h XrmInitialize; then - echo "X11 works" + inf "X11 works" else - echo "Cannot compile X11 program" + wrn "Cannot compile X11 program." x11_include="not found" fi fi @@ -1412,12 +1564,12 @@ fi has_graph=false if test "$x11_include" = "not found" || test "$x11_link" = "not found" then - echo "X11 not found, the \"graph\" library will not be supported." + wrn 'X11 not found, the "graph" library will not be supported.' x11_include="not found" x11_link="not found" else - echo "Options for compiling for X11: $x11_include" - echo "Options for linking with X11: $x11_link" + inf "Options for compiling for X11: $x11_include" + inf "Options for linking with X11: $x11_link" if test "$graph_wanted" = yes then has_graph=true @@ -1427,149 +1579,15 @@ fi echo "X11_INCLUDES=$x11_include" >> Makefile echo "X11_LINK=$x11_link" >> Makefile -# Look for tcl/tk - -echo "Configuring LablTk..." - -if test $tk_wanted = no; then - has_tk=false -elif test $tk_x11 = no; then - has_tk=true -elif test "$x11_include" = "not found" || test "$x11_link" = "not found"; then - echo "X11 not found or disabled." - has_tk=false -else - tk_x11_include="$x11_include" - tk_x11_libs="$x11_link" - has_tk=true -fi - -if test $has_tk = true; then - tcl_version='' - tcl_version=`sh ./runtest $tk_defs $tk_x11_include tclversion.c` - for tk_incs in \ - "-I/usr/local/include" \ - "-I/usr/include" \ - "-I/usr/local/include/tcl8.6 -I/usr/local/include/tk8.6" \ - "-I/usr/include/tcl8.6 -I/usr/include/tk8.6" \ - "-I/usr/local/include/tcl8.5 -I/usr/local/include/tk8.5" \ - "-I/usr/include/tcl8.5 -I/usr/include/tk8.5" \ - "-I/usr/local/include/tcl8.4 -I/usr/local/include/tk8.4" \ - "-I/usr/include/tcl8.4 -I/usr/include/tk8.4" \ - "-I/usr/local/include/tcl8.3 -I/usr/local/include/tk8.3" \ - "-I/usr/include/tcl8.3 -I/usr/include/tk8.3" \ - "-I/usr/local/include/tcl8.2 -I/usr/local/include/tk8.2" \ - "-I/usr/include/tcl8.2 -I/usr/include/tk8.2" \ - "-I/sw/include" \ - "-I/usr/pkg/include" - do if test -z "$tcl_version"; then - tk_defs="$tk_incs" - tcl_version=`sh ./runtest $tk_defs $tk_x11_include tclversion.c` - fi; done - if test -n "$tcl_version" && test "x$tcl_version" != "xnone"; then - echo "tcl.h and tk.h version $tcl_version found with \"$tk_defs\"." - case $tcl_version in - 8.6) tclmaj=8 tclmin=6 tkmaj=8 tkmin=6 ;; - 8.5) tclmaj=8 tclmin=5 tkmaj=8 tkmin=5 ;; - 8.4) tclmaj=8 tclmin=4 tkmaj=8 tkmin=4 ;; - 8.3) tclmaj=8 tclmin=3 tkmaj=8 tkmin=3 ;; - 8.2) tclmaj=8 tclmin=2 tkmaj=8 tkmin=2 ;; - 8.1) tclmaj=8 tclmin=1 tkmaj=8 tkmin=1 ;; - 8.0) tclmaj=8 tclmin=0 tkmaj=8 tkmin=0 ;; - 7.6) tclmaj=7 tclmin=6 tkmaj=4 tkmin=2 ;; - 7.5) tclmaj=7 tclmin=5 tkmaj=4 tkmin=1 ;; - *) echo "This version is not known."; has_tk=false ;; - esac - else - echo "tcl.h and/or tk.h not found." - has_tk=false - fi -fi - -tkauxlibs="$mathlib $dllib" -tcllib='' -tklib='' -if test $has_tk = true; then - if test -n "$tk_libs" && \ - sh ./hasgot $tk_libs $tk_x11_libs $tkauxlibs Tcl_DoOneEvent - then tk_libs="$tk_libs $dllib" - elif sh ./hasgot $tk_libs -ltcl$tclmaj.$tclmin $tkauxlibs Tcl_DoOneEvent - then - tk_libs="$tk_libs -ltk$tkmaj.$tkmin -ltcl$tclmaj.$tclmin $dllib" - elif sh ./hasgot $tk_libs -ltcl$tclmaj$tclmin $tkauxlibs Tcl_DoOneEvent - then - tk_libs="$tk_libs -ltk$tkmaj$tkmin -ltcl$tclmaj$tclmin $dllib" - elif test -z "$tk_libs" && tk_libs=-L/usr/local/lib && \ - sh ./hasgot $tk_libs -ltcl$tclmaj.$tclmin $tkauxlibs Tcl_DoOneEvent - then - tk_libs="$tk_libs -ltk$tkmaj.$tkmin -ltcl$tclmaj.$tclmin $dllib" - elif sh ./hasgot $tk_libs -ltcl$tclmaj$tclmin $tkauxlibs Tcl_DoOneEvent - then - tk_libs="$tk_libs -ltk$tkmaj$tkmin -ltcl$tclmaj$tclmin $dllib" - elif sh ./hasgot -L/sw/lib $tk_libs -ltcl$tclmaj.$tclmin $tkauxlibs \ - Tcl_DoOneEvent - then tk_libs="-L/sw/lib -ltk$tkmaj.$tkmin -ltcl$tclmaj.$tclmin $dllib" - elif sh ./hasgot -L/usr/pkg/lib $tk_libs $tk_x11_libs \ - -ltk$tkmaj$tkmin -ltcl$tclmaj$tclmin -lpthread $tkauxlibs \ - Tcl_DoOneEvent - then - case "$host" in - *-*-*bsd*) tk_libs="-R/usr/pkg/lib -L/usr/pkg/lib $tk_libs $tk_x11_libs -ltk$tkmaj$tkmin -ltcl$tclmaj$tclmin -lpthread $tkauxlibs";; - *) tk_libs="-L/usr/pkg/lib $tk_libs $tk_x11_libs -ltk$tkmaj$tkmin -ltcl$tclmaj$tclmin -lpthread $tkauxlibs";; - esac - else - echo "Tcl library not found." - has_tk=false - fi -fi - -if test $has_tk = true; then - if sh ./hasgot $tk_libs $tk_x11_libs $tkauxlibs Tk_SetGrid; then - echo "Tcl/Tk libraries found." - elif sh ./hasgot -L/sw/lib $tk_libs $tk_x11_libs $tkauxlibs Tk_SetGrid; then - case "$host" in - *-*-*bsd*) tk_libs="-R/sw/lib -L/sw/lib $tk_libs";; - *) tk_libs="-L/sw/lib $tk_libs";; - esac - echo "Tcl/Tk libraries found." - elif sh ./hasgot -L/usr/pkg/lib $tk_libs $tk_x11_libs $tkauxlibs \ - Tk_SetGrid; then - case "$host" in - *-*-*bsd*) tk_libs="-R/usr/pkg/lib -L/usr/pkg/lib $tk_libs";; - *) tk_libs="-L/usr/pkg/lib $tk_libs";; - esac - echo "Tcl/Tk libraries found." - else - echo "Tcl library found." - echo "Tk library not found." - has_tk=false - fi -fi - -if test $has_tk = true; then - if test $tk_x11 = yes; then - echo "TK_DEFS=$tk_defs "'$(X11_INCLUDES)' >> Makefile - echo "TK_LINK=$tk_libs "'$(X11_LINK)' >> Makefile - else - echo "TK_DEFS=$tk_defs" >> Makefile - echo "TK_LINK=$tk_libs" >> Makefile - fi - otherlibraries="$otherlibraries labltk" -else - echo "Configuration failed, LablTk will not be built." - echo "TK_DEFS=" >> Makefile - echo "TK_LINK=" >> Makefile -fi - # Look for BFD library if ./hasgot -i bfd.h && \ ./hasgot -lbfd -ldl -liberty -lz bfd_openr; then - echo "BFD library found." + inf "BFD library found." echo "#define HAS_LIBBFD" >> s.h echo "LIBBFD_LINK=-lbfd -ldl -liberty -lz" >> Makefile else - echo "BFD library not found, 'objinfo' will be unable to display info on .cmxs files" + wrn "BFD library not found, 'objinfo' will be unable to display info on .cmxs files." echo "LIBBFD_LINK=" >> Makefile fi @@ -1584,24 +1602,27 @@ if ! $with_cfi; then elif sh ./tryassemble cfi.S; then echo "#define ASM_CFI_SUPPORTED" >> m.h asm_cfi_supported=true - echo "Assembler supports CFI" + inf "Assembler supports CFI" else - echo "Assembler does not support CFI" + inf "Assembler does not support CFI" fi if test "$with_frame_pointers" = "true"; then - case "$host,$cc" in + case "$target,$cc" in x86_64-*-linux*,gcc*) nativecccompopts="$nativecccompopts -g -fno-omit-frame-pointer" bytecccompopts="$bytecccompopts -g -fno-omit-frame-pointer" nativecclinkopts="$nativecclinkopts -g" echo "#define WITH_FRAME_POINTERS" >> m.h ;; - *) echo "Unsupported architecture with frame pointers" 1>&2; exit 2;; + *) err "Unsupported architecture with frame pointers";; esac fi +if $no_naked_pointers; then + echo "#define NO_NAKED_POINTERS" >> m.h +fi # Final twiddling of compiler options to work around known bugs @@ -1649,7 +1670,6 @@ echo "ASPPPROFFLAGS=$asppprofflags" >> Makefile echo "PROFILING=$profiling" >> Makefile echo "DYNLINKOPTS=$dllib" >> Makefile echo "OTHERLIBRARIES=$otherlibraries" >> Makefile -echo "DEBUGGER=$debugger" >> Makefile echo "CC_PROFILE=$cc_profile" >> Makefile echo "SYSTHREAD_SUPPORT=$systhread_support" >> Makefile echo "PARTIALLD=$partialld" >> Makefile @@ -1659,14 +1679,14 @@ echo "DLLCCCOMPOPTS=$dllccompopts" >> Makefile echo "IFLEXDIR=$iflexdir" >> Makefile echo "O=o" >> Makefile echo "A=a" >> Makefile -echo "SO=so" >> Makefile +echo "SO=$SO" >> Makefile echo "EXT_OBJ=.o" >> Makefile echo "EXT_ASM=.s" >> Makefile echo "EXT_LIB=.a" >> Makefile -echo "EXT_DLL=.so" >> Makefile +echo "EXT_DLL=.$SO" >> Makefile echo "EXTRALIBS=" >> Makefile echo "CCOMPTYPE=cc" >> Makefile -echo "TOOLCHAIN=cc" >> Makefile +echo "TOOLCHAIN=$TOOLCHAIN" >> Makefile echo "NATDYNLINK=$natdynlink" >> Makefile echo "CMXS=$cmxs" >> Makefile echo "MKEXE=$mkexe" >> Makefile @@ -1674,9 +1694,13 @@ echo "MKEXEDEBUGFLAG=$mkexedebugflag" >> Makefile echo "MKDLL=$mksharedlib" >> Makefile echo "MKMAINDLL=$mkmaindll" >> Makefile echo "RUNTIMED=${debugruntime}" >>Makefile -echo "CAMLP4=${withcamlp4}" >>Makefile +echo "WITH_DEBUGGER=${with_debugger}" >>Makefile +echo "WITH_OCAMLDOC=${with_ocamldoc}" >>Makefile +echo "WITH_OCAMLBUILD=${with_ocamlbuild}" >>Makefile echo "ASM_CFI_SUPPORTED=$asm_cfi_supported" >> Makefile echo "WITH_FRAME_POINTERS=$with_frame_pointers" >> Makefile +echo "TARGET=$target" >> Makefile +echo "HOST=$host" >> Makefile if [ "$ostype" = Cygwin ]; then echo "DIFF=diff -q --strip-trailing-cr" >>Makefile fi @@ -1688,99 +1712,95 @@ mv m.h s.h Makefile .. # Print a summary -echo -echo "** Configuration summary **" -echo -echo "Directories where OCaml will be installed:" -echo " binaries.................. $bindir" -echo " standard library.......... $libdir" -echo " manual pages.............. $mandir (with extension .$manext)" - -echo "Configuration for the bytecode compiler:" -echo " C compiler used........... $bytecc" -echo " options for compiling..... $bytecccompopts" -echo " options for linking....... $bytecclinkopts $cclibs $dllib $curseslibs $pthread_link" +inf +inf "** Configuration summary **" +inf +inf "Directories where OCaml will be installed:" +inf " binaries.................. $bindir" +inf " standard library.......... $libdir" +inf " manual pages.............. $mandir (with extension .$manext)" + +inf "Configuration for the bytecode compiler:" +inf " C compiler used........... $bytecc" +inf " options for compiling..... $bytecccompopts" +inf " options for linking....... $bytecclinkopts $cclibs $dllib $curseslibs $pthread_link" if $shared_libraries_supported; then -echo " shared libraries are supported" -echo " options for compiling..... $sharedcccompopts $bytecccompopts" -echo " command for building...... $mksharedlib -o lib.so $mksharedlibrpath/a/path objs" +inf " shared libraries are supported" +inf " options for compiling..... $sharedcccompopts $bytecccompopts" +inf " command for building...... $mksharedlib -o lib.so $mksharedlibrpath/a/path objs" else -echo " shared libraries not supported" +inf " shared libraries not supported" fi -echo "Configuration for the native-code compiler:" +inf "Configuration for the native-code compiler:" if test "$arch" = "none"; then - echo " (not supported on this platform)" + inf " (not supported on this platform)" else if test "$model" = "default"; then - echo " hardware architecture..... $arch" + inf " hardware architecture..... $arch" else - echo " hardware architecture..... $arch ($model)" + inf " hardware architecture..... $arch ($model)" fi if test "$system" = "unknown"; then : ; else - echo " OS variant................ $system" + inf " OS variant................ $system" fi - echo " C compiler used........... $nativecc" - echo " options for compiling..... $nativecccompopts" - echo " options for linking....... $nativecclinkopts $cclibs" - echo " assembler ................ $as" - echo " preprocessed assembler ... $aspp" + inf " C compiler used........... $nativecc" + inf " options for compiling..... $nativecccompopts" + inf " options for linking....... $nativecclinkopts $cclibs" + inf " assembler ................ $as" + inf " preprocessed assembler ... $aspp" if test "$asm_cfi_supported" = "true"; then - echo " assembler supports CFI ... yes" + inf " assembler supports CFI ... yes" else - echo " assembler supports CFI ... no" + inf " assembler supports CFI ... no" fi if test "$with_frame_pointers" = "true"; then - echo " with frame pointers....... yes" + inf " with frame pointers....... yes" + else + inf " with frame pointers....... no" + fi + if $no_naked_pointers; then + inf " naked pointers forbidden.. yes" else - echo " with frame pointers....... no" + inf " naked pointers forbidden.. no" fi - echo " native dynlink ........... $natdynlink" + inf " native dynlink ........... $natdynlink" if test "$profiling" = "prof"; then - echo " profiling with gprof ..... supported" + inf " profiling with gprof ..... supported" else - echo " profiling with gprof ..... not supported" + inf " profiling with gprof ..... not supported" fi fi -if test "$debugger" = "ocamldebugger"; then - echo "Source-level replay debugger: supported" +if test "$with_debugger" = "ocamldebugger"; then + inf "Source-level replay debugger: supported" else - echo "Source-level replay debugger: not supported" + inf "Source-level replay debugger: not supported" fi if test "$debugruntime" = "runtimed"; then - echo "Debug runtime will be compiled and installed" + inf "Debug runtime will be compiled and installed" fi -echo "Additional libraries supported:" -echo " $otherlibraries" +inf "Additional libraries supported:" +inf " $otherlibraries" -echo "Configuration for the \"num\" library:" -echo " target architecture ...... $bng_arch (asm level $bng_asm_level)" +inf "Configuration for the \"num\" library:" +inf " target architecture ...... $bng_arch (asm level $bng_asm_level)" if $has_graph; then -echo "Configuration for the \"graph\" library:" -echo " options for compiling .... $x11_include" -echo " options for linking ...... $x11_link" -else -echo "The \"graph\" library: not supported" -fi - -if test $has_tk = true; then -echo "Configuration for the \"labltk\" library:" -echo " use tcl/tk version ....... $tcl_version" -echo " options for compiling .... $tk_defs $tk_x11_include" -echo " options for linking ...... $tk_libs $tk_x11_libs" +inf "Configuration for the \"graph\" library:" +inf " options for compiling .... $x11_include" +inf " options for linking ...... $x11_link" else -echo "The \"labltk\" library: not supported" +inf "The \"graph\" library: not supported" fi -echo -echo "** OCaml configuration completed successfully **" -echo +inf +inf "** OCaml configuration completed successfully **" +inf if test ! -z "$MACOSX_DEPLOYMENT_TARGET"; then - echo "WARNING: the environment variable MACOSX_DEPLOYMENT_TARGET is set." - echo "This will probably prevent compiling the OCaml system." + wrn "The environment variable MACOSX_DEPLOYMENT_TARGET is set.\n" \ + "This will probably prevent compiling the OCaml system." fi diff --git a/debugger/.depend b/debugger/.depend index 60b0baef..b6254161 100644 --- a/debugger/.depend +++ b/debugger/.depend @@ -164,19 +164,23 @@ program_loading.cmx : unix_tools.cmx $(UNIXDIR)/unix.cmx \ program_management.cmo : unix_tools.cmi $(UNIXDIR)/unix.cmi \ time_travel.cmi symbols.cmi question.cmi program_loading.cmi \ primitives.cmi parameters.cmi int64ops.cmi input_handling.cmi history.cmi \ - debugger_config.cmi breakpoints.cmi program_management.cmi + ../typing/envaux.cmi debugger_config.cmi ../utils/config.cmi \ + breakpoints.cmi program_management.cmi program_management.cmx : unix_tools.cmx $(UNIXDIR)/unix.cmx \ time_travel.cmx symbols.cmx question.cmx program_loading.cmx \ primitives.cmx parameters.cmx int64ops.cmx input_handling.cmx history.cmx \ - debugger_config.cmx breakpoints.cmx program_management.cmi + ../typing/envaux.cmx debugger_config.cmx ../utils/config.cmx \ + breakpoints.cmx program_management.cmi question.cmo : primitives.cmi lexer.cmi input_handling.cmi question.cmi question.cmx : primitives.cmx lexer.cmx input_handling.cmx question.cmi show_information.cmo : symbols.cmi source.cmi show_source.cmi printval.cmi \ - ../utils/misc.cmi ../bytecomp/instruct.cmi frames.cmi events.cmi \ - debugcom.cmi checkpoints.cmi breakpoints.cmi show_information.cmi + parameters.cmi ../utils/misc.cmi ../bytecomp/instruct.cmi frames.cmi \ + events.cmi debugcom.cmi checkpoints.cmi breakpoints.cmi \ + show_information.cmi show_information.cmx : symbols.cmx source.cmx show_source.cmx printval.cmx \ - ../utils/misc.cmx ../bytecomp/instruct.cmx frames.cmx events.cmx \ - debugcom.cmx checkpoints.cmx breakpoints.cmx show_information.cmi + parameters.cmx ../utils/misc.cmx ../bytecomp/instruct.cmx frames.cmx \ + events.cmx debugcom.cmx checkpoints.cmx breakpoints.cmx \ + show_information.cmi show_source.cmo : source.cmi primitives.cmi parameters.cmi \ ../parsing/location.cmi ../bytecomp/instruct.cmi events.cmi \ debugger_config.cmi show_source.cmi diff --git a/debugger/Makefile b/debugger/Makefile index cf0fffb9..75f4aa8e 100644 --- a/debugger/Makefile +++ b/debugger/Makefile @@ -10,5 +10,5 @@ # # ######################################################################### -UNIXDIR=../otherlibs/unix +UNIXDIR=../otherlibs/$(UNIXLIB) include Makefile.shared diff --git a/debugger/Makefile.shared b/debugger/Makefile.shared index 528bbfee..fed1d26d 100644 --- a/debugger/Makefile.shared +++ b/debugger/Makefile.shared @@ -12,8 +12,9 @@ include ../config/Makefile -CAMLC=../ocamlcomp.sh -COMPFLAGS=-warn-error A $(INCLUDES) +ROOTDIR=.. +CAMLC=$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +COMPFLAGS=-warn-error A -safe-string $(INCLUDES) LINKFLAGS=-linkall -I $(UNIXDIR) CAMLYACC=../boot/ocamlyacc YACCFLAGS= @@ -21,6 +22,8 @@ CAMLLEX=../boot/ocamlrun ../boot/ocamllex CAMLDEP=../boot/ocamlrun ../tools/ocamldep DEPFLAGS=$(INCLUDES) +INSTALL_BINDIR=$(DESTDIR)$(BINDIR) + INCLUDES=\ -I ../utils -I ../parsing -I ../typing -I ../bytecomp -I ../toplevel \ -I $(UNIXDIR) @@ -30,6 +33,7 @@ OTHEROBJS=\ ../utils/misc.cmo ../utils/config.cmo ../utils/tbl.cmo \ ../utils/clflags.cmo ../utils/consistbl.cmo ../utils/warnings.cmo \ ../parsing/location.cmo ../parsing/longident.cmo \ + ../parsing/ast_helper.cmo ../parsing/ast_mapper.cmo \ ../typing/ident.cmo ../typing/path.cmo ../typing/types.cmo \ ../typing/btype.cmo ../typing/primitive.cmo ../typing/typedtree.cmo \ ../typing/subst.cmo ../typing/predef.cmo \ @@ -82,7 +86,7 @@ ocamldebug$(EXE): $(OBJS) $(OTHEROBJS) $(CAMLC) $(LINKFLAGS) -o ocamldebug$(EXE) -linkall $(OTHEROBJS) $(OBJS) install: - cp ocamldebug$(EXE) $(BINDIR)/ocamldebug$(EXE) + cp ocamldebug$(EXE) $(INSTALL_BINDIR)/ocamldebug$(EXE) clean:: rm -f ocamldebug$(EXE) diff --git a/debugger/command_line.ml b/debugger/command_line.ml index d1086215..a4647110 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -234,16 +234,22 @@ let instr_env ppf lexbuf = let cmdarg = argument_list_eol argument lexbuf in let cmdarg = string_trim (String.concat " " cmdarg) in if cmdarg <> "" then - try - if (String.index cmdarg '=') > 0 then - Debugger_config.environment := cmdarg :: !Debugger_config.environment - else - eprintf "Environment variables should not have an empty name\n%!" - with Not_found -> - eprintf "Environment variables should have the \"name=value\" format\n%!" + if ask_kill_program () then begin + try + let eqpos = String.index cmdarg '=' in + if eqpos = 0 then raise Not_found; + let name = String.sub cmdarg 0 eqpos in + let value = + String.sub cmdarg (eqpos + 1) (String.length cmdarg - eqpos - 1) + in + Debugger_config.environment := + (name, value) :: List.remove_assoc name !Debugger_config.environment + with Not_found -> + eprintf "Environment variable must be in name=value format\n%!" + end else List.iter - (printf "%s\n%!") + (fun (vvar, vval) -> printf "%s=%s\n%!" vvar vval) (List.rev !Debugger_config.environment) let instr_pwd ppf lexbuf = diff --git a/debugger/debugcom.ml b/debugger/debugcom.ml index 72702da1..ac91df79 100644 --- a/debugger/debugcom.ml +++ b/debugger/debugcom.ml @@ -187,10 +187,10 @@ let set_trap_barrier pos = let value_size = if 1 lsl 31 = 0 then 4 else 8 let input_remote_value ic = - Misc.input_bytes ic value_size + really_input_string ic value_size let output_remote_value ic v = - output ic v 0 value_size + output_substring ic v 0 value_size exception Marshalling_error @@ -244,7 +244,7 @@ module Remote_value = if input_byte !conn.io_in = 0 then Remote(input_remote_value !conn.io_in) else begin - let buf = Misc.input_bytes !conn.io_in 8 in + let buf = really_input_string !conn.io_in 8 in let floatbuf = float n (* force allocation of a new float *) in String.unsafe_blit buf 0 (Obj.magic floatbuf) 0 8; Local(Obj.repr floatbuf) diff --git a/debugger/debugger_config.mli b/debugger/debugger_config.mli index f725acec..ab935d93 100644 --- a/debugger/debugger_config.mli +++ b/debugger/debugger_config.mli @@ -34,4 +34,4 @@ val make_checkpoints : bool ref (*** Environment variables for debugee. ***) -val environment : string list ref +val environment : (string * string) list ref diff --git a/debugger/eval.ml b/debugger/eval.ml index aa006332..1d1ab388 100644 --- a/debugger/eval.ml +++ b/debugger/eval.ml @@ -147,13 +147,13 @@ let rec expression event env = function and find_label lbl env ty path tydesc pos = function [] -> raise(Error(Wrong_label(ty, lbl))) - | (name, mut, ty_arg) :: rem -> - if Ident.name name = lbl then begin + | {ld_id; ld_type} :: rem -> + if Ident.name ld_id = lbl then begin let ty_res = Btype.newgenty(Tconstr(path, tydesc.type_params, ref Mnil)) in (pos, - try Ctype.apply env [ty_res] ty_arg [ty] with Ctype.Cannot_apply -> + try Ctype.apply env [ty_res] ld_type [ty] with Ctype.Cannot_apply -> abstract_type) end else find_label lbl env ty path tydesc (pos + 1) rem diff --git a/debugger/input_handling.mli b/debugger/input_handling.mli index 749687ce..66db47f1 100644 --- a/debugger/input_handling.mli +++ b/debugger/input_handling.mli @@ -49,7 +49,7 @@ val current_prompt : string ref (* Where the user input come from. *) val user_channel : io_channel ref -val read_user_input : string -> int -> int +val read_user_input : bytes -> int -> int (* Stop reading user input. *) val stop_user_input : unit -> unit diff --git a/debugger/main.ml b/debugger/main.ml index 85bc9afb..60cd96a8 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -26,10 +26,7 @@ open Primitives let line_buffer = Lexing.from_function read_user_input -let rec loop ppf = - line_loop ppf line_buffer; - if !loaded && (not (yes_or_no "The program is running. Quit anyway")) then - loop ppf +let rec loop ppf = line_loop ppf line_buffer let current_duration = ref (-1L) @@ -170,10 +167,12 @@ let speclist = [ " Set max number of checkpoints kept"; "-cd", Arg.String set_directory, " Change working directory"; - "-emacs", Arg.Set emacs, - "For running the debugger under emacs"; + "-emacs", Arg.Tuple [Arg.Set emacs; Arg.Set machine_readable], + "For running the debugger under emacs; implies -machine-readable"; "-I", Arg.String add_include, " Add to the list of include directories"; + "-machine-readable", Arg.Set machine_readable, + "Print information in a format more suitable for machines"; "-s", Arg.String set_socket, " Set the name of the communication socket"; "-version", Arg.Unit print_version, @@ -194,7 +193,7 @@ let main () = (Unix.string_of_inet_addr Unix.inet_addr_loopback)^ ":"^ (string_of_int (10000 + ((Unix.getpid ()) mod 10000))) - | _ -> Filename.concat Filename.temp_dir_name + | _ -> Filename.concat (Filename.get_temp_dir_name ()) ("camldebug" ^ (string_of_int (Unix.getpid ()))) ); begin try diff --git a/debugger/parameters.ml b/debugger/parameters.ml index 2e1d4a75..d8c85efe 100644 --- a/debugger/parameters.ml +++ b/debugger/parameters.ml @@ -35,3 +35,5 @@ let add_path_for mdl dir = (* Used by emacs ? *) let emacs = ref false + +let machine_readable = ref false diff --git a/debugger/parameters.mli b/debugger/parameters.mli index 244d24b3..44c850d5 100644 --- a/debugger/parameters.mli +++ b/debugger/parameters.mli @@ -23,3 +23,5 @@ val add_path_for : string -> string -> unit (* Used by emacs ? *) val emacs : bool ref + +val machine_readable : bool ref diff --git a/debugger/printval.ml b/debugger/printval.ml index 0fa2eced..5170ef3b 100644 --- a/debugger/printval.ml +++ b/debugger/printval.ml @@ -47,7 +47,7 @@ module EvalPath = struct type valu = Debugcom.Remote_value.t exception Error - let rec eval_path = function + let rec eval_path env = function Pident id -> begin try Debugcom.Remote_value.global (Symtable.get_global_position id) @@ -55,7 +55,7 @@ module EvalPath = raise Error end | Pdot(root, fieldname, pos) -> - let v = eval_path root in + let v = eval_path env root in if not (Debugcom.Remote_value.is_block v) then raise Error else Debugcom.Remote_value.field v pos diff --git a/debugger/program_loading.ml b/debugger/program_loading.ml index 99bfe6b4..1ebbd1e8 100644 --- a/debugger/program_loading.ml +++ b/debugger/program_loading.ml @@ -33,38 +33,44 @@ let load_program () = (*** Launching functions. ***) -(* Returns the environment to be passed to debugee *) -let get_environment () = - let env = Unix.environment () in - let have_same_name x y = - let split = Primitives.split_string '=' in - match split x, split y with - (hd1 :: _), (hd2 :: _) -> hd1 = hd2 - | _ -> false in - let have_name_in_config_env x = - List.exists - (have_same_name x) - !Debugger_config.environment in - let env = - Array.fold_right - (fun elem acc -> - if have_name_in_config_env elem then - acc - else - elem :: acc) - env - [] in - Array.of_list (env @ !Debugger_config.environment) - -(* Returns the environment to be passed to debugee *) -let get_win32_environment () = - let res = Buffer.create 256 in - let env = get_environment () in - let len = Array.length env in - for i = 0 to pred len do - Buffer.add_string res (Printf.sprintf "set %s && " env.(i)) +(* Returns a command line prefix to set environment for the debuggee *) +let get_unix_environment () = + let f (vname, vvalue) = + Printf.sprintf "%s=%s " vname (Filename.quote vvalue) + in + String.concat "" (List.map f !Debugger_config.environment) +;; + +(* Notes: + 1. This quoting is not the same as [Filename.quote] because the "set" + command is a shell built-in and its quoting rules are different + from regular commands. + 2. Microsoft's documentation omits the double-quote from the list + of characters that need quoting, but that is a mistake (unquoted + quotes are included in the value, but they alter the quoting of + characters between them). + Reference: http://msdn.microsoft.com/en-us/library/bb490954.aspx + *) +let quote_for_windows_shell s = + let b = Buffer.create (20 + String.length s) in + for i = 0 to String.length s - 1 do + begin match s.[i] with + | '<' | '>' | '|' | '&' | '^' | '\"' -> + Buffer.add_char b '^'; + | _ -> () + end; + Buffer.add_char b s.[i]; done; - Buffer.contents res + Buffer.contents b +;; + +(* Returns a command line prefix to set environment for the debuggee *) +let get_win32_environment () = + (* Note: no space before the & or Windows will add it to the value *) + let f (vname, vvalue) = + Printf.sprintf "set %s=%s&" vname (quote_for_windows_shell vvalue) + in + String.concat "" (List.map f !Debugger_config.environment) (* A generic function for launching the program *) let generic_exec_unix cmdline = function () -> @@ -83,7 +89,7 @@ let generic_exec_unix cmdline = function () -> 0 -> (* Try to detach the process from the controlling terminal, so that it does not receive SIGINT on ctrl-C. *) begin try ignore(setsid()) with Invalid_argument _ -> () end; - execve shell [| shell; "-c"; cmdline() |] (get_environment ()) + execv shell [| shell; "-c"; cmdline() |] | _ -> exit 0 with x -> Unix_tools.report_error x; @@ -113,18 +119,19 @@ let exec_with_runtime = (function () -> match Sys.os_type with "Win32" -> - (* This fould fail on a file name with spaces + (* This would fail on a file name with spaces but quoting is even worse because Unix.create_process thinks each command line parameter is a file. So no good solution so far *) - Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s && %s %s %s" + Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s& %s %s %s" (get_win32_environment ()) !socket_name runtime_program !program_name !arguments | _ -> - Printf.sprintf "CAML_DEBUG_SOCKET=%s %s %s %s" + Printf.sprintf "%sCAML_DEBUG_SOCKET=%s %s %s %s" + (get_unix_environment ()) !socket_name (Filename.quote runtime_program) (Filename.quote !program_name) @@ -137,13 +144,14 @@ let exec_direct = match Sys.os_type with "Win32" -> (* See the comment above *) - Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s && %s %s" + Printf.sprintf "%sset CAML_DEBUG_SOCKET=%s& %s %s" (get_win32_environment ()) !socket_name !program_name !arguments | _ -> - Printf.sprintf "CAML_DEBUG_SOCKET=%s %s %s" + Printf.sprintf "%sCAML_DEBUG_SOCKET=%s %s %s" + (get_unix_environment ()) !socket_name (Filename.quote !program_name) !arguments) diff --git a/debugger/program_management.ml b/debugger/program_management.ml index c7438b39..48118573 100644 --- a/debugger/program_management.ml +++ b/debugger/program_management.ml @@ -30,7 +30,7 @@ open Time_travel let file_name = ref (None : string option) (* Default connection handler. *) -let buffer = String.create 1024 +let buffer = Bytes.create 1024 let control_connection pid fd = if (read fd.io_fd buffer 0 1024) = 0 then forget_process fd pid @@ -124,6 +124,8 @@ let initialize_loading () = raise Toplevel; end; Symbols.read_symbols !program_name; + Config.load_path := !Config.load_path @ !Symbols.program_source_dirs; + Envaux.reset_cache (); if !debug_loading then prerr_endline "Opening a socket..."; open_connection !socket_name diff --git a/debugger/show_information.ml b/debugger/show_information.ml index 89111d3c..690645df 100644 --- a/debugger/show_information.ml +++ b/debugger/show_information.ml @@ -21,6 +21,7 @@ open Frames open Source open Show_source open Breakpoints +open Parameters (* Display information about the current event. *) let show_current_event ppf = @@ -73,9 +74,15 @@ let show_one_frame framenum ppf event = let buffer = get_buffer pos event.ev_module in snd (start_and_cnum buffer pos) with _ -> pos.Lexing.pos_cnum in - fprintf ppf "#%i Pc: %i %s char %i@." - framenum event.ev_pos event.ev_module - cnum + if !machine_readable then + fprintf ppf "#%i Pc: %i %s char %i@." + framenum event.ev_pos event.ev_module + cnum + else + fprintf ppf "#%i %s %s:%i:%i@." + framenum event.ev_module + pos.Lexing.pos_fname pos.Lexing.pos_lnum + (pos.Lexing.pos_cnum - pos.Lexing.pos_bol + 1) (* Display information about the current frame. *) (* --- `select frame' must have succeded before calling this function. *) diff --git a/debugger/source.ml b/debugger/source.ml index c68df337..af69fbc7 100644 --- a/debugger/source.ml +++ b/debugger/source.ml @@ -74,7 +74,7 @@ let get_buffer pos mdle = try List.assoc mdle !buffer_list with Not_found -> let inchan = open_in_bin (source_of_module pos mdle) in - let content = Misc.input_bytes inchan (in_channel_length inchan) in + let content = really_input_string inchan (in_channel_length inchan) in let buffer = (content, ref []) in buffer_list := (list_truncate !buffer_max_count ((mdle, buffer)::!buffer_list)); diff --git a/debugger/symbols.ml b/debugger/symbols.ml index 331d5bbd..1be72533 100644 --- a/debugger/symbols.ml +++ b/debugger/symbols.ml @@ -17,9 +17,14 @@ open Instruct open Debugger_config (* Toplevel *) open Program_loading +module StringSet = Set.Make(String) + let modules = ref ([] : string list) +let program_source_dirs = + ref ([] : string list) + let events = ref ([] : debug_event list) let events_by_pc = @@ -52,13 +57,16 @@ let read_symbols' bytecode_file = raise Toplevel end; let num_eventlists = input_binary_int ic in + let dirs = ref StringSet.empty in let eventlists = ref [] in for i = 1 to num_eventlists do let orig = input_binary_int ic in let evl = (input_value ic : debug_event list) in (* Relocate events in event list *) List.iter (relocate_event orig) evl; - eventlists := evl :: !eventlists + eventlists := evl :: !eventlists; + dirs := + List.fold_left (fun s e -> StringSet.add e s) !dirs (input_value ic) done; begin try ignore (Bytesections.seek_section ic "CODE") @@ -68,12 +76,13 @@ let read_symbols' bytecode_file = set_launching_function (List.assoc "manual" loading_modes) end; close_in_noerr ic; - !eventlists + !eventlists, !dirs let read_symbols bytecode_file = - let all_events = read_symbols' bytecode_file in + let all_events, all_dirs = read_symbols' bytecode_file in modules := []; events := []; + program_source_dirs := StringSet.elements all_dirs; Hashtbl.clear events_by_pc; Hashtbl.clear events_by_module; Hashtbl.clear all_events_by_module; diff --git a/debugger/symbols.mli b/debugger/symbols.mli index 980892e0..883b81aa 100644 --- a/debugger/symbols.mli +++ b/debugger/symbols.mli @@ -14,6 +14,10 @@ (* Modules used by the program. *) val modules : string list ref +(* Absolute directories containing source code on machine where source was + * compiled *) +val program_source_dirs : string list ref + (* Read debugging info from executable file *) val read_symbols : string -> unit diff --git a/driver/compenv.ml b/driver/compenv.ml index c328e9c4..82704fd8 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -55,7 +55,7 @@ let last_ppx = ref [] let first_objfiles = ref [] let last_objfiles = ref [] -(* Note: this function is duplicated in optcompile.ml *) +(* Check validity of module name *) let check_unit_name ppf filename name = try begin match name.[0] with @@ -76,10 +76,19 @@ let check_unit_name ppf filename name = with Exit -> () ;; - - - - +(* Compute name of module from output file name *) +let module_of_filename ppf inputfile outputprefix = + let basename = Filename.basename outputprefix in + let name = + try + let pos = String.index basename '.' in + String.sub basename 0 pos + with Not_found -> basename + in + let name = String.capitalize name in + check_unit_name ppf inputfile name; + name +;; type readenv_position = @@ -126,6 +135,10 @@ let setter ppf f name options s = (Warnings.Bad_env_variable ("OCAMLPARAM", Printf.sprintf "bad value for %s" name)) +(* 'can-discard=' specifies which arguments can be discarded without warning + because they are not understood by some versions of OCaml. *) +let can_discard = ref [] + let read_OCAMLPARAM ppf position = try let s = Sys.getenv "OCAMLPARAM" in @@ -137,7 +150,6 @@ let read_OCAMLPARAM ppf position = (Warnings.Bad_env_variable ("OCAMLPARAM", s)); [],[] in - let set name options s = setter ppf (fun b -> b) name options s in let clear name options s = setter ppf (fun b -> not b) name options s in List.iter (fun (name, v) -> @@ -155,17 +167,21 @@ let read_OCAMLPARAM ppf position = | "nolabels" -> set "nolabels" [ classic ] v | "principal" -> set "principal" [ principal ] v | "rectypes" -> set "rectypes" [ recursive_types ] v + | "safe-string" -> clear "safe-string" [ unsafe_string ] v | "strict-sequence" -> set "strict-sequence" [ strict_sequence ] v + | "strict-formats" -> set "strict-formats" [ strict_formats ] v | "thread" -> set "thread" [ use_threads ] v | "unsafe" -> set "unsafe" [ fast ] v | "verbose" -> set "verbose" [ verbose ] v | "nopervasives" -> set "nopervasives" [ nopervasives ] v | "slash" -> set "slash" [ force_slash ] v (* for ocamldep *) + | "keep-locs" -> set "keep-locs" [ Clflags.keep_locs ] v | "compact" -> clear "compact" [ optimize_for_speed ] v | "no-app-funct" -> clear "no-app-funct" [ applicative_functors ] v | "nodynlink" -> clear "nodynlink" [ dlcode ] v | "short-paths" -> clear "short-paths" [ real_paths ] v + | "trans-mod" -> set "trans-mod" [ transparent_modules ] v | "pp" -> preprocessor := Some v | "runtime-variant" -> runtime_variant := v @@ -249,10 +265,16 @@ let read_OCAMLPARAM ppf position = first_objfiles := v :: !first_objfiles end + | "can-discard" -> + can_discard := v ::!can_discard + | _ -> - Printf.eprintf + if not (List.mem name !can_discard) then begin + can_discard := name :: !can_discard; + Printf.eprintf "Warning: discarding value of variable %S in OCAMLPARAM\n%!" name + end ) (match position with Before_args -> before | Before_compile | Before_link -> after) diff --git a/driver/compenv.mli b/driver/compenv.mli index d1d64393..85d588ef 100644 --- a/driver/compenv.mli +++ b/driver/compenv.mli @@ -10,7 +10,8 @@ (* *) (***********************************************************************) -val check_unit_name : Format.formatter -> string -> string -> unit +(* val check_unit_name : Format.formatter -> string -> string -> unit *) +val module_of_filename : Format.formatter -> string -> string -> string val output_prefix : string -> string val extract_output : string option -> string diff --git a/driver/compile.ml b/driver/compile.ml index 2e5b405d..3b5d2ae0 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -13,46 +13,39 @@ (* The batch compiler *) open Misc -open Config open Format open Typedtree open Compenv (* Compile a .mli file *) +(* Keep in sync with the copy in optcompile.ml *) + +let tool_name = "ocamlc" + let interface ppf sourcefile outputprefix = - Location.input_name := sourcefile; Compmisc.init_path false; - let modulename = - String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in - check_unit_name ppf sourcefile modulename; + let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; - let inputfile = Pparse.preprocess sourcefile in let initial_env = Compmisc.initial_env () in - try - let ast = - Pparse.file ppf inputfile Parse.interface ast_intf_magic_number in - if !Clflags.dump_parsetree then fprintf ppf "%a@." Printast.interface ast; - if !Clflags.dump_source then fprintf ppf "%a@." Pprintast.signature ast; - let tsg = Typemod.transl_signature initial_env ast in - if !Clflags.dump_typedtree then fprintf ppf "%a@." Printtyped.interface tsg; - let sg = tsg.sig_type in - if !Clflags.print_types then - Printtyp.wrap_printing_env initial_env (fun () -> + let ast = Pparse.parse_interface ~tool_name ppf sourcefile in + if !Clflags.dump_parsetree then fprintf ppf "%a@." Printast.interface ast; + if !Clflags.dump_source then fprintf ppf "%a@." Pprintast.signature ast; + let tsg = Typemod.type_interface initial_env ast in + if !Clflags.dump_typedtree then fprintf ppf "%a@." Printtyped.interface tsg; + let sg = tsg.sig_type in + if !Clflags.print_types then + Printtyp.wrap_printing_env initial_env (fun () -> fprintf std_formatter "%a@." Printtyp.signature (Typemod.simplify_signature sg)); - ignore (Includemod.signatures initial_env sg sg); - Typecore.force_delayed_checks (); - Warnings.check_fatal (); - if not !Clflags.print_types then begin - let sg = Env.save_signature sg modulename (outputprefix ^ ".cmi") in - Typemod.save_signature modulename tsg outputprefix sourcefile - initial_env sg ; - end; - Pparse.remove_preprocessed inputfile - with e -> - Pparse.remove_preprocessed inputfile; - raise e + ignore (Includemod.signatures initial_env sg sg); + Typecore.force_delayed_checks (); + Warnings.check_fatal (); + if not !Clflags.print_types then begin + let sg = Env.save_signature sg modulename (outputprefix ^ ".cmi") in + Typemod.save_signature modulename tsg outputprefix sourcefile + initial_env sg ; + end (* Compile a .ml file *) @@ -63,34 +56,31 @@ let print_if ppf flag printer arg = let (++) x f = f x let implementation ppf sourcefile outputprefix = - Location.input_name := sourcefile; Compmisc.init_path false; - let modulename = - String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in - check_unit_name ppf sourcefile modulename; + let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; - let inputfile = Pparse.preprocess sourcefile in let env = Compmisc.initial_env() in if !Clflags.print_types then begin - try ignore( - Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number + let comp ast = + ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion); + Printtyped.implementation_with_coercion + ++ (fun _ -> ()); Warnings.check_fatal (); - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")); + Stypes.dump (Some (outputprefix ^ ".annot")) + in + try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) with x -> - Pparse.remove_preprocessed inputfile; Stypes.dump (Some (outputprefix ^ ".annot")); raise x end else begin let objfile = outputprefix ^ ".cmo" in let oc = open_out_bin objfile in - try - Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number + let comp ast = + ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env @@ -102,15 +92,15 @@ let implementation ppf sourcefile outputprefix = ++ print_if ppf Clflags.dump_lambda Printlambda.lambda ++ Bytegen.compile_implementation modulename ++ print_if ppf Clflags.dump_instr Printinstr.instrlist - ++ Emitcode.to_file oc modulename; + ++ Emitcode.to_file oc modulename objfile; Warnings.check_fatal (); close_out oc; - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")); + Stypes.dump (Some (outputprefix ^ ".annot")) + in + try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) with x -> close_out oc; remove_file objfile; - Pparse.remove_preprocessed inputfile; Stypes.dump (Some (outputprefix ^ ".annot")); raise x end diff --git a/driver/compmisc.ml b/driver/compmisc.ml index 8f974f4b..a2bc4b83 100644 --- a/driver/compmisc.ml +++ b/driver/compmisc.ml @@ -40,19 +40,21 @@ let init_path native = toplevel initialization (PR#1775) *) let open_implicit_module m env = - try - Env.open_pers_signature m env - with Not_found -> - Misc.fatal_error (Printf.sprintf "cannot open implicit module %S" m) + let open Asttypes in + let lid = {loc = Location.in_file "command line"; + txt = Longident.Lident m } in + snd (Typemod.type_open_ Override env lid.loc lid) let initial_env () = Ident.reinit(); + let initial = + if !Clflags.unsafe_string then Env.initial_unsafe_string + else Env.initial_safe_string + in let env = - if !Clflags.nopervasives - then Env.initial - else - open_implicit_module "Pervasives" Env.initial + if !Clflags.nopervasives then initial else + open_implicit_module "Pervasives" initial in List.fold_left (fun env m -> open_implicit_module m env - ) env !implicit_modules + ) env (!implicit_modules @ List.rev !Clflags.open_modules) diff --git a/driver/errors.ml b/driver/errors.ml index 14a1a23c..bda1a30a 100644 --- a/driver/errors.ml +++ b/driver/errors.ml @@ -10,72 +10,7 @@ (* *) (***********************************************************************) -(* WARNING: if you change something in this file, you must look at - opterrors.ml and ocamldoc/odoc_analyse.ml - to see if you need to make the same changes there. -*) +(* This module should be removed. We keep it for now, to avoid + breaking external tools depending on it. *) -open Format - -(* Report an error *) - -let report_error ppf exn = - let report ppf = function - | Lexer.Error(err, loc) -> - Location.print_error ppf loc; - Lexer.report_error ppf err - | Syntaxerr.Error err -> - Syntaxerr.report_error ppf err - | Pparse.Error err -> - Pparse.report_error ppf err - | Env.Error err -> - Location.print_error_cur_file ppf; - Env.report_error ppf err - | Cmi_format.Error err -> - Location.print_error_cur_file ppf; - Cmi_format.report_error ppf err - | Ctype.Tags(l, l') -> - Location.print_error_cur_file ppf; - fprintf ppf - "In this program,@ variant constructors@ `%s and `%s@ \ - have the same hash value.@ Change one of them." l l' - | Typecore.Error(loc, env, err) -> - Location.print_error ppf loc; Typecore.report_error env ppf err - | Typetexp.Error(loc, env, err) -> - Location.print_error ppf loc; Typetexp.report_error env ppf err - | Typedecl.Error(loc, err) -> - Location.print_error ppf loc; Typedecl.report_error ppf err - | Typeclass.Error(loc, env, err) -> - Location.print_error ppf loc; Typeclass.report_error env ppf err - | Includemod.Error err -> - Location.print_error_cur_file ppf; - Includemod.report_error ppf err - | Typemod.Error(loc, env, err) -> - Location.print_error ppf loc; Typemod.report_error env ppf err - | Translcore.Error(loc, err) -> - Location.print_error ppf loc; Translcore.report_error ppf err - | Translclass.Error(loc, err) -> - Location.print_error ppf loc; Translclass.report_error ppf err - | Translmod.Error(loc, err) -> - Location.print_error ppf loc; Translmod.report_error ppf err - | Symtable.Error code -> - Location.print_error_cur_file ppf; - Symtable.report_error ppf code - | Bytelink.Error code -> - Location.print_error_cur_file ppf; - Bytelink.report_error ppf code - | Bytelibrarian.Error code -> - Location.print_error_cur_file ppf; - Bytelibrarian.report_error ppf code - | Bytepackager.Error code -> - Location.print_error_cur_file ppf; - Bytepackager.report_error ppf code - | Sys_error msg -> - Location.print_error_cur_file ppf; - fprintf ppf "I/O error: %s" msg - | Warnings.Errors (n) -> - Location.print_error_cur_file ppf; - fprintf ppf "Some fatal warnings were triggered (%d occurrences)" n - | x -> fprintf ppf "@]"; raise x in - - fprintf ppf "@[%a@]@." report exn +let report_error = Location.report_exception diff --git a/driver/main.ml b/driver/main.ml index 4ab251c7..f8358a0c 100644 --- a/driver/main.ml +++ b/driver/main.ml @@ -85,22 +85,26 @@ module Options = Main_args.Make_bytecomp_options (struct let _custom = set custom_runtime let _dllib s = dllibs := Misc.rev_split_words s @ !dllibs let _dllpath s = dllpaths := !dllpaths @ [s] + let _for_pack s = for_package := Some s let _g = set debug let _i () = print_types := true; compile_only := true let _I s = include_dirs := s :: !include_dirs let _impl = impl let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_locs = set keep_locs let _labels = unset classic let _linkall = set link_everything let _make_runtime () = custom_runtime := true; make_runtime := true; link_everything := true + let _no_alias_deps = set transparent_modules let _no_app_funct = unset applicative_functors let _noassert = set noassert let _nolabels = set classic let _noautolink = set no_auto_link let _nostdlib = set no_std_include let _o s = output_name := Some s + let _open s = open_modules := s :: !open_modules let _output_obj () = output_c_object := true; custom_runtime := true let _pack = set make_package let _pp s = preprocessor := Some s @@ -108,11 +112,14 @@ module Options = Main_args.Make_bytecomp_options (struct let _principal = set principal let _rectypes = set recursive_types let _runtime_variant s = runtime_variant := s + let _safe_string = unset unsafe_string let _short_paths = unset real_paths let _strict_sequence = set strict_sequence + let _strict_formats = set strict_formats let _thread = set use_threads let _vmthread = set use_vmthreads let _unsafe = set fast + let _unsafe_string = set unsafe_string let _use_prims s = use_prims := s let _use_runtime s = use_runtime := s let _v () = print_version_and_library "compiler" @@ -158,7 +165,8 @@ let main () = Compmisc.init_path false; let extracted_output = extract_output !output_name in let revd = get_objfiles () in - Bytepackager.package_files ppf revd (extracted_output); + Bytepackager.package_files ppf (Compmisc.initial_env ()) + revd (extracted_output); Warnings.check_fatal (); end else if not !compile_only && !objfiles <> [] then begin @@ -184,7 +192,7 @@ let main () = end; exit 0 with x -> - Errors.report_error ppf x; + Location.report_exception ppf x; exit 2 let _ = main () diff --git a/driver/main_args.ml b/driver/main_args.ml index 237e7370..4f9668c7 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -73,9 +73,10 @@ let mk_dtypes f = "-dtypes", Arg.Unit f, " (deprecated) same as -annot" ;; -let mk_for_pack_byt () = - "-for-pack", Arg.String ignore, - " Ignored (for compatibility with ocamlopt)" +let mk_for_pack_byt f = + "-for-pack", Arg.String f, + " Generate code that can later be `packed' with\n\ + \ ocamlc -pack -o .cmo" ;; let mk_for_pack_opt f = @@ -125,6 +126,10 @@ let mk_intf_suffix_2 f = "-intf_suffix", Arg.String f, " (deprecated) same as -intf-suffix" ;; +let mk_keep_locs f = + "-keep-locs", Arg.Unit f, " Keep locations in .cmi files" +;; + let mk_labels f = "-labels", Arg.Unit f, " Use commuting label mode" ;; @@ -146,10 +151,20 @@ let mk_modern f = "-modern", Arg.Unit f, " (deprecated) same as -labels" ;; +let mk_no_alias_deps f = + "-no-alias-deps", Arg.Unit f, + " Do not record dependencies for module aliases" +;; + let mk_no_app_funct f = "-no-app-funct", Arg.Unit f, " Deactivate applicative functors" ;; +let mk_no_float_const_prop f = + "-no-float-const-prop", Arg.Unit f, + " Deactivate constant propagation for floating-point operations" +;; + let mk_noassert f = "-noassert", Arg.Unit f, " Do not compile assertion checks" ;; @@ -169,6 +184,10 @@ let mk_nodynlink f = " Enable optimizations for code that will not be dynlinked" ;; +let mk_noinit f = + "-noinit", Arg.Unit f, + " Do not load any init file" + let mk_nolabels f = "-nolabels", Arg.Unit f, " Ignore non-optional labels in types" ;; @@ -191,6 +210,9 @@ let mk_o f = "-o", Arg.String f, " Set output file name to " ;; +let mk_open f = + "-open", Arg.String f, " Opens the module before typing" + let mk_output_obj f = "-output-obj", Arg.Unit f, " Output a C object file instead of an executable" ;; @@ -235,6 +257,14 @@ let mk_S f = "-S", Arg.Unit f, " Keep intermediate assembly file" ;; +let mk_safe_string f = + "-safe-string", Arg.Unit f, " Make strings immutable" +;; + +let mk_shared f = + "-shared", Arg.Unit f, " Produce a dynlinkable plugin" +;; + let mk_short_paths f = "-short-paths", Arg.Unit f, " Shorten paths in types" ;; @@ -248,10 +278,6 @@ let mk_strict_sequence f = " Left-hand part of a sequence must have type unit" ;; -let mk_shared f = - "-shared", Arg.Unit f, " Produce a dynlinkable plugin" -;; - let mk_thread f = "-thread", Arg.Unit f, " Generate code that supports the system threads library" @@ -262,6 +288,10 @@ let mk_unsafe f = " Do not compile bounds checking on array and string access" ;; +let mk_unsafe_string f = + "-unsafe-string", Arg.Unit f, " Make strings mutable (default)" +;; + let mk_use_runtime f = "-use-runtime", Arg.String f, " Generate bytecode for the given runtime system" @@ -373,6 +403,10 @@ let mk_dcombine f = "-dcombine", Arg.Unit f, " (undocumented)" ;; +let mk_dcse f = + "-dcse", Arg.Unit f, " (undocumented)" +;; + let mk_dlive f = "-dlive", Arg.Unit f, " (undocumented)" ;; @@ -413,219 +447,131 @@ let mk_dstartup f = "-dstartup", Arg.Unit f, " (undocumented)" ;; +let mk_opaque f = + "-opaque", Arg.Unit f, + " Does not generate cross-module optimization information\n\ + \ (reduces necessary recompilation on module change)" +;; + +let mk_strict_formats f = + "-strict-formats", Arg.Unit f, + " Reject invalid formats accepted by legacy implementations\n\ + \ (Warning: Invalid formats may behave differently from\n\ + \ previous OCaml versions, and will become always-rejected\n\ + \ in future OCaml versions. You should use this flag\n\ + \ to detect and fix invalid formats.)" +;; + let mk__ f = "-", Arg.String f, " Treat as a file name (even if it starts with `-')" ;; -module type Bytecomp_options = sig - val _a : unit -> unit +module type Common_options = sig val _absname : unit -> unit - val _annot : unit -> unit - val _binannot : unit -> unit - val _c : unit -> unit - val _cc : string -> unit - val _cclib : string -> unit - val _ccopt : string -> unit - val _compat_32 : unit -> unit - val _config : unit -> unit - val _custom : unit -> unit - val _dllib : string -> unit - val _dllpath : string -> unit - val _g : unit -> unit - val _i : unit -> unit val _I : string -> unit - val _impl : string -> unit - val _intf : string -> unit - val _intf_suffix : string -> unit val _labels : unit -> unit - val _linkall : unit -> unit - val _make_runtime : unit -> unit + val _no_alias_deps : unit -> unit val _no_app_funct : unit -> unit val _noassert : unit -> unit - val _noautolink : unit -> unit val _nolabels : unit -> unit val _nostdlib : unit -> unit - val _o : string -> unit - val _output_obj : unit -> unit - val _pack : unit -> unit - val _pp : string -> unit + val _open : string -> unit val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit - val _runtime_variant : string -> unit + val _safe_string : unit -> unit val _short_paths : unit -> unit val _strict_sequence : unit -> unit - val _thread : unit -> unit - val _vmthread : unit -> unit + val _strict_formats : unit -> unit val _unsafe : unit -> unit - val _use_runtime : string -> unit - val _v : unit -> unit + val _unsafe_string : unit -> unit val _version : unit -> unit val _vnum : unit -> unit - val _verbose : unit -> unit val _w : string -> unit val _warn_error : string -> unit val _warn_help : unit -> unit - val _where : unit -> unit - val _nopervasives : unit -> unit - val _use_prims : string -> unit val _dsource : unit -> unit val _dparsetree : unit -> unit val _dtypedtree : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit - val _dinstr : unit -> unit val anonymous : string -> unit end;; -module type Bytetop_options = sig - val _absname : unit -> unit - val _I : string -> unit - val _init : string -> unit - val _labels : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit - val _nolabels : unit -> unit - val _noprompt : unit -> unit - val _nopromptcont : unit -> unit - val _nostdlib : unit -> unit - val _ppx : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _short_paths : unit -> unit - val _stdin: unit -> unit - val _strict_sequence : unit -> unit - val _unsafe : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit - - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dinstr : unit -> unit - - val anonymous : string -> unit -end;; - -module type Optcomp_options = sig +module type Compiler_options = sig val _a : unit -> unit - val _absname : unit -> unit val _annot : unit -> unit val _binannot : unit -> unit val _c : unit -> unit val _cc : string -> unit val _cclib : string -> unit val _ccopt : string -> unit - val _compact : unit -> unit val _config : unit -> unit val _for_pack : string -> unit val _g : unit -> unit val _i : unit -> unit - val _I : string -> unit val _impl : string -> unit - val _inline : int -> unit val _intf : string -> unit val _intf_suffix : string -> unit - val _labels : unit -> unit + val _keep_locs : unit -> unit val _linkall : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit val _noautolink : unit -> unit - val _nodynlink : unit -> unit - val _nolabels : unit -> unit - val _nostdlib : unit -> unit val _o : string -> unit val _output_obj : unit -> unit - val _p : unit -> unit val _pack : unit -> unit val _pp : string -> unit - val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit val _runtime_variant : string -> unit - val _S : unit -> unit - val _shared : unit -> unit + val _safe_string : unit -> unit val _short_paths : unit -> unit - val _strict_sequence : unit -> unit val _thread : unit -> unit - val _unsafe : unit -> unit val _v : unit -> unit val _verbose : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit val _where : unit -> unit - val _nopervasives : unit -> unit - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dclambda : unit -> unit - val _dcmm : unit -> unit - val _dsel : unit -> unit - val _dcombine : unit -> unit - val _dlive : unit -> unit - val _dspill : unit -> unit - val _dsplit : unit -> unit - val _dinterf : unit -> unit - val _dprefer : unit -> unit - val _dalloc : unit -> unit - val _dreload : unit -> unit - val _dscheduling : unit -> unit - val _dlinear : unit -> unit - val _dstartup : unit -> unit +end +;; - val anonymous : string -> unit +module type Bytecomp_options = sig + include Common_options + include Compiler_options + val _compat_32 : unit -> unit + val _custom : unit -> unit + val _dllib : string -> unit + val _dllpath : string -> unit + val _make_runtime : unit -> unit + val _vmthread : unit -> unit + val _use_runtime : string -> unit + + val _dinstr : unit -> unit + + val _use_prims : string -> unit end;; -module type Opttop_options = sig - val _absname : unit -> unit - val _compact : unit -> unit - val _I : string -> unit +module type Bytetop_options = sig + include Common_options val _init : string -> unit - val _inline : int -> unit - val _labels : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit - val _nolabels : unit -> unit + val _noinit : unit -> unit val _noprompt : unit -> unit val _nopromptcont : unit -> unit - val _nostdlib : unit -> unit - val _ppx : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _S : unit -> unit - val _short_paths : unit -> unit val _stdin : unit -> unit - val _strict_sequence : unit -> unit - val _unsafe : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit + val _dinstr : unit -> unit +end;; + +module type Optcommon_options = sig + val _compact : unit -> unit + val _inline : int -> unit + val _dclambda : unit -> unit val _dcmm : unit -> unit val _dsel : unit -> unit val _dcombine : unit -> unit + val _dcse : unit -> unit val _dlive : unit -> unit val _dspill : unit -> unit val _dsplit : unit -> unit @@ -636,8 +582,30 @@ module type Opttop_options = sig val _dscheduling : unit -> unit val _dlinear : unit -> unit val _dstartup : unit -> unit +end;; - val anonymous : string -> unit +module type Optcomp_options = sig + include Common_options + include Compiler_options + include Optcommon_options + val _no_float_const_prop : unit -> unit + val _nodynlink : unit -> unit + val _p : unit -> unit + val _pp : string -> unit + val _S : unit -> unit + val _shared : unit -> unit + val _opaque : unit -> unit +end;; + +module type Opttop_options = sig + include Common_options + include Optcommon_options + val _init : string -> unit + val _noinit : unit -> unit + val _noprompt : unit -> unit + val _nopromptcont : unit -> unit + val _S : unit -> unit + val _stdin : unit -> unit end;; module type Arg_list = sig @@ -661,7 +629,7 @@ struct mk_dllib F._dllib; mk_dllpath F._dllpath; mk_dtypes F._annot; - mk_for_pack_byt (); + mk_for_pack_byt F._for_pack; mk_g_byt F._g; mk_i F._i; mk_I F._I; @@ -669,17 +637,20 @@ struct mk_intf F._intf; mk_intf_suffix F._intf_suffix; mk_intf_suffix_2 F._intf_suffix; + mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; mk_make_runtime F._make_runtime; mk_make_runtime_2 F._make_runtime; mk_modern F._labels; + mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; mk_noassert F._noassert; mk_noautolink_byt F._noautolink; mk_nolabels F._nolabels; mk_nostdlib F._nostdlib; mk_o F._o; + mk_open F._open; mk_output_obj F._output_obj; mk_pack_byt F._pack; mk_pp F._pp; @@ -687,10 +658,13 @@ struct mk_principal F._principal; mk_rectypes F._rectypes; mk_runtime_variant F._runtime_variant; + mk_safe_string F._safe_string; mk_short_paths F._short_paths; mk_strict_sequence F._strict_sequence; + mk_strict_formats F._strict_formats; mk_thread F._thread; mk_unsafe F._unsafe; + mk_unsafe_string F._unsafe_string; mk_use_runtime F._use_runtime; mk_use_runtime_2 F._use_runtime; mk_v F._v; @@ -702,6 +676,7 @@ struct mk_warn_error F._warn_error; mk_warn_help F._warn_help; mk_where F._where; + mk__ F.anonymous; mk_nopervasives F._nopervasives; mk_use_prims F._use_prims; @@ -711,8 +686,6 @@ struct mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_dinstr F._dinstr; - - mk__ F.anonymous; ] end;; @@ -723,24 +696,31 @@ struct mk_I F._I; mk_init F._init; mk_labels F._labels; + mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; mk_noassert F._noassert; + mk_noinit F._noinit; mk_nolabels F._nolabels; mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; + mk_open F._open; mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; + mk_safe_string F._safe_string; mk_short_paths F._short_paths; mk_stdin F._stdin; mk_strict_sequence F._strict_sequence; + mk_strict_formats F._strict_formats; mk_unsafe F._unsafe; + mk_unsafe_string F._unsafe_string; mk_version F._version; mk_vnum F._vnum; mk_w F._w; mk_warn_error F._warn_error; mk_warn_help F._warn_help; + mk__ F.anonymous; mk_dsource F._dsource; mk_dparsetree F._dparsetree; @@ -748,8 +728,6 @@ struct mk_drawlambda F._drawlambda; mk_dlambda F._dlambda; mk_dinstr F._dinstr; - - mk__ F.anonymous; ] end;; @@ -775,15 +753,19 @@ struct mk_inline F._inline; mk_intf F._intf; mk_intf_suffix F._intf_suffix; + mk_keep_locs F._keep_locs; mk_labels F._labels; mk_linkall F._linkall; + mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; + mk_no_float_const_prop F._no_float_const_prop; mk_noassert F._noassert; mk_noautolink_opt F._noautolink; mk_nodynlink F._nodynlink; mk_nolabels F._nolabels; mk_nostdlib F._nostdlib; mk_o F._o; + mk_open F._open; mk_output_obj F._output_obj; mk_p F._p; mk_pack_opt F._pack; @@ -793,11 +775,14 @@ struct mk_rectypes F._rectypes; mk_runtime_variant F._runtime_variant; mk_S F._S; + mk_safe_string F._safe_string; mk_shared F._shared; mk_short_paths F._short_paths; mk_strict_sequence F._strict_sequence; + mk_strict_formats F._strict_formats; mk_thread F._thread; mk_unsafe F._unsafe; + mk_unsafe_string F._unsafe_string; mk_v F._v; mk_verbose F._verbose; mk_version F._version; @@ -806,6 +791,7 @@ struct mk_warn_error F._warn_error; mk_warn_help F._warn_help; mk_where F._where; + mk__ F.anonymous; mk_nopervasives F._nopervasives; mk_dsource F._dsource; @@ -817,6 +803,7 @@ struct mk_dcmm F._dcmm; mk_dsel F._dsel; mk_dcombine F._dcombine; + mk_dcse F._dcse; mk_dlive F._dlive; mk_dspill F._dspill; mk_dsplit F._dsplit; @@ -827,8 +814,7 @@ struct mk_dscheduling F._dscheduling; mk_dlinear F._dlinear; mk_dstartup F._dstartup; - - mk__ F.anonymous; + mk_opaque F._opaque; ] end;; @@ -840,25 +826,32 @@ module Make_opttop_options (F : Opttop_options) = struct mk_init F._init; mk_inline F._inline; mk_labels F._labels; + mk_no_alias_deps F._no_alias_deps; mk_no_app_funct F._no_app_funct; mk_noassert F._noassert; + mk_noinit F._noinit; mk_nolabels F._nolabels; mk_noprompt F._noprompt; mk_nopromptcont F._nopromptcont; mk_nostdlib F._nostdlib; + mk_open F._open; mk_ppx F._ppx; mk_principal F._principal; mk_rectypes F._rectypes; mk_S F._S; + mk_safe_string F._safe_string; mk_short_paths F._short_paths; mk_stdin F._stdin; mk_strict_sequence F._strict_sequence; + mk_strict_formats F._strict_formats; mk_unsafe F._unsafe; + mk_unsafe_string F._unsafe_string; mk_version F._version; mk_vnum F._vnum; mk_w F._w; mk_warn_error F._warn_error; mk_warn_help F._warn_help; + mk__ F.anonymous; mk_dsource F._dsource; mk_dparsetree F._dparsetree; @@ -868,6 +861,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dcmm F._dcmm; mk_dsel F._dsel; mk_dcombine F._dcombine; + mk_dcse F._dcse; mk_dlive F._dlive; mk_dspill F._dspill; mk_dsplit F._dsplit; @@ -878,7 +872,5 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dscheduling F._dscheduling; mk_dlinear F._dlinear; mk_dstartup F._dstartup; - - mk__ F.anonymous; ] end;; diff --git a/driver/main_args.mli b/driver/main_args.mli index 53647236..95b7c69e 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -10,89 +10,25 @@ (* *) (***********************************************************************) -module type Bytecomp_options = - sig - val _a : unit -> unit - val _absname : unit -> unit - val _annot : unit -> unit - val _binannot : unit -> unit - val _c : unit -> unit - val _cc : string -> unit - val _cclib : string -> unit - val _ccopt : string -> unit - val _compat_32 : unit -> unit - val _config : unit -> unit - val _custom : unit -> unit - val _dllib : string -> unit - val _dllpath : string -> unit - val _g : unit -> unit - val _i : unit -> unit - val _I : string -> unit - val _impl : string -> unit - val _intf : string -> unit - val _intf_suffix : string -> unit - val _labels : unit -> unit - val _linkall : unit -> unit - val _make_runtime : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit - val _noautolink : unit -> unit - val _nolabels : unit -> unit - val _nostdlib : unit -> unit - val _o : string -> unit - val _output_obj : unit -> unit - val _pack : unit -> unit - val _pp : string -> unit - val _ppx : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _runtime_variant : string -> unit - val _short_paths : unit -> unit - val _strict_sequence : unit -> unit - val _thread : unit -> unit - val _vmthread : unit -> unit - val _unsafe : unit -> unit - val _use_runtime : string -> unit - val _v : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _verbose : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit - val _where : unit -> unit - - val _nopervasives : unit -> unit - val _use_prims : string -> unit - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dinstr : unit -> unit - - val anonymous : string -> unit - end -;; - -module type Bytetop_options = sig +module type Common_options = sig val _absname : unit -> unit val _I : string -> unit - val _init : string -> unit val _labels : unit -> unit + val _no_alias_deps : unit -> unit val _no_app_funct : unit -> unit val _noassert : unit -> unit val _nolabels : unit -> unit - val _noprompt : unit -> unit - val _nopromptcont : unit -> unit val _nostdlib : unit -> unit + val _open : string -> unit val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit + val _safe_string : unit -> unit val _short_paths : unit -> unit - val _stdin : unit -> unit val _strict_sequence : unit -> unit + val _strict_formats : unit -> unit val _unsafe : unit -> unit + val _unsafe_string : unit -> unit val _version : unit -> unit val _vnum : unit -> unit val _w : string -> unit @@ -104,122 +40,82 @@ module type Bytetop_options = sig val _dtypedtree : unit -> unit val _drawlambda : unit -> unit val _dlambda : unit -> unit - val _dinstr : unit -> unit val anonymous : string -> unit -end;; +end -module type Optcomp_options = sig +module type Compiler_options = sig val _a : unit -> unit - val _absname : unit -> unit val _annot : unit -> unit val _binannot : unit -> unit val _c : unit -> unit val _cc : string -> unit val _cclib : string -> unit val _ccopt : string -> unit - val _compact : unit -> unit val _config : unit -> unit val _for_pack : string -> unit val _g : unit -> unit val _i : unit -> unit - val _I : string -> unit val _impl : string -> unit - val _inline : int -> unit val _intf : string -> unit val _intf_suffix : string -> unit - val _labels : unit -> unit + val _keep_locs : unit -> unit val _linkall : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit val _noautolink : unit -> unit - val _nodynlink : unit -> unit - val _nolabels : unit -> unit - val _nostdlib : unit -> unit val _o : string -> unit val _output_obj : unit -> unit - val _p : unit -> unit val _pack : unit -> unit val _pp : string -> unit - val _ppx : string -> unit val _principal : unit -> unit val _rectypes : unit -> unit val _runtime_variant : string -> unit - val _S : unit -> unit - val _shared : unit -> unit + val _safe_string : unit -> unit val _short_paths : unit -> unit - val _strict_sequence : unit -> unit val _thread : unit -> unit - val _unsafe : unit -> unit val _v : unit -> unit val _verbose : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit val _where : unit -> unit val _nopervasives : unit -> unit - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit - val _dclambda : unit -> unit - val _dcmm : unit -> unit - val _dsel : unit -> unit - val _dcombine : unit -> unit - val _dlive : unit -> unit - val _dspill : unit -> unit - val _dsplit : unit -> unit - val _dinterf : unit -> unit - val _dprefer : unit -> unit - val _dalloc : unit -> unit - val _dreload : unit -> unit - val _dscheduling : unit -> unit - val _dlinear : unit -> unit - val _dstartup : unit -> unit +end +;; - val anonymous : string -> unit +module type Bytecomp_options = sig + include Common_options + include Compiler_options + val _compat_32 : unit -> unit + val _custom : unit -> unit + val _dllib : string -> unit + val _dllpath : string -> unit + val _make_runtime : unit -> unit + val _vmthread : unit -> unit + val _use_runtime : string -> unit + + val _dinstr : unit -> unit + + val _use_prims : string -> unit end;; -module type Opttop_options = sig - val _absname : unit -> unit - val _compact : unit -> unit - val _I : string -> unit +module type Bytetop_options = sig + include Common_options val _init : string -> unit - val _inline : int -> unit - val _labels : unit -> unit - val _no_app_funct : unit -> unit - val _noassert : unit -> unit - val _nolabels : unit -> unit + val _noinit : unit -> unit val _noprompt : unit -> unit val _nopromptcont : unit -> unit - val _nostdlib : unit -> unit - val _ppx : string -> unit - val _principal : unit -> unit - val _rectypes : unit -> unit - val _S : unit -> unit - val _short_paths : unit -> unit val _stdin : unit -> unit - val _strict_sequence : unit -> unit - val _unsafe : unit -> unit - val _version : unit -> unit - val _vnum : unit -> unit - val _w : string -> unit - val _warn_error : string -> unit - val _warn_help : unit -> unit - val _dsource : unit -> unit - val _dparsetree : unit -> unit - val _dtypedtree : unit -> unit - val _drawlambda : unit -> unit - val _dlambda : unit -> unit + val _dinstr : unit -> unit +end;; + +module type Optcommon_options = sig + val _compact : unit -> unit + val _inline : int -> unit + val _dclambda : unit -> unit val _dcmm : unit -> unit val _dsel : unit -> unit val _dcombine : unit -> unit + val _dcse : unit -> unit val _dlive : unit -> unit val _dspill : unit -> unit val _dsplit : unit -> unit @@ -230,8 +126,30 @@ module type Opttop_options = sig val _dscheduling : unit -> unit val _dlinear : unit -> unit val _dstartup : unit -> unit +end;; - val anonymous : string -> unit +module type Optcomp_options = sig + include Common_options + include Compiler_options + include Optcommon_options + val _no_float_const_prop : unit -> unit + val _nodynlink : unit -> unit + val _p : unit -> unit + val _pp : string -> unit + val _S : unit -> unit + val _shared : unit -> unit + val _opaque : unit -> unit +end;; + +module type Opttop_options = sig + include Common_options + include Optcommon_options + val _init : string -> unit + val _noinit : unit -> unit + val _noprompt : unit -> unit + val _nopromptcont : unit -> unit + val _S : unit -> unit + val _stdin : unit -> unit end;; module type Arg_list = sig diff --git a/driver/optcompile.ml b/driver/optcompile.ml index ebe2457c..f0ef78d1 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -20,40 +20,33 @@ open Compenv (* Compile a .mli file *) +(* Keep in sync with the copy in compile.ml *) + +let tool_name = "ocamlopt" + let interface ppf sourcefile outputprefix = - Location.input_name := sourcefile; - Compmisc.init_path true; - let modulename = - String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in - check_unit_name ppf sourcefile modulename; + Compmisc.init_path false; + let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; - let inputfile = Pparse.preprocess sourcefile in - let initial_env = Compmisc.initial_env() in - try - let ast = - Pparse.file ppf inputfile Parse.interface ast_intf_magic_number in - if !Clflags.dump_parsetree then fprintf ppf "%a@." Printast.interface ast; - if !Clflags.dump_source then fprintf ppf "%a@." Pprintast.signature ast; - let tsg = Typemod.transl_signature initial_env ast in - if !Clflags.dump_typedtree then fprintf ppf "%a@." Printtyped.interface tsg; - let sg = tsg.sig_type in - if !Clflags.print_types then - fprintf std_formatter "%a@." Printtyp.signature - (Typemod.simplify_signature sg); - ignore (Includemod.signatures initial_env sg sg); - Typecore.force_delayed_checks (); - Warnings.check_fatal (); - if not !Clflags.print_types then begin - let sg = Env.save_signature sg modulename (outputprefix ^ ".cmi") in - Typemod.save_signature modulename tsg outputprefix sourcefile - initial_env sg ; - end; - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")) - with e -> - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")); - raise e + let initial_env = Compmisc.initial_env () in + let ast = Pparse.parse_interface ~tool_name ppf sourcefile in + if !Clflags.dump_parsetree then fprintf ppf "%a@." Printast.interface ast; + if !Clflags.dump_source then fprintf ppf "%a@." Pprintast.signature ast; + let tsg = Typemod.type_interface initial_env ast in + if !Clflags.dump_typedtree then fprintf ppf "%a@." Printtyped.interface tsg; + let sg = tsg.sig_type in + if !Clflags.print_types then + Printtyp.wrap_printing_env initial_env (fun () -> + fprintf std_formatter "%a@." + Printtyp.signature (Typemod.simplify_signature sg)); + ignore (Includemod.signatures initial_env sg sg); + Typecore.force_delayed_checks (); + Warnings.check_fatal (); + if not !Clflags.print_types then begin + let sg = Env.save_signature sg modulename (outputprefix ^ ".cmi") in + Typemod.save_signature modulename tsg outputprefix sourcefile + initial_env sg ; + end (* Compile a .ml file *) @@ -65,32 +58,30 @@ let (++) x f = f x let (+++) (x, y) f = (x, f y) let implementation ppf sourcefile outputprefix = - Location.input_name := sourcefile; Compmisc.init_path true; - let modulename = - String.capitalize(Filename.basename(chop_extension_if_any sourcefile)) in - check_unit_name ppf sourcefile modulename; + let modulename = module_of_filename ppf sourcefile outputprefix in Env.set_unit_name modulename; - let inputfile = Pparse.preprocess sourcefile in let env = Compmisc.initial_env() in Compilenv.reset ?packname:!Clflags.for_package modulename; let cmxfile = outputprefix ^ ".cmx" in let objfile = outputprefix ^ ext_obj in - try - if !Clflags.print_types then ignore begin - Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number + let comp ast = + if !Clflags.print_types + then + ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion - end else begin - Pparse.file ppf inputfile Parse.implementation ast_impl_magic_number + Printtyped.implementation_with_coercion + ++ (fun _ -> ()) + else begin + ast ++ print_if ppf Clflags.dump_parsetree Printast.implementation ++ print_if ppf Clflags.dump_source Pprintast.structure ++ Typemod.type_implementation sourcefile outputprefix modulename env ++ print_if ppf Clflags.dump_typedtree - Printtyped.implementation_with_coercion + Printtyped.implementation_with_coercion ++ Translmod.transl_store_implementation modulename +++ print_if ppf Clflags.dump_rawlambda Printlambda.lambda +++ Simplif.simplify_lambda @@ -99,13 +90,13 @@ let implementation ppf sourcefile outputprefix = Compilenv.save_unit_info cmxfile; end; Warnings.check_fatal (); - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")); + Stypes.dump (Some (outputprefix ^ ".annot")) + in + try comp (Pparse.parse_implementation ~tool_name ppf sourcefile) with x -> + Stypes.dump (Some (outputprefix ^ ".annot")); remove_file objfile; remove_file cmxfile; - Pparse.remove_preprocessed inputfile; - Stypes.dump (Some (outputprefix ^ ".annot")); raise x let c_file name = diff --git a/driver/opterrors.ml b/driver/opterrors.ml index 56660cdb..bda1a30a 100644 --- a/driver/opterrors.ml +++ b/driver/opterrors.ml @@ -10,74 +10,7 @@ (* *) (***********************************************************************) -(* WARNING: if you change something in this file, you must look at - errors.ml to see if you need to make the same changes there. -*) +(* This module should be removed. We keep it for now, to avoid + breaking external tools depending on it. *) -open Format - -(* Report an error *) - -let report_error ppf exn = - let report ppf = function - | Lexer.Error(err, l) -> - Location.print_error ppf l; - Lexer.report_error ppf err - | Syntaxerr.Error err -> - Syntaxerr.report_error ppf err - | Pparse.Error err -> - Pparse.report_error ppf err - | Env.Error err -> - Location.print_error_cur_file ppf; - Env.report_error ppf err - | Cmi_format.Error err -> - Location.print_error_cur_file ppf; - Cmi_format.report_error ppf err - | Ctype.Tags(l, l') -> - Location.print_error_cur_file ppf; - fprintf ppf - "In this program,@ variant constructors@ `%s and `%s@ \ - have the same hash value.@ Change one of them." l l' - | Typecore.Error(loc, env, err) -> - Location.print_error ppf loc; Typecore.report_error env ppf err - | Typetexp.Error(loc, env, err) -> - Location.print_error ppf loc; Typetexp.report_error env ppf err - | Typedecl.Error(loc, err) -> - Location.print_error ppf loc; Typedecl.report_error ppf err - | Typeclass.Error(loc, env, err) -> - Location.print_error ppf loc; Typeclass.report_error env ppf err - | Includemod.Error err -> - Location.print_error_cur_file ppf; - Includemod.report_error ppf err - | Typemod.Error(loc, env, err) -> - Location.print_error ppf loc; Typemod.report_error env ppf err - | Translcore.Error(loc, err) -> - Location.print_error ppf loc; Translcore.report_error ppf err - | Translclass.Error(loc, err) -> - Location.print_error ppf loc; Translclass.report_error ppf err - | Translmod.Error(loc, err) -> - Location.print_error ppf loc; Translmod.report_error ppf err - | Compilenv.Error code -> - Location.print_error_cur_file ppf; - Compilenv.report_error ppf code - | Asmgen.Error code -> - Location.print_error_cur_file ppf; - Asmgen.report_error ppf code - | Asmlink.Error code -> - Location.print_error_cur_file ppf; - Asmlink.report_error ppf code - | Asmlibrarian.Error code -> - Location.print_error_cur_file ppf; - Asmlibrarian.report_error ppf code - | Asmpackager.Error code -> - Location.print_error_cur_file ppf; - Asmpackager.report_error ppf code - | Sys_error msg -> - Location.print_error_cur_file ppf; - fprintf ppf "I/O error: %s" msg - | Warnings.Errors (n) -> - Location.print_error_cur_file ppf; - fprintf ppf "Some fatal warnings were triggered (%d occurrences)" n - | x -> fprintf ppf "@]"; raise x in - - fprintf ppf "@[%a@]@." report exn +let report_error = Location.report_exception diff --git a/driver/optmain.ml b/driver/optmain.ml index 45bdec24..947d4307 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -90,15 +90,19 @@ module Options = Main_args.Make_optcomp_options (struct let _inline n = inline_threshold := n * 8 let _intf = intf let _intf_suffix s = Config.interface_suffix := s + let _keep_locs = set keep_locs let _labels = clear classic let _linkall = set link_everything + let _no_alias_deps = set transparent_modules let _no_app_funct = clear applicative_functors + let _no_float_const_prop = clear float_const_prop let _noassert = set noassert let _noautolink = set no_auto_link let _nodynlink = clear dlcode let _nolabels = set classic let _nostdlib = set no_std_include let _o s = output_name := Some s + let _open s = open_modules := s :: !open_modules let _output_obj = set output_c_object let _p = set gprofile let _pack = set make_package @@ -107,12 +111,15 @@ module Options = Main_args.Make_optcomp_options (struct let _principal = set principal let _rectypes = set recursive_types let _runtime_variant s = runtime_variant := s + let _safe_string = clear unsafe_string let _short_paths = clear real_paths let _strict_sequence = set strict_sequence + let _strict_formats = set strict_formats let _shared () = shared := true; dlcode := true let _S = set keep_asm_file let _thread = set use_threads let _unsafe = set fast + let _unsafe_string = set unsafe_string let _v () = print_version_and_library "native-code compiler" let _version () = print_version_string () let _vnum () = print_version_string () @@ -132,6 +139,7 @@ module Options = Main_args.Make_optcomp_options (struct let _dcmm = set dump_cmm let _dsel = set dump_selection let _dcombine = set dump_combine + let _dcse = set dump_cse let _dlive () = dump_live := true; Printmach.print_live := true let _dspill = set dump_spill let _dsplit = set dump_split @@ -142,6 +150,7 @@ module Options = Main_args.Make_optcomp_options (struct let _dscheduling = set dump_scheduling let _dlinear = set dump_linear let _dstartup = set keep_startup_file + let _opaque = set opaque let anonymous = anonymous end);; @@ -170,7 +179,8 @@ let main () = else if !make_package then begin Compmisc.init_path true; let target = extract_output !output_name in - Asmpackager.package_files ppf (get_objfiles ()) target; + Asmpackager.package_files ppf (Compmisc.initial_env ()) + (get_objfiles ()) target; Warnings.check_fatal (); end else if !shared then begin @@ -201,7 +211,7 @@ let main () = end; exit 0 with x -> - Opterrors.report_error ppf x; - exit 2 + Location.report_exception ppf x; + exit 2 let _ = main () diff --git a/driver/pparse.ml b/driver/pparse.ml index 57b564f0..08b9bc73 100644 --- a/driver/pparse.ml +++ b/driver/pparse.ml @@ -59,11 +59,12 @@ let apply_rewriter magic fn_in ppx = Misc.remove_file fn_out; raise (Error (CannotRun comm)); end; - if not (Sys.file_exists fn_out) then raise (Error (WrongMagic comm)); + if not (Sys.file_exists fn_out) then + raise (Error (WrongMagic comm)); (* check magic before passing to the next ppx *) let ic = open_in_bin fn_out in let buffer = - try Misc.input_bytes ic (String.length magic) with End_of_file -> "" in + try really_input_string ic (String.length magic) with End_of_file -> "" in close_in ic; if buffer <> magic then begin Misc.remove_file fn_out; @@ -74,7 +75,7 @@ let apply_rewriter magic fn_in ppx = let read_ast magic fn = let ic = open_in_bin fn in try - let buffer = Misc.input_bytes ic (String.length magic) in + let buffer = really_input_string ic (String.length magic) in assert(buffer = magic); (* already checked by apply_rewriter *) Location.input_name := input_value ic; let ast = input_value ic in @@ -86,23 +87,51 @@ let read_ast magic fn = Misc.remove_file fn; raise exn -let apply_rewriters magic ast = +let apply_rewriters ~tool_name magic ast = + let ctx = Ast_mapper.ppx_context ~tool_name () in match !Clflags.all_ppx with | [] -> ast | ppxs -> + let ast = + if magic = Config.ast_impl_magic_number + then Obj.magic (Ast_helper.Str.attribute ctx :: (Obj.magic ast)) + else Obj.magic (Ast_helper.Sig.attribute ctx :: (Obj.magic ast)) + in let fn = - List.fold_left (apply_rewriter magic) (write_ast magic ast) ppxs in - read_ast magic fn + List.fold_left (apply_rewriter magic) (write_ast magic ast) + (List.rev ppxs) + in + let ast = read_ast magic fn in + let open Parsetree in + if magic = Config.ast_impl_magic_number then + let ast = + match Obj.magic ast with + | {pstr_desc = Pstr_attribute({Location.txt = "ocaml.ppx.context"}, _)} + :: items -> + items + | items -> items + in + Obj.magic ast + else + let ast = + match Obj.magic ast with + | {psig_desc = Psig_attribute({Location.txt = "ocaml.ppx.context"}, _)} + :: items -> + items + | items -> items + in + Obj.magic ast + (* Parse a file or get a dumped syntax tree from it *) exception Outdated_version -let file ppf inputfile parse_fun ast_magic = +let file ppf ~tool_name inputfile parse_fun ast_magic = let ic = open_in_bin inputfile in let is_ast_file = try - let buffer = Misc.input_bytes ic (String.length ast_magic) in + let buffer = really_input_string ic (String.length ast_magic) in if buffer = ast_magic then true else if String.sub buffer 0 9 = String.sub ast_magic 0 9 then raise Outdated_version @@ -131,7 +160,7 @@ let file ppf inputfile parse_fun ast_magic = with x -> close_in ic; raise x in close_in ic; - apply_rewriters ast_magic ast + apply_rewriters ~tool_name ast_magic ast let report_error ppf = function | CannotRun cmd -> @@ -140,3 +169,29 @@ let report_error ppf = function | WrongMagic cmd -> fprintf ppf "External preprocessor does not produce a valid file@.\ Command line: %s@." cmd + +let () = + Location.register_error_of_exn + (function + | Error err -> Some (Location.error_of_printer_file report_error err) + | _ -> None + ) + +let parse_all ~tool_name parse_fun magic ppf sourcefile = + Location.input_name := sourcefile; + let inputfile = preprocess sourcefile in + let ast = + try file ppf ~tool_name inputfile parse_fun magic + with exn -> + remove_preprocessed inputfile; + raise exn + in + remove_preprocessed inputfile; + ast + +let parse_implementation ppf ~tool_name sourcefile = + parse_all ~tool_name Parse.implementation + Config.ast_impl_magic_number ppf sourcefile +let parse_interface ppf ~tool_name sourcefile = + parse_all ~tool_name Parse.interface + Config.ast_intf_magic_number ppf sourcefile diff --git a/driver/pparse.mli b/driver/pparse.mli index 43e3d5f8..d45adf91 100644 --- a/driver/pparse.mli +++ b/driver/pparse.mli @@ -20,6 +20,10 @@ exception Error of error val preprocess : string -> string val remove_preprocessed : string -> unit -val file : formatter -> string -> (Lexing.lexbuf -> 'a) -> string -> 'a -val apply_rewriters : string -> 'a -> 'a +val file : formatter -> tool_name:string -> string -> (Lexing.lexbuf -> 'a) -> string -> 'a +val apply_rewriters : tool_name:string -> string -> 'a -> 'a val report_error : formatter -> error -> unit + + +val parse_implementation: formatter -> tool_name:string -> string -> Parsetree.structure +val parse_interface: formatter -> tool_name:string -> string -> Parsetree.signature diff --git a/lex/Makefile b/lex/Makefile index debad6e6..cb5df8b4 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -13,7 +13,7 @@ # The lexer generator CAMLC=../boot/ocamlrun ../boot/ocamlc -strict-sequence -nostdlib -I ../boot CAMLOPT=../boot/ocamlrun ../ocamlopt -nostdlib -I ../stdlib -COMPFLAGS=-w +33..39 -warn-error A +COMPFLAGS=-w +33..39 -warn-error A -bin-annot -safe-string CAMLYACC=../boot/ocamlyacc YACCFLAGS=-v CAMLLEX=../boot/ocamlrun ../boot/ocamllex @@ -34,7 +34,7 @@ ocamllex.opt: $(OBJS:.cmo=.cmx) clean:: rm -f ocamllex ocamllex.opt - rm -f *.cmo *.cmi *.cmx *.o *~ + rm -f *.cmo *.cmi *.cmx *.cmt *.cmti *.o *~ parser.ml parser.mli: parser.mly $(CAMLYACC) $(YACCFLAGS) parser.mly diff --git a/lex/common.ml b/lex/common.ml index 36f8225e..9b86ba11 100644 --- a/lex/common.ml +++ b/lex/common.ml @@ -47,7 +47,7 @@ let update_tracker tr = fprintf tr.oc "# %d \"%s\"\n" (tr.cur_line+1) tr.file; ;; -let copy_buffer = String.create 1024 +let copy_buffer = Bytes.create 1024 let copy_chars_unix ic oc start stop = let n = ref (stop - start) in @@ -159,5 +159,13 @@ let output_env ic oc tr env = let output_args oc args = List.iter (fun x -> (output_string oc x; output_char oc ' ')) args +let output_refill_handler ic oc oci = function + | None -> false + | Some location -> + output_string oc "let __ocaml_lex_refill : \ + (Lexing.lexbuf -> 'a) -> (Lexing.lexbuf -> 'a) =\n"; + copy_chunk ic oc oci location true; + true + (* quiet flag *) let quiet_mode = ref false;; diff --git a/lex/common.mli b/lex/common.mli index c71febe8..de23959c 100644 --- a/lex/common.mli +++ b/lex/common.mli @@ -22,5 +22,7 @@ val output_env : in_channel -> out_channel -> line_tracker -> (Lexgen.ident * Lexgen.ident_info) list -> unit val output_args : out_channel -> string list -> unit +val output_refill_handler : + in_channel -> out_channel -> line_tracker -> Syntax.location option -> bool val quiet_mode : bool ref;; diff --git a/lex/compact.ml b/lex/compact.ml index 1f620ab8..f468a557 100644 --- a/lex/compact.ml +++ b/lex/compact.ml @@ -92,13 +92,13 @@ type t_compact = mutable c_last_used : int ; } let create_compact () = - { c_trans = Array.create 1024 0 ; - c_check = Array.create 1024 (-1) ; + { c_trans = Array.make 1024 0 ; + c_check = Array.make 1024 (-1) ; c_last_used = 0 ; } let reset_compact c = - c.c_trans <- Array.create 1024 0 ; - c.c_check <- Array.create 1024 (-1) ; + c.c_trans <- Array.make 1024 0 ; + c.c_check <- Array.make 1024 (-1) ; c.c_last_used <- 0 (* One compacted table for transitions, one other for memory actions *) @@ -110,9 +110,9 @@ let grow_compact c = let old_trans = c.c_trans and old_check = c.c_check in let n = Array.length old_trans in - c.c_trans <- Array.create (2*n) 0; + c.c_trans <- Array.make (2*n) 0; Array.blit old_trans 0 c.c_trans 0 c.c_last_used; - c.c_check <- Array.create (2*n) (-1); + c.c_check <- Array.make (2*n) (-1); Array.blit old_check 0 c.c_check 0 c.c_last_used let do_pack state_num orig compact = @@ -142,8 +142,8 @@ let do_pack state_num orig compact = (base, default) let pack_moves state_num move_t = - let move_v = Array.create 257 0 - and move_m = Array.create 257 0 in + let move_v = Array.make 257 0 + and move_m = Array.make 257 0 in for i = 0 to 256 do let act,c = move_t.(i) in move_v.(i) <- (match act with Backtrack -> -1 | Goto n -> n) ; @@ -175,12 +175,12 @@ type lex_tables = let compact_tables state_v = let n = Array.length state_v in - let base = Array.create n 0 - and backtrk = Array.create n (-1) - and default = Array.create n 0 - and base_code = Array.create n 0 - and backtrk_code = Array.create n 0 - and default_code = Array.create n 0 in + let base = Array.make n 0 + and backtrk = Array.make n (-1) + and default = Array.make n 0 + and base_code = Array.make n 0 + and backtrk_code = Array.make n 0 + and default_code = Array.make n 0 in for i = 0 to n - 1 do match state_v.(i) with | Perform (n,c) -> diff --git a/lex/cset.ml b/lex/cset.ml index 8c3d176f..f4581ba3 100644 --- a/lex/cset.ml +++ b/lex/cset.ml @@ -81,7 +81,7 @@ let complement s = diff all_chars s let env_to_array env = match env with | [] -> assert false | (_,x)::rem -> - let res = Array.create 257 x in + let res = Array.make 257 x in List.iter (fun (c,y) -> List.iter diff --git a/lex/lexer.mll b/lex/lexer.mll index 8fc472e6..eebd7115 100644 --- a/lex/lexer.mll +++ b/lex/lexer.mll @@ -30,6 +30,7 @@ let string_buff = Buffer.create 256 let reset_string_buffer () = Buffer.clear string_buff let store_string_char c = Buffer.add_char string_buff c +let store_string_chars s = Buffer.add_string string_buff s let get_stored_string () = Buffer.contents string_buff @@ -140,6 +141,7 @@ rule main = parse | "eof" -> Teof | "let" -> Tlet | "as" -> Tas + | "refill" -> Trefill | s -> Tident s } | '"' { reset_string_buffer(); @@ -197,7 +199,7 @@ rule main = parse and string = parse '"' { () } - | '\\' ("\010" | "\013" | "\013\010") ([' ' '\009'] * as spaces) + | '\\' ('\013'* '\010') ([' ' '\009'] * as spaces) { incr_loc lexbuf (String.length spaces); string lexbuf } | '\\' (backslash_escapes as c) @@ -208,7 +210,7 @@ and string = parse if in_pattern () && v > 255 then warning lexbuf (Printf.sprintf - "illegal backslash escape in string: `\\%c%c%c'" c d u) ; + "illegal backslash escape in string: '\\%c%c%c'" c d u) ; store_string_char (Char.chr v); string lexbuf } | '\\' 'x' (['0'-'9' 'a'-'f' 'A'-'F'] as d) (['0'-'9' 'a'-'f' 'A'-'F'] as u) @@ -217,14 +219,15 @@ and string = parse | '\\' (_ as c) {if in_pattern () then warning lexbuf - (Printf.sprintf "illegal backslash escape in string: `\\%c'" c) ; + (Printf.sprintf "illegal backslash escape in string: '\\%c'" c) ; store_string_char '\\' ; store_string_char c ; string lexbuf } | eof { raise(Lexical_error("unterminated string", "", 0, 0)) } - | '\010' - { store_string_char '\010'; + | '\013'* '\010' as s + { warning lexbuf (Printf.sprintf "unescaped newline in string") ; + store_string_chars s; incr_loc lexbuf 0; string lexbuf } | _ as c diff --git a/lex/lexgen.ml b/lex/lexgen.ml index 035e3fe6..503b08fa 100644 --- a/lex/lexgen.ml +++ b/lex/lexgen.ml @@ -589,7 +589,7 @@ let rec firstpos = function (* Berry-sethi followpos *) let followpos size entry_list = - let v = Array.create size TransSet.empty in + let v = Array.make size TransSet.empty in let rec fill s = function | Empty|Action _|Tag _ -> () | Chars (n,_) -> v.(n) <- s @@ -1132,7 +1132,7 @@ let make_tag_entry id start act a r = match a with | _ -> r let extract_tags l = - let envs = Array.create (List.length l) TagMap.empty in + let envs = Array.make (List.length l) TagMap.empty in List.iter (fun (act,m,_) -> envs.(act) <- @@ -1186,7 +1186,7 @@ let make_dfa lexdef = done ; eprintf "%d states\n" !next_state_num ; *) - let actions = Array.create !next_state_num (Perform (0,[])) in + let actions = Array.make !next_state_num (Perform (0,[])) in List.iter (fun (act, i) -> actions.(i) <- act) states; (* Useless state reset, so as to restrict GC roots *) reset_state () ; diff --git a/lex/main.ml b/lex/main.ml index 97b114a1..076873f1 100644 --- a/lex/main.ml +++ b/lex/main.ml @@ -18,7 +18,7 @@ let ml_automata = ref false let source_name = ref None let output_name = ref None -let usage = "usage: ocamlex [options] sourcefile" +let usage = "usage: ocamllex [options] sourcefile" let print_version_string () = print_string "The OCaml lexer generator, version "; @@ -75,11 +75,11 @@ let main () = if !ml_automata then begin Outputbis.output_lexdef source_name ic oc tr - def.header entries transitions def.trailer + def.header def.refill_handler entries transitions def.trailer end else begin let tables = Compact.compact_tables transitions in Output.output_lexdef source_name ic oc tr - def.header tables entries def.trailer + def.header def.refill_handler tables entries def.trailer end; close_in ic; close_out oc; diff --git a/lex/output.ml b/lex/output.ml index d99f2f90..638260c2 100644 --- a/lex/output.ml +++ b/lex/output.ml @@ -69,7 +69,7 @@ let output_tables oc tbl = (* Output the entries *) -let output_entry sourcefile ic oc oci e = +let output_entry sourcefile ic oc has_refill oci e = let init_num, init_moves = e.auto_initial_state in fprintf oc "%s %alexbuf =\ \n %a%a __ocaml_lex_%s_rec %alexbuf %d\n" @@ -77,7 +77,7 @@ let output_entry sourcefile ic oc oci e = output_args e.auto_args (fun oc x -> if x > 0 then - fprintf oc "lexbuf.Lexing.lex_mem <- Array.create %d (-1) ; " x) + fprintf oc "lexbuf.Lexing.lex_mem <- Array.make %d (-1) ; " x) e.auto_mem_size (output_memory_actions " ") init_moves e.auto_name @@ -96,15 +96,23 @@ let output_entry sourcefile ic oc oci e = copy_chunk ic oc oci loc true; fprintf oc "\n") e.auto_actions; - fprintf oc " | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; \ - __ocaml_lex_%s_rec %alexbuf __ocaml_lex_state\n\n" - e.auto_name output_args e.auto_args + if has_refill then + fprintf oc + " | __ocaml_lex_state -> __ocaml_lex_refill \ + \n (fun lexbuf -> lexbuf.Lexing.refill_buff lexbuf; \ + \n __ocaml_lex_%s_rec %alexbuf __ocaml_lex_state) lexbuf\n\n" + e.auto_name output_args e.auto_args + else + fprintf oc + " | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; \ + \n __ocaml_lex_%s_rec %alexbuf __ocaml_lex_state\n\n" + e.auto_name output_args e.auto_args (* Main output function *) exception Table_overflow -let output_lexdef sourcefile ic oc oci header tables entry_points trailer = +let output_lexdef sourcefile ic oc oci header rh tables entry_points trailer = if not !Common.quiet_mode then Printf.printf "%d states, %d transitions, table size %d bytes\n" (Array.length tables.tbl_base) @@ -124,13 +132,17 @@ let output_lexdef sourcefile ic oc oci header tables entry_points trailer = flush stdout; if Array.length tables.tbl_trans > 0x8000 then raise Table_overflow; copy_chunk ic oc oci header false; + let has_refill = output_refill_handler ic oc oci rh in output_tables oc tables; begin match entry_points with [] -> () | entry1 :: entries -> - output_string oc "let rec "; output_entry sourcefile ic oc oci entry1; + output_string oc "let rec "; + output_entry sourcefile ic oc has_refill oci entry1; List.iter - (fun e -> output_string oc "and "; output_entry sourcefile ic oc oci e) + (fun e -> + output_string oc "and "; + output_entry sourcefile ic oc has_refill oci e) entries; output_string oc ";;\n\n"; end; diff --git a/lex/output.mli b/lex/output.mli index 96d8a4d6..9d0bd9fc 100644 --- a/lex/output.mli +++ b/lex/output.mli @@ -15,6 +15,7 @@ val output_lexdef: string -> in_channel -> out_channel -> Common.line_tracker -> Syntax.location -> + Syntax.location option -> Compact.lex_tables -> (string list, Syntax.location) Lexgen.automata_entry list -> Syntax.location -> diff --git a/lex/outputbis.ml b/lex/outputbis.ml index 7e8cba6e..709ec0ee 100644 --- a/lex/outputbis.ml +++ b/lex/outputbis.ml @@ -16,18 +16,39 @@ open Printf open Lexgen open Common -let output_auto_defs oc = - fprintf oc "let __ocaml_lex_init_lexbuf lexbuf mem_size =\ +let output_auto_defs oc has_refill = + output_string oc + "let __ocaml_lex_init_lexbuf lexbuf mem_size =\ \n let pos = lexbuf.Lexing.lex_curr_pos in\ -\n lexbuf.Lexing.lex_mem <- Array.create mem_size (-1) ;\ +\n lexbuf.Lexing.lex_mem <- Array.make mem_size (-1) ;\ \n lexbuf.Lexing.lex_start_pos <- pos ;\ \n lexbuf.Lexing.lex_last_pos <- pos ;\ \n lexbuf.Lexing.lex_last_action <- -1\ \n\n\ " ; - output_string oc - "let rec __ocaml_lex_next_char lexbuf =\ + if has_refill then + output_string oc + "let rec __ocaml_lex_next_char lexbuf state k =\ +\n if lexbuf.Lexing.lex_curr_pos >= lexbuf.Lexing.lex_buffer_len then begin\ +\n if lexbuf.Lexing.lex_eof_reached then\ +\n state lexbuf k 256\ +\n else begin\ +\n __ocaml_lex_refill (fun lexbuf -> +\n lexbuf.Lexing.refill_buff lexbuf ;\ +\n __ocaml_lex_next_char lexbuf state k)\ +\n lexbuf\ +\n end\ +\n end else begin\ +\n let i = lexbuf.Lexing.lex_curr_pos in\ +\n let c = lexbuf.Lexing.lex_buffer.[i] in\ +\n lexbuf.Lexing.lex_curr_pos <- i+1 ;\ +\n state lexbuf k (Char.code c)\ +\n end\ +\n\n" + else + output_string oc + "let rec __ocaml_lex_next_char lexbuf =\ \n if lexbuf.Lexing.lex_curr_pos >= lexbuf.Lexing.lex_buffer_len then begin\ \n if lexbuf.Lexing.lex_eof_reached then\ \n 256\ @@ -41,21 +62,24 @@ let output_auto_defs oc = \n lexbuf.Lexing.lex_curr_pos <- i+1 ;\ \n Char.code c\ \n end\ -\n\n\ -" +\n\n" let output_pats oc pats = List.iter (fun p -> fprintf oc "|%d" p) pats -let output_action oc mems r = +let output_action oc has_refill mems r = output_memory_actions " " oc mems ; match r with | Backtrack -> fprintf oc " lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_last_pos ;\n" ; - fprintf oc " lexbuf.Lexing.lex_last_action\n" + if has_refill then + fprintf oc " k lexbuf lexbuf.Lexing.lex_last_action\n" + else + fprintf oc " lexbuf.Lexing.lex_last_action\n" | Goto n -> - fprintf oc " __ocaml_lex_state%d lexbuf\n" n + fprintf oc " __ocaml_lex_state%d lexbuf%s\n" n + (if has_refill then " k" else "") let output_pat oc i = if i >= 256 then @@ -63,17 +87,18 @@ let output_pat oc i = else fprintf oc "|'%s'" (Char.escaped (Char.chr i)) -let output_clause oc pats mems r = +let output_clause oc has_refill pats mems r = fprintf oc "(* " ; List.iter (output_pat oc) pats ; fprintf oc " *)\n" ; - fprintf oc " %a ->\n" output_pats pats ; output_action oc mems r + fprintf oc " %a ->\n" output_pats pats ; + output_action oc has_refill mems r -let output_default_clause oc mems r = - fprintf oc " | _ ->\n" ; output_action oc mems r +let output_default_clause oc has_refill mems r = + fprintf oc " | _ ->\n" ; output_action oc has_refill mems r -let output_moves oc moves = +let output_moves oc has_refill moves = let t = Hashtbl.create 17 in let add_move i (m,mems) = let mems,r = try Hashtbl.find t m with Not_found -> mems,[] in @@ -97,9 +122,10 @@ let output_moves oc moves = t ; Hashtbl.iter (fun m (mems,pats) -> - if m <> !most_frequent then output_clause oc (List.rev pats) mems m) + if m <> !most_frequent then + output_clause oc has_refill (List.rev pats) mems m) t ; - output_default_clause oc !most_mems !most_frequent + output_default_clause oc has_refill !most_mems !most_frequent let output_tag_actions pref oc mvs = @@ -120,47 +146,61 @@ let output_tag_actions pref oc mvs = pref output_mem_access t) mvs -let output_trans pref oc i trans = - fprintf oc "%s __ocaml_lex_state%d lexbuf = " pref i ; +let output_trans pref oc has_refill i trans = + let entry = sprintf "__ocaml_lex_state%d" i in + fprintf oc "%s %s lexbuf %s= " pref entry + (if has_refill then "k " else ""); match trans with | Perform (n,mvs) -> output_tag_actions " " oc mvs ; - fprintf oc " %d\n" n + fprintf oc " %s%d\n" + (if has_refill then "k lexbuf " else "") + n | Shift (trans, move) -> - begin match trans with + begin match trans with | Remember (n,mvs) -> - output_tag_actions " " oc mvs ; - fprintf oc - " lexbuf.Lexing.lex_last_pos <- lexbuf.Lexing.lex_curr_pos ;\n" ; - fprintf oc " lexbuf.Lexing.lex_last_action <- %d ;\n" n + output_tag_actions " " oc mvs ; + fprintf oc + " lexbuf.Lexing.lex_last_pos <- lexbuf.Lexing.lex_curr_pos ;\n" ; + fprintf oc " lexbuf.Lexing.lex_last_action <- %d ;\n" n; | No_remember -> () - end ; - fprintf oc " match __ocaml_lex_next_char lexbuf with\n" ; - output_moves oc move - -let output_automata oc auto = - output_auto_defs oc ; + end; + if has_refill then + let next = entry ^ "_next" in + fprintf oc " __ocaml_lex_next_char lexbuf %s k\n" next; + fprintf oc "and %s lexbuf k = function " next + else + output_string oc "match __ocaml_lex_next_char lexbuf with\n"; + output_moves oc has_refill move + +let output_automata oc has_refill auto = + output_auto_defs oc has_refill; let n = Array.length auto in - output_trans "let rec" oc 0 auto.(0) ; + output_trans "let rec" oc has_refill 0 auto.(0) ; for i = 1 to n-1 do - output_trans "\nand" oc i auto.(i) + output_trans "\nand" oc has_refill i auto.(i) done ; output_char oc '\n' (* Output the entries *) -let output_entry sourcefile ic oc tr e = +let output_entry sourcefile ic oc has_refill tr e = let init_num, init_moves = e.auto_initial_state in - fprintf oc "%s %alexbuf =\ -\n __ocaml_lex_init_lexbuf lexbuf %d; %a\ -\n let __ocaml_lex_result = __ocaml_lex_state%d lexbuf in\ + fprintf oc "%s %alexbuf =\n __ocaml_lex_init_lexbuf lexbuf %d; %a" + e.auto_name output_args e.auto_args + e.auto_mem_size + (output_memory_actions " ") init_moves; + fprintf oc + (if has_refill + then "\n __ocaml_lex_state%d lexbuf (fun lexbuf __ocaml_lex_result ->" + else "\n let __ocaml_lex_result = __ocaml_lex_state%d lexbuf in") + init_num; + output_string oc "\ \n lexbuf.Lexing.lex_start_p <- lexbuf.Lexing.lex_curr_p;\ \n lexbuf.Lexing.lex_curr_p <- {lexbuf.Lexing.lex_curr_p with\ \n Lexing.pos_cnum = lexbuf.Lexing.lex_abs_pos+lexbuf.Lexing.lex_curr_pos};\ -\n match __ocaml_lex_result with\n" - e.auto_name output_args e.auto_args - e.auto_mem_size (output_memory_actions " ") init_moves init_num ; +\n match __ocaml_lex_result with\n"; List.iter (fun (num, env, loc) -> fprintf oc " | "; @@ -169,21 +209,29 @@ let output_entry sourcefile ic oc tr e = copy_chunk ic oc tr loc true; fprintf oc "\n") e.auto_actions; - fprintf oc " | _ -> raise (Failure \"lexing: empty token\")\n\n\n" + fprintf oc " | _ -> raise (Failure \"lexing: empty token\")\n"; + if has_refill then + output_string oc " )\n\n" + else + output_string oc "\n\n" (* Main output function *) -let output_lexdef sourcefile ic oc tr header entry_points transitions trailer = +let output_lexdef sourcefile ic oc tr header rh + entry_points transitions trailer = copy_chunk ic oc tr header false; - output_automata oc transitions ; + let has_refill = output_refill_handler ic oc tr rh in + output_automata oc has_refill transitions; begin match entry_points with [] -> () | entry1 :: entries -> - output_string oc "let rec "; output_entry sourcefile ic oc tr entry1; + output_string oc "let rec "; + output_entry sourcefile ic oc has_refill tr entry1; List.iter - (fun e -> output_string oc "and "; output_entry sourcefile ic oc tr e) + (fun e -> output_string oc "and "; + output_entry sourcefile ic oc has_refill tr e) entries; output_string oc ";;\n\n"; end; diff --git a/lex/outputbis.mli b/lex/outputbis.mli index 6c045122..fb51cdec 100644 --- a/lex/outputbis.mli +++ b/lex/outputbis.mli @@ -16,5 +16,6 @@ val output_lexdef : out_channel -> Common.line_tracker -> Syntax.location -> + Syntax.location option -> (string list, Syntax.location) Lexgen.automata_entry list -> Lexgen.automata array -> Syntax.location -> unit diff --git a/lex/parser.mly b/lex/parser.mly index b42cced9..459b7870 100644 --- a/lex/parser.mly +++ b/lex/parser.mly @@ -49,7 +49,7 @@ let as_cset = function %token Tstring %token Taction %token Trule Tparse Tparse_shortest Tand Tequal Tend Tor Tunderscore Teof - Tlbracket Trbracket + Tlbracket Trbracket Trefill %token Tstar Tmaybe Tplus Tlparen Trparen Tcaret Tdash Tlet Tas Tsharp %right Tas @@ -65,10 +65,12 @@ let as_cset = function %% lexer_definition: - header named_regexps Trule definition other_definitions header Tend + header named_regexps refill_handler Trule definition other_definitions + header Tend { {header = $1; - entrypoints = $4 :: List.rev $5; - trailer = $6} } + refill_handler = $3; + entrypoints = $5 :: List.rev $6; + trailer = $7} } ; header: Taction @@ -89,6 +91,10 @@ other_definitions: | /*epsilon*/ { [] } ; +refill_handler: + | Trefill Taction { Some $2 } + | /*empty*/ { None } +; definition: Tident arguments Tequal Tparse entry { {name=$1 ; shortest=false ; args=$2 ; clauses=$5} } diff --git a/lex/syntax.ml b/lex/syntax.ml index 72f101e2..b2993eaa 100644 --- a/lex/syntax.ml +++ b/lex/syntax.ml @@ -38,7 +38,9 @@ type ('arg,'action) entry = args : 'arg ; clauses : (regular_expression * 'action) list} -type lexer_definition = - { header: location; - entrypoints: ((string list, location) entry) list; - trailer: location } +type lexer_definition = { + header: location; + entrypoints: ((string list, location) entry) list; + trailer: location; + refill_handler : location option; +} diff --git a/lex/syntax.mli b/lex/syntax.mli index 55c3c117..6871dd11 100644 --- a/lex/syntax.mli +++ b/lex/syntax.mli @@ -35,7 +35,9 @@ type ('arg,'action) entry = args : 'arg ; clauses : (regular_expression * 'action) list} -type lexer_definition = - { header: location; - entrypoints: ((string list, location) entry) list; - trailer: location } +type lexer_definition = { + header: location; + entrypoints: ((string list, location) entry) list; + trailer: location; + refill_handler : location option; +} diff --git a/lex/table.ml b/lex/table.ml index fb5a6128..715d9075 100644 --- a/lex/table.ml +++ b/lex/table.ml @@ -15,12 +15,12 @@ type 'a t = {mutable next : int ; mutable data : 'a array} let default_size = 32 ;; -let create x = {next = 0 ; data = Array.create default_size x} +let create x = {next = 0 ; data = Array.make default_size x} and reset t = t.next <- 0 ;; let incr_table table new_size = - let t = Array.create new_size table.data.(0) in + let t = Array.make new_size table.data.(0) in Array.blit table.data 0 t 0 (Array.length table.data) ; table.data <- t diff --git a/man/Makefile b/man/Makefile index 916ea24a..c1c2df37 100644 --- a/man/Makefile +++ b/man/Makefile @@ -12,10 +12,13 @@ include ../config/Makefile -DIR=$(MANDIR)/man$(MANEXT) +INSTALL_DIR=$(DESTDIR)$(MANDIR)/man$(MANEXT) install: - for i in *.m; do cp $$i $(DIR)/`basename $$i .m`.$(MANEXT); done - echo '.so man$(MANEXT)/ocamlc.$(MANEXT)' > $(DIR)/ocamlc.opt.$(MANEXT) - echo '.so man$(MANEXT)/ocamlopt.$(MANEXT)' > $(DIR)/ocamlopt.opt.$(MANEXT) - echo '.so man$(MANEXT)/ocamlcp.$(MANEXT)' > $(DIR)/ocamloptp.$(MANEXT) + for i in *.m; do cp $$i $(INSTALL_DIR)/`basename $$i .m`.$(MANEXT); done + echo '.so man$(MANEXT)/ocamlc.$(MANEXT)' \ + > $(INSTALL_DIR)/ocamlc.opt.$(MANEXT) + echo '.so man$(MANEXT)/ocamlopt.$(MANEXT)' \ + > $(INSTALL_DIR)/ocamlopt.opt.$(MANEXT) + echo '.so man$(MANEXT)/ocamlcp.$(MANEXT)' \ + > $(INSTALL_DIR)/ocamloptp.$(MANEXT) diff --git a/man/ocaml.m b/man/ocaml.m index 39baf7b7..6764d52c 100644 --- a/man/ocaml.m +++ b/man/ocaml.m @@ -81,9 +81,9 @@ If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +labltk +.B \-I\ +camlp4 adds the subdirectory -.B labltk +.B camlp4 of the standard library to the search path. .IP Directories can also be added to the search path once the toplevel @@ -133,10 +133,16 @@ window. Do not include the standard library directory in the list of directories searched for source and compiled files. .TP +.BI \-open \ module +Opens the given module before starting the toplevel. If several +.B \-open +options are given, they are processed in order, just as if +the statements open! module1;; ... open! moduleN;; were input. +.TP .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and ouput of the preprocessor +The format of the input and output of the preprocessor are not yet documented. .TP .B \-principal @@ -157,6 +163,12 @@ Allow arbitrary recursive types during type-checking. By default, only recursive types where the recursion goes through an object type are supported. .TP +.B \-safe\-string +Enforce the separation between types +.BR string \ and\ bytes , +thereby making strings read-only. This will become the default in +a future version of OCaml. +.TP .B \-short\-paths When a type is visible under several module-paths, use the shortest one when printing the type's name in inferred interfaces and error and @@ -177,13 +189,20 @@ constructs). Programs compiled with are therefore slightly faster, but unsafe: anything can happen if the program accesses an array or string outside of its bounds. .TP +.B \-unsafe\-string +Identify the types +.BR string \ and\ bytes , +thereby making strings writable. For reasons of backward compatibility, +this is the default setting for the moment, but this will change in a future +version of OCaml. +.TP .B \-version Print version string and exit. .TP .B \-vnum Print short version number and exit. .TP -.BI \-w \ warning-list +.BI \-w \ warning\-list Enable or disable warnings according to the argument .IR warning-list . See @@ -192,7 +211,7 @@ for the syntax of the .I warning\-list argument. .TP -.BI \-warn-error \ warning-list +.BI \-warn\-error \ warning\-list Mark as fatal the warnings described by the argument .IR warning\-list . Note that a warning is not triggered (and does not trigger an error) if diff --git a/man/ocamlc.m b/man/ocamlc.m index fb3902a8..8661a76a 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -335,22 +335,24 @@ that file to remove all declarations of unexported names. Add the given directory to the list of directories searched for compiled interface files (.cmi), compiled object code files (.cmo), libraries (.cma), and C libraries specified with -.B \-cclib\ \-l -.IR xxx . +.BI \-cclib\ \-l xxx +.RB . By default, the current directory is searched first, then the standard library directory. Directories added with -.B -I +.B \-I are searched after the current directory, in the order in which they were given on -the command line, but before the standard library directory. +the command line, but before the standard library directory. See also +option +.BR \-nostdlib . If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +labltk +.B \-I\ +camlp4 adds the subdirectory -.B labltk +.B camlp4 of the standard library to the search path. .TP .BI \-impl \ filename @@ -368,6 +370,9 @@ Recognize file names ending with .I string as interface files (instead of the default .mli). .TP +.B \-keep-locs +Keep locations in generated .cmi files. +.TP .B \-labels Labels are not ignored in types, labels may be used in applications, and labelled parameters can be given in any order. This is the default. @@ -391,6 +396,9 @@ bytecode executables produced with the option .B ocamlc\ \-use\-runtime .IR runtime-name . .TP +.B \-no-alias-deps +Do not record dependencies for module aliases. +.TP .B \-no\-app\-funct Deactivates the applicative behaviour of functors. With this option, each functor application generates new types in its result and @@ -418,10 +426,14 @@ Ignore non-optional labels in types. Labels cannot be used in applications, and parameter order becomes strict. .TP .B \-nostdlib -Do not include the standard library directory in the list of -directories searched for compiled interfaces (see option -.B \-I -). +Do not automatically add the standard library directory to the list of +directories searched for compiled interface files (.cmi), compiled +object code files (.cmo), libraries (.cma), and C libraries specified +with +.BI \-cclib\ \-l xxx +.RB . +See also option +.BR \-I . .TP .BI \-o \ exec\-file Specify the name of the output file produced by the linker. The @@ -437,6 +449,18 @@ packed object file produced. If the .B \-output\-obj option is given, specify the name of the output file produced. +This can also be used when compiling an interface or implementation +file, without linking, in which case it sets the name of the cmi or +cmo file, and also sets the module name to the file name up to the +first dot. +.TP +.BI \-open \ module +Opens the given module before processing the interface or +implementation files. If several +.B \-open +options are given, they are processed in order, just as if +the statements open! module1;; ... open! moduleN;; were added +at the top of each file. .TP .B \-output\-obj Cause the linker to produce a C object file instead of a bytecode @@ -478,7 +502,7 @@ implementation (.ml) file. .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and ouput of the preprocessor +The format of the input and output of the preprocessor are not yet documented. .TP .B \-principal @@ -510,6 +534,12 @@ then the .B d suffix is supported and gives a debug version of the runtime. .TP +.B \-safe\-string +Enforce the separation between types +.BR string \ and\ bytes , +thereby making strings read-only. This will become the default in +a future version of OCaml. +.TP .B \-short\-paths When a type is visible under several module-paths, use the shortest one when printing the type's name in inferred interfaces and error and @@ -532,6 +562,13 @@ are therefore slightly faster, but unsafe: anything can happen if the program accesses an array or string outside of its bounds. .TP +.B \-unsafe\-string +Identify the types +.BR string \ and\ bytes , +thereby making strings writable. For reasons of backward compatibility, +this is the default setting for the moment, but this will change in a future +version of OCaml. +.TP .BI \-use\-runtime \ runtime\-name Generate a bytecode executable file that can be executed on the custom runtime system @@ -764,7 +801,7 @@ mutually recursive types. \ \ Unused constructor. 38 -\ \ Unused exception constructor. +\ \ Unused extension constructor. 39 \ \ Unused rec flag. @@ -866,7 +903,7 @@ Note: it is not recommended to use the .B \-warn\-error option in production code, because it will almost certainly prevent compiling your program with later versions of OCaml when they add new -warnings. +warnings or modify existing warnings. The default setting is .B \-warn\-error\ -a (all warnings are non-fatal). diff --git a/man/ocamldebug.m b/man/ocamldebug.m index a470150a..50354d93 100644 --- a/man/ocamldebug.m +++ b/man/ocamldebug.m @@ -58,6 +58,8 @@ command.) Tell the debugger it is executed under Emacs. (See .I "The OCaml user's manual" for information on how to run the debugger under Emacs.) +Implies +.BR \-machine-readable . .TP .BI \-I \ directory Add @@ -67,6 +69,13 @@ compiled files. (See also the .B directory command.) .TP +.BI -machine-readable +Print information in a format more suitable for machines instead of human +operators where applicable. For example, when describing a location in a +program, such as when printing a backtrace, print the program counter and +character offset in a file instead of the filename, line number, and character +offset in that line. +.TP .BI \-s \ socket Use .I socket diff --git a/man/ocamldoc.m b/man/ocamldoc.m index 73ca3a65..ca0a2334 100644 --- a/man/ocamldoc.m +++ b/man/ocamldoc.m @@ -170,7 +170,7 @@ the comments in implementation files. Always keep the source code for values, methods and instance variables, when available. The source code is always kept when a .ml file is given, but is by default discarded when a .mli -is given. This option allows to always keep the source code. +is given. This option allows the source code to be always kept. .TP .BI \-load \ file Load information from @@ -181,7 +181,7 @@ Several .B -load options can be given. .TP -.BI \-m flags +.BI \-m \ flags Specify merge options between interfaces and implementations. .I flags can be one or several of the following characters: @@ -442,11 +442,11 @@ option: Generate man pages only for modules, module types, classes and class types, instead of pages for all elements. .TP -.BI \-man\-suffix suffix +.BI \-man\-suffix \ suffix Set the suffix used for generated man filenames. Default is o, as in .IR List.o . .TP -.BI \-man\-section section +.BI \-man\-section \ section Set the section number used for generated man filenames. Default is 3. diff --git a/man/ocamlopt.m b/man/ocamlopt.m index 998651bb..b1b173af 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -248,19 +248,21 @@ and edit that file to remove all declarations of unexported names. .TP .BI \-I \ directory Add the given directory to the list of directories searched for -compiled interface files (.cmi) and compiled object code files -(.cmo). By default, the current directory is searched first, then the -standard library directory. Directories added with \-I are searched -after the current directory, in the order in which they were given on -the command line, but before the standard library directory. +compiled interface files (.cmi), compiled object code files (.cmx), +and libraries (.cmxa). By default, the current directory is searched +first, then the standard library directory. Directories added with \-I +are searched after the current directory, in the order in which they +were given on the command line, but before the standard library +directory. See also option +.BR \-nostdlib . If the given directory starts with .BR + , it is taken relative to the standard library directory. For instance, -.B \-I\ +labltk +.B \-I\ +camlp4 adds the subdirectory -.B labltk +.B camlp4 of the standard library to the search path. .TP .BI \-impl \ filename @@ -296,6 +298,9 @@ Recognize file names ending with .I string as interface files (instead of the default .mli). .TP +.B \-keep-locs +Keep locations in generated .cmi files. +.TP .B \-labels Labels are not ignored in types, labels may be used in applications, and labelled parameters can be given in any order. This is the default. @@ -311,6 +316,9 @@ flag forces all subsequent links of programs involving that library to link all the modules contained in the library. .TP +.B \-no-alias-deps +Do not record dependencies for module aliases. +.TP .B \-no\-app\-funct Deactivates the applicative behaviour of functors. With this option, each functor application generates new types in its result and @@ -337,6 +345,12 @@ and pass the correct C libraries and options on the command line. Allow the compiler to use some optimizations that are valid only for code that is never dynlinked. .TP +.B -nostdlib +Do not automatically add the standard library directory the list of +directories searched for compiled interface files (.cmi), compiled +object code files (.cmx), and libraries (.cmxa). See also option +.BR \-I . +.TP .B \-nolabels Ignore non-optional labels in types. Labels cannot be used in applications, and parameter order becomes strict. @@ -353,6 +367,18 @@ If the option is given, specify the name of the output file produced. If the .B \-shared option is given, specify the name of plugin file produced. +This can also be used when compiling an interface or implementation +file, without linking, in which case it sets the name of the cmi or +cmo file, and also sets the module name to the file name up to the +first dot. +.TP +.BI \-open \ module +Opens the given module before processing the interface or +implementation files. If several +.B \-open +options are given, they are processed in order, just as if +the statements open! module1;; ... open! moduleN;; were added +at the top of each file. .TP .B \-output\-obj Cause the linker to produce a C object file instead of an executable @@ -431,7 +457,7 @@ errors, the intermediate file is deleted afterwards. .BI \-ppx \ command After parsing, pipe the abstract syntax tree through the preprocessor .IR command . -The format of the input and ouput of the preprocessor +The format of the input and output of the preprocessor are not yet documented. .TP .B \-principal @@ -464,6 +490,12 @@ code for the source file is saved in the file .IR x .s. .TP +.B \-safe\-string +Enforce the separation between types +.BR string \ and\ bytes , +thereby making strings read-only. This will become the default in +a future version of OCaml. +.TP .B \-shared Build a plugin (usually .cmxs) that can be dynamically loaded with the @@ -511,6 +543,13 @@ program or continue with an unspecified result instead of raising a .B Division_by_zero exception. .TP +.B \-unsafe\-string +Identify the types +.BR string \ and\ bytes , +thereby making strings writable. For reasons of backward compatibility, +this is the default setting for the moment, but this will change in a future +version of OCaml. +.TP .B \-v Print the version number of the compiler and the location of the standard library directory, then exit. @@ -519,7 +558,7 @@ standard library directory, then exit. Print all external commands before they are executed, in particular invocations of the assembler, C compiler, and linker. .TP -.BR \-vnum or \-version +.BR \-version \ or\ \-vnum Print the version number of the compiler in short form (e.g. "3.11.0"), then exit. .TP @@ -552,7 +591,7 @@ Note: it is not recommended to use the .B \-warn\-error option in production code, because it will almost certainly prevent compiling your program with later versions of OCaml when they add new -warnings. +warnings or modify existing warnings. The default setting is .B \-warn\-error\ -a (all warnings are non-fatal). @@ -560,7 +599,6 @@ The default setting is .B \-warn\-help Show the description of all available warning numbers. .TP -.TP .B \-where Print the location of the standard library, then exit. .TP @@ -621,6 +659,37 @@ Generate SPARC version 9 code. The default is to generate code for SPARC version 7, which runs on all SPARC processors. +.SH OPTIONS FOR THE ARM ARCHITECTURE +The ARM code generator supports the following additional options: +.TP +.B \-farch=armv4|armv5|armv5te|armv6|armv6t2|armv7 +Select the ARM target architecture +.TP +.B \-ffpu=soft|vfpv2|vfpv3\-d16|vfpv3 +Select the floating-point hardware +.TP +.B \-fPIC +Generate position-independent machine code. +.TP +.B \-fno\-PIC +Generate position-dependent machine code. This is the default. +.TP +.B \-fthumb +Enable Thumb/Thumb-2 code generation +.TP +.B \-fno\-thumb +Disable Thumb/Thumb-2 code generation +.P +The default values for target architecture, floating-point hardware +and thumb usage were selected at configure-time when building +.B ocamlopt +itself. This configuration can be inspected using +.BR ocamlopt\ \-config . +Target architecture depends on the "model" setting, while +floating-point hardware and thumb support are determined from the ABI +setting in "system" ( +.BR linux_eabi or linux_eabihf ). + .SH SEE ALSO .BR ocamlc (1). .br diff --git a/myocamlbuild.ml b/myocamlbuild.ml deleted file mode 100644 index c1d0865c..00000000 --- a/myocamlbuild.ml +++ /dev/null @@ -1,1082 +0,0 @@ -(***********************************************************************) -(* *) -(* OCaml *) -(* *) -(* Nicolas Pouillard, projet Gallium, INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed *) -(* under the terms of the Q Public License version 1.0. *) -(* *) -(***********************************************************************) - -open Ocamlbuild_plugin -open Command -open Arch -open Format - -module C = Myocamlbuild_config - -let windows = Sys.os_type = "Win32";; -if windows then tag_any ["windows"];; -let ccomptype = C.ccomptype -(*let () = if ccomptype <> "cc" then eprintf "ccomptype: %s@." ccomptype;;*) - -let fp_cat oc f = with_input_file ~bin:true f (fun ic -> copy_chan ic oc) - -(* Improve using the command module in Myocamlbuild_config - with the variant version (`S, `A...) *) -let mkdll out files opts = - let s = Command.string_of_command_spec in - Cmd(Sh(Printf.sprintf "%s -o %s %s %s" C.mkdll out (s files) (s opts))) - -let mkexe out files opts = - let s = Command.string_of_command_spec in - Cmd(Sh(Printf.sprintf "%s -o %s %s %s" C.mkexe out (s files) (s opts))) - -let mklib out files opts = - let s = Command.string_of_command_spec in - Cmd(Sh(C.mklib out (s files) (s opts))) - -let syslib x = A(C.syslib x);; -let syscamllib x = - if ccomptype = "msvc" then A(Printf.sprintf "lib%s.lib" x) - else A("-l"^x) - -let ccoutput cc obj file = - if ccomptype = "msvc" then - Seq[Cmd(S[cc; A"-c"; Px file]); - mv (Pathname.basename (Pathname.update_extension C.o file)) obj] - else - Cmd(S[cc; A"-c"; P file; A"-o"; Px obj]) - -let mkobj obj file opts = - let tags = tags_of_pathname file++"c"++"compile"++ccomptype in - let bytecc_with_opts = S[Sh C.bytecc; Sh C.bytecccompopts; opts; T tags] in - ccoutput bytecc_with_opts obj file - -let mknatobj obj file opts = - let nativecc_with_opts = S[Sh C.nativecc; opts; Sh C.nativecccompopts] in - ccoutput nativecc_with_opts obj file - -let add_exe a = - if not windows || Pathname.check_extension a "exe" then a - else a-.-"exe";; - -let add_exe_if_exists a = - if not windows || Pathname.check_extension a "exe" then a - else - let exe = a-.-"exe" in - if Pathname.exists exe then exe else a;; - -let convert_command_for_windows_shell spec = - if not windows then spec else - let rec self specs acc = - match specs with - | N :: specs -> self specs acc - | S[] :: specs -> self specs acc - | S[x] :: specs -> self (x :: specs) acc - | S specs :: specs' -> self (specs @ specs') acc - | (P(a) | A(a)) :: specs -> - let dirname = Pathname.dirname a in - let basename = Pathname.basename a in - let p = - if dirname = Pathname.current_dir_name then Sh(add_exe_if_exists basename) - else Sh(add_exe_if_exists (dirname ^ "\\" ^ basename)) in - if String.contains_string basename 0 "ocamlrun" = None then - List.rev (p :: acc) @ specs - else - self specs (p :: acc) - | [] | (Px _ | T _ | V _ | Sh _ | Quote _) :: _ -> - invalid_arg "convert_command_for_windows_shell: invalid atom in head position" - in S(self [spec] []) - -let convert_for_windows_shell solver () = - convert_command_for_windows_shell (solver ()) - -let ocamlrun = A"boot/ocamlrun" -let full_ocamlrun = P((Sys.getcwd ()) / "boot/ocamlrun") - -let boot_ocamlc = S[ocamlrun; A"boot/ocamlc"; A"-I"; A"boot"; A"-nostdlib"] - -let mixed = Pathname.exists "build/ocamlbuild_mixed_mode";; - -let if_mixed_dir dir = - if mixed then ".."/dir else dir;; - -let unix_dir = - match Sys.os_type with - | "Win32" -> if_mixed_dir "otherlibs/win32unix" - | _ -> if_mixed_dir "otherlibs/unix";; - -let threads_dir = if_mixed_dir "otherlibs/threads";; -let systhreads_dir = if_mixed_dir "otherlibs/systhreads";; -let dynlink_dir = if_mixed_dir "otherlibs/dynlink";; -let str_dir = if_mixed_dir "otherlibs/str";; -let toplevel_dir = if_mixed_dir "toplevel";; - -let systhreads_file f = "otherlibs/systhreads"/f -let systhreads_obj f = "otherlibs/systhreads"/f-.-C.o -let systhreads_lib f = "otherlibs/systhreads"/f-.-C.a -let systhreads_dll f = "otherlibs/systhreads"/f-.-C.so - -let ocamlc_solver = - let native_deps = ["ocamlc.opt"; "stdlib/stdlib.cmxa"; - "stdlib/std_exit.cmx"; "stdlib/std_exit"-.-C.o] in - let byte_deps = ["ocamlc"; "stdlib/stdlib.cma"; "stdlib/std_exit.cmo"] in - fun () -> - if Pathname.exists "../ocamlcomp.sh" then S[A"../ocamlcomp.sh"] else - if List.for_all Pathname.exists native_deps then - S[A"./ocamlc.opt"; A"-nostdlib"] - else if List.for_all Pathname.exists byte_deps then - S[ocamlrun; A"./ocamlc"; A"-nostdlib"] - else boot_ocamlc;; - -Command.setup_virtual_command_solver "OCAMLC" ocamlc_solver;; -Command.setup_virtual_command_solver "OCAMLCWIN" (convert_for_windows_shell ocamlc_solver);; - -let ocamlopt_solver () = - S[if Pathname.exists "../ocamlcompopt.sh" then S[A"../ocamlcompopt.sh"] else - if Pathname.exists "ocamlopt.opt" && Pathname.exists ("stdlib/stdlib.cmxa") - then A"./ocamlopt.opt" - else S[ocamlrun; A"./ocamlopt"]; - A"-nostdlib"];; - -Command.setup_virtual_command_solver "OCAMLOPT" ocamlopt_solver;; -Command.setup_virtual_command_solver "OCAMLOPTWIN" (convert_for_windows_shell ocamlopt_solver);; - -let ocamlc = V"OCAMLC";; -let ocamlopt = V"OCAMLOPT";; - -let ar = A"ar";; - -dispatch begin function -| Before_hygiene -> - if mixed then - let patt = String.concat "," - ["asmcomp"; "bytecomp"; "debugger"; "driver"; - "lex"; "ocamldoc"; "otherlibs"; "parsing"; "stdlib"; "tools"; - "toplevel"; "typing"; "utils"] - in Ocamlbuild_pack.Configuration.parse_string - (sprintf "<{%s}/**>: not_hygienic, -traverse" patt) - -| After_options -> - begin - Options.ocamlrun := ocamlrun; - Options.ocamllex := S[ocamlrun; P"boot/ocamllex"]; - Options.ocamlyacc := if windows then P"./boot/ocamlyacc.exe" else P"boot/ocamlyacc"; - Options.ocamlmklib := S[ocamlrun; P"tools/ocamlmklib.byte"; A"-ocamlc"; Quote (V"OCAMLCWIN"); - A"-ocamlopt"; Quote (V"OCAMLOPTWIN")(* ; A"-v" *)]; - Options.ocamldep := S[ocamlrun; P"boot/ocamldep"]; - - Options.ext_obj := C.o; - Options.ext_lib := C.a; - Options.ext_dll := String.after C.ext_dll 1; - - Options.nostdlib := true; - Options.make_links := false; - if !Options.just_plugin then - Options.ocamlc := boot_ocamlc - else begin - Options.ocamlc := ocamlc; - Options.plugin := false; - Options.ocamlopt := ocamlopt; - end; - end -| After_rules -> - let module M = struct - - - -let hot_camlp4boot = "camlp4"/"boot"/"camlp4boot.byte";; -let cold_camlp4boot = "camlp4boot" (* The installed version *);; -let cold_camlp4o = "camlp4o" (* The installed version *);; - -flag ["ocaml"; "ocamlyacc"] (A"-v");; - -flag ["ocaml"; "compile"; "strict_sequence"] (A"-strict-sequence");; - -non_dependency "otherlibs/threads/pervasives.ml" "Unix";; -non_dependency "otherlibs/threads/pervasives.ml" "String";; - -let add_extensions extensions modules = - List.fold_right begin fun x -> - List.fold_right begin fun ext acc -> - x-.-ext :: acc - end extensions - end modules [];; - -flag ["ocaml"; "pp"; "camlp4boot"] (convert_command_for_windows_shell (S[ocamlrun; P hot_camlp4boot]));; -flag ["ocaml"; "pp"; "camlp4boot"; "native"] (S[A"-D"; A"OPT"]);; -flag ["ocaml"; "pp"; "camlp4boot"; "pp:dep"] (S[A"-D"; A"OPT"]);; -flag ["ocaml"; "pp"; "camlp4boot"; "pp:doc"] (S[A"-printer"; A"o"]);; -let exn_tracer = Pathname.pwd/"camlp4"/"boot"/"Camlp4ExceptionTracer.cmo" in -if Pathname.exists exn_tracer then - flag ["ocaml"; "pp"; "camlp4boot"; "exntracer"] (P exn_tracer); - -use_lib "camlp4/mkcamlp4" "camlp4/camlp4lib";; -use_lib "toplevel/topstart" "toplevel/toplevellib";; -use_lib "otherlibs/dynlink/extract_crc" "otherlibs/dynlink/dynlink";; - -hide_package_contents "otherlibs/dynlink/dynlinkaux";; - -flag ["ocaml"; "link"; "file:driver/main.native"; "native"] begin - S[A"-ccopt"; A C.bytecclinkopts; A"-cclib"; A C.bytecclibs] -end;; - -dep ["ocaml"; "link"; "file:driver/main.native"; "native"] - ["asmrun/meta"-.-C.o; "asmrun/dynlink"-.-C.o];; - -dep ["ocaml"; "compile"; "native"] ["stdlib/libasmrun"-.-C.a];; - -flag ["ocaml"; "link"] (S[A"-I"; P "stdlib"]);; -flag ["ocaml"; "compile"; "include_unix"] (S[A"-I"; P unix_dir]);; -flag ["ocaml"; "compile"; "include_str"] (S[A"-I"; P str_dir]);; -flag ["ocaml"; "compile"; "include_dynlink"] (S[A"-I"; P dynlink_dir]);; -flag ["ocaml"; "compile"; "include_toplevel"] (S[A"-I"; P toplevel_dir]);; -flag ["ocaml"; "link"; "use_unix"] (S[A"-I"; P unix_dir]);; -flag ["ocaml"; "link"; "use_dynlink"] (S[A"-I"; P dynlink_dir]);; -flag ["ocaml"; "link"; "use_str"] (S[A"-I"; P str_dir]);; -flag ["ocaml"; "link"; "use_toplevel"] (S[A"-I"; P toplevel_dir]);; - -let setup_arch arch = - let annotated_arch = annotate arch in - let (_include_dirs_table, _for_pack_table) = mk_tables annotated_arch in - (* Format.eprintf "%a@." (Ocaml_arch.print_table (List.print pp_print_string)) include_dirs_table;; *) - iter_info begin fun i -> - Pathname.define_context i.current_path i.include_dirs - end annotated_arch;; - -let camlp4_arch = - dir "" [ - dir "camlp4" [ - dir "build" []; - dir_pack "Camlp4" [ - dir_pack "Struct" [ - dir_pack "Grammar" []; - ]; - dir_pack "Printers" []; - ]; - dir_pack "Camlp4Top" []; - ]; - ];; - -setup_arch camlp4_arch;; - -Pathname.define_context "" ["stdlib"];; -Pathname.define_context "utils" [Pathname.current_dir_name; "stdlib"];; -Pathname.define_context "camlp4/boot" ["camlp4"];; -Pathname.define_context "camlp4/Camlp4Parsers" ["camlp4"; "stdlib"];; -Pathname.define_context "camlp4/Camlp4Printers" ["camlp4"; "stdlib"];; -Pathname.define_context "camlp4/Camlp4Filters" ["camlp4"; "stdlib"];; -Pathname.define_context "camlp4/Camlp4Top" ["camlp4"; "stdlib"];; -Pathname.define_context "parsing" ["parsing"; "utils"; "stdlib"];; -Pathname.define_context "typing" ["typing"; "parsing"; "utils"; "stdlib"];; -Pathname.define_context "ocamldoc" ["typing"; "parsing"; "utils"; "tools"; "bytecomp"; "stdlib"];; -Pathname.define_context "bytecomp" ["bytecomp"; "parsing"; "typing"; "utils"; "stdlib"];; -Pathname.define_context "tools" ["tools"; (* "toplevel"; *) "parsing"; "utils"; "driver"; "bytecomp"; "asmcomp"; "typing"; "stdlib"];; -Pathname.define_context "toplevel" ["toplevel"; "parsing"; "typing"; "bytecomp"; "utils"; "driver"; "stdlib"];; -Pathname.define_context "driver" ["driver"; "asmcomp"; "bytecomp"; "typing"; "utils"; "parsing"; "stdlib"];; -Pathname.define_context "debugger" ["bytecomp"; "utils"; "typing"; "parsing"; "toplevel"; "stdlib"];; -Pathname.define_context "otherlibs/dynlink" ["otherlibs/dynlink"; "bytecomp"; "utils"; "typing"; "parsing"; "stdlib"];; -Pathname.define_context "otherlibs/dynlink/nat" ["otherlibs/dynlink/nat"; "asmcomp"; "stdlib"];; -Pathname.define_context "asmcomp" ["asmcomp"; "bytecomp"; "parsing"; "typing"; "utils"; "stdlib"];; -Pathname.define_context "ocamlbuild" ["ocamlbuild"; "."];; -Pathname.define_context "lex" ["lex"; "stdlib"];; - -List.iter (fun x -> let x = "otherlibs"/x in Pathname.define_context x [x; "stdlib"]) - ["bigarray"; "graph"; "num"; "str"; "systhreads"; "unix"; "win32graph"; "win32unix"];; - -(* The bootstrap standard library *) -copy_rule "The bootstrap standard library" "stdlib/%" "boot/%";; - -(* About the standard library *) -copy_rule "stdlib asmrun" ("asmrun/%"-.-C.a) ("stdlib/%"-.-C.a);; -copy_rule "stdlib byterun" ("byterun/%"-.-C.a) ("stdlib/%"-.-C.a);; - -(* The thread specific standard library *) -copy_rule "The thread specific standard library (mllib)" ~insert:`bottom "stdlib/%.mllib" "otherlibs/threads/%.mllib";; -copy_rule "The thread specific standard library (cmo)" ~insert:`bottom "stdlib/%.cmo" "otherlibs/threads/%.cmo";; -copy_rule "The thread specific standard library (cmi)" ~insert:`top "stdlib/%.cmi" "otherlibs/threads/%.cmi";; -copy_rule "The thread specific standard library (mli)" ~insert:`bottom "stdlib/%.mli" "otherlibs/threads/%.mli";; -copy_rule "The thread specific unix library (mli)" ~insert:`bottom "otherlibs/unix/%.mli" "otherlibs/threads/%.mli";; -copy_rule "The thread specific unix library (ml)" ~insert:`bottom "otherlibs/unix/%.ml" "otherlibs/threads/%.ml";; -copy_rule "The thread specific unix library (mllib)" ~insert:`bottom "otherlibs/unix/%.mllib" "otherlibs/threads/%.mllib";; - -(* Temporary rule, waiting for a full usage of ocamlbuild *) -copy_rule "Temporary rule, waiting for a full usage of ocamlbuild" "%.mlbuild" "%.ml";; - -copy_rule "graph/graphics.ml -> win32graph/graphics.ml" "otherlibs/graph/graphics.ml" "otherlibs/win32graph/graphics.ml";; -copy_rule "graph/graphics.mli -> win32graph/graphics.mli" "otherlibs/graph/graphics.mli" "otherlibs/win32graph/graphics.mli";; - -rule "the ocaml toplevel" - ~prod:"ocaml" - ~deps:["stdlib/stdlib.mllib"; "toplevel/topstart.byte"; "toplevel/expunge.byte"] - begin fun _ _ -> - let modules = string_list_of_file "stdlib/stdlib.mllib" in - Cmd(S[ocamlrun; A"toplevel/expunge.byte"; A"toplevel/topstart.byte"; Px"ocaml"; - A"outcometree"; A"topdirs"; A"toploop"; atomize modules]) - end;; - -let copy_rule' ?insert src dst = copy_rule (sprintf "%s -> %s" src dst) ?insert src dst;; - -copy_rule' "driver/main.byte" "ocamlc";; -copy_rule' "driver/main.native" "ocamlc.opt";; -copy_rule' "driver/optmain.byte" "ocamlopt";; -copy_rule' "driver/optmain.native" "ocamlopt.opt";; -copy_rule' "lex/main.byte" "lex/ocamllex";; -copy_rule' "lex/main.native" "lex/ocamllex.opt";; -copy_rule' "debugger/main.byte" "debugger/ocamldebug";; -copy_rule' "ocamldoc/odoc.byte" "ocamldoc/ocamldoc";; -copy_rule' "ocamldoc/odoc.native" "ocamldoc/ocamldoc.opt";; -copy_rule' "tools/ocamlmklib.byte" "tools/ocamlmklib";; -copy_rule' "otherlibs/dynlink/extract_crc.byte" "otherlibs/dynlink/extract_crc";; -copy_rule' "myocamlbuild_config.mli" "ocamlbuild/ocamlbuild_Myocamlbuild_config.mli";; -copy_rule' "myocamlbuild_config.ml" "ocamlbuild/ocamlbuild_Myocamlbuild_config.ml";; - -copy_rule' ~insert:`bottom "%" "%.exe";; - -ocaml_lib "stdlib/stdlib";; - -let stdlib_mllib_contents = - lazy (string_list_of_file "stdlib/stdlib.mllib");; - -let import_stdlib_contents build exts = - let l = - List.fold_right begin fun x -> - List.fold_right begin fun ext acc -> - ["stdlib"/(String.uncapitalize x)-.-ext] :: acc - end exts - end !*stdlib_mllib_contents [] - in - let res = build l in - List.iter Outcome.ignore_good res -;; - -rule "byte stdlib in mixed mode" - ~stamp:"byte_stdlib_mixed_mode" - ~deps:["stdlib/stdlib.mllib"; "stdlib/stdlib.cma"; - "stdlib/std_exit.cmo"; "stdlib/libcamlrun"-.-C.a; - "stdlib/camlheader"; "stdlib/camlheader_ur"] - begin fun env build -> - let (_ : Command.t) = - Ocamlbuild_pack.Ocaml_compiler.byte_library_link_mllib - "stdlib/stdlib.mllib" "stdlib/stdlib.cma" env build - in - import_stdlib_contents build ["cmi"]; - Nop - end;; - -rule "native stdlib in mixed mode" - ~stamp:"native_stdlib_mixed_mode" - ~deps:["stdlib/stdlib.mllib"; "stdlib/stdlib.cmxa"; - "stdlib/stdlib"-.-C.a; "stdlib/std_exit.cmx"; - "stdlib/std_exit"-.-C.o; "stdlib/libasmrun"-.-C.a; - "stdlib/camlheader"; "stdlib/camlheader_ur"] - begin fun env build -> - let (_ : Command.t) = - Ocamlbuild_pack.Ocaml_compiler.native_library_link_mllib - "stdlib/stdlib.mllib" "stdlib/stdlib.cmxa" env build - in - import_stdlib_contents build ["cmi"]; - Nop - end;; - -copy_rule' ~insert:`top "otherlibs/dynlink/natdynlink.ml" "otherlibs/dynlink/nat/dynlink.ml";; -copy_rule' ~insert:`top "otherlibs/dynlink/dynlink.mli" "otherlibs/dynlink/nat/dynlink.mli";; -copy_rule' ~insert:`top "otherlibs/dynlink/nat/dynlink.cmx" "otherlibs/dynlink/dynlink.cmx";; -copy_rule' ~insert:`top ("otherlibs/dynlink/nat/dynlink"-.-C.o) ("otherlibs/dynlink/dynlink"-.-C.o);; -copy_rule' ~insert:`top "otherlibs/dynlink/nat/dynlink.cmxa" "otherlibs/dynlink/dynlink.cmxa";; -copy_rule' ~insert:`top ("otherlibs/dynlink/nat/dynlink"-.-C.a) ("otherlibs/dynlink/dynlink"-.-C.a);; -dep ["ocaml"; "compile"; "native"; "file:otherlibs/dynlink/nat/dynlink.cmx"] ["otherlibs/dynlink/nat/dynlink.cmi"];; - -rule "C files" - ~prod:("%"-.-C.o) - ~dep:"%.c" - ~insert:(`before "ocaml C stubs: c -> o") - begin fun env _ -> - mkobj (env ("%"-.-C.o)) (env "%.c") N - end;; - -(* ../ is because .h files are not dependencies so they are not imported in build dir *) -flag ["c"; "compile"; "otherlibs_bigarray"] (S[A"-I"; P"../otherlibs/bigarray"]);; -flag [(* "ocaml" or "c"; *) "ocamlmklib"; "otherlibs_graph"] (S[Sh C.x11_link]);; -flag ["c"; "compile"; "otherlibs_graph"] (S[Sh C.x11_includes; A"-I../otherlibs/graph"]);; -flag ["c"; "compile"; "otherlibs_win32graph"] (A"-I../otherlibs/win32graph");; -flag ["ocaml"; "ocamlmklib"; "otherlibs_threads"] (S[A"-oc"; A"otherlibs/threads/vmthreads"]);; -flag ["c"; "compile"; "otherlibs_num"] begin - S[A("-DBNG_ARCH_"^C.bng_arch); - A("-DBNG_ASM_LEVEL="^C.bng_asm_level); - A"-I"; P"../otherlibs/num"] -end;; -flag ["c"; "compile"; "otherlibs_win32unix"] (A"-I../otherlibs/win32unix");; -flag [(* "ocaml" or "c"; *) "ocamlmklib"; "otherlibs_win32unix"] (S[A"-cclib"; Quote (syslib "ws2_32")]);; -flag ["c"; "link"; "dll"; "otherlibs_win32unix"] (syslib "ws2_32");; -let flags = S[syslib "kernel32"; syslib "gdi32"; syslib "user32"] in -flag ["c"; "ocamlmklib"; "otherlibs_win32graph"] (S[A"-cclib"; Quote flags]); -flag ["c"; "link"; "dll"; "otherlibs_win32graph"] flags;; - -if windows then flag ["c"; "compile"; "otherlibs_bigarray"] (A"-DIN_OCAML_BIGARRAY");; - -if windows then flag ["ocamlmklib"] (A"-custom");; - -flag ["ocaml"; "pp"; "ocamldoc_sources"] begin - if windows then - S[A"grep"; A"-v"; A"DEBUG"] - else - A"../ocamldoc/remove_DEBUG" -end;; - -let ocamldoc = P"./ocamldoc/ocamldoc.opt" in -let stdlib_mlis = - List.fold_right - (fun x acc -> "stdlib"/(String.uncapitalize x)-.-"mli" :: acc) - (string_list_of_file "stdlib/stdlib.mllib") - ["otherlibs/unix/unix.mli"; "otherlibs/str/str.mli"; - "otherlibs/bigarray/bigarray.mli"; "otherlibs/num/num.mli"] in -rule "Standard library manual" - ~prod:"ocamldoc/stdlib_man/Pervasives.3o" - ~stamp:"ocamldoc/stdlib_man.stamp" (* Depend on this file if you want to depends on all files of stdlib_man/* *) - ~deps:stdlib_mlis - begin fun _ _ -> - Seq[Cmd(S[A"mkdir"; A"-p"; P"ocamldoc/stdlib_man"]); - Cmd(S[ocamldoc; A"-man"; A"-d"; P"ocamldoc/stdlib_man"; - A"-I"; P "stdlib"; A"-I"; P"otherlibs/unix"; A"-I"; P"otherlibs/num"; - A"-t"; A"OCaml library"; A"-man-mini"; atomize stdlib_mlis])] - end;; - -flag ["ocaml"; "compile"; "bootstrap_thread"] - (S[A"-I"; P systhreads_dir; A"-I"; P threads_dir]);; - -flag ["ocaml"; "link"; "bootstrap_thread"] - (S[A"-I"; P systhreads_dir; A"-I"; P threads_dir]);; - -flag ["ocaml"; "compile"; "otherlibs_labltk"] (S[A"-I"; P unix_dir]);; - -flag ["c"; "compile"; "otherlibs_labltk"] (S[A"-Ibyterun"; Sh C.tk_defs; Sh C.sharedcccompopts]);; - -(* Sys threads *) - -let systhreads_stubs_headers = - List.map systhreads_file - [if windows then "st_win32.h" else "st_posix.h"; "threads.h"] -;; - -rule "native systhreads" - ~prod:(systhreads_obj "st_stubs_n") - ~deps:(systhreads_file "st_stubs.c" :: systhreads_stubs_headers) - ~insert:`top - begin fun _ _ -> - mknatobj (systhreads_obj "st_stubs_n") - (systhreads_file "st_stubs.c") - (S[A"-I../asmrun"; A"-I../byterun"; A"-Iotherlibs/systhreads"; - if windows then N else Sh C.sharedcccompopts; - A"-DNATIVE_CODE"; A("-DTARGET_"^C.arch); A("-DSYS_"^C.system)]) - end;; - -rule "bytecode systhreads" - ~prod:(systhreads_obj "st_stubs_b") - ~deps:(systhreads_file "st_stubs.c" :: systhreads_stubs_headers) - ~insert:`top - begin fun _ _ -> - mkobj (systhreads_obj "st_stubs_b") (systhreads_file "st_stubs.c") - (S[A"-I../byterun"; A"-Iotherlibs/systhreads"; Sh C.sharedcccompopts]) - end;; - -rule "libthreadsnat.a" - ~prod:(systhreads_lib "libthreadsnat") - ~dep:(systhreads_obj "st_stubs_n") - ~insert:`top - begin fun _ _ -> - if windows then - mklib (systhreads_lib "libthreadsnat") (P(systhreads_obj "st_stubs_n")) N - else - (* Dynamic linking with -lpthread is risky on many platforms, so - do not create a shared object for libthreadsnat. *) - Cmd(S[ar; A"rc"; Px(systhreads_lib "libthreadsnat"); - P(systhreads_obj "st_stubs_n")]) - end; - -(* See remark above: force static linking of libthreadsnat.a *) -if windows then - flag ["ocaml"; "link"; "library"; "otherlibs_systhreads"; "native"] begin - S[A"-cclib"; syscamllib "threadsnat"; (* A"-cclib"; syscamllib "unix"; seems to be useless and can be dangerous during bootstrap *) Sh C.pthread_link] - end;; - -flag ["ocaml"; "ocamlmklib"; "otherlibs_systhreads"] (S[(* A"-cclib"; syscamllib "unix";; seems to be useless and can be dangerous during bootstrap *) Sh C.pthread_link]);; - -flag ["c"; "compile"; "otherlibs"] begin - S[A"-I"; P"../byterun"; - A"-I"; P(".."/unix_dir); - Sh C.bytecccompopts; - Sh C.sharedcccompopts] -end;; - -flag ["c"; "compile"; "otherlibs"; "cc"] (A"-O");; -flag ["c"; "compile"; "otherlibs"; "mingw"] (A"-O");; - -(* The numeric opcodes *) -rule "The numeric opcodes" - ~prod:"bytecomp/opcodes.ml" - ~dep:"byterun/instruct.h" - ~insert:`top - begin fun _ _ -> - Cmd(Sh "sed -n -e '/^enum/p' -e 's/,//g' -e '/^ /p' byterun/instruct.h | \ - awk -f ../tools/make-opcodes > bytecomp/opcodes.ml") - end;; - -rule "tools/opnames.ml" - ~prod:"tools/opnames.ml" - ~dep:"byterun/instruct.h" - begin fun _ _ -> - Cmd(Sh"unset LC_ALL || : ; \ - unset LC_CTYPE || : ; \ - unset LC_COLLATE LANG || : ; \ - sed -e '/\\/\\*/d' \ - -e '/^#/d' \ - -e 's/enum \\(.*\\) {/let names_of_\\1 = [|/' \ - -e 's/};$/ |]/' \ - -e 's/\\([A-Z][A-Z_0-9a-z]*\\)/\"\\1\"/g' \ - -e 's/,/;/g' \ - byterun/instruct.h > tools/opnames.ml") - end;; - -(* The version number *) -rule "stdlib/sys.ml" - ~prod:"stdlib/sys.ml" - ~deps:["stdlib/sys.mlp"; "VERSION"] - begin fun _ _ -> - let version = with_input_file "VERSION" input_line in - Seq [rm_f "stdlib/sys.ml"; - Cmd (S[A"sed"; A"-e"; - A(sprintf "s,%%%%VERSION%%%%,%s," version); - Sh"<"; P"stdlib/sys.mlp"; Sh">"; Px"stdlib/sys.ml"]); - chmod (A"-w") "stdlib/sys.ml"] - end;; - -(* The predefined exceptions and primitives *) - -rule "camlheader" - ~prods:["stdlib/camlheader"; "stdlib/camlheader_ur"] - ~deps:["stdlib/header.c"; "stdlib/headernt.c"] - begin fun _ _ -> - if C.sharpbangscripts then - Cmd(Sh("echo '#!"^C.bindir^"/ocamlrun' > stdlib/camlheader && \ - echo '#!' | tr -d '\\012' > stdlib/camlheader_ur")) - else if windows then - Seq[mkexe "tmpheader.exe" (P"stdlib/headernt.c") (S[A"-I../byterun"; Sh C.extralibs]); - rm_f "camlheader.exe"; - mv "tmpheader.exe" "stdlib/camlheader"; - cp "stdlib/camlheader" "stdlib/camlheader_ur"] - else - let tmpheader = "tmpheader"^C.exe in - Cmd(S[Sh C.bytecc; Sh C.bytecccompopts; Sh C.bytecclinkopts; - A"-I"; A"../stdlib"; - A("-DRUNTIME_NAME='\""^C.bindir^"/ocamlrun\"'"); - A"stdlib/header.c"; A"-o"; Px tmpheader; Sh"&&"; - A"strip"; P tmpheader; Sh"&&"; - A"mv"; P tmpheader; A"stdlib/camlheader"; Sh"&&"; - A"cp"; A"stdlib/camlheader"; A"stdlib/camlheader_ur"]) - end;; - -(* Private copy of dynlink.{ml,mli} in debugger/ *) -copy_rule "otherlibs/dynlink/dynlink.mli -> debugger/dynlink.mli" "otherlibs/dynlink/dynlink.mli" "debugger/dynlink.mli";; -rule "debugger/dynlink.ml" - ~prod: "debugger/dynlink.ml" - ~dep: "otherlibs/dynlink/dynlink.ml" - begin fun _ _ -> - Cmd(Sh"grep -v 'REMOVE_ME for ../../debugger/dynlink.ml' \ - < otherlibs/dynlink/dynlink.ml >debugger/dynlink.ml") - end;; - - -copy_rule "win32unix use some unix files" "otherlibs/unix/%" "otherlibs/win32unix/%";; - -(* Temporary rule *) -rule "tools/ocamlmklib.ml" - ~prod:"tools/ocamlmklib.ml" - ~dep:"tools/ocamlmklib.mlp" - (fun _ _ -> cp "tools/ocamlmklib.mlp" "tools/ocamlmklib.ml");; - - -rule "bytecomp/runtimedef.ml" - ~prod:"bytecomp/runtimedef.ml" - ~deps:["byterun/primitives"; "byterun/fail.h"] - begin fun _ _ -> - Cmd(S[A"../build/mkruntimedef.sh";Sh">"; Px"bytecomp/runtimedef.ml"]) - end;; - -(* Choose the right machine-dependent files *) - -let mk_arch_rule ~src ~dst = - let prod = "asmcomp"/dst in - let dep = "asmcomp"/C.arch/src in - rule (sprintf "arch specific files %S%%" dst) ~prod ~dep begin - if windows then fun env _ -> cp (env dep) (env prod) - else fun env _ -> ln_s (env (C.arch/src)) (env prod) - end;; - -mk_arch_rule ~src:(if ccomptype = "msvc" then "proc_nt.ml" else "proc.ml") ~dst:"proc.ml";; -List.iter (fun x -> mk_arch_rule ~src:x ~dst:x) - ["arch.ml"; "reload.ml"; "scheduling.ml"; "selection.ml"];; - -let emit_mlp = "asmcomp"/C.arch/(if ccomptype = "msvc" then "emit_nt.mlp" else "emit.mlp") in -rule "emit.mlp" - ~prod:"asmcomp/emit.ml" - ~deps:[emit_mlp; "tools/cvt_emit.byte"] - begin fun _ _ -> - Cmd(S[ocamlrun; P"tools/cvt_emit.byte"; Sh "<"; P emit_mlp; - Sh">"; Px"asmcomp/emit.ml"]) - end;; - -let p4 = Pathname.concat "camlp4" -let pa = Pathname.concat (p4 "Camlp4Parsers") -let pr = Pathname.concat (p4 "Camlp4Printers") -let fi = Pathname.concat (p4 "Camlp4Filters") -let top = Pathname.concat (p4 "Camlp4Top") - -let pa_r = pa "Camlp4OCamlRevisedParser" -let pa_o = pa "Camlp4OCamlParser" -let pa_q = pa "Camlp4QuotationExpander" -let pa_qc = pa "Camlp4QuotationCommon" -let pa_rq = pa "Camlp4OCamlRevisedQuotationExpander" -let pa_oq = pa "Camlp4OCamlOriginalQuotationExpander" -let pa_rp = pa "Camlp4OCamlRevisedParserParser" -let pa_op = pa "Camlp4OCamlParserParser" -let pa_g = pa "Camlp4GrammarParser" -let pa_l = pa "Camlp4ListComprehension" -let pa_macro = pa "Camlp4MacroParser" -let pa_debug = pa "Camlp4DebugParser" - -let pr_dump = pr "Camlp4OCamlAstDumper" -let pr_r = pr "Camlp4OCamlRevisedPrinter" -let pr_o = pr "Camlp4OCamlPrinter" -let pr_a = pr "Camlp4AutoPrinter" -let fi_exc = fi "Camlp4ExceptionTracer" -let fi_meta = fi "MetaGenerator" -let camlp4_bin = p4 "Camlp4Bin" -let top_rprint = top "Rprint" -let top_top = top "Top" -let camlp4Profiler = p4 "Camlp4Profiler" - -let camlp4lib_cma = p4 "camlp4lib.cma" -let camlp4lib_cmxa = p4 "camlp4lib.cmxa" -let camlp4lib_lib = p4 ("camlp4lib"-.-C.a) - -let special_modules = - if Sys.file_exists "./boot/Profiler.cmo" then [camlp4Profiler] else [] -;; - -let camlp4_import_list = - ["utils/misc.ml"; - "utils/terminfo.ml"; - "utils/warnings.ml"; - "parsing/location.ml"; - "parsing/longident.ml"; - "parsing/asttypes.mli"; - "parsing/parsetree.mli"; - "typing/outcometree.mli"; - "typing/oprint.ml"; - "myocamlbuild_config.ml"; - "utils/config.mlbuild"] -;; - -rule "camlp4/Camlp4_import.ml" - ~deps:camlp4_import_list - ~prod:"camlp4/Camlp4_import.ml" - begin fun _ _ -> - Echo begin - List.fold_right begin fun path acc -> - let modname = module_name_of_pathname path in - "module " :: modname :: " = struct\n" :: Pathname.read path :: "\nend;;\n" :: acc - end camlp4_import_list [], - "camlp4/Camlp4_import.ml" - end - end;; - -let mk_camlp4_top_lib name modules = - let name = "camlp4"/name in - let cma = name-.-"cma" in - let deps = special_modules @ modules @ [top_top] in - let cmos = add_extensions ["cmo"] deps in - rule cma - ~deps:(camlp4lib_cma::cmos) - ~prods:[cma] - ~insert:(`before "ocaml: mllib & cmo* -> cma") - begin fun _ _ -> - Cmd(S[ocamlc; A"-a"; T(tags_of_pathname cma++"ocaml"++"link"++"byte"); - P camlp4lib_cma; A"-linkall"; atomize cmos; A"-o"; Px cma]) - end;; - -let mk_camlp4_bin name ?unix:(link_unix=true) modules = - let name = "camlp4"/name in - let byte = name-.-"byte" in - let native = name-.-"native" in - let unix_cma, unix_cmxa, include_unix = - if link_unix - then A"unix.cma", A"unix.cmxa", S[A"-I"; P unix_dir] - else N,N,N in - let dep_unix_byte, dep_unix_native = - if link_unix && not mixed - then [unix_dir/"unix.cma"], - [unix_dir/"unix.cmxa"; unix_dir/"unix"-.-C.a] - else [],[] in - let deps = special_modules @ modules @ [camlp4_bin] in - let cmos = add_extensions ["cmo"] deps in - let cmxs = add_extensions ["cmx"] deps in - let objs = add_extensions [C.o] deps in - let dep_dynlink_byte, dep_dynlink_native = - if mixed - then [], [] - else [dynlink_dir/"dynlink.cma"], - [dynlink_dir/"dynlink.cmxa"; dynlink_dir/"dynlink"-.-C.a] - in - rule byte - ~deps:(camlp4lib_cma::cmos @ dep_unix_byte @ dep_dynlink_byte) - ~prod:(add_exe byte) - ~insert:(`before "ocaml: cmo* -> byte") - begin fun _ _ -> - Cmd(S[ocamlc; A"-I"; P dynlink_dir; A "dynlink.cma"; include_unix; unix_cma; - T(tags_of_pathname byte++"ocaml"++"link"++"byte"); - P camlp4lib_cma; A"-linkall"; atomize cmos; A"-o"; Px (add_exe byte)]) - end; - rule native - ~deps:(camlp4lib_cmxa :: camlp4lib_lib :: (cmxs @ objs @ dep_unix_native @ dep_dynlink_native)) - ~prod:(add_exe native) - ~insert:(`before "ocaml: cmx* & o* -> native") - begin fun _ _ -> - Cmd(S[ocamlopt; A"-I"; P dynlink_dir; A "dynlink.cmxa"; include_unix; unix_cmxa; - T(tags_of_pathname native++"ocaml"++"link"++"native"); - P camlp4lib_cmxa; A"-linkall"; atomize cmxs; A"-o"; Px (add_exe native)]) - end;; - -let mk_camlp4 name ?unix modules bin_mods top_mods = - mk_camlp4_bin name ?unix (modules @ bin_mods); - mk_camlp4_top_lib name (modules @ top_mods);; - -copy_rule "camlp4: boot/Camlp4Ast.ml -> Camlp4/Struct/Camlp4Ast.ml" - ~insert:`top "camlp4/boot/Camlp4Ast.ml" "camlp4/Camlp4/Struct/Camlp4Ast.ml";; - -rule "camlp4: Camlp4/Struct/Lexer.ml -> boot/Lexer.ml" - ~prod:"camlp4/boot/Lexer.ml" - ~dep:"camlp4/Camlp4/Struct/Lexer.ml" - begin fun _ _ -> - Cmd(S[P cold_camlp4o; P"camlp4/Camlp4/Struct/Lexer.ml"; - A"-printer"; A"r"; A"-o"; Px"camlp4/boot/Lexer.ml"]) - end;; - -module Camlp4deps = struct - let lexer = Genlex.make_lexer ["INCLUDE"; ";"; "="; ":"];; - - let rec parse strm = - match Stream.peek strm with - | None -> [] - | Some(Genlex.Kwd "INCLUDE") -> - Stream.junk strm; - begin match Stream.peek strm with - | Some(Genlex.String s) -> - Stream.junk strm; - s :: parse strm - | _ -> invalid_arg "Camlp4deps parse failure" - end - | Some _ -> - Stream.junk strm; - parse strm - - let parse_file file = - with_input_file file begin fun ic -> - let strm = Stream.of_channel ic in - parse (lexer strm) - end - - let build_deps build file = - let includes = parse_file file in - List.iter Outcome.ignore_good (build (List.map (fun i -> [i]) includes)); -end;; - -dep ["ocaml"; "file:camlp4/Camlp4/Sig.ml"] - ["camlp4/Camlp4/Camlp4Ast.partial.ml"];; - -rule "camlp4: ml4 -> ml" - ~prod:"%.ml" - ~dep:"%.ml4" - begin fun env build -> - let ml4 = env "%.ml4" and ml = env "%.ml" in - Camlp4deps.build_deps build ml4; - Cmd(S[P cold_camlp4boot; A"-impl"; P ml4; A"-printer"; A"o"; - A"-D"; A"OPT"; A"-o"; Px ml]) - end;; - -rule "camlp4: mlast -> ml" - ~prod:"%.ml" - ~deps:["%.mlast"; "camlp4/Camlp4/Camlp4Ast.partial.ml"] - begin fun env _ -> - let mlast = env "%.mlast" and ml = env "%.ml" in - (* Camlp4deps.build_deps build mlast; too hard to lex *) - Cmd(S[P cold_camlp4boot; - A"-printer"; A"r"; - A"-filter"; A"map"; - A"-filter"; A"fold"; - A"-filter"; A"meta"; - A"-filter"; A"trash"; - A"-impl"; P mlast; - A"-o"; Px ml]) - end;; - -dep ["ocaml"; "compile"; "file:camlp4/Camlp4/Sig.ml"] - ["camlp4/Camlp4/Camlp4Ast.partial.ml"];; - -mk_camlp4_bin "camlp4" [];; -mk_camlp4 "camlp4boot" ~unix:false - [pa_r; pa_qc; pa_q; pa_rp; pa_g; pa_macro; pa_debug; pa_l] [pr_dump] [top_rprint];; -mk_camlp4 "camlp4r" - [pa_r; pa_rp] [pr_a] [top_rprint];; -mk_camlp4 "camlp4rf" - [pa_r; pa_qc; pa_q; pa_rp; pa_g; pa_macro; pa_l] [pr_a] [top_rprint];; -mk_camlp4 "camlp4o" - [pa_r; pa_o; pa_rp; pa_op] [pr_a] [];; -mk_camlp4 "camlp4of" - [pa_r; pa_qc; pa_q; pa_o; pa_rp; pa_op; pa_g; pa_macro; pa_l] [pr_a] [];; -mk_camlp4 "camlp4oof" - [pa_r; pa_o; pa_rp; pa_op; pa_qc; pa_oq; pa_g; pa_macro; pa_l] [pr_a] [];; -mk_camlp4 "camlp4orf" - [pa_r; pa_o; pa_rp; pa_op; pa_qc; pa_rq; pa_g; pa_macro; pa_l] [pr_a] [];; - - -(* Labltk *) - -Pathname.define_context "otherlibs/labltk/support" ["otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/compiler" ["otherlibs/labltk/compiler"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/labltk" ["otherlibs/labltk/labltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/camltk" ["otherlibs/labltk/camltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/lib" - ["otherlibs/labltk/labltk"; "otherlibs/labltk/camltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/jpf" - ["otherlibs/labltk/jpf"; "otherlibs/labltk/labltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/frx" - ["otherlibs/labltk/frx"; "otherlibs/labltk/camltk"; "otherlibs/labltk/support"; "stdlib"];; -Pathname.define_context "otherlibs/labltk/browser" - ["otherlibs/labltk/browser"; "otherlibs/labltk/labltk"; "otherlibs/labltk/support"; "parsing"; "utils"; "typing"; "stdlib"];; - -rule "otherlibs/labltk/compiler/copyright" - ~dep:"otherlibs/labltk/compiler/copyright" - ~prod:"otherlibs/labltk/compiler/copyright.ml" - begin fun _ _ -> - Echo(["let copyright = \""; - Pathname.read "otherlibs/labltk/compiler/copyright"; - "\";;\nlet write ~w = w copyright;;"], - "otherlibs/labltk/compiler/copyright.ml") - end;; - -copy_rule "labltk tkcompiler" "otherlibs/labltk/compiler/maincompile.byte" "otherlibs/labltk/compiler/tkcompiler";; -copy_rule "labltk pp" "otherlibs/labltk/compiler/pp.byte" "otherlibs/labltk/compiler/pp";; -copy_rule "labltk ocamlbrowser" "otherlibs/labltk/browser/main.byte" "otherlibs/labltk/browser/ocamlbrowser";; - -let builtins = - let dir = "otherlibs/labltk/builtin" in - List.filter (fun f -> not (Pathname.is_directory f)) - (List.map (fun f -> dir/f) (Array.to_list (Pathname.readdir dir)));; - -let labltk_support = - ["support"; "rawwidget"; "widget"; "protocol"; "textvariable"; "timer"; "fileevent"; "camltkwrap"];; - -let labltk_generated_modules = - ["place"; "wm"; "imagephoto"; "canvas"; "button"; "text"; "label"; "scrollbar"; - "image"; "encoding"; "pixmap"; "palette"; "font"; "message"; "menu"; "entry"; - "listbox"; "focus"; "menubutton"; "pack"; "option"; "toplevel"; "frame"; - "dialog"; "imagebitmap"; "clipboard"; "radiobutton"; "tkwait"; "grab"; - "selection"; "scale"; "optionmenu"; "winfo"; "grid"; "checkbutton"; "bell"; "tkvars"];; - -let labltk_generated_files = - let dir = "otherlibs/labltk/labltk" in - List.fold_right (fun x acc -> dir/x-.-"ml" :: dir/x-.-"mli" :: acc) - labltk_generated_modules [] in - -rule "labltk/_tkgen.ml" - ~deps:(["otherlibs/labltk/Widgets.src"; "otherlibs/labltk/compiler/tkcompiler"] @ builtins) - ~prods:("otherlibs/labltk/labltk/_tkgen.ml" :: "otherlibs/labltk/labltk/labltk.ml" :: labltk_generated_files) - begin fun env _ -> - Cmd(S[A"cd"; A"otherlibs/labltk"; Sh"&&"; full_ocamlrun; - A"compiler/tkcompiler"; A"-outdir"; Px"labltk"]) - end;; - -let camltk_generated_modules = - ["cPlace"; "cResource"; "cWm"; "cImagephoto"; "cCanvas"; "cButton"; "cText"; "cLabel"; - "cScrollbar"; "cImage"; "cEncoding"; "cPixmap"; "cPalette"; "cFont"; "cMessage"; - "cMenu"; "cEntry"; "cListbox"; "cFocus"; "cMenubutton"; "cPack"; "cOption"; "cToplevel"; - "cFrame"; "cDialog"; "cImagebitmap"; "cClipboard"; "cRadiobutton"; "cTkwait"; "cGrab"; - "cSelection"; "cScale"; "cOptionmenu"; "cWinfo"; "cGrid"; "cCheckbutton"; "cBell"; "cTkvars"];; - -let camltk_generated_files = - let dir = "otherlibs/labltk/camltk" in - List.fold_right (fun x acc -> dir/x-.-"ml" :: dir/x-.-"mli" :: acc) - camltk_generated_modules [] in - -rule "camltk/_tkgen.ml" - ~deps:(["otherlibs/labltk/Widgets.src"; "otherlibs/labltk/compiler/tkcompiler"] @ builtins) - ~prods:("otherlibs/labltk/camltk/_tkgen.ml" :: "otherlibs/labltk/camltk/camltk.ml" :: camltk_generated_files) - begin fun env _ -> - Cmd(S[A"cd"; A"otherlibs/labltk"; Sh"&&"; full_ocamlrun; - A"compiler/tkcompiler"; A"-camltk"; A"-outdir"; Px"camltk"]) - end;; - -rule "tk.ml" - ~prod:"otherlibs/labltk/labltk/tk.ml" - ~deps:(["otherlibs/labltk/labltk/_tkgen.ml"; - "otherlibs/labltk/compiler/pp.byte"] - @ builtins) - begin fun _ _ -> - Seq[Cmd(Sh"\ - (echo 'open StdLabels'; \ - echo 'open Widget'; \ - echo 'open Protocol'; \ - echo 'open Support'; \ - echo 'open Textvariable'; \ - cat otherlibs/labltk/builtin/report.ml; \ - cat otherlibs/labltk/builtin/builtin_*.ml; \ - cat otherlibs/labltk/labltk/_tkgen.ml; \ - echo ; \ - echo ; \ - echo 'module Tkintf = struct'; \ - cat otherlibs/labltk/builtin/builtini_*.ml; \ - cat otherlibs/labltk/labltk/_tkigen.ml; \ - echo 'end (* module Tkintf *)'; \ - echo ; \ - echo ; \ - echo 'open Tkintf' ;\ - echo ; \ - echo ; \ - cat otherlibs/labltk/builtin/builtinf_*.ml; \ - cat otherlibs/labltk/labltk/_tkfgen.ml; \ - echo ; \ - ) > otherlibs/labltk/labltk/_tk.ml"); - Cmd(S[ocamlrun; P"otherlibs/labltk/compiler/pp.byte"; Sh"<"; P"otherlibs/labltk/labltk/_tk.ml"; - Sh">"; Px"otherlibs/labltk/labltk/tk.ml"]); - rm_f "otherlibs/labltk/labltk/_tk.ml"] - end;; - -rule "cTk.ml" - ~prod:"otherlibs/labltk/camltk/cTk.ml" - ~deps:(["otherlibs/labltk/camltk/_tkgen.ml"; - "otherlibs/labltk/compiler/pp.byte"] - @ builtins) - begin fun _ _ -> - Seq[Cmd(Sh"\ - (echo '##define CAMLTK'; \ - echo 'include Camltkwrap'; \ - echo 'open Widget'; \ - echo 'open Protocol'; \ - echo 'open Textvariable'; \ - echo ; \ - cat otherlibs/labltk/builtin/report.ml; \ - echo ; \ - cat otherlibs/labltk/builtin/builtin_*.ml; \ - echo ; \ - cat otherlibs/labltk/camltk/_tkgen.ml; \ - echo ; \ - echo ; \ - echo 'module Tkintf = struct'; \ - cat otherlibs/labltk/builtin/builtini_*.ml; \ - cat otherlibs/labltk/camltk/_tkigen.ml; \ - echo 'end (* module Tkintf *)'; \ - echo ; \ - echo ; \ - echo 'open Tkintf' ;\ - echo ; \ - echo ; \ - cat otherlibs/labltk/builtin/builtinf_*.ml; \ - cat otherlibs/labltk/camltk/_tkfgen.ml; \ - echo ; \ - ) > otherlibs/labltk/camltk/_cTk.ml"); - Cmd(S[ocamlrun; P"otherlibs/labltk/compiler/pp.byte"; Sh"<"; P"otherlibs/labltk/camltk/_cTk.ml"; - Sh">"; Px"otherlibs/labltk/camltk/cTk.ml"]); - rm_f "otherlibs/labltk/camltk/_cTk.ml"] - end;; - -let labltk_lib_contents = - labltk_support - @ "tk" - :: labltk_generated_modules - @ "cTk" - :: camltk_generated_modules - @ ["labltk"; "camltk"];; - -let labltk_contents obj_ext = - List.map (fun x -> "otherlibs/labltk/support"/x-.-obj_ext) labltk_support - @ "otherlibs/labltk/labltk/tk"-.-obj_ext - :: List.map (fun x -> "otherlibs/labltk/labltk"/x-.-obj_ext) labltk_generated_modules - @ "otherlibs/labltk/camltk/cTk"-.-obj_ext - :: List.map (fun x -> "otherlibs/labltk/camltk"/x-.-obj_ext) camltk_generated_modules - @ ["otherlibs/labltk/labltk/labltk"-.-obj_ext; - "otherlibs/labltk/camltk/camltk"-.-obj_ext] -;; - -let labltk_cma_contents = labltk_contents "cmo" in -rule "labltk.cma" - ~prod:"otherlibs/labltk/lib/labltk.cma" - ~deps:labltk_cma_contents - (Ocamlbuild_pack.Ocaml_compiler.byte_library_link_modules - labltk_lib_contents "otherlibs/labltk/lib/labltk.cma");; - -let labltk_cmxa_contents = labltk_contents "cmx" in -rule "labltk.cmxa" - ~prods:["otherlibs/labltk/lib/labltk.cmxa"; "otherlibs/labltk/lib/labltk"-.-C.a] - ~deps:labltk_cmxa_contents - (Ocamlbuild_pack.Ocaml_compiler.native_library_link_modules - labltk_lib_contents "otherlibs/labltk/lib/labltk.cmxa");; - -rule "labltktop" - ~prod:(add_exe "otherlibs/labltk/lib/labltktop") - ~deps:["toplevel/toplevellib.cma"; "toplevel/topstart.cmo"; - "otherlibs/labltk/lib/labltk.cma"; "otherlibs/labltk/support/liblabltk"-.-C.a] - begin fun _ _ -> - Cmd(S[!Options.ocamlc; A"-verbose"; A"-linkall"; A"-o"; Px(add_exe "otherlibs/labltk/lib/labltktop"); - A"-I"; P"otherlibs/labltk/support"; A"-I"; P"toplevel"; P"toplevellib.cma"; - A"-I"; P"otherlibs/labltk/labltk"; A"-I"; P"otherlibs/labltk/camltk"; - A"-I"; P"otherlibs/labltk/lib"; P"labltk.cma"; A"-I"; P unix_dir; P"unix.cma"; - A"-I"; P"otherlibs/str"; A"-I"; P "stdlib"; P"str.cma"; P"topstart.cmo"]) - end;; - -let labltk_installdir = C.libdir/"labltk" in -rule "labltk" - ~prod:"otherlibs/labltk/lib/labltk" - begin fun _ _ -> - Echo(["#!/bin/sh\n"; - Printf.sprintf "exec %s -I %s \"$@\"\n" (labltk_installdir/"labltktop") labltk_installdir], - "otherlibs/labltk/lib/labltk") - end;; - -use_lib "otherlibs/labltk/browser/main" "toplevel/toplevellib";; -use_lib "otherlibs/labltk/browser/main" "otherlibs/labltk/browser/jglib";; -use_lib "otherlibs/labltk/browser/main" "otherlibs/labltk/lib/labltk";; - -if windows then begin - - dep ["ocaml"; "link"; "program"; "ocamlbrowser"] ["otherlibs/labltk/browser/winmain"-.-C.o]; - flag ["ocaml"; "link"; "program"; "ocamlbrowser"] (S[A"-custom"; A"threads.cma"]); - - match ccomptype with - | "cc" -> flag ["ocaml"; "link"; "program"; "ocamlbrowser"] (S[A"-ccopt"; A"-Wl,--subsystem,windows"]) - | "msvc" -> flag ["ocaml"; "link"; "program"; "ocamlbrowser"] (S[A"-ccopt"; A"/link /subsystem:windows"]) - | _ -> assert false - -end;; - -let space_sep_strings s = Ocamlbuild_pack.Lexers.space_sep_strings (Lexing.from_string s);; - -flag [(* "ocaml" or "c"; *) "ocamlmklib"; "otherlibs_labltk"] - (if windows then begin - S(List.fold_right (fun s acc -> A"-cclib" :: A s :: acc) (space_sep_strings C.tk_link) []) - end else Sh C.tk_link);; - -flag ["ocaml"; "link"; "program"; "otherlibs_labltk"] (S[A"-I"; A"otherlibs/labltk/support"]);; - -flag ["c"; "compile"; "otherlibs_labltk"] (A"-Iotherlibs/labltk/support");; - -copy_rule "ocamlbrowser dummy module" - ("otherlibs/labltk/browser"/(if windows then "dummyWin.mli" else "dummyUnix.mli")) - "otherlibs/labltk/browser/dummy.mli";; - - end in () - | _ -> () -end diff --git a/myocamlbuild_config.mli b/myocamlbuild_config.mli deleted file mode 100644 index 340ce687..00000000 --- a/myocamlbuild_config.mli +++ /dev/null @@ -1,72 +0,0 @@ -(*************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Nicolas Pouillard, projet Gallium, INRIA Rocquencourt *) -(* *) -(* Copyright 2007 Institut National de Recherche en Informatique et *) -(* en Automatique. All rights reserved. This file is distributed *) -(* under the terms of the Q Public License version 1.0. *) -(* *) -(*************************************************************************) - -val prefix : string -val bindir : string -val libdir : string -val manext : string -val ranlib : string -val ranlibcmd : string -val arcmd : string -val sharpbangscripts : bool -val bng_arch : string -val bng_asm_level : string -val pthread_link : string -val x11_includes : string -val x11_link : string -val tk_link : string -val bytecc : string -val bytecccompopts : string -val bytecclinkopts : string -val bytecclibs : string -val byteccrpath : string -val exe : string -val supports_shared_libraries : bool -val sharedcccompopts : string -val mksharedlibrpath : string -val arch : string -val model : string -val system : string -val nativecc : string -val nativecccompopts : string -val nativeccprofopts : string -val nativecclinkopts : string -val nativeccrpath : string -val nativecclibs : string -val packld : string -val dllcccompopts : string -val asm : string -val aspp : string -val asppprofflags : string -val profiling : string -val dynlinkopts : string -val otherlibraries : string -val debugger : string -val cc_profile : string -val systhread_support : bool -val syslib : string -> string -val mkexe : string -val mkdll : string -val mkmaindll : string -val mklib : string -> string -> string -> string -val ext_lib : string -val ext_obj : string -val ext_asm : string -val ext_dll : string -val o : string -val a : string -val so : string -val toolchain : string -val ccomptype : string -val extralibs : string -val tk_defs : string -val asm_cfi_supported : bool diff --git a/ocamlbuild/.depend b/ocamlbuild/.depend index 5344160e..3b67d873 100644 --- a/ocamlbuild/.depend +++ b/ocamlbuild/.depend @@ -1,6 +1,6 @@ bool.cmi : command.cmi : tags.cmi signatures.cmi -configuration.cmi : tags.cmi pathname.cmi +configuration.cmi : tags.cmi pathname.cmi loc.cmi digest_cache.cmi : discard_printf.cmi : display.cmi : tags.cmi @@ -13,7 +13,8 @@ glob_ast.cmi : bool.cmi glob_lexer.cmi : glob_ast.cmi hooks.cmi : hygiene.cmi : slurp.cmi -lexers.cmi : glob.cmi +lexers.cmi : loc.cmi glob.cmi +loc.cmi : log.cmi : tags.cmi signatures.cmi main.cmi : my_std.cmi : signatures.cmi @@ -31,7 +32,7 @@ ocamlbuild_unix_plugin.cmi : ocamlbuild_where.cmi : ocamlbuildlight.cmi : options.cmi : slurp.cmi signatures.cmi command.cmi -param_tags.cmi : tags.cmi +param_tags.cmi : tags.cmi loc.cmi pathname.cmi : signatures.cmi plugin.cmi : ppcache.cmi : @@ -47,13 +48,15 @@ tools.cmi : tags.cmi pathname.cmi bool.cmo : bool.cmi bool.cmx : bool.cmi command.cmo : tags.cmi shell.cmi param_tags.cmi my_unix.cmi my_std.cmi \ - log.cmi lexers.cmi command.cmi + log.cmi lexers.cmi const.cmo command.cmi command.cmx : tags.cmx shell.cmx param_tags.cmx my_unix.cmx my_std.cmx \ - log.cmx lexers.cmi command.cmi -configuration.cmo : tags.cmi param_tags.cmi my_std.cmi log.cmi lexers.cmi \ - glob.cmi configuration.cmi -configuration.cmx : tags.cmx param_tags.cmx my_std.cmx log.cmx lexers.cmi \ - glob.cmx configuration.cmi + log.cmx lexers.cmx const.cmx command.cmi +configuration.cmo : tags.cmi param_tags.cmi my_std.cmi log.cmi loc.cmi \ + lexers.cmi glob.cmi const.cmo configuration.cmi +configuration.cmx : tags.cmx param_tags.cmx my_std.cmx log.cmx loc.cmx \ + lexers.cmx glob.cmx const.cmx configuration.cmi +const.cmo : +const.cmx : digest_cache.cmo : shell.cmi pathname.cmi options.cmi my_unix.cmi my_std.cmi \ digest_cache.cmi digest_cache.cmx : shell.cmx pathname.cmx options.cmx my_unix.cmx my_std.cmx \ @@ -66,32 +69,42 @@ exit_codes.cmo : exit_codes.cmi exit_codes.cmx : exit_codes.cmi fda.cmo : pathname.cmi options.cmi log.cmi hygiene.cmi fda.cmi fda.cmx : pathname.cmx options.cmx log.cmx hygiene.cmx fda.cmi -findlib.cmo : my_unix.cmi my_std.cmi lexers.cmi command.cmi findlib.cmi -findlib.cmx : my_unix.cmx my_std.cmx lexers.cmi command.cmx findlib.cmi -flags.cmo : tags.cmi param_tags.cmi command.cmi bool.cmi flags.cmi -flags.cmx : tags.cmx param_tags.cmx command.cmx bool.cmx flags.cmi +findlib.cmo : my_unix.cmi my_std.cmi lexers.cmi const.cmo command.cmi \ + findlib.cmi +findlib.cmx : my_unix.cmx my_std.cmx lexers.cmx const.cmx command.cmx \ + findlib.cmi +flags.cmo : tags.cmi param_tags.cmi log.cmi command.cmi bool.cmi flags.cmi +flags.cmx : tags.cmx param_tags.cmx log.cmx command.cmx bool.cmx flags.cmi glob.cmo : my_std.cmi glob_lexer.cmi glob_ast.cmi bool.cmi glob.cmi -glob.cmx : my_std.cmx glob_lexer.cmi glob_ast.cmx bool.cmx glob.cmi +glob.cmx : my_std.cmx glob_lexer.cmx glob_ast.cmx bool.cmx glob.cmi glob_ast.cmo : bool.cmi glob_ast.cmi glob_ast.cmx : bool.cmx glob_ast.cmi +glob_lexer.cmo : glob_ast.cmi bool.cmi glob_lexer.cmi +glob_lexer.cmx : glob_ast.cmx bool.cmx glob_lexer.cmi hooks.cmo : hooks.cmi hooks.cmx : hooks.cmi hygiene.cmo : slurp.cmi shell.cmi pathname.cmi options.cmi my_std.cmi \ log.cmi hygiene.cmi hygiene.cmx : slurp.cmx shell.cmx pathname.cmx options.cmx my_std.cmx \ log.cmx hygiene.cmi +lexers.cmo : my_std.cmi loc.cmi glob_ast.cmi glob.cmi bool.cmi lexers.cmi +lexers.cmx : my_std.cmx loc.cmx glob_ast.cmx glob.cmx bool.cmx lexers.cmi +loc.cmo : loc.cmi +loc.cmx : loc.cmi log.cmo : my_unix.cmi my_std.cmi display.cmi log.cmi log.cmx : my_unix.cmx my_std.cmx display.cmx log.cmi main.cmo : tools.cmi tags.cmi solver.cmi slurp.cmi shell.cmi rule.cmi \ resource.cmi report.cmi plugin.cmi pathname.cmi param_tags.cmi \ options.cmi ocaml_utils.cmi ocaml_specific.cmi ocaml_dependencies.cmi \ - my_unix.cmi my_std.cmi log.cmi lexers.cmi hooks.cmi flags.cmi fda.cmi \ - exit_codes.cmi digest_cache.cmi configuration.cmi command.cmi main.cmi + my_unix.cmi my_std.cmi log.cmi loc.cmi lexers.cmi hooks.cmi flags.cmi \ + fda.cmi exit_codes.cmi digest_cache.cmi const.cmo configuration.cmi \ + command.cmi main.cmi main.cmx : tools.cmx tags.cmx solver.cmx slurp.cmx shell.cmx rule.cmx \ resource.cmx report.cmx plugin.cmx pathname.cmx param_tags.cmx \ options.cmx ocaml_utils.cmx ocaml_specific.cmx ocaml_dependencies.cmx \ - my_unix.cmx my_std.cmx log.cmx lexers.cmi hooks.cmx flags.cmx fda.cmx \ - exit_codes.cmx digest_cache.cmx configuration.cmx command.cmx main.cmi + my_unix.cmx my_std.cmx log.cmx loc.cmx lexers.cmx hooks.cmx flags.cmx \ + fda.cmx exit_codes.cmx digest_cache.cmx const.cmx configuration.cmx \ + command.cmx main.cmi my_std.cmo : my_std.cmi my_std.cmx : my_std.cmi my_unix.cmo : my_std.cmi my_unix.cmi @@ -109,11 +122,13 @@ ocaml_dependencies.cmo : tools.cmi resource.cmi pathname.cmi ocaml_utils.cmi \ ocaml_dependencies.cmx : tools.cmx resource.cmx pathname.cmx ocaml_utils.cmx \ my_std.cmx log.cmx ocaml_dependencies.cmi ocaml_specific.cmo : tools.cmi tags.cmi rule.cmi pathname.cmi options.cmi \ - ocaml_utils.cmi ocaml_tools.cmi ocaml_compiler.cmi my_std.cmi log.cmi \ - flags.cmi findlib.cmi configuration.cmi command.cmi ocaml_specific.cmi + ocamlbuild_config.cmo ocaml_utils.cmi ocaml_tools.cmi ocaml_compiler.cmi \ + my_std.cmi log.cmi flags.cmi findlib.cmi configuration.cmi command.cmi \ + ocaml_specific.cmi ocaml_specific.cmx : tools.cmx tags.cmx rule.cmx pathname.cmx options.cmx \ - ocaml_utils.cmx ocaml_tools.cmx ocaml_compiler.cmx my_std.cmx log.cmx \ - flags.cmx findlib.cmx configuration.cmx command.cmx ocaml_specific.cmi + ocamlbuild_config.cmx ocaml_utils.cmx ocaml_tools.cmx ocaml_compiler.cmx \ + my_std.cmx log.cmx flags.cmx findlib.cmx configuration.cmx command.cmx \ + ocaml_specific.cmi ocaml_tools.cmo : tools.cmi tags.cmi rule.cmi pathname.cmi options.cmi \ ocaml_utils.cmi ocaml_compiler.cmi my_std.cmi flags.cmi command.cmi \ ocaml_tools.cmi @@ -121,13 +136,15 @@ ocaml_tools.cmx : tools.cmx tags.cmx rule.cmx pathname.cmx options.cmx \ ocaml_utils.cmx ocaml_compiler.cmx my_std.cmx flags.cmx command.cmx \ ocaml_tools.cmi ocaml_utils.cmo : tools.cmi tags.cmi pathname.cmi param_tags.cmi options.cmi \ - my_std.cmi log.cmi lexers.cmi flags.cmi command.cmi ocaml_utils.cmi + my_std.cmi log.cmi lexers.cmi flags.cmi const.cmo command.cmi \ + ocaml_utils.cmi ocaml_utils.cmx : tools.cmx tags.cmx pathname.cmx param_tags.cmx options.cmx \ - my_std.cmx log.cmx lexers.cmi flags.cmx command.cmx ocaml_utils.cmi + my_std.cmx log.cmx lexers.cmx flags.cmx const.cmx command.cmx \ + ocaml_utils.cmi ocamlbuild.cmo : ocamlbuild_unix_plugin.cmi ocamlbuild.cmi ocamlbuild.cmx : ocamlbuild_unix_plugin.cmx ocamlbuild.cmi -ocamlbuild_Myocamlbuild_config.cmo : -ocamlbuild_Myocamlbuild_config.cmx : +ocamlbuild_config.cmo : +ocamlbuild_config.cmx : ocamlbuild_executor.cmo : ocamlbuild_executor.cmi ocamlbuild_executor.cmx : ocamlbuild_executor.cmi ocamlbuild_plugin.cmo : ocamlbuild_plugin.cmi @@ -136,30 +153,28 @@ ocamlbuild_unix_plugin.cmo : ocamlbuild_executor.cmi my_unix.cmi my_std.cmi \ exit_codes.cmi ocamlbuild_unix_plugin.cmi ocamlbuild_unix_plugin.cmx : ocamlbuild_executor.cmx my_unix.cmx my_std.cmx \ exit_codes.cmx ocamlbuild_unix_plugin.cmi -ocamlbuild_where.cmo : ocamlbuild_Myocamlbuild_config.cmo \ - ocamlbuild_where.cmi -ocamlbuild_where.cmx : ocamlbuild_Myocamlbuild_config.cmx \ - ocamlbuild_where.cmi +ocamlbuild_where.cmo : ocamlbuild_config.cmo ocamlbuild_where.cmi +ocamlbuild_where.cmx : ocamlbuild_config.cmx ocamlbuild_where.cmi ocamlbuildlight.cmo : ocamlbuildlight.cmi ocamlbuildlight.cmx : ocamlbuildlight.cmi -options.cmo : shell.cmi ocamlbuild_where.cmi \ - ocamlbuild_Myocamlbuild_config.cmo my_std.cmi log.cmi lexers.cmi \ - command.cmi options.cmi -options.cmx : shell.cmx ocamlbuild_where.cmx \ - ocamlbuild_Myocamlbuild_config.cmx my_std.cmx log.cmx lexers.cmi \ - command.cmx options.cmi -param_tags.cmo : my_std.cmi log.cmi lexers.cmi param_tags.cmi -param_tags.cmx : my_std.cmx log.cmx lexers.cmi param_tags.cmi +options.cmo : shell.cmi ocamlbuild_where.cmi ocamlbuild_config.cmo \ + my_std.cmi log.cmi lexers.cmi const.cmo command.cmi options.cmi +options.cmx : shell.cmx ocamlbuild_where.cmx ocamlbuild_config.cmx \ + my_std.cmx log.cmx lexers.cmx const.cmx command.cmx options.cmi +param_tags.cmo : tags.cmi my_std.cmi log.cmi loc.cmi lexers.cmi \ + param_tags.cmi +param_tags.cmx : tags.cmx my_std.cmx log.cmx loc.cmx lexers.cmx \ + param_tags.cmi pathname.cmo : shell.cmi options.cmi my_unix.cmi my_std.cmi log.cmi glob.cmi \ pathname.cmi pathname.cmx : shell.cmx options.cmx my_unix.cmx my_std.cmx log.cmx glob.cmx \ pathname.cmi -plugin.cmo : tools.cmi tags.cmi shell.cmi rule.cmi pathname.cmi options.cmi \ - ocamlbuild_where.cmi my_unix.cmi my_std.cmi log.cmi command.cmi \ - plugin.cmi -plugin.cmx : tools.cmx tags.cmx shell.cmx rule.cmx pathname.cmx options.cmx \ - ocamlbuild_where.cmx my_unix.cmx my_std.cmx log.cmx command.cmx \ - plugin.cmi +plugin.cmo : tools.cmi tags.cmi shell.cmi rule.cmi pathname.cmi \ + param_tags.cmi options.cmi ocamlbuild_where.cmi my_unix.cmi my_std.cmi \ + log.cmi const.cmo command.cmi plugin.cmi +plugin.cmx : tools.cmx tags.cmx shell.cmx rule.cmx pathname.cmx \ + param_tags.cmx options.cmx ocamlbuild_where.cmx my_unix.cmx my_std.cmx \ + log.cmx const.cmx command.cmx plugin.cmi ppcache.cmo : shell.cmi pathname.cmi my_std.cmi log.cmi command.cmi \ ppcache.cmi ppcache.cmx : shell.cmx pathname.cmx my_std.cmx log.cmx command.cmx \ @@ -168,14 +183,14 @@ report.cmo : solver.cmi resource.cmi my_std.cmi log.cmi glob.cmi report.cmi report.cmx : solver.cmx resource.cmx my_std.cmx log.cmx glob.cmx report.cmi resource.cmo : slurp.cmi shell.cmi pathname.cmi options.cmi my_unix.cmi \ my_std.cmi log.cmi lexers.cmi glob_ast.cmi glob.cmi digest_cache.cmi \ - command.cmi resource.cmi + const.cmo command.cmi resource.cmi resource.cmx : slurp.cmx shell.cmx pathname.cmx options.cmx my_unix.cmx \ - my_std.cmx log.cmx lexers.cmi glob_ast.cmx glob.cmx digest_cache.cmx \ - command.cmx resource.cmi -rule.cmo : tags.cmi shell.cmi resource.cmi pathname.cmi options.cmi \ - my_std.cmi log.cmi digest_cache.cmi command.cmi rule.cmi -rule.cmx : tags.cmx shell.cmx resource.cmx pathname.cmx options.cmx \ - my_std.cmx log.cmx digest_cache.cmx command.cmx rule.cmi + my_std.cmx log.cmx lexers.cmx glob_ast.cmx glob.cmx digest_cache.cmx \ + const.cmx command.cmx resource.cmi +rule.cmo : shell.cmi resource.cmi pathname.cmi options.cmi my_std.cmi \ + log.cmi digest_cache.cmi command.cmi rule.cmi +rule.cmx : shell.cmx resource.cmx pathname.cmx options.cmx my_std.cmx \ + log.cmx digest_cache.cmx command.cmx rule.cmi shell.cmo : tags.cmi my_unix.cmi my_std.cmi log.cmi shell.cmi shell.cmx : tags.cmx my_unix.cmx my_std.cmx log.cmx shell.cmi slurp.cmo : my_unix.cmi my_std.cmi slurp.cmi diff --git a/ocamlbuild/Makefile b/ocamlbuild/Makefile index fe011bd6..b40d0ead 100644 --- a/ocamlbuild/Makefile +++ b/ocamlbuild/Makefile @@ -10,119 +10,200 @@ # # ######################################################################### -.PHONY: all byte native profile debug ppcache doc - -ifndef INSTALL_PREFIX -INSTALL_PREFIX := $(PWD)/_install -endif - -ifndef INSTALL_LIB -INSTALL_LIB := $(INSTALL_PREFIX)/lib/ocamlbuild -endif - -ifndef INSTALL_BIN -INSTALL_BIN := $(INSTALL_PREFIX)/bin -endif - -ifndef BUILDDIR -BUILDDIR := "_build" -endif - -ifndef OCAMLBUILDCMD -OCAMLBUILDCMD := ./boot/ocamlbuild -endif - -ifdef O -OCAMLBUILD_OPTIONS := $(OCAMLBUILD_OPTIONS) $(O) -endif - -ifeq ($(wildcard ./ocamlbuild_Myocamlbuil*_config.ml),./ocamlbuild_Myocamlbuild_config.ml) -ifeq ($(wildcard ./boot/oc*build),./boot/ocamlbuild) -OCAMLBUILD=INSTALL_LIB=$(INSTALL_LIB) INSTALL_BIN=$(INSTALL_BIN) $(OCAMLBUILDCMD) -build-dir $(BUILDDIR) -no-links $(OCAMLBUILD_OPTIONS) -LIBS=ocamlbuildlib ocamlbuildlightlib -PROGRAMS=ocamlbuild ocamlbuildlight -BYTE=$(LIBS:=.cma) $(PROGRAMS:=.byte) -NATIVE=$(LIBS:=.cmxa) $(PROGRAMS:=.native) - -all: - $(OCAMLBUILD) $(BYTE) $(NATIVE) -byte: - $(OCAMLBUILD) $(BYTE) -native: - $(OCAMLBUILD) $(NATIVE) -profile: - $(OCAMLBUILD) $(LIBS:=.p.cmxa) $(PROGRAMS:=.p.native) -debug: - $(OCAMLBUILD) $(LIBS:=.d.cma) $(PROGRAMS:=.d.byte) -ppcache: - $(OCAMLBUILD) ppcache.byte ppcache.native -doc: - $(OCAMLBUILD) ocamlbuild.docdir/index.html - ln -s -f $(BUILDDIR)/ocamlbuild.docdir doc -else -all byte native: ocamlbuild.byte.start - mkdir -p boot - cp ocamlbuild.byte.start boot/ocamlbuild - $(MAKE) $(MFLAGS) $(MAKECMDGOALS) - cp $(BUILDDIR)/ocamlbuild.native boot/ocamlbuild - $(MAKE) $(MFLAGS) $(MAKECMDGOALS) OCAMLBUILD_OPTIONS="-nothing-should-be-rebuilt -verbose -1" -endif -else -all byte native: - @echo "Please copy the myocamlbuild_config.ml of the OCaml source distribution" - @echo " as ocamlbuild_Myocamlbuild_config.ml" - @echo - @echo "$$ cp ../myocamlbuild_config.ml ocamlbuild_Myocamlbuild_config.ml" -endif - -ocamlbuild.byte.start: - ./start.sh - -promote: - cp $(BUILDDIR)/ocamlbuild.native boot/ocamlbuild - -clean: - rm -rf $(BUILDDIR) - -distclean: clean - rm -rf _log _start ocamlbuild.byte.start boot/ocamlbuild - -install: all - mkdir -p $(INSTALL_BIN) - mkdir -p $(INSTALL_LIB) - install $(BUILDDIR)/ocamlbuild.byte \ - $(BUILDDIR)/ocamlbuild.native \ - $(BUILDDIR)/ocamlbuildlight.byte \ - $(BUILDDIR)/ocamlbuildlight.native \ - $(INSTALL_BIN) - install $(BUILDDIR)/ocamlbuild.native $(INSTALL_BIN)/ocamlbuild - install $(BUILDDIR)/ocamlbuildlight.byte $(INSTALL_BIN)/ocamlbuildlight - install -m 644 \ - $(BUILDDIR)/ocamlbuildlib.cmxa \ - $(BUILDDIR)/ocamlbuildlib.a \ - $(BUILDDIR)/ocamlbuildlib.cma \ - $(BUILDDIR)/ocamlbuildlightlib.cmxa \ - $(BUILDDIR)/ocamlbuildlightlib.a \ - $(BUILDDIR)/ocamlbuildlightlib.cma \ - $(BUILDDIR)/ocamlbuild_unix_plugin.cmx \ - $(BUILDDIR)/ocamlbuild_unix_plugin.o \ - $(BUILDDIR)/ocamlbuild_unix_plugin.cmo \ - $(BUILDDIR)/ocamlbuild_unix_plugin.cmi \ - $(BUILDDIR)/ocamlbuild_executor.cmi \ - $(BUILDDIR)/ocamlbuild_executor.cmo \ - $(BUILDDIR)/ocamlbuild_executor.cmx \ - $(BUILDDIR)/ocamlbuild_executor.o \ - $(BUILDDIR)/ocamlbuild_pack.cmi \ - $(BUILDDIR)/ocamlbuild_pack.cmo \ - $(BUILDDIR)/ocamlbuild_pack.cmx \ - $(BUILDDIR)/ocamlbuild_pack.o \ - $(BUILDDIR)/ocamlbuild.cmi \ - $(BUILDDIR)/ocamlbuild_plugin.cmi \ - $(BUILDDIR)/ocamlbuild.cmx \ - $(BUILDDIR)/ocamlbuild.o \ - $(BUILDDIR)/ocamlbuild.cmo \ - $(BUILDDIR)/ocamlbuildlight.cmx \ - $(BUILDDIR)/ocamlbuildlight.o \ - $(BUILDDIR)/ocamlbuildlight.cmo $(INSTALL_LIB) - ranlib $(INSTALL_LIB)/ocamlbuildlib.a - ranlib $(INSTALL_LIB)/ocamlbuildlightlib.a +include ../config/Makefile + +ROOTDIR = .. +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +CP = cp +COMPFLAGS= -warn-error A -w L -w R -w Z -I ../otherlibs/$(UNIXLIB) -safe-string +LINKFLAGS= -I ../otherlibs/$(UNIXLIB) + +PACK_CMO=\ + const.cmo \ + loc.cmo \ + discard_printf.cmo \ + signatures.cmi \ + my_std.cmo \ + my_unix.cmo \ + tags.cmo \ + display.cmo \ + log.cmo \ + shell.cmo \ + bool.cmo \ + glob_ast.cmo \ + glob_lexer.cmo \ + glob.cmo \ + lexers.cmo \ + param_tags.cmo \ + command.cmo \ + ocamlbuild_config.cmo \ + ocamlbuild_where.cmo \ + slurp.cmo \ + options.cmo \ + pathname.cmo \ + configuration.cmo \ + flags.cmo \ + hygiene.cmo \ + digest_cache.cmo \ + resource.cmo \ + rule.cmo \ + solver.cmo \ + report.cmo \ + tools.cmo \ + fda.cmo \ + findlib.cmo \ + ocaml_arch.cmo \ + ocaml_utils.cmo \ + ocaml_dependencies.cmo \ + ocaml_compiler.cmo \ + ocaml_tools.cmo \ + ocaml_specific.cmo \ + plugin.cmo \ + exit_codes.cmo \ + hooks.cmo \ + main.cmo + +EXTRA_CMO=\ + ocamlbuild_plugin.cmo \ + ocamlbuild_executor.cmo \ + ocamlbuild_unix_plugin.cmo + +PACK_CMX=$(PACK_CMO:.cmo=.cmx) +EXTRA_CMX=$(EXTRA_CMO:.cmo=.cmx) +EXTRA_CMI=$(EXTRA_CMO:.cmo=.cmi) + +INSTALL_LIB=\ + ocamlbuildlib.cma \ + ocamlbuild.cmo \ + ocamlbuild_pack.cmi \ + $(EXTRA_CMO:.cmo=.cmi) + +INSTALL_LIB_OPT=\ + ocamlbuildlib.cmxa ocamlbuildlib.$(A) \ + ocamlbuild.cmx ocamlbuild.$(O) \ + ocamlbuild_pack.cmx \ + $(EXTRA_CMO:.cmo=.cmx) $(EXTRA_CMO:.cmo=.$(O)) + +INSTALL_LIBDIR=$(DESTDIR)$(LIBDIR)/ocamlbuild +INSTALL_BINDIR=$(DESTDIR)$(BINDIR) + +all: ocamlbuild.byte ocamlbuildlib.cma + # ocamlbuildlight.byte ocamlbuildlightlib.cma +allopt: ocamlbuild.native ocamlbuildlib.cmxa + +# The executables + +ocamlbuild.byte: ocamlbuild_pack.cmo $(EXTRA_CMO) ocamlbuild.cmo + $(OCAMLC) $(LINKFLAGS) -o ocamlbuild.byte \ + unix.cma ocamlbuild_pack.cmo $(EXTRA_CMO) ocamlbuild.cmo + +ocamlbuildlight.byte: ocamlbuild_pack.cmo ocamlbuildlight.cmo + $(OCAMLC) $(LINKFLAGS) -o ocamlbuildlight.byte \ + ocamlbuild_pack.cmo ocamlbuildlight.cmo + +ocamlbuild.native: ocamlbuild_pack.cmx $(EXTRA_CMX) ocamlbuild.cmx + $(OCAMLOPT) $(LINKFLAGS) -o ocamlbuild.native \ + unix.cmxa ocamlbuild_pack.cmx $(EXTRA_CMX) ocamlbuild.cmx + +# The libraries + +ocamlbuildlib.cma: ocamlbuild_pack.cmo $(EXTRA_CMO) + $(OCAMLC) -a -o ocamlbuildlib.cma \ + ocamlbuild_pack.cmo $(EXTRA_CMO) + +ocamlbuildlightlib.cma: ocamlbuild_pack.cmo ocamlbuildlight.cmo + $(OCAMLC) -a -o ocamlbuildlightlib.cma \ + ocamlbuild_pack.cmo ocamlbuildlight.cmo + +ocamlbuildlib.cmxa: ocamlbuild_pack.cmx $(EXTRA_CMX) + $(OCAMLOPT) -a -o ocamlbuildlib.cmxa \ + ocamlbuild_pack.cmx $(EXTRA_CMX) + +# The packs + +ocamlbuild_pack.cmo ocamlbuild_pack.cmi: $(PACK_CMO) + $(OCAMLC) -pack $(PACK_CMO) -o ocamlbuild_pack.cmo + +ocamlbuild_pack.cmx: $(PACK_CMX) + $(OCAMLOPT) -pack $(PACK_CMX) -o ocamlbuild_pack.cmx + +# The config file + +ocamlbuild_config.ml: ../config/Makefile + (echo 'let bindir = "$(BINDIR)"'; \ + echo 'let libdir = "$(LIBDIR)"'; \ + echo 'let supports_shared_libraries = $(SUPPORTS_SHARED_LIBRARIES)';\ + echo 'let a = "$(A)"'; \ + echo 'let o = "$(O)"'; \ + echo 'let so = "$(SO)"'; \ + echo 'let exe = "$(EXE)"'; \ + ) > ocamlbuild_config.ml +clean:: + rm -f ocamlbuild_config.ml +beforedepend:: ocamlbuild_config.ml + +# The lexers + +lexers.ml: lexers.mll + $(OCAMLLEX) lexers.mll +clean:: + rm -f lexers.ml +beforedepend:: lexers.ml + +glob_lexer.ml: glob_lexer.mll + $(OCAMLLEX) glob_lexer.mll +clean:: + rm -f glob_lexer.ml +beforedepend:: glob_lexer.ml + +# Installation + +install: + $(CP) ocamlbuild.byte $(INSTALL_BINDIR)/ocamlbuild$(EXE) + $(CP) ocamlbuild.byte $(INSTALL_BINDIR)/ocamlbuild.byte$(EXE) + mkdir -p $(INSTALL_LIBDIR) + $(CP) $(INSTALL_LIB) $(INSTALL_LIBDIR)/ + +installopt: + if test -f ocamlbuild.native; then $(MAKE) installopt_really; fi + +installopt_really: + $(CP) ocamlbuild.native $(INSTALL_BINDIR)/ocamlbuild$(EXE) + $(CP) ocamlbuild.native $(INSTALL_BINDIR)/ocamlbuild.native$(EXE) + mkdir -p $(INSTALL_LIBDIR) + $(CP) $(INSTALL_LIB_OPT) $(INSTALL_LIBDIR)/ + +# The generic rules + +.SUFFIXES: .ml .mli .cmo .cmi .cmx + +.ml.cmo: + $(OCAMLC) $(COMPFLAGS) -c $< + +.mli.cmi: + $(OCAMLC) $(COMPFLAGS) -c $< + +.ml.cmx: + $(OCAMLOPT) -for-pack Ocamlbuild_pack $(COMPFLAGS) -c $< + +clean:: + rm -f *.cm? *.$(O) *.cmxa *.$(A) + rm -f *.byte *.native + +# The dependencies + +depend: beforedepend + $(OCAMLDEP) *.mli *.ml > .depend + +$(EXTRA_CMI): ocamlbuild_pack.cmi +$(EXTRA_CMO): ocamlbuild_pack.cmo ocamlbuild_pack.cmi +$(EXTRA_CMX): ocamlbuild_pack.cmx ocamlbuild_pack.cmi + +include .depend + +.PHONY: all allopt clean beforedepend +.PHONY: install installopt installopt_really depend diff --git a/ocamlbuild/Makefile.noboot b/ocamlbuild/Makefile.noboot index 02f7c735..313e5689 100644 --- a/ocamlbuild/Makefile.noboot +++ b/ocamlbuild/Makefile.noboot @@ -17,11 +17,13 @@ include ../config/Makefile # Various commands and dir ########################## -CAMLRUN = ../boot/ocamlrun -OCAMLC = ../ocamlcomp.sh -OCAMLOPT = ../ocamlcompopt.sh -OCAMLDEP = $(CAMLRUN) ../tools/ocamldep -OCAMLLEX = $(CAMLRUN) ../boot/ocamllex + +ROOTDIR = .. +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex OCAMLLIB = $(LIBDIR) OCAMLBIN = $(BINDIR) @@ -35,10 +37,9 @@ OCAMLBUILD_LIBCMA=ocamlbuildlib.cma OCAMLBUILD_LIBCMI=ocamlbuildlib.cmi OCAMLBUILD_LIBCMXA=ocamlbuild.cmxa OCAMLBUILD_LIBA=ocamlbuild.$(A) -INSTALL_LIBDIR=$(OCAMLLIB)/ocamlbuild +INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamlbuild INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(OCAMLBIN) -INSTALL_MANODIR=$(MANDIR)/man3 +INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) INSTALL_MLIS= INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) @@ -51,11 +52,11 @@ INCLUDES_DEP= INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ -I $(OCAMLSRCDIR)/otherlibs/str \ -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/unix + -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) -COMPFLAGS=$(INCLUDES) -warn-error A +COMPFLAGS=$(INCLUDES) -warn-error A -safe-string LINKFLAGS=$(INCLUDES) CMOFILES_PACK= \ diff --git a/ocamlbuild/command.ml b/ocamlbuild/command.ml index 64b818c1..fc6e07cf 100644 --- a/ocamlbuild/command.ml +++ b/ocamlbuild/command.ml @@ -99,10 +99,7 @@ let env_path = lazy begin Lexers.parse_environment_path in let paths = - try - parse_path (Lexing.from_string path_var) - with Lexers.Error (msg,pos) -> raise (Lexers.Error ("$PATH: " ^ msg, pos)) - in + parse_path Const.Source.path (Lexing.from_string path_var) in let norm_current_dir_name path = if path = "" then Filename.current_dir_name else path in @@ -128,7 +125,7 @@ let virtual_solver virtual_command = (* On Windows, we need to also check for the ".exe" version of the file. *) let file_or_exe_exists file = - sys_file_exists file || Sys.os_type = "Win32" && sys_file_exists (file ^ ".exe") + sys_file_exists file || (Sys.os_type = "Win32" && sys_file_exists (file ^ ".exe")) let search_in_path cmd = (* Try to find [cmd] in path [path]. *) diff --git a/ocamlbuild/configuration.ml b/ocamlbuild/configuration.ml index c77cca92..6290e60a 100644 --- a/ocamlbuild/configuration.ml +++ b/ocamlbuild/configuration.ml @@ -18,38 +18,45 @@ open Lexers type t = Lexers.conf -let acknowledge_config config = - List.iter - (fun (_, config) -> List.iter Param_tags.acknowledge config.plus_tags) - config +let acknowledge_config source config = + let ack (tag, loc) = Param_tags.acknowledge source (Some loc) tag in + List.iter (fun (_, config) -> List.iter ack config.plus_tags) config let cache = Hashtbl.create 107 let (configs, add_config) = let configs = ref [] in (fun () -> !configs), - (fun config -> - acknowledge_config config; + (fun source config -> + acknowledge_config source config; configs := config :: !configs; Hashtbl.clear cache) let parse_lexbuf ?dir source lexbuf = - lexbuf.Lexing.lex_curr_p <- { lexbuf.Lexing.lex_curr_p with Lexing.pos_fname = source }; - let conf = Lexers.conf_lines dir lexbuf in - add_config conf + let conf = Lexers.conf_lines dir source lexbuf in + add_config source conf -let parse_string s = parse_lexbuf (Printf.sprintf "String %S" s) (Lexing.from_string s) +let parse_string ?source s = + let source = match source with + | Some source -> source + | None -> Const.Source.configuration + in + parse_lexbuf source (lexbuf_of_string s) let parse_file ?dir file = with_input_file file begin fun ic -> - parse_lexbuf ?dir (Printf.sprintf "File %S" file) (Lexing.from_channel ic) + let lexbuf = Lexing.from_channel ic in + set_lexbuf_fname file lexbuf; + parse_lexbuf ?dir Const.Source.file lexbuf end let key_match = Glob.eval let apply_config s (config : t) init = + let add (tag, _loc) = Tags.add tag in + let remove (tag, _loc) = Tags.remove tag in List.fold_left begin fun tags (key, v) -> if key_match key s then - List.fold_right Tags.add v.plus_tags (List.fold_right Tags.remove v.minus_tags tags) + List.fold_right add v.plus_tags (List.fold_right remove v.minus_tags tags) else tags end init config @@ -70,3 +77,18 @@ let tag_file file tags = let tag_any tags = if tags <> [] then parse_string (Printf.sprintf "true: %s" (String.concat ", " tags));; + +let check_tags_usage useful_tags = + let check_tag (tag, loc) = + if not (Tags.mem tag useful_tags) then + Log.eprintf "%aWarning: the tag %S is not used in any flag declaration, \ + so it will have no effect; it may be a typo. Otherwise use \ + `mark_tag_used` in your myocamlbuild.ml to disable \ + this warning." + Loc.print_loc loc tag + in + let check_conf (_, values) = + List.iter check_tag values.plus_tags; + List.iter check_tag values.minus_tags; + in + List.iter (List.iter check_conf) (configs ()) diff --git a/ocamlbuild/configuration.mli b/ocamlbuild/configuration.mli index 37ee64eb..2bfd6bb8 100644 --- a/ocamlbuild/configuration.mli +++ b/ocamlbuild/configuration.mli @@ -18,7 +18,7 @@ (** Incorporate a newline-separated configuration string into the current configuration. Will usually raising an [Invalid_arg] with an appropriately explicit message in case of error. *) -val parse_string : string -> unit +val parse_string : ?source:Loc.source -> string -> unit (** [parse_file ?dir fn] incorporates the configuration file named [fn], prefixing its glob patterns with [dir] if given. *) @@ -37,3 +37,8 @@ val tag_any : Tags.elt list -> unit (** the tags that apply to any file *) val global_tags : unit -> Tags.t + +(** Given the list of all tags that are really used by an existing + flagset, traverse existing configuration files and warns on tags + that will never get used. *) +val check_tags_usage : Tags.t -> unit diff --git a/ocamlbuild/const.ml b/ocamlbuild/const.ml new file mode 100644 index 00000000..dac87789 --- /dev/null +++ b/ocamlbuild/const.ml @@ -0,0 +1,11 @@ +module Source = struct + let file = "file" + let command_line = "command-line" + let path = "path" + let ocamlfind_query = "ocamlfind query" + let ocamldep = "ocamldep" + let target_pattern = "target pattern" + let builtin = "builtin configuration" + let configuration = "configuration" + let plugin_tag = "plugin tag" +end diff --git a/ocamlbuild/display.ml b/ocamlbuild/display.ml index 725d351b..2e0b1e39 100644 --- a/ocamlbuild/display.ml +++ b/ocamlbuild/display.ml @@ -51,7 +51,7 @@ type sophisticated_display = { ds_columns : int; (** Number of columns in dssplay *) mutable ds_jobs : int; (** Number of jobs launched or cached *) mutable ds_jobs_cached : int; (** Number of jobs cached *) - ds_tagline : string; (** Current tagline *) + ds_tagline : bytes; (** Current tagline *) mutable ds_seen_tags : Tags.t; (** Tags that we have encountered *) ds_pathname_length : int; (** How much space for displaying pathnames ? *) ds_tld : tagline_description; (** Description for the tagline *) @@ -105,7 +105,7 @@ let uncached = " ";; let cache_chars = 1;; (* ***) (*** create_tagline *) -let create_tagline description = String.make (List.length description) '-';; +let create_tagline description = Bytes.make (List.length description) '-';; (* ***) (*** create *) let create @@ -184,7 +184,7 @@ let print_shortened_pathname length oc u = let n = String.length dots in let k = length - n in output_string oc dots; - output oc u (m - k) k; + output_substring oc u (m - k) k; end (* ***) (*** Layout @@ -216,7 +216,7 @@ let redraw_sophisticated ds = ds.ds_jobs_cached (print_shortened_pathname ds.ds_pathname_length) ds.ds_last_target (if ds.ds_last_cached then cached else uncached) - ds.ds_tagline + (Bytes.to_string ds.ds_tagline) ticker; fp oc "%a%!" ANSI.clear_to_eol () ;; @@ -292,17 +292,17 @@ let update_tagline_from_tags ds = let tags = ds.ds_last_tags in let rec loop i = function | [] -> - for j = i to String.length tagline - 1 do - tagline.[j] <- '-' + for j = i to Bytes.length tagline - 1 do + Bytes.set tagline j '-' done | (tag, c) :: rest -> if Tags.mem tag tags then - tagline.[i] <- Char.uppercase c + Bytes.set tagline i (Char.uppercase c) else if Tags.mem tag ds.ds_seen_tags then - tagline.[i] <- Char.lowercase c + Bytes.set tagline i (Char.lowercase c) else - tagline.[i] <- '-'; + Bytes.set tagline i '-'; loop (i + 1) rest in loop 0 ds.ds_tld; diff --git a/ocamlbuild/findlib.ml b/ocamlbuild/findlib.ml index 199bc4fd..18f4d2c9 100644 --- a/ocamlbuild/findlib.ml +++ b/ocamlbuild/findlib.ml @@ -74,15 +74,19 @@ let rec query name = with Not_found -> try let n, d, v, a_byte, lo, l = - run_and_parse Lexers.ocamlfind_query + run_and_parse + (Lexers.ocamlfind_query Const.Source.ocamlfind_query) "%s query -l -predicates byte %s" ocamlfind name in let a_native = - run_and_parse Lexers.trim_blanks + run_and_parse + (Lexers.trim_blanks Const.Source.ocamlfind_query) "%s query -a-format -predicates native %s" ocamlfind name in let deps = - run_and_parse Lexers.blank_sep_strings "%s query -r -p-format %s" ocamlfind name + run_and_parse + (Lexers.blank_sep_strings Const.Source.ocamlfind_query) + "%s query -r -p-format %s" ocamlfind name in let deps = List.filter ((<>) n) deps in let deps = diff --git a/ocamlbuild/flags.ml b/ocamlbuild/flags.ml index 9999f835..c776953b 100644 --- a/ocamlbuild/flags.ml +++ b/ocamlbuild/flags.ml @@ -15,24 +15,35 @@ open Command open Bool (* FIXME remove me *) open Tags.Operators -let all_flags = ref [] -let of_tags tags = +type decl = { + tags: Tags.t; + flags: Command.spec; + deprecated: bool; +} +let flags_of_decl { flags; _ } = flags +let tags_of_decl { tags; _ } = tags + +let all_decls = ref [] + +let of_tags matched_tags = S begin - List.fold_left begin fun acc (xtags, xflags) -> - if Tags.does_match tags xtags then xflags :: acc + List.fold_left begin fun acc { tags; flags; _ } -> + if Tags.does_match matched_tags tags then flags :: acc else acc - end [] !all_flags + end [] !all_decls end let () = Command.tag_handler := of_tags let of_tag_list x = of_tags (Tags.of_list x) -let set_flags tags flags = - all_flags := (tags, flags) :: !all_flags +let add_decl decl = + all_decls := decl :: !all_decls -let flag tags flags = set_flags (Tags.of_list tags) flags +let flag ?(deprecated=false) tags flags = + let tags = Tags.of_list tags in + add_decl { tags; flags; deprecated } let pflag tags ptag flags = Param_tags.declare ptag @@ -41,4 +52,27 @@ let pflag tags ptag flags = let add x xs = x :: xs let remove me = List.filter (fun x -> me <> x) -let get_flags () = !all_flags +let pretty_print { tags; flags; deprecated } = + let sflag = Command.string_of_command_spec flags in + let header = if deprecated then "deprecated flag" else "flag" in + let pp fmt = Log.raw_dprintf (-1) fmt in + pp "@[<2>%s@ {. %a .}@ %S@]@\n@\n" header Tags.print tags sflag + +let show_documentation () = + List.iter + (fun decl -> if not decl.deprecated then pretty_print decl) + !all_decls; + List.iter + (fun decl -> if decl.deprecated then pretty_print decl) + !all_decls; + let pp fmt = Log.raw_dprintf (-1) fmt in + pp "@." + +let used_tags = ref Tags.empty + +let mark_tag_used tag = + used_tags := Tags.add tag !used_tags + +let get_used_tags () = + List.fold_left (fun acc decl -> Tags.union acc decl.tags) + !used_tags !all_decls diff --git a/ocamlbuild/flags.mli b/ocamlbuild/flags.mli index 13c5436a..b32de2bc 100644 --- a/ocamlbuild/flags.mli +++ b/ocamlbuild/flags.mli @@ -14,11 +14,27 @@ (* Original author: Nicolas Pouillard *) val of_tags : Tags.t -> Command.spec val of_tag_list : Tags.elt list -> Command.spec -val flag : Tags.elt list -> Command.spec -> unit + +(* The ?deprecated parameter marks the flag declaration as deprecated, + because it is superseded by a different, better way to express the + same thing (eg. a parametrized tag). So far, it is only used when + showing documentation. + + This flag is not exported in OCamlbuild_plugin interface for now. It + would make sense to let plugin authors deprecate their own flags, + but it has to be balanced again the simplicity of the plugin + interface exposed. If you're reading this as a plugin author that + has a real need for deprecation, drop us a note on the bugtracker. *) +val flag : ?deprecated:bool -> Tags.elt list -> Command.spec -> unit + val pflag : Tags.elt list -> string -> (string -> Command.spec) -> unit val add : 'a -> 'a list -> 'a list val remove : 'a -> 'a list -> 'a list -(** For system use only *) +val show_documentation : unit -> unit + +(** "useful" tags: they are used by a tag declaration, or have been + explicitly added with [mark_as_used] *) +val get_used_tags : unit -> Tags.t -val get_flags : unit -> (Tags.t * Command.spec) list +val mark_tag_used : Tags.elt -> unit diff --git a/ocamlbuild/lexers.mli b/ocamlbuild/lexers.mli index ae4939aa..5b14f04c 100644 --- a/ocamlbuild/lexers.mli +++ b/ocamlbuild/lexers.mli @@ -12,37 +12,37 @@ (* Original author: Nicolas Pouillard *) -exception Error of (string * Lexing.position) +exception Error of (string * Loc.location) type conf_values = - { plus_tags : string list; - minus_tags : string list } + { plus_tags : (string * Loc.location) list; + minus_tags : (string * Loc.location) list } type conf = (Glob.globber * conf_values) list -val ocamldep_output : Lexing.lexbuf -> (string * string list) list -val space_sep_strings : Lexing.lexbuf -> string list -val blank_sep_strings : Lexing.lexbuf -> string list -val comma_sep_strings : Lexing.lexbuf -> string list -val comma_or_blank_sep_strings : Lexing.lexbuf -> string list -val trim_blanks : Lexing.lexbuf -> string +val ocamldep_output : Loc.source -> Lexing.lexbuf -> (string * string list) list +val space_sep_strings : Loc.source -> Lexing.lexbuf -> string list +val blank_sep_strings : Loc.source -> Lexing.lexbuf -> string list +val comma_sep_strings : Loc.source -> Lexing.lexbuf -> string list +val comma_or_blank_sep_strings : Loc.source -> Lexing.lexbuf -> string list +val trim_blanks : Loc.source -> Lexing.lexbuf -> string (* Parse an environment path (i.e. $PATH). This is a colon separated string. Note: successive colons means an empty string. Example: ":aaa:bbb:::ccc:" -> [""; "aaa"; "bbb"; ""; ""; "ccc"; ""] *) -val parse_environment_path : Lexing.lexbuf -> string list +val parse_environment_path : Loc.source -> Lexing.lexbuf -> string list (* Same one, for Windows (PATH is ;-separated) *) -val parse_environment_path_w : Lexing.lexbuf -> string list +val parse_environment_path_w : Loc.source -> Lexing.lexbuf -> string list -val conf_lines : string option -> Lexing.lexbuf -> conf -val path_scheme : bool -> Lexing.lexbuf -> +val conf_lines : string option -> Loc.source -> Lexing.lexbuf -> conf +val path_scheme : bool -> Loc.source -> Lexing.lexbuf -> [ `Word of string | `Var of (string * Glob.globber) ] list -val ocamlfind_query : Lexing.lexbuf -> +val ocamlfind_query : Loc.source -> Lexing.lexbuf -> string * string * string * string * string * string -val tag_gen : Lexing.lexbuf -> string * string option +val tag_gen : Loc.source -> Lexing.lexbuf -> string * string option diff --git a/ocamlbuild/lexers.mll b/ocamlbuild/lexers.mll index 12099feb..d0b8cfdb 100644 --- a/ocamlbuild/lexers.mll +++ b/ocamlbuild/lexers.mll @@ -13,24 +13,33 @@ (* Original author: Nicolas Pouillard *) { -exception Error of (string * Lexing.position) +exception Error of (string * Loc.location) -let error lexbuf fmt = Printf.ksprintf (fun s -> raise (Error (s,Lexing.lexeme_start_p lexbuf))) fmt +let error source lexbuf fmt = + Printf.ksprintf (fun s -> + raise (Error (s, Loc.of_lexbuf source lexbuf)) + ) fmt open Glob_ast type conf_values = - { plus_tags : string list; - minus_tags : string list } + { plus_tags : (string * Loc.location) list; + minus_tags : (string * Loc.location) list } type conf = (Glob.globber * conf_values) list let empty = { plus_tags = []; minus_tags = [] } + +let locate source lexbuf txt = + (txt, Loc.of_lexbuf source lexbuf) + +let sublex lexer s = lexer (Lexing.from_string s) } let newline = ('\n' | '\r' | "\r\n") let space = [' ' '\t' '\012'] let space_or_esc_nl = (space | '\\' newline) +let sp = space_or_esc_nl let blank = newline | space let not_blank = [^' ' '\t' '\012' '\n' '\r'] let not_space_nor_comma = [^' ' '\t' '\012' ','] @@ -42,118 +51,122 @@ let tag = normal+ | ( normal+ ':' normal+ ) | normal+ '(' [^ ')' ]* ')' let variable = [ 'a'-'z' 'A'-'Z' '_' '-' '0'-'9' ]* let pattern = ([^ '(' ')' '\\' ] | '\\' [ '(' ')' ])* -rule ocamldep_output = parse - | ([^ ':' '\n' '\r' ]+ as k) ':' { let x = (k, space_sep_strings_nl lexbuf) in x :: ocamldep_output lexbuf } +rule ocamldep_output source = parse + | ([^ ':' '\n' '\r' ]+ as k) ':' { let x = (k, space_sep_strings_nl source lexbuf) in x :: ocamldep_output source lexbuf } | eof { [] } - | _ { error lexbuf "Expecting colon followed by space-separated module name list" } + | _ { error source lexbuf "Expecting colon followed by space-separated module name list" } -and space_sep_strings_nl = parse - | space* (not_blank+ as word) { word :: space_sep_strings_nl lexbuf } +and space_sep_strings_nl source = parse + | space* (not_blank+ as word) { word :: space_sep_strings_nl source lexbuf } | space* newline { Lexing.new_line lexbuf; [] } - | _ { error lexbuf "Expecting space-separated strings terminated with newline" } + | _ { error source lexbuf "Expecting space-separated strings terminated with newline" } -and space_sep_strings = parse - | space* (not_blank+ as word) { word :: space_sep_strings lexbuf } +and space_sep_strings source = parse + | space* (not_blank+ as word) { word :: space_sep_strings source lexbuf } | space* newline? eof { [] } - | _ { error lexbuf "Expecting space-separated strings" } + | _ { error source lexbuf "Expecting space-separated strings" } -and blank_sep_strings = parse - | blank* '#' not_newline* newline { blank_sep_strings lexbuf } +and blank_sep_strings source = parse + | blank* '#' not_newline* newline { blank_sep_strings source lexbuf } | blank* '#' not_newline* eof { [] } - | blank* (not_blank+ as word) { word :: blank_sep_strings lexbuf } + | blank* (not_blank+ as word) { word :: blank_sep_strings source lexbuf } | blank* eof { [] } - | _ { error lexbuf "Expecting blank-separated strings" } + | _ { error source lexbuf "Expecting blank-separated strings" } -and comma_sep_strings = parse +and comma_sep_strings source = parse | space* (not_space_nor_comma+ as word) space* eof { [word] } - | space* (not_space_nor_comma+ as word) { word :: comma_sep_strings_aux lexbuf } + | space* (not_space_nor_comma+ as word) { word :: comma_sep_strings_aux source lexbuf } | space* eof { [] } - | _ { error lexbuf "Expecting comma-separated strings (1)" } -and comma_sep_strings_aux = parse - | space* ',' space* (not_space_nor_comma+ as word) { word :: comma_sep_strings_aux lexbuf } + | _ { error source lexbuf "Expecting comma-separated strings (1)" } +and comma_sep_strings_aux source = parse + | space* ',' space* (not_space_nor_comma+ as word) { word :: comma_sep_strings_aux source lexbuf } | space* eof { [] } - | _ { error lexbuf "Expecting comma-separated strings (2)" } + | _ { error source lexbuf "Expecting comma-separated strings (2)" } -and comma_or_blank_sep_strings = parse +and comma_or_blank_sep_strings source = parse | space* (not_space_nor_comma+ as word) space* eof { [word] } - | space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux lexbuf } + | space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux source lexbuf } | space* eof { [] } - | _ { error lexbuf "Expecting (comma|blank)-separated strings (1)" } -and comma_or_blank_sep_strings_aux = parse - | space* ',' space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux lexbuf } - | space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux lexbuf } + | _ { error source lexbuf "Expecting (comma|blank)-separated strings (1)" } +and comma_or_blank_sep_strings_aux source = parse + | space* ',' space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux source lexbuf } + | space* (not_space_nor_comma+ as word) { word :: comma_or_blank_sep_strings_aux source lexbuf } | space* eof { [] } - | _ { error lexbuf "Expecting (comma|blank)-separated strings (2)" } + | _ { error source lexbuf "Expecting (comma|blank)-separated strings (2)" } -and parse_environment_path_w = parse - | ([^ ';']* as word) { word :: parse_environment_path_aux_w lexbuf } - | ';' ([^ ';']* as word) { "" :: word :: parse_environment_path_aux_w lexbuf } +and parse_environment_path_w source = parse + | ([^ ';']* as word) { word :: parse_environment_path_aux_w source lexbuf } + | ';' ([^ ';']* as word) { "" :: word :: parse_environment_path_aux_w source lexbuf } | eof { [] } -and parse_environment_path_aux_w = parse - | ';' ([^ ';']* as word) { word :: parse_environment_path_aux_w lexbuf } +and parse_environment_path_aux_w source = parse + | ';' ([^ ';']* as word) { word :: parse_environment_path_aux_w source lexbuf } | eof { [] } - | _ { error lexbuf "Impossible: expecting colon-separated strings" } + | _ { error source lexbuf "Impossible: expecting colon-separated strings" } -and parse_environment_path = parse - | ([^ ':']* as word) { word :: parse_environment_path_aux lexbuf } - | ':' ([^ ':']* as word) { "" :: word :: parse_environment_path_aux lexbuf } +and parse_environment_path source = parse + | ([^ ':']* as word) { word :: parse_environment_path_aux source lexbuf } + | ':' ([^ ':']* as word) { "" :: word :: parse_environment_path_aux source lexbuf } | eof { [] } -and parse_environment_path_aux = parse - | ':' ([^ ':']* as word) { word :: parse_environment_path_aux lexbuf } +and parse_environment_path_aux source = parse + | ':' ([^ ':']* as word) { word :: parse_environment_path_aux source lexbuf } | eof { [] } - | _ { error lexbuf "Impossible: expecting colon-separated strings" } + | _ { error source lexbuf "Impossible: expecting colon-separated strings" } -and conf_lines dir = parse - | space* '#' not_newline* newline { Lexing.new_line lexbuf; conf_lines dir lexbuf } +and conf_lines dir source = parse + | space* '#' not_newline* newline { Lexing.new_line lexbuf; conf_lines dir source lexbuf } | space* '#' not_newline* eof { [] } - | space* newline { Lexing.new_line lexbuf; conf_lines dir lexbuf } + | space* newline { Lexing.new_line lexbuf; conf_lines dir source lexbuf } | space* eof { [] } - | space* (not_newline_nor_colon+ as k) space* ':' space* + | space* (not_newline_nor_colon+ as k) (sp* as s1) ':' (sp* as s2) { let bexpr = try Glob.parse ?dir k - with exn -> error lexbuf "Invalid globbing pattern %S" k (Printexc.to_string exn) + with exn -> error source lexbuf "Invalid globbing pattern %S" k (Printexc.to_string exn) in - let v1 = conf_value empty lexbuf in - let v2 = conf_values v1 lexbuf in - Lexing.new_line lexbuf; (* FIXME values may have escaped newlines *) - let rest = conf_lines dir lexbuf in (bexpr,v2) :: rest + sublex (count_lines lexbuf) s1; sublex (count_lines lexbuf) s2; + let v1 = conf_value empty source lexbuf in + let v2 = conf_values v1 source lexbuf in + let rest = conf_lines dir source lexbuf in (bexpr,v2) :: rest } - | _ { error lexbuf "Invalid line syntax" } - -and conf_value x = parse - | '-' (tag as tag) { { (x) with minus_tags = tag :: x.minus_tags } } - | '+'? (tag as tag) { { (x) with plus_tags = tag :: x.plus_tags } } - | (_ | eof) { error lexbuf "Invalid tag modifier only '+ or '-' are allowed as prefix for tag" } - -and conf_values x = parse - | space_or_esc_nl* ',' space_or_esc_nl* { conf_values (conf_value x lexbuf) lexbuf } - | (newline | eof) { x } - | (_ | eof) { error lexbuf "Only ',' separated tags are alllowed" } - -and path_scheme patt_allowed = parse + | _ { error source lexbuf "Invalid line syntax" } + +and conf_value x source = parse + | '-' (tag as tag) { { (x) with minus_tags = locate source lexbuf tag :: x.minus_tags } } + | '+'? (tag as tag) { { (x) with plus_tags = locate source lexbuf tag :: x.plus_tags } } + | (_ | eof) { error source lexbuf "Invalid tag modifier only '+ or '-' are allowed as prefix for tag" } + +and conf_values x source = parse + | (sp* as s1) ',' (sp* as s2) { + sublex (count_lines lexbuf) s1; sublex (count_lines lexbuf) s2; + conf_values (conf_value x source lexbuf) source lexbuf + } + | newline { Lexing.new_line lexbuf; x } + | eof { x } + | _ { error source lexbuf "Only ',' separated tags are alllowed" } + +and path_scheme patt_allowed source = parse | ([^ '%' ]+ as prefix) - { `Word prefix :: path_scheme patt_allowed lexbuf } + { `Word prefix :: path_scheme patt_allowed source lexbuf } | "%(" (variable as var) ')' - { `Var (var, Bool.True) :: path_scheme patt_allowed lexbuf } + { `Var (var, Bool.True) :: path_scheme patt_allowed source lexbuf } | "%(" (variable as var) ':' (pattern as patt) ')' { if patt_allowed then let patt = My_std.String.implode (unescape (Lexing.from_string patt)) in - `Var (var, Glob.parse patt) :: path_scheme patt_allowed lexbuf + `Var (var, Glob.parse patt) :: path_scheme patt_allowed source lexbuf else - error lexbuf "Patterns are not allowed in this pathname (%%(%s:%s) only in ~prod)" var patt } + error source lexbuf "Patterns are not allowed in this pathname (%%(%s:%s) only in ~prod)" var patt } | '%' - { `Var ("", Bool.True) :: path_scheme patt_allowed lexbuf } + { `Var ("", Bool.True) :: path_scheme patt_allowed source lexbuf } | eof { [] } - | _ { error lexbuf "Bad pathanme scheme" } + | _ { error source lexbuf "Bad pathanme scheme" } and unescape = parse | '\\' (['(' ')'] as c) { c :: unescape lexbuf } | _ as c { c :: unescape lexbuf } | eof { [] } -and ocamlfind_query = parse +and ocamlfind_query source = parse | newline* "package:" space* (not_newline* as n) newline+ "description:" space* (not_newline* as d) newline+ @@ -162,11 +175,17 @@ and ocamlfind_query = parse "linkopts:" space* (not_newline* as lo) newline+ "location:" space* (not_newline* as l) newline+ { n, d, v, a, lo, l } - | _ { error lexbuf "Bad ocamlfind query" } + | _ { error source lexbuf "Bad ocamlfind query" } -and trim_blanks = parse +and trim_blanks source = parse | blank* (not_blank* as word) blank* { word } - | _ { error lexbuf "Bad input for trim_blanks" } + | _ { error source lexbuf "Bad input for trim_blanks" } -and tag_gen = parse +and tag_gen source = parse | (normal+ as name) ('(' ([^')']* as param) ')')? { name, param } + | _ { error source lexbuf "Not a valid parametrized tag" } + +and count_lines lb = parse + | space* { count_lines lb lexbuf } + | '\\' newline { Lexing.new_line lb; count_lines lb lexbuf } + | eof { () } diff --git a/ocamlbuild/loc.ml b/ocamlbuild/loc.ml new file mode 100644 index 00000000..7a324c16 --- /dev/null +++ b/ocamlbuild/loc.ml @@ -0,0 +1,35 @@ +(* it's not worth adding a dependency on parsing/location.ml(i) or + compilerlibs just to support location printing, so we re-implement + that here *) + +open Lexing + +(* We use a loosely structural type so that this bit of code can be + easily reused by project that would wish it, without introducing + any type-compatibility burden. *) +type source = string (* "file", "environment variable", "command-line option" ... *) +type location = source * position * position + +let file loc = loc.pos_fname +let line loc = loc.pos_lnum +let char loc = loc.pos_cnum - loc.pos_bol + +let print_loc ppf (source, start, end_) = + let open Format in + let print one_or_two ppf (start_num, end_num) = + if one_or_two then fprintf ppf " %d" start_num + else fprintf ppf "s %d-%d" start_num end_num in + fprintf ppf "%s %S, line%a, character%a:@." + (String.capitalize source) + (file start) + (print (line start = line end_)) + (line start, line end_) + (print (line start = line end_ && char start = char end_)) + (char start, char end_) + +let of_lexbuf source lexbuf = + (source, lexbuf.lex_start_p, lexbuf.lex_curr_p) + +let print_loc_option ppf = function + | None -> () + | Some loc -> print_loc ppf loc diff --git a/ocamlbuild/loc.mli b/ocamlbuild/loc.mli new file mode 100644 index 00000000..c5768bc1 --- /dev/null +++ b/ocamlbuild/loc.mli @@ -0,0 +1,7 @@ +type source = string +type location = source * Lexing.position * Lexing.position + +val print_loc : Format.formatter -> location -> unit +val print_loc_option : Format.formatter -> location option -> unit + +val of_lexbuf : source -> Lexing.lexbuf -> location diff --git a/ocamlbuild/log.ml b/ocamlbuild/log.ml index 380c9a59..d50969e3 100644 --- a/ocamlbuild/log.ml +++ b/ocamlbuild/log.ml @@ -48,7 +48,31 @@ let update () = Display.update !-internal_display let event ?pretend x = Display.event !-internal_display ?pretend x let display x = Display.display !-internal_display x +let do_at_end = Queue.create () +let already_asked = Hashtbl.create 10 + +let at_end_always ~name thunk = + if not (Hashtbl.mem already_asked name) then begin + Hashtbl.add already_asked name (); + Queue.add thunk do_at_end; + end + +let at_end ~name thunk = at_end_always ~name (function + | `Quiet -> () + | `Success | `Error -> thunk `Error) +let at_failure ~name thunk = at_end_always ~name (function + | `Success | `Quiet -> () + | `Error -> thunk `Error) + let finish ?how () = + while not (Queue.is_empty do_at_end) do + let actions = Queue.copy do_at_end in + Queue.clear do_at_end; + (* calling a thunk may add new actions again, hence the loop *) + Queue.iter (fun thunk -> + thunk (match how with None -> `Quiet | Some how -> how) + ) actions; + done; match !internal_display with | None -> () | Some d -> Display.finish ?how d diff --git a/ocamlbuild/log.mli b/ocamlbuild/log.mli index a414608a..413a476d 100644 --- a/ocamlbuild/log.mli +++ b/ocamlbuild/log.mli @@ -32,3 +32,13 @@ val finish : ?how:[`Success|`Error|`Quiet] -> unit -> unit val display : (out_channel -> unit) -> unit val update : unit -> unit val mode : string -> bool + +(** Wrap logging event so that only fire at the end of the compilation + process, possibly depending on the termination status. + + The name is used to avoid printing the same hint/warning twice, + even if [at_end] is called several times. Use different names for + distinct events. +*) +val at_end : name:string -> ([> `Error | `Quiet ] -> unit) -> unit +val at_failure : name:string -> ([> `Error ] -> unit) -> unit diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index ecf4b579..07ca9c06 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -48,17 +48,20 @@ let show_tags () = ;; let show_documentation () = - let rules = Rule.get_rules () in - let flags = Flags.get_flags () in - let pp fmt = Log.raw_dprintf (-1) fmt in - List.iter begin fun rule -> - pp "%a@\n@\n" (Rule.pretty_print Resource.print_pattern) rule - end rules; - List.iter begin fun (tags, flag) -> - let sflag = Command.string_of_command_spec flag in - pp "@[<2>flag@ {. %a .}@ %S@]@\n@\n" Tags.print tags sflag - end flags; - pp "@." + Rule.show_documentation (); + Flags.show_documentation (); +;; + +(* these tags are used in an ad-hoc way by the ocamlbuild implementation; + this means that even if they were not part of any flag declaration, + they should be marked as useful, to avoid the "unused tag" warning. *) +let builtin_useful_tags = + Tags.of_list [ + "include"; "traverse"; "not_hygienic"; + "pack"; "ocamlmklib"; "native"; "thread"; + "nopervasives"; "use_menhir"; "ocamldep"; + "thread"; + ] ;; let proceed () = @@ -78,7 +81,7 @@ let proceed () = let target_dirs = List.union [] (List.map Pathname.dirname !Options.targets) in - Configuration.parse_string + Configuration.parse_string ~source:Const.Source.builtin "<**/*.ml> or <**/*.mli> or <**/*.mlpack> or <**/*.ml.depends>: ocaml\n\ <**/*.byte>: ocaml, byte, program\n\ <**/*.odoc>: ocaml, doc\n\ @@ -90,16 +93,21 @@ let proceed () = <**/*.cmx>: ocaml, native\n\ "; + List.iter + (Configuration.parse_string ~source:Const.Source.command_line) + !Options.tag_lines; + Configuration.tag_any !Options.tags; - if !Options.recursive - || Sys.file_exists (* authorized since we're not in build *) "_tags" - || Sys.file_exists (* authorized since we're not in build *) "myocamlbuild.ml" + if !Options.recursive || Options.ocamlbuild_project_heuristic () then Configuration.tag_any ["traverse"]; (* options related to findlib *) - List.iter - (fun pkg -> Configuration.tag_any [Param_tags.make "package" pkg]) - !Options.ocaml_pkgs; + if !Options.use_ocamlfind then + List.iter + (fun pkg -> + let tag = Param_tags.make "package" pkg in + Configuration.tag_any [tag]) + !Options.ocaml_pkgs; begin match !Options.ocaml_syntax with | Some syntax -> Configuration.tag_any [Param_tags.make "syntax" syntax] @@ -110,7 +118,7 @@ let proceed () = let entry_include_dirs = ref [] in let entry = Slurp.filter - begin fun path name _ -> + begin fun path name () -> let dir = if path = Filename.current_dir_name then None @@ -118,8 +126,21 @@ let proceed () = Some path in let path_name = path/name in - if name = "_tags" then - ignore (Configuration.parse_file ?dir path_name); + + if name = "_tags" then begin + let tags_path = + (* PR#6482: remember that this code is run lazily by the Slurp command, + and may run only after the working directory has been changed. + + On the other hand, always using the absolute path makes + error messages longer and more frigthening in case of + syntax error in the _tags file. So we use the absolute + path only when necessary -- the working directory has + changed. *) + if Sys.getcwd () = Pathname.pwd then path_name + else Pathname.pwd / path_name in + ignore (Configuration.parse_file ?dir tags_path); + end; (List.mem name ["_oasis"] || (String.length name > 0 && name.[0] <> '_')) && (name <> !Options.build_dir && not (List.mem name !Options.exclude_dirs)) @@ -148,18 +169,15 @@ let proceed () = let tags = tags_of_pathname (path/name) in not (Tags.mem "not_hygienic" tags) && not (Tags.mem "precious" tags) end entry in + Slurp.force hygiene_entry; if !Options.hygiene && not first_run_for_plugin then - Fda.inspect hygiene_entry - else - Slurp.force hygiene_entry; + Fda.inspect hygiene_entry; let entry = hygiene_entry in Hooks.call_hook Hooks.After_hygiene; Options.include_dirs := Pathname.current_dir_name :: List.rev !entry_include_dirs; dprintf 3 "include directories are:@ %a" print_string_list !Options.include_dirs; Options.entry := Some entry; - List.iter Configuration.parse_string !Options.tag_lines; - Hooks.call_hook Hooks.Before_rules; Ocaml_specific.init (); Hooks.call_hook Hooks.After_rules; @@ -182,6 +200,10 @@ let proceed () = show_documentation (); raise Exit_silently end; + + let all_tags = Tags.union builtin_useful_tags (Flags.get_used_tags ()) in + Configuration.check_tags_usage all_tags; + Digest_cache.init (); Sys.catch_break true; @@ -278,8 +300,10 @@ let main () = Log.finish ~how:`Quiet (); Pervasives.exit rc | Solver.Failed backtrace -> - Log.raw_dprintf (-1) "@[@[<2>Solver failed:@ %a@]@\n@[Backtrace:%a@]@]@." - Report.print_backtrace_analyze backtrace Report.print_backtrace backtrace; + Log.raw_dprintf (-1) "@[@[<2>Solver failed:@ %a@]@." + Report.print_backtrace_analyze backtrace; + Log.raw_dprintf 1 "@[Backtrace:%a@]@]@." + Report.print_backtrace backtrace; exit rc_solver_failed | Failure s -> Log.eprintf "Failure:@ %s." s; @@ -297,9 +321,8 @@ let main () = | Ocaml_utils.Ocamldep_error msg -> Log.eprintf "Ocamldep error: %s" msg; exit rc_ocamldep_error - | Lexers.Error (msg,pos) -> - let module L = Lexing in - Log.eprintf "%s, line %d, column %d: Lexing error: %s." pos.L.pos_fname pos.L.pos_lnum (pos.L.pos_cnum - pos.L.pos_bol) msg; + | Lexers.Error (msg,loc) -> + Log.eprintf "%aLexing error: %s." Loc.print_loc loc msg; exit rc_lexing_error | Arg.Bad msg -> Log.eprintf "%s" msg; diff --git a/ocamlbuild/man/ocamlbuild.1 b/ocamlbuild/man/ocamlbuild.1 index 1f0c6855..b02d340b 100644 --- a/ocamlbuild/man/ocamlbuild.1 +++ b/ocamlbuild/man/ocamlbuild.1 @@ -236,6 +236,9 @@ Set the OCaml native compiler \fB\-ocamldep\fR Set the OCaml dependency tool .TP +\fB\-ocamldoc\fR +Set the OCaml documentation generator +.TP \fB\-ocamlyacc\fR Set the ocamlyacc tool .TP diff --git a/ocamlbuild/my_std.ml b/ocamlbuild/my_std.ml index 8de751f7..4dce7a0c 100644 --- a/ocamlbuild/my_std.ml +++ b/ocamlbuild/my_std.ml @@ -180,14 +180,7 @@ module String = struct in loop s 0 let tr patt subst text = - let len = length text in - let text = copy text in - let rec loop pos = - if pos < len then begin - (if text.[pos] = patt then text.[pos] <- subst); - loop (pos + 1) - end - in loop 0; text + String.map (fun c -> if c = patt then subst else c) text (*** is_prefix : is u a prefix of v ? *) let is_prefix u v = @@ -211,23 +204,23 @@ module String = struct let rev s = let sl = String.length s in - let s' = String.create sl in + let s' = Bytes.create sl in for i = 0 to sl - 1 do - s'.[i] <- s.[sl - i - 1] + Bytes.set s' i s.[sl - i - 1] done; - s';; + Bytes.to_string s';; let implode l = match l with | [] -> "" | cs -> - let r = create (List.length cs) in + let r = Bytes.create (List.length cs) in let pos = ref 0 in List.iter begin fun c -> - unsafe_set r !pos c; + Bytes.unsafe_set r !pos c; incr pos end cs; - r + Bytes.to_string r let explode s = let sl = String.length s in @@ -264,7 +257,7 @@ let sys_command = match Sys.os_type with | "Win32" -> fun cmd -> if cmd = "" then 0 else - let cmd = "bash -c "^Filename.quote cmd in + let cmd = "bash --norc -c "^Filename.quote cmd in Sys.command cmd | _ -> fun cmd -> if cmd = "" then 0 else Sys.command cmd @@ -307,16 +300,14 @@ let with_output_file ?(bin=false) x f = let read_file x = with_input_file ~bin:true x begin fun ic -> let len = in_channel_length ic in - let buf = String.create len in - let () = really_input ic buf 0 len in - buf + really_input_string ic len end let copy_chan ic oc = let m = in_channel_length ic in let m = (m lsr 12) lsl 12 in let m = max 16384 (min Sys.max_string_length m) in - let buf = String.create m in + let buf = Bytes.create m in let rec loop () = let len = input ic buf 0 m in if len > 0 then begin @@ -419,3 +410,22 @@ let memo3 f = with Not_found -> let res = f x y z in (Hashtbl.add cache (x,y,z) res; res) + +let set_lexbuf_fname fname lexbuf = + let open Lexing in + lexbuf.lex_start_p <- { lexbuf.lex_start_p with pos_fname = fname }; + lexbuf.lex_curr_p <- { lexbuf.lex_curr_p with pos_fname = fname }; + () + +let lexbuf_of_string ?name content = + let lexbuf = Lexing.from_string content in + let fname = match name with + | Some name -> name + | None -> + (* 40: hope the location will fit one line of 80 chars *) + if String.length content < 40 && not (String.contains content '\n') then + String.escaped content + else "" + in + set_lexbuf_fname fname lexbuf; + lexbuf diff --git a/ocamlbuild/my_std.mli b/ocamlbuild/my_std.mli index 403c4e96..d7e14637 100644 --- a/ocamlbuild/my_std.mli +++ b/ocamlbuild/my_std.mli @@ -62,3 +62,6 @@ val filename_concat : string -> string -> string val invalid_arg' : ('a, Format.formatter, unit, 'b) format4 -> 'a include Signatures.MISC + +val set_lexbuf_fname : string -> Lexing.lexbuf -> unit +val lexbuf_of_string : ?name:string -> string -> Lexing.lexbuf diff --git a/ocamlbuild/my_unix.ml b/ocamlbuild/my_unix.ml index 43692d32..fa1c5d45 100644 --- a/ocamlbuild/my_unix.ml +++ b/ocamlbuild/my_unix.ml @@ -127,13 +127,13 @@ let execute_many ?max_jobs = implem.execute_many ?max_jobs let run_and_read cmd = let bufsiz = 2048 in - let buf = String.create bufsiz in + let buf = Bytes.create bufsiz in let totalbuf = Buffer.create 4096 in implem.run_and_open cmd begin fun ic -> let rec loop pos = let len = input ic buf 0 bufsiz in if len > 0 then begin - Buffer.add_substring totalbuf buf 0 len; + Buffer.add_subbytes totalbuf buf 0 len; loop (pos + len) end in loop 0; Buffer.contents totalbuf diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml index 39a68f8e..c270a7f6 100644 --- a/ocamlbuild/ocaml_compiler.ml +++ b/ocamlbuild/ocaml_compiler.ml @@ -116,10 +116,30 @@ let prepare_compile build ml = match mandatory, res with | _, Good _ -> () | `mandatory, Bad exn -> - if !Options.ignore_auto then - dprintf 3 "Warning: Failed to build the module \ - %s requested by ocamldep" name - else raise exn + if not !Options.ignore_auto then raise exn; + dprintf 3 + "Warning: Failed to build the module %s requested by ocamldep." + name; + if not (!Options.recursive || Options.ocamlbuild_project_heuristic ()) + then Log.at_failure ~name:"a module failed to build, + while recursive traversal was disabled by fragile heuristic; + hint that having a _tags or myocamlbuild.ml would maybe solve + the build error" + (fun `Error -> + eprintf "Hint:@ Recursive@ traversal@ of@ subdirectories@ \ + was@ not@ enabled@ for@ this@ build,@ as@ the@ working@ \ + directory does@ not@ look@ like@ an@ ocamlbuild@ project@ \ + (no@ '_tags'@ or@ 'myocamlbuild.ml'@ file).@ \ + If@ you@ have@ modules@ in@ subdirectories,@ you@ should@ add@ \ + the@ option@ \"-r\"@ or@ create@ an@ empty@ '_tags'@ file.@\n\ + @\n\ + To@ enable@ recursive@ traversal@ for@ some@ subdirectories@ \ + only,@ you@ can@ use@ the@ following@ '_tags'@ file:@\n\ + @[@,\ + true: -traverse@,\ + or : traverse@,\ + @]" + ); | `just_try, Bad _ -> () end modules results @@ -128,6 +148,18 @@ let byte_compile_ocaml_interf mli cmi env build = prepare_compile build mli; ocamlc_c (tags_of_pathname mli++"interf") mli cmi +(* given that .cmi can be built from either ocamlc and ocamlopt, this + "agnostic" rule chooses either compilers depending on whether the + "native" tag is present. This was requested during PR#4613 as way + to enable using ocamlbuild in environments where only ocamlopt is + available, not ocamlc. *) +let compile_ocaml_interf mli cmi env build = + let mli = env mli and cmi = env cmi in + prepare_compile build mli; + let tags = tags_of_pathname mli++"interf" in + let comp_c = if Tags.mem "native" tags then ocamlopt_c else ocamlc_c in + comp_c tags mli cmi + let byte_compile_ocaml_implem ?tag ml cmo env build = let ml = env ml and cmo = env cmo in prepare_compile build ml; diff --git a/ocamlbuild/ocaml_compiler.mli b/ocamlbuild/ocaml_compiler.mli index 24c3695c..38206e5a 100644 --- a/ocamlbuild/ocaml_compiler.mli +++ b/ocamlbuild/ocaml_compiler.mli @@ -26,6 +26,7 @@ val ocamlopt_p : Tags.t -> Pathname.t list -> Pathname.t -> Command.t val ocamlmklib : Tags.t -> Pathname.t list -> Pathname.t -> Command.t val ocamlmktop : Tags.t -> Pathname.t list -> Pathname.t -> Command.t val prepare_compile : Rule.builder -> Pathname.t -> unit +val compile_ocaml_interf : string -> string -> Rule.action val byte_compile_ocaml_interf : string -> string -> Rule.action val byte_compile_ocaml_implem : ?tag:string -> string -> string -> Rule.action val prepare_link : diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index 65fb55d1..134a1533 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -58,9 +58,17 @@ let x_p_o = "%.p"-.-ext_obj;; let x_p_a = "%.p"-.-ext_lib;; let x_p_dll = "%.p"-.-ext_dll;; +(* -output-obj targets *) +let x_byte_c = "%.byte.c";; +let x_byte_o = "%.byte"-.-ext_obj;; +let x_native_o = "%.native"-.-ext_obj;; + rule "target files" ~dep:"%.itarget" ~stamp:"%.otarget" + ~doc:"If foo.itarget contains a list of ocamlbuild targets, \ + asking ocamlbuild to produce foo.otarget will \ + build each of those targets in turn." begin fun env build -> let itarget = env "%.itarget" in let dir = Pathname.dirname itarget in @@ -75,223 +83,292 @@ rule "target files" end;; rule "ocaml: mli -> cmi" - ~tags:["ocaml"] ~prod:"%.cmi" ~deps:["%.mli"; "%.mli.depends"] - (Ocaml_compiler.byte_compile_ocaml_interf "%.mli" "%.cmi");; + (Ocaml_compiler.compile_ocaml_interf "%.mli" "%.cmi");; rule "ocaml: mlpack & d.cmo* -> d.cmo & cmi" - ~tags:["ocaml"; "debug"; "byte"] ~prods:["%.d.cmo"] ~deps:["%.mlpack"; "%.cmi"] (Ocaml_compiler.byte_debug_pack_mlpack "%.mlpack" "%.d.cmo");; rule "ocaml: mlpack & cmo* & cmi -> cmo" - ~tags:["ocaml"; "byte"] ~prod:"%.cmo" ~deps:["%.mli"; "%.cmi"; "%.mlpack"] + ~doc:"If foo.mlpack contains a list of capitalized module names, \ + the target foo.cmo will produce a packed module containing \ + those modules as submodules. You can also have a foo.mli file \ + to restrict the interface of the resulting module. + +\ + Warning: to produce a native foo.cmx out of a foo.mlpack, you must \ + manually tag the included compilation units with for-pack(foo). \ + See the documentation of the corresponding rules for more details. + +\ + The modules named in the .mlpack \ + will be dynamic dependencies of the compilation action. \ + You cannot give the .mlpack the same name as one of the module \ + it contains, as this would create a circular dependency." (Ocaml_compiler.byte_pack_mlpack "%.mlpack" "%.cmo");; rule "ocaml: mlpack & cmo* -> cmo & cmi" - ~tags:["ocaml"; "byte"] ~prods:["%.cmo"; "%.cmi"] ~dep:"%.mlpack" (Ocaml_compiler.byte_pack_mlpack "%.mlpack" "%.cmo");; rule "ocaml: ml & cmi -> d.cmo" - ~tags:["ocaml"; "byte"] ~prod:"%.d.cmo" ~deps:["%.mli"(* This one is inserted to force this rule to be skiped when a .ml is provided without a .mli *); "%.ml"; "%.ml.depends"; "%.cmi"] + ~doc:"The foo.d.cmo target compiles foo.ml with the 'debug' tag enabled (-g).\ + See also foo.d.byte. + +\ + For technical reason, .d.cmx and .d.native are not yet supported, \ + so you should explicitly add the 'debug' tag \ + to native targets (both compilation and linking)." (Ocaml_compiler.byte_compile_ocaml_implem ~tag:"debug" "%.ml" "%.d.cmo");; rule "ocaml: ml & cmi -> cmo" - ~tags:["ocaml"; "byte"] ~prod:"%.cmo" ~deps:["%.mli"(* This one is inserted to force this rule to be skiped when a .ml is provided without a .mli *); "%.ml"; "%.ml.depends"; "%.cmi"] (Ocaml_compiler.byte_compile_ocaml_implem "%.ml" "%.cmo");; rule "ocaml: mlpack & cmi & p.cmx* & p.o* -> p.cmx & p.o" - ~tags:["ocaml"; "profile"; "native"] - ~prods:["%.p.cmx"; x_p_o(* no cmi here you must make the byte version to have it *)] + ~prods:["%.p.cmx"; x_p_o + (* no cmi here you must make the byte version to have it *)] ~deps:["%.mlpack"; "%.cmi"] (Ocaml_compiler.native_profile_pack_mlpack "%.mlpack" "%.p.cmx");; rule "ocaml: mlpack & cmi & cmx* & o* -> cmx & o" - ~tags:["ocaml"; "native"] - ~prods:["%.cmx"; x_o(* no cmi here you must make the byte version to have it *)] + ~prods:["%.cmx"; x_o + (* no cmi here you must make the byte version to have it *)] ~deps:["%.mlpack"; "%.cmi"] + ~doc:"If foo.mlpack contains a list of capitalized module names, \ + the target foo.cmx will produce a packed module containing \ + those modules as submodules. + +\ + Warning: The .cmx files that will be included must be manually tagged \ + with the tag \"for-pack(foo)\". This means that you cannot include \ + the same bar.cmx in several .mlpack files, and that you should not \ + use an included .cmx as a separate module on its own. + +\ + This requirement comes from a technical limitation of \ + native module packing: ocamlopt needs the -for-pack argument to be passed \ + ahead of time, when compiling each included submodule, \ + because there is no reliable, portable way to rewrite \ + native object files afterwards." (Ocaml_compiler.native_pack_mlpack "%.mlpack" "%.cmx");; rule "ocaml: ml & cmi -> p.cmx & p.o" - ~tags:["ocaml"; "native"; "profile"] ~prods:["%.p.cmx"; x_p_o] ~deps:["%.ml"; "%.ml.depends"; "%.cmi"] + ~doc:"The foo.p.cmx target compiles foo.ml with the 'profile' \ + tag enabled (-p). Note that ocamlbuild provides no support \ + for the bytecode profiler, which works completely differently." (Ocaml_compiler.native_compile_ocaml_implem ~tag:"profile" ~cmx_ext:"p.cmx" "%.ml");; rule "ocaml: ml & cmi -> cmx & o" - ~tags:["ocaml"; "native"] ~prods:["%.cmx"; x_o] ~deps:["%.ml"; "%.ml.depends"; "%.cmi"] (Ocaml_compiler.native_compile_ocaml_implem "%.ml");; rule "ocaml: ml -> d.cmo & cmi" - ~tags:["ocaml"; "debug"] ~prods:["%.d.cmo"] ~deps:["%.ml"; "%.ml.depends"; "%.cmi"] (Ocaml_compiler.byte_compile_ocaml_implem ~tag:"debug" "%.ml" "%.d.cmo");; rule "ocaml: ml -> cmo & cmi" - ~tags:["ocaml"] ~prods:["%.cmo"; "%.cmi"] ~deps:["%.ml"; "%.ml.depends"] + ~doc:"This rule allows to produce a .cmi from a .ml file \ + when the corresponding .mli is missing. + +\ + Note: you are strongly encourage to have a .mli file \ + for each of your .ml module, as it is a good development \ + practice which also simplifies the way build systems work, \ + as it avoids producing .cmi files as a silent side-effect of \ + another compilation action." (Ocaml_compiler.byte_compile_ocaml_implem "%.ml" "%.cmo");; rule "ocaml: d.cmo* -> d.byte" - ~tags:["ocaml"; "byte"; "debug"; "program"] ~prod:"%.d.byte" ~dep:"%.d.cmo" + ~doc:"The target foo.d.byte will build a bytecode executable \ + with debug information enabled." (Ocaml_compiler.byte_debug_link "%.d.cmo" "%.d.byte");; rule "ocaml: cmo* -> byte" - ~tags:["ocaml"; "byte"; "program"] ~prod:"%.byte" ~dep:"%.cmo" (Ocaml_compiler.byte_link "%.cmo" "%.byte");; -rule "ocaml: cmo* -> byte.o" - ~tags:["ocaml"; "byte"; "link"; "output_obj" ] - ~prod:"%.byte.o" +rule "ocaml: cmo* -> byte.(o|obj)" + ~prod:x_byte_o ~dep:"%.cmo" - (Ocaml_compiler.byte_output_obj "%.cmo" "%.byte.o");; + ~doc:"The foo.byte.o target, or foo.byte.obj under Windows, \ + will produce an object file by passing the -output-obj option \ + to the OCaml compiler. See also foo.byte.c, and foo.native.{o,obj}." + (Ocaml_compiler.byte_output_obj "%.cmo" x_byte_o);; rule "ocaml: cmo* -> byte.c" - ~tags:["ocaml"; "byte"; "link"; "output_obj" ] - ~prod:"%.byte.c" + ~prod:x_byte_c ~dep:"%.cmo" - (Ocaml_compiler.byte_output_obj "%.cmo" "%.byte.c");; + (Ocaml_compiler.byte_output_obj "%.cmo" x_byte_c);; rule "ocaml: p.cmx* & p.o* -> p.native" - ~tags:["ocaml"; "native"; "profile"; "program"] ~prod:"%.p.native" ~deps:["%.p.cmx"; x_p_o] + ~doc:"The foo.p.native target builds the native executable \ + with the 'profile' tag (-p) enabled throughout compilation and linking." (Ocaml_compiler.native_profile_link "%.p.cmx" "%.p.native");; rule "ocaml: cmx* & o* -> native" - ~tags:["ocaml"; "native"; "program"] ~prod:"%.native" ~deps:["%.cmx"; x_o] + ~doc:"Builds a native executable" (Ocaml_compiler.native_link "%.cmx" "%.native");; -rule "ocaml: cmx* & o* -> native.o" - ~tags:["ocaml"; "native"; "output_obj" ] - ~prod:"%.native.o" +rule "ocaml: cmx* & o* -> native.(o|obj)" + ~prod:x_native_o ~deps:["%.cmx"; x_o] - (Ocaml_compiler.native_output_obj "%.cmx" "%.native.o");; + (Ocaml_compiler.native_output_obj "%.cmx" x_native_o);; rule "ocaml: mllib & d.cmo* -> d.cma" - ~tags:["ocaml"; "byte"; "debug"; "library"] ~prod:"%.d.cma" ~dep:"%.mllib" (Ocaml_compiler.byte_debug_library_link_mllib "%.mllib" "%.d.cma");; rule "ocaml: mllib & cmo* -> cma" - ~tags:["ocaml"; "byte"; "library"] ~prod:"%.cma" ~dep:"%.mllib" + ~doc:"Build a .cma archive file (bytecode library) containing \ + the list of modules given in the .mllib file of the same name. \ + Note that the .cma archive will contain exactly the modules listed, \ + so it may not be self-contained if some dependencies are missing." (Ocaml_compiler.byte_library_link_mllib "%.mllib" "%.cma");; rule "ocaml: d.cmo* -> d.cma" - ~tags:["ocaml"; "byte"; "debug"; "library"] ~prod:"%.d.cma" ~dep:"%.d.cmo" (Ocaml_compiler.byte_debug_library_link "%.d.cmo" "%.d.cma");; rule "ocaml: cmo* -> cma" - ~tags:["ocaml"; "byte"; "library"] ~prod:"%.cma" ~dep:"%.cmo" + ~doc:"The preferred way to build a .cma archive is to create a .mllib file \ + with a list of modules to include. It is however possible to build one \ + from a .cmo of the same name; the archive will include this module and \ + the local modules it depends upon, transitively." (Ocaml_compiler.byte_library_link "%.cmo" "%.cma");; rule "ocaml C stubs: clib & (o|obj)* -> (a|lib) & (so|dll)" ~prods:(["%(path:<**/>)lib%(libname:<*> and not <*.*>)"-.-ext_lib] @ - if Ocamlbuild_Myocamlbuild_config.supports_shared_libraries then + if Ocamlbuild_config.supports_shared_libraries then ["%(path:<**/>)dll%(libname:<*> and not <*.*>)"-.-ext_dll] else []) ~dep:"%(path)lib%(libname).clib" + ?doc:None (* TODO document *) (C_tools.link_C_library "%(path)lib%(libname).clib" ("%(path)lib%(libname)"-.-ext_lib) "%(path)%(libname)");; rule "ocaml: mllib & p.cmx* & p.o* -> p.cmxa & p.a" - ~tags:["ocaml"; "native"; "profile"; "library"] ~prods:["%.p.cmxa"; x_p_a] ~dep:"%.mllib" (Ocaml_compiler.native_profile_library_link_mllib "%.mllib" "%.p.cmxa");; rule "ocaml: mllib & cmx* & o* -> cmxa & a" - ~tags:["ocaml"; "native"; "library"] ~prods:["%.cmxa"; x_a] ~dep:"%.mllib" + ~doc:"Creates a native archive file .cmxa, using the .mllib file \ + as the .cma rule above. Note that whereas bytecode .cma can \ + be used both for static and dynamic linking, .cmxa only support \ + static linking. For an archive usable with Dynlink, \ + see the rule producing a .cmxs from a .mldylib." (Ocaml_compiler.native_library_link_mllib "%.mllib" "%.cmxa");; rule "ocaml: p.cmx & p.o -> p.cmxa & p.a" - ~tags:["ocaml"; "native"; "profile"; "library"] ~prods:["%.p.cmxa"; x_p_a] ~deps:["%.p.cmx"; x_p_o] (Ocaml_compiler.native_profile_library_link "%.p.cmx" "%.p.cmxa");; rule "ocaml: cmx & o -> cmxa & a" - ~tags:["ocaml"; "native"; "library"] ~prods:["%.cmxa"; x_a] ~deps:["%.cmx"; x_o] + ~doc:"Just as you can build a .cma from a .cmo in absence of .mllib file, \ + you can build a .cmxa (native archive file for static linking only) \ + from a .cmx, which will include the local modules it depends upon, \ + transitivitely." (Ocaml_compiler.native_library_link "%.cmx" "%.cmxa");; rule "ocaml: mldylib & p.cmx* & p.o* -> p.cmxs & p.so" - ~tags:["ocaml"; "native"; "profile"; "shared"; "library"] ~prods:["%.p.cmxs"; x_p_dll] ~dep:"%.mldylib" (Ocaml_compiler.native_profile_shared_library_link_mldylib "%.mldylib" "%.p.cmxs");; rule "ocaml: mldylib & cmx* & o* -> cmxs & so" - ~tags:["ocaml"; "native"; "shared"; "library"] ~prods:["%.cmxs"; x_dll] ~dep:"%.mldylib" + ~doc:"Builds a .cmxs (native archive for dynamic linking) containing exactly \ + the modules listed in the corresponding .mldylib file." (Ocaml_compiler.native_shared_library_link_mldylib "%.mldylib" "%.cmxs");; rule "ocaml: p.cmx & p.o -> p.cmxs & p.so" - ~tags:["ocaml"; "native"; "profile"; "shared"; "library"] ~prods:["%.p.cmxs"; x_p_dll] ~deps:["%.p.cmx"; x_p_o] (Ocaml_compiler.native_shared_library_link ~tags:["profile"] "%.p.cmx" "%.p.cmxs");; rule "ocaml: p.cmxa & p.a -> p.cmxs & p.so" - ~tags:["ocaml"; "native"; "profile"; "shared"; "library"] ~prods:["%.p.cmxs"; x_p_dll] ~deps:["%.p.cmxa"; x_p_a] (Ocaml_compiler.native_shared_library_link ~tags:["profile";"linkall"] "%.p.cmxa" "%.p.cmxs");; rule "ocaml: cmx & o -> cmxs" - ~tags:["ocaml"; "native"; "shared"; "library"] ~prods:["%.cmxs"] ~deps:["%.cmx"; x_o] + ~doc:"If you have not created a foo.mldylib file for a compilation unit \ + foo.cmx, the target foo.cmxs will produce a .cmxs file containing \ + exactly the .cmx. + +\ + Note: this differs from the behavior of .cmxa targets \ + with no .mllib, as the dependencies of the modules will not be \ + included: generally, the modules compiled as dynamic plugins depend \ + on library modules that will be already linked in the executable, \ + and that the .cmxs should therefore not duplicate." (Ocaml_compiler.native_shared_library_link "%.cmx" "%.cmxs");; rule "ocaml: cmx & o -> cmxs & so" - ~tags:["ocaml"; "native"; "shared"; "library"] ~prods:["%.cmxs"; x_dll] ~deps:["%.cmx"; x_o] (Ocaml_compiler.native_shared_library_link "%.cmx" "%.cmxs");; rule "ocaml: cmxa & a -> cmxs & so" - ~tags:["ocaml"; "native"; "shared"; "library"] ~prods:["%.cmxs"; x_dll] ~deps:["%.cmxa"; x_a] + ~doc:"This rule allows to build a .cmxs from a .cmxa, to avoid having \ + to duplicate a .mllib file into a .mldylib." (Ocaml_compiler.native_shared_library_link ~tags:["linkall"] "%.cmxa" "%.cmxs");; rule "ocaml dependencies ml" ~prod:"%.ml.depends" ~dep:"%.ml" + ~doc:"OCamlbuild will use ocamldep to approximate dependencies \ + of a source file. The ocamldep tool being purely syntactic, \ + it only computes an over-approximation of the dependencies. + +\ + If you manipulate a module Foo that is in fact a submodule Bar.Foo \ + (after 'open Bar'), ocamldep may believe that your module depends \ + on foo.ml -- when such a file also exists in your project. This can \ + lead to spurious circular dependencies. In that case, you can use \ + OCamlbuild_plugin.non_dependency in your myocamlbuild.ml \ + to manually remove the spurious dependency. See the plugins API." (Ocaml_tools.ocamldep_command "%.ml" "%.ml.depends");; rule "ocaml dependencies mli" @@ -300,40 +377,45 @@ rule "ocaml dependencies mli" (Ocaml_tools.ocamldep_command "%.mli" "%.mli.depends");; rule "ocamllex" - ~tags:["ocaml"] (* FIXME "lexer" *) ~prod:"%.ml" ~dep:"%.mll" (Ocaml_tools.ocamllex "%.mll");; rule "ocaml: mli -> odoc" - ~tags:["ocaml"; "doc"] ~prod:"%.odoc" ~deps:["%.mli"; "%.mli.depends"] + ~doc:".odoc are intermediate files storing the result of ocamldoc processing \ + on a source file. See the various .docdir/... targets for ocamldoc." (Ocaml_tools.document_ocaml_interf "%.mli" "%.odoc");; rule "ocaml: ml -> odoc" - ~tags:["ocaml"; "doc"] ~prod:"%.odoc" ~deps:["%.ml"; "%.ml.depends"] (Ocaml_tools.document_ocaml_implem "%.ml" "%.odoc");; rule "ocamldoc: document ocaml project odocl & *odoc -> docdir (html)" ~prod:"%.docdir/index.html" - ~stamp:"%.docdir/html.stamp" (* Depend on this file if you want to depends on all files of %.docdir *) + ~stamp:"%.docdir/html.stamp" ~dep:"%.odocl" + ~doc:"If you put a list of capitalized module names in a foo.odocl file, \ + the target foo.docdir/index.html will call ocamldoc to produce \ + the html documentation for these modules. \ + See also the max|latex|doc target below." (Ocaml_tools.document_ocaml_project ~ocamldoc:Ocaml_tools.ocamldoc_l_dir "%.odocl" "%.docdir/index.html" "%.docdir");; rule "ocamldoc: document ocaml project odocl & *odoc -> docdir (man)" ~prod:"%.docdir/man" - ~stamp:"%.docdir/man.stamp" (* Depend on this file if you want to depends on all files of %.docdir/man *) + ~stamp:"%.docdir/man.stamp" ~dep:"%.odocl" + ?doc:None (* TODO document *) (Ocaml_tools.document_ocaml_project ~ocamldoc:Ocaml_tools.ocamldoc_l_dir "%.odocl" "%.docdir/man" "%.docdir");; rule "ocamldoc: document ocaml project odocl & *odoc -> man|latex|dot..." ~prod:"%(dir).docdir/%(file)" ~dep:"%(dir).odocl" + ?doc:None (* TODO document *) (Ocaml_tools.document_ocaml_project ~ocamldoc:Ocaml_tools.ocamldoc_l_file "%(dir).odocl" "%(dir).docdir/%(file)" "%(dir).docdir");; @@ -345,6 +427,12 @@ if !Options.use_menhir || Configuration.has_tag "use_menhir" then begin rule "ocaml: modular menhir (mlypack)" ~prods:["%.mli" ; "%.ml"] ~deps:["%.mlypack"] + ~doc:"Menhir supports building a parser by composing several .mly files \ + together, containing different parts of the grammar description. \ + To use that feature with ocamlbuild, you should create a .mlypack \ + file with the same syntax as .mllib or .mlpack files: \ + a whitespace-separated list of the capitalized module names \ + of the .mly files you want to combine together." (Ocaml_tools.menhir_modular "%" "%.mlypack" "%.mlypack.depends"); rule "ocaml: menhir modular dependencies" @@ -355,6 +443,9 @@ if !Options.use_menhir || Configuration.has_tag "use_menhir" then begin rule "ocaml: menhir" ~prods:["%.ml"; "%.mli"] ~deps:["%.mly"; "%.mly.depends"] + ~doc:"Invokes menhir to build the .ml and .mli files derived from a .mly \ + grammar. If you want to use ocamlyacc instead, you must disable the \ + -use-menhir option that was passed to ocamlbuild." (Ocaml_tools.menhir "%.mly"); rule "ocaml: menhir dependencies" @@ -364,14 +455,19 @@ if !Options.use_menhir || Configuration.has_tag "use_menhir" then begin end else rule "ocamlyacc" - ~tags:["ocaml"] (* FIXME "parser" *) ~prods:["%.ml"; "%.mli"] ~dep:"%.mly" + ~doc:"By default, ocamlbuild will use ocamlyacc to produce a .ml and .mly \ + from a .mly file of the same name. You can also enable the \ + -use-menhir option to use menhir instead. Menhir is a recommended \ + replacement for ocamlyacc, that supports more feature, lets you \ + write more readable grammars, and helps you understand conflicts." (Ocaml_tools.ocamlyacc "%.mly");; rule "ocaml C stubs: c -> o" ~prod:x_o ~dep:"%.c" + ?doc:None (* TODO document *) begin fun env _build -> let c = env "%.c" in let o = env x_o in @@ -384,16 +480,28 @@ rule "ocaml C stubs: c -> o" rule "ocaml: ml & ml.depends & *cmi -> .inferred.mli" ~prod:"%.inferred.mli" ~deps:["%.ml"; "%.ml.depends"] + ~doc:"The target foo.inferred.mli will produce a .mli that exposes all the \ + declarations in foo.ml, as obtained by direct invocation of `ocamlc -i`." (Ocaml_tools.infer_interface "%.ml" "%.inferred.mli");; rule "ocaml: mltop -> top" ~prod:"%.top" ~dep:"%.mltop" + ?doc:None (* TODO document *) (Ocaml_compiler.byte_toplevel_link_mltop "%.mltop" "%.top");; rule "preprocess: ml -> pp.ml" ~dep:"%.ml" ~prod:"%.pp.ml" + ~doc:"The target foo.pp.ml should generate a source file equivalent \ + to foo.ml after syntactic preprocessors (camlp4, etc.) have been \ + applied. + +\ + Warning: This option is currently known to malfunction \ + when used together with -use-ocamlfind (for syntax extensions \ + coming from ocamlfind packages). Direct compilation of the \ + corresponding file to produce a .cmx or .cmo will still work well." (Ocaml_tools.camlp4 "pp.ml" "%.ml" "%.pp.ml");; flag ["ocaml"; "pp"] begin @@ -465,7 +573,9 @@ let () = (* tags package(X), predicate(X) and syntax(X) *) List.iter begin fun tags -> pflag tags "package" (fun pkg -> S [A "-package"; A pkg]); - pflag tags "predicate" (fun pkg -> S [A "-predicates"; A pkg]); + if not (List.mem "ocamldep" tags) then + (* PR#6184: 'ocamlfind ocamldep' does not support -predicate *) + pflag tags "predicate" (fun pkg -> S [A "-predicates"; A pkg]); pflag tags "syntax" (fun pkg -> S [A "-syntax"; A pkg]) end all_tags end else begin @@ -488,16 +598,23 @@ let () = (fun param -> S [A "-for-pack"; A param]); pflag ["ocaml"; "native"; "compile"] "inline" (fun param -> S [A "-inline"; A param]); - pflag ["ocaml"; "compile"] "pp" - (fun param -> S [A "-pp"; A param]); - pflag ["ocaml"; "ocamldep"] "pp" - (fun param -> S [A "-pp"; A param]); - pflag ["ocaml"; "doc"] "pp" - (fun param -> S [A "-pp"; A param]); - pflag ["ocaml"; "infer_interface"] "pp" - (fun param -> S [A "-pp"; A param]); + List.iter (fun pp -> + pflag ["ocaml"; "compile"] pp + (fun param -> S [A ("-" ^ pp); A param]); + pflag ["ocaml"; "ocamldep"] pp + (fun param -> S [A ("-" ^ pp); A param]); + pflag ["ocaml"; "doc"] pp + (fun param -> S [A ("-" ^ pp); A param]); + pflag ["ocaml"; "infer_interface"] pp + (fun param -> S [A ("-" ^ pp); A param]) + ) ["pp"; "ppx"]; pflag ["ocaml";"compile";] "warn" - (fun param -> S [A "-w"; A param]) + (fun param -> S [A "-w"; A param]); + pflag ["ocaml";"compile";] "warn_error" + (fun param -> S [A "-warn-error"; A param]); + pflag ["ocaml"; "compile"] "open" + (fun param -> S [A "-open"; A param]); + () let camlp4_flags camlp4s = List.iter begin fun camlp4 -> @@ -528,7 +645,6 @@ ocaml_lib ~extern:true "nums";; ocaml_lib ~extern:true "dbm";; ocaml_lib ~extern:true "graphics";; ocaml_lib ~extern:true ~tag_name:"use_toplevel" "toplevellib";; -ocaml_lib ~extern:true ~dir:"+labltk" "labltk";; ocaml_lib ~extern:true ~dir:"+ocamldoc" "ocamldoc";; ocaml_lib ~extern:true ~dir:"+ocamlbuild" ~tag_name:"use_ocamlbuild" "ocamlbuildlib";; @@ -553,6 +669,10 @@ flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; flag ["ocaml"; "annot"; "compile"] (A "-annot");; flag ["ocaml"; "bin_annot"; "compile"] (A "-bin-annot");; +flag ["ocaml"; "safe_string"; "compile"] (A "-safe-string");; +flag ["ocaml"; "safe_string"; "infer_interface"] (A "-safe-string");; +flag ["ocaml"; "unsafe_string"; "compile"] (A "-unsafe-string");; +flag ["ocaml"; "unsafe_string"; "infer_interface"] (A "-unsafe-string");; flag ["ocaml"; "short_paths"; "compile"] (A "-short-paths");; flag ["ocaml"; "short_paths"; "infer_interface"] (A "-short-paths");; flag ["ocaml"; "rectypes"; "compile"] (A "-rectypes");; @@ -566,6 +686,15 @@ flag ["ocaml"; "link"; "profile"; "native"] (A "-p");; flag ["ocaml"; "link"; "program"; "custom"; "byte"] (A "-custom");; flag ["ocaml"; "link"; "library"; "custom"; "byte"] (A "-custom");; flag ["ocaml"; "compile"; "profile"; "native"] (A "-p");; +flag ["ocaml"; "compile"; "no_alias_deps";] (A "-no-alias-deps");; +flag ["ocaml"; "compile"; "strict_formats";] (A "-strict-formats");; +flag ["ocaml"; "native"; "compile"; "opaque";] (A "-opaque");; +flag ["ocaml"; "native"; "compile"; "no_float_const_prop";] (A "-no-float-const-prop"); +flag ["ocaml"; "compile"; "keep_locs";] (A "-keep-locs"); +flag ["ocaml"; "absname"; "compile"] (A "-absname");; +flag ["ocaml"; "absname"; "infer_interface"] (A "-absname");; +flag ["ocaml"; "byte"; "compile"; "compat_32";] (A "-compat-32"); + (* threads, with or without findlib *) flag ["ocaml"; "compile"; "thread"] (A "-thread");; @@ -585,18 +714,23 @@ flag ["ocaml"; "compile"; "nolabels"] (A"-nolabels");; flag ["ocaml"; "ocamllex"; "quiet"] (A"-q");; let ocaml_warn_flag c = - flag ["ocaml"; "compile"; sprintf "warn_%c" (Char.uppercase c)] - (S[A"-w"; A (sprintf "%c" (Char.uppercase c))]); - flag ["ocaml"; "compile"; sprintf "warn_error_%c" (Char.uppercase c)] - (S[A"-warn-error"; A (sprintf "%c" (Char.uppercase c))]); - flag ["ocaml"; "compile"; sprintf "warn_%c" (Char.lowercase c)] - (S[A"-w"; A (sprintf "%c" (Char.lowercase c))]); - flag ["ocaml"; "compile"; sprintf "warn_error_%c" (Char.lowercase c)] - (S[A"-warn-error"; A (sprintf "%c" (Char.lowercase c))]);; + flag ~deprecated:true + ["ocaml"; "compile"; sprintf "warn_%c" (Char.uppercase c)] + (S[A"-w"; A (sprintf "%c" (Char.uppercase c))]); + flag ~deprecated:true + ["ocaml"; "compile"; sprintf "warn_error_%c" (Char.uppercase c)] + (S[A"-warn-error"; A (sprintf "%c" (Char.uppercase c))]); + flag ~deprecated:true + ["ocaml"; "compile"; sprintf "warn_%c" (Char.lowercase c)] + (S[A"-w"; A (sprintf "%c" (Char.lowercase c))]); + flag ~deprecated:true + ["ocaml"; "compile"; sprintf "warn_error_%c" (Char.lowercase c)] + (S[A"-warn-error"; A (sprintf "%c" (Char.lowercase c))]);; List.iter ocaml_warn_flag ['A'; 'C'; 'D'; 'E'; 'F'; 'K'; 'L'; 'M'; 'P'; 'R'; 'S'; 'U'; 'V'; 'X'; 'Y'; 'Z'];; -flag ["ocaml"; "compile"; "strict-sequence"] (A "-strict-sequence");; +flag ~deprecated:true + ["ocaml"; "compile"; "strict-sequence"] (A "-strict-sequence");; flag ["ocaml"; "compile"; "strict_sequence"] (A "-strict-sequence");; flag ["ocaml"; "doc"; "docdir"; "extension:html"] (A"-html");; diff --git a/ocamlbuild/ocaml_utils.ml b/ocamlbuild/ocaml_utils.ml index b35ad679..409f0a06 100644 --- a/ocamlbuild/ocaml_utils.ml +++ b/ocamlbuild/ocaml_utils.ml @@ -80,7 +80,8 @@ let expand_module = let string_list_of_file file = with_input_file file begin fun ic -> - Lexers.blank_sep_strings (Lexing.from_channel ic) + Lexers.blank_sep_strings + Const.Source.file (Lexing.from_channel ic) end let print_path_list = Pathname.print_path_list @@ -118,6 +119,10 @@ let ocaml_lib ?(extern=false) ?(byte=true) ?(native=true) ?dir ?tag_name libpath if not extern then dep tags [lib] (* cannot happen? *) in Hashtbl.replace info_libraries tag_name (libpath, extern); + (* adding [tag_name] to [info_libraries] will make this tag + affect include-dir lookups, so it is used even if not + mentioned explicitly in any rule. *) + Flags.mark_tag_used tag_name; if extern then begin if byte then flag_and_dep ["ocaml"; tag_name; "link"; "byte"] (libpath^".cma"); @@ -145,7 +150,8 @@ let read_path_dependencies = let depends = path-.-"depends" in with_input_file depends begin fun ic -> let ocamldep_output = - try Lexers.ocamldep_output (Lexing.from_channel ic) + try Lexers.ocamldep_output + Const.Source.ocamldep (Lexing.from_channel ic) with Lexers.Error (msg,_) -> raise (Ocamldep_error(Printf.sprintf "Ocamldep.ocamldep: bad output (%s)" msg)) in let deps = List.fold_right begin fun (path, deps) acc -> diff --git a/ocamlbuild/ocamlbuild_executor.ml b/ocamlbuild/ocamlbuild_executor.ml index 53fcad12..298f9b4d 100644 --- a/ocamlbuild/ocamlbuild_executor.ml +++ b/ocamlbuild/ocamlbuild_executor.ml @@ -59,22 +59,19 @@ let output_lines prefix oc buffer = let m = String.length u in let output_line i j = output_string oc prefix; - output oc u i (j - i); + output_substring oc u i (j - i); output_char oc '\n' in let rec loop i = - if i = m then - () + if i < m then + let j = + try String.index_from u i '\n' + with Not_found -> m + in + output_line i j; + loop (j + 1) else - begin - try - let j = String.index_from u i '\n' in - output_line i j; - loop (j + 1) - with - | Not_found -> - output_line i m - end + () in loop 0 ;; @@ -190,7 +187,7 @@ let execute (* ***) (*** do_read *) let do_read = - let u = String.create 4096 in + let u = Bytes.create 4096 in fun ?(loop=false) fd job -> (*if job.job_dying then () @@ -199,9 +196,13 @@ let execute let rec iteration () = let m = try - read fd u 0 (String.length u) + read fd u 0 (Bytes.length u) with - | Unix.Unix_error(_,_,_) -> 0 + | Unix.Unix_error(e,_,_) -> + let msg = error_message e in + display (fun oc -> fp oc + "Error while reading stdout/stderr: %s\n" msg); + 0 in if m = 0 then if job.job_dying then @@ -210,7 +211,7 @@ let execute terminate job else begin - Buffer.add_substring job.job_buffer u 0 m; + Buffer.add_subbytes job.job_buffer u 0 m; if loop then iteration () else @@ -237,6 +238,11 @@ let execute (*display begin fun oc -> fp oc "Terminating job %a\n%!" print_job_id job.job_id; end;*) decr jobs_active; + + (* PR#5371: we would get EAGAIN below otherwise *) + clear_nonblock (doi job.job_stdout); + clear_nonblock (doi job.job_stderr); + do_read ~loop:true (doi job.job_stdout) job; do_read ~loop:true (doi job.job_stderr) job; outputs := FDM.remove (doi job.job_stdout) (FDM.remove (doi job.job_stderr) !outputs); diff --git a/ocamlbuild/ocamlbuild_pack.mlpack b/ocamlbuild/ocamlbuild_pack.mlpack index 09dc4e02..450592f5 100644 --- a/ocamlbuild/ocamlbuild_pack.mlpack +++ b/ocamlbuild/ocamlbuild_pack.mlpack @@ -1,3 +1,5 @@ +Const +Loc Log My_unix My_std diff --git a/ocamlbuild/ocamlbuild_plugin.ml b/ocamlbuild/ocamlbuild_plugin.ml index 9f0de1be..33c9c9df 100644 --- a/ocamlbuild/ocamlbuild_plugin.ml +++ b/ocamlbuild/ocamlbuild_plugin.ml @@ -38,8 +38,9 @@ let dep = Command.dep let pdep = Command.pdep let copy_rule = Rule.copy_rule let ocaml_lib = Ocamlbuild_pack.Ocaml_utils.ocaml_lib -let flag = Ocamlbuild_pack.Flags.flag +let flag = Ocamlbuild_pack.Flags.flag ?deprecated:None let pflag = Ocamlbuild_pack.Flags.pflag +let mark_tag_used = Ocamlbuild_pack.Flags.mark_tag_used let flag_and_dep = Ocamlbuild_pack.Ocaml_utils.flag_and_dep let pflag_and_dep = Ocamlbuild_pack.Ocaml_utils.pflag_and_dep let non_dependency = Ocamlbuild_pack.Ocaml_utils.non_dependency diff --git a/ocamlbuild/ocamlbuild_where.ml b/ocamlbuild/ocamlbuild_where.ml index a05230a5..6cea4fdf 100644 --- a/ocamlbuild/ocamlbuild_where.ml +++ b/ocamlbuild/ocamlbuild_where.ml @@ -10,10 +10,10 @@ (* *) (***********************************************************************) -let bindir = ref Ocamlbuild_Myocamlbuild_config.bindir;; +let bindir = ref Ocamlbuild_config.bindir;; let libdir = ref begin Filename.concat (try Sys.getenv "OCAMLLIB" - with Not_found -> Ocamlbuild_Myocamlbuild_config.libdir) + with Not_found -> Ocamlbuild_config.libdir) "ocamlbuild" end;; diff --git a/ocamlbuild/options.ml b/ocamlbuild/options.ml index 2fe9e0d0..5ee51220 100644 --- a/ocamlbuild/options.ml +++ b/ocamlbuild/options.ml @@ -23,6 +23,7 @@ open Format open Command let entry = ref None +let project_root_dir = ref None let build_dir = ref (Filename.concat (Sys.getcwd ()) "_build") let include_dirs = ref [] let exclude_dirs = ref [] @@ -92,15 +93,16 @@ let ocamllex = ref (V"OCAMLLEX") let ocamlmklib = ref (V"OCAMLMKLIB") let ocamlmktop = ref (V"OCAMLMKTOP") let ocamlrun = ref N -let ocamlfind x = S[V"OCAMLFIND"; x] +let ocamlfind_cmd = ref (V"OCAMLFIND") +let ocamlfind arg = S[!ocamlfind_cmd; arg] let program_to_execute = ref false let must_clean = ref false let show_documentation = ref false let recursive = ref false -let ext_lib = ref Ocamlbuild_Myocamlbuild_config.a -let ext_obj = ref Ocamlbuild_Myocamlbuild_config.o -let ext_dll = ref Ocamlbuild_Myocamlbuild_config.so -let exe = ref Ocamlbuild_Myocamlbuild_config.exe +let ext_lib = ref Ocamlbuild_config.a +let ext_obj = ref Ocamlbuild_config.o +let ext_dll = ref Ocamlbuild_config.so +let exe = ref Ocamlbuild_config.exe let targets_internal = ref [] let ocaml_libs_internal = ref [] @@ -140,7 +142,8 @@ let use_jocaml () = ;; let add_to rxs x = - let xs = Lexers.comma_or_blank_sep_strings (Lexing.from_string x) in + let xs = Lexers.comma_or_blank_sep_strings + Const.Source.command_line (Lexing.from_string x) in rxs := xs :: !rxs let add_to' rxs x = if x <> dummy then @@ -216,7 +219,10 @@ let spec = ref ( "-classic-display", Set Log.classic_display, " Display executed commands the old-fashioned way"; "-use-menhir", Set use_menhir, " Use menhir instead of ocamlyacc"; "-use-jocaml", Unit use_jocaml, " Use jocaml compilers instead of ocaml ones"; - "-use-ocamlfind", Set use_ocamlfind, " Use ocamlfind to call ocaml compilers"; + "-use-ocamlfind", Set use_ocamlfind, " Use the 'ocamlfind' wrapper instead of \ + using Findlib directly to determine command-line arguments. \ + Use -no-ocamlfind to disable."; + "-no-ocamlfind", Clear use_ocamlfind, " Don't use ocamlfind."; "-j", Set_int Command.jobs, " Allow N jobs at once (0 for unlimited)"; @@ -268,6 +274,8 @@ let init () = parse_argv argv' !spec anon_fun usage_msg; Shell.mkdir_p !build_dir; + project_root_dir := Some (Sys.getcwd ()); + let () = let log = !log_file_internal in if log = "" then Log.init None @@ -283,14 +291,33 @@ let init () = in if !use_ocamlfind then begin - (* TODO: warning message when using an option such as -ocamlc *) + begin try ignore(Command.search_in_path "ocamlfind") + with Not_found -> + failwith "ocamlfind not found on path, but -no-ocamlfind not used" + end; + + let with_ocamlfind (command_name, command_ref) = + command_ref := match !command_ref with + | Sh user_command -> + (* this command has been set by the user + using an -ocamlc, -ocamlopt, etc. flag; + + not all such combinations make sense (eg. "ocamlfind + /my/special/path/to/ocamlc" will make ocamlfind choke), + but the user will see the error and hopefully fix the + flags. *) + ocamlfind & (Sh user_command); + | _ -> ocamlfind & A command_name + in (* Note that plugins can still modify these variables After_options. This design decision can easily be changed. *) - ocamlc := ocamlfind & A"ocamlc"; - ocamlopt := ocamlfind & A"ocamlopt"; - ocamldep := ocamlfind & A"ocamldep"; - ocamldoc := ocamlfind & A"ocamldoc"; - ocamlmktop := ocamlfind & A"ocamlmktop"; + List.iter with_ocamlfind [ + "ocamlc", ocamlc; + "ocamlopt", ocamlopt; + "ocamldep", ocamldep; + "ocamldoc", ocamldoc; + "ocamlmktop", ocamlmktop; + ] end; let reorder x y = x := !x @ (List.concat (List.rev !y)) in @@ -328,3 +355,17 @@ let init () = ignore_list := List.map String.capitalize !ignore_list ;; + +(* The current heuristic: we know we are in an ocamlbuild project if + either _tags or myocamlbuild.ml are present at the root. This + heuristic has been documented and explained to users, so it should + not be changed. *) +let ocamlbuild_project_heuristic () = + let root_dir = match !project_root_dir with + | None -> Sys.getcwd () + | Some dir -> dir in + let at_root file = Filename.concat root_dir file in + Sys.file_exists (* authorized since we're not in build *) + (at_root "_tags") + || Sys.file_exists (* authorized since we're not in build *) + (at_root "myocamlbuild.ml") diff --git a/ocamlbuild/options.mli b/ocamlbuild/options.mli index b450c845..0a0d39c4 100644 --- a/ocamlbuild/options.mli +++ b/ocamlbuild/options.mli @@ -15,12 +15,20 @@ include Signatures.OPTIONS with type command_spec = Command.spec -(* this option is not in Signatures.OPTIONS yet because adding tags to +(* This option is not in Signatures.OPTIONS yet because adding tags to the compilation of the plugin is a recent feature that may still be subject to change, so the interface may not be stable; besides, there is obviously little to gain from tweaking that option from inside the plugin itself... *) val plugin_tags : string list ref +(* Returns 'true' if we heuristically infer that we are run from an + ocamlbuild projet (either _tags or myocamlbuild.ml are present). + + This information is used to decide whether to enable recursive + traversal of subdirectories by default. +*) +val ocamlbuild_project_heuristic : unit -> bool + val entry : bool Slurp.entry option ref val init : unit -> unit diff --git a/ocamlbuild/param_tags.ml b/ocamlbuild/param_tags.ml index 2d4f4ae6..45623903 100644 --- a/ocamlbuild/param_tags.ml +++ b/ocamlbuild/param_tags.ml @@ -10,6 +10,7 @@ (* *) (***********************************************************************) +open My_std (* Original author: Romain Bardou *) @@ -32,25 +33,28 @@ let only_once f = let declare name action = Hashtbl.add declared_tags name (only_once action) -let parse tag = Lexers.tag_gen (Lexing.from_string tag) +let parse source tag = Lexers.tag_gen source (lexbuf_of_string tag) -let acknowledge tag = - acknowledged_tags := parse tag :: !acknowledged_tags +let acknowledge source maybe_loc tag = + acknowledged_tags := (parse source tag, maybe_loc) :: !acknowledged_tags -let really_acknowledge ?(quiet=false) (name, param) = +let really_acknowledge ?(quiet=false) ((name, param), maybe_loc) = match param with | None -> if Hashtbl.mem declared_tags name && not quiet then - Log.eprintf "Warning: tag %S expects a parameter" name + Log.eprintf "%aWarning: tag %S expects a parameter" + Loc.print_loc_option maybe_loc name | Some param -> let actions = List.rev (Hashtbl.find_all declared_tags name) in if actions = [] && not quiet then - Log.eprintf "Warning: tag %S does not expect a parameter, \ - but is used with parameter %S" name param; + Log.eprintf "%aWarning: tag %S does not expect a parameter, \ + but is used with parameter %S" + Loc.print_loc_option maybe_loc name param; List.iter (fun f -> f param) actions -let partial_init ?quiet tags = - Tags.iter (fun tag -> really_acknowledge ?quiet (parse tag)) tags +let partial_init ?quiet source tags = + let parse_noloc tag = (parse source tag, None) in + Tags.iter (fun tag -> really_acknowledge ?quiet (parse_noloc tag)) tags let init () = List.iter really_acknowledge (My_std.List.ordered_unique !acknowledged_tags) diff --git a/ocamlbuild/param_tags.mli b/ocamlbuild/param_tags.mli index 3b978fa7..06113941 100644 --- a/ocamlbuild/param_tags.mli +++ b/ocamlbuild/param_tags.mli @@ -22,7 +22,7 @@ if a tag of the form [name(param)] is [acknowledge]d. A given tag may be declared several times with different actions. All actions will be executed, in the order they were declared. *) -val acknowledge: string -> unit +val acknowledge: Loc.source -> Loc.location option -> string -> unit (** Acknowledge a tag. If the tag is of the form [X(Y)], and have been declared using [declare], @@ -37,7 +37,7 @@ This will make effective all instantiations [foo(bar)] such that the parametrized tag [foo] has been [declare]d and [foo(bar)] has been [acknowledge]d after the last [init] call. *) -val partial_init: ?quiet:bool -> Tags.t -> unit +val partial_init: ?quiet:bool -> Loc.source -> Tags.t -> unit (** Initialize a list of tags This will make effective the instances [foo(bar)] appearing diff --git a/ocamlbuild/plugin.ml b/ocamlbuild/plugin.ml index 6e533bb9..e4d18363 100644 --- a/ocamlbuild/plugin.ml +++ b/ocamlbuild/plugin.ml @@ -202,7 +202,7 @@ module Make(U:sig end) = precisely those that will be used during the compilation of the plugin, and no more. *) - Param_tags.partial_init plugin_tags; + Param_tags.partial_init Const.Source.plugin_tag plugin_tags; let cmd = (* The argument order is important: we carefully put the @@ -248,6 +248,9 @@ module Make(U:sig end) = let rc = sys_command (Command.string_of_command_spec spec) in raise (Exit_silently_with_code rc); end + else if not (sys_file_exists plugin_file) && !Options.plugin_tags <> [] then + eprintf "Warning: option -plugin-tag(s) has no effect \ + in absence of plugin file %S" plugin_file else () end diff --git a/ocamlbuild/resource.ml b/ocamlbuild/resource.ml index 4121d194..229d7712 100644 --- a/ocamlbuild/resource.ml +++ b/ocamlbuild/resource.ml @@ -17,6 +17,8 @@ open Format open Log open Pathname.Operators + +type t = Pathname.t module Resources = Set.Make(Pathname) let print = Pathname.print @@ -312,7 +314,8 @@ end = struct let mk (pattern_allowed, s) = List.map begin function | `Var(var_name, globber) -> V(var_name, globber) | `Word s -> A s - end (Lexers.path_scheme pattern_allowed (Lexing.from_string s)) + end (Lexers.path_scheme pattern_allowed + Const.Source.target_pattern (lexbuf_of_string s)) let mk = memo mk diff --git a/ocamlbuild/resource.mli b/ocamlbuild/resource.mli index 0ec15d36..eb75d3db 100644 --- a/ocamlbuild/resource.mli +++ b/ocamlbuild/resource.mli @@ -18,6 +18,7 @@ open Pathname type resource_pattern type env +type t = Pathname.t module Resources : Set.S with type elt = t module Cache : diff --git a/ocamlbuild/rule.ml b/ocamlbuild/rule.ml index 7cef2fde..d91360cc 100644 --- a/ocamlbuild/rule.ml +++ b/ocamlbuild/rule.ml @@ -29,10 +29,10 @@ type digest_command = { digest : string; command : Command.t } type 'a gen_rule = { name : string; - tags : Tags.t; deps : Pathname.t list; (* These pathnames must be normalized *) prods : 'a list; (* Note that prods also contains stamp *) stamp : 'a option; + doc : string option; code : env -> builder -> digest_command } type rule = Pathname.t gen_rule @@ -42,6 +42,7 @@ let name_of_rule r = r.name let deps_of_rule r = r.deps let prods_of_rule r = r.prods let stamp_of_rule r = r.stamp +let doc_of_rule r = r.doc type 'a rule_printer = (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a gen_rule -> unit @@ -52,12 +53,21 @@ let print_rule_name f r = pp_print_string f r.name let print_resource_list = List.print Resource.print let print_rule_contents ppelt f r = - fprintf f "@[{@ @[<2>name =@ %S@];@ @[<2>tags =@ %a@];@ @[<2>deps =@ %a@];@ @[<2>prods = %a@];@ @[<2>code = @]@]@ }" - r.name Tags.print r.tags print_resource_list r.deps (List.print ppelt) r.prods + fprintf f "@[{@ @[<2>name =@ %S@];@ @[<2>deps =@ %a@];@ @[<2>prods = %a@];@ @[<2>code = @];@ @[ doc = %s@]@]@ }" + r.name print_resource_list r.deps (List.print ppelt) + r.prods + (match r.doc with + | None -> "None" + | Some doc -> sprintf "Some %S" doc) let pretty_print ppelt f r = - fprintf f "@[rule@ %S@ ~deps:%a@ ~prods:%a@ @]" - r.name print_resource_list r.deps (List.print ppelt) r.prods + fprintf f "@[rule %S@ ~deps:%a@ ~prods:%a@ " + r.name print_resource_list r.deps (List.print ppelt) r.prods; + begin match r.doc with + | None -> () + | Some doc -> fprintf f "~doc:\"@[%a@]\"@ " pp_print_text doc + end; + fprintf f "@]" let print = print_rule_name @@ -67,11 +77,14 @@ let subst env rule = let finder next_finder p = next_finder (Resource.subst_any env p) in let stamp = match rule.stamp with None -> None | Some x -> Some (Resource.subst_pattern env x) in let prods = subst_resource_patterns rule.prods in - { (rule) with name = sbprintf "%s (%a)" rule.name Resource.print_env env; - prods = prods; - deps = subst_resources rule.deps; (* The substition should preserve normalization of pathnames *) - stamp = stamp; - code = (fun env -> rule.code (finder env)) } + { name = sbprintf "%s (%a)" rule.name Resource.print_env env; + prods = prods; + deps = + (* The substition should preserve normalization of pathnames *) + subst_resources rule.deps; + stamp = stamp; + doc = rule.doc; + code = (fun env -> rule.code (finder env)) } exception Can_produce of rule @@ -84,8 +97,6 @@ let can_produce target rule = end rule.prods; None with Can_produce r -> Some r -(* let tags_matches tags r = if Tags.does_match tags r.tags then Some r else None *) - let digest_prods r = List.fold_right begin fun p acc -> let f = Pathname.to_string (Resource.in_build_dir p) in @@ -252,7 +263,15 @@ let (get_rules, add_rule, clear_rules) = end, (fun () -> rules := []) -let rule name ?(tags=[]) ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bottom) code = +let rule name ?tags ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bottom) ?doc code = + let () = + match tags with + | None -> () + | Some _ -> + Log.eprintf "Warning: your ocamlbuild rule %S uses the ~tags parameter, + which is deprecated and ignored." + name + in let res_add import xs xopt = let init = match xopt with @@ -281,9 +300,9 @@ let rule name ?(tags=[]) ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bo in add_rule insert { name = name; - tags = List.fold_right Tags.add tags Tags.empty; deps = res_add Resource.import (* should normalize *) deps dep; stamp = stamp; + doc = doc; prods = prods; code = code } @@ -307,3 +326,13 @@ let copy_rule name ?insert src dest = Shell.mkdir_p (Pathname.dirname dest); cp_p src dest end + +let show_documentation () = + let pp fmt = Log.raw_dprintf (-1) fmt in + let rules = get_rules () in + List.iter + (fun rule -> pp "%a@\n@\n" (pretty_print Resource.print_pattern) rule) + rules; + pp "@." + + diff --git a/ocamlbuild/rule.mli b/ocamlbuild/rule.mli index 0acb125c..70a73569 100644 --- a/ocamlbuild/rule.mli +++ b/ocamlbuild/rule.mli @@ -33,6 +33,7 @@ exception Failed val name_of_rule : 'a gen_rule -> string val deps_of_rule : 'a gen_rule -> Pathname.t list val prods_of_rule : 'a gen_rule -> 'a list +val doc_of_rule : 'a gen_rule -> string option val rule : string -> ?tags:string list -> @@ -42,6 +43,7 @@ val rule : string -> ?dep:string -> ?stamp:string -> ?insert:[`top | `before of string | `after of string | `bottom] -> + ?doc:string -> action -> unit (** [copy_rule name ?insert source destination] *) @@ -79,3 +81,5 @@ val clear_rules : unit -> unit val call : builder -> rule -> unit val build_deps_of_tags : builder -> Tags.t -> Pathname.t list + +val show_documentation : unit -> unit diff --git a/ocamlbuild/signatures.mli b/ocamlbuild/signatures.mli index bc217789..0c323e20 100644 --- a/ocamlbuild/signatures.mli +++ b/ocamlbuild/signatures.mli @@ -594,14 +594,22 @@ module type PLUGIN = sig Use ~dep for one file, ~deps for list of files. - It finally takes the action to perform in order to produce the productions files using the dependencies (see [action]). - There is also two more options: + + There are some more optional parameters: - The ~insert argument allow to insert the rules precisely between other rules. - The ~stamp argument specify the name of a file that will be automatically produced by ocamlbuild. This file can serve as a virtual target (or phony target), since it will be filled up by a digest of it dependencies. - - The ~tags argument in deprecated, don't use it. *) + - The ~tags argument in deprecated, don't use it. + + Finally, the optional ~doc argument allows to give an informal + explanation of the rule purpose and behavior, that will be + displayed by [ocamlbuild -documentation]. For example, it is + a good place to specify the commands that will be called, any + new tags introduced by the rule, and dynamic dependencies. + *) val rule : string -> ?tags:string list -> ?prods:string list -> @@ -610,6 +618,7 @@ module type PLUGIN = sig ?dep:string -> ?stamp:string -> ?insert:[`top | `before of string | `after of string | `bottom] -> + ?doc:string -> action -> unit (** [copy_rule name ?insert source destination] *) @@ -641,13 +650,13 @@ module type PLUGIN = sig _build/_log after trying to compile your code. *) val flag : Tags.elt list -> Command.spec -> unit - (** Allows to use [flag] with a parameterized tag (as [pdep] for [dep]). + (** Allows to use [flag] with a parametrized tag (as [pdep] for [dep]). Example: [pflag ["ocaml"; "compile"] "inline" (fun count -> S [A "-inline"; A count])] says that command line option ["-inline 42"] should be added - when compiling files tagged with tag ["inline(42)"]. *) + when compiling OCaml modules tagged with ["inline(42)"]. *) val pflag : Tags.elt list -> Tags.elt -> (string -> Command.spec) -> unit (** [flag_and_dep tags command_spec] @@ -663,6 +672,19 @@ module type PLUGIN = sig val pflag_and_dep : Tags.elt list -> Tags.elt -> (string -> Command.spec) -> unit + (** manually mark the tag as "useful" to silence the warning about + tags that are not part of any flag declaration. + + This is useful, + for example, if the tag is used in a flag declaration that is + only perfored in a conditional branch: + [if we_are_on_Windows then flag ["libfoo"] (A "bar");] + + When [we_are_on_Windows] is not true, you could get a warning about + "libfoo" not used in any flag declaration. + *) + val mark_tag_used : Tags.elt -> unit + (** [non_dependency module_path module_name] Example: [non_dependency "foo/bar/baz" "Goo"] @@ -758,7 +780,7 @@ module type PLUGIN = sig val run_and_read : string -> string (** Here is the list of hooks that the dispatch function have to handle. - Generally one respond to one or two hooks (like After_rules) and do + Generally one responds to one or two hooks (like After_rules) and do nothing in the default case. *) type hook = | Before_hygiene diff --git a/ocamlbuild/testsuite/README b/ocamlbuild/testsuite/README new file mode 100644 index 00000000..08e68d90 --- /dev/null +++ b/ocamlbuild/testsuite/README @@ -0,0 +1,13 @@ +The organization of tests is the following: + +- internal.ml contains the tests that should be runnable from a bare + OCaml installation -- always passing the -no-ocamlfind option. + +- findlibonly.ml contains the tests that should be runnable from a bare + OCaml installation, with only ocamlfind/findlib on top. The only + ocamlfind packages it relies over are those of the OCaml + distribution. + +- external.ml contains the tests that rely on other findlib packages + or external tools to run. Each test will only run if the findlib + package it depends on is present. \ No newline at end of file diff --git a/ocamlbuild/testsuite/external.ml b/ocamlbuild/testsuite/external.ml new file mode 100644 index 00000000..ce8dc9e7 --- /dev/null +++ b/ocamlbuild/testsuite/external.ml @@ -0,0 +1,22 @@ +#use "internal_test_header.ml";; +#use "findlibonly_test_header.ml";; +#use "external_test_header.ml";; + +let () = test "SubtoolOptions" + ~description:"Options that come from tags that needs to be spliced \ + to the subtool invocation (PR#5763)" + (* testing for the 'menhir' executable directly + is too hard to do in a portable way; test the ocamlfind package instead *) + ~requirements:(package_exists "menhirLib") + ~options:[`use_ocamlfind; `use_menhir; `tags["package\\(camlp4.fulllib\\)"]] + ~tree:[T.f "parser.mly" + ~content:"%{ %} + %token DUMMY + %start test + %% + test: {None}"] + ~matching:[M.f "parser.native"; M.f "parser.byte"] + ~targets:("parser.native",["parser.byte"]) + ();; + +run ~root:"_test_external";; diff --git a/ocamlbuild/testsuite/external_test_header.ml b/ocamlbuild/testsuite/external_test_header.ml new file mode 100644 index 00000000..2b890e35 --- /dev/null +++ b/ocamlbuild/testsuite/external_test_header.ml @@ -0,0 +1,7 @@ +(* Fullfilled and Missing are defined in ocamlbuild_test.ml + Findlib was loaded in findlibonly_test_header.ml *) +let package_exists package = + let open Findlib in + try ignore (package_directory package); Fullfilled + with No_such_package _ -> + Missing (Printf.sprintf "the ocamlfind package %s" package) diff --git a/ocamlbuild/testsuite/findlibonly.ml b/ocamlbuild/testsuite/findlibonly.ml new file mode 100644 index 00000000..d159ad47 --- /dev/null +++ b/ocamlbuild/testsuite/findlibonly.ml @@ -0,0 +1,42 @@ +#use "internal_test_header.ml";; +#use "findlibonly_test_header.ml";; + +let () = test "camlp4.opt" + ~description:"Fixes PR#5652" + ~options:[`package "camlp4.macro";`tags ["camlp4o.opt"; "syntax\\(camp4o\\)"]; + `ppflag "camlp4o.opt"; `ppflag "-parser"; `ppflag "macro"; + `ppflag "-DTEST"] + ~tree:[T.f "dummy.ml" + ~content:"IFDEF TEST THEN\nprint_endline \"Hello\";;\nENDIF;;"] + ~matching:[M.x "dummy.native" ~output:"Hello"] + ~targets:("dummy.native",[]) ();; + +let () = test "ThreadAndArchive" + ~description:"Fixes PR#6058" + ~options:[`use_ocamlfind; `package "threads"; `tag "thread"] + ~tree:[T.f "t.ml" ~content:""] + ~matching:[M.f "_build/t.cma"] + ~targets:("t.cma",[]) ();; + +let () = test "SyntaxFlag" + ~options:[`use_ocamlfind; `package "camlp4.macro"; `syntax "camlp4o"] + ~description:"-syntax for ocamlbuild" + ~tree:[T.f "dummy.ml" ~content:"IFDEF TEST THEN\nprint_endline \"Hello\";;\nENDIF;;"] + ~matching:[M.f "dummy.native"] + ~targets:("dummy.native",[]) ();; + +let () = test "PredicateFlag" + ~description:"ocamlfind ocamldep does not support the -predicate option" + ~options:[`use_ocamlfind; `tag "\"predicate(byte)\""] + ~tree:[T.f "test.ml" ~content:"let x = List.map"] + ~matching:[_build [M.f "test.ml.depends"]] + ~targets:("test.ml.depends", []) ();; + +let () = test "ToolsFlagsConflict" + ~description:"PR#6300: conflicts between -ocamlc and -use-ocamlfind options" + ~options:[`use_ocamlfind; `ocamlc "\"ocamlc -annot\""] + ~tree:[T.f "test.ml" ~content:"let x = 1"] + ~matching:[_build [M.f "test.annot"; M.f "test.byte"]] + ~targets:("test.byte", []) ();; + +run ~root:"_test_findlibonly";; diff --git a/ocamlbuild/testsuite/findlibonly_test_header.ml b/ocamlbuild/testsuite/findlibonly_test_header.ml new file mode 100644 index 00000000..5b147820 --- /dev/null +++ b/ocamlbuild/testsuite/findlibonly_test_header.ml @@ -0,0 +1,9 @@ +match Sys.command "ocamlfind ocamlc" with + | 0 -> () + | _ -> + prerr_endline "Having ocamlfind installed is a prerequisite \ + for running these tests. Aborting."; + exit 1; +;; + +#use "topfind";; diff --git a/ocamlbuild/testsuite/level0.ml b/ocamlbuild/testsuite/internal.ml similarity index 53% rename from ocamlbuild/testsuite/level0.ml rename to ocamlbuild/testsuite/internal.ml index aaa08c26..fc7ff98d 100644 --- a/ocamlbuild/testsuite/level0.ml +++ b/ocamlbuild/testsuite/internal.ml @@ -1,20 +1,12 @@ -#load "unix.cma";; +#use "internal_test_header.ml";; -let ocamlbuild = try Sys.getenv "OCAMLBUILD" with Not_found -> "ocamlbuild";; - -#use "ocamlbuild_test.ml";; - -module M = Match;; -module T = Tree;; - -let _build = M.d "_build";; - -test "BasicNativeTree" +let () = test "BasicNativeTree" + ~options:[`no_ocamlfind] ~description:"Output tree for native compilation" ~tree:[T.f "dummy.ml"] ~matching:[M.Exact - (_build - (M.lf + (_build + (M.lf ["_digests"; "dummy.cmi"; "dummy.cmo"; @@ -26,12 +18,13 @@ test "BasicNativeTree" "_log"]))] ~targets:("dummy.native",[]) ();; -test "BasicByteTree" +let () = test "BasicByteTree" + ~options:[`no_ocamlfind] ~description:"Output tree for byte compilation" ~tree:[T.f "dummy.ml"] ~matching:[M.Exact - (_build - (M.lf + (_build + (M.lf ["_digests"; "dummy.cmi"; "dummy.cmo"; @@ -41,7 +34,8 @@ test "BasicByteTree" "_log"]))] ~targets:("dummy.byte",[]) ();; -test "SeveralTargets" +let () = test "SeveralTargets" + ~options:[`no_ocamlfind] ~description:"Several targets" ~tree:[T.f "dummy.ml"] ~matching:[_build (M.lf ["dummy.byte"; "dummy.native"])] @@ -49,55 +43,41 @@ test "SeveralTargets" let alt_build_dir = "BuIlD2";; -test "BuildDir" - ~options:[`build_dir alt_build_dir] +let () = test "BuildDir" + ~options:[`no_ocamlfind; `build_dir alt_build_dir] ~description:"Different build directory" ~tree:[T.f "dummy.ml"] ~matching:[M.d alt_build_dir (M.lf ["dummy.byte"])] ~targets:("dummy.byte",[]) ();; -test "camlp4.opt" - ~description:"Fixes PR#5652" - ~options:[`use_ocamlfind; `package "camlp4.macro";`tags ["camlp4o.opt"; "syntax\\(camp4o\\)"]; - `ppflag "camlp4o.opt"; `ppflag "-parser"; `ppflag "macro"; `ppflag "-DTEST"] - ~tree:[T.f "dummy.ml" ~content:"IFDEF TEST THEN\nprint_endline \"Hello\";;\nENDIF;;"] - ~matching:[M.x "dummy.native" ~output:"Hello"] - ~targets:("dummy.native",[]) ();; +let tag_pat_msgs = + ["*:a", "File \"_tags\", line 1, characters 0-2:\n\ + Lexing error: Invalid globbing pattern \"*\"."; -test "ThreadAndArchive" - ~description:"Fixes PR#6058" - ~options:[`use_ocamlfind; `package "threads"; `tag "thread"] - ~tree:[T.f "t.ml" ~content:""] - ~matching:[M.f "_build/t.cma"] - ~targets:("t.cma",[]) ();; + "\n<*{>:a", "File \"_tags\", line 2, characters 0-5:\n\ + Lexing error: Invalid globbing pattern \"<*{>\"."; -let tag_pat_msgs = - ["*:a", "File \"_tags\", line 1, column 0: Lexing error: Invalid globbing pattern \"*\"."; - "\n<*{>:a", "File \"_tags\", line 2, column 0: Lexing error: Invalid globbing pattern \"<*{>\"."; - "<*>: ~@a,# ~a", "File \"_tags\", line 1, column 10: Lexing error: Only ',' separated tags are alllowed."];; + "<*>: ~@a,# ~a", "File \"_tags\", line 1, characters 10-11:\n\ + Lexing error: Only ',' separated tags are alllowed."];; List.iteri (fun i (content,failing_msg) -> - test (Printf.sprintf "TagsErrorMessage_%d" (i+1)) + let () = test (Printf.sprintf "TagsErrorMessage_%d" (i+1)) + ~options:[`no_ocamlfind] ~description:"Confirm relevance of an error message due to erronous _tags" ~failing_msg ~tree:[T.f "_tags" ~content; T.f "dummy.ml"] - ~targets:("dummy.native",[]) ()) tag_pat_msgs;; - -test "SubtoolOptions" - ~description:"Options that come from tags that needs to be spliced to the subtool invocation (PR#5763)" - ~options:[`use_menhir; `use_ocamlfind; `tags["package\\(camlp4.fulllib\\)"]] - ~tree:[T.f "parser.mly" ~content:"%{\n%}\n%token DUMMY\n%start test%%test: {None}\n\n"] - ~matching:[M.f "parser.native"; M.f "parser.byte"] - ~targets:("parser.native",["parser.byte"]) - ();; + ~targets:("dummy.native",[]) () + in ()) tag_pat_msgs;; -test "Itarget" +let () = test "Itarget" + ~options:[`no_ocamlfind] ~description:".itarget building with dependencies between the modules (PR#5686)" ~tree:[T.f "foo.itarget" ~content:"a.cma\nb.byte\n"; T.f "a.ml"; T.f "b.ml" ~content:"open A\n"] ~matching:[M.f "a.cma"; M.f "b.byte"] ~targets:("foo.otarget",[]) ();; -test "PackAcross" +let () = test "PackAcross" + ~options:[`no_ocamlfind] ~description:"Pack using a module from the other tree (PR#4592)" ~tree:[T.f "main.ml" ~content:"let _ = Pack.Packed.g ()\n"; T.f "Pack.mlpack" ~content:"pack/Packed"; @@ -109,7 +89,8 @@ test "PackAcross" ~targets:("main.byte", ["main.native"]) ();; -test "PackAcross2" +let () = test "PackAcross2" + ~options:[`no_ocamlfind] ~description:"Pack using a module from the other tree (PR#4592)" ~tree:[T.f "a2.mli" ~content:"val f : unit -> unit"; T.f "a2.ml" ~content:"let f _ = ()"; @@ -120,7 +101,8 @@ test "PackAcross2" ~matching:[M.f "prog.byte"] ~targets:("prog.byte",[]) ();; -test "PackAcross3" +let () = test "PackAcross3" + ~options:[`no_ocamlfind] ~description:"Pack using a module from the other tree (PR#4592)" ~tree:[T.d "foo" [ T.f "bar.ml" ~content:"let baz = Quux.xyzzy"]; T.f "foo.mlpack" ~content:"foo/Bar"; @@ -131,14 +113,17 @@ test "PackAcross3" ~matching:[M.f "main.byte"] ~targets:("main.byte",[]) ();; -test "SyntaxFlag" - ~description:"-syntax for ocamlbuild" - ~options:[`use_ocamlfind; `package "camlp4.macro"; `syntax "camlp4o"] - ~tree:[T.f "dummy.ml" ~content:"IFDEF TEST THEN\nprint_endline \"Hello\";;\nENDIF;;"] - ~matching:[M.f "dummy.native"] - ~targets:("dummy.native",[]) ();; +let () = test "NativeMliCmi" + ~options:[`no_ocamlfind; `ocamlc "toto" (*using ocamlc would fail*); + `tags["native"]] + ~description:"check that ocamlopt is used for .mli->.cmi \ + when tag 'native' is set (part of PR#4613)" + ~tree:[T.f "foo.mli" ~content:"val bar : int"] + ~matching:[_build [M.f "foo.cmi"]] + ~targets:("foo.cmi",[]) ();; -test "NoIncludeNoHygiene1" +let () = test "NoIncludeNoHygiene1" + ~options:[`no_ocamlfind] ~description:"check that hygiene checks are only done in traversed directories\ (PR#4502)" ~tree:[T.d "must_ignore" [ T.f "dirty.mli" ~content:"val bug : int"]; @@ -148,63 +133,77 @@ test "NoIncludeNoHygiene1" (* will make hygiene fail if must_ignore/ is checked *) ~targets:("hello.byte",[]) ();; -test "NoIncludeNoHygiene2" +let () = test "NoIncludeNoHygiene2" + ~options:[`no_ocamlfind; `build_dir "must_ignore"] ~description:"check that hygiene checks are not done on the -build-dir \ (PR#4502)" ~tree:[T.d "must_ignore" [ T.f "dirty.mli" ~content:"val bug : int"]; T.f "hello.ml" ~content:"print_endline \"Hello, World!\""; T.f "_tags" ~content:""] - ~options:[`build_dir "must_ignore"] ~pre_cmd:"ocamlc -c must_ignore/dirty.mli" (* will make hygiene fail if must_ignore/ is checked *) ~targets:("hello.byte",[]) ();; -test "NoIncludeNoHygiene3" +let () = test "NoIncludeNoHygiene3" + ~options:[`no_ocamlfind; `X "must_ignore"] ~description:"check that hygiene checks are not done on excluded dirs (PR#4502)" ~tree:[T.d "must_ignore" [ T.f "dirty.mli" ~content:"val bug : int"]; T.f "hello.ml" ~content:"print_endline \"Hello, World!\""; T.f "_tags" ~content:""] - ~options:[`X "must_ignore"] ~pre_cmd:"ocamlc -c must_ignore/dirty.mli" (* will make hygiene fail if must_ignore/ is checked *) ~targets:("hello.byte",[]) ();; -test "OutputObj" +let () = test "OutputObj" + ~options:[`no_ocamlfind] ~description:"output_obj targets for native and bytecode (PR #6049)" ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""] ~targets:("hello.byte.o",["hello.byte.c";"hello.native.o"]) ();; -test "StrictSequenceFlag" - ~description:"-strict_sequence tag" +let () = test "StrictSequenceFlag" + ~options:[`no_ocamlfind; `quiet] + ~description:"strict_sequence tag" ~tree:[T.f "hello.ml" ~content:"let () = 1; ()"; T.f "_tags" ~content:"true: strict_sequence\n"] - ~options:[`quiet] ~failing_msg:"File \"hello.ml\", line 1, characters 9-10: Error: This expression has type int but an expression was expected of type unit\nCommand exited with code 2." ~targets:("hello.byte",[]) ();; -test "PrincipalFlag" +let () = test "StrictFormatsFlag" + ~options:[`no_ocamlfind; `quiet] + ~description:"strict_format tag" + ~tree:[T.f "hello.ml" ~content:"let _ = Printf.printf \"%.10s\""; + T.f "_tags" ~content:"true: strict_formats\n"] + ~failing_msg:"File \"hello.ml\", line 1, characters 22-29: +Error: invalid format \"%.10s\": at character number 0, \ +`precision' is incompatible with 's' in sub-format \"%.10s\" +Command exited with code 2." + ~targets:("hello.byte",[]) ();; + +let () = test "PrincipalFlag" + ~options:[`no_ocamlfind; `quiet] ~description:"-principal tag" - ~tree:[T.f "hello.ml" ~content:"type s={foo:int;bar:unit} type t={foo:int} let f x = x.bar;x.foo"; + ~tree:[T.f "hello.ml" + ~content:"type s={foo:int;bar:unit} type t={foo:int} + let f x = (x.bar; x.foo)"; T.f "_tags" ~content:"true: principal\n"] - ~options:[`quiet] - ~failing_msg:"File \"hello.ml\", line 1, characters 61-64: + ~failing_msg:"File \"hello.ml\", line 2, characters 42-45: Warning 18: this type-based field disambiguation is not principal." ~targets:("hello.byte",[]) ();; -test "ModularPlugin1" - ~options:[`quiet; `plugin_tag "use_str"] +let () = test "ModularPlugin1" ~description:"test a plugin with dependency on external libraries" + ~options:[`no_ocamlfind; `quiet; `plugin_tag "use_str"] ~tree:[T.f "main.ml" ~content:"let x = 1"; T.f "myocamlbuild.ml" ~content:"ignore (Str.quote \"\");;"] ~matching:[M.f "main.byte"] ~targets:("main.byte",[]) ();; -test "ModularPlugin2" - ~description:"check that parametrized tags defined by the plugin +let () = test "ModularPlugin2" + ~description:"check that parametrized tags defined by the plugin \ do not warn at plugin-compilation time" - ~options:[`quiet] + ~options:[`no_ocamlfind; `quiet] ~tree:[T.f "main.ml" ~content:"let x = 1"; T.f "_tags" ~content:": toto(-g)"; T.f "myocamlbuild.ml" @@ -214,10 +213,10 @@ test "ModularPlugin2" ~matching:[M.f "main.byte"] ~targets:("main.byte",[]) ();; -test "ModularPlugin3" - ~description:"check that unknown parametrized tags encountered +let () = test "ModularPlugin3" + ~description:"check that unknown parametrized tags encountered \ during plugin compilation still warn" - ~options:[`quiet; `plugin_tag "'toto(-g)'"] + ~options:[`no_ocamlfind; `quiet; `plugin_tag "'toto(-g)'"] ~tree:[T.f "main.ml" ~content:"let x = 1"; T.f "myocamlbuild.ml" ~content:"open Ocamlbuild_plugin;; @@ -227,4 +226,81 @@ test "ModularPlugin3" ~matching:[M.f "main.byte"] ~targets:("main.byte",[]) ();; -run ~root:"_test";; +let () = test "PluginCompilation1" + ~description:"check that the plugin is not compiled when -no-plugin is passed" + ~options:[`no_ocamlfind; `no_plugin] + ~tree:[T.f "main.ml" ~content:"let x = 1"; + T.f "myocamlbuild.ml" ~content:"prerr_endline \"foo\";;"] + ~matching:[_build [M.Not (M.f "myocamlbuild")]] + ~targets:("main.byte",[]) ();; + +let () = test "PluginCompilation2" + ~description:"check that the plugin is compiled when -just-plugin is passed" + ~options:[`no_ocamlfind; `just_plugin] + ~tree:[T.f "main.ml" ~content:"let x = 1"; + T.f "myocamlbuild.ml" ~content:"print_endline \"foo\";;"] + ~matching:[_build [M.f "myocamlbuild"]] + ~targets:("", []) ();; + +let () = test "PluginCompilation3" + ~description:"check that the plugin is not executed \ + when -just-plugin is passed" + ~options:[`no_ocamlfind; `quiet; `just_plugin] + ~tree:[T.f "main.ml" ~content:"let x = 1"; + T.f "myocamlbuild.ml" ~content:"print_endline \"foo\";;"] + (* if the plugin were executed we'd get "foo" in failing_msg *) + ~failing_msg:"" + ~targets:("main.byte", []) ();; + +let () = test "PluginTagsWarning" + ~description:"check that a warning is raised if -plugin-tags \ + is used without a plugin file" + ~options:[`no_ocamlfind; `plugin_tag "use_str"] + ~tree:[T.f "main.ml" ~content:""] + ~matching:[_build [M.f "main.cmo"]] + ~failing_msg:"Warning: option -plugin-tag(s) has no effect \ + in absence of plugin file \"myocamlbuild.ml\"" + ~targets:("main.ml", []) ();; + +let () = test "TagsInNonHygienic" + ~description:"Regression test for PR#6482, where a _tags \ + in a non-traversed directory would cause \ + ocamlbuild to abort" + ~options:[`no_ocamlfind] + ~tree:[ + T.f "main.ml" ~content:""; + T.d "deps" [T.f "_tags" ~content:""]; + T.f "_tags" ~content:": not_hygienic\n"; + ] + ~matching:[M.f "main.byte"] + ~targets:("main.byte",[]) ();; + +let () = test "TagsNewlines" + ~description:"Regression test for PR#6087 about placement \ + of newline-escaping backslashes" + ~options:[`no_ocamlfind] + ~tree:[ + T.f "main.ml" ~content:""; + T.f "_tags" ~content: +": debug,\\ +rectypes +: \\ +debug, rectypes +\\ +: debug, rectypes +"; + ] + ~matching:[M.f "main.byte"] + ~targets:("main.byte",[]) ();; + +let () = test "OpenTag" + ~description:"Test the parametrized tag for the new -open feature" + ~options:[`no_ocamlfind] + ~tree:[ + T.f "test.ml" ~content:"let _ = map rev [ []; [3;2] ]"; + T.f "_tags" ~content: ": open(List)"; + ] + ~matching:[M.f "test.byte"] + ~targets:("test.byte",[]) ();; + +run ~root:"_test_internal";; diff --git a/ocamlbuild/testsuite/internal_test_header.ml b/ocamlbuild/testsuite/internal_test_header.ml new file mode 100644 index 00000000..da78c726 --- /dev/null +++ b/ocamlbuild/testsuite/internal_test_header.ml @@ -0,0 +1,10 @@ +#load "unix.cma";; + +let ocamlbuild = try Sys.getenv "OCAMLBUILD" with Not_found -> "ocamlbuild";; + +#use "ocamlbuild_test.ml";; + +module M = Match;; +module T = Tree;; + +let _build = M.d "_build";; diff --git a/ocamlbuild/testsuite/ocamlbuild_test.ml b/ocamlbuild/testsuite/ocamlbuild_test.ml index 3ba353eb..e3f44c55 100644 --- a/ocamlbuild/testsuite/ocamlbuild_test.ml +++ b/ocamlbuild/testsuite/ocamlbuild_test.ml @@ -19,8 +19,11 @@ let print_list ~sep f ppf = function | x :: [] -> f ppf x | x :: xs -> f ppf x; List.iter (fun x -> sep ppf (); f ppf x) xs -let print_list_com f = print_list ~sep:(fun ppf () -> pp_print_string ppf ",") f -let print_list_blank f = print_list ~sep:(fun ppf () -> pp_print_string ppf " ") f +let print_list_com f = + print_list ~sep:(fun ppf () -> pp_print_string ppf ",") f +let print_list_blank f = + print_list ~sep:(fun ppf () -> pp_print_string ppf " ") f + let print_string_list = print_list_com pp_print_string let print_string_list_com = print_list_com pp_print_string let print_string_list_blank = print_list_blank pp_print_string @@ -58,24 +61,25 @@ module Match = struct | D of file * t list (* Like file, but will be executed, and the result will compared *) | X of file * result - (* Symlink *) - | L of file * file + (* Symlink; currently not supported *) + (* | L of file * file *) (* We request that everything below should match exactly *) | Exact of t (* Here we want just the tree contained entities but we allow some other stuff to be there too *) | Contains of t - (* Any means that we match anything *) - | Any - (* Empty a tree leaf that don't match at all *) + (* matching on Empty always fail *) | Empty + (* matches the negation of its argument: fails when it succeeds + and vice versa; Any can be expressed as (Not Empty) *) + | Not of t (* Type of error, we either expect something or something is un-expected *) type error = Expected of string | Unexpected of string | Structure of string * string list - | Output of string * string + | Output of string * string * string (* This will print the tree *) let print ppf tree = @@ -83,13 +87,14 @@ module Match = struct List.iter (fun line -> pp_print_space ppf (); item ppf line) lst and item ppf = function | F (_, name) -> fprintf ppf "@[%s@]" name - | D ((_, name), children) -> fprintf ppf "@[@[%s/@]%a@]" name lines children + | D ((_, name), children) -> + fprintf ppf "@[@[%s/@]%a@]" name lines children | X ((_,name), _) -> fprintf ppf "@[%s@]" name - | L ((_,src), (_,dst)) -> fprintf ppf "@[%s->%s@]@" src dst + (* | L ((_,src), (_,dst)) -> fprintf ppf "@[%s->%s@]@" src dst *) | Exact content -> fprintf ppf "{%a}" item content | Contains content -> fprintf ppf "<%a>" item content - | Any -> pp_print_char ppf '*' | Empty -> pp_print_char ppf '#' + | Not t -> fprintf ppf "not(@[%a@])" item t in pp_open_vbox ppf 0; item ppf tree; @@ -101,57 +106,60 @@ module Match = struct let x ?(atts=()) name ~output = X ((atts,name), (0,output)) let match_with_fs ~root m = - - let errors = ref [] in - - let rec visit ~exact path m = - let file name = - "./" ^ (List.rev (name :: path) |> String.concat "/") - + let rec visit ~exact ~successes ~errors path m = + let string_of_path path = "./" ^ String.concat "/" (List.rev path) in + let file name = string_of_path (name :: path) in + let push li x = li := x :: !li in + let exists_assert filename = + push (if exists filename then successes else errors) (Expected filename) in - - let exists_assert filename = - if not (exists (file filename)) then - errors := Expected filename :: !errors; - in - - let take_name = function - | F (_, name) - | D ((_, name),_) -> [name] - | _ -> [] - in - - match m with - | F ((),name) -> - exists_assert name - | D (((),name), sub) -> - exists_assert name; - let lst = List.flatten (List.map take_name sub) in - let lst' = Sys.readdir name |> Array.to_list in - let lst' = List.filter (fun x -> not (List.mem x lst)) lst' in - (if exact && lst' <> [] then - errors := Structure ((file name), lst') :: !errors); - List.iter (visit ~exact (name :: path)) sub - | X (((), name), (retcode, output)) -> - let _,output' = execute (file name) in - let output' = String.concat "\n" output' in - if output <> output' then - errors := Output (output, output') :: !errors - | Exact sub -> visit ~exact:true path sub - | Contains sub -> visit ~exact:false path sub - | _ -> assert false + let rec take_name = function + | F (_, name) + | D ((_, name), _) + | X ((_, name), _) -> [name] + | Exact sub + | Contains sub + | Not sub -> take_name sub + | Empty -> [] + in + match m with + | F ((),name) -> + exists_assert (file name) + | D (((),name), sub) -> + exists_assert (file name); + let lst = List.flatten (List.map take_name sub) in + let lst' = Sys.readdir name |> Array.to_list in + let lst' = List.filter (fun x -> not (List.mem x lst)) lst' in + (if exact && lst' <> [] then + errors := Structure ((file name), lst') :: !errors); + List.iter (visit ~exact ~successes ~errors (name :: path)) sub + | X (((), name), (retcode, output)) -> + let _,output' = execute (file name) in + let output' = String.concat "\n" output' in + push (if output <> output' then errors else successes) + (Output (file name, output, output')); + | Exact sub -> visit ~exact:true ~successes ~errors path sub + | Contains sub -> visit ~exact:false ~successes ~errors path sub + | Empty -> push errors (Unexpected (string_of_path path)) + | Not sub -> visit ~exact ~errors:successes ~successes:errors path sub in let dir = Sys.getcwd () in Unix.chdir root; - visit ~exact:false [] m; + let successes = ref [] in + let errors = ref [] in + visit ~exact:false ~successes ~errors [] m; Unix.chdir dir; List.rev !errors let string_of_error = function | Expected s -> Printf.sprintf "expected '%s' on a file system" s | Unexpected s -> Printf.sprintf "un-expected '%s' on a file system" s - | Structure (s,l) -> Printf.sprintf "directory structure '%s' has un-expected files %s" s (String.concat ", " l) - | Output (e, p) -> Printf.sprintf "not matching output '%s' expected but got %s" e p + | Structure (s,l) -> + Printf.sprintf "directory structure '%s' has un-expected files %s" + s (String.concat ", " l) + | Output (s, e, p) -> + Printf.sprintf "executable %s expected output %S but got %S" + s e p end module Option = struct @@ -209,6 +217,7 @@ module Option = struct | `no_links | `no_skip | `no_hygiene + | `no_ocamlfind | `no_plugin | `no_stdlib | `dont_catch_errors @@ -299,7 +308,8 @@ module Option = struct | `no_links -> fprintf ppf "no-links" | `no_skip -> fprintf ppf "no-skip" | `no_hygiene -> fprintf ppf "no-hygiene" - | `no_plugin -> fprintf ppf "no-pluging" + | `no_ocamlfind -> fprintf ppf "no-ocamlfind" + | `no_plugin -> fprintf ppf "no-plugin" | `no_stdlib -> fprintf ppf "no-stdlib" | `dont_catch_errors -> fprintf ppf "dont" | `just_plugin -> fprintf ppf "just-plugin" @@ -373,8 +383,11 @@ type content = string type filename = string type run = filename * content +type requirements = Fullfilled | Missing of string + type test = { name : string ; description : string + ; requirements : requirements option ; tree : Tree.t list ; matching : Match.t list ; options : Option.t list @@ -387,12 +400,38 @@ let tests = ref [] let test name ~description + ?requirements ?(options=[]) ?(run=[]) ?pre_cmd ?failing_msg ?(tree=[]) ?(matching=[]) ~targets () = - tests := !tests @ [{ name; description; tree; matching; options; targets; pre_cmd; failing_msg; run }] + tests := !tests @ [{ + name; + description; + requirements; + tree; + matching; + options; + targets; + pre_cmd; + failing_msg; + run; + }] + +let print_colored header_color header name body_color body = + let color_code = function + | `Red -> "31" + | `Green -> "32" + | `Yellow -> "33" + | `Blue -> "34" + | `Magenta -> "35" + | `Cyan -> "36" + in + Printf.printf "\x1b[0;%sm\x1b[1m[%s]\x1b[0m \ + \x1b[1m%-20s\x1b[0;%sm%s.\n\x1b[m%!" + (color_code header_color) header name + (color_code body_color) body let run ~root = let dir = Sys.getcwd () in @@ -411,6 +450,7 @@ let run ~root = let one_test { name ; description + ; requirements ; tree ; matching ; options @@ -425,47 +465,72 @@ let run ~root = List.iter (Tree.create_on_fs ~root:full_name) tree; Unix.chdir full_name; - (match pre_cmd with - | None -> () - | Some str -> ignore(Sys.command str)); - - let log_name = full_name ^ ".log" in - - let cmd = command options (fst targets :: snd targets) in - let allow_failure = failing_msg <> None in - - Unix.(match execute cmd with - | WEXITED n,lines - | WSIGNALED n,lines - | WSTOPPED n,lines when allow_failure || n <> 0 -> - begin match failing_msg with - | None -> - let ch = open_out log_name in - List.iter (fun l -> output_string ch l; output_string ch "\n") lines; - close_out ch; - Printf.printf "\x1b[0;31m\x1b[1m[FAILED]\x1b[0m \x1b[1m%-20s\x1b[0;33m%s.\n\x1b[m%!" name - (Printf.sprintf "Command '%s' with error code %n output written to %s" cmd n log_name); - | Some failing_msg -> - let starts_with_plus s = String.length s > 0 && s.[0] = '+' in - let lines = List.filter (fun s -> not (starts_with_plus s)) lines in - let msg = String.concat "\n" lines in - if failing_msg = msg then - Printf.printf "\x1b[0;32m\x1b[1m[PASSED]\x1b[0m \x1b[1m%-20s\x1b[0;36m%s.\n\x1b[m%!" name description - else - Printf.printf "\x1b[0;31m\x1b[1m[FAILED]\x1b[0m \x1b[1m%-20s\x1b[0;33m%s.\n\x1b[m%!" name ((Printf.sprintf "Failure with not matching message:\n%s\n!=\n%s\n") msg failing_msg) - end; - | _ -> - let errors = List.concat (List.map (Match.match_with_fs ~root:full_name) matching) in - begin if errors == [] then - Printf.printf "\x1b[0;32m\x1b[1m[PASSED]\x1b[0m \x1b[1m%-20s\x1b[0;36m%s.\n\x1b[m%!" name description - else begin - let ch = open_out log_name in - output_string ch ("Run '" ^ cmd ^ "'\n"); - List.iter (fun e -> output_string ch (Match.string_of_error e); output_string ch ".\n") errors; - close_out ch; - Printf.printf "\x1b[0;31m\x1b[1m[FAILED]\x1b[0m \x1b[1m%-20s\x1b[0;33m%s.\n\x1b[m%!" name - (Printf.sprintf "Some system checks failed, output written to %s" log_name) - end - end) + match requirements with + | Some (Missing req) -> + print_colored `Yellow "SKIPPED" name `Yellow + (Printf.sprintf "%s is required and missing" req) + + | Some Fullfilled | None -> begin + + (match pre_cmd with + | None -> () + | Some str -> ignore(Sys.command str)); + + let log_name = full_name ^ ".log" in + + let cmd = command options (fst targets :: snd targets) in + let allow_failure = failing_msg <> None in + + let open Unix in + + match execute cmd with + | WEXITED n,lines + | WSIGNALED n,lines + | WSTOPPED n,lines when allow_failure || n <> 0 -> + begin match failing_msg with + | None -> + let ch = open_out log_name in + List.iter + (fun l -> output_string ch l; output_string ch "\n") + lines; + close_out ch; + print_colored `Red "FAILED" name `Yellow + (Printf.sprintf "Command '%s' with error code %n \ + output written to %s" cmd n log_name); + | Some failing_msg -> + let starts_with_plus s = String.length s > 0 && s.[0] = '+' in + let lines = + (* filter out -classic-display output *) + List.filter (fun s -> not (starts_with_plus s)) lines in + let msg = String.concat "\n" lines in + if failing_msg = msg then + print_colored `Green "PASSED" name `Cyan description + else + print_colored `Red "FAILED" name `Yellow + ((Printf.sprintf "Failure with not matching message:\n\ + %s\n!=\n%s\n") msg failing_msg) + end; + | _ -> + let errors = + List.concat + (List.map (Match.match_with_fs ~root:full_name) matching) in + begin if errors == [] then + print_colored `Green "PASSED" name `Cyan description + else begin + let ch = open_out log_name in + output_string ch ("Run '" ^ cmd ^ "'\n"); + List.iter + (fun e -> + output_string ch (Match.string_of_error e); + output_string ch ".\n") + errors; + close_out ch; + print_colored `Red "FAILED" name `Yellow + (Printf.sprintf "Some system checks failed, \ + output written to %s" + log_name) + end + end + end in List.iter one_test !tests diff --git a/ocamldoc/.depend b/ocamldoc/.depend index 61c131a6..0f692a22 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -6,30 +6,22 @@ odoc.cmx : ../typing/typedtree.cmx odoc_messages.cmx odoc_info.cmx \ odoc_global.cmx odoc_gen.cmx odoc_config.cmx odoc_args.cmx \ odoc_analyse.cmx ../utils/misc.cmx ../utils/config.cmx \ ../utils/clflags.cmx -odoc_analyse.cmo : ../utils/warnings.cmi ../typing/typetexp.cmi \ - ../typing/types.cmi ../typing/typemod.cmi ../typing/typedtree.cmi \ - ../typing/typedecl.cmi ../typing/typecore.cmi ../typing/typeclass.cmi \ - ../bytecomp/translcore.cmi ../bytecomp/translclass.cmi \ - ../parsing/syntaxerr.cmi ../driver/pparse.cmi ../parsing/parse.cmi \ - odoc_types.cmi odoc_text.cmi odoc_sig.cmi odoc_module.cmo odoc_misc.cmi \ - odoc_messages.cmo odoc_merge.cmi odoc_global.cmi odoc_dep.cmo \ - odoc_cross.cmi odoc_comments.cmi odoc_class.cmo odoc_ast.cmi \ - ../utils/misc.cmi ../parsing/location.cmi ../parsing/lexer.cmi \ - ../typing/includemod.cmi ../typing/env.cmi ../typing/ctype.cmi \ - ../utils/config.cmi ../typing/cmi_format.cmi ../utils/clflags.cmi \ - odoc_analyse.cmi -odoc_analyse.cmx : ../utils/warnings.cmx ../typing/typetexp.cmx \ - ../typing/types.cmx ../typing/typemod.cmx ../typing/typedtree.cmx \ - ../typing/typedecl.cmx ../typing/typecore.cmx ../typing/typeclass.cmx \ - ../bytecomp/translcore.cmx ../bytecomp/translclass.cmx \ - ../parsing/syntaxerr.cmx ../driver/pparse.cmx ../parsing/parse.cmx \ - odoc_types.cmx odoc_text.cmx odoc_sig.cmx odoc_module.cmx odoc_misc.cmx \ - odoc_messages.cmx odoc_merge.cmx odoc_global.cmx odoc_dep.cmx \ - odoc_cross.cmx odoc_comments.cmx odoc_class.cmx odoc_ast.cmx \ - ../utils/misc.cmx ../parsing/location.cmx ../parsing/lexer.cmx \ - ../typing/includemod.cmx ../typing/env.cmx ../typing/ctype.cmx \ - ../utils/config.cmx ../typing/cmi_format.cmx ../utils/clflags.cmx \ - odoc_analyse.cmi +odoc_analyse.cmo : ../utils/warnings.cmi ../typing/types.cmi \ + ../typing/typemod.cmi ../typing/typedtree.cmi ../parsing/syntaxerr.cmi \ + ../driver/pparse.cmi ../parsing/parse.cmi odoc_types.cmi odoc_text.cmi \ + odoc_sig.cmi odoc_module.cmo odoc_misc.cmi odoc_messages.cmo \ + odoc_merge.cmi odoc_global.cmi odoc_dep.cmo odoc_cross.cmi \ + odoc_comments.cmi odoc_class.cmo odoc_ast.cmi ../utils/misc.cmi \ + ../parsing/location.cmi ../typing/env.cmi ../utils/config.cmi \ + ../utils/clflags.cmi odoc_analyse.cmi +odoc_analyse.cmx : ../utils/warnings.cmx ../typing/types.cmx \ + ../typing/typemod.cmx ../typing/typedtree.cmx ../parsing/syntaxerr.cmx \ + ../driver/pparse.cmx ../parsing/parse.cmx odoc_types.cmx odoc_text.cmx \ + odoc_sig.cmx odoc_module.cmx odoc_misc.cmx odoc_messages.cmx \ + odoc_merge.cmx odoc_global.cmx odoc_dep.cmx odoc_cross.cmx \ + odoc_comments.cmx odoc_class.cmx odoc_ast.cmx ../utils/misc.cmx \ + ../parsing/location.cmx ../typing/env.cmx ../utils/config.cmx \ + ../utils/clflags.cmx odoc_analyse.cmi odoc_args.cmo : odoc_types.cmi odoc_texi.cmo odoc_messages.cmo odoc_man.cmo \ odoc_latex.cmo odoc_html.cmo odoc_global.cmi odoc_gen.cmi odoc_dot.cmo \ odoc_config.cmi ../utils/misc.cmi ../utils/config.cmi odoc_args.cmi @@ -40,16 +32,16 @@ odoc_ast.cmo : ../typing/types.cmi ../typing/typedtree.cmi \ ../typing/predef.cmi ../typing/path.cmi ../parsing/parsetree.cmi \ odoc_value.cmo odoc_types.cmi odoc_type.cmo odoc_sig.cmi \ odoc_parameter.cmo odoc_name.cmi odoc_module.cmo odoc_messages.cmo \ - odoc_global.cmi odoc_exception.cmo odoc_env.cmi odoc_class.cmo \ - ../utils/misc.cmi ../parsing/location.cmi ../typing/ident.cmi \ - ../parsing/asttypes.cmi odoc_ast.cmi + odoc_global.cmi odoc_extension.cmo odoc_exception.cmo odoc_env.cmi \ + odoc_class.cmo ../utils/misc.cmi ../parsing/location.cmi \ + ../typing/ident.cmi ../parsing/asttypes.cmi odoc_ast.cmi odoc_ast.cmx : ../typing/types.cmx ../typing/typedtree.cmx \ ../typing/predef.cmx ../typing/path.cmx ../parsing/parsetree.cmi \ odoc_value.cmx odoc_types.cmx odoc_type.cmx odoc_sig.cmx \ odoc_parameter.cmx odoc_name.cmx odoc_module.cmx odoc_messages.cmx \ - odoc_global.cmx odoc_exception.cmx odoc_env.cmx odoc_class.cmx \ - ../utils/misc.cmx ../parsing/location.cmx ../typing/ident.cmx \ - ../parsing/asttypes.cmi odoc_ast.cmi + odoc_global.cmx odoc_extension.cmx odoc_exception.cmx odoc_env.cmx \ + odoc_class.cmx ../utils/misc.cmx ../parsing/location.cmx \ + ../typing/ident.cmx ../parsing/asttypes.cmi odoc_ast.cmi odoc_class.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_parameter.cmo odoc_name.cmi odoc_class.cmx : ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ @@ -70,12 +62,12 @@ odoc_control.cmo : odoc_control.cmx : odoc_cross.cmo : odoc_value.cmo odoc_types.cmi odoc_type.cmo odoc_search.cmi \ odoc_scan.cmo odoc_parameter.cmo odoc_name.cmi odoc_module.cmo \ - odoc_misc.cmi odoc_messages.cmo odoc_global.cmi odoc_exception.cmo \ - odoc_class.cmo odoc_cross.cmi + odoc_misc.cmi odoc_messages.cmo odoc_global.cmi odoc_extension.cmo \ + odoc_exception.cmo odoc_class.cmo odoc_cross.cmi odoc_cross.cmx : odoc_value.cmx odoc_types.cmx odoc_type.cmx odoc_search.cmx \ odoc_scan.cmx odoc_parameter.cmx odoc_name.cmx odoc_module.cmx \ - odoc_misc.cmx odoc_messages.cmx odoc_global.cmx odoc_exception.cmx \ - odoc_class.cmx odoc_cross.cmi + odoc_misc.cmx odoc_messages.cmx odoc_global.cmx odoc_extension.cmx \ + odoc_exception.cmx odoc_class.cmx odoc_cross.cmi odoc_dag2html.cmo : odoc_info.cmi odoc_dag2html.cmi odoc_dag2html.cmx : odoc_info.cmx odoc_dag2html.cmi odoc_dep.cmo : ../parsing/parsetree.cmi odoc_type.cmo odoc_print.cmi \ @@ -85,13 +77,17 @@ odoc_dep.cmx : ../parsing/parsetree.cmi odoc_type.cmx odoc_print.cmx \ odoc_dot.cmo : odoc_messages.cmo odoc_info.cmi odoc_dot.cmx : odoc_messages.cmx odoc_info.cmx odoc_env.cmo : ../typing/types.cmi ../typing/printtyp.cmi \ - ../typing/predef.cmi ../typing/path.cmi odoc_name.cmi ../typing/btype.cmi \ - odoc_env.cmi + ../typing/predef.cmi ../typing/path.cmi odoc_name.cmi ../utils/misc.cmi \ + ../typing/btype.cmi odoc_env.cmi odoc_env.cmx : ../typing/types.cmx ../typing/printtyp.cmx \ - ../typing/predef.cmx ../typing/path.cmx odoc_name.cmx ../typing/btype.cmx \ - odoc_env.cmi + ../typing/predef.cmx ../typing/path.cmx odoc_name.cmx ../utils/misc.cmx \ + ../typing/btype.cmx odoc_env.cmi odoc_exception.cmo : ../typing/types.cmi odoc_types.cmi odoc_name.cmi odoc_exception.cmx : ../typing/types.cmx odoc_types.cmx odoc_name.cmx +odoc_extension.cmo : ../typing/types.cmi odoc_types.cmi odoc_name.cmi \ + ../parsing/asttypes.cmi +odoc_extension.cmx : ../typing/types.cmx odoc_types.cmx odoc_name.cmx \ + ../parsing/asttypes.cmi odoc_gen.cmo : odoc_texi.cmo odoc_module.cmo odoc_man.cmo odoc_latex.cmo \ odoc_html.cmo odoc_dot.cmo odoc_gen.cmi odoc_gen.cmx : odoc_texi.cmx odoc_module.cmx odoc_man.cmx odoc_latex.cmx \ @@ -107,15 +103,15 @@ odoc_html.cmx : odoc_text.cmx odoc_ocamlhtml.cmx odoc_messages.cmx \ odoc_info.cmo : ../typing/printtyp.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_text.cmi odoc_str.cmi odoc_search.cmi odoc_scan.cmo \ odoc_print.cmi odoc_parameter.cmo odoc_name.cmi odoc_module.cmo \ - odoc_misc.cmi odoc_global.cmi odoc_exception.cmo odoc_dep.cmo \ - odoc_config.cmi odoc_comments.cmi odoc_class.cmo odoc_analyse.cmi \ - ../parsing/location.cmi odoc_info.cmi + odoc_misc.cmi odoc_global.cmi odoc_extension.cmo odoc_exception.cmo \ + odoc_dep.cmo odoc_config.cmi odoc_comments.cmi odoc_class.cmo \ + odoc_analyse.cmi ../parsing/location.cmi odoc_info.cmi odoc_info.cmx : ../typing/printtyp.cmx odoc_value.cmx odoc_types.cmx \ odoc_type.cmx odoc_text.cmx odoc_str.cmx odoc_search.cmx odoc_scan.cmx \ odoc_print.cmx odoc_parameter.cmx odoc_name.cmx odoc_module.cmx \ - odoc_misc.cmx odoc_global.cmx odoc_exception.cmx odoc_dep.cmx \ - odoc_config.cmx odoc_comments.cmx odoc_class.cmx odoc_analyse.cmx \ - ../parsing/location.cmx odoc_info.cmi + odoc_misc.cmx odoc_global.cmx odoc_extension.cmx odoc_exception.cmx \ + odoc_dep.cmx odoc_config.cmx odoc_comments.cmx odoc_class.cmx \ + odoc_analyse.cmx ../parsing/location.cmx odoc_info.cmi odoc_inherit.cmo : odoc_inherit.cmx : odoc_latex.cmo : odoc_to_text.cmo odoc_messages.cmo odoc_latex_style.cmo \ @@ -129,15 +125,17 @@ odoc_lexer.cmo : odoc_parser.cmi odoc_messages.cmo odoc_global.cmi \ odoc_lexer.cmx : odoc_parser.cmx odoc_messages.cmx odoc_global.cmx \ odoc_comments_global.cmx odoc_man.cmo : odoc_str.cmi odoc_print.cmi odoc_misc.cmi odoc_messages.cmo \ - odoc_info.cmi ../parsing/asttypes.cmi + odoc_info.cmi ../utils/misc.cmi ../parsing/asttypes.cmi odoc_man.cmx : odoc_str.cmx odoc_print.cmx odoc_misc.cmx odoc_messages.cmx \ - odoc_info.cmx ../parsing/asttypes.cmi + odoc_info.cmx ../utils/misc.cmx ../parsing/asttypes.cmi odoc_merge.cmo : odoc_value.cmo odoc_types.cmi odoc_type.cmo \ odoc_parameter.cmo odoc_name.cmi odoc_module.cmo odoc_messages.cmo \ - odoc_global.cmi odoc_exception.cmo odoc_class.cmo odoc_merge.cmi + odoc_global.cmi odoc_extension.cmo odoc_exception.cmo odoc_class.cmo \ + odoc_merge.cmi odoc_merge.cmx : odoc_value.cmx odoc_types.cmx odoc_type.cmx \ odoc_parameter.cmx odoc_name.cmx odoc_module.cmx odoc_messages.cmx \ - odoc_global.cmx odoc_exception.cmx odoc_class.cmx odoc_merge.cmi + odoc_global.cmx odoc_extension.cmx odoc_exception.cmx odoc_class.cmx \ + odoc_merge.cmi odoc_messages.cmo : ../utils/config.cmi odoc_messages.cmx : ../utils/config.cmx odoc_misc.cmo : ../typing/types.cmi ../typing/predef.cmi ../typing/path.cmi \ @@ -147,9 +145,11 @@ odoc_misc.cmx : ../typing/types.cmx ../typing/predef.cmx ../typing/path.cmx \ odoc_types.cmx odoc_messages.cmx ../parsing/longident.cmx \ ../typing/ctype.cmx ../typing/btype.cmx odoc_misc.cmi odoc_module.cmo : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ - odoc_type.cmo odoc_name.cmi odoc_exception.cmo odoc_class.cmo + odoc_type.cmo odoc_name.cmi odoc_extension.cmo odoc_exception.cmo \ + odoc_class.cmo odoc_module.cmx : ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ - odoc_type.cmx odoc_name.cmx odoc_exception.cmx odoc_class.cmx + odoc_type.cmx odoc_name.cmx odoc_extension.cmx odoc_exception.cmx \ + odoc_class.cmx odoc_name.cmo : ../typing/path.cmi odoc_misc.cmi ../typing/ident.cmi \ odoc_name.cmi odoc_name.cmx : ../typing/path.cmx odoc_misc.cmx ../typing/ident.cmx \ @@ -160,41 +160,45 @@ odoc_parameter.cmo : ../typing/types.cmi odoc_types.cmi odoc_parameter.cmx : ../typing/types.cmx odoc_types.cmx odoc_parser.cmo : odoc_types.cmi odoc_comments_global.cmi odoc_parser.cmi odoc_parser.cmx : odoc_types.cmx odoc_comments_global.cmx odoc_parser.cmi -odoc_print.cmo : ../typing/types.cmi ../typing/printtyp.cmi odoc_print.cmi -odoc_print.cmx : ../typing/types.cmx ../typing/printtyp.cmx odoc_print.cmi +odoc_print.cmo : ../typing/types.cmi ../typing/printtyp.cmi \ + ../utils/misc.cmi odoc_print.cmi +odoc_print.cmx : ../typing/types.cmx ../typing/printtyp.cmx \ + ../utils/misc.cmx odoc_print.cmi odoc_scan.cmo : odoc_value.cmo odoc_types.cmi odoc_type.cmo odoc_module.cmo \ - odoc_exception.cmo odoc_class.cmo + odoc_extension.cmo odoc_exception.cmo odoc_class.cmo odoc_scan.cmx : odoc_value.cmx odoc_types.cmx odoc_type.cmx odoc_module.cmx \ - odoc_exception.cmx odoc_class.cmx + odoc_extension.cmx odoc_exception.cmx odoc_class.cmx odoc_search.cmo : odoc_value.cmo odoc_types.cmi odoc_type.cmo \ - odoc_parameter.cmo odoc_name.cmi odoc_module.cmo odoc_exception.cmo \ - odoc_class.cmo odoc_search.cmi + odoc_parameter.cmo odoc_name.cmi odoc_module.cmo odoc_extension.cmo \ + odoc_exception.cmo odoc_class.cmo odoc_search.cmi odoc_search.cmx : odoc_value.cmx odoc_types.cmx odoc_type.cmx \ - odoc_parameter.cmx odoc_name.cmx odoc_module.cmx odoc_exception.cmx \ - odoc_class.cmx odoc_search.cmi + odoc_parameter.cmx odoc_name.cmx odoc_module.cmx odoc_extension.cmx \ + odoc_exception.cmx odoc_class.cmx odoc_search.cmi odoc_see_lexer.cmo : odoc_parser.cmi odoc_see_lexer.cmx : odoc_parser.cmx odoc_sig.cmo : ../typing/types.cmi ../typing/typedtree.cmi \ ../typing/path.cmi ../parsing/parsetree.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_parameter.cmo odoc_name.cmi odoc_module.cmo \ odoc_misc.cmi odoc_messages.cmo odoc_merge.cmi odoc_global.cmi \ - odoc_exception.cmo odoc_env.cmi odoc_class.cmo ../utils/misc.cmi \ - ../parsing/location.cmi ../typing/ident.cmi ../typing/btype.cmi \ - ../parsing/asttypes.cmi odoc_sig.cmi + odoc_extension.cmo odoc_exception.cmo odoc_env.cmi odoc_class.cmo \ + ../utils/misc.cmi ../parsing/location.cmi ../typing/ident.cmi \ + ../typing/ctype.cmi ../typing/btype.cmi ../parsing/asttypes.cmi \ + odoc_sig.cmi odoc_sig.cmx : ../typing/types.cmx ../typing/typedtree.cmx \ ../typing/path.cmx ../parsing/parsetree.cmi odoc_value.cmx odoc_types.cmx \ odoc_type.cmx odoc_parameter.cmx odoc_name.cmx odoc_module.cmx \ odoc_misc.cmx odoc_messages.cmx odoc_merge.cmx odoc_global.cmx \ - odoc_exception.cmx odoc_env.cmx odoc_class.cmx ../utils/misc.cmx \ - ../parsing/location.cmx ../typing/ident.cmx ../typing/btype.cmx \ - ../parsing/asttypes.cmi odoc_sig.cmi + odoc_extension.cmx odoc_exception.cmx odoc_env.cmx odoc_class.cmx \ + ../utils/misc.cmx ../parsing/location.cmx ../typing/ident.cmx \ + ../typing/ctype.cmx ../typing/btype.cmx ../parsing/asttypes.cmi \ + odoc_sig.cmi odoc_str.cmo : ../typing/types.cmi ../typing/printtyp.cmi odoc_value.cmo \ odoc_type.cmo odoc_print.cmi odoc_name.cmi odoc_misc.cmi \ - odoc_messages.cmo odoc_exception.cmo odoc_class.cmo \ + odoc_messages.cmo odoc_extension.cmo odoc_exception.cmo odoc_class.cmo \ ../parsing/asttypes.cmi odoc_str.cmi odoc_str.cmx : ../typing/types.cmx ../typing/printtyp.cmx odoc_value.cmx \ odoc_type.cmx odoc_print.cmx odoc_name.cmx odoc_misc.cmx \ - odoc_messages.cmx odoc_exception.cmx odoc_class.cmx \ + odoc_messages.cmx odoc_extension.cmx odoc_exception.cmx odoc_class.cmx \ ../parsing/asttypes.cmi odoc_str.cmi odoc_test.cmo : odoc_info.cmi odoc_gen.cmi odoc_args.cmi odoc_test.cmx : odoc_info.cmx odoc_gen.cmx odoc_args.cmx @@ -225,8 +229,7 @@ odoc_value.cmx : ../typing/types.cmx ../typing/printtyp.cmx odoc_types.cmx \ odoc_analyse.cmi : odoc_module.cmo odoc_global.cmi odoc_args.cmi : odoc_gen.cmi odoc_ast.cmi : ../typing/types.cmi ../typing/typedtree.cmi \ - ../typing/path.cmi ../parsing/parsetree.cmi odoc_sig.cmi odoc_name.cmi \ - odoc_module.cmo + ../parsing/parsetree.cmi odoc_sig.cmi odoc_name.cmi odoc_module.cmo odoc_comments.cmi : odoc_types.cmi odoc_module.cmo odoc_comments_global.cmi : odoc_config.cmi : @@ -238,7 +241,8 @@ odoc_gen.cmi : odoc_texi.cmo odoc_module.cmo odoc_man.cmo odoc_latex.cmo \ odoc_global.cmi : odoc_types.cmi odoc_info.cmi : ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_search.cmi odoc_parameter.cmo odoc_module.cmo \ - odoc_global.cmi odoc_exception.cmo odoc_class.cmo ../parsing/location.cmi + odoc_global.cmi odoc_extension.cmo odoc_exception.cmo odoc_class.cmo \ + ../parsing/location.cmi odoc_merge.cmi : odoc_types.cmi odoc_module.cmo odoc_misc.cmi : ../typing/types.cmi odoc_types.cmi ../parsing/longident.cmi odoc_name.cmi : ../typing/path.cmi ../parsing/longident.cmi \ @@ -246,11 +250,11 @@ odoc_name.cmi : ../typing/path.cmi ../parsing/longident.cmi \ odoc_parser.cmi : odoc_types.cmi odoc_print.cmi : ../typing/types.cmi odoc_search.cmi : odoc_value.cmo odoc_types.cmi odoc_type.cmo \ - odoc_module.cmo odoc_exception.cmo odoc_class.cmo + odoc_module.cmo odoc_extension.cmo odoc_exception.cmo odoc_class.cmo odoc_sig.cmi : ../typing/types.cmi ../parsing/parsetree.cmi odoc_types.cmi \ odoc_type.cmo odoc_name.cmi odoc_module.cmo odoc_env.cmi odoc_class.cmo odoc_str.cmi : ../typing/types.cmi odoc_value.cmo odoc_type.cmo \ - odoc_exception.cmo odoc_class.cmo + odoc_extension.cmo odoc_exception.cmo odoc_class.cmo odoc_text.cmi : odoc_types.cmi odoc_text_parser.cmi : odoc_types.cmi odoc_types.cmi : ../parsing/location.cmi diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 144b95d1..0e8b288b 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -14,14 +14,15 @@ include ../config/Makefile # Various commands and dir ########################## -CAMLRUN=../boot/ocamlrun -OCAMLC = ../ocamlcomp.sh -OCAMLOPT = ../ocamlcompopt.sh -OCAMLDEP = $(CAMLRUN) ../tools/ocamldep -OCAMLLEX = $(CAMLRUN) ../boot/ocamllex -OCAMLYACC= ../boot/ocamlyacc -OCAMLLIB = $(LIBDIR) -OCAMLBIN = $(BINDIR) +ROOTDIR = .. +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLLIB = $(LIBDIR) +OCAMLBIN = $(BINDIR) OCAMLPP=-pp './remove_DEBUG' @@ -36,10 +37,11 @@ OCAMLDOC_LIBCMA=odoc_info.cma OCAMLDOC_LIBCMI=odoc_info.cmi OCAMLDOC_LIBCMXA=odoc_info.cmxa OCAMLDOC_LIBA=odoc_info.$(A) -INSTALL_LIBDIR=$(OCAMLLIB)/ocamldoc +INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamldoc INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(OCAMLBIN) -INSTALL_MANODIR=$(MANDIR)/man3 +INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) +#MANO: man ocamldoc +INSTALL_MANODIR=$(DESTDIR)$(MANDIR)/man3 INSTALL_MLIS=odoc_info.mli INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) @@ -68,13 +70,13 @@ INCLUDES_DEP=-I $(OCAMLSRCDIR)/parsing \ INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ -I $(OCAMLSRCDIR)/otherlibs/str \ -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/unix \ + -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) \ -I $(OCAMLSRCDIR)/otherlibs/num \ - -I $(OCAMLSRCDIR)/otherlibs/graph + -I $(OCAMLSRCDIR)/otherlibs/$(GRAPHLIB) INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) -COMPFLAGS=$(INCLUDES) -warn-error A +COMPFLAGS=$(INCLUDES) -warn-error A -safe-string LINKFLAGS=$(INCLUDES) -nostdlib CMOFILES= odoc_config.cmo \ @@ -89,6 +91,7 @@ CMOFILES= odoc_config.cmo \ odoc_parameter.cmo\ odoc_value.cmo\ odoc_type.cmo\ + odoc_extension.cmo\ odoc_exception.cmo\ odoc_class.cmo\ odoc_module.cmo\ @@ -138,67 +141,23 @@ LIBCMXFILES= $(LIBCMOFILES:.cmo=.cmx) LIBCMIFILES= $(LIBCMOFILES:.cmo=.cmi) # Les cmo et cmx de la distrib OCAML -OCAMLCMOFILES=$(OCAMLSRCDIR)/parsing/printast.cmo \ - $(OCAMLSRCDIR)/typing/ident.cmo \ - $(OCAMLSRCDIR)/utils/tbl.cmo \ - $(OCAMLSRCDIR)/utils/misc.cmo \ - $(OCAMLSRCDIR)/utils/config.cmo \ - $(OCAMLSRCDIR)/utils/clflags.cmo \ - $(OCAMLSRCDIR)/utils/warnings.cmo \ - $(OCAMLSRCDIR)/utils/ccomp.cmo \ - $(OCAMLSRCDIR)/utils/consistbl.cmo \ - $(OCAMLSRCDIR)/parsing/location.cmo\ - $(OCAMLSRCDIR)/parsing/longident.cmo \ - $(OCAMLSRCDIR)/parsing/syntaxerr.cmo \ - $(OCAMLSRCDIR)/parsing/parser.cmo \ - $(OCAMLSRCDIR)/parsing/lexer.cmo \ - $(OCAMLSRCDIR)/parsing/parse.cmo \ - $(OCAMLSRCDIR)/typing/types.cmo \ - $(OCAMLSRCDIR)/typing/path.cmo \ - $(OCAMLSRCDIR)/typing/btype.cmo \ - $(OCAMLSRCDIR)/typing/predef.cmo \ - $(OCAMLSRCDIR)/typing/datarepr.cmo \ - $(OCAMLSRCDIR)/typing/subst.cmo \ - $(OCAMLSRCDIR)/typing/cmi_format.cmo \ - $(OCAMLSRCDIR)/typing/env.cmo \ - $(OCAMLSRCDIR)/typing/ctype.cmo \ - $(OCAMLSRCDIR)/typing/primitive.cmo \ - $(OCAMLSRCDIR)/typing/oprint.cmo \ - $(OCAMLSRCDIR)/typing/printtyp.cmo \ - $(OCAMLSRCDIR)/typing/includecore.cmo \ - $(OCAMLSRCDIR)/typing/typetexp.cmo \ - $(OCAMLSRCDIR)/typing/typedtree.cmo \ - $(OCAMLSRCDIR)/typing/parmatch.cmo \ - $(OCAMLSRCDIR)/typing/stypes.cmo \ - $(OCAMLSRCDIR)/typing/typedtreeMap.cmo \ - $(OCAMLSRCDIR)/typing/cmt_format.cmo \ - $(OCAMLSRCDIR)/typing/typecore.cmo \ - $(OCAMLSRCDIR)/typing/includeclass.cmo \ - $(OCAMLSRCDIR)/typing/typedecl.cmo \ - $(OCAMLSRCDIR)/typing/typeclass.cmo \ - $(OCAMLSRCDIR)/typing/mtype.cmo \ - $(OCAMLSRCDIR)/typing/includemod.cmo \ - $(OCAMLSRCDIR)/typing/typemod.cmo \ - $(OCAMLSRCDIR)/bytecomp/lambda.cmo \ - $(OCAMLSRCDIR)/bytecomp/typeopt.cmo \ - $(OCAMLSRCDIR)/bytecomp/printlambda.cmo \ - $(OCAMLSRCDIR)/bytecomp/switch.cmo \ - $(OCAMLSRCDIR)/bytecomp/matching.cmo \ - $(OCAMLSRCDIR)/bytecomp/translobj.cmo \ - $(OCAMLSRCDIR)/bytecomp/translcore.cmo \ - $(OCAMLSRCDIR)/bytecomp/translclass.cmo \ - $(OCAMLSRCDIR)/tools/depend.cmo \ - $(OCAMLSRCDIR)/driver/pparse.cmo +OCAMLCMOFILES= \ + $(OCAMLSRCDIR)/tools/depend.cmo OCAMLCMXFILES=$(OCAMLCMOFILES:.cmo=.cmx) + STDLIB_MLIS=../stdlib/*.mli \ - ../otherlibs/unix/unix.mli \ + ../otherlibs/$(UNIXLIB)/unix.mli \ ../otherlibs/str/str.mli \ ../otherlibs/bigarray/bigarray.mli \ ../otherlibs/num/num.mli -all: exe lib generators manpages +all: + $(MAKE) exe + $(MAKE) lib + $(MAKE) generators + $(MAKE) manpages exe: $(OCAMLDOC) lib: $(OCAMLDOC_LIBCMA) $(OCAMLDOC_LIBCMI) $(ODOC_TEST) @@ -213,16 +172,23 @@ debug: $(MAKE) OCAMLPP="" $(OCAMLDOC): $(EXECMOFILES) - $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) + $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma \ + $(OCAMLSRCDIR)/compilerlibs/ocamlcommon.cma \ + $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) $(OCAMLDOC_OPT): $(EXECMXFILES) - $(OCAMLOPT) -o $@ -linkall unix.cmxa str.cmxa dynlink.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) + $(OCAMLOPT) -o $@ -linkall unix.cmxa str.cmxa dynlink.cmxa \ + $(OCAMLSRCDIR)/compilerlibs/ocamlcommon.cmxa \ + $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) $(OCAMLDOC_LIBCMA): $(LIBCMOFILES) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo $(LIBCMOFILES) + $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo \ + $(LIBCMOFILES) $(OCAMLDOC_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx $(LIBCMXFILES) + $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx \ + $(LIBCMXFILES) manpages: stdlib_man/Pervasives.3o +html_doc: stdlib_html/Pervasives.html dot: $(EXECMOFILES) $(OCAMLDOC_RUN) -dot -dot-reduce -o ocamldoc.dot $(INCLUDES) \ @@ -284,7 +250,7 @@ install: dummy if test -d stdlib_man; then $(CP) stdlib_man/* $(INSTALL_MANODIR); else : ; fi installopt: - if test -f $(OCAMLDOC_OPT) ; then $(MAKE) installopt_really ; fi + if test -f $(OCAMLDOC_OPT); then $(MAKE) installopt_really ; fi installopt_really: if test -d $(INSTALL_BINDIR); then : ; else $(MKDIR) $(INSTALL_BINDIR); fi @@ -307,14 +273,14 @@ test_stdlib: dummy $(MKDIR) $@ $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/stdlib.odoc -keep-code \ ../stdlib/pervasives.ml ../stdlib/*.mli \ - ../otherlibs/unix/unix.mli \ + ../otherlibs/$(UNIXLIB)/unix.mli \ ../otherlibs/str/str.mli test_stdlib_code: dummy $(MKDIR) $@ $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/stdlib.odoc -keep-code \ `ls ../stdlib/*.ml | grep -v Labels` \ - ../otherlibs/unix/unix.ml \ + ../otherlibs/$(UNIXLIB)/unix.ml \ ../otherlibs/str/str.ml test_framed: dummy @@ -331,7 +297,7 @@ test_latex_simple: dummy -latextitle 6,subsection -latextitle 7,subsubection \ ../stdlib/hashtbl.mli \ ../stdlib/arg.mli \ - ../otherlibs/unix/unix.mli \ + ../otherlibs/$(UNIXLIB)/unix.mli \ ../stdlib/map.mli test_man: dummy @@ -348,12 +314,19 @@ stdlib_man/Pervasives.3o: $(STDLIB_MLIS) -t "OCaml library" -man-mini \ $(STDLIB_MLIS) +stdlib_html/Pervasives.html: $(STDLIB_MLIS) + $(MKDIR) stdlib_html + $(OCAMLDOC_RUN) -d stdlib_html -html $(INCLUDES) \ + -t "OCaml library" \ + $(STDLIB_MLIS) + + autotest_stdlib: dummy $(MKDIR) $@ $(OCAMLDOC_RUN) -g autotest/odoc_test.cmo\ $(INCLUDES) -keep-code \ ../stdlib/pervasives.ml ../stdlib/*.mli \ - ../otherlibs/unix/unix.mli \ + ../otherlibs/$(UNIXLIB)/unix.mli \ ../otherlibs/str/str.mli # backup, clean and depend : diff --git a/ocamldoc/Makefile.nt b/ocamldoc/Makefile.nt index 6b9818a9..22cd36eb 100644 --- a/ocamldoc/Makefile.nt +++ b/ocamldoc/Makefile.nt @@ -14,14 +14,15 @@ include ../config/Makefile # Various commands and dir ########################## -CAMLRUN=../boot/ocamlrun -OCAMLC = ../ocamlcomp.sh -OCAMLOPT = ../ocamlcompopt.sh -OCAMLDEP = $(CAMLRUN) ../tools/ocamldep -OCAMLLEX = $(CAMLRUN) ../boot/ocamllex -OCAMLYACC= ../boot/ocamlyacc -OCAMLLIB = $(LIBDIR) -OCAMLBIN = $(BINDIR) +ROOTDIR = .. +OCAMLRUN = $(ROOTDIR)/boot/ocamlrun +OCAMLC = $(OCAMLRUN) $(ROOTDIR)/ocamlc -nostdlib -I $(ROOTDIR)/stdlib +OCAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt -nostdlib -I $(ROOTDIR)/stdlib +OCAMLDEP = $(OCAMLRUN) $(ROOTDIR)/tools/ocamldep +OCAMLLEX = $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex +OCAMLYACC = $(ROOTDIR)/yacc/ocamlyacc +OCAMLLIB = $(LIBDIR) +OCAMLBIN = $(BINDIR) OCAMLPP=-pp "grep -v DEBUG" @@ -36,9 +37,9 @@ OCAMLDOC_LIBCMA=odoc_info.cma OCAMLDOC_LIBCMI=odoc_info.cmi OCAMLDOC_LIBCMXA=odoc_info.cmxa OCAMLDOC_LIBA=odoc_info.$(A) -INSTALL_LIBDIR=$(OCAMLLIB)/ocamldoc +INSTALL_LIBDIR=$(DESTDIR)$(OCAMLLIB)/ocamldoc INSTALL_CUSTOMDIR=$(INSTALL_LIBDIR)/custom -INSTALL_BINDIR=$(OCAMLBIN) +INSTALL_BINDIR=$(DESTDIR)$(OCAMLBIN) INSTALL_MLIS=odoc_info.mli INSTALL_CMIS=$(INSTALL_MLIS:.mli=.cmi) @@ -57,13 +58,13 @@ INCLUDES_DEP=-I $(OCAMLSRCDIR)/parsing \ INCLUDES_NODEP= -I $(OCAMLSRCDIR)/stdlib \ -I $(OCAMLSRCDIR)/otherlibs/str \ -I $(OCAMLSRCDIR)/otherlibs/dynlink \ - -I $(OCAMLSRCDIR)/otherlibs/win32unix \ + -I $(OCAMLSRCDIR)/otherlibs/$(UNIXLIB) \ -I $(OCAMLSRCDIR)/otherlibs/num \ - -I $(OCAMLSRCDIR)/otherlibs/win32graph + -I $(OCAMLSRCDIR)/otherlibs/$(GRAPHLIB) INCLUDES=$(INCLUDES_DEP) $(INCLUDES_NODEP) -COMPFLAGS=$(INCLUDES) -warn-error A +COMPFLAGS=$(INCLUDES) -warn-error A -safe-string LINKFLAGS=$(INCLUDES) -nostdlib CMOFILES= odoc_config.cmo \ @@ -78,6 +79,7 @@ CMOFILES= odoc_config.cmo \ odoc_parameter.cmo\ odoc_value.cmo\ odoc_type.cmo\ + odoc_extension.cmo\ odoc_exception.cmo\ odoc_class.cmo\ odoc_module.cmo\ @@ -119,7 +121,6 @@ EXECMOFILES=$(CMOFILES) \ odoc_args.cmo \ odoc.cmo - EXECMXFILES= $(EXECMOFILES:.cmo=.cmx) EXECMIFILES= $(EXECMOFILES:.cmo=.cmi) @@ -128,79 +129,40 @@ LIBCMXFILES= $(LIBCMOFILES:.cmo=.cmx) LIBCMIFILES= $(LIBCMOFILES:.cmo=.cmi) # Les cmo et cmx de la distrib OCAML -OCAMLCMOFILES=$(OCAMLSRCDIR)/parsing/printast.cmo \ - $(OCAMLSRCDIR)/typing/ident.cmo \ - $(OCAMLSRCDIR)/utils/tbl.cmo \ - $(OCAMLSRCDIR)/utils/misc.cmo \ - $(OCAMLSRCDIR)/utils/config.cmo \ - $(OCAMLSRCDIR)/utils/clflags.cmo \ - $(OCAMLSRCDIR)/utils/warnings.cmo \ - $(OCAMLSRCDIR)/utils/ccomp.cmo \ - $(OCAMLSRCDIR)/utils/consistbl.cmo \ - $(OCAMLSRCDIR)/parsing/location.cmo\ - $(OCAMLSRCDIR)/parsing/longident.cmo \ - $(OCAMLSRCDIR)/parsing/syntaxerr.cmo \ - $(OCAMLSRCDIR)/parsing/parser.cmo \ - $(OCAMLSRCDIR)/parsing/lexer.cmo \ - $(OCAMLSRCDIR)/parsing/parse.cmo \ - $(OCAMLSRCDIR)/typing/types.cmo \ - $(OCAMLSRCDIR)/typing/path.cmo \ - $(OCAMLSRCDIR)/typing/btype.cmo \ - $(OCAMLSRCDIR)/typing/predef.cmo \ - $(OCAMLSRCDIR)/typing/datarepr.cmo \ - $(OCAMLSRCDIR)/typing/subst.cmo \ - $(OCAMLSRCDIR)/typing/cmi_format.cmo \ - $(OCAMLSRCDIR)/typing/env.cmo \ - $(OCAMLSRCDIR)/typing/ctype.cmo \ - $(OCAMLSRCDIR)/typing/primitive.cmo \ - $(OCAMLSRCDIR)/typing/oprint.cmo \ - $(OCAMLSRCDIR)/typing/printtyp.cmo \ - $(OCAMLSRCDIR)/typing/includecore.cmo \ - $(OCAMLSRCDIR)/typing/typetexp.cmo \ - $(OCAMLSRCDIR)/typing/typedtree.cmo \ - $(OCAMLSRCDIR)/typing/parmatch.cmo \ - $(OCAMLSRCDIR)/typing/stypes.cmo \ - $(OCAMLSRCDIR)/typing/typedtreeMap.cmo \ - $(OCAMLSRCDIR)/typing/cmt_format.cmo \ - $(OCAMLSRCDIR)/typing/typecore.cmo \ - $(OCAMLSRCDIR)/typing/includeclass.cmo \ - $(OCAMLSRCDIR)/typing/typedecl.cmo \ - $(OCAMLSRCDIR)/typing/typeclass.cmo \ - $(OCAMLSRCDIR)/typing/mtype.cmo \ - $(OCAMLSRCDIR)/typing/includemod.cmo \ - $(OCAMLSRCDIR)/typing/typemod.cmo \ - $(OCAMLSRCDIR)/bytecomp/lambda.cmo \ - $(OCAMLSRCDIR)/bytecomp/typeopt.cmo \ - $(OCAMLSRCDIR)/bytecomp/printlambda.cmo \ - $(OCAMLSRCDIR)/bytecomp/switch.cmo \ - $(OCAMLSRCDIR)/bytecomp/matching.cmo \ - $(OCAMLSRCDIR)/bytecomp/translobj.cmo \ - $(OCAMLSRCDIR)/bytecomp/translcore.cmo \ - $(OCAMLSRCDIR)/bytecomp/translclass.cmo \ - $(OCAMLSRCDIR)/tools/depend.cmo \ - $(OCAMLSRCDIR)/driver/pparse.cmo +OCAMLCMOFILES= \ + $(OCAMLSRCDIR)/tools/depend.cmo OCAMLCMXFILES=$(OCAMLCMOFILES:.cmo=.cmx) -all: exe lib +all: + $(MAKEREC) exe + $(MAKEREC) lib + exe: $(OCAMLDOC) lib: $(OCAMLDOC_LIBCMA) $(OCAMLDOC_LIBCMI) opt.opt: exeopt libopt exeopt: $(OCAMLDOC_OPT) libopt: $(OCAMLDOC_LIBCMXA) $(OCAMLDOC_LIBCMI) + debug: - $(MAKE) OCAMLPP="" + $(MAKEREC) OCAMLPP="" $(OCAMLDOC): $(EXECMOFILES) - $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) + $(OCAMLC) -o $@ -linkall unix.cma str.cma dynlink.cma \ + $(OCAMLSRCDIR)/compilerlibs/ocamlcommon.cma \ + $(LINKFLAGS) $(OCAMLCMOFILES) $(EXECMOFILES) $(OCAMLDOC_OPT): $(EXECMXFILES) - $(OCAMLOPT) -o $@ unix.cmxa str.cmxa dynlink.cmxa $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) + $(OCAMLOPT) -o $@ -linkall unix.cmxa str.cmxa dynlink.cmxa \ + $(OCAMLSRCDIR)/compilerlibs/ocamlcommon.cmxa \ + $(LINKFLAGS) $(OCAMLCMXFILES) $(EXECMXFILES) $(OCAMLDOC_LIBCMA): $(LIBCMOFILES) - $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLCMOFILES) $(LIBCMOFILES) + $(OCAMLC) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmo \ + $(LIBCMOFILES) $(OCAMLDOC_LIBCMXA): $(LIBCMXFILES) - $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLCMXFILES) $(LIBCMXFILES) + $(OCAMLOPT) -a -o $@ $(LINKFLAGS) $(OCAMLSRCDIR)/tools/depend.cmx \ + $(LIBCMXFILES) # Parsers and lexers dependencies : ################################### @@ -269,7 +231,7 @@ installopt_really: ############################ clean:: dummy - @rm -f *~ /#*/# + @rm -f *~ \#*\# @rm -f $(OCAMLDOC) $(OCAMLDOC_OPT) *.cma *.cmxa *.cmo *.cmi *.cmx *.$(A) *.$(O) @rm -f odoc_parser.output odoc_text_parser.output @rm -f odoc_lexer.ml odoc_text_lexer.ml odoc_see_lexer.ml odoc_ocamlhtml.ml diff --git a/ocamldoc/generators/odoc_literate.ml b/ocamldoc/generators/odoc_literate.ml index fe993f8c..0e2718a3 100644 --- a/ocamldoc/generators/odoc_literate.ml +++ b/ocamldoc/generators/odoc_literate.ml @@ -126,8 +126,8 @@ class html = "a:active {color : Red; text-decoration : underline; }" ; ".keyword { font-weight : bold ; color : Red }" ; ".keywordsign { color : #C04600 }" ; - ".superscript { font-size : 4 }" ; - ".subscript { font-size : 4 }" ; + ".superscript { font-size : 0.6em }" ; + ".subscript { font-size : 0.6em }" ; ".comment { color : Green }" ; ".constructor { color : Blue }" ; ".type { color : #5C6585 }" ; diff --git a/ocamldoc/generators/odoc_todo.ml b/ocamldoc/generators/odoc_todo.ml index 31545fee..9dbf9f37 100644 --- a/ocamldoc/generators/odoc_todo.ml +++ b/ocamldoc/generators/odoc_todo.ml @@ -18,6 +18,7 @@ module Naming = Odoc_html.Naming open Odoc_info.Value open Odoc_info.Module open Odoc_info.Type +open Odoc_info.Extension open Odoc_info.Exception open Odoc_info.Class @@ -115,6 +116,12 @@ struct (Odoc_html.Naming.complete_type_target t) t.ty_info + method scan_extension_constructor x = + self#gen_if_tag + x.xt_name + (Odoc_html.Naming.complete_extension_target x) + x.xt_type_extension.te_info + method scan_exception e = self#gen_if_tag e.ex_name @@ -144,6 +151,7 @@ struct | Odoc_module.Element_class c -> self#scan_class c | Odoc_module.Element_class_type ct -> self#scan_class_type ct | Odoc_module.Element_value v -> self#scan_value v + | Odoc_module.Element_type_extension te -> self#scan_type_extension te | Odoc_module.Element_exception e -> self#scan_exception e | Odoc_module.Element_type t -> self#scan_type t | Odoc_module.Element_module_comment t -> self#scan_module_comment t diff --git a/ocamldoc/odoc_analyse.ml b/ocamldoc/odoc_analyse.ml index 19621cb5..fd69b0a7 100644 --- a/ocamldoc/odoc_analyse.ml +++ b/ocamldoc/odoc_analyse.ml @@ -33,10 +33,13 @@ let init_path () = (** Return the initial environment in which compilation proceeds. *) let initial_env () = + let initial = + if !Clflags.unsafe_string then Env.initial_unsafe_string + else Env.initial_safe_string + in try - if !Clflags.nopervasives - then Env.initial - else Env.open_pers_signature "Pervasives" Env.initial + if !Clflags.nopervasives then initial else + Env.open_pers_signature "Pervasives" initial with Not_found -> fatal_error "cannot open pervasives.cmi" @@ -53,6 +56,9 @@ let (++) x f = f x (** Analysis of an implementation file. Returns (Some typedtree) if no error occured, else None and an error message is printed.*) + +let tool_name = "ocamldoc" + let process_implementation_file ppf sourcefile = init_path (); let prefixname = Filename.chop_extension sourcefile in @@ -61,7 +67,10 @@ let process_implementation_file ppf sourcefile = let inputfile = preprocess sourcefile in let env = initial_env () in try - let parsetree = Pparse.file Format.err_formatter inputfile Parse.implementation ast_impl_magic_number in + let parsetree = + Pparse.file ~tool_name Format.err_formatter inputfile + Parse.implementation ast_impl_magic_number + in let typedtree = Typemod.type_implementation sourcefile prefixname modulename env parsetree @@ -89,8 +98,11 @@ let process_interface_file ppf sourcefile = let modulename = String.capitalize(Filename.basename prefixname) in Env.set_unit_name modulename; let inputfile = preprocess sourcefile in - let ast = Pparse.file Format.err_formatter inputfile Parse.interface ast_intf_magic_number in - let sg = Typemod.transl_signature (initial_env()) ast in + let ast = + Pparse.file ~tool_name Format.err_formatter inputfile + Parse.interface ast_intf_magic_number + in + let sg = Typemod.type_interface (initial_env()) ast in Warnings.check_fatal (); (ast, sg, inputfile) @@ -100,60 +112,16 @@ module Ast_analyser = Odoc_ast.Analyser (Odoc_comments.Basic_info_retriever) (** The module used to analyse the parse tree and typed tree of an interface file.*) module Sig_analyser = Odoc_sig.Analyser (Odoc_comments.Basic_info_retriever) -(** Handle an error. This is a partial copy of the compiler - driver/error.ml file. We do this because there are - some differences between the possibly raised exceptions - in the bytecode (error.ml) and opt (opterros.ml) compilers - and we don't want to take care of this. Besises, these - differences only concern code generation (i believe).*) +(** Handle an error. *) + let process_error exn = - let report ppf = function - | Lexer.Error(err, loc) -> - Location.print_error ppf loc; - Lexer.report_error ppf err - | Syntaxerr.Error err -> - Syntaxerr.report_error ppf err - | Env.Error err -> - Location.print_error_cur_file ppf; - Env.report_error ppf err - | Cmi_format.Error err -> - Location.print_error_cur_file ppf; - Cmi_format.report_error ppf err - | Ctype.Tags(l, l') -> - Location.print_error_cur_file ppf; - fprintf ppf - "In this program,@ variant constructors@ `%s and `%s@ \ - have the same hash value." l l' - | Typecore.Error(loc, env, err) -> - Location.print_error ppf loc; Typecore.report_error env ppf err - | Typetexp.Error(loc, env, err) -> - Location.print_error ppf loc; Typetexp.report_error env ppf err - | Typedecl.Error(loc, err) -> - Location.print_error ppf loc; Typedecl.report_error ppf err - | Includemod.Error err -> - Location.print_error_cur_file ppf; - Includemod.report_error ppf err - | Typemod.Error(loc, env, err) -> - Location.print_error ppf loc; Typemod.report_error env ppf err - | Translcore.Error(loc, err) -> - Location.print_error ppf loc; Translcore.report_error ppf err - | Sys_error msg -> - Location.print_error_cur_file ppf; - fprintf ppf "I/O error: %s" msg - | Typeclass.Error(loc, env, err) -> - Location.print_error ppf loc; Typeclass.report_error env ppf err - | Translclass.Error(loc, err) -> - Location.print_error ppf loc; Translclass.report_error ppf err - | Warnings.Errors (n) -> - Location.print_error_cur_file ppf; - fprintf ppf "Some fatal warnings were triggered (%d occurrences)" n - | x -> - fprintf ppf "@]"; - fprintf ppf - "Compilation error(%s). Use the OCaml compiler to get more details." - (Printexc.to_string x) - in - Format.fprintf Format.err_formatter "@[%a@]@." report exn + match Location.error_of_exn exn with + | Some err -> + fprintf Format.err_formatter "@[%a@]@." Location.report_error err + | None -> + fprintf Format.err_formatter + "Compilation error(%s). Use the OCaml compiler to get more details.@." + (Printexc.to_string exn) (** Process the given file, according to its extension. Return the Module.t created, if any.*) let process_file ppf sourcefile = @@ -362,6 +330,7 @@ let rec remove_module_elements_between_stop keep eles = else f keep q | Odoc_module.Element_value _ + | Odoc_module.Element_type_extension _ | Odoc_module.Element_exception _ | Odoc_module.Element_type _ -> if keep then @@ -471,7 +440,7 @@ let analyse_files ?(init=[]) files = ); if !Odoc_global.sort_modules then - Sort.list (fun m1 -> fun m2 -> m1.Odoc_module.m_name < m2.Odoc_module.m_name) merged_modules + List.sort (fun m1 m2 -> compare m1.Odoc_module.m_name m2.Odoc_module.m_name) merged_modules else merged_modules diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index 039bbb48..358a71a5 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -25,6 +25,7 @@ module Name = Odoc_name open Odoc_parameter open Odoc_value open Odoc_type +open Odoc_extension open Odoc_exception open Odoc_class open Odoc_module @@ -48,8 +49,8 @@ module Typedtree_search = | T of string | C of string | CT of string + | X of string | E of string - | ER of string | P of string | IM of string @@ -64,26 +65,29 @@ module Typedtree_search = let add_to_hashes table table_values tt = match tt with - | Typedtree.Tstr_module (ident, _, _) -> - Hashtbl.add table (M (Name.from_ident ident)) tt + | Typedtree.Tstr_module mb -> + Hashtbl.add table (M (Name.from_ident mb.mb_id)) tt | Typedtree.Tstr_recmodule mods -> List.iter - (fun (ident,ident_loc, _, mod_expr) -> - Hashtbl.add table (M (Name.from_ident ident)) - (Typedtree.Tstr_module (ident,ident_loc, mod_expr)) + (fun mb -> + Hashtbl.add table (M (Name.from_ident mb.mb_id)) + (Typedtree.Tstr_module mb) ) mods - | Typedtree.Tstr_modtype (ident, _, _) -> - Hashtbl.add table (MT (Name.from_ident ident)) tt - | Typedtree.Tstr_exception (ident, _, _) -> - Hashtbl.add table (E (Name.from_ident ident)) tt - | Typedtree.Tstr_exn_rebind (ident, _, _, _) -> - Hashtbl.add table (ER (Name.from_ident ident)) tt + | Typedtree.Tstr_modtype mtd -> + Hashtbl.add table (MT (Name.from_ident mtd.mtd_id)) tt + | Typedtree.Tstr_typext te -> begin + match te.tyext_constructors with + [] -> assert false + | ext :: _ -> Hashtbl.add table (X (Name.from_ident ext.ext_id)) tt + end + | Typedtree.Tstr_exception ext -> + Hashtbl.add table (E (Name.from_ident ext.ext_id)) tt | Typedtree.Tstr_type ident_type_decl_list -> List.iter - (fun (id, id_loc, e) -> - Hashtbl.add table (T (Name.from_ident id)) - (Typedtree.Tstr_type [(id,id_loc,e)])) + (fun td -> + Hashtbl.add table (T (Name.from_ident td.typ_id)) + (Typedtree.Tstr_type [td])) ident_type_decl_list | Typedtree.Tstr_class info_list -> List.iter @@ -100,17 +104,18 @@ module Typedtree_search = info_list | Typedtree.Tstr_value (_, pat_exp_list) -> List.iter - (fun (pat,exp) -> + (fun {vb_pat=pat; vb_expr=exp} -> match iter_val_pattern pat.Typedtree.pat_desc with None -> () | Some n -> Hashtbl.add table_values n (pat,exp) ) pat_exp_list - | Typedtree.Tstr_primitive (ident, _, _) -> - Hashtbl.add table (P (Name.from_ident ident)) tt + | Typedtree.Tstr_primitive vd -> + Hashtbl.add table (P (Name.from_ident vd.val_id)) tt | Typedtree.Tstr_open _ -> () | Typedtree.Tstr_include _ -> () | Typedtree.Tstr_eval _ -> () + | Typedtree.Tstr_attribute _ -> () let tables typedtree = let t = Hashtbl.create 13 in @@ -120,27 +125,27 @@ module Typedtree_search = let search_module table name = match Hashtbl.find table (M name) with - (Typedtree.Tstr_module (_, _, module_expr)) -> module_expr + (Typedtree.Tstr_module mb) -> mb.mb_expr | _ -> assert false let search_module_type table name = match Hashtbl.find table (MT name) with - | (Typedtree.Tstr_modtype (_, _, module_type)) -> module_type + | (Typedtree.Tstr_modtype mtd) -> mtd | _ -> assert false - let search_exception table name = - match Hashtbl.find table (E name) with - | (Typedtree.Tstr_exception (_, _, excep_decl)) -> excep_decl + let search_extension table name = + match Hashtbl.find table (X name) with + | (Typedtree.Tstr_typext tyext) -> tyext | _ -> assert false - let search_exception_rebind table name = - match Hashtbl.find table (ER name) with - | (Typedtree.Tstr_exn_rebind (_, _, p, _)) -> p + let search_exception table name = + match Hashtbl.find table (E name) with + | (Typedtree.Tstr_exception ext) -> ext | _ -> assert false let search_type_declaration table name = match Hashtbl.find table (T name) with - | (Typedtree.Tstr_type [(_,_, decl)]) -> decl + | (Typedtree.Tstr_type [td]) -> td | _ -> assert false let search_class_exp table name = @@ -166,14 +171,14 @@ module Typedtree_search = let search_primitive table name = match Hashtbl.find table (P name) with - Tstr_primitive (ident, _, val_desc) -> val_desc.val_val.Types.val_type + Tstr_primitive vd -> vd.val_val.Types.val_type | _ -> assert false let get_nth_inherit_class_expr cls n = let rec iter cpt = function | [] -> raise Not_found - | { cf_desc = Typedtree.Tcf_inher (_, clexp, _, _, _) } :: q -> + | { cf_desc = Typedtree.Tcf_inherit (_, clexp, _, _, _) } :: q -> if n = cpt then clexp else iter (cpt+1) q | _ :: q -> iter cpt q @@ -184,10 +189,10 @@ module Typedtree_search = let rec iter = function | [] -> raise Not_found - | { cf_desc = Typedtree.Tcf_val (_, _, _, ident, Tcfk_concrete exp, _) } :: q + | { cf_desc = Typedtree.Tcf_val (_, _, ident, Tcfk_concrete (_, exp), _) } :: q when Name.from_ident ident = name -> exp.Typedtree.exp_type - | { cf_desc = Typedtree.Tcf_val (_, _, _, ident, Tcfk_virtual typ, _) } :: q + | { cf_desc = Typedtree.Tcf_val (_, _, ident, Tcfk_virtual typ, _) } :: q when Name.from_ident ident = name -> typ.Typedtree.ctyp_type | _ :: q -> @@ -199,7 +204,7 @@ module Typedtree_search = let rec iter = function Types.Cty_constr (_, _, cty) -> iter cty | Types.Cty_signature s -> s - | Types.Cty_fun (_,_, cty) -> iter cty + | Types.Cty_arrow (_,_, cty) -> iter cty in fun ct_decl -> iter ct_decl.Types.clty_type @@ -207,7 +212,7 @@ module Typedtree_search = let rec iter = function | [] -> raise Not_found - | { cf_desc = Typedtree.Tcf_meth (label, _, _, Tcfk_concrete exp, _) } :: q when label = name -> + | { cf_desc = Typedtree.Tcf_method (label, _, Tcfk_concrete (_, exp)) } :: q when label.txt = name -> exp | _ :: q -> iter q @@ -265,7 +270,7 @@ module Analyser = (List.map iter_pattern patlist, Odoc_env.subst_type env pat.pat_type) - | Typedtree.Tpat_construct (_, cons_desc, _, _) when + | Typedtree.Tpat_construct (_, cons_desc, _) when (* we give a name to the parameter only if it unit *) (match cons_desc.cstr_res.desc with Tconstr (p, _, _) -> @@ -296,13 +301,13 @@ module Analyser = (* This case means we have a 'function' without pattern, that's impossible *) raise (Failure "tt_analyse_function_parameters: 'function' without pattern") - | (pattern_param, exp) :: second_ele :: q -> + | {c_lhs=pattern_param} :: second_ele :: q -> (* implicit pattern matching -> anonymous parameter and no more parameter *) (* A VOIR : le label ? *) let parameter = Odoc_parameter.Tuple ([], Odoc_env.subst_type env pattern_param.pat_type) in [ parameter ] - | (pattern_param, func_body) :: [] -> + | {c_lhs=pattern_param; c_rhs=func_body} :: [] -> let parameter = tt_param_info_from_pattern env @@ -319,7 +324,8 @@ module Analyser = ( ( match func_body.exp_desc with - Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var (id, _) } , exp) :: _, func_body2) -> + Typedtree.Texp_let (_, {vb_pat={pat_desc = Typedtree.Tpat_var (id, _) }; + vb_expr=exp} :: _, func_body2) -> let name = Name.from_ident id in let new_param = Simple_name { sn_name = name ; @@ -450,7 +456,7 @@ module Analyser = [] -> (* cas impossible, on l'a filtre avant *) assert false - | (pattern_param, exp) :: second_ele :: q -> + | {c_lhs=pattern_param} :: second_ele :: q -> (* implicit pattern matching -> anonymous parameter *) (* Note : We can't match this pattern if it is the first call to the function. *) let new_param = Simple_name @@ -459,7 +465,7 @@ module Analyser = in [ new_param ] - | (pattern_param, body) :: [] -> + | {c_lhs=pattern_param; c_rhs=body} :: [] -> (* if this is the first call to the function, this is the first parameter and we skip it *) if not first then ( @@ -478,7 +484,8 @@ module Analyser = ( ( match body.exp_desc with - Typedtree.Texp_let (_, ({pat_desc = Typedtree.Tpat_var (id, _) } , exp) :: _, body2) -> + Typedtree.Texp_let (_, {vb_pat={pat_desc = Typedtree.Tpat_var (id, _) }; + vb_expr=exp} :: _, body2) -> let name = Name.from_ident id in let new_param = Simple_name { sn_name = name ; @@ -527,7 +534,7 @@ module Analyser = | item :: q -> let loc = item.Parsetree.pcf_loc in match item.Parsetree.pcf_desc with - | (Parsetree.Pcf_inher (_, p_clexp, _)) -> + | (Parsetree.Pcf_inherit (_, p_clexp, _)) -> let tt_clexp = let n = List.length acc_inher in try Typedtree_search.get_nth_inherit_class_expr tt_cls n @@ -554,9 +561,8 @@ module Analyser = p_clexp.Parsetree.pcl_loc.Location.loc_end.Lexing.pos_cnum q - | ((Parsetree.Pcf_val ({ txt = label }, mutable_flag, _, _) | - Parsetree.Pcf_valvirt ({ txt = label }, mutable_flag, _) ) as x) -> - let virt = match x with Parsetree.Pcf_val _ -> false | _ -> true in + | Parsetree.Pcf_val ({ txt = label }, mutable_flag, k) -> + let virt = match k with Parsetree.Cfk_virtual _ -> true | Parsetree.Cfk_concrete _ -> false in let complete_name = Name.concat current_class_name label in let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start.Lexing.pos_cnum in let type_exp = @@ -587,7 +593,7 @@ module Analyser = in iter acc_inher (acc_fields @ ele_comments @ [ Class_attribute att ]) loc.Location.loc_end.Lexing.pos_cnum q - | (Parsetree.Pcf_virt ({ txt = label }, private_flag, _)) -> + | (Parsetree.Pcf_method ({ txt = label }, private_flag, Parsetree.Cfk_virtual _)) -> let complete_name = Name.concat current_class_name label in let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start.Lexing.pos_cnum in let met_type = @@ -629,7 +635,7 @@ module Analyser = iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end.Lexing.pos_cnum q - | (Parsetree.Pcf_meth ({ txt = label }, private_flag, _, _)) -> + | (Parsetree.Pcf_method ({ txt = label }, private_flag, Parsetree.Cfk_concrete _)) -> let complete_name = Name.concat current_class_name label in let (info_opt, ele_comments) = get_comments_in_class last_pos loc.Location.loc_start.Lexing.pos_cnum in let exp = @@ -670,12 +676,17 @@ module Analyser = iter acc_inher (acc_fields @ ele_comments @ [ Class_method met ]) loc.Location.loc_end.Lexing.pos_cnum q - | Parsetree.Pcf_constr (_, _) -> + | Parsetree.Pcf_constraint (_, _) -> (* don't give a $*%@ ! *) iter acc_inher acc_fields loc.Location.loc_end.Lexing.pos_cnum q - | (Parsetree.Pcf_init exp) -> + | (Parsetree.Pcf_initializer exp) -> iter acc_inher acc_fields exp.Parsetree.pexp_loc.Location.loc_end.Lexing.pos_cnum q + + | Parsetree.Pcf_attribute _ -> + iter acc_inher acc_fields loc.Location.loc_end.Lexing.pos_cnum q + + | Parsetree.Pcf_extension _ -> assert false in iter [] [] last_pos (p_cls.Parsetree.pcstr_fields) @@ -739,7 +750,8 @@ module Analyser = ( (* there must be a Tcl_let just after *) match tt_class_expr2.Typedtree.cl_desc with - Typedtree.Tcl_let (_, ({pat_desc = Typedtree.Tpat_var (id,_) } , exp) :: _, _, tt_class_expr3) -> + Typedtree.Tcl_let (_, {vb_pat={pat_desc = Typedtree.Tpat_var (id,_) }; + vb_expr=exp} :: _, _, tt_class_expr3) -> let name = Name.from_ident id in let new_param = Simple_name { sn_name = name ; @@ -885,10 +897,10 @@ module Analyser = let tt_get_included_module_list tt_structure = let f acc item = match item.str_desc with - Typedtree.Tstr_include (mod_expr, _) -> + Typedtree.Tstr_include incl -> acc @ [ { (* A VOIR : chercher dans les modules et les module types, avec quel env ? *) - im_name = tt_name_from_module_expr mod_expr ; + im_name = tt_name_from_module_expr incl.incl_mod ; im_module = None ; im_info = None ; } @@ -939,18 +951,18 @@ module Analyser = let f = match ele with Element_module m -> (function - Types.Sig_module (ident,t,_) -> + Types.Sig_module (ident,md,_) -> let n1 = Name.simple m.m_name and n2 = Ident.name ident in ( match n1 = n2 with - true -> filter_module_with_module_type_constraint m t; true + true -> filter_module_with_module_type_constraint m md.md_type; true | false -> false ) | _ -> false) | Element_module_type mt -> (function - Types.Sig_modtype (ident,Types.Modtype_manifest t) -> + Types.Sig_modtype (ident,{Types.mtd_type=Some t}) -> let n1 = Name.simple mt.mt_name and n2 = Ident.name ident in ( @@ -974,9 +986,17 @@ module Analyser = and n2 = Ident.name ident in n1 = n2 | _ -> false) + | Element_type_extension te -> + let l = + filter_extension_constructors_with_module_type_constraint + te.te_constructors lsig + in + te.te_constructors <- l; + if l <> [] then (fun _ -> true) + else (fun _ -> false) | Element_exception e -> (function - Types.Sig_exception (ident,_) -> + Types.Sig_typext (ident,_,_) -> let n1 = Name.simple e.ex_name and n2 = Ident.name ident in n1 = n2 @@ -1002,6 +1022,19 @@ module Analyser = in List.filter pred l + and filter_extension_constructors_with_module_type_constraint l lsig = + let pred xt = + List.exists + (function + Types.Sig_typext (ident, _, _) -> + let n1 = Name.simple xt.xt_name + and n2 = Ident.name ident in + n1 = n2 + | _ -> false) + lsig + in + List.filter pred l + (** Analysis of a parse tree structure with a typed tree, to return module elements.*) let rec analyse_structure env current_module_name last_pos pos_limit parsetree typedtree = print_DEBUG "Odoc_ast:analyse_struture"; @@ -1054,6 +1087,9 @@ module Analyser = Parsetree.Pstr_eval _ -> (* don't care *) (0, env, []) + | Parsetree.Pstr_attribute _ + | Parsetree.Pstr_extension _ -> + (0, env, []) | Parsetree.Pstr_value (rec_flag, pat_exp_list) -> (* of rec_flag * (pattern * expression) list *) (* For each value, look for the value name, then look in the @@ -1070,7 +1106,7 @@ module Analyser = match p_e_list with [] -> (acc_env, acc) - | (pat, exp) :: q -> + | {Parsetree.pvb_pat=pat; pvb_expr=exp} :: q -> let value_name_opt = iter_pat pat.Parsetree.ppat_desc in let new_last_pos = exp.Parsetree.pexp_loc.Location.loc_end.Lexing.pos_cnum in match value_name_opt with @@ -1116,7 +1152,8 @@ module Analyser = let (new_env, l_ele) = iter ~first: true loc.Location.loc_start.Lexing.pos_cnum env [] pat_exp_list in (0, new_env, l_ele) - | Parsetree.Pstr_primitive ({ txt = name_pre }, val_desc) -> + | Parsetree.Pstr_primitive val_desc -> + let name_pre = val_desc.Parsetree.pval_name.txt in (* of string * value_description *) print_DEBUG ("Parsetree.Pstr_primitive ("^name_pre^", ["^(String.concat ", " val_desc.Parsetree.pval_prim)^"]"); let typ = Typedtree_search.search_primitive table name_pre in @@ -1147,7 +1184,7 @@ module Analyser = (* we start by extending the environment *) let new_env = List.fold_left - (fun acc_env -> fun ({ txt = name }, _) -> + (fun acc_env {Parsetree.ptype_name = { txt = name }} -> let complete_name = Name.concat current_module_name name in Odoc_env.add_type acc_env complete_name ) @@ -1157,7 +1194,8 @@ module Analyser = let rec f ?(first=false) maybe_more_acc last_pos name_type_decl_list = match name_type_decl_list with [] -> (maybe_more_acc, []) - | ({ txt = name }, type_decl) :: q -> + | type_decl :: q -> + let name = type_decl.Parsetree.ptype_name.txt in let complete_name = Name.concat current_module_name name in let loc = type_decl.Parsetree.ptype_loc in let loc_start = loc.Location.loc_start.Lexing.pos_cnum in @@ -1165,13 +1203,10 @@ module Analyser = let pos_limit2 = match q with [] -> pos_limit - | (_, td) :: _ -> td.Parsetree.ptype_loc.Location.loc_start.Lexing.pos_cnum + | td :: _ -> td.Parsetree.ptype_loc.Location.loc_start.Lexing.pos_cnum in let (maybe_more, name_comment_list) = - Sig.name_comment_from_type_kind - loc_end - pos_limit2 - type_decl.Parsetree.ptype_kind + Sig.name_comment_from_type_decl loc_end pos_limit2 type_decl in let tt_type_decl = try Typedtree_search.search_type_declaration table name @@ -1205,7 +1240,8 @@ module Analyser = ty_manifest = (match tt_type_decl.Types.type_manifest with None -> None - | Some t -> Some (Odoc_env.subst_type new_env t)); + | Some t -> + Some (Sig.manifest_structure new_env name_comment_list t)); ty_loc = { loc_impl = Some loc ; loc_inter = None } ; ty_code = ( @@ -1228,62 +1264,154 @@ module Analyser = let (maybe_more, eles) = f ~first: true 0 loc.Location.loc_start.Lexing.pos_cnum name_typedecl_list in (maybe_more, new_env, eles) - | Parsetree.Pstr_exception (name, excep_decl) -> - (* a new exception is defined *) - let complete_name = Name.concat current_module_name name.txt in - (* we get the exception declaration in the typed tree *) - let tt_excep_decl = - try Typedtree_search.search_exception table name.txt - with Not_found -> - raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name)) + | Parsetree.Pstr_typext tyext -> + (* we get the extension declaration in the typed tree *) + let tt_tyext = + match tyext.Parsetree.ptyext_constructors with + [] -> assert false + | ext :: _ -> + try + Typedtree_search.search_extension table ext.Parsetree.pext_name.txt + with Not_found -> + raise (Failure + (Odoc_messages.extension_not_found_in_typedtree + (Name.concat current_module_name ext.Parsetree.pext_name.txt))) + in + let new_env = + List.fold_left + (fun acc_env -> fun {Parsetree.pext_name = { txt = name }} -> + let complete_name = Name.concat current_module_name name in + Odoc_env.add_extension acc_env complete_name + ) + env + tyext.Parsetree.ptyext_constructors in - let new_env = Odoc_env.add_exception env complete_name in let loc_start = loc.Location.loc_start.Lexing.pos_cnum in let loc_end = loc.Location.loc_end.Lexing.pos_cnum in - let new_ex = + let new_te = { - ex_name = complete_name ; - ex_info = comment_opt ; - ex_args = List.map (fun ctyp -> - Odoc_env.subst_type new_env ctyp.ctyp_type) - tt_excep_decl.exn_params ; - ex_alias = None ; - ex_loc = { loc_impl = Some loc ; loc_inter = None } ; - ex_code = + te_info = comment_opt; + te_type_name = + Odoc_env.full_type_name new_env (Name.from_path tt_tyext.tyext_path); + te_type_parameters = + List.map (fun (ctyp, _) -> Odoc_env.subst_type new_env ctyp.ctyp_type) tt_tyext.tyext_params; + te_private = tt_tyext.tyext_private; + te_constructors = []; + te_loc = { loc_impl = Some loc ; loc_inter = None } ; + te_code = ( - if !Odoc_global.keep_code then - Some (get_string_of_file loc_start loc_end) - else - None + if !Odoc_global.keep_code then + Some (get_string_of_file loc_start loc_end) + else + None ) ; } in - (0, new_env, [ Element_exception new_ex ]) + let rec analyse_extension_constructors maybe_more exts_acc tt_ext_list = + match tt_ext_list with + [] -> (maybe_more, List.rev exts_acc) + | tt_ext :: q -> + let complete_name = Name.concat current_module_name tt_ext.ext_name.txt in + let ext_loc_end = tt_ext.ext_loc.Location.loc_end.Lexing.pos_cnum in + let new_xt = + match tt_ext.ext_kind with + Text_decl(args, ret_type) -> + { + xt_name = complete_name; + xt_args = + List.map (fun ctyp -> Odoc_env.subst_type new_env ctyp.ctyp_type) args; + xt_ret = + may_map (fun ctyp -> Odoc_env.subst_type new_env ctyp.ctyp_type) ret_type; + xt_type_extension = new_te; + xt_alias = None; + xt_loc = { loc_impl = Some tt_ext.ext_loc ; loc_inter = None } ; + xt_text = None; + } + | Text_rebind(path, _) -> + { + xt_name = complete_name; + xt_args = []; + xt_ret = None; + xt_type_extension = new_te; + xt_alias = + Some { + xa_name = Odoc_env.full_extension_constructor_name env (Name.from_path path); + xa_xt = None; + }; + xt_loc = { loc_impl = Some tt_ext.ext_loc ; loc_inter = None } ; + xt_text = None; + } + in + let pos_limit2 = + match q with + [] -> pos_limit + | next :: _ -> + next.ext_loc.Location.loc_start.Lexing.pos_cnum + in + let s = get_string_of_file ext_loc_end pos_limit2 in + let (maybe_more, comment_opt) = My_ir.just_after_special !file_name s in + new_xt.xt_text <- comment_opt; + analyse_extension_constructors maybe_more (new_xt :: exts_acc) q + in + let (maybe_more, exts) = analyse_extension_constructors 0 [] tt_tyext.tyext_constructors in + new_te.te_constructors <- exts; + (maybe_more, new_env, [ Element_type_extension new_te ]) - | Parsetree.Pstr_exn_rebind (name, _) -> + | Parsetree.Pstr_exception ext -> + let name = ext.Parsetree.pext_name in (* a new exception is defined *) let complete_name = Name.concat current_module_name name.txt in - (* we get the exception rebind in the typed tree *) - let tt_path = - try Typedtree_search.search_exception_rebind table name.txt + (* we get the exception declaration in the typed tree *) + let tt_ext = + try Typedtree_search.search_exception table name.txt with Not_found -> raise (Failure (Odoc_messages.exception_not_found_in_typedtree complete_name)) in - let new_env = Odoc_env.add_exception env complete_name in - let new_ex = - { - ex_name = complete_name ; - ex_info = comment_opt ; - ex_args = [] ; - ex_alias = Some { ea_name = (Odoc_env.full_exception_name env (Name.from_path tt_path)) ; - ea_ex = None ; } ; - ex_loc = { loc_impl = Some loc ; loc_inter = None } ; - ex_code = None ; - } + let new_env = Odoc_env.add_extension env complete_name in + let new_ext = + match tt_ext.ext_kind with + Text_decl(tt_args, tt_ret_type) -> + let loc_start = loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = loc.Location.loc_end.Lexing.pos_cnum in + { + ex_name = complete_name ; + ex_info = comment_opt ; + ex_args = + List.map + (fun ctyp -> Odoc_env.subst_type new_env ctyp.ctyp_type) + tt_args; + ex_ret = + Misc.may_map + (fun ctyp -> Odoc_env.subst_type new_env ctyp.ctyp_type) + tt_ret_type; + ex_alias = None ; + ex_loc = { loc_impl = Some loc ; loc_inter = None } ; + ex_code = + ( + if !Odoc_global.keep_code then + Some (get_string_of_file loc_start loc_end) + else + None + ) ; + } + | Text_rebind(tt_path, _) -> + { + ex_name = complete_name ; + ex_info = comment_opt ; + ex_args = [] ; + ex_ret = None ; + ex_alias = + Some { ea_name = + Odoc_env.full_extension_constructor_name + env (Name.from_path tt_path) ; + ea_ex = None ; } ; + ex_loc = { loc_impl = Some loc ; loc_inter = None } ; + ex_code = None ; + } in - (0, new_env, [ Element_exception new_ex ]) + (0, new_env, [ Element_exception new_ext ]) - | Parsetree.Pstr_module (name, module_expr) -> + | Parsetree.Pstr_module {Parsetree.pmb_name=name; pmb_expr=module_expr} -> ( (* of string * module_expr *) try @@ -1330,7 +1458,7 @@ module Analyser = dans les contraintes sur les modules *) let new_env = List.fold_left - (fun acc_env (name, _, mod_exp) -> + (fun acc_env {Parsetree.pmb_name=name;pmb_expr=mod_exp} -> let complete_name = Name.concat current_module_name name.txt in let e = Odoc_env.add_module acc_env complete_name in let tt_mod_exp = @@ -1358,7 +1486,7 @@ module Analyser = let rec f ?(first=false) last_pos name_mod_exp_list = match name_mod_exp_list with [] -> [] - | (name, _, mod_exp) :: q -> + | {Parsetree.pmb_name=name;pmb_expr=mod_exp} :: q -> let complete_name = Name.concat current_module_name name.txt in let loc_start = mod_exp.Parsetree.pmod_loc.Location.loc_start.Lexing.pos_cnum in let loc_end = mod_exp.Parsetree.pmod_loc.Location.loc_end.Lexing.pos_cnum in @@ -1386,39 +1514,44 @@ module Analyser = let eles = f ~first: true loc.Location.loc_start.Lexing.pos_cnum mods in (0, new_env, eles) - | Parsetree.Pstr_modtype (name, modtype) -> + | Parsetree.Pstr_modtype {Parsetree.pmtd_name=name; pmtd_type=modtype} -> let complete_name = Name.concat current_module_name name.txt in let tt_module_type = try Typedtree_search.search_module_type table name.txt with Not_found -> raise (Failure (Odoc_messages.module_type_not_found_in_typedtree complete_name)) in - let kind = Sig.analyse_module_type_kind env complete_name - modtype tt_module_type.mty_type + let kind, sig_mtype = + match modtype, tt_module_type.mtd_type with + | Some modtype, Some mty_type -> + Some (Sig.analyse_module_type_kind env complete_name + modtype mty_type.mty_type), + Some mty_type.mty_type + | _ -> None, None in let mt = { mt_name = complete_name ; mt_info = comment_opt ; - mt_type = Some tt_module_type.mty_type ; + mt_type = sig_mtype ; mt_is_interface = false ; mt_file = !file_name ; - mt_kind = Some kind ; + mt_kind = kind ; mt_loc = { loc_impl = Some loc ; loc_inter = None } ; } in let new_env = Odoc_env.add_module_type env mt.mt_name in let new_env2 = - match tt_module_type.mty_type with + match sig_mtype with (* A VOIR : cela peut-il etre Tmty_ident ? dans ce cas, on n'aurait pas la signature *) - Types.Mty_signature s -> + Some (Types.Mty_signature s) -> Odoc_env.add_signature new_env mt.mt_name ~rel: (Name.simple mt.mt_name) s | _ -> new_env in (0, new_env2, [ Element_module_type mt ]) - | Parsetree.Pstr_open (_, longident) -> + | Parsetree.Pstr_open _ -> (* A VOIR : enrichir l'environnement quand open ? *) let ele_comments = match comment_opt with None -> [] @@ -1528,7 +1661,7 @@ module Analyser = in (0, new_env, f ~first: true loc.Location.loc_start.Lexing.pos_cnum class_type_decl_list) - | Parsetree.Pstr_include module_expr -> + | Parsetree.Pstr_include incl -> (* we add a dummy included module which will be replaced by a correct one at the end of the module analysis, to use the Path.t of the included modules in the typdtree. *) @@ -1590,18 +1723,25 @@ module Analyser = | (Parsetree.Pmod_functor (_, pmodule_type, p_module_expr2), Typedtree.Tmod_functor (ident, _, mtyp, tt_module_expr2)) -> - let loc_start = pmodule_type.Parsetree.pmty_loc.Location.loc_start.Lexing.pos_cnum in - let loc_end = pmodule_type.Parsetree.pmty_loc.Location.loc_end.Lexing.pos_cnum in + let loc = match pmodule_type with None -> Location.none + | Some pmty -> pmty.Parsetree.pmty_loc in + let loc_start = loc.Location.loc_start.Lexing.pos_cnum in + let loc_end = loc.Location.loc_end.Lexing.pos_cnum in let mp_type_code = get_string_of_file loc_start loc_end in print_DEBUG (Printf.sprintf "mp_type_code=%s" mp_type_code); let mp_name = Name.from_ident ident in - let mp_kind = Sig.analyse_module_type_kind env - current_module_name pmodule_type mtyp.mty_type + let mp_kind = + match pmodule_type, mtyp with + Some pmty, Some mty -> + Sig.analyse_module_type_kind env current_module_name pmty + mty.mty_type + | _ -> Module_type_struct [] in let param = { mp_name = mp_name ; - mp_type = Odoc_env.subst_module_type env mtyp.mty_type ; + mp_type = Misc.may_map + (fun m -> Odoc_env.subst_module_type env m.mty_type) mtyp ; mp_type_code = mp_type_code ; mp_kind = mp_kind ; } diff --git a/ocamldoc/odoc_ast.mli b/ocamldoc/odoc_ast.mli index f1237f11..c3db304e 100644 --- a/ocamldoc/odoc_ast.mli +++ b/ocamldoc/odoc_ast.mli @@ -30,20 +30,15 @@ module Typedtree_search : @raise Not_found if the module was not found.*) val search_module : tab -> string -> Typedtree.module_expr - (** This function returns the [Types.module_type] associated to the given module type name, + (** This function returns the [Typedtree.module_type] associated to the given module type name, in the given table. @raise Not_found if the module type was not found.*) - val search_module_type : tab -> string -> Typedtree.module_type + val search_module_type : tab -> string -> Typedtree.module_type_declaration - (** This function returns the [Types.exception_declaration] associated to the given exception name, + (** This function returns the [Typedtree.type_extension] associated to the given extension name, in the given table. - @raise Not_found if the exception was not found.*) - val search_exception : tab -> string -> Typedtree.exception_declaration - - (** This function returns the [Path.t] associated to the given exception rebind name, - in the table. - @raise Not_found if the exception rebind was not found.*) - val search_exception_rebind : tab -> string -> Path.t + @raise Not_found if the extension was not found.*) + val search_extension : tab -> string -> Typedtree.type_extension (** This function returns the [Typedtree.type_declaration] associated to the given type name, in the given table. @@ -55,7 +50,7 @@ module Typedtree_search : @raise Not_found if the class was not found. *) val search_class_exp : tab -> string -> (Typedtree.class_expr * (Types.type_expr list)) - (** This function returns the [Types.cltype_declaration] associated to the given class type name, + (** This function returns the [Typedtree.class_type_declaration] associated to the given class type name, in the given table. @raise Not_found if the class type was not found. *) val search_class_type_declaration : tab -> string -> Typedtree.class_type_declaration diff --git a/ocamldoc/odoc_cross.ml b/ocamldoc/odoc_cross.ml index fcd60dc3..28e6ae5b 100644 --- a/ocamldoc/odoc_cross.ml +++ b/ocamldoc/odoc_cross.ml @@ -15,6 +15,7 @@ module Name = Odoc_name open Odoc_module open Odoc_class +open Odoc_extension open Odoc_exception open Odoc_types open Odoc_value @@ -60,6 +61,7 @@ module P_alias = let p_recfield _ _ _ = false let p_const _ _ _ = false let p_type t _ = (false, false) + let p_extension x _ = x.xt_alias <> None let p_exception e _ = e.ex_alias <> None let p_attribute a _ = false let p_method m _ = false @@ -79,6 +81,9 @@ let (module_aliases : (Name.t, Name.t * alias_state) Hashtbl.t) = Hashtbl.create (** Couples of module or module type name aliases. *) let module_and_modtype_aliases = Hashtbl.create 13;; +(** Couples of extension name aliases. *) +let extension_aliases = Hashtbl.create 13;; + (** Couples of exception name aliases. *) let exception_aliases = Hashtbl.create 13;; @@ -102,6 +107,15 @@ let rec build_alias_list = function | _ -> () ); build_alias_list q + | (Odoc_search.Res_extension x) :: q -> + ( + match x.xt_alias with + None -> () + | Some xa -> + Hashtbl.add extension_aliases + x.xt_name (xa.xa_name,Alias_to_resolve) + ); + build_alias_list q | (Odoc_search.Res_exception e) :: q -> ( match e.ex_alias with @@ -119,6 +133,7 @@ let rec build_alias_list = function let get_alias_names module_list = Hashtbl.clear module_aliases; Hashtbl.clear module_and_modtype_aliases; + Hashtbl.clear extension_aliases; Hashtbl.clear exception_aliases; build_alias_list (Search_alias.search module_list 0) @@ -183,6 +198,7 @@ let kind_name_exists kind = | RK_class_type -> (fun e -> match e with Odoc_search.Res_class_type _ -> true | _ -> false) | RK_value -> (fun e -> match e with Odoc_search.Res_value _ -> true | _ -> false) | RK_type -> (fun e -> match e with Odoc_search.Res_type _ -> true | _ -> false) + | RK_extension -> (fun e -> match e with Odoc_search.Res_extension _ -> true | _ -> false) | RK_exception -> (fun e -> match e with Odoc_search.Res_exception _ -> true | _ -> false) | RK_attribute -> (fun e -> match e with Odoc_search.Res_attribute _ -> true | _ -> false) | RK_method -> (fun e -> match e with Odoc_search.Res_method _ -> true | _ -> false) @@ -200,6 +216,7 @@ let class_exists = kind_name_exists RK_class let class_type_exists = kind_name_exists RK_class_type let value_exists = kind_name_exists RK_value let type_exists = kind_name_exists RK_type +let extension_exists = kind_name_exists RK_extension let exception_exists = kind_name_exists RK_exception let attribute_exists = kind_name_exists RK_attribute let method_exists = kind_name_exists RK_method @@ -238,6 +255,14 @@ let lookup_class_type name = | Odoc_search.Res_class_type c -> c | _ -> assert false +let lookup_extension name = + match List.find + (fun k -> match k with Odoc_search.Res_extension _ -> true | _ -> false) + (get_known_elements name) + with + | Odoc_search.Res_extension x -> x + | _ -> assert false + let lookup_exception name = match List.find (fun k -> match k with Odoc_search.Res_exception _ -> true | _ -> false) @@ -262,6 +287,8 @@ class scan = method! scan_type_pre t = add_known_element t.ty_name (Odoc_search.Res_type t); true + method! scan_extension_constructor x = + add_known_element x.xt_name (Odoc_search.Res_extension x) method! scan_exception e = add_known_element e.ex_name (Odoc_search.Res_exception e) method! scan_attribute a = @@ -298,6 +325,7 @@ type not_found_name = | NF_c of Name.t | NF_ct of Name.t | NF_cct of Name.t + | NF_xt of Name.t | NF_ex of Name.t (** Functions to find and associate aliases elements. *) @@ -466,6 +494,7 @@ and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_ | Element_class cl -> associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) cl | Element_class_type ct -> associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) ct | Element_value _ -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) + | Element_type_extension te -> associate_in_type_extension module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) te | Element_exception ex -> ( match ex.ex_alias with @@ -617,6 +646,29 @@ and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_ in iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) ct.clt_kind +and associate_in_type_extension module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) te = + List.fold_left + (fun (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) xt -> + match xt.xt_alias with + None -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) + | Some xa -> + match xa.xa_xt with + Some _ -> + (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) + | None -> + let xt_opt = + try Some (lookup_extension xa.xa_name) + with Not_found -> None + in + match xt_opt with + None -> (acc_b_modif, (Name.head xt.xt_name) :: acc_incomplete_top_module_names, (NF_xt xa.xa_name) :: acc_names_not_found) + | Some x -> + xa.xa_xt <- Some x ; + (true, acc_incomplete_top_module_names, acc_names_not_found)) + (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) + te.te_constructors + + (*************************************************************) (** Association of types to elements referenced in comments .*) @@ -630,6 +682,7 @@ let not_found_of_kind kind name = | RK_class_type -> Odoc_messages.cross_class_type_not_found | RK_value -> Odoc_messages.cross_value_not_found | RK_type -> Odoc_messages.cross_type_not_found + | RK_extension -> Odoc_messages.cross_extension_not_found | RK_exception -> Odoc_messages.cross_exception_not_found | RK_attribute -> Odoc_messages.cross_attribute_not_found | RK_method -> Odoc_messages.cross_method_not_found @@ -687,6 +740,7 @@ let rec assoc_comments_text_elements parent_name module_list t_ele = | Odoc_search.Res_class_type ct -> (ct.clt_name, RK_class_type) | Odoc_search.Res_value v -> (v.val_name, RK_value) | Odoc_search.Res_type t -> (t.ty_name, RK_type) + | Odoc_search.Res_extension x -> (x.xt_name, RK_extension) | Odoc_search.Res_exception e -> (e.ex_name, RK_exception) | Odoc_search.Res_attribute a -> (a.att_value.val_name, RK_attribute) | Odoc_search.Res_method m -> (m.met_value.val_name, RK_method) @@ -747,6 +801,7 @@ let rec assoc_comments_text_elements parent_name module_list t_ele = | RK_class_type -> class_type_exists | RK_value -> value_exists | RK_type -> type_exists + | RK_extension -> extension_exists | RK_exception -> exception_exists | RK_attribute -> attribute_exists | RK_method -> method_exists @@ -817,6 +872,8 @@ let rec assoc_comments_module_element parent_name module_list m_ele = Element_class_type (assoc_comments_class_type module_list ct) | Element_value v -> Element_value (assoc_comments_value module_list v) + | Element_type_extension te -> + Element_type_extension (assoc_comments_type_extension parent_name module_list te) | Element_exception e -> Element_exception (assoc_comments_exception module_list e) | Element_type t -> @@ -938,6 +995,15 @@ and assoc_comments_value module_list v = assoc_comments_parameter_list parent module_list v.val_parameters; v +and assoc_comments_extension_constructor module_list x = + let parent = Name.father x.xt_name in + x.xt_text <- ao (assoc_comments_info parent module_list) x.xt_text + +and assoc_comments_type_extension parent_name module_list te = + te.te_info <- ao (assoc_comments_info parent_name module_list) te.te_info; + List.iter (assoc_comments_extension_constructor module_list) te.te_constructors; + te + and assoc_comments_exception module_list e = let parent = Name.father e.ex_name in e.ex_info <- ao (assoc_comments_info parent module_list) e.ex_info ; @@ -950,12 +1016,13 @@ and assoc_comments_type module_list t = Type_abstract -> () | Type_variant vl -> List.iter - (fun vc -> vc.vc_text <- ao (assoc_comments_text parent module_list) vc.vc_text) + (fun vc -> vc.vc_text <- ao (assoc_comments_info parent module_list) vc.vc_text) vl | Type_record fl -> List.iter - (fun rf -> rf.rf_text <- ao (assoc_comments_text parent module_list) rf.rf_text) + (fun rf -> rf.rf_text <- ao (assoc_comments_info parent module_list) rf.rf_text) fl + | Type_open -> () ); t @@ -1018,6 +1085,7 @@ let associate module_list = | NF_c n -> Odoc_messages.cross_class_not_found n | NF_ct n -> Odoc_messages.cross_class_type_not_found n | NF_cct n -> Odoc_messages.cross_class_or_class_type_not_found n + | NF_xt n -> Odoc_messages.cross_extension_not_found n | NF_ex n -> Odoc_messages.cross_exception_not_found n ); ) diff --git a/ocamldoc/odoc_dag2html.ml b/ocamldoc/odoc_dag2html.ml index 44a0aa9c..74119e6e 100644 --- a/ocamldoc/odoc_dag2html.ml +++ b/ocamldoc/odoc_dag2html.ml @@ -387,10 +387,10 @@ let group_by_common_children d list = let copy_data d = {elem = d.elem; span = d.span};; let insert_columns t nb j = - let t1 = Array.create (Array.length t.table) [| |] in + let t1 = Array.make (Array.length t.table) [| |] in for i = 0 to Array.length t.table - 1 do let line = t.table.(i) in - let line1 = Array.create (Array.length line + nb) line.(0) in + let line1 = Array.make (Array.length line + nb) line.(0) in t1.(i) <- line1; let rec loop k = if k = Array.length line then () diff --git a/ocamldoc/odoc_dep.ml b/ocamldoc/odoc_dep.ml index f2934ee3..c2949d73 100644 --- a/ocamldoc/odoc_dep.ml +++ b/ocamldoc/odoc_dep.ml @@ -167,11 +167,19 @@ let type_deps t = ignore (Str.global_substitute re f s) ) rl + | T.Type_open -> () ); (match t.T.ty_manifest with None -> () - | Some e -> + | Some (T.Object_type fields) -> + List.iter + (fun r -> + let s = Odoc_print.string_of_type_expr r.T.of_type in + ignore (Str.global_substitute re f s) + ) + fields + | Some (T.Other e) -> let s = Odoc_print.string_of_type_expr e in ignore (Str.global_substitute re f s) ); diff --git a/ocamldoc/odoc_env.ml b/ocamldoc/odoc_env.ml index f4d1b7ce..3e059058 100644 --- a/ocamldoc/odoc_env.ml +++ b/ocamldoc/odoc_env.ml @@ -26,7 +26,7 @@ type env = { env_classes : env_element list ; env_modules : env_element list ; env_module_types : env_element list ; - env_exceptions : env_element list ; + env_extensions : env_element list ; } let empty = { @@ -36,7 +36,7 @@ let empty = { env_classes = [] ; env_modules = [] ; env_module_types = [] ; - env_exceptions = [] ; + env_extensions = [] ; } (** Add a signature to an environment. *) @@ -52,20 +52,20 @@ let rec add_signature env root ?rel signat = match item with Types.Sig_value (ident, _) -> { env with env_values = (rel_name ident, qualify ident) :: env.env_values } | Types.Sig_type (ident,_,_) -> { env with env_types = (rel_name ident, qualify ident) :: env.env_types } - | Types.Sig_exception (ident, _) -> { env with env_exceptions = (rel_name ident, qualify ident) :: env.env_exceptions } - | Types.Sig_module (ident, modtype, _) -> + | Types.Sig_typext (ident, _, _) -> { env with env_extensions = (rel_name ident, qualify ident) :: env.env_extensions } + | Types.Sig_module (ident, md, _) -> let env2 = - match modtype with (* A VOIR : le cas ou c'est un identificateur, dans ce cas on n'a pas de signature *) + match md.Types.md_type with (* A VOIR : le cas ou c'est un identificateur, dans ce cas on n'a pas de signature *) Types.Mty_signature s -> add_signature env (qualify ident) ~rel: (rel_name ident) s | _ -> env in { env2 with env_modules = (rel_name ident, qualify ident) :: env2.env_modules } | Types.Sig_modtype (ident, modtype_decl) -> let env2 = - match modtype_decl with - Types.Modtype_abstract -> + match modtype_decl.Types.mtd_type with + None -> env - | Types.Modtype_manifest modtype -> + | Some modtype -> match modtype with (* A VOIR : le cas ou c'est un identificateur, dans ce cas on n'a pas de signature *) Types.Mty_signature s -> add_signature env (qualify ident) ~rel: (rel_name ident) s @@ -77,9 +77,9 @@ let rec add_signature env root ?rel signat = in List.fold_left f env signat -let add_exception env full_name = +let add_extension env full_name = let simple_name = Name.simple full_name in - { env with env_exceptions = (simple_name, full_name) :: env.env_exceptions } + { env with env_extensions = (simple_name, full_name) :: env.env_extensions } let add_type env full_name = let simple_name = Name.simple full_name in @@ -146,11 +146,11 @@ let full_value_name env n = try List.assoc n env.env_values with Not_found -> n -let full_exception_name env n = - try List.assoc n env.env_exceptions +let full_extension_constructor_name env n = + try List.assoc n env.env_extensions with Not_found -> - print_DEBUG ("Exception "^n^" not found with env="); - List.iter (fun (sn, fn) -> print_DEBUG ("("^sn^", "^fn^")")) env.env_exceptions; + print_DEBUG ("Extension "^n^" not found with env="); + List.iter (fun (sn, fn) -> print_DEBUG ("("^sn^", "^fn^")")) env.env_extensions; n let full_class_name env n = @@ -220,10 +220,11 @@ let subst_module_type env t = Types.Mty_ident p -> let new_p = Odoc_name.to_path (full_module_type_name env (Odoc_name.from_path p)) in Types.Mty_ident new_p + | Types.Mty_alias _ | Types.Mty_signature _ -> t | Types.Mty_functor (id, mt1, mt2) -> - Types.Mty_functor (id, iter mt1, iter mt2) + Types.Mty_functor (id, Misc.may_map iter mt1, iter mt2) in iter t @@ -238,9 +239,9 @@ let subst_class_type env t = | Types.Cty_signature cs -> (* on ne s'occupe pas des vals et methods *) t - | Types.Cty_fun (l, texp, ct) -> + | Types.Cty_arrow (l, texp, ct) -> let new_texp = subst_type env texp in let new_ct = iter ct in - Types.Cty_fun (l, new_texp, new_ct) + Types.Cty_arrow (l, new_texp, new_ct) in iter t diff --git a/ocamldoc/odoc_env.mli b/ocamldoc/odoc_env.mli index cafdd52e..4e1e8606 100644 --- a/ocamldoc/odoc_env.mli +++ b/ocamldoc/odoc_env.mli @@ -22,7 +22,7 @@ val empty : env (** Extending an environment *) val add_signature : env -> string -> ?rel:string -> Types.signature -> env -val add_exception : env -> Odoc_name.t -> env +val add_extension : env -> Odoc_name.t -> env val add_type : env -> Odoc_name.t -> env val add_value : env -> Odoc_name.t -> env val add_module : env -> Odoc_name.t -> env @@ -48,8 +48,8 @@ val full_type_name : env -> Odoc_name.t -> Odoc_name.t (** Get the fully qualified value name from a name.*) val full_value_name : env -> Odoc_name.t -> Odoc_name.t -(** Get the fully qualified exception name from a name.*) -val full_exception_name : env -> Odoc_name.t -> Odoc_name.t +(** Get the fully qualified extension name from a name.*) +val full_extension_constructor_name : env -> Odoc_name.t -> Odoc_name.t (** Get the fully qualified class name from a name.*) val full_class_name : env -> Odoc_name.t -> Odoc_name.t diff --git a/ocamldoc/odoc_exception.ml b/ocamldoc/odoc_exception.ml index a62cb7b7..b0e21196 100644 --- a/ocamldoc/odoc_exception.ml +++ b/ocamldoc/odoc_exception.ml @@ -23,6 +23,7 @@ and t_exception = { ex_name : Name.t ; mutable ex_info : Odoc_types.info option ; (** optional user information *) ex_args : Types.type_expr list ; (** the types of the parameters *) + ex_ret: Types.type_expr option ; (** the optional return type *) ex_alias : exception_alias option ; mutable ex_loc : Odoc_types.location ; mutable ex_code : string option ; diff --git a/ocamldoc/odoc_extension.ml b/ocamldoc/odoc_extension.ml new file mode 100644 index 00000000..0a084195 --- /dev/null +++ b/ocamldoc/odoc_extension.ml @@ -0,0 +1,46 @@ +(***********************************************************************) +(* OCamldoc *) +(* *) +(* Maxence Guesdon, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 2001 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the Q Public License version 1.0. *) +(* *) +(***********************************************************************) + +(* $Id$ *) + +(** Representation and manipulation of type extensions. *) + +module Name = Odoc_name + +type private_flag = Asttypes.private_flag = + Private | Public + +type extension_alias = { + xa_name : Name.t ; + mutable xa_xt : t_extension_constructor option ; + } + +and t_extension_constructor = { + xt_name : Name.t ; + xt_args: Types.type_expr list ; (** the types of the parameters *) + xt_ret: Types.type_expr option ; (** the optional return type of the extension *) + xt_type_extension: t_type_extension ; (** the type extension containing this constructor *) + xt_alias: extension_alias option ; + mutable xt_loc: Odoc_types.location ; + mutable xt_text: Odoc_types.info option ; (** optional user description *) + } + +and t_type_extension = { + mutable te_info : Odoc_types.info option ; (** optional user information *) + te_type_name : Name.t; + te_type_parameters : Types.type_expr list; + te_private : private_flag; + mutable te_constructors: t_extension_constructor list; + mutable te_loc : Odoc_types.location ; + mutable te_code : string option ; + } + +let extension_constructors te = te.te_constructors diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index a35df03b..9ed06c0f 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -18,6 +18,7 @@ open Odoc_info open Parameter open Value open Type +open Extension open Exception open Class open Module @@ -42,6 +43,9 @@ module Naming = (** The prefix for functions marks. *) let mark_function = "FUN" + (** The prefix for extensions marks. *) + let mark_extension = "EXTENSION" + (** The prefix for exceptions marks. *) let mark_exception = "EXCEPTION" @@ -100,6 +104,10 @@ module Naming = let recfield_target t f = target mark_type_elt (Printf.sprintf "%s.%s" (Name.simple t.ty_name) f.rf_name) + (** Return the link target for the given object field. *) + let objfield_target t f = target mark_type_elt + (Printf.sprintf "%s.%s" (Name.simple t.ty_name) f.of_name) + (** Return the complete link target for the given type. *) let complete_type_target t = complete_target mark_type t.ty_name @@ -110,6 +118,12 @@ module Naming = let complete_const_target = complete_recfield_target + (** Return the link target for the given extension. *) + let extension_target x = target mark_extension (Name.simple x.xt_name) + + (** Return the complete link target for the given extension. *) + let complete_extension_target x = complete_target mark_extension x.xt_name + (** Return the link target for the given exception. *) let exception_target e = target mark_exception (Name.simple e.ex_name) @@ -261,9 +275,9 @@ class virtual text = List.iter (self#html_of_text_element b) t (** Print the html code for the [text_element] in parameter. *) - method html_of_text_element b te = + method html_of_text_element b txt = print_DEBUG "text::html_of_text_element"; - match te with + match txt with | Odoc_info.Raw s -> self#html_of_Raw b s | Odoc_info.Code s -> self#html_of_Code b s | Odoc_info.CodePre s -> self#html_of_CodePre b s @@ -454,6 +468,7 @@ class virtual text = (html_file, h name) | Odoc_info.RK_value -> (Naming.complete_target Naming.mark_value name, h name) | Odoc_info.RK_type -> (Naming.complete_target Naming.mark_type name, h name) + | Odoc_info.RK_extension -> (Naming.complete_target Naming.mark_extension name, h name) | Odoc_info.RK_exception -> (Naming.complete_target Naming.mark_exception name, h name) | Odoc_info.RK_attribute -> (Naming.complete_target Naming.mark_attribute name, h name) | Odoc_info.RK_method -> (Naming.complete_target Naming.mark_method name, h name) @@ -515,6 +530,7 @@ class virtual text = in bp b "

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 z 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%0D8xY!Y?9Er<$$%JS9^0FbaMWi?& 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 z ze;ki*twxuXl`?9p{-yLYz6G_TV}zQKW8}%sKZQJ*YOtZi4l7NT{2hSo_r=LZ)Fb&DBTaTe!_s8QKY_7OX|iO9oH(S(l8wYk^7n?- z<3^h7!Um@EdUwf25HnySPDVGQSV#q0(gj7$mmE#`S8x{n3VqGSXz@8kQ#W zCjvNBn#`X7;QMXhc!OsoMEtQvnrwVHX)-^AmYh##Rk8Y04O|nX94bxbPeIDIG@0LT zf+iax$w-r35>A@T4|$G;q{;lv4Hk*)hDww9Gx5nOP3F%qfzu6>CcCr|X)-@V zJ{;0yek1GQhpfj*(qw)X_HfyyZiGGjM%crjjg*x%Sz%++WPTR-u%*fTM&QE_fsd1< z$^0bo;gBZt8;K9Uk@)aK;zMBNiUD;(qtaylt^}87XT=Cw_|Krk>q(ROJ5y*|n#|wH zl(Z2G@k1;`OOqA-U!=+WXV*jQZ4l3*^dU}Si4it;y|ly;4meG?9<()fNR#=^Yjl5i z6U5vd`OgG%N}6n9cxf_!0L{UcCi9k9 zN}6nPSZOjp>>@d($^88dZ~cI0=1%zrVlQcs%9e-S0?7*)p_%rSs>xXehDS&^3zRw2dxz>YhO{2$x? zsRm*Sg`SFEBOJq7G5I6y(34H*Nrsq+l$&wN)15+PR%B)UR)4~VffgYXe>$a*YWpuU zKa>EtGXs~}Qe{@;O0}6cOKxbMpdB9cZ8+p{{FhT+RughN8+jHnq_?d0*D{mdOhe2- z!b9lvWoG*+Sd159*Ix*`lmWU$=F~2K-1Jan$StAqpE3~N~#5Q&zt^;}thbz;m>DoPY=04{LWCW#FP6%c( z?JfR%EU2j@4YDc#{)*k5?CxOq9*TK#^Gkc4f4x^%OWJn!-etU7*;{SAcd~Z_RhsMt zP4;ty1!+WimLgYBfiCE-w)<>F)oi}CMO7-4J9K8D0xuBE2Hm$W5NUt2i)RF&>BTa_ z*q0sYF8*#7?P+)?fMCBdFC(Y3wz@R%GD?wrm%6Y%FCh|E2V||y%UGM2R6H3F=`d#x zH;LVN#f#mtNV5xmP0;0%p2*%f=H)V6Nln4M0(hCONSwqA_thOrrp_!YFDBb#Xw#}Q zLr^E8&7!xRe!4sc9+%&b%>%A@zg& z<3@HjuuF~d6rCgeY5sM+spkK(_cr5Q%idd=>DT56&m!Sj2Bu$E7TLtDZ3vlrq5PP!&Vms_>x_SxPks0ztGumYt^78(_ygs z;y5ifpF+=!E%~t;%$xs&^FP$fa?$)}cIo0%`H!>zGxF=O7^*F}pRo5M zDg`U*N)feEM6CiDt;jp56t3-1Ja-n&Vrpp6WnjgqEMh=g5^Pl@*=VIf53`n0Tq&|< z3HNm(>vDD>%?KL8ad2rZF5Cz(oNQ5L`PhwNHxkuuwb1Z1j^Lg}2ZlN&1WsWWI+;Mn zvWpGAWpxU2bhm?}(8-3AtP<|)MHZ$sxajO~i`gYL4IJQ722Ef$o?X(w1xC&Wu*6;Z zDv`A$*#5IHCxa80DRFaz(A=n_XpW)rTG1TSB8qklZb72|Bcg8uJyz3OsGM)|Zt1MUuX^@I@|2TnOHW!rnjY?LMn2QJx9Lw-o$ z+WbMmzDykg>sj0SWDZ7q1aDy@w&V|)?4mW`M@)=x6WEQFu{vKl=n?pA4xDl@HNflP zY<}$;FJhxbY%H>QOw%Nb;@;Th|Kskx!=x&fxZ&yDJ~OkkIn5FlS$1awl96O&Hh>_Y zL=^;yOOPl*K>f#T^41wZ!ov@fN_b8oq~ES>2dknnN!eG=AWCdl;oX^MAhS%g29e-#s)v z7w$?C=tE)NVGi+zA>bD%%)MW!A8oqo&IP~x>v#@#sb4W6V4tDLfBkbxCtE9`XawP>3!$^jeWGxj zaPJejI9Wspje>BE$wiIFeI>_a4gP5thcu670P_f>ujUYX2rve8glj`}mAe{ziQJXU zIXx_qbb(091?Tjz1i=l6^Vb@NIEM-}oq+CQ;(rp;sn@xH|O>fA|u4cjdPoG-YBrVPP*M0M!3b zj&pYv0vA%YJeVFK#4w96mP05SQ2f)b*}wS1AB4ZKtvYCA3Qa;>a!Fonm5Btji%3%>x2NHs(PG2Pf)WYz_ab#q`c=j+a4DTnr2Brl&o z)FY(z+fKw9omM!Exu51(LY0GVUk-FY<^9lXzp3ljxeV{^j{|W6-U3I*6*o> ztHnu2MbZhtwKe=9HLK4G29F+L_bc%Ty0xbk*rO*W0&6H%$7Xi5#vQ1nmm~t*b3GRd z*F7R_pGbQH$Qzi*VZ#2o@&k`0iaMjEtz&38w{7bh*uea?6s~(k+RykuaJ15q^csZY zi&o>y2a;EL%)9@#)`7HPON$47K$(xDX(DZTiY!kd{Vl+Av}E}jPzs@7zdZ{s*oWWq zba@KwVYFbc`L>7NH3&S-{9Pkl^F?|sk&Zhro~|a+B1rx-t&CG}cv-rOf}Mxpf(*bN zQz^LZP!NA6Jx;;;LqVMQUNd;$=utRc9z2}Sbn(OLT=u95!=Tc3)`6AQfrqWam9UnE zX%YT|u}y0>qO;r=zyt&DHg~)hL~*&PUndx4l;ZNhK4qj12a9x}2e&7N)6GKsy{NnT z>+6Ban1LYjcayKh9|;uZUH{c@S@~ zP{UbjdG1F6JQ!P%7gm(Cm;$sFzb#ha7XI)McNP4yf}_|j0=$sIz*f88Y^J9h0?%+$ z+9_NMM0#tH4oiDawTWC!P5oa1YU+9%k~vC^s1Oe!5sm_AKVZTH1L3P2V%P;-&EZQ( zjIQvCqbq>OPAbvMmgglZ(Tln(yyWN#FXHzXOtXI>#C8Fu8bJNB>GV4}`XZO&3*lNQ z(uaxk(ID`piI7F0ToyzMxj;^>mbc5XXfo7{`cd0}9bXB)1mzg|)B=VmXqR%d9K|i8 zx1(hYh}1HEGbBggh#8oN0_zh@c$J)AE$@>vs;gxxISi3g$*ai}IaxJ7=WAE{`$iz+ z^_cqUR&9B`CNemPyIz*(1d#7wnj7WHYPmvIfaXFuU#67ExpGcvS-W8Hx(b=TlIG4kO)wvtlNX8?4*qwlcXRzSnp!?VQaRJ!kg{%xiuljI&mcGEwuv6oQJ7s zFQR+9asz#%@^^DEv_BFL4hxFJ=luMqK%gG}tjkg+!on13}g{u)i|3z<|R->;UZx5gzsr%C!yghEM_!20OlFtudqpa*A@-6nhou(p@^CDfns z!jQ9zz1ks?NbXjs8-mIl1>O|IdvdZVk!nMvf-(jFk{CIRI}=0w>D3yMkS~T4_IM$& z`1CGOAj%p(Mdx!1y1ZRV1Tm_TA+t@wbzTy`ap^H*{|$o5DD*$?-~9ffs0aKEO&agZ~$Hh7z$ z$>c;)bFsj^!kQ0M6r-`v1M`y_@``3~|67Nbk5?P1@PG5H-8eBzpCmG`VCLT)D6nHK zSAoE31wP5l-=~>}^>vK)X$Y%ilmeBAGU0Qq;~_X|op#;seLPaJzEx%EB=doj9y74S zN>p-cSQFp7E)trb1_=pYjyMnV{>-2Se|~7|z+5k>H(8d~d@D$m4`U z{u%Be07ElExd}Y_!tM+2EsBIDPDvFzdT~AlegGb!cA@$)DI_L?vOerb@zrsmd9RFw zI74B3g$#PIC@Q8Sr_2)4w1){ZhO@BS|9c{}wYUr5m1?E1&=lh8!jlpf=;_>P(5z0Q zS>0-MsMVNSPF$fn%$f_ZNP#$(z%9nWIOtmFPpcj$Yovagk7SJ%xQLQXajIIYHYdGE z{k|AUTPW}$Zi}C)nyixXN-x3%cQv{dE<`|e0kW(|=m%#L+_Nl__)58m*83neE|f~^GNrJ5kzWnu2N z(-)v^ru6y6qz+2MxSbk_+X1RVVnB4D0@H|F46NLHVo+1$3oN8w_l$~!afB-LA-dZd zlzC_}*s=`DT23TgBOw_(lFt)yn=Wpg0?TO_u;NCra=KmAvPdn(HA9V0tw(pJt=25W z+g0jj$T(Gj%}I!OT~-Ov#}!Ie)n<;j=dwu5%vOk6qPL?U7}~6umH?dh=l4XKD8}78 znvQAQm0;{X1;V6=nm`jix~#*+>4M@+r|Th>bqN>efl+*xc_(r`sK8lVoGYEh;kGb{ z3+60WPNZ_JQG9F#^0f+ljq1J(b)QLv?1e%mIWZGo8&yKNt&Psjlc?EtzI$$Qdl~kjd?dH2y zTjUnClwkLa7oK>$`-Pl)6`09_oumbusjlPllYvSV{J;VZQ_`>e7^y7B6z&=zb6kPA zMS!UbcZ<83mQ2McfVq-WNx$;pc@axoZI1gu;lrL73d;Lvai^`gQ~KBr1;rqaa15Wg zUa9Z@#w z6$l$bAWme&w}H`4)NY;u;v&bC=9T*+FzS;ETe76>6WNWBYz30WPVVMLLgE`I+&BjQ zv)b~-Gw6vWZ1hY>48~O1(ur+cBy6b)+ouvO7`EPoWEX%-ok)U_kYwE^ygh`s7g(yH zKr|fg52w)9@5&wBjPwOYMkJ`Kj=tew(wCz^-iw}{JGwa~!tw*Z>QP#}(rshw6>aWrM*qx)*`FKWGjIuDR+ zzJY9W9Su4K@QV>MP7zIx2uY*Fh; zK3Cspdd{C9;%tz+&qgBBQxW+FZ{{KIW#BYc0%+{uboco?I@s&uDiLwLMcf>~H)wc~ zs()V{)c>3S?Wa-Y^2J==Aa(3dFJuo^U?r)H&DQ0?aliET~8saAMgS3Cj{! zP{g$taahFp?$>a4!gn#@E7JnUsz+F2JEm^3WOBjv3cmt#8?AsSd`M{zT*^5b5S55>fF~PZQopg?9sp z>{8$X(>P)bk?)vD9Egl2B9lR+zmrHr{c%8HeoRiJu04T}Ob1ZzK(Z@hLq3L^|Grm* zZy#7auD7)wLkp-<|5?73=(zLFbw+6&M|uIf$Vl^r zPO}T}mm0>p19mV0981y`mh~Jb{8srIkRc)7`Ld5E>t?X=O)4Y! z)rIzcT*SQx1ixwcQ=+t>Xwbk3L`5Egl{%b)zUD(wio+4cVft17Gh%)I~f=8@{C4#UY&Ko>WqGEN6Rxf zEpHE93(v||(y!?7VQ-o3+7qD<#W&NmmxGVy8m4!`N@PE3g`Wgba9LBPS7XD2e8y=@7#ynRS`)NJ#>X)Viey~!&6ui(}5Bdb+r)aeN--f5r@qngoQ*43qzUecmZnHfJn$kY2XCh&F*wu-iaGsokbWP#@TZcPt62BTWkNmV0MB zF(KmfKy8bLJ5VFF+)IUfzNkBv99_VhkZ>=?1$-FwS?=k~=gX>a@hQl;Q^V<`5tlfh zf+Iw*fkr$A`QhFN zoHW&=hj;1im{9AkzAsX{`Cj80gq<&7ItWac5T@0@6mVi1bzV#o22XfdUhy}B+A)h2 z69ajnV|r2D=Db*dC&O~Dr5a6; z+AMT8U`xZVGU;b^jsAV_tU3^ZiG(D$JB~ji5^$h{m+BRa!J0QLV6IotxqLESp(rjG zRX%ypq@jBAVyVbU5$*>>&TQ<8$qT^j1Gyuxb~U-2_wX+qF{c0E;RDBvDIcYC-!F2o z(FW7ktz51KS`1%-gN7PbJ@d3K7q+L+{la=+qzPa`OI4QmA7vp`Q7x+I&j2_#1$Ul| zB%MoLeMG_$k?=iuyG+4}9_l36?MjG6xtE*0arbgAOqsSj9fJ(*Gz={SSL%4fgHIxj zj6#nGoO_KZ2UZBnMa~Mw*As8M(Nkr&179x<&mepc7mhC~!Y%1Xejrvx}igy}e z83`1Sh^4k??)2ao`*#;S&wx>3&|UxyjCo4bE$Gn5kZNwrIq~iMB0hS0pOmYs`(& zc99tyCziDe0KBh-u)O?fBrHF<28hH(B5^5r{aM5RVP0vs(!Pg<)2CLVK61>uGCA@{Yt2CQ(9#}+HTX@f38M4m_#Pl(!H2#+W@P?#a$@fLV za)oQCNV--eVH-8Et%mQRK4~S!p~7D02k6}=xVGA9YxC|%+g`&xxVC<#+CnG8ew~XS zwxYg<$8u3+d`RT+bLBb9HzX2gy)-v{LG4-%Ps9Y$BcaD?LS}9+w-Guc!gAcP%6z#j z67B&S-}N$=WLJ-{VO$P#Q1EhgBrHRx2Ew3=*`jaVG<1OM7vu9aPCCE^lK!+;F14XBCQAyp90|m6KO^KIsUT}$;slu z{0s3$7_Nt+U%1a!TJAr%Z@~WhTb9LIZRCvwWa2vEnj_MdiL|}N$ax5lhS0qMnyUZF zX`j$(KSA0J8vYl__lQhk0-ksfpxgFre(vH-n{~o}%VffOG(fiq2cq*wMuAAL!rlws+!(8ph6{aKBqfm$?*+bVa}ygc4Q%!^WrM9s)G~ zL6HZQiV&I<;Uyfl#)+oIknxY1cQHp>G2x%#oR1#wh7n!jFB-mx2*2+rpymFF6Q6~* zz2w;<`CcUcuZEXU;t&7fc>>GV&&g_EdL+Zw8zNHstaFCS=MQ6=ZLLol_B)o!n=kfKV??tmDqV8-ix)(5ZT&%w^> z^AKz|P_mgFIa8-jKroSXM`;;8Ti#Mu*_~}Y@=~PnHmQ?v%@%1_inK2BaYp(wD&rH~ zqH(=p5OonO`Ke?*gzGMm)>@IC*EkVI8hn%PfN!VNRwDH>Ae^D$8B}hG%b94MXE6r2?<&vi4daG$npP22-m$8A|)1YrIIV7Rd(yf283vm|J?esq`R1 zOPJ6Ox~q^VH&n|f-->;Oy-LkWI9Nc5j$8J(6#s%2C8R<(SSoRL+@4MWgu^|Gof!@^jg`Or8pM zv>VO~KSn}LzNK+NGT8%JkZ);%Zy9h`S^ zf+asBf~JgHK9ES3lhGCDW0ZOedD*5bwAlDh9-!gxSt9!gq1vC87m#vbsM1l7GE%-mp8{i%GF+#*i#H7&V!Q|B5fulFN9a?f;*Klv<36px>k&)~#LuTQKo9<+Uc7|S%=MyU7UJGa8 z$!$dPW$GlSfJ)i}60YmmUwZynBrH$B<5)^dkxIF(C|X^W|iYIHTV?F+~fAM(Mn6+;)0 zan$0F#`Ak3m1Ca^(~u020*mG3{TjyXA2Sh;+VjMCIR}&CJQ5R*ddYKQNZ8L;MM8g6 zqs%on6`P#zT-!%gJhz*Ro+a`YVwusBs4WDwLMOHJYXErx859Kh4Ay%;fQHVzIgvR1 zirf^ZT_@5;KoVb@$OFI#39m*)eX2%iS|nR>?@?n7^x&{Nhh4b(elZz`0L!l?QqC3l zxURsETRE{=S6rN`I7b8A5ovmyVhPt`_>UCnr>dPqlY#Qm_X{0o_a{hvQjdfk33){1VnEzqI}_6B+@sE^ld;?U?MNGu-+zNp>?wl z3n+^^%6KB5B}G42ac(|fwBkSHZzywR8M5NEdvFP)fO|1cW0f7JBQ$`N%MAmtm`l0B zL=FeZ)QS!ay%V9hApX98eCcL2+K zMxDmQ*AL;z$Ezb>iTo}02Ryrj53?EZ8sU0CWE_U~bRb@9B7Do`CkNsRE9C)&IeB*o zQ2};qz7hqvkgZuRz=0bu^X7XBysNGh{`SJ(6_}qjk)Fiz&-ui1p%z)nLnz3b5~opKi6e!b30kfPGgm zazwaR3;*ZBe+H4GCc>_r;%2E1S0!7PVGpkZcXwrTiQT_(%BpA>_jTSdwBojxlKPX! z+p``>SfUhze7_yX<9aFmkbo<|v^a1ct?alfQlC4cn{d|ease7K#(>WJl*DqVhx@3D ztV0*6=Qyp|(K8at-%YP5M%n)`5h{aRLKvUq^6P$_UybS!?mw*9ZJ0!Ye_1FCN@c(~ zqukLj0?Aaokf1su+HGo_i8RInJgyuCSxaQGvnbm*mVG;1=f#S3x|NzLT#t(yT||xR ziTfuA%`Tw1BFwsR``Pm%0vZf0sx@F$lZv6`QIS<8vUWj*mCDV8^bOS{;Hj-xmdX-b zN+R1v+sbo$q;*p&1|3D>8z^vKA)~>#Vm$xk2uLmy zu1AFbI^l=yPbvmG6?ux=Z=zURulSTP2kn>^Wl7&uk10vN#Z==dOODqnGu>$}! zw0dk5HUZcksXL|)6s`wF#>XN93&>OqUn_(^AaFg28sD#kG@a@cn~rd=F6YqTZ@Z1& zo*juzxT{i%{e+oz?bk>pTV{yiHe2d)6M2(M#!XahE`!r# z<`=hg0gpjLEgr>pt{94Jk1{`GKSo_?ZazCc@Z< zqX$?*Gq-K$-F3i_oce~D&UomM37Zi83D4~$UdIe@+qg)K9~Q2MMP{YQd=^MC&U3_{ zr^+DvYkiadBI%p_my2l{XbHOV`)|E&fnuV1Pkq-k=T$Uu$j1g0LL7(!?U%aGW?G2+ z%S7U6QuBj7UE<|( z4)OdW;CX~0EyiR@MI_clG6=(u4IS4{%seaggHR95e}sjAw|kK_QMi_g%o-vSreA4T zv#AJQYxljZd!W=WyEH(Lqb^5J>_CFTeOA9Vpq5MMfYcKyiRJr|x+}IPlwqcoc(9m$ z3~P)-BGhSGp{dh7;H}8iX)f0(OPQV+KtW3C; zi_Bgka}Y4LGm)vPbz2F3mIL(DGpwZ^E9OgMzCS?cawnaPNOZ8)Q*`>v8N}`sbjElA zG^Js4t8FQf5Mi8DEvY3K?qed|g0yJ7laR(!+rsX7r)nJ2;`UN0c4NaPSKGXiXp|eY zxe_}t#XK>N$21F*D?FGV(m~Jt7zxp6-F-5C2eV_$Slk3#k8n;w%;F51#$u=@y6RE_ z_gE#19OLnGrz26o@^P)m>L{}MgTfRO83e9r3ygok})fQn> z4sk$$ym#vfWmXy@7(ID*nUzW1{#U2s01k1I^WDNBF4hB6a}J9b)BPs1ADEV!NX;OX z7yVo9hon=lWh3iq9(RAc(DBwetsP46-HKVJww4kPsZQ>gQ9XCw9e*kj#>I6aYp}?A z5RoTLWFymUCKIdFvM{Z}N?RB-i^Q}gR@!0^PFtiGhy7@A$a6a!pkRjAo8tPnK3v@A z4d&4x^MZ*i;o^=&n<;QI{dlDM+$CIVL{=S<)d1Lbn@B18BQIhTPgsd>V-cHp2#SyX zzGfxvCw|v!o-TIq*9Q8k7fF4(YGrNE%GyvXyU4k@`rNWeJe@FXN&kq8`&jH|^ z^1XLDE|*`O95iXfD0)V7@JRJ2XV_z!Rn>7hyu-n%)MiIm0ysqNDPr#xv8&(?RY6aK zW)-^~k?daLbDbV`)&M5h^9mC$3ca-N9>o$f^MiPoLy;{V}J zbm`ySi7xvGccLr)(Vgh3bKQxq`I|e@_5a(Q=!SoEC;Ie1xf895(w*oI%-NmSm}m-b zyAx#}qWENc1#Q48p+EaNhN&fdbq*ap(F{iF+JzHcfpUuE`ipk$%=VvEBIG4__6@bP ziRiUw$4SNi=s?NpM0NQ$XGvCPQ@O&rim|ohu#CfE(&NIfv<)sO;~802K`Wrc@$7EB zX?Q-jYdHmj4_WsN0dQXq1s5FRcX#jXg2Yd~F^;AEn!l z4`xEsuNAQy@qZAyLxGx*~yJRe|((~48 zSoXn389Y{Rf$>4;(+GS@q-I`GZ=g;!0VsuU6xh)pMjOER`0|ZKu1x8bUh~U11KiAv zukJ0ROUM{7zD9xA1R!3oXw1CAmN?{lV3#DnmG!_@8=I|(_(YB*i%Bj)`@6mI?YkXG znuK$HHwXyd9X97P3|lh|a3^xLc5*(;{Bjp_{z@Mq(JQY6=X(@*uj0IIBj%iD6a$B$ zAyxrVG5(c;!9F&FbMT2A&JHHV2if04dR_PyAW64y#_`r;Tj5)5Grq)db-w|~Ur28! z;}4i$a5(_nes+V9_X)WG;O7d2aXutoT(4uWqC$?Wkd}OU5&JJ5mN&9oyAP-F8RyfR zHd!L$AH5)FcAz$2&>!B5%KH}wU4O}#V&w&SxZD{u^MX+0$(R8J!Wh?Vg2Kr|XD$wO z891^W`yKKiIyK%MGHoxjVS|a+>T%4%ywt&>gbRMtwF6BLV$paCF0uc;U-LyBff_ zP|UnKD0?xHQ6U$~jghB@o#%ScxX4-RMfh+r(sZn(E71nyb@D zdcgHLQyqPdi)Ct|&21EYL8^?Q+@Fu-si zeh7ItRN_I3P?3h=E9rx(N@tA^#h0y>GQ&<+ZqOJ%k(tI%Wac0|Pt7tI7v_z5BQS4r z*4$Qn*e2a1g>zgmXWnYC-(rACNW2qV9CS?CMJ7phFTNhHghf!O3={ALuUnd|;|*}L z0md0%Y*7BrtlsQ!?0ghRk2@KC86VyyM&%J3tI^k)=GsH%bR_!_iOy7#<+33$4PQUU z*Pp}0Hx*y#E{twkw;RA5o@N?vj+v8#mZ;44Q=l%nJ>$zyR|pc@bf46UO9y^u4i60H<1%_ZncH0qy~xeVNaR zPKVHzXi1q{6H?f*o7Btb<7G}(-=P$(?G(l>U8Wh9j>CLANswWMw!2nO70Pk}FCZFS$dK*#P z7d9UJWs`Z9eszpNTMfc3KzN1`PAM8RV$2Xcx4~0COT0!|PB{@~N*m$xq$fho=V1PU z#Czb|wz{=Ch6dk#CZiA?sk2BYythbBz}AEtMN?B_7bjtRocT8?ziqba;Z zg4Xbh26zD^@|eW!4Mq=~98TgaNW>(Bk#K0=-I|1L;*+_{L897_*a;FBGl{7M4ky^y z4+i$!Fzk*he^p_RaZEn;I&V%04Kp1nnmnHwa&Sdyw#~SidpAiO;XeqPkz!n zdd2#Y4JBBA{{LF&%(7zVgkzzlO_AA?D0b{lSh0&7_L=?{u)IlC%bUBL%Nu*j=P$s* zh($U3Zwne*Ir{69Iyu)rnZHPv+g})z4H(JYp(RWza>(LPMfe+ICW8rt%(XwEQ^4HY zv}1omgROx9E`-eyqn#64v;>gH?yLTbfEB#S7B-sZh}wI+3YNY2ZI{aM>+Rg^Rdi#0C zzre9PfL@hP+NgR0`=j_&Wq;~{=sG*v-Jt7cfUZILCgWXLFk#Z53FWlGyGw3HwwLT| zz3~ZC0lC}$bUmWa+0p9^KC`a&_XL;k3VVR(Rb+hD&NzUIf9}%2Z&tJZ8DpaB+96AxR0LL5}zxB7#IW*Y42J<{%Udn=7R!Ea(8vGeC_Jk~9ZwUIK zx5y7rh&Qt`_Ada2HH=|-A8DZ;V3roCWlh{Bl;cwHQCk!gAlVuVyKo6|wcFwXnY{$(4+5f0Xu?~|(H#6{v znLo?gz*L7Yy=Uj#MDY*pc$GmwdvE#pF~;7L@jpXxX(u*oRsT~a*OMSyhsmxggpYIW zHGG%EyeYi3J9MdIl-WuIYS;v}7`&T-w;AKD%;#e)9{$k%X|j6W(@OvIC`ebr+t9|l z;~z(}?S`6JsrqT9+6m_j?lpRjNUxvJHX1zBeqve89Mj>fKJ?Ss(1~gmw!AIN1;W<1 z&b{WW-t_6;&c#@k8I`llsGQYHvw~An_ZnDs(;}g4NbnO z-&y~ygcmo}PO|LnmaM)=D6(!~L|4Fv&@^Gq2BNkKgju3+uWQInb>OH`{nZ46O6$(T zVGdhY!Z5`&z$~~9VY?p+@uUgD{z!z>0h8Kt*QGN~V##f97T1OiHxid~ILgKc=P>v@ zoWo%p4hbC>Wew#I1B^%pa`Z+n$P?pWaw}$!qpoY?Y!;caIE33h!0AYh;`cF`EO)O^ z@w?m9V9ABV&4qi9$hIpd8+K3loXsIF;sCAzM35ZT%n!in9euIaHnr>VhniX-wQF%S z!$dPVY8(sKPT?pnkU~c5Mhojd!ukW?qYSz|B(A*|a-Zr?LPN*ml1$Sj!AUD~Vyp9P zTteC>vfo0#B6svglG!lh#OK4D4-dmU5-N4}V;~{2VMvSL4{A2Ej~d_@{|ZYtq?yDa z`GJNoS1>Bw`YgA7fRT+y`jPlK4)I74VB8!+cpHbes_ake><}YgQvxE{NVs1W*)X(3 z_%w(1tUDWz9s$P;4)5S_Do`N%YP%@7*@ZOI4DZu9YGyatQ#d-o{5p}Nd}!?X&p6@k zE!+bk`X3cIl0^ST6I=8~U2@^yB*JfiFkYY&by7$km|$D(SE*TrDbtFo(t-&S$7Ay@ zXp+}40GbqR5NPtqXlNX9zlxaB4|Ng^kYE6`HDvHoYw^~&Rd^Z+4~#&)H5Ev=qAWbB ziJz;hVG`%Qm<%fL_avM1TkcQEa2PI#MIw?Sh5WG{C6Hg@o)ty;K_>V?rneBPe4bswWox>S#E8H=y>tr^qwfqG`y`8n^%J4)(X5fSRvcO!rlETah@9l=Q0ORSK=M~ zEO3M^f?_QB=^c!)w+Bvpqa|53QdrLk>tm2?r@((xiBXX6QN53<>+_Q3*;#3*XOOgu z0yk08!=lpH;I zR5c~IXHjX)UEcjL+CmLgC8-7z!xV_w50*GEb_@_RxIjTBwVC*r3L-Ma`8LA4)zOj} zuW-L;ztQQr0h>xrlgD=}qeV6uV-j>RZdQ1wC=lBt67Fwd3j-J85cKZ63FBdUVu^H? z^em+Ty~uEv0^_MVUdbCW0aI&Q&`~Aaqkc*NI8T9W=)Xr*ngx3mO0`h^lmf6qf$3ap zQ^ISFuHsW2)>78DTwgt?>cHWRd`l7Q0RGK+ALiYPXl1Zg6&z1idDkfrV-ME2sJ8}G zZwnz^T)DAZ#MEdpKc&!R1M|}gO}u|ge%yt@^MJuM6|^{`hYf9G1+r@oIxlKl$g z3Df?78tCNroa!z06KuP@2NXDo>u#H=JMHoaSKFxW=tWQ6)gB@+tcMjvTk`jAhTBSb z^aIiN6^KEGM;kaRCvAcznXs06WF} zOsePDId%5Vp{S4n)xRgu?8W^iz#kO&8?fSD_N7(A{aQVYYN$Z*4i^HW?Bgusv#O%; z3a$6Q3VfL=>-BngQUHh5lqN1l{jd{YtOBdK9=ZTN3i7lCT zwnkZ)xU}1aXTI=2CC8;Ja1&QUXoT#9mq|q(yip4+f=>Dxn0~XdW60LiOUv^Uo9pFp zNdn45Z~(C8E0CM!0dBu~R)Rr3Cp34e(*a+1Nsr9K-w^FmrrjCWA@p$Fg+Fw(KU~Eh z@Wdo|yo|$3Ic&phl&TU{f{ii-t|6fxq#mNUkeE6mEBv@3M59A^IcL2_rC*DzT@|>F zvL328%4AhbuR!O4w@u-rhDtm{9^$+kqiWA#I}S@2?GT0QQJ^hX;CiZJ@71P?3se=? zRyVeBkDG=tXAgTP+VLQ6ydv-fHn`E&=}wWC2A4!f4|-=twC!Z_bm2M7PT}IFC=jn1 zQJathAeOiE{CO0F!SdN2=z2)a=^VxrC#w zS!VN9IhI0Z3lzADs^W2mAD=(B7-6GoL>|YvIQ^9Nxu*pHl{C*yFg!qQQ|E3*ErDk=-dX3W*>|pww%%S_gGOo)45*0 zR+aGr2z{eKTyw#zzPXcW&r+|u9NRY3CSq&@iMm+K9uql}LhT|4L-;XK=LrrU=kQS? zuk$)SC4aKYygsHlU9KDfF9j`F;9g%@*FUt0|~B@X`# zOeh~^v@*7h`pQmF9oCK94dXB;(rTk_4q>a?By?b2x4HQRtREK_U=%`lhN*RPl?ZPK z;k_2rx@))(b-cJsO~>n@^epZ|qxDxwyo5ttZya^KQb1N5))o9WSB8zWoTqsc4s$zNs2_zFbG0d^I622jFweJ5H^Lmg_s==q&CM5l3}1OT)NF z#3RbnXb^wd+FfEl40VdfZ4my<;g4Lui?m#C0FK2P?u*uh_vZ%=#yTg|sxcZP>%Tet zjl*9#{DIM|(pmB9ny*sB0|<=>p@DmYfp#0Li+(HW@|?}L0q(!NCxrJiWPVb^U!uua zarcwptI?WL=tY(sYCojmM_4g^;BAe-;Z{sPt?VyS${xwBxQV*S&EO_iC0|gD^6@fY zphhY0g8Yje7h_LNj8^LV;aM#%M#N#6=6g-Uctlmsz_Sef-q8(^_r!~3+8foCQjj-(nw$w7` z16HS6M9b=@y2`!=tDkB3&meW4L4^7siK99QPdIpIOGWlSRKAERLDj@jC&=!Q_4ET@uiZX+CD00-7>AyJ<^ z7A3=QE?FkLV}*B0wH0q^7^_lw9KxAJsLzmacwz}V3}}|_@+!yV;bc{`gi>6k!aG=a zN8+&{aC;x&#)>Lz_HZ)Vb$YxX-ofHFh&T*4@mcWf&6$=E=Y^Vp`IKYiG zOc$IzvF4CpjrBw;hPIFKntZa+R8^MDQ?tz+Otxc0&J!H2w>fqe~!t2ul`;k_t?*VouggMF?_@+qeapL2+j9pUh8 z`}0Xg^B9NgIb4hV<|KyJnY@p3)R^4nRC3gq&*nVL(Iw1D46O+9)=mkg;Igk4%71Kf zKX6)-Wr(o_{OQ5a>M&;+f4JZNu#`V6=I}la@8xhVSKYnvpci+ah+BcGyHCTFRCUre z6L3`CFjx=KPP7$2)@JKz#<#&H`6PdMoWn&NR&Y33UHmFO6UPY#K;^F0e+ZN8bpcP|)tPQ&PiJPxlx(XD{; zNh^8A9RITJUD%_5i$vAaULg^=iw2K{^%I}=!_0|#!XEwm9>9Aw{3fOKsBsmKR8X?l z^-pgBenZ2DSOh#6QQ_mc!2hs!D67>kop^|}#2+jr=W_XEv>Q_JpLmUkJ0s%oibDJc z@bTyCEqoJ5kJhK^*bjx2;nbtiD*pJ-;3hNfn27rTct6)Lt--FwTN1Q;=sOJ5&fUY4 z8PQhWcN*Pka@B@w_k`^PfIJ7IC%%am+mEiU!dF-Luz4E)lZI&r`Cj&yS&EADvc+W; z96M0O{iy`z%K-eBhO?-C<3jT$^cIOe4n6b|hc9xtnX)JNbQZj(nh>wy+Fb8H>ZXs! zKdJWB6Li%8E%~Qv`Y~{TNd?4( z;_)cOn2;x2r$ly&$c9`J0w#jjbXcFo*MhDPo_JBex$q>2`d3u6!^m{L{~m)9`~gz+ z<@cI6V$_5nZiQObrIrQLYs;!wJkd@ax zCOVI!bGSmsYyEXU$~{5D4+qhJihw`CcJTv+`MVjij5<|+F&A>4l93!!8{5;;@63cD<{Z#bxkq=sO~O?|{YS!u5{GzCmP<#hr0a zV#C1$M~~`1cF;}z*(a>5!x0Z9G{vfTXs_3qvK54VdCh91h@cIEQ3< z#XvtsxzTk4yU_hrW)a~OMHp9RHDMp8+Nx7Q8znreV6;i3PlMSn5e|k3qn7A@mLk>2k7>9b@s^3LM&hl%lQ(RcdB0~h7^UT z2G&x<@GP5Qc>()YqU~>|09p`|*c56z1(`9{=KS1BaMkg6s9nY;#R_2za?XGi95sR@ zJ7y%cQpFFRg?$ZNNHnqpQO`CRtA{xdK0L`dgYZxnKT^a`0M23!-$^*@6glo%leiON zLekBxNf>e^W9S5DWC>G6!d<}7S;O}chPoFyyKH}0TMZsfmla59B^Wat?imid>s)jL zpk@|x*D~Cf!y7of9_7K!KBVZaYdW_NN3UaEhTzTj!~~HD)t*?c;X>l2-o>K_P8n3* z|2!OB&b?GuASw>q%T2BG-q6o|ne>&T{w%hrc2jbn>~TdAVpn zVCgp_q2D?B3p27DE?<&+h-B=^BtE2JZbJo)LoXOi>2J(zU`CcuZY2z&=O75~Zzc3~ z$Ruy1&D|&>lE+#(aRa$GN`6)(<2WtxNfUX4%G>Zl)&b_qaC2?4Z{ixAzBNTz+5PyLZ{s0vXG<$?=zQF5{ zsS6R=Ya%NMXVZo}%Jv6?>aGB{)|I9{EKzEsT+S%({qM@Bt0dk zH7K-Eq6pZwLIEf#usVlBC{w_*6q=V58d{^_Bi2I*u^vJ=7r)?<0~=`te>TH@0K+~~ z-DOD5=BTkE4$R=_G#15g^de*0e36FZo5bHuWHpJRMSU9d>`4b!Qi-@o4$7#qH>`yH z+$yYuhv*v~1iO$_Rp1aK-(j<6+xiD~@ozZ5G>mQL4^_lTQYJl83xv|uKh&=Y;> z%SAdCd`V4B3u(mz7An1m=H`O`?bVQS%l&cquF-jtUMlUl`rN z7mm6SPUH}lWYWiwF@Mj;;E$hqv`^|tPtIn zGeIoWu@Xi)dQ|?ej1v~Ja@@wp!`@(`fJcym8VqL=D`;GQFfZ5?!0+}@UVxz- zAN-n^f-H_^FfTLdspibyA`@0?Nq3qE>$6~UEO>7zA3xE4nZ+D^CTb%{*_~0{#^DqW zZviW)(IJX)$wN=U9sCoH(7?v+D!~|)03oJzZfb$T3Q4cPzBf~_iE}-|;awcg;&2A) zJ&qysHcA02k^*yop@7>8o*GwbqhK;8p2Wqj60R!YzXmTLqu85F1Y@i4bZHn;<0FiQ zmD{LufJO8egtbGA7S6XpRxgDk><>2)!NTE85IXXCQA3Ct*fmRf)kJvP?3yM{f{x0k z4J-N|yl*@g!deu=Sa}dDE2Qge+x6}AJjTycQdH5>i;VbDq;o2=~d?{+20VD65 z$X`_QZUtk?%ZG%{(5xg+-uUvN>LH_0@3bVWkI~@Yr0!UMJZLh&^X>YB8BUz}cR6gWn`hC*9BsvH zwGysk;trWLaWr!7{@0-VBFF*lb|cnxh6 zRmrCPX%oSUc^Hr2kj-Yy<|~6LV+@Yxkl-zx79xdQjYBj<=lA9G;)QOMzO)QE+G2}> zadhZJNpM4@r}`iU_u@Rik}Dp3_hV~;9_0df_8KH%ymRsJBW3!st4g#PzIB+96>J`g zi$d4p0~}|^H0+|$2Ct)}@|GJ_O0mB?XN{S~{ywc3_?l$i+A{?!2~K;7MB)Q#hb*a8 zJC!l1xQsK#wuE6S7)(+JoTb73jy;cPcM+543fD`20L2e9;aVu{Ww42-TYO=pf3D;eQ9LO469 znov*eAqC1rVJ-ijFy3-h}F`3@&L~jw%!*d*+ zs$sTJT3s#6B+NdDp%QtyysWgWJ)X|$XA^w;$Ed^vf^cJ@G)NCCHk%3FO$1jm!5Z?q zYLMw6yTcYlCW1;yu&;wkwDxexFAG<-sPV9!S{&ZFPh+Z`5I{L!$0`80KICtvrIlKZ)}GP z7QG$xqCG<19YPny&3VM6+Z#U5_le^?i?c|2w^$vR3 z(Uz~k%wg+Wv2?Uz#r}urB@;cFC67T<%j5DWh#jUb|CXFoD)-2lW$kcp`8o$d87;x) zW>W9AVjp6He-gpkOfXM=NXq6d5IsQdG2}iXx>xQg1;O3HYi)wZqtyW90SZf+ZX&%` zwUyG=L>|x@Aep9KG#?1?`XKNNG=NMcj+!t>t>ur^Fgf^$`u~SAqePyRCy1Hj!Cnq# zqV4x7{0KNPGY-sjH_X6F54{?l8;6qU_sP9RcEA|trW7(dtKm*8@PO%M-w$Wgzqn5|tTe1IQgq;W>Gyq!Zc-(ZR z2?hP308PdcMe-2bG}e_@l(mC}eXysavaXMo>U?rcmDWq7^+shaFp+tt<R_%wxi}K%}k`sWA0T!N9*rq+KG?=mmKc;by|Vn2Yd`B`^%j3`<;1lI_TnZ7<8I z2yKGhD`ax$2mTKNdB-Okxh^5)Y(s~p) zqq{A(W2d8{D3dICA&YGuVR;f*YIb*u?O3#jaw)Hy4Y)#Z4(A$bYpy-SR${TEr{rf@ zY%k${cD2mIt#WRaL(u`mjd)!Py4n&q1iOXFZF^Lu0Kt>OHCLn@5Gh9xIi(}1$wqDm zjoj{MxjjU3dyGo_8p*AjLvG8WqDXS$?aLfev;%?ZHexdcmi?p7#0?mSS9lzuxY`r6*9?gXi+N-Z0ME@oKb1Q-8+Oo#S; zUiKhPo(gtxaN>=M6Paeog(PD(As z`x0E}+>Oqg4~Bm$`+PX#TJPvSZIyyHxaiN=TB5_&qgrzyK)No>nwzs5S;~FI5w}^PS zHBarT;ddA@&4yB7!$I}D*@}s)md){e0?FzlbW>FG`$322_@kYp;u}=@xCV;&*&=== z;2SgylYbN?n<$o1KXoE5ix%-feUvxWg8OvBmrMAr0=`ryzNmZRFn!#J8$+qXHOvad zDkQ|%a3RsWZpGB2E)YY0x?`lQNiMU04m$kr9c>s*3GgHi_C&0v*vG2na9=L5M~lPI zM^FeNiWwPgC4t=KNKS$xxCQBfn2X@P9Pdkn)k;)mJF*^0i)MT&Bd8%cd5^C5LPB@z zGwc$;b2N;)1mZG6JWfgLUseor+=|%F1KZ#@)9G>j$glqg!s-HHWof_W@&y*uyde8E zPni}H6x_?emp5%i;mJD|R5v)KwPFI!Iy&-cRAk#ydHPd%=0H$c4s+on(M?MroORkd zAs6tY8ZKl(4Iso=jiFh^c&r$jRL1nAAu*=8(*^sHH>2W}-JM&*A)*ZJ?p*%DBDxj# zYKYQ9ArVbx5z+ph6*HDaG)AU?Y;jo4L^WlBb3BM>D&b!T5&0d)+DD#>hHn%;b(c0S z@c`bf;RF^DZBC_NGKWq8Ugv^V%v5;+8vixHD{UouWJNTTq>|7qNGMhIrj2XM!sa)6 z+Yl|GZHCbO)!5(kbpQ(>HBUB#Z2E;&NmN=}Le7@8jEYbV*P&M-81SYCCb* zq(*%_%<`EMRuxfAv&h?&Wo@MboF>V%chqHzXc#8R{HDkHrvU%1;g^Hp)3RPdK`sa= zt5KfW`0n5V85RSzXh60E07yEV*rAyd9r#l^*m63Ch^N(|GE+KPig?2J}f zDfk=iLSLM&PHn5ANeFr(cUPAhVa5{bPT7r&@XB-|m4-@6aNs>0mDVQq zo47`b#D*df?^mQX)i4Y?xl-KAOr^jy8I`gcR{iyeTn@-NeHR{%R@tUqu1Pe9A8jC^ zfjhMTK#r67X!n%TN?lX&=9@_F0_Mv!d^OjTI}Y`ftLo`A*V9#c9*>DtS|<(f|}JE)>iVYAV?;IP!Lu)|xUZ9~_)ZWqZ3A{p2D(t2ySEmc@1l^J;Hj(li2bvRmG zoYvoUo4^rd(wD$HK*7mwQ(^l}g?-Hx_Ax3fkH~ceIT(rCq#%N9MGhV&3opUM< zoFtBdY;1Q$i*15yvcTDG(jhQEQNxExC{2k=oOH?hPP~(&#e19U7LoL%NZJOxw`+Ji zRiSKyc92(OOs>>vsAbttR_5XqHc{m6=QeV;YrIH`6G>S>Ge^U9xsC92i8?du8(bX4 zv5Ql;9F9tjQ-@pRnkbUyh@>Te7i$<6u*EWqL~uJq5bw}ghlfNff@Q7=BIz2D)E9V{ zYZ#`G+>t%Pw2Sw+UEm-=<`cPlK(3~fTvVe26=S_7(HjR{V7>uiTL^4*OPq_u!(F3g z{~0ZA%)-((Y8al3(11q~>g7OPUR)u4cB5+(E$VF=T{@}^tWF?&mB2U3+0>dwi|r-X z%_8v~k%-HDX)h}{Db~ojz{q(Y%eflt&m?lsfZT0Pav9N*dqb1^SYA)e&mnAEfo+Bp zTeORUw8O4(B5}7!+^?=t%_nTn1KZsWY=_Q9%i9Up9U^&@NWKN4IH_Tnop6)0uF|5& zb5RG&vv5HGuT!Bn=Cf9|V55L+pXt4v;ebEa@Cfd42g9^7jh?KOoyz!7REq>6^KZ@F zEWkf#7+3Yd>8>2irQDcHfk#icAtQf_!`?D}@^YArenX4c)UP13+Kzs6=*=i)mhREi z$IGTP02UFpGXUy2YoIDxY;bLRw@A5Pq`*`x9cN@Jg6+>@zAa$6PeI^?Byd$JYfPo^ zX+vHC)j@h4voClCkqb=Z-(r(tyCDUL6BAe25 zvV@XY9!pOGzAd5OE$etG{pR%VduUy>71dj~W{Z?-MM?#j>SH2HfKYZO#(-MZa9r0t zv?5x}0}QgMz&y}I%;|`AlxrNq!Rbh{$m@?5+=mEaw?q~=2}ZSIqUJKj(6|Yau_iLv z^!twtLD)ZnU~dqlgOW7tl*krNf)k@H;Z#EdbKmr7CNk6z{GJJ-kCt#F=upfTW79@~ zp7R3qq2bZegKdhcs~goFSz65EJwY>fgeHWBQ7KsK`o`P3kq zrR*lJsSe7k(8grPa7V$1u8)@Ym8N^dgVZA?f?-L{0kH}qhA|(+Zj^mwBD}H&9rvOR zb&i${4y#m`jK%BUkPNM%(-r~nI?=U=7Tq(#RUy)9h_qJVdZUS8uM=v_@=QTTZ;aPx zm1(-=eu`8{01u2I@pf~BhG~8J4ini;x}k|v8Ih8Q4o5ydSq-pxUm%me#4{#X6sp6x zSAc1siM)!gZ>3d{$Vf#Lv!=+ll|;Alxj zFisT93yF>05U}&U*`a7>5$PWY*Fur{x=8&Mm_O8!v@G3)+}(Ab4d7S-S6EtO+R}yy z9sY4HV>$WX)O0;oD`On$_#!zlERWwMeuBk@La@m zCO40V85pnCPfsEp#%mRMidt&AhgvE%RlI>l1Dt+JPd&#L_D0mf8BxgsEzinmUl7d0l-KJa7O-zXy%ORXYVZ9N({4Q6P!Cl7(sNezOV7jHFHtRbw}YUdRc%R zP)?iv;7GGSQ?c)bs$p&q8}`>L_TA6@jr{}B&f7D_8)Ku6V1I&%^fZl|?pIiDWg?%T zi%@_WV4^6Hc;e0Sc7n(+RV|XITp6B|-Fo;FlwA_oK zN5ghk4tyDH4PZ!B7XU8CaRZuS29dgr+N7gG51ft`-GjolL1fMmnM+ZCWhR0}Clz-X zihH@U17ciN#$i~sWUMj~UbdvqrQ)KL$kP`6d(Z@wkUApuz!ECG8!j|a(+;h4Alk)4 z2FA%JMdm{ylX^bJNfp`31Zsfd6?vdYbA8Kmkn0QgPmyw)Nx2pgjF>7LZ=|NLW`4n# zOrjQr_kZvdsPGKVA3bp5;Nh4ZRAc7|9R)u)-ZeV#RJ4-CNcyzM+$%Cqg7$vldPex` z2|pHxP^2)j3ct)t!*M}d<{W0>Xm4FB%Bo=B+KiSj#(F({Y^CM-1MN~@N@&d~TXEQu z!vYSKviwxIo)VeQicDB|W_)HMySQl{;Iaqdtg=`(kVPdhZgpt11JO=UGcdlXG9HwL zB*R+N7*C)v#yQdTj8W~5!%byVx`Ziw7ltd;p<>lH<-wMN@WRR zlb{&3u+BcvAxg5Dv4+xk98ZDyk%aae0A44$Xy*IC;{KJg`5a9{V2OTl)_pgptZjZAgOu4Of>)%4r&LY+ zEccz9vYz=77ZfscO$3K1!c(TGle+tg+stgvQD3+=3IAl_zY{qwG!gtJJna-0l;a1^ zv4C@6OxrB{mBPOPIWVTF$kUXgeFJ)6eZM_u8)vnI4IZijIQN&@8>q&34;6%-pNWw0Yd1N8R}9P5wo7~G)v zI?@umABL|InBhVH#oI7W0yNO|j42!d!r}=OF z7%iU*gln6~S|zfc2f>9V@)q-XH~8#i^SP0$>ksA=!;;DdeV>V8Nkyud&za2Um2??^ z7)|a>$bgDG4h|X!HnBzB4t(QTs?svqD(J9Ac`Mpkbtcw%&xx#IBI_P7@Pvsx!ldMC z8BarvcRzEC{UW5PGHE6tvdKiSi6lH%5o2m}@*d(W*fT;Z3`mN`9f)8Fry{etkZZV* z!{rc^QPvHWvqTP-7ob!fS|O{!4ynF2Sq^?Y_TEs*t-TnRBXZCQ0%?;jvYkd|C!m_cNg^g z7L<#kCX z@k=8wRn>FpexI3Rx>bd{*{$+gw!b%StE{R879?soi^$pkGq#P6a zLlBr8)=@v=DnEj!XVu3N4DG0X1D~6O0i`BB;cA|kz@}(NQ2P*ZEM=p!j0aZu*Fe!) z5LT(sXLj|PclGv~984K&VVJN^I?@m@f2GP~={YbImi3%MljD_hrD66JI1e$z_o&AF z{XoR+sKnyvZWnlyG$dAH3FKwCd_uk!9gz4Y9$HBEB=0m8B#FyAL;v9L0kp3hd4L#E zhP)rs{bU)5gkf$T-!92V!$}Lt_YkFIQ_4}0c(Ne|Ng)`|g#cxMGrv+YKe0e(e(2AV z`L1s0i(bbc=*8J-9I24c*Z{>Qs{!I3D86`!SCgGez9%SEQRggu}Jnf z87SgwW3C!!+8+m}`arBV1W9rmIJrnK;!L$-N>Q}IgSE0te&PsuVkPS1XRXjrWeUJu z1zz;*jL>(`YU30Bq{|I~Z;ClTWeaS+4|8x*9o9=e;7)qJ^TRb^|KcRCM!LxeNW+P> zx-Nu=W6-A8BJk}p=3S#HKL#GWkh5bGvLntdX`ok0TaBa$)sJ(xFSEOfv)Nr(;=Hm$ z@8bnZ8%AmPCL(DE`Cg~=n<@Qiq+u&>=h5>}`Pc@7%)S&EH$H1FKCs4(L6Y0(R_L#c zFGg&1D>QMbRKGe+3O?XFwu$rz!ON9d@4U?;i3!PiZ|Vtwe<~J8^mMfE|2; z!|qm3+CjHJ$oCwjzE5ci1iBWQ$kU~?rER#}7GtcjlqaY2msiTiSBc+1D27Ik&~rTs zO%Ac;q#jUloQC0S;h(_HJy3sPomX~Ih8?L-uTuJQNi_FvMG;_;I4RN*Cq1wH$)+xvMAiyw~~PWK4p;Lh03%j;$=o&4yS8mWpSV zlXz#Edt27?FM7@Y6^7Z#;Jnfhiq6@{ia=%)<7>yY-EA=L*N>>K(Eu@$vE{v z%eYEi$ojW1yGOvzy(jK@zgKg-OTHH=t(MYoBzp3DhS+HIuQK{?6aDW*4qU?mUx2_% z-1_(SD)4I~V~IjDfT;v#_X?0J-0VCzkUx^Il@i8N!c6G@lObloGHq5QZ`VXqSpzNappZSl)u%xG3tw`R!p%=q?;HXZ7$98?dTLj`LGvGK( z527&naXlrhr-buC3^arsij>@gldF2loH1H>EQYB;uGypK9`;xuQ-+$vwepBtuZATT zqCjF0r%)GfkJsm8YUfenEG zMS=$271q@fZKNX?(~&o~t004agyikScG!Qf%Fd#r+OZ}~1KM!^S|rkr^T|MM0TqiV zDxM>4`LDx!DP$y7oXl{*JuNNhRU_Knh$dnoeM9{mYyuiEYDj7S}Hb2<7n8 zvhvXpvIAt;qg=yJN9*1;qDM_*W6g4{Y^%930oxJr*XrZmSbiHXF5%u!i5dukZTc)^ zde%wkCbLE}vW_^y-->B?lq8kV%JoKP1lFjS*<|n<+%__AZbKt>8I&KwZghb0m;g35 zfQ<`a#|E(D{8+(f9S`{rVoq!umD{kWc|k+{AyRM~2`gQbGX{B~)t;Gid_&zFR@_nZ zu`$sEpWwYY6`44*t9 zI~|vj;rMA>Dzdn-2{HK4Y*c`%*4DO*#9XV5t%eARj)OKG)Uq^of?sWDJF&2`sfiDk zoLjS?c5$Q4K*hJ>+9nJKq&1l6R~NONP+Yx$FZODvpFVT>^c8a&8>(9U>e9A}y@uA$ z=JSwwUnM`<+%}=-@yna0&uMIIXoNmE++1DNHo1_W&8%&hbu!dmAd#u7_`G2OJ+KEt-Q0Fu@zM4AKzlZMvz{!{> zoc0Sp&XLRidNOP6%&4v$_ak;ApA(dxH*kW zYS^Srl^}CRFQ4AjJX_FVQp_05KBi$_C3~IxaW&2J`SZido?{oyX{>2(Xl$B^=RL+Z zG}Ja#S~Sw4@f;AfCvc%o+slC{9kQxJ`cfW~7`R&% zv2hV9V1thRNgy^(<-h^rI-^~JQ(ltbxL6jEmI`b}oUJ%?!qhfOY?0@S?W89z5pt0s zPZ9EDL)Hq3vrl1-y)#HP6Q+$U+NaSqY?xuaY{T&R=*Bkt1F9mSd1J*-HC6VuOVIQ~ zawnC*hEhHg_^H5;B*{V10X`OemD7yU%kaGH?so4_Z7lF824eI}h&^YeDQ-EX2uk!pS+n6bPg#6Z! z-wFAJA#qb6n0#!=PlWuCEgv*u4p~Q%H5lm88Xd`&AEkRgv-HXI_69jrp`cN$i8=y` zaQ`HAoWLXa&2e~R{%|NTozrRsVS}oKt3Z((Nu|#-?6ZzxZ`|cLlG2hHrdDwLS>U_M z@a@mZWhu5T%MD^XFiP!fo|HjbN|im8L5miU^#EB9BQ>XJ^aW1MF~zQOG<{KH!#uk% z1vRN$mc1C=Gu+JxK4X|%4plBPs*Gk;#yP4SV+4;f$Vh`64N;UjObojoSFC?Z)|XJ_ zERFubs*ElWRq9T5*>r<#H=TYv#cL3jQl|@qLjtaEeGLlOSgk;7=Q@EuHPG%+>IR81 zTOgboV$XmOB<&U>tD{Hn;3iV9mKX~J&KEcb(O`yi95XDG=W|Wcag`v1)EIK6kW&l^ zUy8RUieYx5;)hX46b$pYMw8eu#~Q;lH!L!_^Q2MMqF_hz+Xzgl_XxyYoxtzVX?w*4 zSNE}H?scMk>7ZXojBNt93e;^%(5EK0Mf~NboeijG5b&VD2L#@Sa4^MAC(I6czTHH* zU&t+nyjMum;ZDW9qF{&(>PY{eizws@3b_X8UX9+$rkGGPb9wU|zHURR-<(EckH2gc zQ3MoJnm}o(0%1r zwAD{bFi2-%?=vL)D&!pCbOd*4#(6Iknh7*Rqd4Z6LQd#=NIIsom$efU+|{wSbE!t! zafn7~eFdUs121NKZ?Wi1i_UO)=(GxXTVnJn6;k%E2KQS*p%+jnmK1}_HF^u{GugDW zrho;TQ$e65jazubEuO%e*|n0Sc`C&(CFucLEDM9btVehe~|MHiJA&>mLXB?LDoptoQ#92 zaaigHFh#9KzhF~L)wK=1{6ME8*c^?Hblv4h-i5%FhWY}C`U0ryOE4d(uKy6hxuhgL zT>||k5QP*GP;UUa-k>aQbRyjrkdj^?K^_(Oh`=2P2OBu&ny0-f&mS_Wd{{_R>(Wr` zAjH(VG}Jnf_lOOy<=X;}lj~}OTWx#>TVZA&amH)~R}UljdPl`u92MciW>WfKfrA7d zsZ(^19h~*08=VNv5(vcr(W(Vj3H0k|k2+GWm%@Z^Ywfh9pX#8iB@S8^a2X+xOCbzt zI(#B_j}ze>2?WoI2xA0}7B~{oV9+)vqxIdAGpg5#K9$m{RddW%AHAcOw4RV!1z;zy_Z)Sy+!sXWyc@)tLxMkz` zoQOi^S9Dak36l)^;v-vc70P;}=z-S*(1#~>EJD2)N$J~}j%EG$+@9*C1OUozm|X{kr%@QN#pXln4DXY@By#hb$=VsGqAVqq?$W`SgSty~N6xyL!++ zwI?B3Ey@w)=2Ov5mRN|^6cD8hkzV9TWz5HP+|pkFg@begCG&Zs?{fxu)*#P7KT3a6 zQsBomWqd&>T(GLNaV)A*$U?{Q7%!}W2Pp#IS*X=E{tTO`sYFkX z{JRsNPP5g7s<;9$q=_;U1fuzGqKpFq{}IUD1=#64bq)Vqz$NuesZa5osdEDQXU5sO zWyTr=Mgp__Hkt9ako!dED{@#jgN6WJ8bbR%TimUcstejf6N@)+T8Cbww*#& zQl@ihQ6_pD%PCXm#8&k@^R*Mb#R^`<;{bkS64v!u4&L>46AYdtu-!)s%Q{a&>=yW< zz&irsyWYkR_=0f29|is(@Pj~*Ow?(-yh`A;nC`aIfTE4ZC@FwwNdcP#E`oMDEi1#N z_y3;o$h=JApyDI`a)HYPV!+2U_V%o=qYNr1LM}1+xKv1U!B1wRkPV!z)<7I_6?1_c zNn;&lSHHGQouyOqnE~VmKCZhacTX|#UtcMVdvThZ4i@+OoNFHwE z4{HY;;4Xo83cO7Rn4kk_VvI_&NnB$XNK_UaGa{oe28g~G;KKnsXFVbhFoeNlbeaIs z5&_<=S(;9v=sk~1Jtmm9sw){d(;R2*;_#C>=vjezXUckk9|WdsDeFZi z?(+`%oTDPjAQXC4Ai8D^?EtU%5 z>s?)Am+VpCMA^=mHe1O9pSC&ol=;t?G`p+3MHxV(NP&EF6>5P!Psqgsui^#93FO%= z1b9IhF*6WPx{Am4fTgp0NrVi6T?BRu*gm_vJjfJ?1{G2;mj&2Kv*bxJ{RjRZaCSe5 z+{LNo0%IH@We!^Epd}pkWiAi@wBqg+U4pWU_`xqusA2~#bkIJIlD$Qxa)Idr(*!0% zHx!T$ok-}uL-`at&$BUn2HDw=Xh=cYD*==pD`dEN8zCeaGKk46++fshg(MJ;c8I@$ z;%@c!JH;8U;{kV z`(H`lX@%IGH(cBi@(|@bFYq~m&!DJ=oaop9-fxh+fHDY*Dh~LXz!wF+An+-UHeW}x zBfKOpb_slfUvt}GN^8ghplIk}HNfMtMEKgL1b79^|48!UJi2@(0hVTgKO->R7qPoXA3T zg9Jmz0)e3`;G+Vc7UV#b;;`RK*tAyln;?#(&2#21^L&B$xd$EX4zMnH@a53!ErIX=z+Zz}TcJ=O zQXZNFJb&FT61i^(`LZEV((u-d2Xj#iLEdlPqMrfMG`+c8R4Df@E>5A?L3|@67f^B` z2z&&riKDqVy;FoK0=^n?IxZV^O&5d))=4aj_c!a}oVNfmC=ZnlaHhcNIuYn|ATb@k zlegoXC*jUg$b@pjh! zr|A41h(>wW2}Ji6IA2e?(+Zt!qA8x)(2C{{l@REaAlyv?d0q;kPq9NIh5yGSejaKC zV!}xS-XZXIfwyQbX9l={<*6VrQ!$SVlZBx)>gWtdlZ6iI^tJNmGq-%bFc93VYj)6$ zt+-Py!%o3WF#6YcA%B*`4YvN6@+UhFCJE2Efx?Qr^jOGjQJk$#dG`psQ!BhtR9)jR zz;{^2e)SUYE|af!3wf&{ZxiwcLt<0}-e&qJ4}KoxRZ<8Z=Z_ruw!q_22%a#+bS?zn z_CaxNtZ7{CzTOm*p|+#4aD#KmH`MbtfpZwao|6Iq|8zG$X*Rz6Q#Gk0~rsyOPL59d? z1;79IHQk(%xDc%M&^sStpDzL$ZLzGAEo;8rt@(~ha8k!$DtS&IKBWf!r09uPPp~Sz z;2NM1G9B;=2&Q~zw33feAs$>J+Vjk2+1Lx89e~dQsQMvK9aJ}LA`AX+zu0q< z>{8pR!UCDv^8`GKLw(+@>vPZJmFfKUoM`LZbAmy}BXDOGtb)yh;|y{vG@^WT7m$)! z)a>QxIYr3HqWW6?6tPPTb-^9wVe1T$ zrB(k0`&8^bh5Gh+W^IL?jUWAo-Fw)tvlH7nZUW3{vx1{-)mJ&HpJCKE-5_fSM`rX~ zFA$Rvz?TSY64iUURbMGDnoUfUMTExEA+)`ozxeA?ObU|T&0diY2P;rRI-#(f!eH^rR+s=Z)vJD7ZzvduVn#efx{`3N;^HfmKwzFuk zTv;9{Pl%T%@yuj69uzo2dOE1n+b+m!+gUsqeqgri!g9ppMiM*67;~aI%Yg+woToXw zL3FF)JAD6-_PQY3iIIii`G*PK-3i{!Sgfl-G7XYpkS+#EH%J@%te=b^HF&#%gE+m6f=Nygc05z@b}a{) z!eFiQa-xGya8PzXlM%3mLoZ;^;=DZGL639LV-aN%0yZJ^7IlIe@0y`080Ul=i!duC z%<*cRJIoj-%xIH3vpb}~EUOim-5~`>n=m5`G931%0@=C}K9#?H?eZdZ+1+l1Pcy_< zoG1VE=1GI;y#IBceL3+?D}09ITdeTOfgw%7rR*B4aNQFQwTE2cPOq!rd~l=!XSK25 z8hN0P%L&JXpF&fQ5LbdxAlH`3qpJcvvx2MT!R5{aw6ch_$$5ZQ77s2F2)_y({XM{G zT0yKw*niNL9i`L`y?3y~c9a5i*%3{AsX9tkZi;q-pyK7797r zyhYy=ETVZ@_c>8d zk|6k`339OU9q=I?JV^()f^j?*p5jY=z$XN@>k!>+hMeOOd_EMeIu8nP?k(x)tqVj% zmb?y$Y_&prJ3(;AdnoljS+m2nwpJ((hsG10E)Nv4kK|E9pd9pGBoAtx2X*pbf%9OY zJebF@0KHp4^lky4(vn8wNB=?bVL-R4M*~U~{3bzvvP0l3Md!r+-b?shuLKG4gTOrj zsRg(`6f$s0IN(bHcL{tRtRRS!$$x=_eJO8W6Zon?Ua~^Sr8*>P53_n(Aihup{<;ou zx(=X;6{hy^LrXPqz+T-Y`0oNg7x@b4{Fs2)2nsfi#WEiqG{l@h6)!t7pKZ_MA?{&-fA!YW%7)`R8|)%s+o(tYcPt zd+#zrUNnd)6uqAZOX`i>f}{iF`--x9P*zV62MtlmVsrG4zlO!l7{yITpV}54NeW$G zD>7K2!;E8I6?&sqWT?ur*7=l$O*)aW zhQJqY6q;LNw&}@KMqq&glH%1s7T8%0;-5s-pMR27nVM>ZnW0jj6U~#!2AKrb)JJx{ zM`n`m2g0oe*$U#j8X}R!=aq^0*>h$to+tYSTxB`3I}5~GlNE+pR_q-}CE< zvBG#67{%kD6c0#4%>i5?MGweYgPdWI(>Y=}gFI7~7u%5wJ4<9Z1;kv#WqFxldzy)U zD#sMZYef#V-ws4oM~v0{YP6K)$gzy$>vt<`sFY>AUd4|lfNLZ#g-MK+fwJ6ZxiQ)@ zgDf?OS&Z(p*gQe|lt+E)C0}tsz)zHY3}uglVP_a(78^ES7b?fFrclk45*;~PN_6C0 zDbbPhT_w7YnI`LVi;;P=L2d$L>LZ^yo`hm+WQklKqzvxz8Yb4e}=hP@iAL0;iGhcgjhnoD3+j#t?m3iQYwl{T>}$ zWaJr=_uNPzQ&u8V!e$~7 z2gT{Cy{T}fz$}4i;qW9=3ug})c`<|qg*$@!f)4-Kq01b0r5yflDA2=JpoAZ6!L$y3 zwlcU;g<4^^IWda);e+59>1?4>E}Wu6omq^GEChL?rigv=20V@7l@ zMJH(>Z;8%K|y~ubLZW*21ii^K=S}dLsrEp_{; z!#f93Sk#LjW+OdO&XQG8fllGyffN=E7JfbL1Qg{PB+nqZ62Q!O6m=D{i=?oW@UO?W z)Z<5_u*@cMiBnkK-%cU6Q1aJ&hqgRX{h*2dgPMg`F!dX-< zs&UwHKQF2V3cPJAFr6RF78emE3Z4KL5$;lJ8V9Ha$EcBxgsA}+QDhqVBGbqhnMS^7 zlF5b>L}k-0DHn~7@Cr(3g(+z6Y_MHL)N(rmtdKwKlwfdJ zK}Ginyj$QM+D7YiL0iuWS;_@%m1BoI%grP=mEsT6K58y2tyw5HeK=}v$4GB zK9j<265vil-X)}b$PslVQ7G0zDfcC$@G3)m!YMq`tdKh?{CAb&1p@xFLeq6hi&2b^ zq+*QM0MRc2ds5lwKD|X)*UuqqcCmE(qjfvF;*8ZFHWL3O_R=SZrnl zi_`3+6{kvoctfHe3Hh;-m+eFmly@TKO+!j|8e%!8bWnjz7w~t~WINy1R zp*s{p{RKSUHeiX9;B=5Sh@Vv$)a2`Zi|!S!rf z^ict6(6}7L|C+fgZslmD7a#~iR&z)zyicoZ^Iz#^32~7QF$Qyw7s~^l#59R7K0_Wk zGmE9j0kFL|Q1DAHkq0f#gA3)s`3#F|1)_feTu7t5|d>KA(fA z0TS6t~EO^8}tEaFIYgOBj8&%^vBU9VkWr$LxOzdRTrcLE{OCx(}G{TG$tQs4@KJSBrfw%H+txXszmf)wg}epo_p6DZ~^UN5*a z$y&To9-Jj`jlk0cuF@iSwn+bNg}i|F#n(w7xJzh%roeRqPgkZpR=idotTqnkR3Xh! zsCc=MrW04(ETozFEXK4E7@L{TV)P(EnwihyIYOG5&*B+Enr5sRH6DQ{7`YRL9B0U5 zg&f0vFZz8VoYeX$<>7iQa2P-ow9tSrPm3D*6)%|A-875fR;NE#p~(Jj1LK z8H5BfnG+Dj>pC2H0E#7&v5#T@8yNOQR~pdAu=Huw)v$V!x#YXJaFKyY#O-cXH=4ve z!4U@-0}a?NU+8eNnUl z(;1dYYDypD_;psyC^geAc%^2Vu=FAGWQRc>G{^%6F+G-2(_<+$J(g0l5xR6MN-34f zgknrHQ3VxVK!q5v#Vj_&wOo?t^fqg(I9|h)IH}wdvv~i%yyNm2b0Hpu_BW4$_z^Nnq2Gbn#N-tW&XJN5 zrR&mc>bslYm;S}CE@EAlw^||WcjWOwe!STVX_rVb{235G?~7?#MEXUFBaj0I`NtrC zbHwcoc&C*9LrLFfGbn$J8I-3o?6+E2{wOT>t31PEAIE;i6+8SVUE%2{quyTO5@4#y zfx@&^V5~6xlR3Q`;AHgS8WZ!4&1+B(;q{BaUj>#6?9Z^@6#}mm7%nh^Vd)>t`sV;^ z5a05dL{?}5Z|*7o8EqYhE8ioquf#;T2ggu`rN1G5EU_XVnMD1n%t)d1XHz`)8005| z{AiFL4D!7}zB9}nFna+!H zJYlY(&c^k!!NLTl11o2CsH{RB9IaXOaaizpFCeH`0*wyzILgMzgOSdIQSxB8^I(KL zsCFILhdBb_NfDr%4q)%XR!7Q1bW!jsUtkX%z-(OH zq;yg-*@Ym50{aN$0X+=0hy_8EPI{TVDiv6y`Wo|>$OAL`REAjvFv~S>wU*rtnI&({ zAf^o78G(6EgB81)=twI3nhL)MajGHy;^I-Szuz$1_N1(IY`A0BScJV$R_qxTRr2pT zi+I*OcD)rl+oF|5{yc-sHHcY7Dnp;Up30_(F6ZGe0V=wYif)B2=Nn=t>(Zd7NIU9M z3(}NX9HKFbC0}F_PbkM;Vo^W-g(0ojC15~h=qFpT^@3hv^tjj{7a8P2gS1FUY+!{l z*AZ1waS9c80dc({%2=~SN66$YPGYE?vt&-Ko*OyDOgCDzf|a@1q8k3a)uN;M_jW7x zY*^h$G|g0*X{O3dGgWpU1X0;tqRbYep@iO9@oXq_uOaYl0fjbJ{FgGd&M^_O+blYn zMQ^vLfqx&c2s=ou*d1&fxW7i~i~0&X3Yu!G);Gl<$p%R>NTP)7B&t0{bTpL&QAr3? zd)g40tXk9H|1rsJpHO9*(AZ}!x{5V=-lEg__eERdm#o-3VSFR@D1!_%$dLv)0@A22 z7K@<78$_e15joc;cZ5+?Sdc4a=DdG2hi?Pn%Q`oJ2o zYLG`H_7+3lE95<*<P5V$FaSRM_ek$M-CRMg3X$Sf?Bn~q<(8C#c6 zme^)OxE$RVFp~-4IE*?l2>OZo{t9g|J1j)M7}j>}5yph}y!?NZ!ethn&nm32=pz1I zWzkyxJ=HFHYpMJvM&ANEDmUHDa?{-`H{H#0)7>n`ydpxPGD4pXMDwZNTh#A85E~8g zJ1e)&n6hJ=EvFG0Umtg_ZOR~Y1J+UhD1ngz!*prfgtN9--_2GKx94$JSaHi>P&MOtV!ov5KV4#*Nzne|g*;ZY zevqi1%AcU}XQ1^CLwv(pZx~=J-O!R+aPoU z^?#62H2pwL52U~8f%G>$kp5<%+#fCjA-9NbyNH^o|3%b)6LfpY5UBeUy7B+EXzlFf zPVX&lw-vOKwR+VGI*or{w}R^U_f1v}4eLhgj}1$(tDtWi^Sxz|Hx2TJL0*@TuZWhP z5G|(uA7U~DT7GI16^gYy$5f$1vfXv~QrzddkYcqfxqaYVfOdo3I!g;>(NvNdie;xU*KN?|3q+v8R&$Gmgjp-3ik>5 zt08|A@@GzPJlfBtRB;4V3<81nQxlUo!RP;v1UuUedhl1-yk{P(r}dm({fE^5hA|-S zg$gL`ER$4h0B5Q=QQ$a%lLU@(LLVa!Mt~jedE%iC|5=f@*cPaj*E0m7Hh|j{9kib; z;>7cIn)rMy;>7m|4B9HVb%;L-T(;R<79b9;(n)Z{ViF0w%%XLL8H!Yxp-2U0JrTfc z(y5pxr0GOej1+RXm=z7!3aV(QiYH;#QHJ=C&3bWo_94EwW0maS_TufWiB@oT#H0$; zJwUW3fNT_`=>#j7r*`5eTS33@?@3nt04v@!XB9V@a&x0WZjjifm9E$P2mNHsC`I1_>VzfJb%W9KPz|u7|;L|eLy&EK<%{S8?4|o*7_7a zP7S|JR{XJ6{BT>>0mf+$Fiv{_oHk+`r#%2p8>Bex_!UHJ>4@%h1TJ@oUulT3to`NT z-4D^eqtRV{Fn+ZajBg99_|vT5eEvP%3QpnQwMYnz5_&leIFC_uSb?5vR6WNa8x69- zAXq*?$TOv6V6b{N9hpi;VqZ=C1%}{j$9C_wM$QZI(ekkjM(?)n9RuXP2nJ!ht^9AT ze&<>J&e^@&-{$|1uS?|kSA>0YOC?TXI_R&o@_(}Of56R<)kE=E^=43DP3=7lAE>nJ ze|*e6)!-mx{LY#oH$O#%O!T+6<3&_04*JH6kRwipa%~p9xeD|U+yzBnt<*t6#^H_+ z4ssDLoR%<~e0*Lpg4}{bnjyK(ig|Pd-to(rtB=;9@5Eg%{2-{9Z#BVhVd$gP90rk6R@hv6Ete3H51t?)!gkISF4aTZthj32AIqY` zU!5i|!`r6o=n)B1^qYv=PLwx6yO-!Up?}QQZ&YxzFb-QgOF~##O`7pAc#*=%2!wy& z9bI>}L!q`4L^*ghdqIO5+9-sT&kgFol9 z^|od<@)NbrH=5(A?LM5tE+(?hIR)_`#Cnx)aDlKEU$yY2+kI6M_!b`yxkg|}iEcO! zp+zV1=_}%Bh;M}GL=8UsZZ9hJ=`4zyD3|SE9K$ya45=E5B*(rC_QE3ej-etb=4`QVtpPHBFcKiKW1?{$J@k#q9fK!qzaRK&5q!F}W3fbvI2LDj zOB$o+jMqUTK08T*M1DC5DpwC34$WbaRviAF?+fw;#kC&x2zsm2k*2a$wp*PB8luVH zq8@3fv^oX1`;}acrfyWz+S}DsTy}z=G3pq+7>WN!uu^Kc8dj|asiTGt!^OPCqKI>y zZBSf_2SrAkenlu08Dj{1@PtDJSd%yi+v!IoRom4fsL-HlSd$r0%a0Eia38{?c6?Yf z0Thn@hEB)Aj@Y`2+g{WNSVs+0Lx&+FQ1~1Rg?Ug6?qB!O?uBA-|C+$swM93vVmT1= zrYQD;I+Imer`E9O)eyZ(t%N4aRmxB`QB4r>!yNIkhrc7h>eOgP1$!aB$tKFPSo}T~ zkNeitmm>Z>bt%NRt4q{HcyC@CD^?8=`$e%m>UOA*sIFx7{OWQTW)m(yW-VLzn%s@5 zGxS)kR*4?2OB7-!dC=o>GkAXmdR$?MKUt4utjG9vjKrf^5&Xk>tLmS2^^f|qUHzec zg9bmdJ*w3n_0v%GM!R}LJ<+cEsI8*uUC{J4l{`eXs-9>thN+9yMJPh2xhyrpgNFAI zO`@^_D(ejm+lVGp*$OJd&Os~anwDW!rv__i}JvBmLm zQans)1X~mYlc>K{-Y|8a+6GltyHxqwgDS5O9Y>`nQt1?^@+x6sqV#$!TC*yjvspH< zG_(+$aSF3QIqk3#E}G@6u_y&?Ibm|D6O@UwC>F}VV5(x6dRjdNZC1Io+3Z0ZjB8{f zv9uGk`OFZ0XcHXHhPj-DP7GwyNQ;JXaT;b33OawF#8w%s`c_q2G(aUnnM`%`F!h#t z6UwY~DRZs|Wqu{XlxriEG((x+h(=S%161-oD^tLxxs6563n+6ECZWYB6Sb18$~ZNY zRT-&rp-PcDahUpAeFarkxK!zTcvU(pvZtiGw_7NZHZhV_8OwHgkVT@)BDsVDa{`Pq z(V}BSAG8p#kC>(kHj+HTO;*FyKD8IREO+UW??IPDqG42gIu);lE=fegsdxvK_*j=k zY?kL(+yxSEn38$4~rV=Tqu)a|R!1rQTL!q4Xmv8D(yX8VDs8xRe;^L5YjVw}-OlQZ{OM=Zg(- zIV-WKrP}IT4rxIl0VV!|MlAm~^foY1Q_~>+MRAO0s!-zDDXLHu>*qoNdu$AJg> zb0hYNVHdCsxJ3v`)Z$ev86M_Er$)&bVx9@gP_)}e>3Lsu(Ep%F#B+s}5`FSY(Bi+*G+zE{Jb#Z7R_ ze*avT7SDRH#7^^RSwCp;IQhP&tnrkE!&>m!6l*b)wdiMSQDg-ra6t^}#2`|XIB3xU zR^o3p5lY+#uk82ZiXStEiM-W=60exg>i&Wfui8WwHV;|h-MBQI!s1LvVz3pIBT8f; zH-ciUpy(mhP)5yx_$Spyh@b6;3yNqg6fN0;a{*w8oX!3kWb)t zl&Wf|KgFfKhmKF@efF_F={~6cmm%VzepDH&-@^LTiTWxP(-T_30#>k_6_gGYQ`OnJ z9Ce0~PjZPbKD_l3!ps4F_*gIjcLeIw{IE68ir&NGuVC?*WRdM#x!7&hYp-Y0_#>cbp2`u~>=Dk&fXW_s(NbQZ&%JGv2zr^oyM6TcOnkfkT+=JNB z`ihf%kUB=tkPrxse}{$cV#YfqCxEQueDL$5!2(#I-(T(6ILt$DFX1G8y9@d?2~#xs z3FLK(WqI#1U+F6-vY>{J>X;a9(3MY$Pz=t3r(J%v;zscbOZ zpiwwcUXW<9I=_Jx3Ax=0CurcRt(mw$vL^%u2SHG}ThMq9nqQ{5cT>fFL@#1KVL-aO z_=N8Dz~}0jq_&fSQ%<->qu*+UF?bbyD=7uXy8+(RGNcXvtb}aj(~v+ueJS~L_YAp_ z>U6NVN28b(r;sX>=~yAbt8Mz#dZ71dbOVQ~&c=6voae7fs2%#%Mud7uqu7B(AwzAE zY)vcv!oc!QB2Ez*LW%gM1`(dBA=N?(Ymo_0YxD{(FTryEcsnLqyXf+gT#3hR7`n8y zsXSCDF7HE~!V|jNgX!LwMe2J}e?Zoof?C+gE82CEo#||}3&nKXaARi$t1$*yla<5Of!eiP54}+-C2%`5#Eo2cNO#I8xOPGyytsJ!;d=8v4bSxC(U~RSAdbsa0VFm ztiG_NGEk>NXM14zr?&gmV7XVL_xdYQ*10zqjCBQg@-kJ@?pKA{%e3G+LDN?X9d|eZ z3KtAxAs)ITiNofS zHG?c%0i8Hpn`b-QyEohW0U&X%d9`Sq0FD?;6((e0d7D#d$NdFUS`ZfoQ-FGGHZnEM0` z#Q`un<(N!IAw|k@5-s58$g%>~pbspZ=*}_^Q=W;BYqLHCIZtRgNQj@^uB9+Fu25^8 zEKBiF#-5WMtD(!m@Oh1%hkD;;C60nECmxbByPM^LGjx~}U(sl(7!!?b8yEBl^wu!) zVGnfyqxd}z?=S)F(kje@Rv#{*Q0zFt$F+$cX%wTpO2uOWg~dnqQBE>FOp7Fbv6w>p zQ79(v62H_aMgx*RG*$8k7stgBUmq8WMkbr(Ok;DpQ~LYKMqtxbnXVK*+8<~ zd_2sYChl87e0AGB(DyHmzG&;4P$K%`Mz|y36e-P*nq(!eMQ%+B9y>vjGBx{$4SW7tJZ+jtTicUFdBrM2TvI|IzE60O9Og1OY^bMh~%@p=9IL@;1 z&y6u>h%s@8-RE+X-LH1RvOefSJ9=2GW zkzMX#OR$F~DCt(4yMm%KCo|liJbc zNnFoe9`|@D$U{StoZ=fn;d?0}2$EB69D7{ZVmQnc7Q+@Jv|G^Rd}K(HtHhHBZ=IZN zXTtqppJTJ{!Tx#xv%D0Dy9vd%VmStT=HdnRG2VsxSZw=VlSZ~_fp0QJZK5btqU2t_ z6DjIbiVjB7dDzSUtfYrv;FC?3brNTqTw&kq_bg%!u<;i;Cu&WWb&{`IlLy%^cOl?l z8^>mE3aK;R`Ax~PYWv-*2shNm-{5fd`Lh=^*4Nb8pKjww?!ZCUJjImI8t~T{iO`cW z;3sVdj&FkSApL6*Fv&NTBHpHm4%W8Kb zA1RUhOXQ`#V<~bTMb;tmG8rnZvnwsA+nl zVSF_xOf*yu^|$leVyq0|?R3mLFxh2og6DtX`dZ<|=oIbyAkB4%4o2^Zg zIt|g)YSt;u52aPA>fEk6sknAOQiX|k73Cl9V*b7d=39LeDXN&FW+2(yYyQkk7*uR`Rnp z_fmBYt9%tR!u+7>>Sp9&vM2c^-|-ZA3q@j|UGmE|jui+gu!$J4KxGsZwA_F-XrXRn zNhl1wV&+#vA-f8@?S`nLDm0C5;Uhd`!NC zX|ZnZUi|WRb~U(K?PME0%8aIfQQ|Q7%&9NRgQCCM)v^hS{$}Hs`MHDe40D|;_E251 zYt*l5P#&?Bb##@Qz9rRFpQo?LU zRMKvxgxmNmC|#xAW3HHj;3N;49p{@y(ZeYkbKxn++xUrG01{c;lSr&lzJN_h%63FMDVjixl)*Z5wE;EQeiTFIX;JLC`ICoGXh z)0x+xgC2ZU${PD>Ud-R8oNnW%+cr#kKx~LBeMeBpGRhpoQ%@;8g}W@ECq8yT%=7J- zCjq~}#;3EMp+2{s?#U-Qu=jBG;>o9!%{IHGMkzk!P1G4D*V0Zz#`5e_XdLpxHTy&d zK0hpf%s!>uWbxVLS`K!z9lO`#JLJ-lo?KCU&RU)iuZ3?->rqvm6wcT!8snVg8k`fnr{vn76?E zYa9QJnV*{H{umye{4hDFY4gXet@#TVH#JXhZd~5tZ*A?#9rK#zhQ{Se;j=7Te~i}s z2EUk3!->ZR8uMV2K`wHhT_`%8&pM@AzC{!pLa`X7r-s;gXV&Soyv8|Ai);B5NGqX} zgpKr_La`+j+aF=0Y@9zOvqD#My=ZTThdmzd6y4zw`kSD^)u7N>K31>F6{F9LFbUjc z<_#n6&Ilb?cKCvm+TGVkv6U1%6e?udI6lZgUugmBaS7|8l2k&wN>H8JF_)kPb?A#6 zSmZ%aq0M|0j~uLov8XpoSi*HE?$ORLmJWF6>!p_4#wx>Y=x8HWF{4|+sB?#o&4FqU zdJVGkCpQG1G{uH@b%Jc{>7Z4Ew6zQq*#ImP}7<~P{* zJ~m5RoB9EUIo)xgwt+Uav72=s@2vD!wzL5HTUylPeweU>8}9HL-35Mapl)fiu0&#_ z&CR-sTi&iu7`p3|LO+b0m-k&C5xOlvBWrMR{T_i>j|KjfWYb%AbBWdB)VFP1TBS2` zc%~?j)hYK#RxhV4G&_j>y+D}{O8wl9_aJzDVdGe2rjWI`v{9V=_af_C`yEbYOa0Eq zA4k?(VN*D3Q2yK0sA@4Oh2GhtuBLg`eE+Z(E-81QRni{5JNyp(KAzofmmWQNlFDTU z?}i12{Mb=?_-suJ_N}0}J1Fkab}LQU_)hlAzoNj;LL$~>&skQ_cCZru;Y4@6j}wy? z?OQ@PIw&p_NjcTdN0DGPC1h zK-f8`*imjqn>{e<=37Q_11WA8RPOFuPH{^q?sjI`g;~NOtIlqg=Xzk7=L3&qitCD0 zf>9PT+6+dnnHTz})&rwHzLgaBIK{mW-3o2|LuPpnv%D58tK2#3p*>6M>uV+)$QAp% z3S~wYGNYU9yirHv30#cwtD}%5d?udb4Lr0yX@0x>qQ{t4X?HU}M{UGsIxOd2k>gj` zSc=bWc^r75igF~Rc(BMQ@|{lc^%RdS2x-R{0^duB>rGiJ_3=!~`jA4_Q`Q%H`2ds5 zsb8YduGbT!R$_`2)@i;|Dee!7PXMdwHlEBi^eoJUVj|T_lx|qsZ2KL?6KQj798<9r za(4Ed`XwALM))nX-(fpY+Q~NFmBVca^sEzPg*I)G{k9uIo?_!YIOIm7q2{>6cN)d# zQ#`g%q%F1a5)OAxM-5lm@B9e2+QzvJcr8Foy9EeBT|OqQ7L@|?A$2p5!6RGr%@{mQBm|R%_Z7wwg_Hyei((`=CoUdSL%K9E%$)llZ zIOZ-?*P|UT@VAFnIqiD#t)cj1DgJoKy1@{&khRrHTx1Hv)96f2U>T{9(aTk1{yywP zE3c-d-E9(a9aou?m{V79D(TRj{@X)aoVMN09CkMM+xTcdcc*7DSFBQ^JAI_;uga^i zr5C+ur+WPDp*c?5Y4hw0{*T)@E?Te>r$a;oi|8jJhO4S}ze2YH_c8H|_8`|@a{BuL z54rr3&AmW%=Z@8K<~DoR;BsNQdNs_52&*3R(h~` ziKVJ^We9X>DCEL`gGkJju=spLGkOJKBMgC+EDE{ER#Y>^rBv%E{vC?{2m#{^fgL>* za&ZSm(-Y0hpAa(15WldO2tSJpMLRkg#!C#hy#znY<{oI9N@33dH^GmphC1FNb)oha zNmIpJxNES7wlclQF$xLMbF~}&&J`VMH3hR9v3S8Dm zm(MutkXFS)%pfCXx+!IgMF3cjM+Q^&i4ef!+i=Wds-jUY0Ul;i)6quh5?uyaXrnZN zZBM#HWB)HoG^F76%NEM6LCsvsvYv#jqnuAj=Wt z4>b#UO*_YgFC^e|<{g$@)1NoQOb+fu?q~nfRO`ONk-$ryj;jq<8<(b3jvqMiMH z#4IkJ;_$1h#ku#iSJS)c)%2vJ5e!T2!^F+EsdC*@?9I&rJ_zG?)1(QgW+qn3)pmz* zhcp2$7qkEE!aoi7P#|27Y4DKPBO1MAYu5JwwX z>qHi$U^niols6du;$oI{17!J~PbO)PHhsL=nYR8O;zx1fB~hz`mhw&jDq^`=_4fM_tp zR#EfYrGl8cwN>RVh!}JRG%^5KUi;^l(YdRU$1b+gj&l@ZQvU(`s;5GroO;%K1IFC zD*pi1kv^y#;TpvKwZ{V|j6=24o(zRI8DbhU-NQ^nwViKN*JJwQN-V;wOWf`CUmqVv zhKk@m@?QAnS9=sRHP7d^Zj+U`TiVCRv9!oS5=00rvV{Xj;#4)i!dG!a)Ez3TO5Nz5 zrTgpI!wE!}Kp&|TnF)iq_T|!FEr*GVMzjlB>pLmsQcAfD1X}AhO7&CfX!JAMtS-Zm zj(5!>ZQ>ekPrB?N-yM{)f>O>0@sJ@dLK>{d-kdNr3bNb}n>rolzgBtB1#S2}l$uMa z1Ht+!Ltr#n*@llZq04)A{{sVp^lnyinmr(Rhw{+uA`V(?otQg7;1C5(+|5np``Iqqk4O(}m;YBD7LWQZO*@x76P5AtxB<)WHqC@B4f#Jk~nb%UR`7Pg_h z#iIIt^4&!#+bIQu+b(|_;yE_Lhq>rL&1tOH99r6j=FDtpsP#L1)(IcXWwl!w7<+0y z*rt_%v8N_p5fkWrJSeukxdh`=4mL;kqoJ%!K3``~PY=g){;;#k?{~Eaf8`&(EM%k` z3!t&i=wgU?NKk#asGWzx-pS3>gPYCBviYPORDGFK8FNC*qf*?QqCBXVZ|w0p)az-8 zU!{HDglntRQLU=XKOu8qB*K(u{Uxl^7D7FYOE9(mn+-%xd#;n8mT+fG9DK2 z;4$(pAmOext$iVB=dSc!cH*+_Ki}=r}m!R#BU^I zjd@v*kTVT&3WxkG&?`@TPr_nosx@dt*!hN#&i3a8_^^C>eS=n6>QLH4PTAjv6j9z5 z;ev7KR!Ut#scXQc$q*Y^;uk$o4Vy6QA`C(b`9NgZz?(k~b(5EcD!Vs}W3ub!Gs5>V zN6@44V221gn|#|S^=?Yt20#(e(KIpBS#aePT%5=GceVY%* z4c&Gt10z9Qf4*g>avpQSh)Lyi=)~^3uc6i$I_a()N7F&z)GF4T+MrM-}1| zw06}~<+Wq%!ySh#)xD}(b?w-T-B;^D;&(>KdcA;lJxjrg;~~A+eI6#fGJZA13>&yI zelx@x(ViFbqvrZiHdVDkp8M5NDrtz!a969o9lNpn{D)UO(`WdPLn8#UZ)X9gK=F>< z*nNi`e6(AcII`#eF?Jn*Q5DVq=CUuB3P~Udr1#!{P(?XN=v8_V15zVB6vc{&ii(O| zKU?fwquBMY!QRE*1qBtACL&<}|7P~>-8)d;>F4`)a_{|ScDBvV&h9=+Y4MbXrJXE{ zdzu&m!TT$SYQ@QTrzT^HjGg{5- z6%d%wYGR9wc(_M#TeEr$-2!(9#T(`MGFsJk7UDK!4xvYZ+10@?#-yyChQrr^Np0lb zW`*6Onn$bf*aRN?na9K6;n+1s2VV?BeFF`Ty~xran@BUqc4XWvyuPO5_b?(+@kclw zhZHkw1v7+H1v33YmXE=H$MQ^ai09V8%U6LcuY}H5mI}Fl$j3M>gQ<@DNjcT7 zqa_1GTI^th{JrJbLnOb!05t>kMnl}nlE=3_O!5&Txx=PA7*6+iw}HJAJnk{XBT%;l zG{mPPfn$<_bvPpobzp>lmeR*lI;Q)GXR?XAqztnLLl?V>`No;)b7t}2yjC*%xOr_c zzInnBd=$JDUutJohllew&m2}vo-pKkfjrMsMjOf~1`o_4HBrZMwV-`iDQ8+Kr$fA- zbK%Ox24oTJ4f9?;K6=v-1tQqdhYFV3_E5nNgkhs+eN3JgD5IV-jsuTR48i6)X0*xJ zZ)~MBL9So4T%$xT%r^Bm6Y15-}~a_j)oY>FDoOehQ&bpI%N)_%u#qV+Yn>; zO)FH?0`nu{;l=irMkWGUvN61B;&dtX>$%ih(Vb=LSip|# zfA3O{(t-tD0<)NZLj(}p)oFw9Tdj6Q^wU9MX<|&*;r$SU^gye7%gTngS4)D4P&UR( zP2AvT2OkGO#6QWhsZ0dVOZaaf@)!QppkZ|2i7;4=G3e(>=x;I~lQoxF@E92%+{Q-- z?g|49vr8@Oa+Jc$G zx;n5f4DFm|(1)o@c}UQWp676(0+$nG0VP1F#Z{KMM4vz4} z1f31n%e(iPpFhUC_Z#91emAy^oni}@HZEF-*|wE@rF`(PdFM-fu)z@D^9ON`KJij{ z8N-^Edpll!(h$4&<@m$;#AnU#yYcdKhWM3VZeuzc-6vus)3E#TCj6nA_>JFe8`{yl zZhrh7Z(?B6Z~nz^CWQ8ho6L`Y<4w3o<;^VOHxq-t6!g&e8H<|wXRP^WV<^*vkKau) zlIkw;3-Y`}SuvEAfH%K1L_2=7U8tnrm>=`-=2k-#@|*1gU7~E;$lgw#O_bGzvbdxF z!4OCDtI5SPS1#1Ynz8%Exgq2s?4|w>S4_DFmYMd-l>LJWNM(OWKK~)lyOcGZvgWi} zIT*4u0WT@}QjkxC0E(|Cb4=j#@*MuWJcB>ai6PH>lywJX-3KDp5D)U_sZJkG`q%KV zSRHX)UNn^-8^jtVSVII0qtFMG9YNXAz``h`iFn59P(8PC=FC|O8*CE`l~u$_->n@t z9eFWb=dOIIK+X;RVUGL(4sgJhlIKIp?m^kdfWWw;iQ&v6&E8cnz^M~>Q%ef(WU^rq zyl0XZ3E(*b*n>PDQT7_jhT|s(6E{s<%z)_*Ku0NEWu+wxKyb%Q`D5~jhXrvkc|N0@ zY|6pjs+=K)C}qUVqNU4b8jE{_mB#Cjws_kFVT&M)CC`_Xa}VWkjxqPr#AA$*RoS={ zZop*?4xo)z&IDvy{|nTTAnNaedO)6g<@vKbcd?QV_o0{Llp9nHb76P+9wB#%P)o@3 z73F+HIbT31_!u<-Cnx!G9E!3s260WvoX4M5L?aItGu0qveN| z5pdPvdLi`=n;L?;ccA=o-mzfUqK1#tfY*!?ae(cy`F!wI&2Ul#_Bjr{C-wiBU`!{StkW2Ee8g+x7yZV-0L&Jxn_GHj2TwWE9Cixa_3MkJk2?;8sag3U))hZ z^$gt0kCMV|Jze0e>&#~vDxBa53LK4^WurLjaOnfHf#Ij( zg6BU|SWusn=WEKXq+FQ0Iq1GMF-yC1)>}DZCdm_TwCG0tgrD(qE16k6W)20yF3RVVI-2mdz^X zAH_`vm;5rX705*VxL|$WABLHjixEcm8=v4ZD27_YP^U>35 z6V)74xat0}A?galADxR4NOzo1wpzJqhImh_>vHD1PWa{{R7NH65)^{nmhdG^i~M7p zGl2akyO(rskzsJ3nkzZuK)tqCLrJk?LPQV4FwLzpqecZpuQtSNE&81dd^3yQs#?@t zt?Ev7JL|0(C4G~W^o^=xe|4^ZbVx~0bISyWmF6C8n3=Fr@;0k~q&;C^cvAZC=eWK- z!%{qk>?MzJ)PY(zCSWntu*g*xiKd=sC=R?yA048pnlQjH@%osuFQx1&fsAqUQ_9B3 zk`7IwBV+e;Tg<>%Qy;3gTGgBCbtnpZtKd?69v7skd;G^bJF;KHXw$jVjgfG!x>e-= znAyAs`Qwgt%KvK^Z92Enm@uOt|A~fJrAvAX1AoEtV}AOfG>-RC$nU6I`>EH|Xte28 z|ELi8!)b#j87{pPCctQeJDAOOmVZ=;{NXe*jO5zPOMv_s$u&_6`El_7uME6bK$=*G*iYg<)15@Q(=5PKPkG^MK)Wm)awF$mKj_bK#B%$wT`vz#cQx zi6zLxS|FZ&PBD(MWO12S`hCa?##x%Kf~aR*`uDwT%y|8 zt2FIbnqG)x5|V^o$a^#k(HpsI=ZFj3w=E0~m_BL_GqC6&nyO= z2~-Leat;HFp`xII6IvCn;u@_oSrJ41L!FMNePI|Ud0qpL&Fy&+hRB2uCv_RKTgL2Q zt4LE@W6^31l@_fMGe(Wzw$_9Lx-FXQckIE~7e+stmtdI1Ap>wk;kIw)bry6M>%ctK$wCh8M|mp*+Q7otJMu#MbP*0z=5&>;x=< z$*NKU&qP`o_7YAx`sqTNX8b!ntARQ?8>Q&hf*SDL&JA_Ez@ z2y-*DR4XG%+VFewd_|rw%M+3Tx4*%~EI)66A^P}PzmMA)NeW~HN6;LSkuat}dB+;q zI(-5p_rVFzbKyBwmiCpnSNFUL#;Dx|X(t-uH(hw|A@A8-c$U{Ac{|>`@FU)CFvL%i zw@r550&7a%^uzL&5QaoBB=p@+T%G0_VwGJ;Ik!k51r0g+jcDR46-M(y_+(i)#@3AK1jSVtD6TD1 zTrK9)*MakpA>QVyl_)_>@Lv2&ajkL9EEm^P1`n<}_8wU|KZ{(DsFr-iRN2ceuEfrV z7T01|23%b5N$6|SHX8=GKMnJEK=&qJ303wp#ntD~;_BhbfQ#z`!{Dz#abW{UXmRDZ zApr;DyWF#v|1AjkBJ`zuv9{E?Ng{PARc<6-8CAX_#dQvft29ttcS~`>N33z+rq6?q zSQB4MaZUd3))nU_qO`8PMlP?Bt5oEIM6Z#roGNi6oV2dQ6Avk_y$4+xaB=-(1peJH z;LtjOewTa|RQa(fu9FTauD!1I86O*!kF`>*k-dgNoiG424iK-T%FSTF=4Rp=Fer1x zwCugjH3zsQD<2L5U34j2AJ`&Gya0(BNB_S!j0LIuY;#-Wi2%(p1h(-@Gs)$sM^;N! zJgcQDX+0c-d2gUTln3g=4z3URmF82dxaPwJuwSmAoGta?CTD$U#b}Zv+g!1=J>bjP zd$Mb;(*WGl0K@x%nGxsu9weNj-rfQ?B;fQR&u>(49~C?R!f%LQ0gCK>i|kbfmzq-L zW{P}_Fcv)E9r%+9 ztEdoloW;TcbG~XBj8oT%$|sq(eRzAaA)-Vg*>huhOqM8hi}vPb_h-qRS3Jc1NsexxKv+_T}^atx?A3=qN)eUhv!Pk#wi92 zld$|#4bfAwvBOrZ4gzsjn4dpz)2GS=-Wr29+DOWQ$0FlR?Ks&vZiq&TZuRn+oSs;kh7gC(l1rcsCWobArl|KMY0HS=TLuK;wmb&D*O%U=3G) zdNvnIQl?!f0Yk4tXS;4mRB&kB8Wx6VPa0{S05c5LTC|UiLiJD$RbmmS3svDpTV1!h zgw(A+Y_(U%NV$F>*?7}{ah~2X#3Pc8WB$8txev))w>~m>Z`qRO;p8;bEy#$at6Hk| z*mWxj>o}ox%e9Y!L1yJ|H4I)d46yAR3;>MB26b?ZARl)ni76#hs>UcCLcAtIzu z7KPNUR(zkmmOCu`|FOD~by!<>Xa~0E5x3m7S_Sb$xbV4=ip~Mi#t`VYtjzb>%E^Bc za&~ug`=7C}1-KhrQBge=O#_i?2pQLs)`kcRS<`f|qr=+YvnmYH@{BY$gGat0FrlzA zx1)rUxzSyPa%tlP9ux*}xxtzT;0i;$%7vZ5pf@0q?64U2xYkSHbcPFyie9Ip??7}R zilX8~DxRnd`%5UXr=ue&=xN^m25K{x;0)Ki)N3wgHTP@&@q+p3*(A6-w zOBew9C-U{C>Yq(V@&gz+2dUkz{ygqT3eGSLDh-22g#n;{A>Ywd{Tmo`<0`iw44mff z?)9!Ys0V`!4TEu9d3!Sw57Kml4HM@m*BBMJjK>(Wtz= zb>;m<8vixsZG_zxTx*C^xzyXmgjC*EwEi5-ou#MRVfR#v59_IRj}1e{yNp=ujOe~M48u%q~86YG-I;0l=XcurzKdwPFd6J)}4cLP~e#Q_RBtMnTS}fU# z=j=FbuHAk&=~Xs>UopU6a#^txq+JgroJRWYa5|c|h`LeLNw5*)24xErhZP zu7EE36fT>7!h8;f?oc2(-$fKp#n?>nGq83WVm}9f_(Q|cIv~sn@9Z=0902jFO_WHu zR$oW_T9Qh#LuO^!^nk^ z=I103K11*+X})^LVD+lJ9A|z zj6TX4FPB@(;%1ixQFa8A7%-rRZ$;esM5$EzFqOh^FI-@VXBhC<;AzS%AMkSf>u|Z8 zO$tbU}4GTK>>eFs~=dqO$c=b`>yh zFvKm4Iq^SY1ap__OlQvvLP~*mdOr9E_}U=17#fB56O~X!N2=gf`G6s+n8)OhNVU(o zj54MLQG&Ir)As@>hu{>Vn=hq`SyTZVu<-v3v4{buRL)*Le}02$>vmY9wMH}{7@c`W zqczbvjzK#|i6&krs-%hoRPh%;->`|w7zRDgDP``>x;&+Z!kz*EYABw0^30WIdXPt& z{2@hnd_`16l?7A@3#M?hAw(0$J9$`lu)H0k<FOZ#S@MU|1q;1%EmaMqs^P%OF$6~#TI~^}j>X4Twg;$apqMul0lNTG@V^mP zXi*Y^1?AVCgY~c2PptotUC)0|xyK>=aQq}Z=1;`q!ts829eeM2oxL6qnJ|~|54=^s z9IG+LAV3o2c@y{@gb9taA)`kL6Rl&4X-8tT^tEwHKlKoSh!3Vp; za3L10Fnk7EbT=|$(Vficdl+DGQ-c21U3&I zH4L5IY&w?}fWE~LEjkV15m1?P4%!R&CrE!qsL}#Jzdcut< zpQ=^#py31;tMnt0%bFD%8Pd*s%CirLzJ1Fglpt^I9pSvY*10hO3ydAQ51nVx9?{cJ zj8z4!w22{la&>G1?IqKpcLMRUA#gYp3%QShF=t>s-KlPERn0g$P~D)eR9CQ`E>p+! zS55v2A$pn?Mi$;Te2Oe@Bxk|vVNUhPLR?53@~-2;K>OT`d-2G^7lz1@EO?_C82ylh zzahl2RpDr(R=;ZI+Ij!y{I`)CJfiqi zdVl09BrrbzKh{~Dc7_ouR19}uF*Y1fIVP3Gm>LODk%|_G z?Fj=4mM?5v=9eZ2!+gW~I?FqR<-m}tlE((S;+@yKDND7ryzsA~x{hQ3b_J$|gcR?* z#ti}jRuW}X+3i$zH;5{tA}ara%74-tn#jP-qM@VIfmT(369iiQ>O1_mm22!4wVC_Z z&pEg_SX+0_41;fPV<=x{c^648W-+t-k&F0{=;EDWG~wcUqK;I0fJ*;BF8UK?QrS6F zwhp;~dKNOU#Mr3O7PUb+AH^pJsMjqbIeX!+rDc{MY?YGB4qsGLlF#i9{hga1`JrEb}K&M($`wohS)Iv6yh_Db5d;7e$Bs zU&&Zs0joG97`VptJ+Vu!-#VALBKc)L`Ovn}d_7G%*e7WKxTsXMf4 zQ5V%2;b9IPih!Y}}e*BG9USYDJNvU4wU#iFc=4~b3Qu|16JtTWTw ztC5|H4DkT61D!v@!2d{g{%6s6wjC`Rqf(KN!MMps@^&=mqi1M{@{ZOpIRDQuTWxvY zl6)|HN-Xjb8l$`;oIVC7g!Twv{h|0)L!5?uKtbq+t(0WR2khDTIv=CwZk%oV)jZF( zU(M6l$IQcP%6Ra~ab{p{7`%Qmyna_*S?bP=bR3Y1LSoBzgfkq#!qA2G0py04RTF!q zLPvCD;MsOLerVCVD95*9mgCQe&O`xP)C#l7qUO->@*QDx-z6|OwAb!wD?$v8h(cz^ z21jUo`HoTUIw^s{kw7KqQwa{DDuKbFiARx-epW;^18ajL#iI9d+_gn7N-u*Wr7U{V zq9>#>J{B5YzN1GNjA3TOS1kGr`#Df3yjKUCR6?V_cZ4x)l~foeizNCx4QF;+5yvv8n~()( z^!JVqVPv4zz)iIx5F!Dr35<0+utKB1ceD=!4aSOg8;^oIjyA*ut&V97{2;5N)$(Rp z-VSOoj5?pnf+oHX4gcQZ34<9{C^fSIR>Y}TE3qO@WDZY4^ccq(&Of~v1{R#f=~Pxt zWmt|Y8EJ_5Ky9%iPDb}Sy4?19>I;;tH1Rimj_l%pTAsgxJtiDK7)rN zm&)F!vaj(O%o9!g%w?Pkvjo){x{Ix2-KiwjmBP`X{cyUQBi`Vr)7)~WxCY%}vh*x# zDvdd$LQ`=eSJV9z#`snO-?x@?A7J6$5Td-$kN#EVGj6Vy99}YgXHp+r&E`1yt#z+`+R6AU`)IV5f zD#E~e-AvpbhLCW!>xmmIb95N&DM{_kn$WlOO@e;Z$RK_=-OvX_`BXlF$`=FwLql9| zTM`9#vkM=!^Hcf%|DNTnkvYxjJRi!H%U^gs>I^gEIgNb%sM9h-;+zEhx|-LnXQTE` zK%-xVdY-;pD(nH%N(MqAINNoTVW+T_+9;WI-fSH48Mo^e)r8jH4_XQ2{>LyT3ZfB?MxfH9dnz$BKAfp^rjhC-eSEAsYv4KCn>RxQ6Z4B0A)eGG)!V!UVCK50rgCd5} zX_U4%?u>efm~04Gw9pu?MJ3-P30lbYvhqsP%?o`%WEjFP%DX5;dHi`L>n=oTYr@DI zoHu%H1_e|K!%7nkTB7lgXsSpQA*;5fRpy0$c)QvVSU7+}nh%vI;^f053ZuIy?Pa`^ zmx9MphPcJ9#8Dqg#p_F*hjKmaJc=W}6z(tbHH2>M!Hy(9bsjCxf$|(6PnOau9c6IW zf;iR?=SxPOw=)vh+7q$vu#8L$L$${l*o%T&dr~ov42hrk(H{oV3C4Yoh4oSly?TuZ z-8`2&M@gKZ3u&(84GR?d1uWQ?o@j`!lDE$fE2Ogz%UeMh62ZrC3{|h9>eb)@AA=@t z;nu7Fu}aG!*BmTHFPsM{(_}5bbT!dYRJEO|;PWXx+YtY7&7W(pufP z>00}(Y7ag+-w<*9NuwPokX9-AzS#T-FK+22hDhKyPqYIS(n{q`47egjbt2xp(h%+W z&3S=9g|vKm7o)6xHyQ6v|$h+d#I6mkvok6{ePr9T+-Y_$w6RV`uo$t<>G zkH`;Sgdy~9qJdQN6xDnLq4yZ#7rRF+DV82_33Y*$-9%k>agSJfH!9l_6CRT;0R*Lg znNMMKmi}#s_fSi$4vRS7s4Wr-&ZBQ&VEe&!h~%9L z{KLgn#z>ekE5rf@burUTRN!Dp9ZsE|piZxWz>unmZ;aFpBK0z=MNqS8bh6Lq0SosI>->%LLog|iH_JkiE6(h-^o-fXTO$N$n{Ak*LsRmHqLx{ zFK{r8)u0bbu3vHHI<%6y4q8%48w_5nk?Sfc4M>Dds4J-!n^472?C>#k;H;$E_qpjn zD(QT~U=wST4aE*$BH=U?w};W>%bJKLQI}Jw%Z1RwQbQotS8MYgk@^(sI*WX#QrCIh zwn7T!A)=|&go*Y z))qBMwtJmnDpCew!SLl<=1W8zmc4C=3qzhUbuG`MsONzeSqmHpAe4(=0oV1Cp~@ejkQ2pzKGYnbfr%b%kkN z24A`+hVc}0y0k$acF)pfEnEA_;3S_xwY#ZnTYRz45DB8USx&v_vVKZTH!I^jDQm|) z3g0U?O}1L)L^O-rUe_fcyoR`t#XH$(a5-zx(Nex^4FfpFWEDnmc`VUv>UuSG{g9Q( z>mD89Amb8+9Ng1SN#RT0MIzQVhweB*K~0YfPu4%`)-gc16VcXb%w!vfiCV5 zAUUm?Z$EHD0?uHfdDLwXbwe0-`4FP{)D2~`QM$PDD3r@Ny4s5~x*YTC6RBGPb*snQ zm|tsxryf?v=beQj)jso7OblQK6@AecZ{Yv$K=lvxN`E^x3>l{pEuwC_sM{WJoldlb zx{s&s>$QwIknub%BjTFz!W^Q7T#Vg*1TohTas)=lPY;*zGF!%{wGX=JBW|i8UaD_< zhauxhMl3ATl%H$}vrW77K`H(7sQV4%TT9(Debvv6iQ zB7m*5d*t=I%^Ns>rW_-)eqA>DrNQlQIs{ZS_K|ZLI^E;j!Wi$%A2nH61s0DP;(pVF zcS<25Q|%xj_2`HuoQs;D#t!Iqj=p!BYs2G^!15Oi12bxu;;;h@kAO}m-^J7;7YwSH z!BJq4W$3;>-^zDuY_DHt5Z40wUN(s5Mww)@;lUzLCX zX4<;^ajB+e&|Vk-x}1FLsYfR;7{m;CSnlPx^?2J{HwJ*mu&m(`8DEZJSrb^ez{Ow; z$_v~m=D_f@EsU|g{AZ%msAmW2nE}wfhB#U>u+b|2nmslXjG7jqBA4DHg|Towmkm@0 z8yL@X(So^Rzlhp;iIp${vCSK-qRGux8gIprSFo3*)vCZ4dkXbvr5>9>V2stw`{3qY z-}*p<5U+Ygf_W9oKouB9^>^6GLB7j$4=1}iDpJf(JMdnrA$D>nk%m=fyvok~6SP>;PT2LN!bfca za$6X4%!(S5h3&{sCqw+mpfwD7i_Viu!yi%+6`11e^0v8kc`AnW&;v@m)M|Sj@1d~L zvAY3fIM$C-DS?k6n02O#_{C^en7%uzAfy9v^J(!qk{ZZ(2#!+8j(WM(wLd_0M~5-GwKfcCm)kf!_XBi=0ZlaB6}on` z)hnpSFXX$DdK~0oxf*)D(zML122nM9+9FQRU4U6*h`plfU%B=e7aI~*@rQ>F%Ug5Y zMCD<*0?uun=?u;^`)txZNH~Y(Z}zw$0q07hHPmY?^;!txDnp#hMRc1~rK!l`)w(Ll z_M3_uiO!~8xzuYEzPQN{vcn`jAtZmC!K~Nps1ygZhkVzdA@jV3tI{=rs&t1`r8f->P8hAg^jlzh zZQ-hveoTm}q3M#WL#xs^uEwZTrB4j-Kel}32#7^hhh*5LbS?G7@rBY>(?_v_9X<9p z?sc^ol7DLy(4MuL&C-uYqJyJ>e!VFSt^P!wTPQV(QZX&7*kOng)PbVuGQ`>oPZ(<} zF2qeb&*+P8F_#c+;+&}SDd~1fdaBi`^cVt@6^i^nEFqolp2r7qhIo@dcrLJ-RP;XqPc%Ox>ajA(5byE3t@+ptDm(WsYqpAh z#($6Dzwhl8p@I*QB`SDVP_oE#0VRD%NuL7+=RRrTD@NI9_PN5!C~HDd>IJ2O&*bxu zml=ZBpCh0Dw@t6@$MW)2;rl@}Tx@E9w+iqU0mdx`>!@8ewZqJ| z5+^)q0_%7b`9j`;`I0$^wJ!MeZu$Br`MQog7g4*h)NV4qt~bPS{Pm0Z3+6YP&#w-C z{-=C?P(B|)o{Op7xzuhQJ|Ag_OZfAbigm;kCJADFro?ar#AVGb*KBESw%RvZ?dS6U z&#~H{=*JJ&AU9UKE4AhdM`GsWXFi3a#e6%gishat&X^1b>N^ zKUgB_V)9%4NDCXHH+XsA(l;wIV7DewEe! zN*4KPTjYlWB5x3`SjGs5e7XGP5=MpSLxKYSPku1vT6n3D=LLU1SNC7NWEfU`5w&cc5A!(QQbKY6aF zx-asjdl#;A|z~|~a&Im7P7KKE8e(gGWgF0~UfL6y#AaHGr5GnC~ z4zAkGxbT=_L9<2`wW>ncN3H0C!7@!wXz!>}aprH^z`W?|FzmX@9}UOHa3VXP{$MUs zAbniO5xrlp3quoo$#WegpF+v7Wh;L%1jqIxKGaXbQMpxUT3Co|W<8u;xEeh-Uam_YDC#ySUBIZmuF%-yOq z@?1m7`IKA=;B-UO2rAFdGO&hQn=8@|}8&Qs5}`qkqyHmJwcBZHm&(U#M~;CUW-E~R##QhOW#P_@<& zC6bq`ndNWDOT1Gr%fdjt*Z@TX6-N+j7CCm+OdZsWtx=}b-`W@%tn znf9&3nRN z_Km@>=aN)ixb%KuG$vR~8+1jW)`kvFINuv)>qtEt^Flw|;I8r^kh5qh}+R z0UDN#CirSA>{|3Puvj)Y@q%|@;y;Uy#wg1h6`_+Fy(y>KqDtHX8Z>Y=KjE&HY8W`0 z+gi&j29CE4^AiIn@ zjzSgy%+^jOPo^OIVv9~>+2_J53)v@PM=8P;gLjZ_UK@t&m|bfIxt14x8nEcfEZDk< z2?Ks z$JlI={<6GdBnN|;(Sxjg$KulF!4F$fr(s(CN-i%D5)M$q3$TXt3*Uf%HKd8H zeikgmAC9~S7mYS|2t$wtGdcPa(9_IxOaTaj@IBS9u{TxBQ*5qy)9$y6WCSjXklq{7 z(D-(N0s0ukLPLBaGHzz&$rScZEBSlK2tu{*2PXYmkpv@|3FD9f{H-50)2#0snBr}Y z3nLe+3_qAb)n}PpSm0!Nxx6xU=$LAUDFKH5OI2(D|En-M?&=H3a}%Y^rj%2Gf1x36 zWG%sc=WT|bUJrUYY<(T-0NIGm4(r$B>0iH|PtSl-*+Wut;_{`-8kRM!4Ea3;E6Lii zqo3FVPmxbk(KXsrg4DG_A0MC_gr0yZgb@qBPn74-06k3TqvY95p5h^|e%4Ix%aOO| z3{lIzoi~b_W-VPlpSQ=9N^pDii{|&9c=;tm^x>D^lN-?8rd)dyizqaVoAOerYoZy_~?S50h(%eHg?JS*HT z-wNyz#Fh+J^C-zL22B0(rLOsS`=j=YdnjZ#ouBpg5kUo!Wzdbq%KelT#m&eYDwxJsus*2PZ3X3#M`aPt5a~V`CIPP z|2*vY=b_Ml{4IU+8y7C~M|nIs9(;mo5B(P5hTDa+8v6P@|0r+YmVN~@=1y<&tH_o* z95mO|xNweNMYYry&Yr($`ZA2|E&U5lfP4nz(&mK8!Lp|1oECVM zY|fRjnezL`=as;*W51BuGEf?a`CWgO+cKzddQ;Q%m6}g;i|sK*f#Kg~&zY!hB`t%o z?*^xR%BO)>hN7nilZL!0Q^5nNX?eYR`J175oN}YuH!G}mYWM3fk)avmwd&I{qXP7!7LU$DCWGDkwx>TpR%&y&`gijdf}`zwG1m=IDJ{;idkINYI)1>LL|C$ z_N$XxMsTuQtzWHdnbK<q%LY)_=|)%mguK9z z5X;g^oZwgIw@j|;yL9QSrezJYr#H@D-ZV=CsKjPim6)`MvwOT>UDh(8roM4SBj2Fj zaKg%lQ)V?Ss%!SED_h2w_g^@(VbN^a6~%wLre$2|n3YQ#W;Hb}Y62X(8g+fkq$>W~ z3G)}tmN<>Q-L#+Hu29nG^BEnhg3KfR@8O!0t#9IDu_?r0fZGk76(88^;snBFvJ z`2w62%b4YUbx+I0sxix^&zRS+XvM51RPvJ;;{KLnD@QJ0#sV#vwE)Wy{KuA-QI*4| zFPkyED_%BgR?~{}Y~u~hyI52*wd@61Sd@TbHs0&vA7 zQn9446@jkQ$rLWj^X;-M(zA=h10}sBYu(DSSr_0Ob$qZ0LvqOZXup|-X^#y-ys=L; z`w>ZA=cwv)-MBogx%5H?Ht6KJsC8;4!0rTC7LIlZOnm)=KCIxMy^-v!55! z;15?1iBfPVCfDorPK#yO5n)v<&|cPPMOqiId)O6*V(5v|qC_0&s7?oqjSv~ve+HX+ z!4Z*x`@Y7FSGj26>TF=Vg8z4HZSWR9)Lt31IVqOVYpFAVwiA(~kSYu(r<1Nw2rx>FsVNcN5KLLB9PVQsuWvn5Xyeh_t*24|$cn$HK>cH*p6b2cMM1m6} z!3|{QEQ&-2a1=zErIVO>_HD8MQRkut)b_Be>VGsci_+C8Jfx{bicg;2h(r6-3Eb>Z z2QLa4OOi{Z!YRA)C0k6k|HqIXA%C~Y_J0T|!8P78LjH!7_O+l_$>4!525_FA$aG zZPrPN$?C1Q_S@}_M|RwyA=><0l_M{`H-oHq z$odd3y|0s>Fqb}BS*k!@`b7T%x2N}0o&1qs@&~)j4Hk_Gb{SX&??uVy%ePx+l68=* zzwzxhNk)35v-m_evldmN$NnsMlGGgTH_&5@u-!&{e8BN_c)vxZ59FVu`#4{^59etD z-r_j7Ht?5b4p)cwZ=LMw=Mnc>Zc@LnFe;tBG8jer*1_NCbjf>*4jvI+#kE=y(Hb>R zkGvLL41I_mEwtZhTtt~b%QC_)nX?QD|B)n zwA)v`#DFjvpxwa=g@?>TyGO%q7+mo17Cqty-(6#V4)`8A`Hg?Qx)2QBV+K{s0N~^C zAExsC)M(YV4z^FdLlbwo@u=6p@2V}_(|*CYJ&=fTg18x@5kpo`)G~^K12tl(POd?Y zO;6jRwxikf?EW8Jtu*P4Sh!Q~p_q|~RIlnpjB3@1HtJTc0qUn79t$vI_dVyFC#4}X8hiXeux>v}Mp!RC{%|fuUPY1DBl(d|-pn}t3;CQI?Vi}6CX1>9 zj>UjR;HNj*O8!bfKNryN8xb&!Xig&&<>gQxTS$i`xm}>Y73kki zq{y8V`3su3L*r_4Q`)IRT5%@l(h`&$Clkd|OlMjcZzKZYD zbrK~=kwc`Uuqq=ZWqEIb4dE#MR0K-^LhKt=w1lD*Ma2N3SSQ>1(a%JrOaIl1QSMn- zpD>)W2V&rxtQS;zz(d1h;!ut$#Vf0M^lMQ|^stEDo`*%h-?`@QEn4H!+bMq&MI}*G z3PkCP4r?k!E%YNEQtfAXy0JVM4%?wWMc5)-w!*@>!tO1a=*D8W&SIoR5s=a1Beksv z2p_t*?k#e&sMR>F?oE(&yd6*cJ z@b#`&?{c_E3L{T|tZ~6b6>pK-ELk;bpcfH-{v}8Vxa>O-3 z$Z`|T7{mRy&*&@{GU6PaBa)AcU(MY9n?_xe2IS{c9k~_{E@D_gHCijiH=h=;uuSEeP8Rjy;q|}EfV3Qlr z9lCeKLbke7Cvlu83pSAvF;f-uWECu|lhkZ9@j9pZQ|M-0sfRV@^N1M{IZt5JJ0NF_ z^PEg?p_>OrJ*9_++aTxDI?2@va?WGK7M4@BR~KN_mJi1au9X$KSx@RE4R;NqEMY!b z#M9k~Cm~|A!_8E9vYR5`z;@PC$hQgtzNwQB01h7IGtt!!3O$lm%mRCO40`qLsi^e2 zG4h041wF7wYRjLT^ur&r0?@?L?97!A~uw~M0QbE*B!rRL0YZ#R&HGbs8iirxaj z5+xba26_uvy-46VZe+A?RpWxii?B}Rw463t5pP)ZFfxzSI|wsG3aeizSa{$9Lvd;j z8%?R1`iF>*n&C(e{+KI2X4%7jYPJ|yZyPJ%9U)&c&Mxb@EaEc;um82h01I%F@+DE9kzU4o(%kW912x7aV%a6M-wX!y&b={NWgRc9UmU zc}h%))ucH;1|gQ}q)Y%t9XF_`3?>)I4c9nW7>$h-UH zyDx*kVHp%0Q6%n%TaqC#3^&zTRpZ{9a{mygg;wCU8XQ@pp%I~*BjRQ< zcma#++#=yE_{2@z9=f)6g}6O+ava2kyiHF!T$q_3MIg^zp$rQ*Ch3rA&uB@c~B!8mr@NkCVUI`_#xZgOvJetq>@7IW4QQ$EG`AxY%XD(Lu6 z*6ANCa5L;8*J)_X?J%LSEnI6A>%-w8%y*k}L|*0@N^x}*cNV0*+)kUb)2&fb11C}% zVhr%y4-+xuAB)zZV;t7Ub|6Z)(DbH;L)UDiOWp`u0>S366Ofv0(QKVM-lF4m>I8(( zixuGrOh~<5hS46TW?|I`BWxE#)(Tl=$Z8==4Ou2+F?ais&+Bpb0wiD1Nm&t{WJZp_ z;KRPX!0`14XFK&pdA=aeRzch3@l#9!#pDC-T|3P;yGBk94(Y(bzr3&mh}Y!#syts3 zh%fBVssZt(o$kgEQ>txiv;j-Yvlhlh5ClrxZx)>jJgi{=7S&ez4O680xsg z>@|43%d}vQ=aHge(he}Yj$iXL4JO@0>d;Z1aCst);BDmYA9=#Lh4i06qv$XB!|(EZ zU!L#D6E;n&|(q{6P4X**u1VU%8z|+$}{Of5>99W$g%>4&PJcBud>S&rb!XyQeS3jG-6=>-c)u zX&5*Z*$`TnRGqwjw5K1%+(9w-;q_ze^yB>cv|v?HVx0NvJarWF7R9`eSL^NcXZ-5) z!>a^V6Ih9ZJ@pi`gJKXp;2WaTvBaO8;Izmh*f`LAbBDH^l@79S?i=grPqFC~n}@H* z+36zwdPaynX#F9xoQL4{{g-(y>IIzoP=6qhk~$;^lV}m~L>ssmOy=2X#CKEV%yQ`` zW;E!7%updWSQge%Y)RA3VUV=51Z25q5XHVqvG8d4R@iA22Sv_u=F{RM$aFr_?v$@@ zm9JNM22-4e;v(_&S#~x{{6V%&iN?%ulzw;Ztnh-u+1 z{vr4d3xgOtG0L~7DeM`2&vu1Q9t7gGdi>O)CJaWp6(%6R-gSiht$ZZ@HVKRF_Lh3@ zTA3jq8#Dp)-MW3>J)U6{*GzHPYT>)rPVeDC*urgkD2DV59%hm`bGKqJs2b$}cbk3t z9`y{NxXu)ZEknM?Z1BAh-6HlJM&1L!uFfm7y!pdi21DPow!UHD_@1-VRemv_3K{be zKS}^GXPsJA6{6a)?>e8=qw@HMtf2jr-{Xjk*naZ8VZ&>iWP=r{hc8s3yU{aK+JkJ6 zbZ4e7BO{I*%e?soM@CNr`X@FzZdZ}28aWk}O>iGVr%h>(GkQIvzYp|mhu-u4JR&-< zzqPTwsz$Uugke4fOyLNpWu52d`Sk6y+XjLZeY@=RpIX~v7;~#=dm((EYAV7F{c1F- zalJa0@9_#MJ8#Po1r}xhZlnKf)N!V$1Ij*6lyVWPV;1v-J4hvs2v)mJ zbgb5BWv?^JzC@Ib)oWaW2Xvp8l^whg&YO4r5z&F&-ZPM5uc6rgA)RceUj`qn9Xc*O zMN{gyg}I!?ToS>hDtO|BH*d`mxu~{kffVGq{Ba6C?&3V;!kg!2?M9V(22kuMik$)> z%kA_Px**pxW)2r*tGZX+-Ky?Vx2l_AK;ESK)T@g_t~B%JO+2EYK<{p&uM|%<8!e%W zsNC(FfaTD2P_+|&lJ$1LzLXEff|E^xm#w%%N?R_Y1D38ZMzrV7=_$^@5GbY0G5yS| zbrbYBThP&%XmFQ=p4IY=0!)n)CdUot1dkr{YLNFCc6yjpGn_y~8Tc>BjFs@$VytY# zwcssghS>%y{YP9b>sOo6a@1Eye1`u%kvZQxj&07~yaYE%PO`aYs^=v`pE8em$WWYf z=dCv{&JE~Hd*oNh(keTRa52{PH;gHx9D>L8LegFM??;h#s~@{;9gSYOu~}yu8@t$9 z0_>fP%`=YJkj1_{j~mbxwsC_oEb2--yr)j zpc|8B8~7arCqP=Shmo& z68;0kv2(*AIa{Mh_2Lb)8IEmK-dwjBov0UWbW9neUb53DGKikfoSx(w;RvS8z0XYp zZ`dH%MUB1^fi9(t^Biyzoj9(Y=DVI_DSkf1FN0w3*=g)i(Idz~>5pbp`ecg4b6RjN zYk7OYx|>)PI*YX@tvJ5an+JrAmJg8>9dzny%bTE6*CE1Ir*1-HLkeccY2ajAp)YZ- zm-?YirXuPBT zXkz*R$#NHYc9v%~<3z`MMo`>7ipOyo(QWK>9OKMAbeRAe>meU@mnU|1;**Z{CosOE z)9iEtf8Kc5#53}gz(N5uv@)QfbSw}6yI!7k@*EhLL8cFqKlGO;))4R_))4UQDeP-) zmWbky?rNvoGy4<&Jti@|pL~o}2S6Mn5Pti!WI*(_)9DN`&yGq2fu9C=MpAqh#TOtw z&`!gzK#}up&wRGLHq8F18(tf3ry(juE(n>W1dkU>AB7^L^x^XL1kWgnA4u`T@%2PI zEoV$dVa9-Q2lEJLY~u8KG&%U12WdZbCcB&`YL{~`Hqr7)c!u8*gO}Uer8!0~vYXCA z2(s8tV=mEGU5#cLH51LULueOzWZN7lC)?Q>i}Xr6J=c!`N;Na&Le8JcQa(2pZ}e%ssN158>9?rPdqii|llr2>LKXt`1Y=ug#a416sTPS;@0n{Kk+>lsgNYN^d2$ab2X;G$4}>BY;f%$V($%x&8{m7TWNNKE zF`q#O*PvLe=&wCvDE@Ye$8|r^-`Hu{2(kFE9?#cLB>_@$6x?Z*{+*y*F3+oiJ>Avv zhb!cHkv!MQQ-YSGf45m-pG5Q@c3L({EcuU~?lSrKQh8p?lE*~apFNGV&rWY-4K!&D zsE+bloM$Y>zew?~hnqoAJj*bB6oZF7bMzsNWPaAx;0e@D&p#eA^ z7gPFI0KbUAYXM&5=zVk69~nFy-~()MI2fe*MDhL{f!#upODO$Y^cDYOaA;3;aV+5E zxH))Y#@Nspp<>3`>9yQr-pqJd>QucP7FUkjP!Tg(mus6W;7zg9?7~oYGTun(F8ksb zLqE3EW3kiOi{(@tQ4;{1X#*mfJ!Y1j?!e#=G59118`7U;xZ%yy81Y~7<`o^G9?c6# z2_ex{Id1c|n5A~R*aW$j+3An{Jer~7wxSy)*Hgs3GG1~W5?+<#HqVMV)5d%mR~SRQ z*BNvv=hm^wCfl_woa32HZJwhxpF_%Xb-FF$S9Fa!Uux7c%BZ49JZtUVTYZKOVc{Vy zeWMlaSI^@+B8ng*y)F)OZ~`nsko4cyVOp)OKrnl zY8|>!ZhVfGoqgm!4)8zQ)d!x$n7wxO@!HiV8oQIxAwdBca+gy^Z}fKaxt8ukElqXw z*x4?<9e1Vw*o=NN;A;dNum}uVK^gS`U&-LV1H8b|PiLQY#0JlIe8k4t;Cl@Cr2-CE zOo>jSjG<_>=K?&&2k=ggemdK&>x=DZLvI9|G+RL(xnJRap99WRkC1*P+s#Uj&9h7N z5g_K<>8GV%xr!mtX~9bFr%>Jq7vcg9=~uGd`qS7d8}lAElCkNSLGzGs_A6Q2kEm2g zR_mEYZ8uWe¥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