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

@ -147,7 +147,9 @@ Function calls
============================================ ============================================
x.someMethod(arg1, "arg2"); x.someMethod(arg1, "arg2");
(function() {})(); function(x, y) {
}(a, b);
--- ---
@ -156,7 +158,10 @@ x.someMethod(arg1, "arg2");
(member_access (identifier) (identifier)) (member_access (identifier) (identifier))
(arguments (identifier) (string)))) (arguments (identifier) (string))))
(expression_statement (function_call (expression_statement (function_call
(expression (function (statement_block)))))) (function
(formal_parameters (identifier) (identifier))
(statement_block))
(arguments (identifier) (identifier)))))
============================================ ============================================
Constructor calls Constructor calls
@ -240,9 +245,46 @@ x["y"] = 0;
--- ---
(program (program
(expression_statement (var_assignment (expression_statement (assignment
(identifier) (number))) (identifier)
(expression_statement (member_assignment (number)))
(identifier) (identifier) (number))) (expression_statement (assignment
(expression_statement (subscript_assignment (member_access (identifier) (identifier))
(identifier) (string) (number)))) (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 (program
(for_statement (for_statement
(var_assignment (identifier) (number)) (assignment (identifier) (number))
(rel_op (identifier) (number)) (rel_op (identifier) (number))
(math_op (identifier)) (math_op (identifier))
(expression_statement (function_call (identifier) (arguments (identifier))))) (expression_statement (function_call (identifier) (arguments (identifier)))))
@ -199,3 +199,15 @@ switch (x) {
(break_statement)) (break_statement))
(default (default
(return_statement (number))))) (return_statement (number)))))
============================================
Throw statements
============================================
throw new Error("uh oh");
---
(program
(throw_statement
(constructor_call (identifier) (arguments (string)))))