double Get_T () { double val1 = Get_P (); while (*EXPR_PTR == '*' || *EXPR_PTR == '/') { int oper = *EXPR_PTR; EXPR_PTR++; double val2 = Get_P (); switch (oper) { case '*': { val1 *= val2; break; } case '/': { val1 /= val2; break; } } } return val1; }
int Get_T (double* result) { double val = 0; int ret = Get_P (&val); while (*CUR == '*' || *CUR == '/') { int op = *CUR; CUR++; double val_2 = 0; ret = Get_P (&val_2); switch (op) { case '*': val *= val_2; break; case '/': if (val_2 == 0) return ERR_DIV_BY_ZERO; val /= val_2; break; default: return ERR_CALL_GET_T; break; } } *result = val; return HAPPY; }
int Get_D (node* tree) { int err_index = 0; ASSERT_TREE_OK (tree); Tree_Add_Left (tree, Node_NEW()); Tree_Add_Right (tree, Node_NEW()); int ret = Get_P (tree -> left); if (ret != HAPPY) if (ret == 0) return ret; tree -> type = MATH_OP; tree -> op = MATH_OP_POW; if ((*CUR) -> op == MATH_OP_POW) { CUR++; Get_D (tree -> right); } node* new_tree = tree -> left; if (tree -> right -> type == 0) { Tree_Replace_Left (tree); ASSERT_TREE_OK (new_tree); return HAPPY; } ASSERT_TREE_OK (tree); return HAPPY; }
int Get_P (double* result) { int ret = 0; double val = 0; switch (*CUR) { case '+': CUR++; break; case '-': CUR++; ret = Get_P (&val); val *= -1; break; case '(': CUR++; ret = Get_E (&val); if (*CUR == ')') CUR++; else return ERR_CLOSE_BRACKET; break; default: ret = Get_N (&val); break; } *result = val; return HAPPY; }