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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
open Import
module Cset = struct
include Cset
module Range = struct
type t =
{ first : Char.t
; last : Char.t
}
let first t = t.first
let last t = t.last
end
let view t =
fold_right t ~init:[] ~f:(fun first last acc ->
let range = { Range.first = Cset.to_char first; last = Cset.to_char last } in
range :: acc)
;;
end
module Sem = Automata.Sem
module Rep_kind = Automata.Rep_kind
type t =
| Set of Cset.t
| Sequence of Ast.t list
| Alternative of Ast.t list
| Repeat of Ast.t * int * int option
| Beg_of_line
| End_of_line
| Beg_of_word
| End_of_word
| Not_bound
| Beg_of_str
| End_of_str
| Last_end_of_line
| Start
| Stop
| Sem of Automata.Sem.t * Ast.t
| Sem_greedy of Automata.Rep_kind.t * Ast.t
| Group of string option * Ast.t
| No_group of Ast.t
| Nest of Ast.t
| Case of Ast.t
| No_case of Ast.t
| Intersection of Ast.t list
| Complement of Ast.t list
| Difference of Ast.t * Ast.t
| Pmark of Pmark.t * Ast.t
let view_ast f (t : _ Ast.ast) : t =
match t with
| Alternative a -> Alternative (List.map ~f a)
| No_case a -> No_case (f a)
| Case a -> Case (f a)
;;
let view_set (cset : Ast.cset) : t =
match cset with
| Cset set -> Set set
| Intersection sets -> Intersection (List.map sets ~f:Ast.t_of_cset)
| Complement sets -> Complement (List.map sets ~f:Ast.t_of_cset)
| Difference (x, y) -> Difference (Ast.t_of_cset x, Ast.t_of_cset y)
| Cast ast -> view_ast Ast.t_of_cset ast
;;
let view : Ast.t -> t = function
| Set s -> view_set s
| Ast s -> view_ast (fun x -> x) s
| Sem (sem, a) -> Sem (sem, a)
| Sem_greedy (sem, a) -> Sem_greedy (sem, a)
| Sequence s -> Sequence s
| Repeat (t, x, y) -> Repeat (t, x, y)
| Beg_of_line -> Beg_of_line
| End_of_line -> End_of_line
| Beg_of_word -> Beg_of_word
| End_of_word -> End_of_word
| Not_bound -> Not_bound
| Beg_of_str -> Beg_of_str
| End_of_str -> End_of_str
| Last_end_of_line -> Last_end_of_line
| Start -> Start
| Stop -> Stop
| No_group a -> No_group a
| Group (name, t) -> Group (name, t)
| Nest t -> Nest t
| Pmark (pmark, t) -> Pmark (pmark, t)
;;