void tryEvaluatePrefixOperatorOnStackThenPush(Operator *newToken,Stack *numberStack,Stack *operatorStack) { Operator *previousToken=(Operator*)stackPop(operatorStack); if(previousToken == NULL){ stackPush(newToken,operatorStack); } else{ while(previousToken!=NULL) { if(((Operator*)newToken)->info->id ==CLOSING_BRACKET_OP){ if(((Operator*)previousToken)->info == NULL){ Throw(ERR_EXPECTING_OPENING_BRACKET); }else if(((Operator*)previousToken)->info->id == OPENING_BRACKET_OP){ operatorPrefixEvaluate(numberStack ,previousToken); free(newToken); if(((Operator*)previousToken)->info->id == OPENING_BRACKET_OP){ previousToken=(Operator*)stackPop(operatorStack); break; } }else { operatorEvaluate(numberStack,previousToken); } }else if(newToken->info->precedence >= previousToken->info->precedence || ((Operator*)newToken)->info->id==OPENING_BRACKET_OP ){ break; } else{ operatorEvaluate(numberStack,previousToken); } previousToken=(Operator*)stackPop(operatorStack); } if(previousToken!=NULL ){ stackPush(previousToken,operatorStack); } if(newToken->info->affix == PREFIX){ stackPush(newToken,operatorStack); } } }
/******************************************************************************************* * This function is to evaluate the expression which contains numbers and operators and * return the results in number form. * This function is a prototype function which use as reference to * improve in the evaluateExpression(char*expression) function. * Thus, this function could not evaluate expression like -2,*2,(((2))), +-+-2... * * input : expression * output : none * return : ((Number*)token)->value * ********************************************************************************************/ int evaluate(char *expression){ Token *token; Number *result; Stack *numberStack=createStack(); Stack *operatorStack=createStack(); if(expression ==NULL){ Throw(ERR_NO_ARGUMENT); } Text *newText=textNew(expression); String *tokenizer = stringNew(newText); while((token=getToken(tokenizer))!=NULL ){ if(isNumber(token)){ stackPush(token,numberStack); } else if(isOperator(token)) { if(((Operator*)token)->info->id==OPENING_BRACKET_OP || ((Operator*)token)->info->id==CLOSING_BRACKET_OP) { tryEvaluatePrefixOperatorOnStackThenPush((Operator*)token,numberStack,operatorStack); } else{ tryEvaluateOperatorOnStackThenPush((Operator*)token,numberStack,operatorStack); } } } if(operatorStack == NULL){ operatorPrefixEvaluate(numberStack ,(Operator*)token); }else{ evaluateAllOperatorOnStack(numberStack,operatorStack); } result=(Number*)stackPop(numberStack); destroyStack(numberStack); if(operatorStack !=NULL){ destroyStack(operatorStack); } return result->value; }