浏览代码

Syntax should not allow numbers touching identifiers

Code like 'a = 1print()' should not be accepted.
Roberto Ierusalimschy 6 年之前
父节点
当前提交
65d1aa7a77
共有 2 个文件被更改,包括 11 次插入0 次删除
  1. 2 0
      llex.c
  2. 9 0
      testes/literals.lua

+ 2 - 0
llex.c

@@ -228,6 +228,8 @@ static int read_numeral (LexState *ls, SemInfo *seminfo) {
       save_and_next(ls);
     else break;
   }
+  if (lislalnum(ls->current))  /* is numeral touching an alpha num? */
+    save_and_next(ls);  /* force an error */
   save(ls, '\0');
   if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0)  /* format error? */
     lexerror(ls, "malformed number", TK_FLT);

+ 9 - 0
testes/literals.lua

@@ -306,4 +306,13 @@ assert(not load"a = 'non-ending string\n'")
 assert(not load"a = '\\345'")
 assert(not load"a = [=x]")
 
+local function malformednum (n, exp)
+  local s, msg = load("return " .. n)
+  assert(not s and string.find(msg, exp))
+end
+
+malformednum("0xe-", "near <eof>")
+malformednum("0xep-p", "malformed number")
+malformednum("1print()", "malformed number")
+
 print('OK')