📄 ccalc.cpp
字号:
} 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 + -