📄 lexer.c
字号:
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 + -