/* 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; }
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; }
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; }