⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 error.c

📁 unix环境下实现的cmm语言编译器
💻 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 + -