编译器错误处理系统

来源:互联网 发布:sql select where or 编辑:程序博客网 时间:2024/06/05 14:47
/*错误处理程序用到的枚举定义*//*错误级别*/enum e_ErrorLevel{    LEVEL_WARNING,    LEVEL_ERROR,};/*工作阶段*/enum e_WorkStage{    STAGE_COMPILE,    STAGE_LINK,};/**异常处理stage:编译阶段还是链接阶段level:错误级别fmt:参数输出格式ap:可变参数列表**/void handle_exception(int stage,int level,char *fmt,va_list ap){    char buf[1024];    vsprintf(buf,fmt,ap);                                               /**把参数ap按照fmt的格式写入buf**/    if(stage==STAGE_COMPILE)    {        if(level==LEVEL_WARNING)            printf("%s(第%d行):编译警告:%s!\n",filename,line_num,buf);   /**filename文件名字,line_num行数是全局变量,在后面提到**/        else        {            printf("%s(第%d行):编译错误:%s!\n",filename,line_num,buf);            exit(-1);        }    }    else    {        printf("链接错误:%s!\n",buf);        exit(-1);    }}/**编译警告处理fmt:参数输出格式ap:可变参数列表**/void warning(char *fmt,...)  /**fmt用来控制格式,...是具体要操作的参数**/{    va_list ap;    va_start(ap,fmt);        /**ap是个指针,va_start(ap,fmt)后,ap会指向fmt后面第一个变参**/    handle_exception(STAGE_COMPILE,LEVEL_WARNING,fmt,ap);    va_end(ap);}/**编译致命错误处理fmt:参数输出格式ap:可变参数列表**/void error(char *fmt,...){    va_list ap;    va_start(ap,fmt);    handle_exception(STAGE_COMPILE,LEVEL_ERROR,fmt,ap);    va_end(ap);}/**提示错误,此处缺少某个语法成分msg:需要什么语法成分**/void expect(char *msg){    error("缺少%s",msg);}/**跳过单词c,取下一个单词,如果当前单词不是c,提示错误c:要跳过的单词**/void skip(int c){    if(token!=c)        error("缺少'%s'",get_tkstr(c));    get_token();}/**取得单词v所代表的源码字符串v:单词编号**/char *get_tkstr(int v){    if(v>tktable.count)                             /**不在单词表内**/        return NULL;    else if(v>=TK_CINT&&v<=TK_CSTR)        return sourcestr.data;                      /**sourcestr是源码字符串,后面会提到,现在不用管**/    else        return ((TkWord*)tktable.data[v])->spelling;}/**链接错误处理fmt:参数输出格式ap:可变参数列表**/void link_error(char *fmt,...){    va_list ap;    va_start(ap,fmt);    handle_exception(STAGE_LINK,LEVEL_ERROR,fmt,ap);    va_end(ap);}

0 0