summaryrefslogtreecommitdiffstats
path: root/tdeio/tdeio/lex.l
diff options
context:
space:
mode:
Diffstat (limited to 'tdeio/tdeio/lex.l')
-rw-r--r--tdeio/tdeio/lex.l126
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;
+}