%{ #include "postgres.h" #include "deflex.h" #include "parser.h" /* postgres allocation function */ #define free pfree #define malloc palloc #define realloc repalloc #ifdef strdup #undef strdup #endif #define strdup pstrdup char *token = NULL; /* pointer to token */ char *s = NULL; /* to return WHOLE hyphenated-word */ YY_BUFFER_STATE buf = NULL; /* buffer to parse; it need for parse from string */ int lrlimit = -1; /* for limiting read from filehandle ( -1 - unlimited read ) */ int bytestoread = 0; /* for limiting read from filehandle */ /* redefine macro for read limited length */ #define YY_INPUT(buf,result,max_size) \ if ( yy_current_buffer->yy_is_interactive ) { \ int c = '*', n; \ for ( n = 0; n < max_size && \ (c = getc( tsearch_yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( tsearch_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } else { \ if ( lrlimit == 0 ) \ result=YY_NULL; \ else { \ if ( lrlimit>0 ) { \ bytestoread = ( lrlimit > max_size ) ? max_size : lrlimit; \ lrlimit -= bytestoread; \ } else \ bytestoread = max_size; \ if ( ((result = fread( buf, 1, bytestoread, tsearch_yyin )) == 0) \ && ferror( tsearch_yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ } \ } %} %option 8bit %option never-interactive %option nounput %option noyywrap /* parser's state for parsing hyphenated-word */ %x DELIM /* parser's state for parsing URL*/ %x URL %x SERVER /* parser's state for parsing TAGS */ %x INTAG %x QINTAG %x INCOMMENT %x INSCRIPT /* cyrillic koi8 char */ CYRALNUM [0-9\200-\377] CYRALPHA [\200-\377] ALPHA [a-zA-Z\200-\377] ALNUM [0-9a-zA-Z\200-\377] HOSTNAME ([-_[:alnum:]]+\.)+[[:alpha:]]+ URI [-_[:alnum:]/%,\.;=&?#]+ %% "<"[Ss][Cc][Rr][Ii][Pp][Tt] { BEGIN INSCRIPT; } "" { BEGIN INITIAL; *tsearch_yytext=' '; *(tsearch_yytext+1) = '\0'; token = tsearch_yytext; tokenlen = tsearch_yyleng; return SPACE; } "" { BEGIN INITIAL; *tsearch_yytext=' '; *(tsearch_yytext+1) = '\0'; token = tsearch_yytext; tokenlen = tsearch_yyleng; return SPACE; } "<"[\![:alpha:]] { BEGIN INTAG; } ""\"" { BEGIN QINTAG; } "\\\"" ; "\"" { BEGIN INTAG; } ">" { BEGIN INITIAL; token = tsearch_yytext; *tsearch_yytext=' '; token = tsearch_yytext; tokenlen = 1; return TAG; } .|\n ; \&(quot|amp|nbsp|lt|gt)\; { token = tsearch_yytext; tokenlen = tsearch_yyleng; return HTMLENTITY; } \&\#[0-9][0-9]?[0-9]?\; { token = tsearch_yytext; tokenlen = tsearch_yyleng; return HTMLENTITY; } [-_\.[:alnum:]]+@{HOSTNAME} /* Emails */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return EMAIL; } [+-]?[0-9]+(\.[0-9]+)?[eEdD][+-]?[0-9]+ /* float */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return SCIENTIFIC; } [0-9]+\.[0-9]+\.[0-9\.]*[0-9] { token = tsearch_yytext; tokenlen = tsearch_yyleng; return VERSIONNUMBER; } [+-]?[0-9]+\.[0-9]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return DECIMAL; } [+-][0-9]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return SIGNEDINT; } [0-9]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return UNSIGNEDINT; } http"://" { BEGIN URL; token = tsearch_yytext; tokenlen = tsearch_yyleng; return HTTP; } ftp"://" { BEGIN URL; token = tsearch_yytext; tokenlen = tsearch_yyleng; return HTTP; } {HOSTNAME}[/:]{URI} { BEGIN SERVER; if (s) { free(s); s=NULL; } s = strdup( tsearch_yytext ); tokenlen = tsearch_yyleng; yyless( 0 ); token = s; return FURL; } {HOSTNAME} { token = tsearch_yytext; tokenlen = tsearch_yyleng; return HOST; } [/:]{URI} { token = tsearch_yytext; tokenlen = tsearch_yyleng; return URI; } [[:alnum:]\./_-]+"/"[[:alnum:]\./_-]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return FILEPATH; } ({CYRALPHA}+-)+{CYRALPHA}+ /* composite-word */ { BEGIN DELIM; if (s) { free(s); s=NULL; } s = strdup( tsearch_yytext ); tokenlen = tsearch_yyleng; yyless( 0 ); token = s; return CYRHYPHENWORD; } ([[:alpha:]]+-)+[[:alpha:]]+ /* composite-word */ { BEGIN DELIM; if (s) { free(s); s=NULL; } s = strdup( tsearch_yytext ); tokenlen = tsearch_yyleng; yyless( 0 ); token = s; return LATHYPHENWORD; } ({ALNUM}+-)+{ALNUM}+ /* composite-word */ { BEGIN DELIM; if (s) { free(s); s=NULL; } s = strdup( tsearch_yytext ); tokenlen = tsearch_yyleng; yyless( 0 ); token = s; return HYPHENWORD; } \+?[0-9]+\.[0-9]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return DECIMAL; } {CYRALPHA}+ /* one word in composite-word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return CYRPARTHYPHENWORD; } [[:alpha:]]+ /* one word in composite-word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return LATPARTHYPHENWORD; } {ALNUM}+ /* one word in composite-word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return PARTHYPHENWORD; } - { token = tsearch_yytext; tokenlen = tsearch_yyleng; return SPACE; } .|\n /* return in basic state */ { BEGIN INITIAL; yyless( 0 ); } {CYRALPHA}+ /* normal word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return CYRWORD; } [[:alpha:]]+ /* normal word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return LATWORD; } {ALNUM}+ /* normal word */ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return UWORD; } [ \r\n\t]+ { token = tsearch_yytext; tokenlen = tsearch_yyleng; return SPACE; } . { token = tsearch_yytext; tokenlen = tsearch_yyleng; return SPACE; } %% /* clearing after parsing from string */ void end_parse() { if (s) { free(s); s=NULL; } tsearch_yy_delete_buffer( buf ); buf = NULL; } /* start parse from string */ void start_parse_str(char* str, int limit) { if (buf) end_parse(); buf = tsearch_yy_scan_bytes( str, limit ); tsearch_yy_switch_to_buffer( buf ); BEGIN INITIAL; } /* start parse from filehandle */ void start_parse_fh( FILE* fh, int limit ) { if (buf) end_parse(); lrlimit = ( limit ) ? limit : -1; buf = tsearch_yy_create_buffer( fh, YY_BUF_SIZE ); tsearch_yy_switch_to_buffer( buf ); BEGIN INITIAL; }