📄 errorreport.h
字号:
#pragma once
#include<stdio.h>
char * error[]={ //错误指针
"无法打开.asm源文件",//0
"这一行中有太多参数",//1
"发现未配对的单引号",//2
"发现非法结构:某对单引号中的字符数大于2,无法求值",//3
"\'char1char2\'的值为(int)char1*256+(int)char2",//4
"某16进制数出现异常",//5
"可能原因:出现非法字符或字符串太长",//6
"某10进制数出现异常",//7
"可能原因:出现非法字符,字符串太长或是不能识别的立即数或标号",//8
"操作数中无法识别的数据类型",//9
"此行中有奇数个单引号",//10
"系统提示:不支持转义字符",//11
"END语句出现错误",//12
"END语句不应有参数",//13
"前面已检测到END语句",//14
"ORG语句出现错误",//15
"ORG语句带一个参数",//16
"非初始ORG语句指定的地址不应小于当前地址",//17
"DW语句出现错误",//18
"DW语句后没有内容",//19
"DW语句的某参数中发现未配对的单引号",//20
"标号语句出现错误",//21
"空标号错误",//22
"EQU语句出现错误",//23
"缺少操作数,EQU语句正确格式:{变量名} EQU {表达式}",//24
"无法识别语句类型",//25
"文件末尾未找到END语句",//26
".asm源文件应以END语句结尾",//27
"指令格式错误",//28
"操作数个数错误",//29
"在第一条指令前没有初始ORG语句指明基准地址",//30
"无法继续汇编",//31
"非法寄存器指定语句(DR)",//32
"系统提示:类号23的指令格式为OP DR",//33
"系统提示:类号22的指令格式为OP SR",//34
"系统提示:类号1的指令格式为OP DR SR",//35
"非法寄存器指定语句(SR)",//36
"操作数中发生与方括号有关的错误",//37
"可能原因:没有方括号或方括号未配对",//38
"系统提示:LDRR DR,[SR]",//39
"系统提示:STRR [DR],SR",//40
"系统提示:MVRD DR,DATA",//41
"表达式求值时发生除零错误",//42
"系统提示:LDRA DR,[ADR]",//43
"系统提示:STRA [ADR],SR",//44
"系统提示:STRX/LDRX DR, offset[SR]",//45
"无法创建.cod文件",//46
};
class Error{ //错误类
friend class ErrorReport;
private:
int line; //.asm文件出错所在行数
int des; //error[]中对应出错指针
Error * next;
public:
Error(int l,int d):line(l),des(d),next(NULL){}
~Error(void){}
int GetLineNum(void){return line;}
int GetDes(void){return des;}
int CompareLineNum(Error *);
Error * GetNext(void){ return next;}
};
int Error::CompareLineNum(Error * e){ //比较出错对象
int eLine;
if(e==NULL)return -1;
else{
eLine=e->GetLineNum();
if(line==eLine)return 1;
else return -1;
}
}
class ErrorReport { //出错对象链表类
private:
Error * head;
int errorCount; //记载出错的个数
int p; //buffer[]中指针
char buffer[4096]; //用于输出出错记录
public:
ErrorReport(void):head(NULL),errorCount(0),p(0){buffer[0]='\0';}
~ErrorReport(void){Clear();}
Error * GetHead(void){return head;}
void Clear(void);
void AddError(int,int);
char * ToString(void);
int GetErrorCount(void) { return this->errorCount; }
};
void ErrorReport::AddError(int l,int d){ //发现出错,将对应错误对象加入ErrorReport链表
Error * newerror,* temp;
newerror=new Error(l,d);
if(head==NULL)head=newerror;
else{
temp=head;
while(temp->next != NULL){temp=temp->next;}
temp->next=newerror;
}
errorCount++;
}
void ErrorReport::Clear(void){ //析构
static Error * k=head;
while(k!=NULL){
head = head->next;
delete k;
k=head;
}
p=0;
errorCount=0;
buffer[0]='\0';
}
char * ErrorReport::ToString(void) //将ErrorReport各节点对象中的出错记录输出到buffer中
{
int i,line;
static char ch, * des;
Error * k=head;
while(k!=NULL){
line=k->GetLineNum();
if(line!=0)p+=sprintf(buffer+p,"Line %d:",line);
//
i=0;
des=error[k->GetDes()];
p+=sprintf(buffer+p,"%s",des);
buffer[p++]='\r';
buffer[p++]='\n';
//
k=k->next;
}
buffer[p++]='\0';
return buffer;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -