aboutsummaryrefslogtreecommitdiff
path: root/lib/parse.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/parse.js')
-rw-r--r--lib/parse.js56
1 files changed, 40 insertions, 16 deletions
diff --git a/lib/parse.js b/lib/parse.js
index 74c00b74..eab9b64d 100644
--- a/lib/parse.js
+++ b/lib/parse.js
@@ -801,17 +801,16 @@ function parse($TEXT, options) {
};
var statement = embed_tokens(function() {
- var tmp;
handle_regexp();
switch (S.token.type) {
case "string":
if (S.in_directives) {
- tmp = peek();
+ var token = peek();
if (S.token.raw.indexOf("\\") == -1
- && (tmp.nlb
- || is_token(tmp, "eof")
- || is_token(tmp, "punc", ";")
- || is_token(tmp, "punc", "}"))) {
+ && (token.nlb
+ || is_token(token, "eof")
+ || is_token(token, "punc", ";")
+ || is_token(token, "punc", "}"))) {
S.input.add_directive(S.token.value);
} else {
S.in_directives = false;
@@ -850,72 +849,97 @@ function parse($TEXT, options) {
}
case "keyword":
- switch (tmp = S.token.value, next(), tmp) {
+ switch (S.token.value) {
case "break":
+ next();
return break_cont(AST_Break);
case "continue":
+ next();
return break_cont(AST_Continue);
case "debugger":
+ next();
semicolon();
return new AST_Debugger();
case "do":
+ next();
+ var body = in_loop(statement);
+ expect_token("keyword", "while");
+ var condition = parenthesised();
+ semicolon(true);
return new AST_Do({
- body : in_loop(statement),
- condition : (expect_token("keyword", "while"), tmp = parenthesised(), semicolon(true), tmp)
+ body : body,
+ condition : condition
});
case "while":
+ next();
return new AST_While({
condition : parenthesised(),
body : in_loop(statement)
});
case "for":
+ next();
return for_();
case "function":
+ next();
return function_(AST_Defun);
case "if":
+ next();
return if_();
case "return":
if (S.in_function == 0 && !options.bare_returns)
croak("'return' outside of function");
+ next();
+ var value = null;
+ if (is("punc", ";")) {
+ next();
+ } else if (!can_insert_semicolon()) {
+ value = expression(true);
+ semicolon();
+ }
return new AST_Return({
- value: ( is("punc", ";")
- ? (next(), null)
- : can_insert_semicolon()
- ? null
- : (tmp = expression(true), semicolon(), tmp) )
+ value: value
});
case "switch":
+ next();
return new AST_Switch({
expression : parenthesised(),
body : in_loop(switch_body_)
});
case "throw":
+ next();
if (S.token.nlb)
croak("Illegal newline after 'throw'");
+ var value = expression(true);
+ semicolon();
return new AST_Throw({
- value: (tmp = expression(true), semicolon(), tmp)
+ value: value
});
case "try":
+ next();
return try_();
case "var":
- return tmp = var_(), semicolon(), tmp;
+ next();
+ var node = var_();
+ semicolon();
+ return node;
case "with":
if (S.input.has_directive("use strict")) {
croak("Strict mode may not include a with statement");
}
+ next();
return new AST_With({
expression : parenthesised(),
body : statement()