From c67a8c419f5d5dbc1656dfe815350784ed9223b9 Mon Sep 17 00:00:00 2001 From: Ian Sweet Date: Tue, 7 Aug 2018 16:54:18 -0400 Subject: [PATCH 1/3] example of switching p2a to dune --- p2a/Makefile | 19 ------------------- p2a/dune-project | 1 + p2a/dune-workspace | 3 +++ p2a/{ => src}/basics.ml | 0 p2a/{ => src}/basics.mli | 0 p2a/src/dune | 2 ++ p2a/test/dune | 3 +++ p2a/{ => test}/public.ml | 0 p2a/{ => test}/testUtils.ml | 0 9 files changed, 9 insertions(+), 19 deletions(-) delete mode 100644 p2a/Makefile create mode 100644 p2a/dune-project create mode 100644 p2a/dune-workspace rename p2a/{ => src}/basics.ml (100%) rename p2a/{ => src}/basics.mli (100%) create mode 100644 p2a/src/dune create mode 100644 p2a/test/dune rename p2a/{ => test}/public.ml (100%) rename p2a/{ => test}/testUtils.ml (100%) diff --git a/p2a/Makefile b/p2a/Makefile deleted file mode 100644 index c85da39..0000000 --- a/p2a/Makefile +++ /dev/null @@ -1,19 +0,0 @@ -OCAMLBUILD = ocamlbuild - -SOURCES = basics.mli basics.ml testUtils.ml -PUBLIC_SOURCES = public.ml - -PUBLIC_RESULT = public.native - -OCAMLLDFLAGS = -g -PACKS = oUnit - -all: $(PUBLIC_RESULT) - -$(PUBLIC_RESULT): $(SOURCES) $(PUBLIC_SOURCES) - $(OCAMLBUILD) $(PUBLIC_RESULT) -pkgs $(PACKS) - -clean: - rm -f *.cmi - rm -f *.cmo - $(OCAMLBUILD) -clean diff --git a/p2a/dune-project b/p2a/dune-project new file mode 100644 index 0000000..de4fc20 --- /dev/null +++ b/p2a/dune-project @@ -0,0 +1 @@ +(lang dune 1.0) diff --git a/p2a/dune-workspace b/p2a/dune-workspace new file mode 100644 index 0000000..a9a16f2 --- /dev/null +++ b/p2a/dune-workspace @@ -0,0 +1,3 @@ +(lang dune 1.0) +(context default) +(profile release) diff --git a/p2a/basics.ml b/p2a/src/basics.ml similarity index 100% rename from p2a/basics.ml rename to p2a/src/basics.ml diff --git a/p2a/basics.mli b/p2a/src/basics.mli similarity index 100% rename from p2a/basics.mli rename to p2a/src/basics.mli diff --git a/p2a/src/dune b/p2a/src/dune new file mode 100644 index 0000000..be61f7a --- /dev/null +++ b/p2a/src/dune @@ -0,0 +1,2 @@ +(library + (name basics)) diff --git a/p2a/test/dune b/p2a/test/dune new file mode 100644 index 0000000..7525118 --- /dev/null +++ b/p2a/test/dune @@ -0,0 +1,3 @@ +(test + (name public) + (libraries basics ounit)) diff --git a/p2a/public.ml b/p2a/test/public.ml similarity index 100% rename from p2a/public.ml rename to p2a/test/public.ml diff --git a/p2a/testUtils.ml b/p2a/test/testUtils.ml similarity index 100% rename from p2a/testUtils.ml rename to p2a/test/testUtils.ml From 1f54b08fab9147eccab6a568cfc47ac85cca355a Mon Sep 17 00:00:00 2001 From: Ian Sweet Date: Tue, 28 Aug 2018 15:57:56 -0400 Subject: [PATCH 2/3] first crack at migration of p4 --- p2a/src/dune | 3 ++- p4/Makefile | 37 ------------------------------------- p4/{ => bin}/viz.ml | 0 p4/dep/sets/META | 5 +++++ p4/dep/sets/Makefile | 14 ++++++++++++++ p4/dep/sets/sets.cma | Bin 0 -> 100122 bytes p4/{ => dep/sets}/sets.cmi | Bin p4/{ => dep/sets}/sets.cmo | Bin p4/dep/sets/sets.opam | 7 +++++++ p4/dune-project | 1 + p4/dune-workspace | 3 +++ p4/src/dune | 3 +++ p4/{ => src}/nfa.ml | 2 +- p4/{ => src}/nfa.mli | 0 p4/{ => src}/regexp.ml | 0 p4/{ => src}/regexp.mli | 0 p4/test/dune | 3 +++ p4/{ => test}/public.ml | 4 ++-- p4/{ => test}/testUtils.ml | 13 +++++++------ 19 files changed, 48 insertions(+), 47 deletions(-) delete mode 100644 p4/Makefile rename p4/{ => bin}/viz.ml (100%) create mode 100644 p4/dep/sets/META create mode 100644 p4/dep/sets/Makefile create mode 100644 p4/dep/sets/sets.cma rename p4/{ => dep/sets}/sets.cmi (100%) rename p4/{ => dep/sets}/sets.cmo (100%) create mode 100644 p4/dep/sets/sets.opam create mode 100644 p4/dune-project create mode 100644 p4/dune-workspace create mode 100644 p4/src/dune rename p4/{ => src}/nfa.ml (92%) rename p4/{ => src}/nfa.mli (100%) rename p4/{ => src}/regexp.ml (100%) rename p4/{ => src}/regexp.mli (100%) create mode 100644 p4/test/dune rename p4/{ => test}/public.ml (99%) rename p4/{ => test}/testUtils.ml (81%) diff --git a/p2a/src/dune b/p2a/src/dune index be61f7a..714be4b 100644 --- a/p2a/src/dune +++ b/p2a/src/dune @@ -1,2 +1,3 @@ (library - (name basics)) + (name basics) + (public_name basics)) diff --git a/p4/Makefile b/p4/Makefile deleted file mode 100644 index ec87602..0000000 --- a/p4/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -CC = ocamlc -CMO_DEPENDS = sets.cmo nfa.cmo regexp.cmo testUtils.cmo -PACKS=oUnit,str - -PUBLIC_RESULT = public.native -VISUALIZE_RESULT = viz.native -PROGS=$(PUBLIC_RESULT) $(VISUALIZE_RESULT) - -all: public viz - -public: $(PUBLIC_RESULT) -viz: $(VISUALIZE_RESULT) - -$(PUBLIC_RESULT): $(CMO_DEPENDS) public.ml - ocamlfind $(CC) -o $@ -linkpkg -package $(PACKS) -g $(CMO_DEPENDS) public.ml - -$(VISUALIZE_RESULT): $(CMO_DEPENDS) viz.ml - ocamlfind $(CC) -o $@ -linkpkg -package $(PACKS) -g $(CMO_DEPENDS) viz.ml - -nfa.cmo: nfa.ml nfa.cmi - $(CC) -o $@ -c nfa.ml - -nfa.cmi: nfa.mli - $(CC) -o $@ -c nfa.mli - -regexp.cmo: regexp.ml regexp.cmi nfa.cmo nfa.cmi - $(CC) -o $@ -c regexp.ml - -regexp.cmi: regexp.mli nfa.cmo nfa.cmi - $(CC) -o $@ -c regexp.mli - -testUtils.cmo testUtils.mli: nfa.cmo regexp.cmo testUtils.ml - ocamlfind $(CC) -o testUtils -linkpkg -package oUnit -c testUtils.ml - -clean: - @echo "Cleaning object files and executables" - -@rm -f $(PROGS) public.cm[oi] viz.cm[oi] nfa.cm[oi] regexp.cm[oi] testUtils.cm[oi] oUnit*.log oUnit*.cache diff --git a/p4/viz.ml b/p4/bin/viz.ml similarity index 100% rename from p4/viz.ml rename to p4/bin/viz.ml diff --git a/p4/dep/sets/META b/p4/dep/sets/META new file mode 100644 index 0000000..287ae87 --- /dev/null +++ b/p4/dep/sets/META @@ -0,0 +1,5 @@ +description = "" +version = "1.0.0" + +archive(byte) = "sets.cma" +archive(native) = "sets.cmxa" \ No newline at end of file diff --git a/p4/dep/sets/Makefile b/p4/dep/sets/Makefile new file mode 100644 index 0000000..6746fd8 --- /dev/null +++ b/p4/dep/sets/Makefile @@ -0,0 +1,14 @@ +BYTECC = ocamlc +NATIVECC = ocamlopt +CMO_DEPENDS = sets.cmo +PACKS=str + +all: sets_pkg + +sets_pkg: sets.cma META + ocamlfind install sets META sets.cmi sets.cma + +sets.cma: $(CMO_DEPENDS) + ocamlfind $(BYTECC) -a -o $@ -linkpkg -package $(PACKS) -g $(CMO_DEPENDS) + +# Need to also include the cmxa for running tests... not sure how to build those yet diff --git a/p4/dep/sets/sets.cma b/p4/dep/sets/sets.cma new file mode 100644 index 0000000000000000000000000000000000000000..5839b7d25771ff3cd587806038205abc1082af23 GIT binary patch literal 100122 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 DzDh%1 literal 0 HcmV?d00001 diff --git a/p4/sets.cmi b/p4/dep/sets/sets.cmi similarity index 100% rename from p4/sets.cmi rename to p4/dep/sets/sets.cmi diff --git a/p4/sets.cmo b/p4/dep/sets/sets.cmo similarity index 100% rename from p4/sets.cmo rename to p4/dep/sets/sets.cmo diff --git a/p4/dep/sets/sets.opam b/p4/dep/sets/sets.opam new file mode 100644 index 0000000..104e897 --- /dev/null +++ b/p4/dep/sets/sets.opam @@ -0,0 +1,7 @@ +opam-version: "1.2" +name: "sets" +version: "1.0.0" +build: [ + ["make"] +] +descr: "test" \ No newline at end of file diff --git a/p4/dune-project b/p4/dune-project new file mode 100644 index 0000000..de4fc20 --- /dev/null +++ b/p4/dune-project @@ -0,0 +1 @@ +(lang dune 1.0) diff --git a/p4/dune-workspace b/p4/dune-workspace new file mode 100644 index 0000000..a9a16f2 --- /dev/null +++ b/p4/dune-workspace @@ -0,0 +1,3 @@ +(lang dune 1.0) +(context default) +(profile release) diff --git a/p4/src/dune b/p4/src/dune new file mode 100644 index 0000000..0d4a4be --- /dev/null +++ b/p4/src/dune @@ -0,0 +1,3 @@ +(library + (name regexpi) + (libraries sets)) \ No newline at end of file diff --git a/p4/nfa.ml b/p4/src/nfa.ml similarity index 92% rename from p4/nfa.ml rename to p4/src/nfa.ml index 3c427f7..4bb8d62 100644 --- a/p4/nfa.ml +++ b/p4/src/nfa.ml @@ -34,6 +34,6 @@ let move m qs s = failwith "unimplemented" let e_closure m qs = failwith "unimplemented" -let accept m str = failwith "unimplemented" +let accept m str = if elem "x" [ "y" ] then true else false let nfa_to_dfa m = failwith "unimplemented" diff --git a/p4/nfa.mli b/p4/src/nfa.mli similarity index 100% rename from p4/nfa.mli rename to p4/src/nfa.mli diff --git a/p4/regexp.ml b/p4/src/regexp.ml similarity index 100% rename from p4/regexp.ml rename to p4/src/regexp.ml diff --git a/p4/regexp.mli b/p4/src/regexp.mli similarity index 100% rename from p4/regexp.mli rename to p4/src/regexp.mli diff --git a/p4/test/dune b/p4/test/dune new file mode 100644 index 0000000..6bdec93 --- /dev/null +++ b/p4/test/dune @@ -0,0 +1,3 @@ +(test + (name public) + (libraries regexpi ounit)) diff --git a/p4/public.ml b/p4/test/public.ml similarity index 99% rename from p4/public.ml rename to p4/test/public.ml index 27c99d3..ea666a7 100644 --- a/p4/public.ml +++ b/p4/test/public.ml @@ -1,6 +1,6 @@ open OUnit2 -open Nfa -open Regexp +open Regexpi.Nfa +open Regexpi.Regexp open TestUtils let test_nfa_accept ctxt = diff --git a/p4/testUtils.ml b/p4/test/testUtils.ml similarity index 81% rename from p4/testUtils.ml rename to p4/test/testUtils.ml index 02d6005..2620c62 100644 --- a/p4/testUtils.ml +++ b/p4/test/testUtils.ml @@ -1,4 +1,5 @@ -open Nfa +open Regexpi.Nfa +open Regexpi.Regexp open OUnit2 let assert_true x = assert_equal true x;; @@ -17,23 +18,23 @@ let assert_dfa m = (* Helpers for clearly testing the accept function *) let assert_nfa_accept nfa input = - if not @@ Nfa.accept nfa input then + if not @@ accept nfa input then assert_failure @@ Printf.sprintf "NFA should have accept string '%s', but did not" input let assert_nfa_deny nfa input = - if Nfa.accept nfa input then + if accept nfa input then assert_failure @@ Printf.sprintf "NFA should not have accepted string '%s', but did" input let assert_nfa_closure nfa ss es = let es = List.sort compare es in - let rcv = List.sort compare @@ Nfa.e_closure nfa ss in + let rcv = List.sort compare @@ e_closure nfa ss in if not (es = rcv) then assert_failure @@ Printf.sprintf "Closure failure: Expected %s, received %s" (string_of_int_list es) (string_of_int_list rcv) let assert_nfa_move nfa ss mc es = let es = List.sort compare es in - let rcv = List.sort compare @@ Nfa.move nfa ss mc in + let rcv = List.sort compare @@ move nfa ss mc in if not (es = rcv) then assert_failure @@ Printf.sprintf "Move failure: Expected %s, received %s" (string_of_int_list es) (string_of_int_list rcv) -let assert_regex_string_equiv rxp = assert_equal rxp @@ Regexp.string_to_regexp @@ Regexp.regexp_to_string rxp +let assert_regex_string_equiv rxp = assert_equal rxp @@ string_to_regexp @@ regexp_to_string rxp From 92aa81afe81fc8b5123a66b2b8e631c4e011a96b Mon Sep 17 00:00:00 2001 From: Ian Sweet Date: Wed, 3 Oct 2018 12:53:50 -0400 Subject: [PATCH 3/3] tests work now -- only .cma available means 'runtest' must alias the bytecode executable for test suite, not native --- p4/test/dune | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/p4/test/dune b/p4/test/dune index 6bdec93..7a390d7 100644 --- a/p4/test/dune +++ b/p4/test/dune @@ -1,3 +1,7 @@ (test (name public) (libraries regexpi ounit)) + +(alias + (name runtest) + (action (run ./public.bc)))