diff options
Diffstat (limited to 'tdeio/tdeio/lex.l')
-rw-r--r-- | tdeio/tdeio/lex.l | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/tdeio/tdeio/lex.l b/tdeio/tdeio/lex.l new file mode 100644 index 000000000..073a34965 --- /dev/null +++ b/tdeio/tdeio/lex.l @@ -0,0 +1,126 @@ +%{ +#define yylval kiotraderlval +#define yywrap kiotraderwrap + +#include "yacc.h" +#include <string.h> +#include <stdlib.h> +#define YY_NO_UNPUT + +char* KTraderParse_putSymbol( char *_name ); +char *KTraderParse_putSymbolInBrackets( char *_name ); +char* KTraderParse_putString( char *_name ); +int yywrap(); +int kiotraderlex(void); +void KTraderParse_initFlex( const char *_code ); + +%} + +DIGIT [0-9] + +%% + +"==" { return EQ; } +"!=" { return NEQ; } +"<" { return LE; } +">" { return GR; } +"<=" { return LEQ; } +">=" { return GEQ; } +"not" { return NOT; } +"and" { return AND; } +"or" { return OR; } +"in" { return TOKEN_IN; } +"exist" { return EXIST; } +"max" { return MAX; } +"min" { return MIN; } + +"~"|"/"|"+"|"-"|"="|"*"|"("|")"|"," { yylval.name = 0L; return (int)(*yytext); } + +"TRUE" { yylval.valb = 1; return VAL_BOOL; } +"FALSE" { yylval.valb = 0; return VAL_BOOL; } + +"'"[^']*"'" { yylval.name = KTraderParse_putString( yytext ); return VAL_STRING; } + +"-"{DIGIT}+ { yylval.vali = atoi( yytext ); return VAL_NUM; } +{DIGIT}+ { yylval.vali = atoi( yytext ); return VAL_NUM; } + +{DIGIT}*"\."{DIGIT}+ { yylval.vald = atof( yytext ); return VAL_FLOAT; } + +\[[a-zA-Z][a-zA-Z0-9\-]*\] { yylval.name = KTraderParse_putSymbolInBrackets( yytext ); return VAL_ID; } + +[a-zA-Z][a-zA-Z0-9]* { yylval.name = KTraderParse_putSymbol( yytext ); return VAL_ID; } + +[ \t\n]+ /* eat up whitespace */ + +. { printf( "Unrecognized character: %s\n", yytext ); } + +%% + +char* KTraderParse_putSymbolInBrackets( char *_name ) +{ + int l = strlen( _name )-1; + char *p = (char *)malloc( l ); + if (p != NULL) + { + strncpy( p, _name+1, l-1 ); + p[l-1] = 0; + } + + return p; +} + +char *KTraderParse_putSymbol( char *_name ) +{ + char *p = (char*)malloc( strlen( _name ) + 1 ); + if (p != NULL) + { + strcpy( p, _name ); + } + return p; +} + +char* KTraderParse_putString( char *_str ) +{ + int l = strlen( _str ); + char *p = (char*)malloc( l ); + char *s = _str + 1; + char *d = p; + + if (p == NULL) + return NULL; + + while ( s != _str + l - 1 ) + { + if ( *s != '\\' ) + *d++ = *s++; + else + { + s++; + if ( s != _str + l - 1 ) + { + if ( *s == '\\' ) + *d++ = '\\'; + else if ( *s == 'n' ) + *d++ = '\n'; + else if ( *s == 'r' ) + *d++ = '\r'; + else if ( *s == 't' ) + *d++ = '\t'; + s++; + } + } + } + *d = 0; + return p; +} + +void KTraderParse_initFlex( const char *_code ) +{ + yy_switch_to_buffer( yy_scan_string( _code ) ); +} + +int yywrap() +{ + yy_delete_buffer( YY_CURRENT_BUFFER ); + return 1; +} |