/* expr3 : expr4 {'^' expr4} */
int expr3(ParserData *pd)
{
	double right, left;
	int count = 0;

	if ( !expr4(pd) )
		return 0;

	while ( pd->m_Token.Type == T_EXP )
	{
		count++;
		
		GetNextToken(pd->m_strExpr, &(pd->m_Token));

		if ( !expr4(pd) )
			return 0;
	}
	
	while ( count )
	{
		right = pd->m_stack[pd->m_top--];
		left  = pd->m_stack[pd->m_top--];
		
		pd->m_stack[++pd->m_top] = pow(left, right);
		
		count--;
	}	

	return 1;
}
Ejemplo n.º 2
0
Archivo: eval.c Proyecto: AxFab/nasm
static expr *expr3(int critical)
{
    expr *e, *f;

    e = expr4(critical);
    if (!e)
        return NULL;

    while (i == TOKEN_SHL || i == TOKEN_SHR) {
        int j = i;
        i = scan(scpriv, tokval);
        f = expr4(critical);
        if (!f)
            return NULL;
        if (!(is_simple(e) || is_just_unknown(e)) ||
            !(is_simple(f) || is_just_unknown(f))) {
            nasm_error(ERR_NONFATAL, "shift operator may only be applied to"
                  " scalar values");
        } else if (is_just_unknown(e) || is_just_unknown(f)) {
            e = unknown_expr();
        } else
            switch (j) {
            case TOKEN_SHL:
                e = scalarvect(reloc_value(e) << reloc_value(f));
                break;
            case TOKEN_SHR:
                e = scalarvect(((uint64_t)reloc_value(e)) >>
                               reloc_value(f));
                break;
            }
    }
    return e;
}
Ejemplo n.º 3
0
int expr3(big_int *a)
{
    big_int *b = NULL;
    int result = 0;
    int n;

    b = big_int_create(1);
    if (b == NULL) {
        printf("error when creating [b]\n");
        result = 1;
        goto done;
    }

    if (expr4(a)) {
        result = 2;
        goto done;
    }

    while (1) {
        switch (curr_lex.token) {
            case SHL :
                match(SHL);
                if (expr4(b)) {
                    result = 3;
                    goto done;
                }
                if (big_int_to_int(b, &n)) {
                    printf("error when converting number [b] to int [n]\n");
                    result = 4;
                    goto done;
                }
                if (big_int_lshift(a, n, a)) {
                    printf("error in big_int_lshift(a, %d)\n", n);
                    result = 5;
                    goto done;
                }
                if (is_mod) {
                    if (big_int_absmod(a, module, a)) {
                        printf("error in big_int_absmod()\n");
                        result = 6;
                        goto done;
                    }
                }
                continue;
            case SHR :
                match(SHR);
                if (expr4(b)) {
                    result = 7;
                    goto done;
                }
                if (big_int_to_int(b, &n)) {
                    printf("error when converting number [b] to int [n]\n");
                    result = 8;
                    goto done;
                }
                if (big_int_rshift(a, n, a)) {
                    printf("error in big_int_rshift(a, %d)\n", n);
                    result = 9;
                    goto done;
                }
                if (is_mod) {
                    if (big_int_absmod(a, module, a)) {
                        printf("error in big_int_absmod()\n");
                        result = 10;
                        goto done;
                    }
                }
                continue;
            default :
                goto done;
        }
    }

done:
    big_int_destroy(b);
    return result;
}