📄 chksupport.cpp
字号:
__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", ®_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", ®_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 + -