static njs_token_t
njs_lexer_next_token(njs_lexer_t *lexer)
{
- u_char c;
+ u_char c, *p;
nxt_uint_t n;
njs_token_t token;
const njs_lexer_multi_t *multi;
case NJS_TOKEN_SINGLE_QUOTE:
return njs_lexer_string(lexer, c);
+ case NJS_TOKEN_DOT:
+ p = lexer->start;
+
+ if (p == lexer->end || njs_tokens[*p] != NJS_TOKEN_DIGIT) {
+ lexer->text.length = p - lexer->text.start;
+ return NJS_TOKEN_DOT;
+ }
+
+ /* Fall through. */
+
case NJS_TOKEN_DIGIT:
return njs_lexer_number(lexer, c);
case NJS_TOKEN_CLOSE_BRACKET:
case NJS_TOKEN_OPEN_BRACE:
case NJS_TOKEN_CLOSE_BRACE:
- case NJS_TOKEN_DOT:
case NJS_TOKEN_COMMA:
case NJS_TOKEN_COLON:
case NJS_TOKEN_SEMICOLON:
{
const u_char *p;
+ lexer->text.start = lexer->start - 1;
+
p = lexer->start;
if (c == '0' && p != lexer->end) {
done:
lexer->start = (u_char *) p;
+ lexer->text.length = p - lexer->text.start;
return NJS_TOKEN_NUMBER;
illegal_token:
- lexer->text.start = lexer->start - 1;
lexer->text.length = p - lexer->text.start;
return NJS_TOKEN_ILLEGAL;
{ nxt_string("-0"),
nxt_string("-0") },
+ { nxt_string(".0"),
+ nxt_string("0") },
+
{ nxt_string("0.1"),
nxt_string("0.1") },
+ { nxt_string(".9"),
+ nxt_string("0.9") },
+
+ { nxt_string("-.01"),
+ nxt_string("-0.01") },
+
{ nxt_string("0.000001"),
nxt_string("0.000001") },
{ nxt_string("+1\n"),
nxt_string("1") },
+ { nxt_string("."),
+ nxt_string("SyntaxError: Unexpected token \".\" in 1") },
+
/* Octal Numbers. */
{ nxt_string("0o0"),
{ nxt_string("1.1e+01"),
nxt_string("11") },
+ { nxt_string("-.01e-01"),
+ nxt_string("-0.001") },
+
{ nxt_string("1e9"),
nxt_string("1000000000") },
{ nxt_string("1eZ"),
nxt_string("SyntaxError: Unexpected token \"eZ\" in 1") },
+ { nxt_string(".e1"),
+ nxt_string("SyntaxError: Unexpected token \".\" in 1") },
+
/* Indexes. */
{ nxt_string("var a = []; a[-1] = 2; a[-1] == a['-1']"),
nxt_string("NaN") },
{ nxt_string("var a = 'abcdef'; a.3"),
- nxt_string("SyntaxError: Unexpected token \"3\" in 1") },
+ nxt_string("SyntaxError: Unexpected token \".3\" in 1") },
{ nxt_string("'abcdef'[3]"),
nxt_string("d") },