case NJS_TOKEN_FUNCTION:
return njs_parser_function_declaration(vm, parser);
- case NJS_TOKEN_RETURN:
- return njs_parser_return_statement(vm, parser);
-
- case NJS_TOKEN_VAR:
- return njs_parser_var_statement(vm, parser);
-
case NJS_TOKEN_IF:
return njs_parser_if_statement(vm, parser);
case NJS_TOKEN_FOR:
return njs_parser_for_statement(vm, parser);
- case NJS_TOKEN_CONTINUE:
- return njs_parser_continue_statement(vm, parser);
-
- case NJS_TOKEN_BREAK:
- return njs_parser_break_statement(vm, parser);
-
case NJS_TOKEN_TRY:
return njs_parser_try_statement(vm, parser);
- case NJS_TOKEN_THROW:
- return njs_parser_throw_statement(vm, parser);
-
case NJS_TOKEN_SEMICOLON:
return njs_parser_token(parser);
/* Fall through. */
default:
- token = njs_parser_expression(vm, parser, token);
+
+ switch (token) {
+ case NJS_TOKEN_VAR:
+ token = njs_parser_var_statement(vm, parser);
+ break;
+
+ case NJS_TOKEN_CONTINUE:
+ token = njs_parser_continue_statement(vm, parser);
+ break;
+
+ case NJS_TOKEN_BREAK:
+ token = njs_parser_break_statement(vm, parser);
+ break;
+
+ case NJS_TOKEN_RETURN:
+ token = njs_parser_return_statement(vm, parser);
+ break;
+
+ case NJS_TOKEN_THROW:
+ token = njs_parser_throw_statement(vm, parser);
+ break;
+
+ default:
+ token = njs_parser_expression(vm, parser, token);
+ break;
+ }
+
if (nxt_slow_path(token <= NJS_TOKEN_ILLEGAL)) {
return token;
}
switch (token) {
- case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_LINE_END:
return njs_parser_token(parser);
+ case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_CLOSE_BRACE:
+ case NJS_TOKEN_END:
return token;
default:
node->right = parser->node;
parser->node = node;
- if (token == NJS_TOKEN_SEMICOLON) {
- return njs_parser_token(parser);
- }
-
return token;
}
}
} while (token == NJS_TOKEN_COMMA);
- /*
- * A var statement must be terminated by semicolon,
- * or by a close curly brace or by the end of line.
- */
- switch (token) {
-
- case NJS_TOKEN_SEMICOLON:
- return njs_parser_token(parser);
-
- case NJS_TOKEN_CLOSE_BRACE:
- case NJS_TOKEN_END:
- return token;
-
- default:
- if (parser->lexer->prev_token == NJS_TOKEN_LINE_END) {
- return token;
- }
-
- return NJS_TOKEN_ILLEGAL;
- }
+ return token;
}
switch (token) {
- case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_LINE_END:
return njs_parser_token(parser);
+ case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_CLOSE_BRACE:
case NJS_TOKEN_END:
return token;
switch (token) {
- case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_LINE_END:
return njs_parser_token(parser);
+ case NJS_TOKEN_SEMICOLON:
case NJS_TOKEN_CLOSE_BRACE:
case NJS_TOKEN_END:
return token;
nxt_string("123") },
{ nxt_string("(function(){ if(true) return 1 else return 0; })()"),
- nxt_string("1") },
+ nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
{ nxt_string("(function(){ if(true) return 1; else return 0; })()"),
nxt_string("1") },
{ nxt_string("(function(){ if(true) return 1\n;\n else return 0; })()"),
nxt_string("1") },
+ { nxt_string("function f(n) {if (n) throw 'foo' else return 1}; f(0)"),
+ nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
+
{ nxt_string("function f(n) {if (n)\n throw 'foo'\nelse return 1}; f(0)"),
nxt_string("1") },
{ nxt_string("function f(n) {if (n == 1) throw 'foo'\nelse if (n == 2) return 1}; f(2)"),
nxt_string("1") },
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) break else return 0; }})()"),
+ nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) break\n else return 0; }})()"),
+ nxt_string("undefined") },
+
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) break; else return 0; }})()"),
+ nxt_string("undefined") },
+
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) continue else return 0; }})()"),
+ nxt_string("SyntaxError: Unexpected token \"else\" in 1") },
+
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) continue\n else return 0; }})()"),
+ nxt_string("undefined") },
+
+ { nxt_string("(function(){ for (var p in [1] ){ if (1) continue; else return 0; }})()"),
+ nxt_string("undefined") },
+
/* do while. */
{ nxt_string("do { break } if (false)"),
{ nxt_string("function f() { return 1\n 2 } f()"),
nxt_string("1") },
+ { nxt_string("(function f() { return 2.toString(); })()"),
+ nxt_string("SyntaxError: Unexpected token \"toString\" in 1") },
+
+ { nxt_string("(function f() { return 2..toString(); })()"),
+ nxt_string("2") },
+
{ nxt_string("function f(a) { if (a) return 'OK' } f(1)+f(0)"),
nxt_string("OKundefined") },
{ nxt_string("function f(a) {"
" if (a > 1)"
- " return a * f(a - 1)"
+ " return a * f(a - 1)\n"
" return 1"
"}"
"f(10)"),
{ nxt_string("function fibo(n) {"
" if (n > 1)"
- " return fibo(n-1) + fibo(n-2)"
+ " return fibo(n-1) + fibo(n-2)\n"
" return 1"
"}"
"fibo(10)"),
{ nxt_string("function fibo(n) {"
" if (n > 1)"
- " return fibo(n-1) + fibo(n-2)"
+ " return fibo(n-1) + fibo(n-2)\n"
" return '.'"
"}"
"fibo(10).length"),
{ nxt_string("function fibo(n) {"
" if (n > 1)"
- " return fibo(n-1) + fibo(n-2)"
+ " return fibo(n-1) + fibo(n-2)\n"
" return 1"
"}"
"fibo('10')"),