00001 #include "../../include/Parser/TParserScomponi.h"
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 void TParserScomponi::Libera_Memoria(rif* vettore_riferimenti)
00016 { int indice_rif,indice_scomp,i;
00017 for (indice_rif=1;indice_rif<=vettore_riferimenti->numero_scomposizioni;indice_rif++)
00018 {
00019 for (indice_scomp=1;indice_scomp<=(vettore_riferimenti+indice_rif-1)->lunghezza_scomp;indice_scomp++)
00020 {
00021 i=0;
00022 while(i<(((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->n_colonne)
00023 { free(*((((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->scomposizione+i));
00024 i++;
00025 }
00026
00027 free((((vettore_riferimenti+indice_rif-1)->scomposizioni)+indice_scomp-1)->scomposizione);
00028
00029 }
00030
00031 free((vettore_riferimenti+indice_rif-1)->scomposizioni);
00032 free((vettore_riferimenti+indice_rif-1)->descrizione);
00033 }
00034 free(vettore_riferimenti);
00035 }
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 int TParserScomponi::Gestione_assegnazione(char* funzione,int* errore,int* n_variabili)
00063 {
00064 int posizione_assegnazione;
00065 int i;
00066 int cont_variabili;
00067 char str_assegnazione[150];
00068 int parentesi_apri=0;
00069 int parentesi_chiudi=0;
00070 int posizione_virgola;
00071 int posizione_start;
00072 int len_assegn;
00073
00074
00075 posizione_assegnazione = Instr(1, funzione, ":=");
00076
00077 *errore = 1;
00078 i = 0;
00079 if (posizione_assegnazione > 0)
00080
00081 { Mid(str_assegnazione,funzione, 1, posizione_assegnazione - 1);
00082 len_assegn=Len(str_assegnazione);
00083
00084 while ((*errore == 1)&&(i < len_assegn))
00085 {
00086 if ((str_assegnazione[i] < 'A') || (str_assegnazione[i] > 'z'))
00087 {if ((str_assegnazione[i] != '(') && (str_assegnazione[i] != ')') && (str_assegnazione[i] != ','))
00088
00089 errore = 0;
00090 else
00091 { if (str_assegnazione[i] == '(')
00092 parentesi_apri++;
00093 else
00094 { if (str_assegnazione[i] == ')')
00095 parentesi_chiudi++;
00096 if (i > 1)
00097 {
00098 if ((str_assegnazione[i-1]== ',') && (str_assegnazione[i] == ','))
00099 errore = 0;
00100 }
00101 }
00102
00103 if ((parentesi_chiudi > 1) || (parentesi_apri > 1))
00104 errore = 0;
00105 }
00106 }
00107
00108 i = i + 1;
00109 }
00110
00111 if (parentesi_chiudi != parentesi_apri)
00112 errore = 0;
00113
00114 if (*errore == 1)
00115
00116 {if (((Instr(1, str_assegnazione, "(")) > 1) && ((Instr(1, str_assegnazione, ")")) < Len(str_assegnazione)))
00117 errore = 0;
00118 }
00119
00120
00121 if (*errore == 1)
00122 { cont_variabili = 0;
00123 if (Instr(1, str_assegnazione, "(") > 1)
00124 {
00125 posizione_virgola = Instr(1, str_assegnazione, ",");
00126 posizione_start = Instr(1, str_assegnazione, "(");
00127 cont_variabili = 1;
00128 while (posizione_virgola > 0)
00129 {
00130 posizione_start = posizione_virgola;
00131
00132 posizione_virgola = Instr(posizione_virgola + 1, str_assegnazione, ",");
00133
00134 cont_variabili = cont_variabili + 1;
00135 }
00136
00137 variabili=(variab*)malloc(sizeof(variab)*cont_variabili);
00138 posizione_virgola = Instr(1, str_assegnazione, ",");
00139 posizione_start = Instr(1, str_assegnazione, "(");
00140
00141 for (i=0;i<cont_variabili-1;i++)
00142 {
00143
00144 (variabili+i)->variabile=(char*)malloc(sizeof(char)*(posizione_virgola - posizione_start ));
00145 Mid((variabili+i)->variabile,str_assegnazione, posizione_start+1 , posizione_virgola - posizione_start - 1);
00146 posizione_start = posizione_virgola;
00147 posizione_virgola = Instr(posizione_virgola + 1, str_assegnazione, ",");
00148 }
00149 (variabili+i)->variabile=(char*)malloc(sizeof(char)*(Len(str_assegnazione) - posizione_start ));
00150 Mid((variabili+i)->variabile,str_assegnazione, posizione_start + 1, Len(str_assegnazione) - posizione_start - 1);
00151
00152 }
00153
00154 *n_variabili = cont_variabili;
00155 return(1);
00156 }
00157 }
00158
00159 return(0);
00160 }
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 void TParserScomponi::Lcase(char* funzione)
00177 {
00178
00179 int lunghezza,i,j;
00180 lunghezza=Len(funzione);
00181 char funzione_temp[3];
00182 for(i=0;i<lunghezza;i++)
00183 {
00184
00185
00186 Mid(funzione_temp,funzione,i+2,2);
00187 if(((funzione[i]=='s')||(funzione[i]=='S')) && ((strcmp(funzione_temp,"in")==0)||(strcmp(funzione_temp,"In")==0)||(strcmp(funzione_temp,"iN")==0)||(strcmp(funzione_temp,"IN")==0)))
00188 {
00189 if(funzione[i]>'Z')
00190 funzione[i]=funzione[i]-32;
00191 for(j=1;j<=2;j++)
00192 {if(funzione[i+j]<'a')
00193 funzione[i+j]=funzione[i+j]+32;
00194 }
00195 i=i+2;
00196 Mid(funzione_temp,funzione,i+2,2);
00197
00198 }
00199
00200 if(((funzione[i]=='c')||(funzione[i]=='C')) && ((strcmp(funzione_temp,"os")==0)||(strcmp(funzione_temp,"Os")==0)||(strcmp(funzione_temp,"oS")==0)||(strcmp(funzione_temp,"OS")==0)))
00201 {
00202 if(funzione[i]>'Z')
00203 funzione[i]=funzione[i]-32;
00204 for(j=1;j<=2;j++)
00205 {if(funzione[i+j]<'a')
00206 funzione[i+j]=funzione[i+j]+32;
00207 }
00208 i=i+2;
00209 Mid(funzione_temp,funzione,i+2,2);
00210
00211 }
00212
00213 if(((funzione[i]=='a')||(funzione[i]=='A')) && ((strcmp(funzione_temp,"bs")==0)||(strcmp(funzione_temp,"Bs")==0)||(strcmp(funzione_temp,"bS")==0)||(strcmp(funzione_temp,"BS")==0)))
00214 {
00215 if(funzione[i]>'Z')
00216 funzione[i]=funzione[i]-32;
00217 for(j=1;j<=2;j++)
00218 {if(funzione[i+j]<'a')
00219 funzione[i+j]=funzione[i+j]+32;
00220 }
00221 i=i+2;
00222 Mid(funzione_temp,funzione,i+2,2);
00223
00224 }
00225
00226
00227 if(((funzione[i]=='t')||(funzione[i]=='T')) && ((strcmp(funzione_temp,"an")==0)||(strcmp(funzione_temp,"An")==0)||(strcmp(funzione_temp,"aN")==0)||(strcmp(funzione_temp,"AN")==0)))
00228 {
00229 if(funzione[i]>'Z')
00230 funzione[i]=funzione[i]-32;
00231 for(j=1;j<=2;j++)
00232 {if(funzione[i+j]<'a')
00233 funzione[i+j]=funzione[i+j]+32;
00234 }
00235 i=i+2;
00236 Mid(funzione_temp,funzione,i+2,2);
00237
00238 }
00239
00240 if(((funzione[i]=='l')||(funzione[i]=='L')) && ((strcmp(funzione_temp,"og")==0)||(strcmp(funzione_temp,"Og")==0)||(strcmp(funzione_temp,"oG")==0)||(strcmp(funzione_temp,"OG")==0)))
00241 {
00242 if(funzione[i]>'Z')
00243 funzione[i]=funzione[i]-32;
00244 for(j=1;j<=2;j++)
00245 {if(funzione[i+j]<'a')
00246 funzione[i+j]=funzione[i+j]+32;
00247 }
00248 i=i+2;
00249 Mid(funzione_temp,funzione,i+2,2);
00250
00251 }
00252
00253 if(((funzione[i]=='e')||(funzione[i]=='E')) && ((strcmp(funzione_temp,"xp")==0)||(strcmp(funzione_temp,"Xp")==0)||(strcmp(funzione_temp,"xP")==0)||(strcmp(funzione_temp,"XP")==0)))
00254 {
00255 if(funzione[i]>'Z')
00256 funzione[i]=funzione[i]-32;
00257 for(j=1;j<=2;j++)
00258 {if(funzione[i+j]<'a')
00259 funzione[i+j]=funzione[i+j]+32;
00260 }
00261 i=i+2;
00262 }
00263
00264 if(((funzione[i]=='l')||(funzione[i]=='L')) && ((funzione[i+1]=='n')||(funzione[i+1]=='N')))
00265 {
00266 if(funzione[i]>'Z')
00267 funzione[i]=funzione[i]-32;
00268
00269 if(funzione[i+1]<'a')
00270 funzione[i+1]=funzione[i+j]+32;
00271
00272 i=i+1;
00273 }
00274
00275
00276 }
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 int TParserScomponi::Controllo_sintassi(char* funzione)
00293 {
00294 int i;
00295 int parentesi_apri=0;
00296 int parentesi_chiudi=0;
00297 int var_ok;
00298 int lunghezza=Len(funzione);
00299 char funzione_temp[5];
00300 if(lunghezza==0)
00301 return(0);
00302 for (i=0;i<lunghezza;i++)
00303 { if (funzione[i]=='(')
00304 parentesi_apri++;
00305 else
00306 {if (funzione[i]==')')
00307 parentesi_chiudi++;
00308 }
00309 }
00310 if(parentesi_chiudi!=parentesi_apri)
00311 return(0);
00312 i=0;
00313 while (i < lunghezza)
00314 { if ((funzione[i] == '+') || (funzione[i] == '-') || (funzione[i] == '*') || (funzione[i] == '/') || (funzione[i] == '^'))
00315 { if (i > 1)
00316 { switch (funzione[i])
00317 { case '-':
00318 {if ( (funzione[i-1] == '+')||(funzione[i-1] == '-'))
00319 return(0);
00320 break;
00321 }
00322 case '+':
00323 {if ((funzione[i-1] == '+')||(funzione[i-1] == '-'))
00324 return(0);
00325 break;
00326 }
00327 case '*':
00328 {if ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00329 return(0);
00330 break;
00331 }
00332 case '/':
00333 {if ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00334 return(0);
00335 break;
00336 }
00337 case '^':
00338 {if ((funzione[i-1] == '+') || (funzione[i-1] == '-') || (funzione[i-1] == '*') || (funzione[i-1] == '/') || (funzione[i-1] == '^'))
00339 return(0);
00340 break;
00341 }
00342 }
00343 if ((funzione[i-1] == '(') && ((funzione[i] == '*') || (funzione[i] == '/') || (funzione[i] =='^')))
00344 return(0);
00345 }
00346 if (i < lunghezza-1)
00347 { switch (funzione[i])
00348 { case '-':
00349 { if ((funzione[i+1]== '+') || (funzione[i+1]== '-') || (funzione[i+1]== '*') || (funzione[i+1]== '/'))
00350 return(0);
00351 break;
00352 }
00353 case '+':
00354 { if ((funzione[i+1]== '+') || (funzione[i+1]== '-') || (funzione[i+1]== '*') || (funzione[i+1]== '/'))
00355 return(0);
00356 break;
00357 }
00358 case '*':
00359 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00360 return(0);
00361 break;
00362 }
00363 case '/':
00364 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00365 return(0);
00366 break;
00367 }
00368 case '^':
00369 { if ((funzione[i+1] == '*') || (funzione[i+1] == '/') || (funzione[i+1] == '^'))
00370 return(0);
00371 break;
00372 }
00373 }
00374 if (funzione[i+1] == ')')
00375 return(0);
00376 } else
00377 return(0);
00378 } else
00379 { if ((funzione[i] >= 'A') && (funzione[i] <= 'z'))
00380 { var_ok = 0;
00381 if(funzione[i]=='[')
00382 var_ok=1;
00383 switch(funzione[i])
00384 { case 'A':
00385 { Mid(funzione_temp,funzione, i+2, 2);
00386 if ((strcmp(funzione_temp, "bs")!=0) && (var_ok == 0))
00387 return(0);
00388 else
00389 { if (strcmp(funzione_temp,"bs")==0)
00390 i = i + 3;
00391 else
00392 { if (var_ok == 1)
00393 i = Instr(i+1,funzione,"]") - 1;
00394 }
00395 }
00396 break;
00397 }
00398 case 'S':
00399 { Mid(funzione_temp,funzione, i+2, 3);
00400 if ((strcmp(funzione_temp, "in(")!=0) && (var_ok == 0))
00401 return(0);
00402 else
00403 { if (strcmp(funzione_temp,"in(")==0)
00404 i = i + 3;
00405 else
00406 { if (var_ok == 1)
00407 i = Instr(i+1,funzione,"]") - 1;
00408 }
00409 }
00410 break;
00411 }
00412
00413
00414 case 'C':
00415 {Mid(funzione_temp,funzione, i+2, 3);
00416 if ((strcmp(funzione_temp, "os(")!=0) && (var_ok == 0))
00417 return(0);
00418 else
00419 { if (strcmp(funzione_temp,"os(")==0)
00420 i = i + 3;
00421 else
00422 { if (var_ok == 1)
00423 i =Instr(i+1,funzione,"]") - 1;
00424 }
00425 }
00426 break;
00427 }
00428
00429
00430 case 'T':
00431 {Mid(funzione_temp,funzione, i+2, 3);
00432 if ((strcmp(funzione_temp, "an(")!=0) && (var_ok == 0))
00433 return(0);
00434 else
00435 { if (strcmp(funzione_temp,"an(")==0)
00436 i = i + 3;
00437 else
00438 { if (var_ok == 1)
00439 i = Instr(i+1,funzione,"]") - 1;
00440 }
00441 }
00442 break;
00443 }
00444
00445 case 'L':
00446 { Mid(funzione_temp,funzione, i+2, 3);
00447 if ((strcmp(funzione_temp, "og(")!=0)&&(var_ok == 0)&&(funzione_temp[0]!='n')&&(funzione_temp[1]!='('))
00448 return(0);
00449 else
00450 { if (strcmp(funzione_temp, "og(")==0)
00451 i = i + 3;
00452 else
00453 {if ((funzione_temp[0]=='n')&&(funzione_temp[1]=='('))
00454 i = i + 2;
00455 else
00456 {if (var_ok == 1)
00457 i = Instr(i+1,funzione,"]") - 1;
00458 }
00459 }
00460 }
00461 break;
00462 }
00463 case 'E':
00464 {Mid(funzione_temp,funzione, i+2, 3);
00465 if ((strcmp(funzione_temp, "xp(")!=0) && (var_ok == 0))
00466 return(0);
00467 else
00468 { if (strcmp(funzione_temp,"xp(")==0)
00469 i = i + 3;
00470 else
00471 { if (var_ok == 1)
00472 i = Instr(i+1,funzione,"]") - 1;
00473 }
00474 }
00475 break;
00476 }
00477
00478 default:
00479 {if (var_ok == 0)
00480 return(0);
00481 else
00482 i = Instr(i+1,funzione,"]") - 1;
00483 }
00484 }
00485 }else
00486 {if((funzione[i]!='(')&&(funzione[i]!=')')&&(funzione[i]<48)&&(funzione[i]>57))
00487 return(0);
00488 }
00489 }
00490 i++;
00491 }
00492
00493 return(1);
00494
00495 }
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511 void TParserScomponi::MettiPer(char* funzione)
00512 {
00513 int indice=0;
00514 char* funzione_temp;
00515 char* funzione_temp2;
00516 while (indice < Len(funzione))
00517 {
00518 if(funzione[indice]=='[')
00519 {if (indice > 0)
00520 { if ((funzione[indice-1] != '*')&&(funzione[indice-1] != '^') && (funzione[indice-1]!= '+')&&(funzione[indice-1] !='-') && (funzione[indice-1]!= '/') && (funzione[indice-1]!=' ')&&(funzione[indice-1]!= '('))
00521 { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00522 Mid(funzione_temp,funzione, 1, indice-1);
00523 Concatena(funzione_temp,"*");
00524 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00525 Mid(funzione_temp2,funzione, indice, Len(funzione) - indice );
00526 Concatena(funzione_temp,funzione_temp2);
00527 strcpy(funzione,funzione_temp);
00528 free(funzione_temp);
00529 free(funzione_temp2);
00530 }
00531 }
00532 indice = Instr(indice+1, funzione, "]");
00533 if ((Len(funzione) > indice + 1) && (funzione[indice]!='*')&&(funzione[indice]!='^')&&(funzione[indice]!='+')&&(funzione[indice]!='-')&&(funzione[indice]!='/')&&(funzione[indice]!=' ')&&(funzione[indice]!=')'))
00534 { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00535 Mid(funzione_temp,funzione, 1, indice);
00536 Concatena(funzione_temp,"*");
00537 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+2));
00538 Mid(funzione_temp2,funzione, indice + 1, Len(funzione) - indice+1 );
00539 Concatena(funzione_temp,funzione_temp2);
00540 strcpy(funzione,funzione_temp);
00541 free(funzione_temp);
00542 free(funzione_temp2);
00543 }
00544 }
00545 if (funzione[indice] == '(')
00546 {if (indice > 0)
00547 {if (funzione[indice-1] == ')')
00548 {
00549 funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00550 Mid(funzione_temp,funzione, 1, indice-1);
00551 Concatena(funzione_temp,"*");
00552 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00553 Mid(funzione_temp2,funzione, indice,Len(funzione) - indice );
00554 Concatena(funzione_temp,funzione_temp2);
00555 strcpy(funzione,funzione_temp);
00556 indice++;
00557 free(funzione_temp);
00558 free(funzione_temp2);
00559 }
00560 }
00561 }
00562
00563 if (funzione[indice] == ')')
00564 {if ((Len(funzione) > indice + 1) && (funzione[indice+1] !='*') && (funzione[indice+1]!= '^')&&(funzione[indice+1]!= '+')&&(funzione[indice+1]!= '-')&&(funzione[indice+1]!= '/')&&(funzione[indice+1]!= ' ')&&(funzione[indice+1]!= ')'))
00565 { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00566 Mid(funzione_temp,funzione, 1, indice+1);
00567 Concatena(funzione_temp,"*");
00568 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+3));
00569 Mid(funzione_temp2,funzione, indice + 2, Len(funzione) - indice+2 );
00570 Concatena(funzione_temp,funzione_temp2);
00571 strcpy(funzione,funzione_temp);
00572 indice++;
00573 free(funzione_temp);
00574 free(funzione_temp2);
00575 }
00576 }
00577
00578 if ((funzione[indice]>=48)&&(funzione[indice]<=57))
00579 {if (indice > 0)
00580 {if ((funzione[indice-1]!='*') && (funzione[indice-1]!=',') && (funzione[indice-1]!='(') && (funzione[indice-1]!='^') && (funzione[indice-1]!='+') && (funzione[indice-1]!='-') && (funzione[indice-1]!='/') && (funzione[indice-1]!=' ')&&(funzione[indice-1]!='[') && ((funzione[indice-1]<48) || (funzione[indice-1]>57)))
00581 {
00582 funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00583 Mid(funzione_temp,funzione, 1, indice-1);
00584 Concatena(funzione_temp,"*");
00585 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+1));
00586 Mid(funzione_temp2,funzione, indice, Len(funzione) - indice );
00587 Concatena(funzione_temp,funzione_temp2);
00588 strcpy(funzione,funzione_temp);
00589 indice++;
00590 free(funzione_temp);
00591 free(funzione_temp2);
00592 }
00593 }
00594 if ((Len(funzione) > indice + 1)&&(funzione[indice+1] !='*')&&(funzione[indice+1] !=',')&&(funzione[indice+1] !=')')&&(funzione[indice+1] !='^')&&(funzione[indice+1] !='+')&&(funzione[indice+1] !=';')&&(funzione[indice+1] !='-')&&(funzione[indice+1] !='/')&&(funzione[indice+1] !=' ')&&((funzione[indice+1]<48) || (funzione[indice+1]>57)))
00595 { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00596 Mid(funzione_temp,funzione, 1, indice+1);
00597 Concatena(funzione_temp,"*");
00598 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-indice+3));
00599 Mid(funzione_temp2,funzione, indice + 2, Len(funzione) - indice +2);
00600 Concatena(funzione_temp,funzione_temp2);
00601 strcpy(funzione,funzione_temp);
00602 indice++;
00603 free(funzione_temp);
00604 free(funzione_temp2);
00605 }
00606 }
00607 indice++;
00608 }
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628 void TParserScomponi::ParentesiElevati(char* funzione)
00629 {
00630 int posizione_elevato;
00631 int numero_parentesi;
00632 int posizione_scorr;
00633 int flag;
00634 char* funzione_temp;
00635 char* funzione_temp2;
00636 posizione_elevato=Instr(1,funzione,"^")-1;
00637
00638 while (posizione_elevato > 0)
00639 { posizione_scorr = posizione_elevato-1;
00640 if (funzione[posizione_scorr]!= ')')
00641 {while ((posizione_scorr > 0)&&(funzione[posizione_scorr]!= '^')&&(funzione[posizione_scorr]!= '*')&&(funzione[posizione_scorr]!= '/')&&(funzione[posizione_scorr]!= '+')&&(funzione[posizione_scorr]!= '-')&&(funzione[posizione_scorr]!= '('))
00642 { posizione_scorr--;
00643 }
00644 if (posizione_scorr > 0)
00645 posizione_scorr++;
00646 }
00647 else
00648 { numero_parentesi = 1;
00649 while (numero_parentesi > 0)
00650 { posizione_scorr--;
00651 if (funzione[posizione_scorr] == ')')
00652 numero_parentesi++;
00653 else
00654 {if (funzione[posizione_scorr] == '(')
00655 numero_parentesi--;
00656 }
00657 }
00658 }
00659 funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+5));
00660 Mid(funzione_temp,funzione, 1, posizione_scorr );
00661 Concatena(funzione_temp,"(");
00662 funzione_temp2=(char*)malloc(sizeof(char)*(posizione_elevato - posizione_scorr + 2));
00663 Mid(funzione_temp2,funzione, posizione_scorr+1, posizione_elevato - posizione_scorr + 1);
00664 Concatena(funzione_temp, funzione_temp2);
00665 free(funzione_temp2);
00666 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - posizione_elevato));
00667 Mid(funzione_temp2,funzione, posizione_elevato+2 , Len(funzione) - posizione_elevato);
00668 Concatena(funzione_temp,funzione_temp2);
00669 free(funzione_temp2);
00670 strcpy(funzione,funzione_temp);
00671 free(funzione_temp);
00672 posizione_elevato = Instr(posizione_elevato + 1, funzione, "^")-1;
00673 posizione_scorr = posizione_elevato + 1;
00674 if (funzione[posizione_scorr]!='(')
00675 { flag = 1;
00676 while ((flag == 1)&&(posizione_scorr < Len(funzione)-1)&&(funzione[posizione_scorr]!='*')&&(funzione[posizione_scorr]!='^')&&(funzione[posizione_scorr]!='/'))
00677 { if ((posizione_scorr > posizione_elevato + 1)&&((funzione[posizione_scorr]=='+')||(funzione[posizione_scorr]=='-')))
00678 flag = 0;
00679 else
00680 posizione_scorr++;
00681 }
00682 if (posizione_scorr < Len(funzione)-1)
00683 posizione_scorr--;
00684
00685 }else
00686 { numero_parentesi = 1;
00687 while (numero_parentesi > 0)
00688 { posizione_scorr++;
00689 if (funzione[posizione_scorr] == ')')
00690 numero_parentesi--;
00691 else
00692 {if (funzione[posizione_scorr] == '(')
00693 numero_parentesi++;
00694 }
00695 }
00696
00697 }
00698 funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+5));
00699 Mid(funzione_temp,funzione,1,posizione_scorr+1);
00700 Concatena(funzione_temp,")");
00701 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione)-posizione_scorr));
00702 Mid(funzione_temp2,funzione,posizione_scorr+2,Len(funzione)-posizione_scorr-1);
00703 Concatena(funzione_temp,funzione_temp2);
00704 strcpy(funzione,funzione_temp);
00705 posizione_elevato = Instr(posizione_elevato + 2, funzione, "^")-1;
00706 free(funzione_temp);
00707 free(funzione_temp2);
00708 }
00709 }
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726 void TParserScomponi::GestioneMeno(char* funzione)
00727 { int posizione_parentesi;
00728 char* funzione_temp;
00729 char* funzione_temp2;
00730 posizione_parentesi = Instr(1, funzione, "(")-1;
00731
00732 while (posizione_parentesi > -1)
00733 { if (funzione[posizione_parentesi+1] == '-')
00734 { funzione_temp=(char*)malloc(sizeof(char)*(Len(funzione)+2));
00735 Mid(funzione_temp,funzione, 1, posizione_parentesi+1);
00736 Concatena(funzione_temp,"0");
00737 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - posizione_parentesi));
00738 Mid(funzione_temp2,funzione, posizione_parentesi + 2, Len(funzione) - posizione_parentesi);
00739 Concatena(funzione_temp,funzione_temp2);
00740 strcpy(funzione,funzione_temp);
00741 free(funzione_temp);
00742 free(funzione_temp2);
00743 }
00744 else
00745 { if (funzione[posizione_parentesi+1] == '+')
00746 { funzione_temp=(char*)malloc(sizeof(char)*Len(funzione));
00747 Mid(funzione_temp,funzione, 1, posizione_parentesi+1);
00748 funzione_temp2=(char*)malloc(sizeof(char)*(Len(funzione) - 1 - posizione_parentesi));
00749 Mid(funzione_temp2,funzione, posizione_parentesi + 3, Len(funzione) - 1 - posizione_parentesi);
00750 Concatena(funzione_temp,funzione_temp2);
00751 strcpy(funzione,funzione_temp);
00752 free(funzione_temp);
00753 free(funzione_temp2);
00754
00755 }
00756 }
00757 posizione_parentesi = Instr(posizione_parentesi + 2, funzione, "(")-1;
00758 }
00759 }
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776 void TParserScomponi::GestioneVariabili(char* funzione,int n_variabili)
00777 {
00778 variab* variabili_iniziali;
00779 int i,flag;
00780 variab temp_variabile;
00781 char variabile[20];
00782 int posizione_scorr;
00783 char funzione_temp[2000],funzione_temp2[2000],numstringa[20];
00784
00785 if (n_variabili > 0)
00786 {
00787 variabili_iniziali=(variab*)malloc(sizeof(variab)*n_variabili);
00788
00789 for(i=0;i<n_variabili;i++)
00790 {
00791 (variabili_iniziali+i)->variabile=(char*)malloc(sizeof(char)*(Len((variabili+i)->variabile)));
00792 strcpy((variabili_iniziali+i)->variabile,(variabili+i)->variabile);
00793 }
00794 do
00795 { flag=0;
00796 i=0;
00797 while(i<n_variabili-1)
00798 {if(Len((variabili+i)->variabile)<Len((variabili+i+1)->variabile))
00799 {temp_variabile=*(variabili+i);
00800 *(variabili+i)=*(variabili+i+1);
00801 *(variabili+i+1)=temp_variabile;
00802 flag=1;
00803 }
00804 i++;
00805 }
00806 }while(flag==1);
00807
00808 for (i = 1;i<=n_variabili;i++)
00809 { strcpy(variabile,(variabili+i-1)->variabile);
00810 posizione_scorr = 0;
00811 while (posizione_scorr <= Len(funzione))
00812 { posizione_scorr = posizione_scorr + 1;
00813
00814 Mid(funzione_temp,funzione, posizione_scorr, 3);
00815 if (funzione[posizione_scorr-1] == '[')
00816 posizione_scorr=Instr(posizione_scorr,funzione,"]")+1;
00817 Mid(funzione_temp2,funzione, posizione_scorr, Len(variabile));
00818 if ((strcmp(funzione_temp2,variabile)==0)&&(strcmp(funzione_temp,"Sin")!=0) && (strcmp(funzione_temp,"Cos")!=0) && (strcmp(funzione_temp,"Exp")!=0) && (strcmp(funzione_temp,"Log")!=0) && (strcmp(funzione_temp,"Tan")!=0) &&((funzione[posizione_scorr-1]!='L')||(funzione[posizione_scorr-1]!='n')))
00819 {
00820 Mid(funzione_temp,funzione, 1, posizione_scorr - 1) ;
00821 Concatena(funzione_temp,"[");
00822 Concatena(funzione_temp,variabile);
00823 Concatena(funzione_temp,"]");
00824 Mid(funzione_temp2,funzione, posizione_scorr + Len(variabile), Len(funzione) - posizione_scorr - Len(variabile)+1 );
00825 strcpy(funzione,funzione_temp2);
00826 Concatena(funzione_temp,funzione);
00827 strcpy(funzione,funzione_temp);
00828 posizione_scorr = Instr(posizione_scorr, funzione, "]");
00829 }else
00830 { Mid(funzione_temp,funzione, posizione_scorr, 2);
00831 if (strcmp(funzione_temp,"Ln")==0)
00832 posizione_scorr = posizione_scorr + 1;
00833 Mid(funzione_temp,funzione, posizione_scorr, 3);
00834 if ((strcmp(funzione_temp,"Abs")==0) ||(strcmp(funzione_temp,"Sin")==0) || (strcmp(funzione_temp,"Cos")==0) || (strcmp(funzione_temp,"Exp")==0) || (strcmp(funzione_temp,"Log")==0) || (strcmp(funzione_temp,"Tan")==0))
00835 posizione_scorr = posizione_scorr + 2;
00836
00837 }
00838 }
00839 }
00840
00841
00842
00843 for(i=0;i<n_variabili;i++)
00844 {
00845 free((variabili+i)->variabile);
00846 }
00847 free(variabili);
00848 variabili=variabili_iniziali;
00849
00850
00851 for(i=0;i<n_variabili;i++)
00852 {
00853 posizione_scorr=Instr(1,funzione,"[");
00854 while((posizione_scorr<Len(funzione))&&(posizione_scorr>0))
00855 { Mid(funzione_temp,funzione,posizione_scorr+1,Instr(posizione_scorr,funzione,"]")-1-posizione_scorr);
00856 if(strcmp(funzione_temp,(variabili+i)->variabile)==0)
00857 { Mid(funzione_temp,funzione,1,posizione_scorr-1);
00858 Concatena(funzione_temp,"[");
00859 sprintf(numstringa,"%d",i);
00860
00861 Concatena(funzione_temp,numstringa);
00862 Concatena(funzione_temp,";");
00863 Concatena(funzione_temp,(variabili+i)->variabile);
00864 Mid(funzione_temp2,funzione,Instr(posizione_scorr,funzione,"]"),Len(funzione)-Instr(posizione_scorr,funzione,"]")+2);
00865 Concatena(funzione_temp,funzione_temp2);
00866 strcpy(funzione,funzione_temp);
00867 }
00868 posizione_scorr=Instr(posizione_scorr+1,funzione,"[");
00869
00870 }
00871 }
00872 }
00873
00874 for(i=0;i<n_variabili;i++)
00875 {
00876 free((variabili+i)->variabile);
00877 }
00878 free(variabili);
00879
00880
00881
00882 }
00883
00884 rif* TParserScomponi::Traduci_funzione(char* funzione)
00885 {
00886 int parentesi=0,posizione_scorr,posizione_meno,posizione_piu,indice;
00887 int errore;
00888 int xpos,ypos=0,posizione_parentapri,assegnato,posizione_parentchiudi,cont,var_ok;
00889 char *funzione_iniziale,variabile[30],funzione_temp[600],funzione_temp2[600];
00890 int codice_lettere;
00891 int temp=0;
00892 int esiste;
00893 char char_temp[2];
00894 int cont_operatori=0;
00895 int n_variabili=0;
00896 int numero_scomposizioni=0;
00897 int posizione_variabile;
00898 char strassegnazione[250];
00899
00900
00901
00902 char_temp[1]='\0';
00903 strcpy(strassegnazione,"");
00904 assegnato=Gestione_assegnazione(funzione,&errore,&n_variabili);
00905 if(assegnato==1)
00906 {
00907 Mid(strassegnazione,funzione,1,Instr(1,funzione,":=")+1);
00908 Mid(funzione_temp,funzione,Instr(1,funzione,":=")+2,Len(funzione)-Instr(1,funzione,":=")-1);
00909 strcpy(funzione,funzione_temp);
00910 }
00911 Lcase(funzione);
00912 GestioneVariabili(funzione, n_variabili);
00913
00914 if((Controllo_sintassi(funzione)==1)&&(errore==1))
00915 {
00916 MettiPer(funzione);
00917 funzione_iniziale=(char*)malloc(sizeof(char)*(Len(funzione)+1));
00918 strcpy(funzione_iniziale,funzione);
00919 ParentesiElevati(funzione);
00920
00921 codice_lettere = 96;
00922
00923 strcpy(funzione_temp,"(");
00924 Concatena(funzione_temp,funzione);
00925 Concatena(funzione_temp,")");
00926 strcpy(funzione,funzione_temp);
00927 GestioneMeno(funzione);
00928 posizione_scorr = 1;
00929 posizione_parentapri=0;
00930 posizione_parentapri = Instr(posizione_parentapri+1 , funzione, "(");
00931
00932
00933 while(posizione_parentapri>0)
00934 { parentesi++;
00935 posizione_parentapri = Instr(posizione_parentapri+1 , funzione, "(");
00936 }
00937
00938
00939 vettore_riferimenti=(riferimenti*)malloc(sizeof(riferimenti)*parentesi);
00940 parentesi=0;
00941
00942
00943 posizione_parentapri = Instr(posizione_scorr , funzione, "(");
00944
00945 posizione_parentchiudi = Instr(posizione_scorr, funzione, ")");
00946
00947 while (posizione_parentapri > 0)
00948 {
00949 while ((posizione_parentapri < posizione_parentchiudi)&&(posizione_parentapri > 0))
00950 {temp = posizione_parentapri;
00951 posizione_scorr = posizione_parentapri + 1;
00952 posizione_parentapri = Instr(posizione_scorr, funzione, "(");
00953 parentesi++;
00954 }
00955 posizione_parentapri = temp;
00956 esiste = 0;
00957 cont = 0;
00958
00959 while ((cont < ypos)&&(esiste == 0))
00960 {
00961 Mid(funzione_temp,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00962 if (strcmp(funzione_temp,(vettore_riferimenti+cont)->descrizione)==0)
00963 esiste = 1;
00964
00965 cont++;
00966 }
00967 var_ok = 0;
00968
00969 if((funzione[posizione_parentapri]=='[')&&((Instr(posizione_parentapri+2,funzione,"[")==0)||(Instr(posizione_parentapri+2,funzione,"[")>posizione_parentchiudi))&&(funzione[posizione_parentchiudi-2]==']'))
00970 var_ok=1;
00971
00972 Mid(funzione_temp,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00973 if (((parentesi == 1)||((Isnumeric(funzione_temp)==0))&&(Len(funzione_temp) > 1))&&(var_ok==0) )
00974 { if(esiste==0)
00975 { codice_lettere++;
00976
00977 (vettore_riferimenti+ypos)->descrizione=(char*)malloc(sizeof(char)*(posizione_parentchiudi - posizione_parentapri));
00978 Mid((vettore_riferimenti+ypos)->descrizione,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
00979
00980 char_temp[0]=codice_lettere;
00981 Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
00982 Concatena(funzione_temp,char_temp);
00983 Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
00984 Concatena(funzione_temp,funzione_temp2);
00985 strcpy(funzione,funzione_temp);
00986 ypos++;
00987
00988 }
00989 else
00990 { char_temp[0]=95 + cont+1;
00991 Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
00992 Concatena(funzione_temp,char_temp);
00993 Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
00994 Concatena(funzione_temp,funzione_temp2);
00995 strcpy(funzione,funzione_temp);
00996 }
00997 }
00998 else
00999
01000 { Mid(funzione_temp,funzione, 1, posizione_parentapri - 1);
01001 Mid(funzione_temp2,funzione, posizione_parentapri + 1, posizione_parentchiudi - posizione_parentapri - 1);
01002 Concatena(funzione_temp, funzione_temp2);
01003 Mid(funzione_temp2,funzione, posizione_parentchiudi + 1, Len(funzione) - posizione_parentchiudi);
01004 Concatena(funzione_temp,funzione_temp2);
01005 strcpy(funzione,funzione_temp);
01006 }
01007
01008 posizione_scorr = 1;
01009 posizione_parentapri = Instr(posizione_scorr, funzione, "(");
01010 posizione_parentchiudi = Instr(posizione_scorr, funzione, ")");
01011 }
01012 numero_scomposizioni = ypos;
01013 ypos = 0;
01014 if(numero_scomposizioni==0)
01015 { numero_scomposizioni=1;
01016 vettore_riferimenti->descrizione=funzione;
01017 }
01018
01019
01020
01021
01022
01023 vettore_riferimenti->n_variabili=n_variabili;
01024 vettore_riferimenti->numero_scomposizioni=numero_scomposizioni;
01025
01026 for (indice = 0;indice<numero_scomposizioni;indice++)
01027 { xpos = 0;
01028 posizione_scorr = 0;
01029 strcpy(funzione_temp,(vettore_riferimenti+indice)->descrizione);
01030 posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01031 posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01032
01033 while((posizione_meno>0)||(posizione_piu>0))
01034 {
01035 if((posizione_meno>0)&&(posizione_piu>0))
01036 cont_operatori=cont_operatori+2;
01037 else
01038 cont_operatori++;
01039
01040 posizione_meno = Instr(posizione_meno+2,funzione_temp, "-");
01041 posizione_piu = Instr(posizione_piu+2,funzione_temp, "+");
01042 }
01043 posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01044 posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01045 if(posizione_meno>0) posizione_meno--;
01046 if(posizione_piu>0) posizione_piu--;
01047
01048 (vettore_riferimenti+indice)->scomposizioni=(scompos*)malloc(sizeof(scompos)*(2*cont_operatori+1));
01049
01050 while (((posizione_meno > 0)&&(posizione_meno < 250))||((posizione_piu > 0)&&(posizione_piu < 250)))
01051 { if (posizione_meno == 0) posizione_meno = 250;
01052 if (posizione_piu == 0) posizione_piu = 250;
01053
01054 if (posizione_meno < posizione_piu)
01055 { if (posizione_meno > 0)
01056 { if ((funzione_temp[posizione_meno - 1] == '^')||(funzione_temp[posizione_meno - 1] == '*')||(funzione_temp[posizione_meno - 1] == '/'))
01057 posizione_meno = Instr(posizione_meno + 1,funzione_temp, "-");
01058 }
01059 }
01060
01061 if (posizione_piu < posizione_meno)
01062 {if (posizione_piu >0)
01063 {if ((funzione_temp[posizione_piu - 1] == '^')||(funzione_temp[posizione_piu - 1] == '*')||(funzione_temp[posizione_piu - 1] == '/'))
01064 posizione_piu = Instr(posizione_piu + 1,funzione_temp, "+");
01065 }
01066 }
01067
01068 if (posizione_meno == 0) posizione_meno = 250;
01069 if (posizione_piu == 0) posizione_piu = 250;
01070
01071 if ((posizione_meno < 250)||(posizione_piu < 250))
01072 {if (posizione_meno < posizione_piu)
01073 {Mid(funzione_temp2,funzione_temp, posizione_scorr+1, posizione_meno - posizione_scorr);
01074 ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos),posizione_meno - posizione_scorr);
01075 xpos++;
01076 (((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione=(char**)malloc(sizeof(char*));
01077 *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)=(char*)malloc(sizeof(char));
01078 *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)="-";
01079
01080 posizione_scorr = posizione_meno + 1;
01081 }
01082 else
01083 {
01084 Mid(funzione_temp2,funzione_temp, posizione_scorr+1, posizione_piu - posizione_scorr);
01085 ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos),posizione_piu - posizione_scorr);
01086
01087 xpos++;
01088 (((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione=(char**)malloc(sizeof(char*));
01089 *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)=(char*)malloc(sizeof(char));
01090 *((((vettore_riferimenti+indice)->scomposizioni)+xpos)->scomposizione)="+";
01091 posizione_scorr = posizione_piu + 1;
01092 }
01093 (((vettore_riferimenti+indice)->scomposizioni)+xpos)->n_colonne=1;
01094 xpos++;
01095 posizione_meno = Instr(posizione_scorr+1,funzione_temp, "-");
01096 posizione_piu = Instr(posizione_scorr+1,funzione_temp, "+");
01097 if(posizione_meno>0) posizione_meno--;
01098 if(posizione_piu>0) posizione_piu--;
01099
01100 }
01101
01102 }
01103
01104 Mid(funzione_temp2,funzione_temp, posizione_scorr+1, Len(funzione_temp) - posizione_scorr );
01105 ScomponiProdotti(funzione_temp2,(((vettore_riferimenti+indice)->scomposizioni)+xpos), Len(funzione_temp) - posizione_scorr+1);
01106 (vettore_riferimenti+ypos)->lunghezza_scomp = xpos + 1;
01107
01108 ypos++;
01109 }
01110
01111
01112 posizione_variabile = Instr(1, funzione_iniziale, "[");
01113 while (posizione_variabile > 0)
01114 {Mid(variabile,funzione_iniziale, Instr(posizione_variabile,funzione_iniziale,";")+1, Instr(posizione_variabile, funzione_iniziale, "]") - Instr(posizione_variabile,funzione_iniziale,";") - 1);
01115 Mid(funzione_temp,funzione_iniziale, 1, posizione_variabile - 1);
01116 Concatena(funzione_temp,variabile);
01117 Mid(funzione_temp2,funzione_iniziale, Instr(posizione_variabile, funzione_iniziale, "]") + 1, Len(funzione_iniziale) - Instr(posizione_variabile, funzione_iniziale, "]"));
01118 Concatena(funzione_temp,funzione_temp2);
01119 strcpy(funzione_iniziale,funzione_temp);
01120 posizione_variabile = Instr(1, funzione_iniziale, "[");
01121 }
01122 strcpy(funzione,funzione_iniziale);
01123
01124 Concatena(strassegnazione,funzione);
01125 strcpy(funzione,strassegnazione);
01126 free(funzione_iniziale);
01127
01128
01129 return(vettore_riferimenti);
01130
01131 }
01132 else
01133 strcpy(funzione,"err");
01134 return(0);
01135 }
01136
01137 void TParserScomponi::ScomponiProdotti(char* spezzone,scomp* puntascomp,int lunghezzaspezzone)
01138 { int i,numerooperatori=0,posizionepartenza=0,indice=0;
01139
01140 for(i=0;i<lunghezzaspezzone;i++)
01141 {
01142 if((spezzone[i]=='*')||(spezzone[i]=='/')||( spezzone[i]=='^'))
01143 numerooperatori++;
01144 }
01145 (*puntascomp).n_colonne=numerooperatori*2+1;
01146 (*puntascomp).scomposizione=(char**)malloc(sizeof(char*)*((*puntascomp).n_colonne));
01147 for(i=0;i<=lunghezzaspezzone;i++)
01148 {
01149 if((spezzone[i]=='*')||(spezzone[i]=='/')||( spezzone[i]=='^')||(i==lunghezzaspezzone))
01150 {
01151 *((*puntascomp).scomposizione+indice)=(char*)malloc(sizeof(char)*(i-posizionepartenza+1));
01152 Mid(*((*puntascomp).scomposizione+indice),spezzone,posizionepartenza+1,i-posizionepartenza);
01153 if(i!=lunghezzaspezzone)
01154 { indice++;
01155 *((*puntascomp).scomposizione+indice)=(char*)malloc(sizeof(char));
01156 **((*puntascomp).scomposizione+indice)=spezzone[i];
01157 indice++;
01158 posizionepartenza=i+1;
01159 }
01160 }
01161
01162 }
01163
01164 }