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

📄 compiler.c

📁 著名的解Unix密码的源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		} 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(term, locals)) 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 (*ext_rewind)(),	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;}int c_execute(char *name){	struct c_ident *fn;#ifndef __GNUC__	register void (*op)();#endif	if (!(fn = c_find_ident(c_funcs, NULL, (unsigned char *)name)))		return C_ERROR_UNKNOWN;#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	return C_ERROR_NONE;}#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(){	c_pc = (c_sp -= 2)->pc;}static void c_f_op_bz(){	if ((c_sp -= 2)->imm)		c_pc++;	else		c_pc = c_pc->pc;}static void c_f_op_ba(){	c_pc = c_pc->pc;}static void c_f_op_push_imm(){	c_sp->imm = (c_pc++)->imm;	c_sp += 2;}static void c_f_op_push_mem(){	(c_sp++)->imm = *c_pc->mem;	(c_sp++)->mem = (c_pc++)->mem;}static void c_f_op_pop(){	c_sp -= 2;}static void c_f_op_push_imm_imm(){	c_sp->imm = (c_pc++)->imm;	(c_sp + 2)->imm = (c_pc++)->imm;	c_sp += 4;}static void c_f_op_push_imm_mem(){	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(){	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(){	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(){	c_sp -= 2;	(c_sp - 2)->imm = *((c_sp - 1)->mem += c_sp->imm);}static void c_op_assign(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem = c_sp->imm;}static void c_op_add_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem += c_sp->imm;}static void c_op_sub_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem -= c_sp->imm;}static void c_op_mul_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem *= c_sp->imm;}static void c_op_div_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem /= c_sp->imm;}static void c_op_mod_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem %= c_sp->imm;}static void c_op_or_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem |= c_sp->imm;}static void c_op_xor_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem ^= c_sp->imm;}static void c_op_and_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem &= c_sp->imm;}static void c_op_shl_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem <<= c_sp->imm;}static void c_op_shr_a(){	c_sp -= 2;	(c_sp - 2)->imm = *(c_sp - 1)->mem >>= c_sp->imm;}static void c_op_or_i(){	c_sp -= 2;	(c_sp - 2)->imm |= c_sp->imm;}static void c_op_and_b(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm && c_sp->imm;}static void c_op_not_b(){	(c_sp - 2)->imm = !(c_sp - 2)->imm;}static void c_op_eq(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm == c_sp->imm;}static void c_op_gt(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm > c_sp->imm;}static void c_op_lt(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm < c_sp->imm;}static void c_op_ge(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm >= c_sp->imm;}static void c_op_le(){	c_sp -= 2;	(c_sp - 2)->imm = (c_sp - 2)->imm <= c_sp->imm;}static void c_op_xor_i(){	c_sp -= 2;	(c_sp - 2)->imm ^= c_sp->imm;}static void c_op_and_i(){	c_sp -= 2;	(c_sp - 2)->imm &= c_sp->imm;}static void c_op_shl(){	c_sp -= 2;	(c_sp - 2)->imm <<= c_sp->imm;}static void c_op_shr(){	c_sp -= 2;	(c_sp - 2)->imm >>= c_sp->imm;}static void c_op_add(){	c_sp -= 2;	(c_sp - 2)->imm += c_sp->imm;}static void c_op_sub(){	c_sp -= 2;	(c_sp - 2)->imm -= c_sp->imm;}static void c_op_mul(){	c_sp -= 2;	(c_sp - 2)->imm *= c_sp->imm;}static void c_op_div(){	c_sp -= 2;	(c_sp - 2)->imm /= c_sp->imm;}static void c_op_mod(){	c_sp -= 2;	(c_sp - 2)->imm %= c_sp->imm;}static void c_op_not_i(){	(c_sp - 2)->imm = ~(c_sp - 2)->imm;}static void c_op_neg(){	(c_sp - 2)->imm = -(c_sp - 2)->imm;}static void c_op_inc_l(){	*(c_sp - 1)->mem = ++(c_sp - 2)->imm;}static void c_op_dec_l(){	*(c_sp - 1)->mem = --(c_sp - 2)->imm;}static void c_op_inc_r(){	*(c_sp - 1)->mem = (c_sp - 2)->imm + 1;}static void c_op_dec_r(){	*(c_sp - 1)->mem = (c_sp - 2)->imm - 1;}static void (*c_op_return)() = c_f_op_return;static void (*c_op_bz)() = c_f_op_bz;static void (*c_op_ba)() = c_f_op_ba;static void (*c_op_push_imm)() = c_f_op_push_imm;static void (*c_op_push_mem)() = c_f_op_push_mem;static void (*c_op_pop)() = c_f_op_pop;static void (*c_op_push_imm_imm)() = c_f_op_push_imm_imm;static void (*c_op_push_imm_mem)() = c_f_op_push_imm_mem;static void (*c_op_push_mem_imm)() = c_f_op_push_mem_imm;static void (*c_op_push_mem_mem)() = 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 + -