1SIGN [+-] 2DIGIT [0-9] 3ALPHA [a-zA-Z_] 4ALPHADIGIT [a-zA-Z_0-9] 5STRINGCHAR [^"\\] 6WORDCHAR [^'\\] 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 36static size_t lex_buffer_length = 0; 37static const char *lex_buffer = NULL; 38static size_t lex_string_ptr = 0; 39static int lex_read_from_string = 0; 40 41static 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 113static 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 120static int lex_input() { 121 return input(); 122} 123 124# undef input 125# define input() my_input() 126static 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 */ 144void 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 157void 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 171static 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 188void wxExprCleanUp() 189{ 190#ifdef FLEX_SCANNER 191 if (yy_current_buffer) 192 yy_delete_buffer(yy_current_buffer); 193#endif 194} 195