From: Valentin Bartenev Date: Mon, 29 Oct 2018 18:06:24 +0000 (+0300) Subject: Non-integer fractions. X-Git-Tag: 0.2.5~1 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=da25ee4c691d020b383f3dde6314b260ba7961ae;p=njs.git Non-integer fractions. --- diff --git a/njs/njs_lexer.c b/njs/njs_lexer.c index 8e22f309..361c47a5 100644 --- a/njs/njs_lexer.c +++ b/njs/njs_lexer.c @@ -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_char 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_char 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 --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index dd96ff4a..7ed8bff4 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -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") },