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

📄 lex.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 2 页
字号:
			&& !(map[rcp[3]]&(DIGIT|LETTER))) {				cp = rcp + 3;				return ELSE;			}			if (rcp[0] == 'n'			&&  rcp[1] == 'u'			&&  rcp[2] == 'm'			&& !(map[rcp[3]]&(DIGIT|LETTER))) {				cp = rcp + 3;				return ENUM;			}			if (rcp[0] == 'x'			&&  rcp[1] == 't'			&&  rcp[2] == 'e'			&&  rcp[3] == 'r'			&&  rcp[4] == 'n'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return EXTERN;			}			goto id;		case 'f':			if (rcp[0] == 'l'			&&  rcp[1] == 'o'			&&  rcp[2] == 'a'			&&  rcp[3] == 't'			&& !(map[rcp[4]]&(DIGIT|LETTER))) {				cp = rcp + 4;				tsym = floattype->u.sym;				return FLOAT;			}			if (rcp[0] == 'o'			&&  rcp[1] == 'r'			&& !(map[rcp[2]]&(DIGIT|LETTER))) {				cp = rcp + 2;				return FOR;			}			goto id;		case 'g':			if (rcp[0] == 'o'			&&  rcp[1] == 't'			&&  rcp[2] == 'o'			&& !(map[rcp[3]]&(DIGIT|LETTER))) {				cp = rcp + 3;				return GOTO;			}			goto id;		case 'l':			if (rcp[0] == 'o'			&&  rcp[1] == 'n'			&&  rcp[2] == 'g'			&& !(map[rcp[3]]&(DIGIT|LETTER))) {				cp = rcp + 3;				return LONG;			}			goto id;		case 'r':			if (rcp[0] == 'e'			&&  rcp[1] == 'g'			&&  rcp[2] == 'i'			&&  rcp[3] == 's'			&&  rcp[4] == 't'			&&  rcp[5] == 'e'			&&  rcp[6] == 'r'			&& !(map[rcp[7]]&(DIGIT|LETTER))) {				cp = rcp + 7;				return REGISTER;			}			if (rcp[0] == 'e'			&&  rcp[1] == 't'			&&  rcp[2] == 'u'			&&  rcp[3] == 'r'			&&  rcp[4] == 'n'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return RETURN;			}			goto id;		case 's':			if (rcp[0] == 'h'			&&  rcp[1] == 'o'			&&  rcp[2] == 'r'			&&  rcp[3] == 't'			&& !(map[rcp[4]]&(DIGIT|LETTER))) {				cp = rcp + 4;				return SHORT;			}			if (rcp[0] == 'i'			&&  rcp[1] == 'g'			&&  rcp[2] == 'n'			&&  rcp[3] == 'e'			&&  rcp[4] == 'd'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return SIGNED;			}			if (rcp[0] == 'i'			&&  rcp[1] == 'z'			&&  rcp[2] == 'e'			&&  rcp[3] == 'o'			&&  rcp[4] == 'f'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return SIZEOF;			}			if (rcp[0] == 't'			&&  rcp[1] == 'a'			&&  rcp[2] == 't'			&&  rcp[3] == 'i'			&&  rcp[4] == 'c'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return STATIC;			}			if (rcp[0] == 't'			&&  rcp[1] == 'r'			&&  rcp[2] == 'u'			&&  rcp[3] == 'c'			&&  rcp[4] == 't'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return STRUCT;			}			if (rcp[0] == 'w'			&&  rcp[1] == 'i'			&&  rcp[2] == 't'			&&  rcp[3] == 'c'			&&  rcp[4] == 'h'			&& !(map[rcp[5]]&(DIGIT|LETTER))) {				cp = rcp + 5;				return SWITCH;			}			goto id;		case 't':			if (rcp[0] == 'y'			&&  rcp[1] == 'p'			&&  rcp[2] == 'e'			&&  rcp[3] == 'd'			&&  rcp[4] == 'e'			&&  rcp[5] == 'f'			&& !(map[rcp[6]]&(DIGIT|LETTER))) {				cp = rcp + 6;				return TYPEDEF;			}			goto id;		case 'u':			if (rcp[0] == 'n'			&&  rcp[1] == 'i'			&&  rcp[2] == 'o'			&&  rcp[3] == 'n'			&& !(map[rcp[4]]&(DIGIT|LETTER))) {				cp = rcp + 4;				return UNION;			}			if (rcp[0] == 'n'			&&  rcp[1] == 's'			&&  rcp[2] == 'i'			&&  rcp[3] == 'g'			&&  rcp[4] == 'n'			&&  rcp[5] == 'e'			&&  rcp[6] == 'd'			&& !(map[rcp[7]]&(DIGIT|LETTER))) {				cp = rcp + 7;				return UNSIGNED;			}			goto id;		case 'v':			if (rcp[0] == 'o'			&&  rcp[1] == 'i'			&&  rcp[2] == 'd'			&& !(map[rcp[3]]&(DIGIT|LETTER))) {				cp = rcp + 3;				tsym = voidtype->u.sym;				return VOID;			}			if (rcp[0] == 'o'			&&  rcp[1] == 'l'			&&  rcp[2] == 'a'			&&  rcp[3] == 't'			&&  rcp[4] == 'i'			&&  rcp[5] == 'l'			&&  rcp[6] == 'e'			&& !(map[rcp[7]]&(DIGIT|LETTER))) {				cp = rcp + 7;				return VOLATILE;			}			goto id;		case 'w':			if (rcp[0] == 'h'			&&  rcp[1] == 'i'			&&  rcp[2] == 'l'			&&  rcp[3] == 'e'			&& !(map[rcp[4]]&(DIGIT|LETTER))) {				cp = rcp + 4;				return WHILE;			}			goto id;		case '_':			if (rcp[0] == '_'			&&  rcp[1] == 't'			&&  rcp[2] == 'y'			&&  rcp[3] == 'p'			&&  rcp[4] == 'e'			&&  rcp[5] == 'c'			&&  rcp[6] == 'o'			&&  rcp[7] == 'd'			&&  rcp[8] == 'e'			&& !(map[rcp[9]]&(DIGIT|LETTER))) {				cp = rcp + 9;				return TYPECODE;			}			if (rcp[0] == '_'			&&  rcp[1] == 'f'			&&  rcp[2] == 'i'			&&  rcp[3] == 'r'			&&  rcp[4] == 's'			&&  rcp[5] == 't'			&&  rcp[6] == 'a'			&&  rcp[7] == 'r'			&&  rcp[8] == 'g'			&& !(map[rcp[9]]&(DIGIT|LETTER))) {				cp = rcp + 9;				return FIRSTARG;			}			goto id;		default:			if ((map[cp[-1]]&BLANK) == 0)				if (cp[-1] < ' ' || cp[-1] >= 0177)					error("illegal character `\\0%o'\n", cp[-1]);				else					error("illegal character `%c'\n", cp[-1]);		}	}}static Symbol icon(unsigned long n, int overflow, int base) {	if ((*cp=='u'||*cp=='U') && (cp[1]=='l'||cp[1]=='L')	||  (*cp=='l'||*cp=='L') && (cp[1]=='u'||cp[1]=='U')) {		tval.type = unsignedlong;		cp += 2;	} else if (*cp == 'u' || *cp == 'U') {		if (overflow || n > unsignedtype->u.sym->u.limits.max.i)			tval.type = unsignedlong;		else			tval.type = unsignedtype;		cp += 1;	} else if (*cp == 'l' || *cp == 'L') {		if (overflow || n > longtype->u.sym->u.limits.max.i)			tval.type = unsignedlong;		else			tval.type = longtype;		cp += 1;	} else if (overflow || n > longtype->u.sym->u.limits.max.i)		tval.type = unsignedlong;	else if (n > inttype->u.sym->u.limits.max.i)		tval.type = longtype;	else if (base != 10 && n > inttype->u.sym->u.limits.max.i)		tval.type = unsignedtype;	else		tval.type = inttype;	switch (tval.type->op) {	case INT:		if (overflow || n > tval.type->u.sym->u.limits.max.i) {			warning("overflow in constant `%S'\n", token,				(char*)cp - token);			tval.u.c.v.i = tval.type->u.sym->u.limits.max.i;		} else			tval.u.c.v.i = n;		break;	case UNSIGNED:		if (overflow || n > tval.type->u.sym->u.limits.max.u) {			warning("overflow in constant `%S'\n", token,				(char*)cp - token);			tval.u.c.v.u = tval.type->u.sym->u.limits.max.u;		} else			tval.u.c.v.u = n;		break;	default: assert(0);	}	ppnumber("integer");	return &tval;}static void ppnumber(char *which) {	unsigned char *rcp = cp--;	for ( ; (map[*cp]&(DIGIT|LETTER)) || *cp == '.'; cp++)		if ((cp[0] == 'E' || cp[0] == 'e')		&&  (cp[1] == '-' || cp[1] == '+'))			cp++;	if (cp > rcp)		error("`%S' is a preprocessing number but an invalid %s constant\n", token,			(char*)cp-token, which);}static Symbol fcon(void) {	if (*cp == '.')		do			cp++;		while (map[*cp]&DIGIT);	if (*cp == 'e' || *cp == 'E') {		if (*++cp == '-' || *cp == '+')			cp++;		if (map[*cp]&DIGIT)			do				cp++;			while (map[*cp]&DIGIT);		else			error("invalid floating constant `%S'\n", token,				(char*)cp - token);	}	errno = 0;	tval.u.c.v.d = strtod(token, NULL);	if (errno == ERANGE)		warning("overflow in floating constant `%S'\n", token,			(char*)cp - token);	if (*cp == 'f' || *cp == 'F') {		++cp;		if (tval.u.c.v.d > floattype->u.sym->u.limits.max.d)			warning("overflow in floating constant `%S'\n", token,				(char*)cp - token);		tval.type = floattype;	} else if (*cp == 'l' || *cp == 'L') {		cp++;		tval.type = longdouble;	} else {		if (tval.u.c.v.d > doubletype->u.sym->u.limits.max.d)			warning("overflow in floating constant `%S'\n", token,				(char*)cp - token);		tval.type = doubletype;	}	ppnumber("floating");	return &tval;}static void *cput(int c, void *cl) {	char *s = cl;	if (c < 0 || c > 255)		warning("overflow in escape sequence with resulting value `%d'\n", c);	*s++ = c;	return s;}static void *wcput(int c, void *cl) {	unsigned int *s = cl;	*s++ = c;	return s;}static void *scon(int q, void *put(int c, void *cl), void *cl) {	int n = 0, nbad = 0;	do {		cp++;		while (*cp != q) {			int c;			if (map[*cp]&NEWLINE) {				if (cp < limit)					break;				cp++;				nextline();				if (cp == limit)					break;				continue;			}			c = *cp++;			if (c == '\\') {				if (map[*cp]&NEWLINE) {					if (cp < limit)						break;					cp++;					nextline();				}				if (limit - cp < MAXTOKEN)					fillbuf();				c = backslash(q);			} else if (c < 0 || c > 255 || map[c] == 0)				nbad++;			if (n++ < BUFSIZE)				cl = put(c, cl);		}		if (*cp == q)			cp++;		else			error("missing %c\n", q);	} while (q == '"' && getchr() == '"');	cl = put(0, cl);	if (n >= BUFSIZE)		error("%s literal too long\n", q == '"' ? "string" : "character");	if (Aflag >= 2 && q == '"' && n > 509)		warning("more than 509 characters in a string literal\n");	if (Aflag >= 2 && nbad > 0)		warning("%s literal contains non-portable characters\n",			q == '"' ? "string" : "character");	return cl;}int getchr(void) {	for (;;) {		while (map[*cp]&BLANK)			cp++;		if (!(map[*cp]&NEWLINE))			return *cp;		cp++;		nextline();		if (cp == limit)			return EOI;	}}static int backslash(int q) {	unsigned int c;	switch (*cp++) {	case 'a': return 7;	case 'b': return '\b';	case 'f': return '\f';	case 'n': return '\n';	case 'r': return '\r';	case 't': return '\t';	case 'v': return '\v';	case '\'': case '"': case '\\': case '\?': break;	case 'x': {		int overflow = 0;		if ((map[*cp]&(DIGIT|HEX)) == 0) {			if (*cp < ' ' || *cp == 0177)				error("ill-formed hexadecimal escape sequence\n");			else				error("ill-formed hexadecimal escape sequence `\\x%c'\n", *cp);			if (*cp != q)				cp++;			return 0;		}		for (c = 0; map[*cp]&(DIGIT|HEX); cp++) {			if (c >> (8*widechar->size - 4))				overflow = 1;			if (map[*cp]&DIGIT)				c = (c<<4) + *cp - '0';			else				c = (c<<4) + (*cp&~040) - 'A' + 10;		}		if (overflow)			warning("overflow in hexadecimal escape sequence\n");		return c&ones(8*widechar->size);		}	case '0': case '1': case '2': case '3':	case '4': case '5': case '6': case '7':		c = *(cp-1) - '0';		if (*cp >= '0' && *cp <= '7') {			c = (c<<3) + *cp++ - '0';			if (*cp >= '0' && *cp <= '7')				c = (c<<3) + *cp++ - '0';		}		return c;	default:		if (cp[-1] < ' ' || cp[-1] >= 0177)			warning("unrecognized character escape sequence\n");		else			warning("unrecognized character escape sequence `\\%c'\n", cp[-1]);	}	return cp[-1];}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -