Browse Source

simpler checking for numbers (strtod does the rest)

Roberto Ierusalimschy 20 years ago
parent
commit
d2811e8097
1 changed files with 16 additions and 24 deletions
  1. 16 24
      llex.c

+ 16 - 24
llex.c

@@ -1,5 +1,5 @@
 /*
-** $Id: llex.c,v 2.11 2005/05/16 21:19:00 roberto Exp roberto $
+** $Id: llex.c,v 2.12 2005/05/17 19:49:15 roberto Exp roberto $
 ** Lexical Analyzer
 ** See Copyright Notice in lua.h
 */
@@ -155,28 +155,23 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) {
 
 
 
+static int check_next (LexState *ls, const char *set) {
+  if (!strchr(set, ls->current))
+    return 0;
+  save_and_next(ls);
+  return 1;
+}
+
+
 
 /* LUA_NUMBER */
 static void read_numeral (LexState *ls, SemInfo *seminfo) {
-  while (isdigit(ls->current)) {
+  lua_assert(isdigit(ls->current));
+  do {
     save_and_next(ls);
-  }
-  if (ls->current == '.') {
-    save_and_next(ls);
-    if (ls->current == '.') {
-      save_and_next(ls);
-      luaX_lexerror(ls,
-                 "ambiguous syntax (decimal point x string concatenation)",
-                 TK_NUMBER);
-    }
-  }
-  while (isdigit(ls->current)) {
-    save_and_next(ls);
-  }
-  if (ls->current == 'e' || ls->current == 'E') {
-    save_and_next(ls);  /* read `E' */
-    if (ls->current == '+' || ls->current == '-')
-      save_and_next(ls);  /* optional exponent sign */
+  } while (isdigit(ls->current) || ls->current == '.');
+  if (check_next(ls, "Ee")) {  /* `E'? */
+    check_next(ls, "+-");  /* optional exponent sign */
     while (isdigit(ls->current)) {
       save_and_next(ls);
     }
@@ -375,12 +370,9 @@ int luaX_lex (LexState *ls, SemInfo *seminfo) {
       }
       case '.': {
         save_and_next(ls);
-        if (ls->current == '.') {
-          next(ls);
-          if (ls->current == '.') {
-            next(ls);
+        if (check_next(ls, ".")) {
+          if (check_next(ls, "."))
             return TK_DOTS;   /* ... */
-          }
           else return TK_CONCAT;   /* .. */
         }
         else if (!isdigit(ls->current)) return '.';