aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-05-30 11:04:07 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-05-30 11:04:07 -0300
commit5cddb264d430d7c9b4defd63d823d98bf002f4d1 (patch)
treeb65e01e319cab62822f2ebdc48fb96c90b724813
parent9863223fbf512d903a1677c861e4beb4f8feda4d (diff)
downloadlua-5cddb264d430d7c9b4defd63d823d98bf002f4d1.tar.gz
lua-5cddb264d430d7c9b4defd63d823d98bf002f4d1.tar.bz2
lua-5cddb264d430d7c9b4defd63d823d98bf002f4d1.zip
lexical analiser may use luaI_buffer, instead of waste space with
a separate buffer.
-rw-r--r--lex.c143
1 files changed, 69 insertions, 74 deletions
diff --git a/lex.c b/lex.c
index 7c496f9a..cbb7b082 100644
--- a/lex.c
+++ b/lex.c
@@ -1,5 +1,5 @@
1char *rcs_lex = "$Id: lex.c,v 2.32 1996/03/21 16:33:47 roberto Exp roberto $"; 1char *rcs_lex = "$Id: lex.c,v 2.33 1996/05/28 21:07:32 roberto Exp roberto $";
2 2
3 3
4#include <ctype.h> 4#include <ctype.h>
5#include <string.h> 5#include <string.h>
@@ -14,32 +14,24 @@ char *rcs_lex = "$Id: lex.c,v 2.32 1996/03/21 16:33:47 roberto Exp roberto $";
14 14
15#define MINBUFF 260 15#define MINBUFF 260
16 16
17#define next() { current = input(); } 17#define next() (current = input())
18#define save(x) { *yytextLast++ = (x); } 18#define save(x) (yytext[tokensize++] = (x))
19#define save_and_next() { save(current); next(); } 19#define save_and_next() (save(current), next())
20
20 21
21static int current; 22static int current; /* look ahead character */
22static char *yytext = NULL; 23static Input input; /* input function */
23static int textsize = 0;
24static char *yytextLast;
25 24
26static Input input;
27 25
28void lua_setinput (Input fn) 26void lua_setinput (Input fn)
29{ 27{
30 current = ' '; 28 current = ' ';
31 input = fn; 29 input = fn;
32 if (yytext == NULL)
33 {
34 textsize = MINBUFF;
35 yytext = newvector(textsize, char);
36 }
37} 30}
38 31
39char *lua_lasttext (void) 32char *lua_lasttext (void)
40{ 33{
41 *yytextLast = 0; 34 return luaI_buffer(1);
42 return yytext;
43} 35}
44 36
45 37
@@ -80,70 +72,69 @@ void luaI_addReserved (void)
80} 72}
81 73
82 74
83static void growtext (void) 75static int read_long_string (char *yytext, int buffsize)
84{
85 int size = yytextLast - yytext;
86 textsize = growvector(&yytext, textsize, char, lexEM, MAX_WORD);
87 yytextLast = yytext + size;
88}
89
90
91static int read_long_string (void)
92{ 76{
93 int cont = 0; 77 int cont = 0;
94 int spaceleft = textsize - (yytextLast - yytext); 78 int tokensize = 2; /* '[[' already stored */
95 while (1) 79 while (1)
96 { 80 {
97 if (spaceleft <= 2) /* may read more than 1 char in one cicle */ 81 if (buffsize-tokensize <= 2) /* may read more than 1 char in one cicle */
98 { 82 yytext = luaI_buffer(buffsize *= 2);
99 growtext();
100 spaceleft = textsize - (yytextLast - yytext);
101 }
102 switch (current) 83 switch (current)
103 { 84 {
104 case EOF: 85 case EOF:
105 case 0: 86 case 0:
87 save(0);
106 return WRONGTOKEN; 88 return WRONGTOKEN;
107 case '[': 89 case '[':
108 save_and_next(); spaceleft--; 90 save_and_next();
109 if (current == '[') 91 if (current == '[')
110 { 92 {
111 cont++; 93 cont++;
112 save_and_next(); spaceleft--; 94 save_and_next();
113 } 95 }
114 continue; 96 continue;
115 case ']': 97 case ']':
116 save_and_next(); spaceleft--; 98 save_and_next();
117 if (current == ']') 99 if (current == ']')
118 { 100 {
119 if (cont == 0) return STRING; 101 if (cont == 0) goto endloop;
120 cont--; 102 cont--;
121 save_and_next(); spaceleft--; 103 save_and_next();
122 } 104 }
123 continue; 105 continue;
124 case '\n': 106 case '\n':
125 lua_linenumber++; /* goes through */ 107 lua_linenumber++; /* goes through */
126 default: 108 default:
127 save_and_next(); spaceleft--; 109 save_and_next();
128 } 110 }
129 } 111 } endloop:
112 save_and_next(); /* pass the second ']' */
113 yytext[tokensize-2] = 0; /* erases ']]' */
114 luaY_lval.vWord = luaI_findconstantbyname(yytext+2);
115 yytext[tokensize-2] = ']'; /* restores ']]' */
116 save(0);
117 return STRING;
130} 118}
131 119
132
133int luaY_lex (void) 120int luaY_lex (void)
134{ 121{
135 double a;
136 static int linelasttoken = 0; 122 static int linelasttoken = 0;
123 double a;
124 int buffsize = MINBUFF;
125 char *yytext = luaI_buffer(buffsize);
126 yytext[1] = yytext[2] = yytext[3] = 0;
137 if (lua_debug) 127 if (lua_debug)
138 luaI_codedebugline(linelasttoken); 128 luaI_codedebugline(linelasttoken);
139 linelasttoken = lua_linenumber; 129 linelasttoken = lua_linenumber;
140 while (1) 130 while (1)
141 { 131 {
142 yytextLast = yytext; 132 int tokensize = 0;
143 switch (current) 133 switch (current)
144 { 134 {
145 case EOF: 135 case EOF:
146 case 0: 136 case 0:
137 save(0);
147 return 0; 138 return 0;
148 case '\n': linelasttoken = ++lua_linenumber; 139 case '\n': linelasttoken = ++lua_linenumber;
149 case ' ': 140 case ' ':
@@ -153,16 +144,16 @@ int luaY_lex (void)
153 continue; 144 continue;
154 145
155 case '$': 146 case '$':
156 next(); 147 save_and_next();
157 while (isalnum(current) || current == '_') 148 while (isalnum(current) || current == '_')
158 save_and_next(); 149 save_and_next();
159 *yytextLast = 0; 150 save(0);
160 if (strcmp(yytext, "debug") == 0) 151 if (strcmp(yytext+1, "debug") == 0)
161 { 152 {
162 luaY_lval.vInt = 1; 153 luaY_lval.vInt = 1;
163 return DEBUG; 154 return DEBUG;
164 } 155 }
165 else if (strcmp(yytext, "nodebug") == 0) 156 else if (strcmp(yytext+1, "nodebug") == 0)
166 { 157 {
167 luaY_lval.vInt = 0; 158 luaY_lval.vInt = 0;
168 return DEBUG; 159 return DEBUG;
@@ -181,12 +172,7 @@ int luaY_lex (void)
181 else 172 else
182 { 173 {
183 save_and_next(); /* pass the second '[' */ 174 save_and_next(); /* pass the second '[' */
184 if (read_long_string() == WRONGTOKEN) 175 return read_long_string(yytext, buffsize);
185 return WRONGTOKEN;
186 save_and_next(); /* pass the second ']' */
187 *(yytextLast-2) = 0; /* erases ']]' */
188 luaY_lval.vWord = luaI_findconstantbyname(yytext+2);
189 return STRING;
190 } 176 }
191 177
192 case '=': 178 case '=':
@@ -213,21 +199,17 @@ int luaY_lex (void)
213 case '\'': 199 case '\'':
214 { 200 {
215 int del = current; 201 int del = current;
216 int spaceleft = textsize - (yytextLast - yytext); 202 save_and_next();
217 next(); /* skip the delimiter */
218 while (current != del) 203 while (current != del)
219 { 204 {
220 if (spaceleft <= 2) /* may read more than 1 char in one cicle */ 205 if (buffsize-tokensize <= 2) /* may read more than 1 char in one cicle */
221 { 206 yytext = luaI_buffer(buffsize *= 2);
222 growtext();
223 spaceleft = textsize - (yytextLast - yytext);
224 }
225 spaceleft--;
226 switch (current) 207 switch (current)
227 { 208 {
228 case EOF: 209 case EOF:
229 case 0: 210 case 0:
230 case '\n': 211 case '\n':
212 save(0);
231 return WRONGTOKEN; 213 return WRONGTOKEN;
232 case '\\': 214 case '\\':
233 next(); /* do not save the '\' */ 215 next(); /* do not save the '\' */
@@ -244,9 +226,11 @@ int luaY_lex (void)
244 save_and_next(); 226 save_and_next();
245 } 227 }
246 } 228 }
247 next(); /* skip the delimiter */ 229 next(); /* skip delimiter */
248 *yytextLast = 0; 230 save(0);
249 luaY_lval.vWord = luaI_findconstantbyname(yytext); 231 luaY_lval.vWord = luaI_findconstantbyname(yytext+1);
232 tokensize--;
233 save(del); save(0); /* restore delimiter */
250 return STRING; 234 return STRING;
251 } 235 }
252 236
@@ -266,7 +250,7 @@ int luaY_lex (void)
266 { 250 {
267 TaggedString *ts; 251 TaggedString *ts;
268 do { save_and_next(); } while (isalnum(current) || current == '_'); 252 do { save_and_next(); } while (isalnum(current) || current == '_');
269 *yytextLast = 0; 253 save(0);
270 ts = lua_createstring(yytext); 254 ts = lua_createstring(yytext);
271 if (ts->marked > 2) 255 if (ts->marked > 2)
272 return ts->marked; /* reserved word */ 256 return ts->marked; /* reserved word */
@@ -285,8 +269,7 @@ int luaY_lex (void)
285 save_and_next(); 269 save_and_next();
286 return DOTS; /* ... */ 270 return DOTS; /* ... */
287 } 271 }
288 else 272 else return CONC; /* .. */
289 return CONC; /* .. */
290 } 273 }
291 else if (!isdigit(current)) return '.'; 274 else if (!isdigit(current)) return '.';
292 /* current is a digit: goes through to number */ 275 /* current is a digit: goes through to number */
@@ -296,12 +279,19 @@ int luaY_lex (void)
296 case '0': case '1': case '2': case '3': case '4': 279 case '0': case '1': case '2': case '3': case '4':
297 case '5': case '6': case '7': case '8': case '9': 280 case '5': case '6': case '7': case '8': case '9':
298 a=0.0; 281 a=0.0;
299 do { a=10.0*a+(current-'0'); save_and_next(); } while (isdigit(current)); 282 do {
283 a=10.0*a+(current-'0');
284 save_and_next();
285 } while (isdigit(current));
300 if (current == '.') save_and_next(); 286 if (current == '.') save_and_next();
301fraction: 287 fraction:
302 { double da=0.1; 288 { double da=0.1;
303 while (isdigit(current)) 289 while (isdigit(current))
304 {a+=(current-'0')*da; da/=10.0; save_and_next()}; 290 {
291 a+=(current-'0')*da;
292 da/=10.0;
293 save_and_next();
294 }
305 if (current == 'e' || current == 'E') 295 if (current == 'e' || current == 'E')
306 { 296 {
307 int e=0; 297 int e=0;
@@ -310,15 +300,19 @@ fraction:
310 save_and_next(); 300 save_and_next();
311 neg=(current=='-'); 301 neg=(current=='-');
312 if (current == '+' || current == '-') save_and_next(); 302 if (current == '+' || current == '-') save_and_next();
313 if (!isdigit(current)) return WRONGTOKEN; 303 if (!isdigit(current)) { save(0); return WRONGTOKEN; }
314 do { e=10.0*e+(current-'0'); save_and_next(); } while (isdigit(current)); 304 do {
315 for (ea=neg?0.1:10.0; e>0; e>>=1) 305 e=10.0*e+(current-'0');
306 save_and_next();
307 } while (isdigit(current));
308 for (ea=neg?0.1:10.0; e>0; e>>=1)
316 { 309 {
317 if (e & 1) a*=ea; 310 if (e & 1) a*=ea;
318 ea*=ea; 311 ea*=ea;
319 } 312 }
320 } 313 }
321 luaY_lval.vFloat = a; 314 luaY_lval.vFloat = a;
315 save(0);
322 return NUMBER; 316 return NUMBER;
323 } 317 }
324 318
@@ -330,3 +324,4 @@ fraction:
330 } 324 }
331 } 325 }
332} 326}
327