mirror of
https://github.com/lua/lua
synced 2024-11-29 16:13:17 +03:00
bug: Lexical gets confused with some combination of arithmetic
operators and hexadecimal numbers
This commit is contained in:
parent
81ed85ecfb
commit
76eab106df
21
llex.c
21
llex.c
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
** $Id: llex.c,v 2.58 2011/08/15 19:41:58 roberto Exp roberto $
|
** $Id: llex.c,v 2.59 2011/11/30 12:43:51 roberto Exp roberto $
|
||||||
** Lexical Analyzer
|
** Lexical Analyzer
|
||||||
** See Copyright Notice in lua.h
|
** See Copyright Notice in lua.h
|
||||||
*/
|
*/
|
||||||
@ -222,13 +222,24 @@ static void trydecpoint (LexState *ls, SemInfo *seminfo) {
|
|||||||
|
|
||||||
|
|
||||||
/* LUA_NUMBER */
|
/* LUA_NUMBER */
|
||||||
|
/*
|
||||||
|
** this function is quite liberal in what it accepts, as 'luaO_str2d'
|
||||||
|
** will reject ill-formed numerals.
|
||||||
|
*/
|
||||||
static void read_numeral (LexState *ls, SemInfo *seminfo) {
|
static void read_numeral (LexState *ls, SemInfo *seminfo) {
|
||||||
|
const char *expo = "Ee";
|
||||||
|
int first = ls->current;
|
||||||
lua_assert(lisdigit(ls->current));
|
lua_assert(lisdigit(ls->current));
|
||||||
do {
|
save_and_next(ls);
|
||||||
save_and_next(ls);
|
if (first == '0' && check_next(ls, "Xx")) /* hexadecimal? */
|
||||||
if (check_next(ls, "EePp")) /* exponent part? */
|
expo = "Pp";
|
||||||
|
for (;;) {
|
||||||
|
if (check_next(ls, expo)) /* exponent part? */
|
||||||
check_next(ls, "+-"); /* optional exponent sign */
|
check_next(ls, "+-"); /* optional exponent sign */
|
||||||
} while (lislalnum(ls->current) || ls->current == '.');
|
if (lisxdigit(ls->current) || ls->current == '.')
|
||||||
|
save_and_next(ls);
|
||||||
|
else break;
|
||||||
|
}
|
||||||
save(ls, '\0');
|
save(ls, '\0');
|
||||||
buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */
|
buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */
|
||||||
if (!buff2d(ls->buff, &seminfo->r)) /* format error? */
|
if (!buff2d(ls->buff, &seminfo->r)) /* format error? */
|
||||||
|
Loading…
Reference in New Issue
Block a user