📄 error.c
字号:
#include "cmm.h"#include <stdarg.h> int kind[] = {#define xx(a,b,c,d,e,f,g) c,#define yy(a,b,c,d,e,f,g) c,#include "token.h"};int errcnt=0,errlimit=20;/*test测试当前的记号是否为tok,如果是则读入下一个记号 *不是则跳过记号直到tok或记号集合set*/void test(int tok, char set[]){ if(t == tok) t = gettoken(); else { expect(tok); skipto(tok, set); if(t == tok) t = gettoken(); }}/*expect期待记号tok,如果不是则假设该记号存在并报错*/void expect(int tok){ if(t == tok) t = gettoken(); else { error("syntax error: found"); printtoken(); /*printtoken输出出错的记号*/ fprint(2," expecting '%k'\n",tok); }}/*error输出出错的信息,并在出错数量过多时终止程序*/void error(char *fmt, ...){ va_list ap; if(errcnt++ >= errlimit) { errcnt = -1; error("too many errors\n"); exit(1); } va_start(ap,fmt); fprint(2,"%w: ",&src); vfprint(2,fmt,ap); va_end(ap);}/*warning输出警告信息*/void warning(char *fmt, ...){ va_list ap; va_start(ap, fmt); fprint(2,"%:", &src); vfprint(2,fmt,ap); va_end(ap);}/*skipto跳过错误的记号,直到记号tok或集合set*/void skipto(int tok, char set[]){ int n; char *s; for( n=0; t!=tok && t!=EOI; t=gettoken()) { for( s=set; *s&&kind[t]!=*s; s++) ; if(kind[t] == *s) break; if(n++ == 0) error("skipping"); if(n <= 8) /*输出跳过的前9个记号*/ printtoken(); else if(n == 9) /*后面的记号将省略*/ fprint(2,"..."); } if(n > 8) { fprint(2," up to"); printtoken(); } if(n > 0) fprint(2,"\n");}/*debug_msg用于输出调试本编译程序的信息*/void debug_msg(char *fmt, ...){ va_list ap; va_start(ap,fmt); fprint(2,fmt,ap); va_end(ap);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -