Add try/catch, while, bitwise operators

pull/70/head
Max Brunsfeld 2014-08-31 12:46:39 +07:00
parent 0af531f11c
commit 73daf4cc48
4 changed files with 170 additions and 24 deletions

@ -26,10 +26,12 @@ module.exports = compiler.grammar
@switch_statement,
@for_statement,
@for_in_statement,
@while_statement,
@break_statement,
@statement_block,
@return_statement,
@throw_statement,
@try_statement,
@var_declaration)
expression_statement: -> seq(
@ -87,6 +89,11 @@ module.exports = compiler.grammar
")",
@statement)
while_statement: -> seq(
keyword("while"),
"(", err(@expression), ")",
@statement)
return_statement: -> seq(
keyword("return"),
optional(@expression),
@ -94,9 +101,9 @@ module.exports = compiler.grammar
var_declaration: -> seq(
keyword("var"),
commaSep(choice(
commaSep1(err(choice(
@identifier,
@var_assignment)),
@var_assignment))),
terminator())
var_assignment: -> seq(
@ -104,6 +111,21 @@ module.exports = compiler.grammar
"=",
@expression)
try_statement: -> seq(
keyword("try"),
@statement_block,
optional(@catch),
optional(@finally))
catch: -> seq(
keyword("catch"),
optional(seq("(", @identifier, ")"))
@statement_block)
finally: -> seq(
keyword("finally"),
@statement_block)
throw_statement: -> seq(
keyword("throw"),
@expression,
@ -129,27 +151,24 @@ module.exports = compiler.grammar
@ternary,
@bool_op,
@math_op,
@bitwise_op,
@rel_op,
@type_op,
@assignment,
seq("(", @expression, ")"))
seq("(", err(@expression), ")"))
function_call: -> seq(
@expression,
"(",
optional(@arguments),
")")
"(", err(optional(@arguments)), ")")
constructor_call: -> prec(1, seq(
keyword("new"),
@expression,
optional(seq(
"(",
optional(@arguments),
")"))))
"(", err(optional(@arguments)), ")"))))
arguments: ->
commaSep1(@expression)
commaSep1(err(@expression))
member_access: -> prec(10, seq(
@expression,
@ -158,11 +177,9 @@ module.exports = compiler.grammar
subscript_access: -> prec(10, seq(
@expression,
"[",
@expression,
"]"))
"[", err(@expression), "]"))
assignment: -> prec(-1, seq(
assignment: -> prec(-2, seq(
choice(
@identifier,
@member_access,
@ -172,7 +189,7 @@ module.exports = compiler.grammar
object: -> seq(
"{",
commaSep(@pair),
commaSep(err(@pair)),
"}")
pair: -> seq(
@ -191,7 +208,7 @@ module.exports = compiler.grammar
statement_block: -> seq(
"{",
repeat(@statement),
err(repeat(@statement)),
"}")
array: -> seq(
@ -199,20 +216,29 @@ module.exports = compiler.grammar
commaSep(@expression)
"]")
identifier: -> /\a+\d*/
identifier: -> /[\a_$][\a\d_$]*/
number: -> token(seq(
/\d+/,
optional(seq(".", /\d+/))))
bool_op: -> choice(
seq(@expression, "&&", @expression),
prec(3, seq("!", @expression)),
prec(2, seq(@expression, "&&", @expression)),
seq(@expression, "||", @expression))
ternary: -> seq(
@expression, "?", @expression, ":", @expression)
bitwise_op: -> choice(
seq(@expression, ">>", @expression),
seq(@expression, "<<", @expression),
seq(@expression, "&", @expression),
seq(@expression, "|", @expression))
ternary: -> prec(-1, seq(
@expression, "?", @expression, ":", @expression))
math_op: -> choice(
prec(2, seq("-", @expression)),
prec(2, seq("+", @expression)),
seq(@expression, "++"),
seq(@expression, "--"),
seq(@expression, "+", @expression),

@ -1,5 +1,5 @@
============================================
Bad statements
Invalid statements
============================================
what the heck is this
@ -20,7 +20,7 @@ if (x) {
(var_declaration (var_assignment (identifier) (identifier))))))
============================================
Bad if conditions
Invalid if conditions
============================================
if (%$&^)
@ -34,3 +34,53 @@ okWhatever();
(if_statement (ERROR '%')
(expression_statement (function_call (identifier))))
(expression_statement (function_call (identifier))))
============================================
Invalid statement blocks
============================================
function() { ^ & * }
---
(program
(expression_statement (function (statement_block (ERROR '^')))))
============================================
Invalid objects
============================================
x = {
key1: value1,
abc efg,
key2: value2
};
---
(program (expression_statement (assignment
(identifier)
(object
(pair (identifier) (identifier))
(ERROR 'e')
(pair (identifier) (expression (identifier)))))))
============================================
Invalid items in var declarations
============================================
var
a = 1,
-b,
c = 2,
d = = = = =,
e;
---
(program (var_declaration
(var_assignment (identifier) (number))
(ERROR '-')
(var_assignment (identifier) (number))
(ERROR '=')
(identifier)))

@ -30,10 +30,12 @@ Variables
theVar;
theVar2;
$_;
---
(program
(expression_statement (identifier))
(expression_statement (identifier))
(expression_statement (identifier)))
@ -187,6 +189,8 @@ i++;
i--;
i + j;
i - j;
+x;
-x;
---
@ -194,7 +198,9 @@ i - j;
(expression_statement (math_op (identifier)))
(expression_statement (math_op (identifier)))
(expression_statement (math_op (identifier) (identifier)))
(expression_statement (math_op (identifier) (identifier))))
(expression_statement (math_op (identifier) (identifier)))
(expression_statement (math_op (identifier)))
(expression_statement (math_op (identifier))))
============================================
Boolean operators
@ -202,12 +208,37 @@ Boolean operators
i || j;
i && j;
!a && !b || !c && !d;
---
(program
(expression_statement (bool_op (identifier) (identifier)))
(expression_statement (bool_op (identifier) (identifier))))
(expression_statement (bool_op (identifier) (identifier)))
(expression_statement (bool_op
(bool_op
(bool_op (identifier))
(bool_op (identifier)))
(bool_op
(bool_op (identifier))
(bool_op (identifier))))))
============================================
Bitwise operators
============================================
i >> j;
i << j;
i & j;
i | j;
---
(program
(expression_statement (bitwise_op (identifier) (identifier)))
(expression_statement (bitwise_op (identifier) (identifier)))
(expression_statement (bitwise_op (identifier) (identifier)))
(expression_statement (bitwise_op (identifier) (identifier))))
============================================
Relational operators

@ -95,6 +95,19 @@ for (item in items)
(for_in_statement (identifier) (identifier)
(expression_statement (function_call (identifier) (arguments (identifier))))))
============================================
While statements
============================================
while (a)
b();
---
(program
(while_statement (identifier)
(expression_statement (function_call (identifier)))))
============================================
Return statements
============================================
@ -211,3 +224,29 @@ throw new Error("uh oh");
(program
(throw_statement
(constructor_call (identifier) (arguments (string)))))
============================================
Try catch finally statements
============================================
try { a; } catch (b) { c; }
try { d; } finally { e; }
try { f; } catch { g; } finally { h; }
---
(program
(try_statement
(statement_block (expression_statement (identifier)))
(catch (identifier)
(statement_block (expression_statement (identifier)))))
(try_statement
(statement_block (expression_statement (identifier)))
(finally
(statement_block (expression_statement (identifier)))))
(try_statement
(statement_block (expression_statement (identifier)))
(catch
(statement_block (expression_statement (identifier))))
(finally
(statement_block (expression_statement (identifier))))))