+++ /dev/null
-
- (* ATTENZIONE: ci sono problemi con i .ind e i .var!!!! *)
-
-
-
-open MathQL;;
-open Mathql_semantics;;
-
-(* estrae il fid dalla uri(str) e toglie le virgole, es: ",1,1,1,1" -> "1111" *)
-let extract_fid str =
- let pos = String.index str ',' in
- Str.string_after str (pos+1)
-;;
-
-
-(*
- * valuta il preambolo
- *)
-let preeval p =
- match p with
- Some s -> s
- | None -> "[^/]*"
-;;
-
-
-
-
-(* FUNZIONE DI MATCHING: prende il descrittore del file delle uri e il path da
-matchare formato stringa e restituisce la lista dei path che fanno match in
-formato stringa !! TAIL-RECURSIVE !! *)
-
-let pmatch inp pre path fi =
- let rec aux inp pre path fi acc =
-
- let s= try
- Some (Str.string_after (input_line(inp)) 57)
- with End_of_file -> None
- in
- match s with
- | Some s ->
- if (String.get s 0) != ' '
- then
- begin
- let cpos = String.index s ':' in
-
- let apre = Str.string_before s cpos in (* prendo il pre in s *)
-
- let s2 = Str.string_after s (cpos+1) in
- let p = (String.length s2)-2 (* NON capisco perche' con 3 non vada bene !!!!*)
- in
-
- let sok = Str.string_before s2 p in
-
-
- if fi = "" (* CASO fi VUOTO*)
- then
- if pre = "[^/]*" (* CASO pre QUALSIASI*)
- then
- if (Str.string_match (Str.regexp path) sok 0)
- then
- begin
- (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
- in
- let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
- *)
- let pos= String.index sok '"'
- in
- let sokv= Str.string_before sok pos
- in
-
- (* let sokve = sokv ^ ".xml"
- in*)
- aux inp pre path fi (sokv::acc)
- end
- else
- (aux inp pre path fi acc)
-
- else (* CASO pre SPECIFICO *)
-
- begin
- (*print_endline ("sok:" ^ sok);
- print_endline ("path:" ^ path);*)
-
- if (Str.string_match (Str.regexp path) sok 0) && (apre = pre)
- then
- begin
- (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
- in
- let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
- in*)
- let pos= String.index sok '"'
- in
- let sokv= Str.string_before sok pos
- in
-
- (*let sokve = sokv ^ ".xml"
- in*)
- aux inp pre path fi (sokv::acc)
- end
- else
- (aux inp pre path fi acc)
-
- end
-
- else (* CASO fi ESISTENTE *)
-
- if pre = "[^/]*" (* CASO pre QUALSIASI*)
- then
-
- if String.contains sok ','
- then
- let pos = String.index sok ',' in
- let sokwfi = Str.string_before sok pos in
- if (Str.string_match (Str.regexp path) sokwfi 0) &&
- (Str.string_match (Str.regexp fi) (extract_fid sok) 0)
- then
- begin
- (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
- in
- let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
- in*)
- let pos= String.index sok '"'
- in
- let sokv= Str.string_before sok pos
- in
- (* let sokve = sokv ^ ".xml"
- in*)
- aux inp pre path fi (sokv::acc)
- end
- else
- (aux inp pre path fi acc)
- else
- (aux inp pre path fi acc)
-
- else (* CASO pre SPECIFICO *)
- if String.contains sok ','
- then
- let pos = String.index sok ',' in
- let sokwfi = Str.string_before sok pos in
- if (Str.string_match (Str.regexp path) sokwfi 0) &&
- (Str.string_match (Str.regexp fi) (extract_fid sok) 0) && (apre = pre)
- then
- begin
- (*let sokg = Str.replace_first (Str.regexp ",") "#" sok
- in
- let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
- in*)
- let pos= String.index sok '"'
- in
- let sokv= Str.string_before sok pos
- in
- (*let sokve = sokv ^ ".xml"
- in*)
- aux inp pre path fi (sokv::acc)
- end
- else
- (aux inp pre path fi acc)
- else
- (aux inp pre path fi acc)
- end
- else
- (aux inp pre path fi acc)
- | None -> List.rev acc
- in
- aux inp pre path fi []
-;;
-
-
-
-
-(* Data una lista di token restituisce la stringa formata da tutti i token ----> DA TESTARE!!!! *)
-let rec token_to_str p =
- match p with
- [] -> ""
- | head::tail ->
- let h = match head with
- MQBC s -> Str.global_replace (Str.regexp "\.") "." s
- | MQBD -> "/"
- | MQBQ -> "[^/#]?"
- | MQBS -> "[^/#]*"
- | MQBSS -> "[^#]*"
- in
- h ^ (token_to_str tail)
-;;
-
-
-let rec fieval fi =
- match fi with
- [] -> ""
- | MQFC i :: tail -> "/" ^ (string_of_int i) ^ (fieval tail)
- | MQFS :: tail -> "[^/]*" ^ (fieval tail)
- | MQFSS :: tail -> ".*" ^ (fieval tail)
-;;
-
-(*
- * conversione di un fragment identifier
- *)
-let fieval fi =
- if fi = [] then
- ""
- else
- "#xpointer\\\\(1" ^ fieval fi ^ "\\\\)" (* NON MI E' CHIARO IL PERCHE'!!!! *)
-;;
-
-
-let rec attul uril =
- match uril with
- head::tail -> let uril_hd = List.hd uril in
- { uri = uril_hd; attributes = []; extra = ""}::attul (List.tl uril);
- | [] -> [];
-;;
-
-
-(* prende preambolo, body (lista di token con "/"), fi (lista di token senza
-"/") e restituisce la lista
-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
-chiamando la "pmatch()"
-
-ATTENZIONE: il tag in getallrdfuris.xml <allrdfuris> deve essere piu' lungo,
- altrimenti "string_match()" da' errore!
-
-*)
-let pattern_ex (apreamble, apattern, afragid) =
- let path = token_to_str apattern in
- let fi = fieval afragid in
- let pre = preeval apreamble in
- let inp = open_in "./getallrdfuris.xml" in
- seek_in inp 146;
- let uril = pmatch inp pre path fi in
- attul uril;
-;;
-
-
-
-
-