2 (* ATTENZIONE: ci sono problemi con i .ind e i .var!!!! *)
7 open Mathql_semantics;;
9 (* estrae il fid dalla uri(str) e toglie le virgole, es: ",1,1,1,1" -> "1111" *)
11 let pos = String.index str ',' in
12 Str.string_after str (pos+1)
28 (* FUNZIONE DI MATCHING: prende il descrittore del file delle uri e il path da
29 matchare formato stringa e restituisce la lista dei path che fanno match in
30 formato stringa !! TAIL-RECURSIVE !! *)
32 let pmatch inp pre path fi =
33 let rec aux inp pre path fi acc =
36 Some (Str.string_after (input_line(inp)) 57)
37 with End_of_file -> None
41 if (String.get s 0) != ' '
44 let cpos = String.index s ':' in
46 let apre = Str.string_before s cpos in (* prendo il pre in s *)
48 let s2 = Str.string_after s (cpos+1) in
49 let p = (String.length s2)-2 (* NON capisco perche' con 3 non vada bene !!!!*)
52 let sok = Str.string_before s2 p in
55 if fi = "" (* CASO fi VUOTO*)
57 if pre = "[^/]*" (* CASO pre QUALSIASI*)
59 if (Str.string_match (Str.regexp path) sok 0)
62 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
64 let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
66 let pos= String.index sok '"'
68 let sokv= Str.string_before sok pos
71 (* let sokve = sokv ^ ".xml"
73 aux inp pre path fi (sokv::acc)
76 (aux inp pre path fi acc)
78 else (* CASO pre SPECIFICO *)
81 (*print_endline ("sok:" ^ sok);
82 print_endline ("path:" ^ path);*)
84 if (Str.string_match (Str.regexp path) sok 0) && (apre = pre)
87 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
89 let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
91 let pos= String.index sok '"'
93 let sokv= Str.string_before sok pos
96 (*let sokve = sokv ^ ".xml"
98 aux inp pre path fi (sokv::acc)
101 (aux inp pre path fi acc)
105 else (* CASO fi ESISTENTE *)
107 if pre = "[^/]*" (* CASO pre QUALSIASI*)
110 if String.contains sok ','
112 let pos = String.index sok ',' in
113 let sokwfi = Str.string_before sok pos in
114 if (Str.string_match (Str.regexp path) sokwfi 0) &&
115 (Str.string_match (Str.regexp fi) (extract_fid sok) 0)
118 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
120 let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
122 let pos= String.index sok '"'
124 let sokv= Str.string_before sok pos
126 (* let sokve = sokv ^ ".xml"
128 aux inp pre path fi (sokv::acc)
131 (aux inp pre path fi acc)
133 (aux inp pre path fi acc)
135 else (* CASO pre SPECIFICO *)
136 if String.contains sok ','
138 let pos = String.index sok ',' in
139 let sokwfi = Str.string_before sok pos in
140 if (Str.string_match (Str.regexp path) sokwfi 0) &&
141 (Str.string_match (Str.regexp fi) (extract_fid sok) 0) && (apre = pre)
144 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
146 let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
148 let pos= String.index sok '"'
150 let sokv= Str.string_before sok pos
152 (*let sokve = sokv ^ ".xml"
154 aux inp pre path fi (sokv::acc)
157 (aux inp pre path fi acc)
159 (aux inp pre path fi acc)
162 (aux inp pre path fi acc)
163 | None -> List.rev acc
165 aux inp pre path fi []
171 (* Data una lista di token restituisce la stringa formata da tutti i token ----> DA TESTARE!!!! *)
172 let rec token_to_str p =
176 let h = match head with
177 MQBC s -> Str.global_replace (Str.regexp "\.") "." s
183 h ^ (token_to_str tail)
190 | MQFC i :: tail -> "/" ^ (string_of_int i) ^ (fieval tail)
191 | MQFS :: tail -> "[^/]*" ^ (fieval tail)
192 | MQFSS :: tail -> ".*" ^ (fieval tail)
196 * conversione di un fragment identifier
202 "#xpointer\\\\(1" ^ fieval fi ^ "\\\\)" (* NON MI E' CHIARO IL PERCHE'!!!! *)
208 head::tail -> let uril_hd = List.hd uril in
209 { uri = uril_hd; attributes = []; extra = ""}::attul (List.tl uril);
214 (* prende preambolo, body (lista di token con "/"), fi (lista di token senza
215 "/") e restituisce la lista
216 di uri (LISTA DI attributed_uri), contenuti nel file getallrdfuris.xml, che fanno match con l'espressione regolare ricavata da body e con quella ricavata da fi.. tutto
217 chiamando la "pmatch()"
219 ATTENZIONE: il tag in getallrdfuris.xml <allrdfuris> deve essere piu' lungo,
220 altrimenti "string_match()" da' errore!
223 let pattern_ex (apreamble, apattern, afragid) =
224 let path = token_to_str apattern in
225 let fi = fieval afragid in
226 let pre = preeval apreamble in
227 let inp = open_in "./getallrdfuris.xml" in
229 let uril = pmatch inp pre path fi in