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

📄 finsh_compiler.c

📁 中国人自己的c语言
💻 C
📖 第 1 页 / 共 2 页
字号:
					finsh_code_byte(FINSH_OP_ST_BYTE);

					/* ld_value_byte &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
					finsh_code_dword((long)&(var->char_value));
					break;

				case FINSH_NODE_TYPE_WORD:
					/* address */
					// finsh_code_dword((long)&(var->short_value));

					/* ld_value_word &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					finsh_code_dword((long)&(var->short_value));

					/* ld_word 1 */
					finsh_code_byte(FINSH_OP_LD_WORD);
					finsh_code_word(1);

					/* add_word */
					finsh_code_byte(FINSH_OP_SUB_WORD);
					/* st_word */
					finsh_code_byte(FINSH_OP_ST_WORD);

					/* ld_value_word &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					finsh_code_dword((long)&(var->short_value));

					break;

				case FINSH_NODE_TYPE_DWORD:
					/* address */
					// finsh_code_dword((long)&(var->long_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					finsh_code_dword((long)&(var->long_value));

					/* ld_dword 1 */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword(1);

					/* add_dword */
					finsh_code_byte(FINSH_OP_SUB_DWORD);
					/* st_dword */
					finsh_code_byte(FINSH_OP_ST_DWORD);

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					finsh_code_dword((long)&(var->long_value));

					break;
				}
			}
			break;

		case FINSH_NODE_SYS_INC:
			if (finsh_node_child(node)->type == FINSH_NODE_ID)
			{
				struct finsh_var* var;
				var = finsh_node_child(node)->var;

				switch (node->dtype)
				{
				case FINSH_NODE_TYPE_BYTE:
					/* ld_value_byte &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
					// finsh_code_dword((long)&(var->char_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->char_value));

					/* ld_value_byte &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
					finsh_code_dword((long)&(var->char_value));

					/* ld_byte 1 */
					finsh_code_byte(FINSH_OP_LD_BYTE);
					finsh_code_byte(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_ADD_BYTE);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_BYTE);
					break;

				case FINSH_NODE_TYPE_WORD:
					/* ld_value_word &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					// finsh_code_dword((long)&(var->short_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->short_value));

					/* ld_value_word &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					finsh_code_dword((long)&(var->short_value));

					/* ld_word 1 */
					finsh_code_byte(FINSH_OP_LD_WORD);
					finsh_code_word(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_ADD_WORD);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_WORD);
					break;

				case FINSH_NODE_TYPE_DWORD:
					/* ld_value_dword &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					// finsh_code_dword((long)&(var->long_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->long_value));

					/* ld_value_dword &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					finsh_code_dword((long)&(var->long_value));

					/* ld_dword 1 */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_ADD_DWORD);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_DWORD);
					break;
				}
			}
			break;

		case FINSH_NODE_SYS_DEC:
			if (finsh_node_child(node)->type == FINSH_NODE_ID)
			{
				struct finsh_var* var;
				var = finsh_node_child(node)->var;

				switch (node->dtype)
				{
				case FINSH_NODE_TYPE_BYTE:
					/* ld_value_byte &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
					// finsh_code_dword((long)&(var->char_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->char_value));

					/* ld_value_byte &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_BYTE);
					finsh_code_dword((long)&(var->char_value));

					/* ld_byte 1 */
					finsh_code_byte(FINSH_OP_LD_BYTE);
					finsh_code_byte(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_SUB_BYTE);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_BYTE);
					break;

				case FINSH_NODE_TYPE_WORD:
					/* ld_value_word &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					// finsh_code_dword((long)&(var->short_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->short_value));

					/* ld_value_word &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_WORD);
					finsh_code_dword((long)&(var->short_value));

					/* ld_word 1 */
					finsh_code_byte(FINSH_OP_LD_WORD);
					finsh_code_word(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_SUB_WORD);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_WORD);
					break;

				case FINSH_NODE_TYPE_DWORD:
					/* ld_value_dword &id */
					// finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					// finsh_code_dword((long)&(var->long_value));

					/* ld_dword &id */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword((long)&(var->long_value));

					/* ld_value_dword &id */
					finsh_code_byte(FINSH_OP_LD_VALUE_DWORD);
					finsh_code_dword((long)&(var->long_value));

					/* ld_dword 1 */
					finsh_code_byte(FINSH_OP_LD_DWORD);
					finsh_code_dword(1);

					/* add_byte */
					finsh_code_byte(FINSH_OP_SUB_DWORD);
					/* get byte */
					finsh_code_byte(FINSH_OP_ST_DWORD);
					break;
				}
			}
			break;

		case FINSH_NODE_SYS_NEGATIVE:
			/* not support now */
			break;

		case FINSH_NODE_SYS_NULL:
			finsh_code_dword(0);
			break;

		default:
			finsh_error_set(FINSH_ERROR_UNKNOWN_NODE);
			break;
		}

		/* compile sibling node */
		if (finsh_node_sibling(node) != NULL)
            finsh_compile(finsh_node_sibling(node));
	}
	return 0;
}

static int finsh_type_check(struct finsh_node* node, u_char av)
{
	if (node != NULL)
	{
		/* address & value */
		if (node->type == FINSH_NODE_SYS_ASSIGN ||
			node->type == FINSH_NODE_SYS_PREINC ||
			node->type == FINSH_NODE_SYS_PREDEC)
		{
			/* address */
			finsh_type_check(finsh_node_child(node), FINSH_NODE_ADDRESS);
		}
		else
		{
			/* transfer 'av' to child node */
			finsh_type_check(finsh_node_child(node), av);
		}

		/* always does not load address in sibling */
		finsh_type_check(finsh_node_sibling(node), FINSH_NODE_VALUE);

		/** set attribute of current node */

		/* make sure the current node is address or value */
		if (node->avf != FINSH_NODE_FUNCTION) node->avf = av;

		if (finsh_node_child(node) != NULL)
		{
			node->dtype= finsh_node_child(node)->dtype;
			return 0;
		}

		if (node->type == FINSH_NODE_ID)
		{
			if (node->avf != FINSH_NODE_FUNCTION)
			{
				struct finsh_var* var;

				var = node->var;
				if (var != NULL)
				{
					switch (var->type)
					{
					case finsh_type_void:
						node->dtype = FINSH_NODE_TYPE_EMPTY;
						break;

					case finsh_type_char:
					case finsh_type_uchar:
						node->dtype = FINSH_NODE_TYPE_BYTE;
						break;

					case finsh_type_short:
					case finsh_type_ushort:
						node->dtype = FINSH_NODE_TYPE_WORD;
						break;

					case finsh_type_int:
					case finsh_type_uint:
					case finsh_type_long:
					case finsh_type_ulong:
					case finsh_type_charp:
					case finsh_type_voidp:
					case finsh_type_shortp:
					case finsh_type_intp:
					case finsh_type_longp:
						node->dtype = FINSH_NODE_TYPE_DWORD;
						break;

					default:
						finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
						break;
					}
				}
			}
		}
		else if (node->type == FINSH_NODE_VALUE_CHAR)
		{
			node->dtype = FINSH_NODE_TYPE_BYTE;
		}
		else if (node->type == FINSH_NODE_VALUE_INT ||
			node->type == FINSH_NODE_VALUE_LONG 	||
			node->type == FINSH_NODE_VALUE_STRING 	||
			node->type == FINSH_NODE_VALUE_NULL)
		{
			node->dtype = FINSH_NODE_TYPE_DWORD;
		}
	}
	return 0;
}

int finsh_compiler_run(struct finsh_node* node)
{
    struct finsh_node* sibling;

	/* type check */
	finsh_type_check(node, FINSH_NODE_VALUE);

	/* reset compile stack pointer and pc */
	finsh_compile_sp = &finsh_vm_stack[0];
	finsh_compile_pc = &text_segment[0];

    /* compile node */
    sibling = node;
    while (sibling != NULL)
    {
    	struct finsh_node* current_node;
    	current_node = sibling;

		/* get sibling node */
    	sibling = current_node->sibling;

		/* clean sibling node */
    	current_node->sibling = NULL;
    	finsh_compile(current_node);

		/* pop current value */
    	if (sibling != NULL) finsh_code_byte(FINSH_OP_POP);
    }

    return 0;
}

⌨️ 快捷键说明

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