1 SIGN [+-] 2 DIGIT [0-9] 3 ALPHA [a-zA-Z_] 4 ALPHADIGIT [a-zA-Z_0-9] 5 STRINGCHAR [^"\\] 6 WORDCHAR [^'\\] 7 8 %{ 9 /* 10 * File: lexer.l 11 * Description: Lexical analyser for PROLOGIO; can be used with 12 * either lex and flex. 13 * Copyright: (c) Julian Smart 14 * Licence: wxWindows Licence 15 */ 16 #include <string.h> 17 #include <unistd.h> 18 19 /* +++steve162e: added, otherwise, PROIO_input will be undefined (at least under LINUX) 20 please check, if this is also TRUE under other UNIXes. 21 */ 22 23 #if defined(FLEX_SCANNER) && defined(_LINUX) 24 #define PROIO_input my_input 25 #endif 26 /* ---steve162e */ 27 28 #include "wx/deprecated/expr.h" 29 30 #define Return(x) return x; 31 32 #if defined(VMS) && !defined(strdup) 33 #define strdup(s) (strcpy((char *)malloc(strlen(s)+1), s)); 34 #endif 35 36 static size_t lex_buffer_length = 0; 37 static const char *lex_buffer = NULL; 38 static size_t lex_string_ptr = 0; 39 static int lex_read_from_string = 0; 40 41 static int my_input(void); 42 43 #ifdef FLEX_SCANNER 44 # undef YY_INPUT 45 # define YY_INPUT(buf,result,max_size) \ 46 if (lex_read_from_string) \ 47 { int c = my_input(); result = (c == 0) ? YY_NULL : ((buf)[0]=(c), 1); } \ 48 else \ 49 if ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ 50 YY_FATAL_ERROR( "read() in flex scanner failed" ); 51 #else 52 # undef unput 53 # define unput(_c) my_unput(_c) 54 static int my_unput(char); 55 #endif 56 57 %} 58 59 %% 60 61 {SIGN}?{DIGIT}+ {yylval.s = strdup(yytext); Return(INTEGER);} 62 63 "e" Return(EXP); 64 65 {ALPHA}{ALPHADIGIT}* {yylval.s = strdup(yytext); Return(WORD);} 66 67 "'"{WORDCHAR}*"'" {int len = strlen(yytext); 68 yytext[len-1] = 0; 69 yylval.s = strdup(yytext+1); 70 Return(WORD);} 71 72 \"({STRINGCHAR}|\\\"|\|\\\\|\\)*\" {yylval.s = strdup(yytext); Return(STRING);} 73 74 "(" Return(OPEN); 75 76 ")" Return(CLOSE); 77 78 "," Return(COMMA); 79 80 "[" Return(OPEN_SQUARE); 81 82 "]" Return(CLOSE_SQUARE); 83 84 "=" Return(EQUALS); 85 86 "." Return(PERIOD); 87 88 [ \t] ; 89 90 \n ; 91 92 "/*" { loop: 93 #ifdef __cplusplus 94 while (yyinput() != '*'); 95 switch (yyinput()) 96 #else 97 while (input() != '*'); 98 switch (input()) 99 #endif 100 { 101 case '/': break; 102 case '*': unput('*'); 103 default: goto loop; 104 } 105 } 106 107 . Return(ERROR); 108 109 %% 110 111 112 #ifdef FLEX_SCANNER 113 static int lex_input() { 114 return input(); 115 } 116 #else /* BSD/AT&T lex */ 117 #ifndef input 118 # error "Sorry, but need either flex or AT&T lex" 119 #endif 120 static int lex_input() { 121 return input(); 122 } 123 124 # undef input 125 # define input() my_input() 126 static int my_unput(char c) 127 { 128 if (lex_read_from_string != 0) { 129 /* Make sure we have something */ 130 if (lex_string_ptr) { 131 if (c == '\n') yylineno--; 132 lex_string_ptr--; 133 } 134 } else { 135 yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar; 136 /* unput(c); Causes infinite recursion! */ 137 } 138 return c; 139 } 140 141 #endif 142 143 /* Public */ 144 void LexFromFile(FILE *fd) 145 { 146 lex_read_from_string = 0; 147 yyin = fd; 148 /* Don't know why this is necessary, but otherwise 149 * lex only works _once_! 150 */ 151 #ifdef FLEX_SCANNER 152 yyrestart(fd); 153 yy_init = 1; 154 #endif 155 } 156 157 void LexFromString(char *buffer) 158 { 159 lex_read_from_string = 1; 160 lex_buffer = buffer; 161 lex_buffer_length = strlen(buffer); 162 lex_string_ptr = 0; 163 /* Don't know why this is necessary, but otherwise 164 * lex only works _once_! 165 */ 166 #ifdef FLEX_SCANNER 167 yy_init = 1; 168 #endif 169 } 170 171 static int my_input( void ) 172 { 173 if (lex_read_from_string) { 174 if (lex_string_ptr == lex_buffer_length) 175 return 0; 176 else { 177 char c = lex_buffer[lex_string_ptr++]; 178 #ifndef FLEX_SCANNER 179 if (c == '\n') yylineno++; 180 #endif 181 return c; 182 } 183 } else { 184 return lex_input(); 185 } 186 } 187 188 void wxExprCleanUp() 189 { 190 #ifdef FLEX_SCANNER 191 if (yy_current_buffer) 192 yy_delete_buffer(yy_current_buffer); 193 #endif 194 } 195