blob: bb7e0939edd995d94ee19fa7029cd24c9698b6c7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
(*
* @LANG: ocaml
*)
let id x = x
let fail fmt = Printf.ksprintf failwith fmt
let pr fmt = Printf.ksprintf print_endline fmt
let failed fmt = Printf.ksprintf (fun s -> prerr_endline s; exit 1) fmt
let test' show f x y = if f x <> y then failed "FAILED: test %S" (show x)
let case = ref 0
let test f x y = incr case; if f x <> y then failed "FAILED: case %d" !case
let error f x = match try Some (f x) with _ -> None with Some _ -> failed "FAILED: fail %S" x | None -> ()
%% machine cond;
%% write data;
let fail fmt = Printf.ksprintf failwith fmt
let run data n =
let cs = ref 0 in
let p = ref 0 in
let pe = ref (String.length data) in
let i = ref 0 in
%%{
action test_len { i < n }
main := (
"d"
[0-9]+
":"
( [a-z] when test_len )* ${ i := i.contents + 1 }
)**;
write init;
write exec;
}%%
if !cs < cond_first_final then
print_string "fail\n"
else
print_string "ok\n"
let () =
run "d2:abc" ( ref 1 );
run "d2:abc" ( ref 2 );
run "d2:abc" ( ref 3 );
run "d2:abc" ( ref 4 );
##### OUTPUT #####
fail
fail
ok
ok
|