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