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