]> matita.cs.unibo.it Git - helm.git/blob - helm/ocaml/mathql_interpreter_galax/pattern.ml
1d4731ec45fc1fac74be18392884de12469ecd61
[helm.git] / helm / ocaml / mathql_interpreter_galax / pattern.ml
1
2                  (* ATTENZIONE: ci sono problemi con i .ind e i .var!!!! *)
3
4
5
6 open MathQL;;
7 open Mathql_semantics;;
8
9 (* estrae il fid dalla uri(str) e toglie le virgole, es: ",1,1,1,1" -> "1111" *)
10 let extract_fid str = 
11         let pos = String.index str ',' in
12           Str.string_after str (pos+1) 
13 ;;
14
15
16 (*
17  * valuta il preambolo
18  *)
19 let preeval p =
20  match p with 
21     Some s -> s
22   | None -> "[^/]*"
23 ;;
24
25
26
27
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 !! *)
31
32 let pmatch inp pre path fi =
33         let rec aux inp pre path fi acc =  
34          
35           let s= try
36             Some (Str.string_after (input_line(inp)) 57)
37                  with End_of_file -> None 
38           in 
39           match s with
40             | Some s ->
41               if (String.get s 0) != ' '
42                then       
43                 begin
44                 let cpos = String.index s ':' in
45
46                 let apre = Str.string_before s cpos in   (* prendo il pre in s *)
47
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 !!!!*)
50                  in
51
52                 let sok = Str.string_before s2 p in
53
54                   
55                   if fi = ""       (* CASO fi VUOTO*)
56                     then
57                       if pre = "[^/]*"   (* CASO pre QUALSIASI*)
58                         then      
59                           if (Str.string_match (Str.regexp path) sok 0) 
60                             then
61                               begin       
62                                 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok 
63                                 in      
64                                  let sokgs = Str.global_replace (Str.regexp ",") "/" sokg 
65                                   *)
66                                 let pos= String.index sok '"'
67                                 in                                      
68                                   let sokv= Str.string_before sok pos 
69                                   in    
70                                   
71                                   (*  let sokve = sokv ^ ".xml"
72                                       in*)
73                                         aux inp pre path fi (sokv::acc)
74                               end  
75                             else
76                               (aux inp pre path fi acc)
77                               
78                         else                (* CASO pre SPECIFICO *)
79
80                         begin
81                           (*print_endline ("sok:" ^ sok);
82                           print_endline ("path:" ^ path);*)
83                         
84                           if (Str.string_match (Str.regexp path) sok 0) && (apre = pre)
85                             then
86                               begin
87                                 (*let sokg = Str.replace_first (Str.regexp ",") "#" sok 
88                                 in      
89                                  let sokgs = Str.global_replace (Str.regexp ",") "/" sokg 
90                                   in*)
91                                 let pos= String.index sok '"'
92                                 in                                      
93                                   let sokv= Str.string_before sok pos 
94                                   in  
95
96                                     (*let sokve = sokv ^ ".xml"
97                                       in*)
98                                         aux inp pre path fi (sokv::acc)
99                               end  
100                             else
101                               (aux inp pre path fi acc)
102  
103                       end
104                               
105                     else        (* CASO fi ESISTENTE *)
106
107                       if pre = "[^/]*"   (* CASO pre QUALSIASI*)
108                       then
109                               
110                       if String.contains sok ','                          
111                         then
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)
116                                 then
117                                   begin
118                                     (*let sokg = Str.replace_first (Str.regexp ",") "#" sok 
119                                     in
120                                       let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
121                                       in*)
122                                         let pos= String.index sok '"'
123                                         in                                      
124                                           let sokv= Str.string_before sok pos 
125                                           in    
126                                            (* let sokve = sokv ^ ".xml"
127                                             in*)
128                                               aux inp pre path fi (sokv::acc)         
129                                   end
130                                 else
131                                   (aux inp pre path fi acc)
132                         else
133                           (aux inp pre path fi acc)
134                       
135                       else                            (* CASO pre SPECIFICO *)
136                         if String.contains sok ','                          
137                         then
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)
142                                 then
143                                   begin
144                                     (*let sokg = Str.replace_first (Str.regexp ",") "#" sok 
145                                     in
146                                       let sokgs = Str.global_replace (Str.regexp ",") "/" sokg
147                                       in*)
148                                         let pos= String.index sok '"'
149                                         in                                      
150                                           let sokv= Str.string_before sok pos 
151                                           in    
152                                             (*let sokve = sokv ^ ".xml"
153                                             in*)
154                                               aux inp pre path fi (sokv::acc)         
155                                   end
156                                 else
157                                   (aux inp pre path fi acc)
158                         else
159                           (aux inp pre path fi acc)
160                   end     
161                else
162                  (aux inp pre path fi acc)
163             | None -> List.rev acc 
164         in
165           aux inp pre path fi []                            
166 ;;
167
168
169
170
171 (* Data una lista di token restituisce la stringa formata da tutti i token ----> DA TESTARE!!!! *)
172 let rec token_to_str p =
173  match p with
174    [] -> ""
175  | head::tail ->
176     let h = match head with
177                MQBC s -> Str.global_replace (Str.regexp "\.") "." s
178             |  MQBD -> "/"
179             |  MQBQ -> "[^/#]?"
180             |  MQBS -> "[^/#]*"
181             |  MQBSS -> "[^#]*"
182     in
183      h ^ (token_to_str tail)
184 ;;
185
186
187 let rec fieval fi =
188  match fi with
189     [] -> ""
190   | MQFC i :: tail -> "/" ^ (string_of_int i) ^ (fieval tail)
191   | MQFS :: tail -> "[^/]*" ^ (fieval tail)
192   | MQFSS :: tail -> ".*"  ^ (fieval tail)
193 ;;
194
195 (*
196  * conversione di un fragment identifier
197  *)
198 let fieval fi =
199  if fi = [] then
200   ""
201  else
202   "#xpointer\\\\(1" ^ fieval fi ^ "\\\\)"   (* NON MI E' CHIARO IL PERCHE'!!!! *)
203 ;;
204
205
206 let rec attul uril =
207         match uril with
208           head::tail -> let uril_hd = List.hd uril in
209                           { uri = uril_hd; attributes = []; extra = ""}::attul (List.tl uril);
210         | [] -> [];
211 ;;        
212
213
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()"
218
219 ATTENZIONE: il tag in getallrdfuris.xml <allrdfuris> deve essere piu' lungo,
220             altrimenti "string_match()" da' errore!
221
222 *)
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
228                 seek_in inp 146;
229                 let uril = pmatch inp pre path fi in
230                   attul uril;
231 ;;
232      
233                         
234                          
235                         
236