コード例 #1
0
ファイル: eval.c プロジェクト: xkfz007/cpp_progs
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));
    }
}
コード例 #2
0
ファイル: functions.cpp プロジェクト: nalindquist/Programming
	/*
	 * 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;
	}
コード例 #3
0
ファイル: functions.cpp プロジェクト: nalindquist/Programming
	/*
	 * 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;
	}
コード例 #4
0
ファイル: eval.c プロジェクト: ThomasDickey/atac-snapshots
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;
}
コード例 #5
0
ファイル: eval.c プロジェクト: ThomasDickey/atac-snapshots
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;
}
コード例 #6
0
ファイル: eval.c プロジェクト: BackupTheBerlios/avidemux-svn
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;
}