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

📄 lex.c

📁 window下的c编译器。
💻 C
📖 第 1 页 / 共 3 页
字号:
					return (t);
				}
				else if (rcp[1] == 'd' &&
					rcp[2] == 'e' &&
					rcp[3] == 'c' &&
					rcp[4] == 'l' &&
					rcp[5] == 's' &&
					rcp[6] == 'p' &&
					rcp[7] == 'e' &&
					rcp[8] == 'c' &&
					!(map[rcp[9]] & (DIGIT | LETTER))) {
					cp = rcp + 9;
					return doDeclSpec();
				}
				else if (rcp[1] == 'f' &&
					rcp[2] == 'u' &&
					rcp[3] == 'n' &&
					rcp[4] == 'c' &&
					rcp[5] == '_' &&
					rcp[6] == '_' &&
					!(map[rcp[7]] & (DIGIT | LETTER))) {
					char *pfunc;
						if (cfunc == NULL || cfunc->name == NULL) {
							warning(StrTab[437]); //<__func__ is valid only within function scope\n>
							pfunc = "<none>";
						}
						else pfunc = cfunc->name;
						tval.type = array(chartype, 1+strlen(pfunc), 0);
						tval.u.c.v.p = pfunc;
						cp = rcp + 7;
						token = pfunc;
						tsym = &tval;
						return SCON;
				}

			}
			goto id;
		case 'h':
		case 'j':
		case 'k':
		case 'm':
		case 'n':
		case 'o':
		case 'p':
		case 'q':
		case 'x':
		case 'y':
		case 'z':
		case 'A':
		case 'B':
		case 'C':
		case 'D':
		case 'E':
		case 'F':
		case 'G':
		case 'H':
		case 'I':
		case 'J':
		case 'K':
		case 'M':
		case 'N':
		case 'O':
		case 'P':
		case 'Q':
		case 'R':
		case 'S':
		case 'T':
		case 'U':
		case 'V':
		case 'W':
		case 'X':
		case 'Y':
		case 'Z':
id:
			if (limit - rcp < MAXLINE) {
				cp = rcp - 1;
				fillbuf();
				rcp = ++cp;
			}
			assert(cp == rcp);
			token = (char *) rcp - 1;
			while (map[*rcp] & (DIGIT | LETTER))
				rcp++;
			token = stringn(token, (char *) rcp - token);
			tsym = lookup(token, identifiers);
			cp = rcp;
			return ID;
		case '0':
		case '1':
		case '2':
		case '3':
		case '4':
		case '5':
		case '6':
		case '7':
		case '8':
		case '9':
			{
				unsigned int n = 0;
				if (limit - rcp < MAXLINE) {
					cp = rcp - 1;
					fillbuf();
					rcp = ++cp;
				}
				assert(cp == rcp);
				token = (char *) rcp - 1;
				if (*token == '0' && (*rcp == 'x' || *rcp == 'X')) {
					int d, overflow = 0;
					while (*++rcp) {
						if (map[*rcp] & DIGIT)
							d = *rcp - '0';
						else if (*rcp >= 'a' && *rcp <= 'f')
							d = *rcp - 'a' + 10;
						else if (*rcp >= 'A' && *rcp <= 'F')
							d = *rcp - 'A' + 10;
						else
							break;
						if (n & ~((unsigned) -1 >> 4))
							overflow = 1;
						else
							n = (n << 4) + d;
					}
					if ((char *) rcp - token <= 2)
						error(StrTab[176], token, (char *) rcp - token);    // <invalid hexadecimal constant `%S'\n>
					cp = rcp;
					tsym = icon(n, overflow, 16);
				}
				else if (*token == '0') {
					int err = 0, overflow = 0;
					for (; map[*rcp] & DIGIT; rcp++) {
						if (*rcp == '8' || *rcp == '9')
							err = 1;
						if (n & ~((unsigned) -1 >> 3))
							overflow = 1;
						else
							n = (n << 3) + (unsigned) (*rcp - '0');
					}
					if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') {
						cp = rcp;
						tsym = fcon();
						return FCON;
					}
					cp = rcp;
					tsym = icon(n, overflow, 8);
					if (err)
						error(StrTab[177], token, (char *) cp - token); // <invalid octal constant `%S'\n>
				}
				else {
					int overflow = 0;
					for (n = *token - '0'; map[*rcp] & DIGIT;) {
						int d = *rcp++ - '0';
						if (n > ((unsigned) UINT_MAX - d) / 10)
							overflow = 1;
						else
							n = 10 * n + d;
					}
					if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') {
						cp = rcp;
						tsym = fcon();
						return FCON;
					}
					cp = rcp;
					tsym = icon(n, overflow, 10);
				}
				return ICON;
			}
		case '.':
			if (rcp[0] == '.' && rcp[1] == '.') {
				cp += 2;
				return ELLIPSIS;
			}
			if ((map[*rcp] & DIGIT) == 0)
				return '.';
			if (limit - rcp < MAXLINE) {
				cp = rcp - 1;
				fillbuf();
				rcp = ++cp;
			}
			assert(cp == rcp);
			cp = rcp - 1;
			token = (char *) cp;
			tsym = fcon();
			return FCON;
		case '\'':
		case '"':
			return readString(0);
		case 'a':
			if (rcp[0] == 'u'
					&& rcp[1] == 't'
					&& rcp[2] == 'o'
					&& !(map[rcp[3]] & (DIGIT | LETTER))) {
				cp = rcp + 3;
				return AUTO;
			}
			goto id;
		case 'b':
			if (rcp[0] == 'r'
					&& rcp[1] == 'e'
					&& rcp[2] == 'a'
					&& rcp[3] == 'k'
					&& !(map[rcp[4]] & (DIGIT | LETTER))) {
				cp = rcp + 4;
				return BREAK;
			}
			goto id;
		case 'c':
			if (rcp[0] == 'a'
					&& rcp[1] == 's'
					&& rcp[2] == 'e'
					&& !(map[rcp[3]] & (DIGIT | LETTER))) {
				cp = rcp + 3;
				return CASE;
			}
			if (rcp[0] == 'h'
					&& rcp[1] == 'a'
					&& rcp[2] == 'r'
					&& !(map[rcp[3]] & (DIGIT | LETTER))) {
				cp = rcp + 3;
				tsym = chartype->u.sym;
				return CHAR;
			}
			if (rcp[0] == 'o'
					&& rcp[1] == 'n'
					&& rcp[2] == 's'
					&& rcp[3] == 't'
					&& !(map[rcp[4]] & (DIGIT | LETTER))) {
				cp = rcp + 4;
				return CONST;
			}
			if (rcp[0] == 'o'
					&& rcp[1] == 'n'
					&& rcp[2] == 't'
					&& rcp[3] == 'i'
					&& rcp[4] == 'n'
					&& rcp[5] == 'u'
					&& rcp[6] == 'e'
					&& !(map[rcp[7]] & (DIGIT | LETTER))) {
				cp = rcp + 7;
				return CONTINUE;
			}
			goto id;
		case 'd':
			if (rcp[0] == 'e'
					&& rcp[1] == 'f'
					&& rcp[2] == 'a'
					&& rcp[3] == 'u'
					&& rcp[4] == 'l'
					&& rcp[5] == 't'
					&& !(map[rcp[6]] & (DIGIT | LETTER))) {
				cp = rcp + 6;
				return DEFAULT;
			}
			if (rcp[0] == 'o'
					&& rcp[1] == 'u'
					&& rcp[2] == 'b'
					&& rcp[3] == 'l'
					&& rcp[4] == 'e'
					&& !(map[rcp[5]] & (DIGIT | LETTER))) {
				cp = rcp + 5;
				tsym = doubletype->u.sym;
				return DOUBLE;
			}
			if (rcp[0] == 'o'
					&& !(map[rcp[1]] & (DIGIT | LETTER))) {
				cp = rcp + 1;
				return DO;
			}
			goto id;
		case 'e':
			if (rcp[0] == 'l'
					&& rcp[1] == 's'
					&& rcp[2] == 'e'
					&& !(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;
				while (*cp && (map[*cp] & BLANK))
					cp++;
				if (*cp == 'l' && cp[1] == 'o' && cp[2] == 'n' &&
						cp[3] == 'g' && !(map[cp[4]] & (DIGIT | LETTER))) {
					cp += 4;
					tsym = longlongtype->u.sym;
					return LONGLONG;
				}
				cp = rcp + 3;
				tsym = longtype->u.sym;
				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;
				tsym = shorttype->u.sym;
				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;
		default:
			if ((map[cp[-1]] & BLANK) == 0)
				if (cp[-1] < ' ' || cp[-1] >= 0177)
					error(StrTab[188], cp[-1]); // <illegal character `\\0%o'\n>
				else
					error(StrTab[189], cp[-1]); // <illegal character `%c'\n>
		}
	}
}
static Symbol icon(unsigned 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') {
		tval.type = unsignedtype;
		cp += 1;
	}
	else if (*cp == 'l' || *cp == 'L') {
		if (n > (unsigned) LONG_MAX)
			tval.type = unsignedlong;
		else
			tval.type = longtype;

⌨️ 快捷键说明

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