/* file : evalExp.c */ /* author : Harmen de Weerd (harmen.de.weerd@rug.nl) */ /* Description: * Implementation of evaluation of simple * calculation expressions. * * Note that this implementation explicitly depends * on the implementation of recognition of expressions. */ #include "scanner.h" #include "scannerStructs.h" #include "evalExp.h" #include "recognizeEq.h" #include #include #include #include #include int valueNumber(List **list, double *value) { if (*list != NULL && (*list)->type == NUMBER) { *value = ((*list)->token).number; *list = (*list)->next; return 1; } return 0; } /*int valueTerm(List **list, double *value) { double operandValue ; while (* list != NULL ) { if ( acceptSymbol ( ’* ’ , list ) ) { if ( valueNumber ( list , & operandValue ) ) { * value *= operandValue ; } else { return 0; } } else if ( acceptSymbol ( ’/ ’ , list ) ) { if ( valueFactor ( list , & operandValue ) ) { * value /= operandValue ; } else { return 0; } } else { return 1; } } return 1; }*/ int valueTerm(List **list, double *numbersValue, double *coefValue, int *ok) { double operandValue; if(valueNumber(list, &operandValue)) { if(acceptIdentifier(list)) { *ok = 1; *coefValue = operandValue; //*list = (*list)->next; ///next return 1; } *numbersValue = operandValue; *ok = 0; //*list = (*list)->next; ///next return 1; } else if(acceptIdentifier(list)) { *coefValue = 1; *ok = 1; //*list = (*list)->next; ///next return 1; } return 0; } int valueExpression(List **list, double *numbersValue, double *coefValue) { //printf("in expression function\n"); double nValue, cValue; int ok = -1; if (acceptSymbol('-',list)) { if (valueTerm(list, &nValue, &cValue, &ok)){ if (ok==0) { *numbersValue = *numbersValue - nValue; } else { *coefValue = *coefValue - cValue; } *list = (*list)->next; ///next while(*list != NULL) { //printf("inwhile1\n"); if(acceptSymbol('+', list)) { if(valueTerm(list, &nValue, &cValue, &ok)) { if (ok==0) { *numbersValue += nValue; } else { *coefValue += cValue; } } } else if (acceptSymbol('-',list)) { if(valueTerm(list, &nValue, &cValue, &ok)) { if (ok==0) { *numbersValue -= nValue; } else { *coefValue -= cValue; } } } else return 1; *list = (*list)->next; /*if(*list != NULL && (*list)->type == SYMBOL && ((*list)->token).symbol == '=' ) { printf("outofwhile\n"); return 1; }*/ } } } else if(valueTerm(list, &nValue, &cValue, &ok)) { //printf("startswterm\n"); if (ok==0) { *numbersValue -= nValue; } else { *coefValue -= cValue; } while(*list != NULL) { //printf("inwhile2\n"); if(acceptSymbol('+', list)) { if(valueTerm(list, &nValue, &cValue, &ok)) { if (ok==0) { *numbersValue += nValue; } else { *coefValue += cValue; } } } else if (acceptSymbol('-',list)) { if(valueTerm(list, &nValue, &cValue, &ok)) { if (ok==0) { *numbersValue -= nValue; } else { *coefValue -= cValue; } } } else return 1; *list = (*list)->next; /*if(*list != NULL && (*list)->type == SYMBOL && ((*list)->token).symbol == '=' ) { printf("outofwhile\n"); return 1; }*/ } } return 1; } int solution(List *list) { double sol, numbersValue1 = 0, coefValue1 = 0, numbersValue2 = 0, coefValue2 = 0; if(valueExpression(&list, &numbersValue1, &coefValue1)) { printf("exp1\n"); printf("numbersValue1: %f\ncoefValue1: %f\n",numbersValue1, coefValue1); if(acceptSymbol('=',&list)) { printf("equal\n"); if(valueExpression(&list, &numbersValue2, &coefValue2)) { printf("exp2\n"); printf("numbersValue2: %f\ncoefValue2: %f\n",numbersValue2, coefValue2); sol = (numbersValue2 - numbersValue1)/(coefValue1 - coefValue2); printf("solution: %f\n",sol); } } } if(sol > -0.0005 && sol < 0) sol=0; return sol; }