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

📄 lexer.c

📁 uClinux下用的数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
	REG	u_char	c;	REG	u_char	t;	int	tokval;	static	u_char dummyBuf[2];	static	char EOI[] = "*end of input*";	/*	** Handle the end of input.  We return an EOI token when we hit	** the end and then return a 0 on the next call to yylex.  This	** allows the parser to do the right thing with trailing garbage	** in the expression.	*/	if (yyprev)		free(yyprev);	yyprev = yyrep;	if (state == 1000)	{		yyprev = NULL;		return(0);	}	state = 0;	/*	** Dive into the state machine	*/	while(1)	{		switch(state)		{			/* State 0 : Start of token */			CASE(0)				tokPtr = tokStart;				yytext = NULL;				yytoklen = 0;				c = yyGet();				while (iswhite(c))				{					if (c == '\n')						yylineno++;					c = yySkip();					yytoklen = 1;				}				if (c == '\'')				{					state = 12;					break;				}				if (c == '_')				{					state = 18;					break;				}				if (isalpha(c))				{					state = 1;					break;				}				if (isdigit(c))				{					state = 5;					break;				}				if (c == '.')				{					t = yyGet();					if ( isdigit(t) ) 					{						yyUnget();						state = 7;						break;					} 					else						yyUnget();				}				if (c == '-' || c == '+')				{					state = 9;					break;				}				if (iscompop(c))				{					state = 10;					break;				}				if (c == '#')				{					state = 14;					break;				}				if (c == 0)				{					state = 1000;					break;				}				state = 999;				break;			/* State 1 : Incomplete keyword or ident */			CASE(1)				c = yyGet();				if (isalpha(c) || isdigit(c))				{					state = 1;					break;				}				if (c == '_')				{					state = 3;					break;				}				state = 2;				break;			/* State 2 : Complete keyword or ident */			CASE(2)				yyUnget();				tokval = _findKeyword(tokStart,yytoklen);				if (tokval)				{					yyReturn(tokval);				}				else				{					yytext = memMallocToken(tokStart,						yytoklen);					yylval = (YYSTYPE) yytext;					yyReturn(token(IDENT));				}				break;			/* State 3 : Incomplete ident */			CASE(3)				c = yyGet();				if (isalnum(c) || c == '_')				{					state = 3;					break;				}				state = 4;				break;			/* State 4: Complete ident */			CASE(4)				yyUnget();				yytext = memMallocToken(tokStart,yytoklen);				yylval = (YYSTYPE) yytext;				yyReturn(token(IDENT));			/* State 5: Incomplete real or int number */			CASE(5)				c = yyGet();				if (isdigit(c))				{					state = 5;					break;				}				if (c == '.')				{					state = 7;					break;				}				state = 6;				break;			/* State 6: Complete integer number */			CASE(6)				yyUnget();				yytext = memMallocToken(tokStart,yytoklen);				yylval = (YYSTYPE) yytext;				yyReturn(token(NUM));				break;			/* State 7: Incomplete real number */			CASE(7)				c = yyGet();		                /* Analogy Start */                                if(c == 'e' || c == 'E')                                {                                        state = 15;                                        break;                                }                		/* Analogy End   */ 				if (isdigit(c))				{					state = 7;					break;				}				state = 8;				break;			/* State 8: Complete real number */			CASE(8)				yyUnget();				yytext = memMallocToken(tokStart,yytoklen);				yylval = (YYSTYPE) yytext;				yyReturn(token(REAL_NUM));			/* State 9: Incomplete signed number */			CASE(9)				c = yyGet();				if (isdigit(c))				{					state = 5;					break;				}				if (c == '.')				{					state = 7;					break;				}				state = 999;				break;			/* State 10: Incomplete comparison operator */			CASE(10)				c = yyGet();				if (iscompop(c))				{					state = 10;					break;				}				state = 11;				break;			/* State 11: Complete comparison operator */			CASE(11)				yyUnget();				tokval = _findKeyword(tokStart,yytoklen);				if (tokval)				{					yyReturn(tokval);				}				state = 999;				break;				/* State 12: Incomplete text string */			CASE(12)				yytext = _readTextLiteral(tokStart);				yylval = (YYSTYPE) yytext;				if (yytext)				{					state = 13;					break;				}				state = 999;				break;			/* State 13: Complete text string */			CASE(13)				yyReturn(token(MSQL_TEXT));				break;			/* State 14: Comment */			CASE(14)				c = yySkip();				if (c == '\n')				{					state = 0;				}				else				{					state = 14;				}				break;			/* Analogy Start */                        /* State 15: Exponent Sign in Scientific Notation */                        CASE(15)                                c = yyGet();                                if(c == '-' || c == '+')                                {                                      state = 16;                                      break;                                }                                state = 999;                                break;                        /* State 16: Exponent Value-first digit in Scientific 			** Notation */                        CASE(16)                                c = yyGet();                                if (isdigit(c))                                {                                        state = 17;                                        break;                                }                                state = 999;  	/* if no digit, then token 						** is unknown */                                break;                        /* State 17: Exponent Value in Scientific Notation */                        CASE(17)                                c = yyGet();                                if (isdigit(c))                                {                                        state = 17;                                        break;                                }                                state = 8;     	/* At least 1 exponent 						** digit was required */                                break;			/* Analogy End */			/* State 18 : Incomplete System Variable */			CASE(18)				c = yyGet();				if (isalnum(c) || c == '_')				{					state = 18;					break;				}				state = 19;				break;			/* State 19: Complete Sys Var */			CASE(19)				yyUnget();				yytext = memMallocToken(tokStart,yytoklen);				yylval = (YYSTYPE) yytext;				yyReturn(token(SYS_VAR));							/* State 999 : Unknown token.  Revert to single char */			CASE(999)				yyRevert();				c = yyGet();				*dummyBuf = c;				*(dummyBuf+1) = 0;				yytext = dummyBuf;				yylval = (YYSTYPE) yytext;				yyReturn(token(yytext[0]));			/* State 1000 : End Of Input */			CASE(1000)				yytext = EOI;				yylval = (YYSTYPE) EOI;				yyReturn(token(END_OF_INPUT));		}	}}void yyerror(msg)	char	*msg;{	static char	buf[160];	extern	mQuery_t *curQuery;	if (yytext && yylineno)	{		snprintf(buf, 160, "%s. Line %d near '%s'",			msg, yylineno, yytext);		netError(curQuery->clientSock, buf);	}	else	{		netError(curQuery->clientSock, msg);	}}#ifdef DEBUG#undef malloc#undef freechar *Malloc(size,file,line)	int	size;	char	*file;	int	line;{	return((char *)malloc(size));}void Free(ptr,file,line)	char	*ptr;	char	*file;	int	line;{	free(ptr);}void netError(sock, msg)	int	sock;	char	*msg;{	printf("%s\n",msg);}main(){	char	*p,		tmpBuf[10 * 1024];	bzero(tmpBuf,sizeof(tmpBuf));	read(fileno(stdin),tmpBuf,sizeof(tmpBuf));	yyInitScanner(tmpBuf);	while(p = (char *) yylex())	{		/*		** printf("%-15.15s of length %u is \"%s\"\n", p, yytoklen,		**	yytext?yytext:(u_char *)"(null)");		*/		printf("%-5d of length %u is \"%s\"\n", p, yytoklen,			yytext?yytext:(u_char *)"(null)");	}}#endif

⌨️ 快捷键说明

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