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

📄 chksupport.cpp

📁 一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了这个编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
				__vartype2str(p1->var_type));
			var.var_type = var_type_notfound;
			var.lvalue = 0; var.const_sign = 0;
			return;
		}
		size1 ++; size2 ++;
		p1 ++; p2 ++;
	}
	if (p1 != SymbolListType[func.var_type].field_var.end() || p2 != var_list.end())
	{
		while (p1 != SymbolListType[func.var_type].field_var.end()) { p1 ++; size1 ++; }
		while (p2 != var_list.end()) { p2 ++; size2 ++; }
		errormsg(19, PROGRAM_LineNumber, __vartype2str(func.var_type), __int2str(size1), __int2str(size2));
		var.var_type = var_type_notfound;
		var.lvalue = 0; var.const_sign = 0;
		return;
	}
	var.var_type = SymbolListType[func.var_type].ret_type_id;
	var.lvalue = 0; var.const_sign = 0;
	return;
}

int __chk_varlist_valid(list <TSymbolListVariableEntry>& var_list)
{
	for (list <TSymbolListVariableEntry> :: iterator p = var_list.begin(); p != var_list.end(); p ++)
	{
		if (p->var_type == var_type_notfound)
		{
			return 0;
		}
	}
	return 1;
}

int CheckMakeNewFuncDecl(TSymbolListFunctionEntry& Fentry, int noreport = 0)
{
	if (!Fentry.valid) return 0;
	if (Fentry.func_type == var_type_notfound) return 0;
	if (SymbolListType[Fentry.func_type].ret_type_id >= 0 && SymbolListType[SymbolListType[Fentry.func_type].ret_type_id].type_number != type_number_pointer)
	{
		if (!noreport)
		{
			errormsg(42, Fentry.defined_line);
		}
		return 0;
	}
	if (SymbolListFunction[Fentry.id].id != SymbolList_id_notdefined)
	{
		if (SymbolListFunction[Fentry.id].func_type != Fentry.func_type)
		{
			if (!noreport)
			{
				errormsg(2, Fentry.defined_line, IDHash_int2ID(Fentry.id), __int2str(SymbolListGetDefinedLine(Fentry.id)));
			}
			return 0;
		}
	}
	else
	{
		if (SymbolListChkDefined(Fentry.id))
		{
			if (!noreport)
			{
				errormsg(2, Fentry.defined_line, IDHash_int2ID(Fentry.id), __int2str(SymbolListGetDefinedLine(Fentry.id)));
			}
			return 0;
		}
	}

	if (SymbolListFunction[Fentry.id].id == SymbolList_id_notdefined)
	{
		Fentry.defined = 0;
		SymbolListAddFunctionEntry(Fentry.id, Fentry);
	}
	return 1;
}

void CheckMakeNewFuncDef(TSymbolListFunctionEntry& Fentry)
{
	if (!Fentry.valid) return;
	if (CheckMakeNewFuncDecl(Fentry, 1))
	{
		if (SymbolListFunction[Fentry.id].defined)
		{
			errormsg(31, Fentry.defined_line, IDHash_int2ID(Fentry.id));
			return;
		}
		SymbolListFunction[Fentry.id].defined = 1;
	}
}

void CheckFindArrayAddr(TSymbolListVariableEntry& var1, TSymbolListVariableEntry& var2, TSymbolListVariableEntry& var)
{
	var = var1;
	if (var.var_type == var_type_notfound) return;

	if (var.var_type < 0 || SymbolListType[var.var_type].type_number != type_number_pointer && SymbolListType[var.var_type].type_number != type_number_array)
	{
		errormsg(10, PROGRAM_LineNumber);
		var.var_type = var_type_notfound;
		var.const_sign = 0; var.lvalue = 0;
		return;
	}

	if (SymbolListType[var.var_type].ret_type_id == var_type_void)
	{
		errormsg(48, PROGRAM_LineNumber, __vartype2str(var.var_type));
		var.var_type = var_type_notfound;
		var.const_sign = 0; var.lvalue = 0;
		return;
	}

	var.var_type = SymbolListType[var.var_type].ret_type_id;
	if (!__chk_int_type(var2))
	{
		errormsg(14, PROGRAM_LineNumber);
		var.const_sign = 0; var.lvalue = 0;
		return;
	}
}

void CheckAddPtr(TSymbolListVariableEntry& var1, TSymbolListVariableEntry& var)
{
	var = var1;
	if (var.var_type == var_type_notfound) return;

	if (var.var_type < 0 || SymbolListType[var.var_type].type_number != type_number_pointer)
	{
		errormsg(37, PROGRAM_LineNumber);
		var.var_type = var_type_notfound;
		var.const_sign = 0; var.lvalue = 0;
		return;
	}

	if (SymbolListType[var.var_type].ret_type_id == var_type_void)
	{
		errormsg(48, PROGRAM_LineNumber, __vartype2str(var.var_type));
		var.var_type = var_type_notfound;
		var.const_sign = 0; var.lvalue = 0;
		return;
	}

	var.var_type = SymbolListType[var.var_type].ret_type_id;
	var.lvalue = 1; var.const_sign = 0;
}

void CheckAddRef(TSymbolListVariableEntry& var1, TSymbolListVariableEntry& var)
{
	var = var1;
	if (var.var_type == var_type_notfound) return;

	if (!var.lvalue)
	{
		errormsg(38, PROGRAM_LineNumber);
		var.var_type = var_type_notfound;
		var.const_sign = 0; var.lvalue = 0;
		return;
	}

	var.var_type = SymbolListTypeADDStar(var.var_type);
	var.lvalue = 0; var.const_sign = 0;
}

void MakeConstantIntExpr(TSymbolListVariableEntry& var, int value, int var_type)
{
	var.const_sign = 1; var.const_val = value;
	var.lvalue = 0; var.var_type = var_type;
}

void CheckMakeLet(TSymbolListVariableEntry& var1, TSymbolListVariableEntry& var2, TSymbolListVariableEntry& var, string action = "assignment")
{
	var = var1;
	if (var1.var_type == var_type_notfound) return;
	var.lvalue = 0;
	if (!var1.lvalue)
	{
		errormsg(32, PROGRAM_LineNumber, action);
		return;
	}
	if (!CheckCastCompatibility(var1, var2))
	{
		errormsg(7, PROGRAM_LineNumber, __vartype2str(var1), "=", __vartype2str(var2));
		return;
	}
}

void CheckExprSelfAction(TSymbolListVariableEntry& var1, TSymbolListVariableEntry& var, int op_type)
{
	var = var1;
	var.lvalue = 0;
	string action;
	if (op_type == SRC_calculational_ADD) action = "increment"; else action = "decrement";
	if (var.var_type >= 0 && SymbolListType[var.var_type].type_number != type_number_pointer)
	{
		errormsg(8, PROGRAM_LineNumber, action + " of", __vartype2str(var));
	}
	CheckMakeLet(var1, var1, var, action);
}

int CheckArraysubToConst(TSymbolListVariableEntry& var)
{
	if (!var.const_sign || var.const_val <= 0)
	{
		errormsg(41, PROGRAM_LineNumber);
		return -1;
	}
	return var.const_val;
}

void CheckRegOperation(int op_type, string reg_str, int id)
{
	int reg_num;
	reg_str = reg_str.substr(1, reg_str.length() - 2);
	if (reg_str.length() < 1 || reg_str[0] != 'r' || sscanf(reg_str.c_str(), "r%d", &reg_num) != 1 || reg_num < 0 || reg_num >= 8)
	{
		errormsg(43, PROGRAM_LineNumber);
		return;
	}
	if (!SymbolListVariable[id].empty()) 
	{
	}
	else
	{
		errormsg(44, PROGRAM_LineNumber);
		return;
	}
	if (!SymbolListVariable[id].empty() && !SymbolListVariable[id].begin()->const_sign) 
	{
	}
	else
	{
		errormsg(44, PROGRAM_LineNumber);
		return;
	}
	TSymbolListVariableEntry var = *SymbolListVariable[id].begin();
	if (!__chk_int_type(var))
	{
		if (op_type == REG_OP_READ)
		{
			errormsg(7, PROGRAM_LineNumber, __vartype2str(var), "=", "[register]");
		}
		else
		{
			errormsg(7, PROGRAM_LineNumber, "[register]", "=", __vartype2str(var));
		}
		return;
	}
}

int chk_func_defined()
{
	error_msgs.clear();
	int ret = 1;
	int main_find = 0;
	for (unsigned int i = 0; i < SymbolListFuncDefined.size(); i++)
	{
		int id = SymbolListFuncDefined[i];
		if (IDHash_int2ID(id) == "main")
		{
			main_find = 1;
		}
		if (!SymbolListFunction[id].defined)
		{
			errormsg(35, SymbolListFunction[id].defined_line, IDHash_int2ID(id));
			ret = 0;
		}
	}
	if (!main_find)
	{
		errormsg(35, PROGRAM_LineNumber, "main entry");
		ret = 0;
	}
	errormsg_print();
	return ret;
}

void CheckASM(int paramcount, string op_name, string op1 = "\"__(null)\"", string op2 = "\"__(null)\"", string op3 = "\"__(null)\"")
{
	int j, total_op;
	total_op = sizeof(ASMops) / sizeof(TASMop);
	op_name = op_name.substr(1, op_name.length() - 2);
	for (j = 0; j < total_op; j ++)
	{
		if (op_name == ASMops[j].op_name) break;
	}
	if (j >= total_op)
	{
		errormsg(45, PROGRAM_LineNumber, op_name);
		return;
	}

	string operands[3];
	operands[0] = op1.substr(1, op1.length() - 2);
	operands[1] = op2.substr(1, op2.length() - 2);
	operands[2] = op3.substr(1, op3.length() - 2);

	int needtype[3];

	int need_op_count = 0;
	for (int i = 0; i < (int)strlen(ASMops[j].code); i ++)
	{
		int k = 0;
		if (ASMops[j].code[i] == 'x' || ASMops[j].code[i] == 'X') k = 1;
		if (ASMops[j].code[i] == 'y' || ASMops[j].code[i] == 'Y') k = 2;
		if (ASMops[j].code[i] == 'z' || ASMops[j].code[i] == 'Z') k = 3;
		if (k != 0)
		{
			needtype[k - 1] = (ASMops[j].code[i] >= 'x' && ASMops[j].code[i] <= 'z');
		}
		if (k > need_op_count) need_op_count = k;
	}

	if (need_op_count != paramcount)
	{
		errormsg(46, PROGRAM_LineNumber, op_name, __int2str(need_op_count), __int2str(paramcount));
		return;
	}

	for (int i = 0; i < need_op_count; i ++)
	{
		int nowtype;
		if (operands[i].length() >= 1 && operands[i][0] == 'r')
		{
			nowtype = 1;
			int reg_num = -1;
			if (sscanf(operands[i].c_str(), "r%d", &reg_num) != 1 || reg_num < 0 || reg_num > 7)
			{
				nowtype = -1;
			}
		}
		else
		{
			nowtype = 0;
			int num;
			if (operands[i].length() >= 2 && operands[i][0] == '0' && operands[i][1] == 'x')
			{
				int ret;
				if ((ret = sscanf(operands[i].c_str(), "%x", &num)) != 1) nowtype = -1;
			}
			else
			{
				if (sscanf(operands[i].c_str(), "%d", &num) != 1) nowtype = -1;
			}
		}
		if (needtype[i] != nowtype)
		{
			errormsg(47, PROGRAM_LineNumber, op_name, needtype[i] == 1 ? "register" : "immediate", __int2str(i + 1));
			return;
		}
	}
}

#endif			// __CHKSUPPORT_CPP__

⌨️ 快捷键说明

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