1:- module(pac_regex_prepare, []). 2
3char_types(S) :-
4 Types = [alnum, alpha, csym, csymf,digit,lower,cntrl,quote,white],
5 setof(T, X^(member(T, Types), char_type(X, T)), S0),
6 setof(paren(X), A^char_type(A, paren(X)), S1),
7 union(S0, S1, S).
8
9
10types_intervals(X):- char_types(S),
11 maplist(type_intervals, S, Y),
12 maplist([T, Is, T-Is], S, Y, X).
13
14type_intervals(T, Is):-
15 setof(J, (between(0, 255, J), code_type(J, T)), Cs),
16 maplist(code_char, Cs, Js),
17 codes_intervals(Js, Is).
18
19code_char(I, A):- char_code(A, I).
20
21char_type_pairs(T0, T1):-
22 char_types(S),
23 member(T0, S),
24 member(T1, S),
25 T0 @< T1,
26 char_type(X, T0),
27 char_type(X, T1).
28
29char_type_pairs(S):- setof(T0-T1, char_type_pairs(T0, T1), S).
30
32type_interval_table([alnum-['0'-'9', 'A'-'Z', a-z],
33 alpha-['A'-'Z', a-z],
34 cntrl-['\000\'-'\037\', '\177\'],
35 csym-['0'-'9', 'A'-'Z', '_', a-z],
36 csymf-['A'-'Z', '_', a-z],
37 digit-['0'-'9'],
38 lower-[a-z],
39 quote-['"', '\'', '`'],
40 white-['\t', ' '],
41 paren(')')-['('],
42 paren(']')-['['],
43 paren('}')-['{']]).
44
45codes_intervals([], []).
46codes_intervals([A|Chars], Is):- codes_intervals(Chars, Js),
47 codes_intervals(A, Js, Is).
48
50codes_intervals(A, [], [A]).
51codes_intervals(A, [X-Y|R], [A-Y|R]):- next_char(A, X).
52codes_intervals(A, [X-Y|R], [A, X-Y|R]).
53codes_intervals(A, [X|R], [A-X|R]):- atom(X),
54 next_char(A, X).
55codes_intervals(A, [X|R], [A, X|R]):- atom(X)