⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccalc.cpp

📁 CCALC provides convenient way to for performing calculations. You can use standard infix notation f
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                }                v_stack[v_sp-1].var = NULL;                break;                              case AND:              case SETAND:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival &= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get_int() & v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETAND) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case OR:              case SETOR:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival |= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get_int() | v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETOR) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case XOR:              case SETXOR:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival ^= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get_int() ^ v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETXOR) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case ASL:              case SETASL:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival <<= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get_int() << v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETASL) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case ASR:              case SETASR:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival >>= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get_int() >> v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETASR) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case LSR:              case SETLSR:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         (unsigned_t)v_stack[v_sp-2].ival >> v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival = (unsigned_t)v_stack[v_sp-2].get_int()                        >> v_stack[v_sp-1].get_int();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                if (cop == SETLSR) {                     if (!assign()) return;                }                v_stack[v_sp-1].var = NULL;                break;              case EQ:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival == v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() == v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case NE:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival != v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() != v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case GT:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival > v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() > v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case GE:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival >= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() >= v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case LT:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival < v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() < v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case LE:                if (v_stack[v_sp-1].tag == INT && v_stack[v_sp-2].tag == INT) {                    v_stack[v_sp-2].ival =                         v_stack[v_sp-2].ival <= v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-2].ival =                         v_stack[v_sp-2].get() <= v_stack[v_sp-1].get();                    v_stack[v_sp-2].tag = INT;                }                v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;                              case PREINC:                if (v_stack[v_sp-1].tag == INT) {                     v_stack[v_sp-1].ival += 1;                } else {                     v_stack[v_sp-1].fval += 1;                }                 if (!assign()) return;                v_stack[v_sp-1].var = NULL;                break;              case PREDEC:                if (v_stack[v_sp-1].tag == INT) {                     v_stack[v_sp-1].ival -= 1;                } else {                     v_stack[v_sp-1].fval -= 1;                }                 if (!assign()) return;                v_stack[v_sp-1].var = NULL;                break;              case POSTINC:                if (v_stack[v_sp-1].var == NULL) {                     error(v_stack[v_sp-1].pos, "Varaibale expected");                    return;                }                 if (v_stack[v_sp-1].var->val.tag == INT) {                     v_stack[v_sp-1].var->val.ival += 1;                } else {                     v_stack[v_sp-1].var->val.fval += 1;                }                 v_stack[v_sp-1].var = NULL;                break;              case POSTDEC:                if (v_stack[v_sp-1].var == NULL) {                     error(v_stack[v_sp-1].pos, "Varaibale expected");                    return;                }                 if (v_stack[v_sp-1].var->val.tag == INT) {                     v_stack[v_sp-1].var->val.ival -= 1;                } else {                     v_stack[v_sp-1].var->val.fval -= 1;                }                 v_stack[v_sp-1].var = NULL;                break;              case SET:                if (v_stack[v_sp-2].var == NULL) {                     error(v_stack[v_sp-2].pos, "Variabale expected");                    return;                } else {                     v_stack[v_sp-2]=v_stack[v_sp-2].var->val=v_stack[v_sp-1];                }                                    v_sp -= 1;                v_stack[v_sp-1].var = NULL;                break;              case NOT:                if (v_stack[v_sp-1].tag == INT) {                     v_stack[v_sp-1].ival = !v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-1].ival = !v_stack[v_sp-1].fval;                    v_stack[v_sp-1].tag = INT;                }                v_stack[v_sp-1].var = NULL;                break;              case MINUS:                if (v_stack[v_sp-1].tag == INT) {                     v_stack[v_sp-1].ival = -v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-1].fval = -v_stack[v_sp-1].fval;                }                // no break              case PLUS:                v_stack[v_sp-1].var = NULL;                break;              case COM:                if (v_stack[v_sp-1].tag == INT) {                     v_stack[v_sp-1].ival = ~v_stack[v_sp-1].ival;                } else {                     v_stack[v_sp-1].ival = ~(int)v_stack[v_sp-1].fval;                    v_stack[v_sp-1].tag = INT;                }                v_stack[v_sp-1].var = NULL;                break;                              case RPAR:                error("mismatched ')'");                return;              case FUNC:                error("'(' expected");                return;              case LPAR:                if (oper != RPAR) {                     error("')' expected");                    return;                }                if (o_stack[o_sp-1] == FUNC) {                     symbol* sym = v_stack[v_sp-n_args-1].var;		    switch(sym->tag) {		    case IFUNC1:                        if (n_args != 1) {                             error(v_stack[v_sp-n_args-1].pos,                                   "Function should take one argument");                            return;                        }                        v_stack[v_sp-2].ival =                           (*(int_t(*)(int_t))sym->func)(v_stack[v_sp-1].get_int());                        v_stack[v_sp-2].tag = INT;			v_sp -= 1;			break;		    case IFUNC2:                        if (n_args != 2) {                             error(v_stack[v_sp-n_args-1].pos,                                   "Function should take two arguments");                            return;                        }                        v_stack[v_sp-3].ival =                          (*(int_t(*)(int_t,int_t))sym->func)                          (v_stack[v_sp-2].get_int(), v_stack[v_sp-1].get_int());                        v_stack[v_sp-3].tag = INT;			v_sp -= 2;			break;		    case FFUNC1:                        if (n_args != 1) {                             error(v_stack[v_sp-n_args-1].pos,                                   "Function should take one argument");                            return;                        }                        v_stack[v_sp-2].fval =                           (*(double(*)(double))sym->func)(v_stack[v_sp-1].get());                        v_stack[v_sp-2].tag = FLOAT;			v_sp -= 1;			break;		    case FFUNC2:                        if (n_args != 2) {                             error(v_stack[v_sp-n_args-1].pos,                                   "Function should take two arguments");                            return;                        }                        v_stack[v_sp-3].fval =                             (*(double(*)(double, double))sym->func)                            (v_stack[v_sp-2].get(), v_stack[v_sp-1].get());                        v_stack[v_sp-3].tag = FLOAT;			v_sp -= 2;			break;		    default: error("Invalid expression");                    }                    v_stack[v_sp-1].var = NULL;                     o_sp -= 1;                    n_args = 1;                } else if (n_args != 1) {                     error("Function call expected");                    return;                }                goto next_token;              default:                error("synctax error");            }        }        if (o_sp == max_stack_size) {             error("operator stack overflow");            return;        }        o_stack[o_sp++] = oper;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -