blob: d841f1106d8812c0531f8e7e9dcea1587bb39162 (
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
56
57
58
59
60
61
62
|
(*
* @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 scanner;
# Warning: changing the patterns or the input string will affect the
# coverage of the scanner action types.
main := |*
'a' => {
got `Pat1;
print_string "got pat1\n";
};
[ab]+ . 'c' => {
got `Pat2;
print_string "got pat2\n";
};
any => {
got `Any;
print_string "got any\n";
};
*|;
write data;
}%%
let fail fmt = Printf.ksprintf failwith fmt
let () =
let expect = ref [`Pat1; `Any; `Pat2; `Any; `Any; `Any; ] in
let got z = match !expect with
| [] -> fail "nothing more expected"
| x::xs -> expect := xs; if z <> x then fail "mismatch"
in
let ts = ref 0 and te = ref 0 and cs = ref 0 and act = ref 0 in
let data = "araabccde" in
let p = ref 0 and pe = ref (String.length data) in
let eof = ref !pe in
%% write init;
%% write exec;
()
##### OUTPUT #####
got pat1
got any
got pat2
got any
got any
got any
|