📄 privatefuncs.cpp
字号:
// RULE 43: <N_COMJB> -> {T_ADDR}
SyntacticRules[43][0] = T_ADDR;
SyntacticRules[43][1] = 0;
}
void Assembler::InitRegsAlias()
{
RegsAlias[0][0] = "$zero";RegsAlias[0][1] = "$0";
RegsAlias[1][0] = "$at";RegsAlias[1][1] = "$1";
RegsAlias[2][0] = "$v0";RegsAlias[2][1] = "$2";
RegsAlias[3][0] = "$v1";RegsAlias[3][1] = "$3";
RegsAlias[4][0] = "$a0";RegsAlias[4][1] = "$4";
RegsAlias[5][0] = "$a1";RegsAlias[5][1] = "$5";
RegsAlias[6][0] = "$a2";RegsAlias[6][1] = "$6";
RegsAlias[7][0] = "$a3";RegsAlias[7][1] = "$7";
RegsAlias[8][0] = "$t0";RegsAlias[8][1] = "$8";
RegsAlias[9][0] = "$t1";RegsAlias[9][1] = "$9";
RegsAlias[10][0] = "$t2";RegsAlias[10][1] = "$10";
RegsAlias[11][0] = "$t3";RegsAlias[11][1] = "$11";
RegsAlias[12][0] = "$t4";RegsAlias[12][1] = "$12";
RegsAlias[13][0] = "$t5";RegsAlias[13][1] = "$13";
RegsAlias[14][0] = "$t6";RegsAlias[14][1] = "$14";
RegsAlias[15][0] = "$t7";RegsAlias[15][1] = "$15";
RegsAlias[16][0] = "$s0";RegsAlias[16][1] = "$16";
RegsAlias[17][0] = "$s1";RegsAlias[17][1] = "$17";
RegsAlias[18][0] = "$s2";RegsAlias[18][1] = "$18";
RegsAlias[19][0] = "$s3";RegsAlias[19][1] = "$19";
RegsAlias[20][0] = "$s4";RegsAlias[20][1] = "$20";
RegsAlias[21][0] = "$s5";RegsAlias[21][1] = "$21";
RegsAlias[22][0] = "$s6";RegsAlias[22][1] = "$22";
RegsAlias[23][0] = "$s7";RegsAlias[23][1] = "$23";
RegsAlias[24][0] = "$t8";RegsAlias[24][1] = "$24";
RegsAlias[25][0] = "$t9";RegsAlias[25][1] = "$25";
RegsAlias[26][0] = "$i0";RegsAlias[26][1] = "$26";
RegsAlias[27][0] = "$i1";RegsAlias[27][1] = "$27";
RegsAlias[28][0] = "$s9";RegsAlias[28][1] = "$28";
RegsAlias[29][0] = "$sp";RegsAlias[29][1] = "$29";
RegsAlias[30][0]= "$s8";RegsAlias[30][1] = "$30";
RegsAlias[31][0] = "$ra";RegsAlias[31][1] = "$31";
}
void Assembler::ErrorProcess( int Er )
{
switch ( Er )
{
case ERROR_LEX: //词法错误
ErrorLex();
break;
case ERROR_SEMANTIC: //语法错误,预测表项为空
{
cout << "sysmantic error... " << endl
<< " probably the corresponding item in ForcastTable is empty." << endl;
break;
}
case ERROR_DEDUCTION: //推导错误,栈满
{
cout << "deduction error..." << endl;
break;
}
case ERROR_REIDNAME: //标号名重复
{
cout << "line " << No_TxtLine << ": "
<< " normal idname is repeatedly defined..." << endl;
break;
}
case ERROR_REIDNAMES: //开始标号名重复
{
cout << "line " << No_TxtLine << ": "
<< " start idname is repeatedly defined..." << endl;
break;
}
case ERROR_CONCMD: //指令构造出错
{
cout << "line " << No_TxtLine << ": "
<< " immediate(as addr) connot be divided by 4 or the regalia is not correct..." << endl;
break;
}
case ERROR_CONCMDS: //指令串接出错
{
cout << "line " << No_TxtLine << ": "
<< "code addr is out of the maximun addr..." << endl;
break;
}
case ERROR_DEFVAR: //变量定义错误
{
cout << "line " << No_TxtLine << ": "
<< "var name is incorrectly defined..." << endl;
break;
}
case ERROR_DATA_ADDR : //数据地址不能被4整除
{
cout << "line " << No_TxtLine << ": "
<< "data address cannot be divided by 4..." << endl;
break;
}
case ERROR_CODE_ADDR : //代码地址不能被4整除
{
cout << "line " << No_TxtLine << ": "
<< "code address cannot be divided by 4..." << endl;
break;
}
case ERROR_DATA_ADDR_OVERLAPPED: //地址已被占用
{
cout << "data address overlapped: a data ram unit used cannot be written again..." << endl;
break;
}
case ERROR_CODE_ADDR_OVERLAPPED: //地址已被占用
{
cout << "code address overlapped: a code ram unit used cannot be written again..." << endl;
break;
}
case ERROR_NOTEXIST_SEGID: //有转移指令引用了不存在的指令标号
{
cout << "there reference a not-existed SegName..." << endl;
break;
}
default:
break;
}
DeleteFiles();
}
void Assembler::ErrorLex()
{
switch ( STACK.top() )
{
case T_CODE:
{
cout << "line " << No_TxtLine << " : "
<< "Error: CODE is incorrect or missing..." << endl;
break;
}
case T_ORG_CODE:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ORG_CODE is incorrect or missing..." << endl;
break;
}
case T_DATA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: DATA is incorrect or missing..." << endl;
break;
}
case T_ORG_DATA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ORG_DATA is incorrect or missing..." << endl;
break;
}
case T_END:
{
cout << "line " << No_TxtLine << " : "
<< "Error: END is incorrect or missing..." << endl;
break;
}
case T_DW:
{
cout << "line " << No_TxtLine << " : "
<< "Error: DW is incorrect or missing..." << endl;
break;
}
case T_SEG:
{
cout << "line " << No_TxtLine << " : "
<< "Error: SEG is incorrect or missing..." << endl;
break;
}
case T_ENDS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ENDS is incorrect or missing..." << endl;
break;
}
case T_ENDL:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ENDL is incorrect or missing..." << endl;
break;
}
case T_IDNAME:
{
cout << "line " << No_TxtLine << " : "
<< "Error: IDNAME is incorrect or missing..." << endl;
break;
}
case T_COMMA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: COMMA is incorrect or missing..." << endl;
break;
}
case T_COLON:
{
cout << "line " << No_TxtLine << " : "
<< "Error: COLON is incorrect or missing..." << endl;
break;
}
case T_COMMENT:
{
cout << "line " << No_TxtLine << " : "
<< "Error: COMMENT is incorrect or missing..." << endl;
break;
}
case T_32NUM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: 32NUM is incorrect or missing..." << endl;
break;
}
case T_SHAMT:
{
cout << "line " << No_TxtLine << " : "
<< "Error: SHAMT is incorrect or missing..." << endl;
break;
}
case T_ADDR:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ADDR(should form as f12ch) is incorrect or missing..." << endl;
break;
}
case T_IMMEDIATE:
{
cout << "line " << No_TxtLine << " : "
<< "Error: IMMEDIATE is incorrect or missing..." << endl;
break;
}
case T_RS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: RS is incorrect or missing..." << endl;
break;
}
case T_RT:
{
cout << "line " << No_TxtLine << " : "
<< "Error: RT is incorrect or missing..." << endl;
break;
}
case T_RD:
{
cout << "line " << No_TxtLine << " : "
<< "Error: RD is incorrect or missing..." << endl;
break;
}
case T_BRS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: BRS is incorrect or missing..." << endl;
break;
}
case T_NOP:
{
cout << "line " << No_TxtLine << " : "
<< "Error: NOP is incorrect or missing..." << endl;
break;
}
case T_RCOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: RCOM is incorrect or missing..." << endl;
break;
}
case T_SRCOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: SRCOM is incorrect or missing..." << endl;
break;
}
case T_SLLRCOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: SLLRCOM is incorrect or missing..." << endl;
break;
}
case T_ICOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: ICOM is incorrect or missing..." << endl;
break;
}
case T_SICOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: SICOM is incorrect or missing..." << endl;
break;
}
case T_LWICOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: LWICOM is incorrect or missing..." << endl;
break;
}
case T_JCOM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: JCOM is incorrect or missing..." << endl;
break;
}
case N_PRO:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_PRO: should accept \"DATA\" or \"CODE\"..." << endl;
break;
}
case N_DATA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_DATA: should accept \"DATA\" or \"CODE\"..." << endl;
break;
}
case N_DATASEG:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_DATASEG: should accept \"DATA\"..." << endl;
break;
}
case N_ORG_DATA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_ORG_DATA: should accept \"ORG_DATA\"..." << endl;
break;
}
case N_VARS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_VARS: should accept IDNAME..." << endl;
break;
}
case N_VARSA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_VARSA: should accept \"DATA\" or IDNAME..." << endl;
break;
}
case N_VAR:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_VAR: should accept IDNAME..." << endl;
break;
}
case N_DATAENDS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_DATAENDS: should accept \"DATA\"..." << endl;
break;
}
case N_CODE:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_CODE: should accept \"CODE\"..." << endl;
break;
}
case N_CODESEG:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_CODESEG: should accept \"CODE\"..." << endl;
break;
}
case N_ORG_CODE:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_ORG_CODE: should accept \"ORG_CODE\"..." << endl;
break;
}
case N_SEG:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_SEG: should accept IDNAME..." << endl;
break;
}
case N_STARTSEGID:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_STARTSEG: should accept IDNAME..." << endl;
break;
}
case N_ORDER:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_ORDER: should accept correct command code..." << endl;
break;
}
case N_COM:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COM: should accept correct command code..." << endl;
break;
}
case N_ORDERS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_ORDERS: should accept correct command code..." << endl;
break;
}
case N_SUBSEGID:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_SUBSEGID: should accept IDNAME..." << endl;
break;
}
case N_ENDSEGID:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_ENDSEGID: should accept \"END\"..." << endl;
break;
}
case N_CODEENDS:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_CODEENDS: should accept \"CODE\"..." << endl;
break;
}
case N_COMQ:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMQ: should accept correct ICOM..." << endl;
break;
}
case N_COMQA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMQA: should accept IMMEDIATE or IDNAME..." << endl;
break;
}
case N_COMD:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMD: should accept correct LWICOM..." << endl;
break;
}
case N_COMDA:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMDA: should accept ADDR or IDNAME..." << endl;
break;
}
case N_COMDB:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMDB: should accept IDNAME..." << endl;
break;
}
case N_COMDC:
{
cout << "line " << No_TxtLine << " : "
<< "Error: N_COMDC: should accept BRS or PLUS(+)..." << endl;
break;
}
default:
cout << "line " << No_TxtLine << " : "
<< "Error not known occurs..." << endl;
break;
}
DeleteFiles();
}
void Assembler::DeleteFiles()
{
fclose(DataFile); //关闭数据文件
fclose(ProgramFile); //关闭指令文件
remove("dmem32.mif");
remove("prgmip32.mif");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -