📄 compiler.c
字号:
if (c_block('}', locals)) break; else continue; } else if (!strcmp(token, "void") || !strcmp(token, "int")) { if (c_define(term, &locals, vars)) break; } else if (!strcmp(token, "if") || !strcmp(token, "while")) { if (c_cond(term, locals, token)) break; } else if (!strcmp(token, "else")) return c_errno = C_ERROR_NOTINIF; else if (!strcmp(token, "continue")) { if (c_continue()) break; } else if (!strcmp(token, "break")) { if (c_break()) break; } else if (!strcmp(token, "return")) { if (c_return(term)) break; } else if (*token != ';') if (c_expr(term, locals, token)) break; if (c_errno) break; } c_free_ident(locals, vars); if (c_errno && c_EOF) c_errno = C_ERROR_EOF; return c_errno;}#ifdef __GNUC__static void c_direct(union c_insn *addr);#endifint c_compile(int (*ext_getchar)(void), void (*ext_rewind)(void), struct c_ident *externs){#ifdef __GNUC__ c_direct(NULL);#endif c_ext_getchar = ext_getchar; c_ext_rewind = ext_rewind; c_code_start = NULL; c_data_start = NULL; for (c_pass = 0; c_pass < 2; c_pass++) { c_init(); c_block(0, externs); if (!c_pass) { c_free_ident(c_funcs, NULL); c_free_fixup(c_break_fixups, NULL); } if (c_errno || c_pass) break; c_code_start = mem_alloc((size_t)c_code_ptr); c_data_start = mem_alloc((size_t)c_data_ptr); } return c_errno;}struct c_ident *c_lookup(char *name){ return c_find_ident(c_funcs, NULL, name);}void c_execute(struct c_ident *fn){#ifndef __GNUC__ register void (*op)(void);#endif if (!fn) return;#ifdef __GNUC__ c_direct(fn->addr);#else c_stack[0].pc = NULL; c_sp = &c_stack[2]; c_pc = fn->addr; do { op = (c_pc++)->op; op(); } while (c_pc);#endif}#ifdef __GNUC__static void c_direct(union c_insn *addr){ union c_insn *pc = addr; union c_insn *sp = c_stack; c_int imm = 0; static void *ops[] = { &&op_index, &&op_assign, &&op_add_a, &&op_sub_a, &&op_mul_a, &&op_div_a, &&op_mod_a, &&op_or_a, &&op_xor_a, &&op_and_a, &&op_shl_a, &&op_shr_a, &&op_or_i, &&op_and_b, &&op_not_b, &&op_eq, &&op_sub, &&op_gt, &&op_lt, &&op_ge, &&op_le, &&op_or_i, &&op_xor_i, &&op_and_i, &&op_shl, &&op_shr, &&op_add, &&op_sub, &&op_mul, &&op_div, &&op_mod, &&op_not_i, &&op_neg, &&op_inc_l, &&op_dec_l, &&op_inc_r, &&op_dec_r, }; if (!addr) { int op = 0; c_op_return = &&op_return; c_op_bz = &&op_bz; c_op_ba = &&op_ba; c_op_push_imm = &&op_push_imm; c_op_push_mem = &&op_push_mem; c_op_pop = &&op_pop; c_op_push_imm_imm = &&op_push_imm_imm; c_op_push_imm_mem = &&op_push_imm_mem; c_op_push_mem_imm = &&op_push_mem_imm; c_op_push_mem_mem = &&op_push_mem_mem; do { c_ops[op].op = ops[op]; } while (c_ops[++op].prec); return; } goto *(pc++)->op;op_return: return;op_bz: if (imm) { pc += 2; sp -= 2; goto *(pc - 1)->op; } sp -= 2;op_ba: pc = pc->pc; goto *(pc++)->op;op_push_imm: (sp - 2)->imm = imm; imm = pc->imm; pc += 2; sp += 2; goto *(pc - 1)->op;op_push_mem: (sp - 2)->imm = imm; imm = *((sp + 1)->mem = pc->mem); pc += 2; sp += 2; goto *(pc - 1)->op;op_pop: sp -= 2; goto *(pc++)->op;op_push_imm_imm: (sp - 2)->imm = imm; sp->imm = pc->imm; imm = (pc + 1)->imm; pc += 3; sp += 4; goto *(pc - 1)->op;op_push_imm_mem: (sp - 2)->imm = imm; sp->imm = pc->imm; imm = *((sp + 3)->mem = (pc + 1)->mem); pc += 3; sp += 4; goto *(pc - 1)->op;op_push_mem_imm: (sp - 2)->imm = imm; sp->imm = *((sp + 1)->mem = pc->mem); imm = (pc + 1)->imm; pc += 3; sp += 4; goto *(pc - 1)->op;op_push_mem_mem: (sp - 2)->imm = imm; sp->imm = *((sp + 1)->mem = pc->mem); imm = *((sp + 3)->mem = (pc + 1)->mem); pc += 3; sp += 4; goto *(pc - 1)->op;op_index: imm = *((sp - 3)->mem += imm); sp -= 2; goto *(pc++)->op;op_assign: *(sp - 3)->mem = imm; sp -= 2; goto *(pc++)->op;op_add_a: imm = *(sp - 3)->mem += imm; sp -= 2; goto *(pc++)->op;op_sub_a: imm = *(sp - 3)->mem -= imm; sp -= 2; goto *(pc++)->op;op_mul_a: imm = *(sp - 3)->mem *= imm; sp -= 2; goto *(pc++)->op;op_div_a: imm = *(sp - 3)->mem /= imm; sp -= 2; goto *(pc++)->op;op_mod_a: imm = *(sp - 3)->mem %= imm; sp -= 2; goto *(pc++)->op;op_or_a: imm = *(sp - 3)->mem |= imm; sp -= 2; goto *(pc++)->op;op_xor_a: imm = *(sp - 3)->mem ^= imm; sp -= 2; goto *(pc++)->op;op_and_a: imm = *(sp - 3)->mem &= imm; sp -= 2; goto *(pc++)->op;op_shl_a: imm = *(sp - 3)->mem <<= imm; sp -= 2; goto *(pc++)->op;op_shr_a: imm = *(sp - 3)->mem >>= imm; sp -= 2; goto *(pc++)->op;op_or_i: imm |= (sp - 4)->imm; sp -= 2; goto *(pc++)->op;op_and_b: imm = (sp - 4)->imm && imm; sp -= 2; goto *(pc++)->op;op_not_b: imm = !imm; goto *(pc++)->op;op_eq: imm = (sp - 4)->imm == imm; sp -= 2; goto *(pc++)->op;op_gt: imm = (sp - 4)->imm > imm; sp -= 2; goto *(pc++)->op;op_lt: imm = (sp - 4)->imm < imm; sp -= 2; goto *(pc++)->op;op_ge: imm = (sp - 4)->imm >= imm; sp -= 2; goto *(pc++)->op;op_le: imm = (sp - 4)->imm <= imm; sp -= 2; goto *(pc++)->op;op_xor_i: imm ^= (sp - 4)->imm; sp -= 2; goto *(pc++)->op;op_and_i: imm &= (sp - 4)->imm; sp -= 2; goto *(pc++)->op;op_shl: imm = (sp - 4)->imm << imm; sp -= 2; goto *(pc++)->op;op_shr: imm = (sp - 4)->imm >> imm; sp -= 2; goto *(pc++)->op;op_add: imm += (sp - 4)->imm; sp -= 2; goto *(pc++)->op;op_sub: imm = (sp - 4)->imm - imm; sp -= 2; goto *(pc++)->op;op_mul: imm *= (sp - 4)->imm; sp -= 2; goto *(pc++)->op;op_div: imm = (sp - 4)->imm / imm; sp -= 2; goto *(pc++)->op;op_mod: imm = (sp - 4)->imm % imm; sp -= 2; goto *(pc++)->op;op_not_i: imm = ~imm; goto *(pc++)->op;op_neg: imm = -imm; goto *(pc++)->op;op_inc_l: *(sp - 1)->mem = ++imm; goto *(pc++)->op;op_dec_l: *(sp - 1)->mem = --imm; goto *(pc++)->op;op_inc_r: *(sp - 1)->mem = imm + 1; goto *(pc++)->op;op_dec_r: *(sp - 1)->mem = imm - 1; goto *(pc++)->op;}#endifstatic void c_f_op_return(void){ c_pc = (c_sp -= 2)->pc;}static void c_f_op_bz(void){ if ((c_sp -= 2)->imm) c_pc++; else c_pc = c_pc->pc;}static void c_f_op_ba(void){ c_pc = c_pc->pc;}static void c_f_op_push_imm(void){ c_sp->imm = (c_pc++)->imm; c_sp += 2;}static void c_f_op_push_mem(void){ (c_sp++)->imm = *c_pc->mem; (c_sp++)->mem = (c_pc++)->mem;}static void c_f_op_pop(void){ c_sp -= 2;}static void c_f_op_push_imm_imm(void){ c_sp->imm = (c_pc++)->imm; (c_sp + 2)->imm = (c_pc++)->imm; c_sp += 4;}static void c_f_op_push_imm_mem(void){ c_sp->imm = (c_pc++)->imm; (c_sp + 2)->imm = *c_pc->mem; (c_sp + 3)->mem = (c_pc++)->mem; c_sp += 4;}static void c_f_op_push_mem_imm(void){ c_sp->imm = *c_pc->mem; (c_sp + 1)->mem = (c_pc++)->mem; (c_sp + 2)->imm = (c_pc++)->imm; c_sp += 4;}static void c_f_op_push_mem_mem(void){ c_sp->imm = *c_pc->mem; (c_sp + 1)->mem = (c_pc++)->mem; (c_sp + 2)->imm = *c_pc->mem; (c_sp + 3)->mem = (c_pc++)->mem; c_sp += 4;}static void c_op_index(void){ c_sp -= 2; (c_sp - 2)->imm = *((c_sp - 1)->mem += c_sp->imm);}static void c_op_assign(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem = c_sp->imm;}static void c_op_add_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem += c_sp->imm;}static void c_op_sub_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem -= c_sp->imm;}static void c_op_mul_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem *= c_sp->imm;}static void c_op_div_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem /= c_sp->imm;}static void c_op_mod_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem %= c_sp->imm;}static void c_op_or_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem |= c_sp->imm;}static void c_op_xor_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem ^= c_sp->imm;}static void c_op_and_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem &= c_sp->imm;}static void c_op_shl_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem <<= c_sp->imm;}static void c_op_shr_a(void){ c_sp -= 2; (c_sp - 2)->imm = *(c_sp - 1)->mem >>= c_sp->imm;}static void c_op_or_i(void){ c_sp -= 2; (c_sp - 2)->imm |= c_sp->imm;}static void c_op_and_b(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm && c_sp->imm;}static void c_op_not_b(void){ (c_sp - 2)->imm = !(c_sp - 2)->imm;}static void c_op_eq(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm == c_sp->imm;}static void c_op_gt(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm > c_sp->imm;}static void c_op_lt(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm < c_sp->imm;}static void c_op_ge(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm >= c_sp->imm;}static void c_op_le(void){ c_sp -= 2; (c_sp - 2)->imm = (c_sp - 2)->imm <= c_sp->imm;}static void c_op_xor_i(void){ c_sp -= 2; (c_sp - 2)->imm ^= c_sp->imm;}static void c_op_and_i(void){ c_sp -= 2; (c_sp - 2)->imm &= c_sp->imm;}static void c_op_shl(void){ c_sp -= 2; (c_sp - 2)->imm <<= c_sp->imm;}static void c_op_shr(void){ c_sp -= 2; (c_sp - 2)->imm >>= c_sp->imm;}static void c_op_add(void){ c_sp -= 2; (c_sp - 2)->imm += c_sp->imm;}static void c_op_sub(void){ c_sp -= 2; (c_sp - 2)->imm -= c_sp->imm;}static void c_op_mul(void){ c_sp -= 2; (c_sp - 2)->imm *= c_sp->imm;}static void c_op_div(void){ c_sp -= 2; (c_sp - 2)->imm /= c_sp->imm;}static void c_op_mod(void){ c_sp -= 2; (c_sp - 2)->imm %= c_sp->imm;}static void c_op_not_i(void){ (c_sp - 2)->imm = ~(c_sp - 2)->imm;}static void c_op_neg(void){ (c_sp - 2)->imm = -(c_sp - 2)->imm;}static void c_op_inc_l(void){ *(c_sp - 1)->mem = ++(c_sp - 2)->imm;}static void c_op_dec_l(void){ *(c_sp - 1)->mem = --(c_sp - 2)->imm;}static void c_op_inc_r(void){ *(c_sp - 1)->mem = (c_sp - 2)->imm + 1;}static void c_op_dec_r(void){ *(c_sp - 1)->mem = (c_sp - 2)->imm - 1;}static void (*c_op_return)(void) = c_f_op_return;static void (*c_op_bz)(void) = c_f_op_bz;static void (*c_op_ba)(void) = c_f_op_ba;static void (*c_op_push_imm)(void) = c_f_op_push_imm;static void (*c_op_push_mem)(void) = c_f_op_push_mem;static void (*c_op_pop)(void) = c_f_op_pop;static void (*c_op_push_imm_imm)(void) = c_f_op_push_imm_imm;static void (*c_op_push_imm_mem)(void) = c_f_op_push_imm_mem;static void (*c_op_push_mem_imm)(void) = c_f_op_push_mem_imm;static void (*c_op_push_mem_mem)(void) = c_f_op_push_mem_mem;static struct c_op c_ops[] = { {1, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "[", c_op_index}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "=", c_op_assign}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "+=", c_op_add_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "-=", c_op_sub_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "*=", c_op_mul_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "/=", c_op_div_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "%=", c_op_mod_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "|=", c_op_or_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "^=", c_op_xor_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "&=", c_op_and_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, "<<=", c_op_shl_a}, {2, C_RIGHT_TO_LEFT, C_CLASS_BINARY, ">>=", c_op_shr_a}, {3, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "||", c_op_or_i}, {4, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "&&", c_op_and_b}, {5, C_RIGHT_TO_LEFT, C_CLASS_LEFT, "!", c_op_not_b}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "==", c_op_eq}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "!=", c_op_sub}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, ">", c_op_gt}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "<", c_op_lt}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, ">=", c_op_ge}, {6, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "<=", c_op_le}, {7, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "|", c_op_or_i}, {7, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "^", c_op_xor_i}, {8, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "&", c_op_and_i}, {9, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "<<", c_op_shl}, {9, C_LEFT_TO_RIGHT, C_CLASS_BINARY, ">>", c_op_shr}, {10, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "+", c_op_add}, {10, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "-", c_op_sub}, {11, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "*", c_op_mul}, {11, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "/", c_op_div}, {11, C_LEFT_TO_RIGHT, C_CLASS_BINARY, "%", c_op_mod}, {12, C_RIGHT_TO_LEFT, C_CLASS_LEFT, "~", c_op_not_i}, {12, C_RIGHT_TO_LEFT, C_CLASS_LEFT, "-", c_op_neg}, {12, C_LEFT_TO_RIGHT, C_CLASS_LEFT, "++", c_op_inc_l}, {12, C_LEFT_TO_RIGHT, C_CLASS_LEFT, "--", c_op_dec_l}, {12, C_LEFT_TO_RIGHT, C_CLASS_RIGHT, "++", c_op_inc_r}, {12, C_LEFT_TO_RIGHT, C_CLASS_RIGHT, "--", c_op_dec_r}, {0}};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -