aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1998-02-11 18:56:46 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1998-02-11 18:56:46 -0200
commitaafa106d108581ab8b259bfde3bcf1166a17c3e9 (patch)
treef49a41e5175f87fcf186e55196089b05d3f54132
parent29b7b8e52cc9ff7ca39869c1aad98a3b7860c09a (diff)
downloadlua-aafa106d108581ab8b259bfde3bcf1166a17c3e9.tar.gz
lua-aafa106d108581ab8b259bfde3bcf1166a17c3e9.tar.bz2
lua-aafa106d108581ab8b259bfde3bcf1166a17c3e9.zip
implementation of numerical escape sequences in strings ("\12");
better error messages for wrong tokens
-rw-r--r--llex.c61
1 files changed, 41 insertions, 20 deletions
diff --git a/llex.c b/llex.c
index 5c73c90a..ef023c3f 100644
--- a/llex.c
+++ b/llex.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: llex.c,v 1.13 1998/01/09 14:44:55 roberto Exp roberto $ 2** $Id: llex.c,v 1.14 1998/01/19 20:18:02 roberto Exp roberto $
3** Lexical Analizer 3** Lexical Analizer
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -126,7 +126,7 @@ static void ifskip (LexState *LS)
126 if (LS->current == '\n') 126 if (LS->current == '\n')
127 inclinenumber(LS); 127 inclinenumber(LS);
128 else if (LS->current == EOZ) 128 else if (LS->current == EOZ)
129 luaY_syntaxerror("input ends inside a $if", ""); 129 luaY_error("input ends inside a $if");
130 else next(LS); 130 else next(LS);
131 } 131 }
132} 132}
@@ -218,8 +218,8 @@ static int read_long_string (LexState *LS, YYSTYPE *l)
218 while (1) { 218 while (1) {
219 switch (LS->current) { 219 switch (LS->current) {
220 case EOZ: 220 case EOZ:
221 save(0); 221 luaY_error("unfinished long string");
222 return WRONGTOKEN; 222 return 0; /* to avoid warnings */
223 case '[': 223 case '[':
224 save_and_next(LS); 224 save_and_next(LS);
225 if (LS->current == '[') { 225 if (LS->current == '[') {
@@ -319,8 +319,8 @@ int luaY_lex (YYSTYPE *l)
319 switch (LS->current) { 319 switch (LS->current) {
320 case EOZ: 320 case EOZ:
321 case '\n': 321 case '\n':
322 save(0); 322 luaY_error("unfinished string");
323 return WRONGTOKEN; 323 return 0; /* to avoid warnings */
324 case '\\': 324 case '\\':
325 next(LS); /* do not save the '\' */ 325 next(LS); /* do not save the '\' */
326 switch (LS->current) { 326 switch (LS->current) {
@@ -328,7 +328,29 @@ int luaY_lex (YYSTYPE *l)
328 case 't': save('\t'); next(LS); break; 328 case 't': save('\t'); next(LS); break;
329 case 'r': save('\r'); next(LS); break; 329 case 'r': save('\r'); next(LS); break;
330 case '\n': save('\n'); inclinenumber(LS); break; 330 case '\n': save('\n'); inclinenumber(LS); break;
331 default : save_and_next(LS); break; 331 case '\\': case '"': case '\'': {
332 save(LS->current);
333 next(LS);
334 break;
335 }
336 default : {
337 if (isdigit(LS->current)) {
338 int c = 0;
339 int i = 0;
340 do {
341 c = 10*c + (LS->current-'0');
342 i++;
343 next(LS);
344 } while (i<3 && isdigit(LS->current));
345 save(c);
346 }
347 else {
348 save('\\');
349 save(LS->current);
350 luaY_error("invalid escape sequence");
351 }
352 break;
353 }
332 } 354 }
333 break; 355 break;
334 default: 356 default:
@@ -363,13 +385,13 @@ int luaY_lex (YYSTYPE *l)
363 case '5': case '6': case '7': case '8': case '9': 385 case '5': case '6': case '7': case '8': case '9':
364 a=0.0; 386 a=0.0;
365 do { 387 do {
366 a=10.0*a+(LS->current-'0'); 388 a = 10.0*a + (LS->current-'0');
367 save_and_next(LS); 389 save_and_next(LS);
368 } while (isdigit(LS->current)); 390 } while (isdigit(LS->current));
369 if (LS->current == '.') { 391 if (LS->current == '.') {
370 save_and_next(LS); 392 save_and_next(LS);
371 if (LS->current == '.') { 393 if (LS->current == '.') {
372 save(0); 394 save('.');
373 luaY_error( 395 luaY_error(
374 "ambiguous syntax (decimal point x string concatenation)"); 396 "ambiguous syntax (decimal point x string concatenation)");
375 } 397 }
@@ -378,27 +400,27 @@ int luaY_lex (YYSTYPE *l)
378 { double da=0.1; 400 { double da=0.1;
379 while (isdigit(LS->current)) 401 while (isdigit(LS->current))
380 { 402 {
381 a+=(LS->current-'0')*da; 403 a += (LS->current-'0')*da;
382 da/=10.0; 404 da /= 10.0;
383 save_and_next(LS); 405 save_and_next(LS);
384 } 406 }
385 if (toupper(LS->current) == 'E') { 407 if (toupper(LS->current) == 'E') {
386 int e=0; 408 int e = 0;
387 int neg; 409 int neg;
388 double ea; 410 double ea;
389 save_and_next(LS); 411 save_and_next(LS);
390 neg=(LS->current=='-'); 412 neg = (LS->current=='-');
391 if (LS->current == '+' || LS->current == '-') save_and_next(LS); 413 if (LS->current == '+' || LS->current == '-') save_and_next(LS);
392 if (!isdigit(LS->current)) { 414 if (!isdigit(LS->current))
393 save(0); return WRONGTOKEN; } 415 luaY_error("invalid numeral format");
394 do { 416 do {
395 e=10.0*e+(LS->current-'0'); 417 e = 10.0*e + (LS->current-'0');
396 save_and_next(LS); 418 save_and_next(LS);
397 } while (isdigit(LS->current)); 419 } while (isdigit(LS->current));
398 for (ea=neg?0.1:10.0; e>0; e>>=1) 420 for (ea=neg?0.1:10.0; e>0; e>>=1)
399 { 421 {
400 if (e & 1) a*=ea; 422 if (e & 1) a *= ea;
401 ea*=ea; 423 ea *= ea;
402 } 424 }
403 } 425 }
404 l->vReal = a; 426 l->vReal = a;
@@ -406,9 +428,8 @@ int luaY_lex (YYSTYPE *l)
406 } 428 }
407 429
408 case EOZ: 430 case EOZ:
409 save(0);
410 if (LS->iflevel > 0) 431 if (LS->iflevel > 0)
411 luaY_syntaxerror("input ends inside a $if", ""); 432 luaY_error("input ends inside a $if");
412 return 0; 433 return 0;
413 434
414 default: 435 default: