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
(** This function generates a parsing function which outputs an 'a
option Note that some lines may not yield any correct output, so
the output is an option. **)
let create_lib_parse_fun ~name ~regexp_str ~processing =
let parser line =
try Scanf.sscanf line regexp_str processing with
| End_of_file ->
Printf.printf "could not match %s (%s): line to short\n" name line ;
None
| Scanf.Scan_failure m ->
Printf.printf "could not match %s (%s): %s\n" name line m ;
None
in
parser
let create_parse_fun ~name ~regexp_str ~ =
let parser line ~onerror ~process =
try
match Scanf.sscanf line regexp_str extract_fun with
| None ->
Printf.printf "Fields of %s could not be parsed (%s)\n" name line ;
onerror ()
| Some args ->
process args
with
| End_of_file ->
Printf.printf "could not match %s (%s): line to short\n" name line ;
onerror ()
| Scanf.Scan_failure m ->
Printf.printf "could not match %s (%s): %s\n" name line m ;
onerror ()
in
parser
let parse_list ?(cond = fun _ -> true) form s =
let stream = Scanf.Scanning.from_string s in
let rec do_parse acc =
try
let new_val = Scanf.bscanf stream form (fun x -> x) in
if cond new_val then do_parse (new_val :: acc) else acc
with
| Scanf.Scan_failure _ ->
acc
| End_of_file ->
acc
in
do_parse []