static void evalExpression(Parser *p){ evalTerm(p); while(p->s[0]=='+' || p->s[0]=='-'){ int sign= p->s[0]=='-'; double d; p->s++; evalTerm(p); d= pop(p); if(sign) d= -d; push(p, d + pop(p)); } }
/* * Returns cos(x). Good for about (-30, 30). */ double cos(double x) { double result = 0; for (int i = 0; i < NUM_TERMS; i++) { result += pow(-1.0, i) * evalTerm(x, 2*i); } return result; }
/* * Returns e^x. Good for about (-10, 700). */ double e(double x) { double result = 0; for (int i = 0; i < NUM_TERMS; i++) { result += evalTerm(x, i); } return result; }
static int evalTerm(char *s, struct tr *tr, int *lenPtr, value * covPtr) { int len; int skip; len = 0; while (isspace(s[len])) ++len; switch (s[len]) { case '\0': fprintf(stderr, "empty subexpression\n"); return -1; case '(': ++len; if (evalConj(s + len, tr, &skip, covPtr) == -1) return -1; len += skip; while (isspace(s[len])) ++len; if (s[len] != ')') { fprintf(stderr, "unballanced parenthesis\n"); free(*covPtr); return -1; } ++len; *lenPtr = len; break; case '!': ++len; if (evalTerm(s + len, tr, &skip, covPtr) == -1) return -1; len += skip; doNot(*covPtr, tr->covCount); *lenPtr = len; break; default: if (evalNames(s + len, tr, &skip, covPtr) == -1) return -1; len += skip; *lenPtr = len; break; } return 0; }
static int evalDisj(char *s, struct tr *tr, int *lenPtr, value * covPtr) { int len; int skip; value cov1; value cov2; len = 0; if (evalTerm(s + len, tr, &skip, &cov1) == -1) return -1; len += skip; while (isspace(s[len])) ++len; while (s[len] == '&') { ++len; if (evalTerm(s + len, tr, &skip, &cov2) == -1) { free(cov1); return -1; } len += skip; doDisj(cov1, cov2, tr->covCount); free(cov2); while (isspace(s[len])) ++len; } *covPtr = cov1; *lenPtr = len; return 0; }
static double evalExpression(Parser *p){ double ret= 0; if(p->stack_index <= 0) //protect against stack overflows return NAN; p->stack_index--; do{ ret += evalTerm(p); }while(*p->s == '+' || *p->s == '-'); p->stack_index++; return ret; }