details: http://hg.nginx.org/njs/rev/0677cbeee41a branches: changeset: 632:0677cbeee41a user: Valentin Bartenev <vb...@nginx.com> date: Mon Oct 29 21:06:24 2018 +0300 description: Non-integer fractions.
diffstat: njs/njs_lexer.c | 17 ++++++++++++++--- njs/test/njs_unit_test.c | 20 +++++++++++++++++++- 2 files changed, 33 insertions(+), 4 deletions(-) diffs (123 lines): diff -r 647de74fd2c7 -r 0677cbeee41a njs/njs_lexer.c --- a/njs/njs_lexer.c Mon Oct 29 17:36:43 2018 +0300 +++ b/njs/njs_lexer.c Mon Oct 29 21:06:24 2018 +0300 @@ -290,7 +290,7 @@ njs_lexer_token(njs_lexer_t *lexer) 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; @@ -315,6 +315,16 @@ njs_lexer_next_token(njs_lexer_t *lexer) 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); @@ -405,7 +415,6 @@ njs_lexer_next_token(njs_lexer_t *lexer) 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: @@ -527,6 +536,8 @@ njs_lexer_number(njs_lexer_t *lexer, u_c { const u_char *p; + lexer->text.start = lexer->start - 1; + p = lexer->start; if (c == '0' && p != lexer->end) { @@ -594,6 +605,7 @@ njs_lexer_number(njs_lexer_t *lexer, u_c done: lexer->start = (u_char *) p; + lexer->text.length = p - lexer->text.start; return NJS_TOKEN_NUMBER; @@ -603,7 +615,6 @@ illegal_trailer: illegal_token: - lexer->text.start = lexer->start - 1; lexer->text.length = p - lexer->text.start; return NJS_TOKEN_ILLEGAL; diff -r 647de74fd2c7 -r 0677cbeee41a njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Mon Oct 29 17:36:43 2018 +0300 +++ b/njs/test/njs_unit_test.c Mon Oct 29 21:06:24 2018 +0300 @@ -101,9 +101,18 @@ static njs_unit_test_t njs_test[] = { 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") }, @@ -140,6 +149,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("+1\n"), nxt_string("1") }, + { nxt_string("."), + nxt_string("SyntaxError: Unexpected token \".\" in 1") }, + /* Octal Numbers. */ { nxt_string("0o0"), @@ -264,6 +276,9 @@ static njs_unit_test_t njs_test[] = { nxt_string("1.1e+01"), nxt_string("11") }, + { nxt_string("-.01e-01"), + nxt_string("-0.001") }, + { nxt_string("1e9"), nxt_string("1000000000") }, @@ -297,6 +312,9 @@ static njs_unit_test_t njs_test[] = { 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']"), @@ -4039,7 +4057,7 @@ static njs_unit_test_t njs_test[] = 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") }, _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel