diff --git a/lex.c b/lex.c index e34bde7b..ce0b4dac 100644 --- a/lex.c +++ b/lex.c @@ -1,4 +1,4 @@ -char *rcs_lex = "$Id: lex.c,v 2.36 1996/09/25 21:52:00 roberto Exp roberto $"; +char *rcs_lex = "$Id: lex.c,v 2.38 1996/11/08 12:20:34 roberto Exp roberto $"; #include @@ -30,9 +30,15 @@ void lua_setinput (Input fn) input = fn; } -char *lua_lasttext (void) +void luaI_syntaxerror (char *s) { - return luaI_buffer(1); + char msg[256]; + char *token = luaI_buffer(1); + if (token[0] == 0) + token = ""; + sprintf (msg,"%s; last token read: \"%s\" at line %d in file `%s'", + s, token, lua_linenumber, lua_parsedfile); + lua_error (msg); } @@ -75,11 +81,11 @@ void luaI_addReserved (void) static int inclinenumber (int pragma_allowed) { if (pragma_allowed && current == '$') { /* is a pragma? */ - char buff[MINBUFF]; + char *buff = luaI_buffer(MINBUFF+1); int i = 0; next(); /* skip $ */ while (isalnum(current)) { - if (i >= MINBUFF) lua_error("pragma too long"); + if (i >= MINBUFF) luaI_syntaxerror("pragma too long"); buff[i++] = current; next(); } @@ -88,7 +94,7 @@ static int inclinenumber (int pragma_allowed) lua_debug = 1; else if (strcmp(buff, "nodebug") == 0) lua_debug = 0; - else lua_error("invalid pragma"); + else luaI_syntaxerror("invalid pragma"); } return ++lua_linenumber; } @@ -285,7 +291,12 @@ int luaY_lex (void) a=10.0*a+(current-'0'); save_and_next(); } while (isdigit(current)); - if (current == '.') save_and_next(); + if (current == '.') { + save_and_next(); + if (current == '.') + luaI_syntaxerror( + "ambiguous syntax (decimal point x string concatenation)"); + } fraction: { double da=0.1; while (isdigit(current))