Add type operators, throw statements, ternaries

pull/70/head
Max Brunsfeld 2014-08-30 10:03:55 +07:00
parent 95ed648299
commit 0af531f11c
4 changed files with 9274 additions and 24 deletions

9190
benchmarks/jquery.js vendored

File diff suppressed because it is too large Load Diff

@ -29,6 +29,7 @@ module.exports = compiler.grammar
@break_statement,
@statement_block,
@return_statement,
@throw_statement,
@var_declaration)
expression_statement: -> seq(
@ -103,6 +104,11 @@ module.exports = compiler.grammar
"=",
@expression)
throw_statement: -> seq(
keyword("throw"),
@expression,
terminator())
expression: -> choice(
@identifier,
@number,
@ -120,12 +126,12 @@ module.exports = compiler.grammar
@subscript_access,
@function_call,
@constructor_call,
@ternary,
@bool_op,
@math_op,
@rel_op,
@var_assignment,
@member_assignment,
@subscript_assignment,
@type_op,
@assignment,
seq("(", @expression, ")"))
function_call: -> seq(
@ -150,24 +156,17 @@ module.exports = compiler.grammar
".",
@identifier))
member_assignment: -> prec(10, seq(
@expression,
".",
@identifier,
"=",
@expression))
subscript_access: -> prec(10, seq(
@expression,
"[",
@expression,
"]"))
subscript_assignment: -> prec(10, seq(
@expression,
"[",
@expression,
"]",
assignment: -> prec(-1, seq(
choice(
@identifier,
@member_access,
@subscript_access)
"=",
@expression))
@ -210,6 +209,9 @@ module.exports = compiler.grammar
seq(@expression, "&&", @expression),
seq(@expression, "||", @expression))
ternary: -> seq(
@expression, "?", @expression, ":", @expression)
math_op: -> choice(
seq(@expression, "++"),
seq(@expression, "--"),
@ -226,6 +228,10 @@ module.exports = compiler.grammar
seq(@expression, ">=", @expression),
seq(@expression, ">", @expression))
type_op: -> choice(
seq(keyword("typeof"), @expression),
seq(@expression, keyword("instanceof"), @expression))
string: -> token(choice(
seq('"', repeat(choice(/[^"]/, '\\"')), '"'),
seq("'", repeat(choice(/[^']/, "\\'")), "'")))

@ -147,7 +147,9 @@ Function calls
============================================
x.someMethod(arg1, "arg2");
(function() {})();
function(x, y) {
}(a, b);
---
@ -156,7 +158,10 @@ x.someMethod(arg1, "arg2");
(member_access (identifier) (identifier))
(arguments (identifier) (string))))
(expression_statement (function_call
(expression (function (statement_block))))))
(function
(formal_parameters (identifier) (identifier))
(statement_block))
(arguments (identifier) (identifier)))))
============================================
Constructor calls
@ -240,9 +245,46 @@ x["y"] = 0;
---
(program
(expression_statement (var_assignment
(identifier) (number)))
(expression_statement (member_assignment
(identifier) (identifier) (number)))
(expression_statement (subscript_assignment
(identifier) (string) (number))))
(expression_statement (assignment
(identifier)
(number)))
(expression_statement (assignment
(member_access (identifier) (identifier))
(number)))
(expression_statement (assignment
(subscript_access (identifier) (string))
(number))))
==============================================
Ternaries
==============================================
condition ? case1 : case2;
x.y = some.condition ?
some.case :
some.other.case;
---
(program
(expression_statement (ternary
(identifier) (identifier) (identifier)))
(expression_statement (assignment
(member_access (identifier) (identifier))
(ternary
(member_access (identifier) (identifier))
(member_access (identifier) (identifier))
(member_access (member_access (identifier) (identifier)) (identifier))))))
==============================================
Type operators
==============================================
typeof x;
x instanceof String;
---
(program
(expression_statement (type_op (identifier)))
(expression_statement (type_op (identifier) (identifier))))

@ -68,7 +68,7 @@ for (;;) {
(program
(for_statement
(var_assignment (identifier) (number))
(assignment (identifier) (number))
(rel_op (identifier) (number))
(math_op (identifier))
(expression_statement (function_call (identifier) (arguments (identifier)))))
@ -199,3 +199,15 @@ switch (x) {
(break_statement))
(default
(return_statement (number)))))
============================================
Throw statements
============================================
throw new Error("uh oh");
---
(program
(throw_statement
(constructor_call (identifier) (arguments (string)))))