Questo è il codice di un semplice parser di espressioni aritmetiche,studiatelo un pò e capirai molte cose riguardo a ciò che hai chiesto.codice:/* eval_expr.symbol */ int Plus(int a,int b) { return (a+b); } int Minus(int a,int b) { return (a-b); } int Divide(int a,int b) { return (a/b); } int Multiply(int a,int b) { return (a*b); } int Modulus(int a,int b) { return (a%b); } typedef struct _operand { char symbol; int preced; int (*funct)(); } Operand; Operand operand [] = { {'+',1,Plus}, {'-',1,Minus}, {'/',2,Divide}, {'*',2,Multiply}, {'%',2,Modulus}, {0,0,0} }; int FindLastOp(char *str,int preced) { int pos,i,numParent,retValue; //valore di ritorno retValue = -2; //stato bilanciamento parentesi numParent = 0; //partiamo da fine stringa pos = strlen(str)-1; //per ogni carattere str[pos] //fino ad arrivare all'inizio dell'espressione while (pos>=0) { //teniamo conto delle parentesi incontrate if (str[pos] == ')') numParent ++; if (str[pos] == '(') numParent --; i = 0; //per tutti gli operatori definiti e finchè le //parentesi non sono bilanciate while (!numParent && operand[i].symbol) { //se il carattere corrente è un'operatore if (operand[i].symbol == str[pos]) { retValue = -1; if (operand[i].preced == preced) return (pos); } //prossimo operatore i++; } //carattere successivo (o meglio precedente) pos--; } return (retValue); } int is_nb(char *str) { if ( *str == '(' ) { str[strlen(str)-1] = 0; return (eval_expr_sub(str+1,0)); } return (atoi(str)); } int eval_expr_sub(char *str,int preced) { int pos; char save; int nb2; if ((pos = FindLastOp(str,preced))==-1) return (eval_expr_sub(str,preced+1)); if (pos==-2) return (is_nb(str)); nb2 = eval_expr_sub(str+pos+1,preced+1); save = str[pos]; str[pos] = 0; pos = 0; while (operand[pos].symbol) { if (save==operand[pos].symbol) return (operand[pos].funct(eval_expr_sub(str,preced),nb2)); pos ++; } printf("PB !!!\n"); return (0); } int eval_expr(char *str) { return (eval_expr_sub(str, 0)); }
Un membro di questo forum (SnakePlissken) sta (o stava non so),estendendo questo parser al fine di fargli supportare anche operazioni più complesse,contatta lui se ti interessa,comunque lui ha postato l'intero codice del suo parser sul forum e io l'ho scaricato,se ti interessa ce l'ho anche io.

