static int bracket_handle(struct calc_info *info) { assert(info != NULL); char opr = *info->cur; switch (opr) { case '(': OPR_PUSH(opr); break; case ')': { char top_c; while (1) { if (OPR_TOP(top_c) < 0) { fprintf(stderr, "Error:缺少左括号\n"); goto err_miss_left_bracket; } if (top_c == '(') { OPR_POP(top_c); goto out; } else { do_stack(info); } } } default: break; } out: return 0; err_miss_left_bracket: return -1; }
static int opr_handle(struct calc_info *info) { assert(info != NULL); char c = *info->cur; if (info->flag == NUM) { info->flag = OPR; } else { switch (c) { case '+': goto out; break; case '-': //FIXME 负号的处理 { num_t zero = 0; NUM_PUSH(zero); OPR_PUSH(c); goto out; } break; default: fprintf(stderr, "免费版不支持多个运算符\n"); break; } } //1. 入栈的两种情况: a) 空栈 b)运算符优先级高于栈顶运算符 if (OPR_IS_EMPTY) { OPR_PUSH(c); } else { char top_c; while (1) { //a 空栈 if (OPR_TOP(top_c) < 0) { OPR_PUSH(c); break; } //b 优先级高于栈顶 if (opr2level(c) > opr2level(top_c)) { OPR_PUSH(c); break; } else { if (do_stack(info) < 0) { fprintf(stderr,"do_stack failed\n"); goto err_do_stack; } } } } out: return 0; err_do_stack: return -1; }
int main(int argc, char *argv[]) { if (argc < 2) argv[argc++] = "."; if (argc > 2 && strcmp(argv[2], "-r") == 0) { printf("递归处理: %s\n", argv[1]); do_recuerse(argv[1]); } else if (argc > 2 && strcmp(argv[2], "-s") == 0) { printf("非递归处理: %s\n", argv[1]); do_stack(argv[1]); } else { printf("调用函数: %s\n", argv[1]); do_nftw(argv[1]); } return 0; }
static num_t calc_main(struct calc_info *info, const char *expr) { assert(info != NULL); assert(expr != NULL); info->cur = expr; int iret = 0; for (; *info->cur != '\0'; info->cur++) { switch (*info->cur) { case '0' ... '9': if ((iret = num_handle(info)) < 0) { fprintf(stderr, "num_handle failed\n"); return iret; } break; case '+': case '-': case '*': case '/': case '%': if ((iret = opr_handle(info)) < 0) { fprintf(stderr, "opr_handle failed\n"); return iret; } break; case ' ': case '\n': case '\t': break; case '(': case ')': if ((iret = bracket_handle(info)) < 0) { fprintf(stderr, "bracket_handle failed\n"); return iret; } break; default: fprintf(stderr, "unkown char '%c'\n", *info->cur); goto err_unkown_char; } } num_t ret = 0; while (!OPR_IS_EMPTY) { char top_c = 0; OPR_TOP(top_c); if (top_c == '(') { fprintf(stderr, "Error: 缺少对应的右括号\n"); goto err_miss_right_bracket; } if (do_stack(info) < 0) { fprintf(stderr, "do_stack failed\n"); goto err_do_stack; } } NUM_POP(ret); return ret; err_unkown_char: return -1; err_do_stack: return -2; err_miss_right_bracket: return -3; }