summaryrefslogtreecommitdiff
path: root/ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml
diff options
context:
space:
mode:
Diffstat (limited to 'ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml')
-rw-r--r--ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml57
1 files changed, 57 insertions, 0 deletions
diff --git a/ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml b/ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml
new file mode 100644
index 0000000000..19593584dd
--- /dev/null
+++ b/ocaml-binary-annot/camlp4/test/fixtures/pr4330.ml
@@ -0,0 +1,57 @@
+open Camlp4.PreCast ;
+module G = Camlp4.PreCast.Gram ;
+
+value a = G.Entry.mk "a" ;
+value a_eoi = G.Entry.mk "a_eoi" ;
+
+EXTEND G
+a: [[ "one" -> 1 | x = a; "plus"; y = a -> x+y ]];
+a_eoi: [[ x = a; `EOI -> x ]];
+END ;
+
+(* and the following function: *)
+
+value parse_string entry s o =
+try
+ Printf.eprintf "Parsing %S\n%!" s;
+ assert (o = Some (G.parse_string entry (Loc.mk "<string>") s))
+with [ Loc.Exc_located loc exn when o <> None ->
+begin
+ print_endline (Loc.to_string loc);
+ print_endline (Printexc.to_string exn);
+ assert (o = None)
+end
+| exn when o = None -> Printf.eprintf "Fail as expected\n%!"
+| exn -> begin
+ Printf.eprintf "Unexpected exception: \n%!";
+ print_endline (Printexc.to_string exn);
+ assert (o = None)
+end ] ;
+
+(* The following is correct: *)
+
+parse_string a_eoi "one plus one" (Some 2);
+
+(* While all of the following inputs should be rejected because they are not *)
+(* legal according to the grammar: *)
+
+parse_string a_eoi "one plus" None;
+(* - : int = 1 *)
+parse_string a_eoi "one plus plus" None;
+(* - : int = 1 *)
+parse_string a_eoi "one plus one plus" None;
+(* - : int = 2 *)
+parse_string a_eoi "one plus one plus plus" None;
+(* - : int = 2 *)
+
+(* Curiously, you may only repeat the operator twice. If you specify it three
+times, gramlib complains. *)
+
+parse_string a_eoi "one plus plus plus" None ;
+(* File "<string>", line 1, characters 9-13 *)
+(* Stream.Error("EOI expected after [a] (in [a_eoi])") *)
+(* Exception: Failure "Syntax Error". *)
+parse_string a_eoi "one plus one plus plus plus" None ;
+(* File "<string>", line 1, characters 18-22 *)
+(* Stream.Error("EOI expected after [a] (in [a_eoi])") *)
+(* Exception: Failure "Syntax Error". *)