diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-11-08 17:45:14 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-11-08 17:45:14 -0200 |
| commit | d2811e809721e66b57246be23813ae71db224ee7 (patch) | |
| tree | 08871631edd8ba2e03b1e856f17c9c381383e58b | |
| parent | e43e95553fdb0ebb30ab3c69c227aebd752942dd (diff) | |
| download | lua-d2811e809721e66b57246be23813ae71db224ee7.tar.gz lua-d2811e809721e66b57246be23813ae71db224ee7.tar.bz2 lua-d2811e809721e66b57246be23813ae71db224ee7.zip | |
simpler checking for numbers (strtod does the rest)
| -rw-r--r-- | llex.c | 40 |
1 files changed, 16 insertions, 24 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llex.c,v 2.11 2005/05/16 21:19:00 roberto Exp roberto $ | 2 | ** $Id: llex.c,v 2.12 2005/05/17 19:49:15 roberto Exp roberto $ |
| 3 | ** Lexical Analyzer | 3 | ** Lexical Analyzer |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -155,28 +155,23 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { | |||
| 155 | 155 | ||
| 156 | 156 | ||
| 157 | 157 | ||
| 158 | static int check_next (LexState *ls, const char *set) { | ||
| 159 | if (!strchr(set, ls->current)) | ||
| 160 | return 0; | ||
| 161 | save_and_next(ls); | ||
| 162 | return 1; | ||
| 163 | } | ||
| 164 | |||
| 165 | |||
| 158 | 166 | ||
| 159 | /* LUA_NUMBER */ | 167 | /* LUA_NUMBER */ |
| 160 | static void read_numeral (LexState *ls, SemInfo *seminfo) { | 168 | static void read_numeral (LexState *ls, SemInfo *seminfo) { |
| 161 | while (isdigit(ls->current)) { | 169 | lua_assert(isdigit(ls->current)); |
| 170 | do { | ||
| 162 | save_and_next(ls); | 171 | save_and_next(ls); |
| 163 | } | 172 | } while (isdigit(ls->current) || ls->current == '.'); |
| 164 | if (ls->current == '.') { | 173 | if (check_next(ls, "Ee")) { /* `E'? */ |
| 165 | save_and_next(ls); | 174 | check_next(ls, "+-"); /* optional exponent sign */ |
| 166 | if (ls->current == '.') { | ||
| 167 | save_and_next(ls); | ||
| 168 | luaX_lexerror(ls, | ||
| 169 | "ambiguous syntax (decimal point x string concatenation)", | ||
| 170 | TK_NUMBER); | ||
| 171 | } | ||
| 172 | } | ||
| 173 | while (isdigit(ls->current)) { | ||
| 174 | save_and_next(ls); | ||
| 175 | } | ||
| 176 | if (ls->current == 'e' || ls->current == 'E') { | ||
| 177 | save_and_next(ls); /* read `E' */ | ||
| 178 | if (ls->current == '+' || ls->current == '-') | ||
| 179 | save_and_next(ls); /* optional exponent sign */ | ||
| 180 | while (isdigit(ls->current)) { | 175 | while (isdigit(ls->current)) { |
| 181 | save_and_next(ls); | 176 | save_and_next(ls); |
| 182 | } | 177 | } |
| @@ -375,12 +370,9 @@ int luaX_lex (LexState *ls, SemInfo *seminfo) { | |||
| 375 | } | 370 | } |
| 376 | case '.': { | 371 | case '.': { |
| 377 | save_and_next(ls); | 372 | save_and_next(ls); |
| 378 | if (ls->current == '.') { | 373 | if (check_next(ls, ".")) { |
| 379 | next(ls); | 374 | if (check_next(ls, ".")) |
| 380 | if (ls->current == '.') { | ||
| 381 | next(ls); | ||
| 382 | return TK_DOTS; /* ... */ | 375 | return TK_DOTS; /* ... */ |
| 383 | } | ||
| 384 | else return TK_CONCAT; /* .. */ | 376 | else return TK_CONCAT; /* .. */ |
| 385 | } | 377 | } |
| 386 | else if (!isdigit(ls->current)) return '.'; | 378 | else if (!isdigit(ls->current)) return '.'; |
