summaryrefslogtreecommitdiff
path: root/test/ragel.d/scan6.rl
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