1 %{ 2 #include "predicate_parser.h" 3 #include "predicateparse.h" 4 #include <string.h> 5 #include <stdlib.h> 6 #define YY_NO_UNPUT 7 8 int Solidwrap( yyscan_t _scanner ); 9 void PredicateParse_initLexer( const char *_code, yyscan_t _scanner ); 10 char *PredicateParse_putSymbol( char *_name ); 11 char *PredicateParse_putString( char *_str ); 12 void PredicateParse_initFlex( const char *_code, yyscan_t _scanner ); 13 14 %} 15 16 %option nomain 17 %option never-interactive 18 %option noalways-interactive 19 %option nostack 20 %option reentrant 21 %option bison-bridge 22 %option noinput nounput 23 24 DIGIT [0-9] 25 26 %% 27 28 "==" { return EQ; } 29 "&" { return MASK; } 30 31 [aA][nN][dD] { return AND; } 32 [oO][rR] { return OR; } 33 [iI][sS] { return IS; } 34 35 [tT][rR][uU][eE] { yylval->valb = 1; return VAL_BOOL; } 36 [fF][aA][lL][sS][eE] { yylval->valb = 0; return VAL_BOOL; } 37 38 "'"[^']*"'" { yylval->name = PredicateParse_putString( yytext ); return VAL_STRING; } 39 40 "-"{DIGIT}+ { yylval->vali = atoi( yytext ); return VAL_NUM; } 41 {DIGIT}+ { yylval->vali = atoi( yytext ); return VAL_NUM; } 42 43 {DIGIT}*"\."{DIGIT}+ { yylval->vald = atof( yytext ); return VAL_FLOAT; } 44 45 [a-zA-Z][a-zA-Z0-9\-]* { yylval->name = PredicateParse_putSymbol( yytext ); return VAL_ID; } 46 47 "{"|"}"|"["|"]"|","|"\." { yylval->name = 0; return (int)(*yytext); } 48 49 [ \t\n]+ /* eat up whitespace */ 50 51 . { PredicateLexer_unknownToken(yytext); } 52 53 %% 54 55 char *PredicateParse_putSymbol( char *_name ) 56 { 57 char *p = (char*)malloc( strlen( _name ) + 1 ); 58 if (p != NULL) 59 { 60 strcpy( p, _name ); 61 } 62 return p; 63 } 64 65 char *PredicateParse_putString( char *_str ) 66 { 67 int l = strlen( _str ); 68 char *p = (char*)malloc( l ); 69 char *s = _str + 1; 70 char *d = p; 71 72 if (p == NULL) 73 return NULL; 74 75 while ( s != _str + l - 1 ) 76 { 77 if ( *s != '\\' ) 78 *d++ = *s++; 79 else 80 { 81 s++; 82 if ( s != _str + l - 1 ) 83 { 84 if ( *s == '\\' ) 85 *d++ = '\\'; 86 else if ( *s == 'n' ) 87 *d++ = '\n'; 88 else if ( *s == 'r' ) 89 *d++ = '\r'; 90 else if ( *s == 't' ) 91 *d++ = '\t'; 92 s++; 93 } 94 } 95 } 96 *d = 0; 97 return p; 98 } 99 100 void PredicateParse_initLexer( const char *_code, yyscan_t _scanner ) 101 { 102 Solid_switch_to_buffer( Solid_scan_string( _code, _scanner ), _scanner ); 103 } 104 105 int Solidwrap( yyscan_t _scanner ) 106 { 107 struct yyguts_t *yyg = (struct yyguts_t*)_scanner; 108 Solid_delete_buffer( YY_CURRENT_BUFFER, _scanner ); 109 return 1; 110 } 111 112