Add if and for statements, math and relational operators

pull/70/head
Max Brunsfeld 2014-08-01 08:23:38 +07:00
parent f57aeace7b
commit 2389c52a43
3 changed files with 151 additions and 2 deletions

@ -12,16 +12,27 @@ module.exports = compiler.grammar
statement: -> choice(
@expression_statement,
@if_statement)
@if_statement,
@for_statement,
@statement_block)
expression_statement: -> seq(
@expression, ";")
optional(@expression), ";")
if_statement: -> seq(
keyword("if"),
"(", @expression, ")",
@statement)
for_statement: -> seq(
keyword("for"),
"(",
@expression_statement,
@expression_statement,
optional(@expression),
")",
@statement)
expression: -> choice(
@identifier,
@number,
@ -38,6 +49,9 @@ module.exports = compiler.grammar
@member_access,
@subscript_access,
@function_call,
@math_op,
@rel_op,
@assignment,
seq("(", @expression, ")"))
member_access: -> seq(
@ -51,6 +65,14 @@ module.exports = compiler.grammar
commaSep(@expression),
")")
assignment: -> seq(
choice(
@identifier,
@member_access,
@subscript_access),
"=",
@expression)
subscript_access: -> seq(
@expression,
"[",
@ -91,6 +113,22 @@ module.exports = compiler.grammar
/\d+/,
optional(seq(".", /\d+/))))
math_op: -> choice(
seq(@expression, "++"),
seq(@expression, "--"),
seq(@expression, "+", @expression),
seq(@expression, "-", @expression))
rel_op: -> choice(
seq(@expression, "<", @expression),
seq(@expression, "<=", @expression),
seq(@expression, "==", @expression),
seq(@expression, "===", @expression),
seq(@expression, "!=", @expression),
seq(@expression, "!==", @expression),
seq(@expression, ">=", @expression),
seq(@expression, ">", @expression))
string: -> token(choice(
seq('"', repeat(choice(/[^"]/, '\\"')), '"'),
seq("'", repeat(choice(/[^']/, "\\'")), "'")))

@ -153,3 +153,63 @@ x.someMethod(arg1, "arg2");
(identifier) (string)))
(expression_statement (function_call
(expression (function (formal_parameters) (statement_block))))))
============================================
Math operators
============================================
i++;
i--;
i + j;
i - j;
---
(program
(expression_statement (math_op (identifier)))
(expression_statement (math_op (identifier)))
(expression_statement (math_op (identifier) (identifier)))
(expression_statement (math_op (identifier) (identifier))))
============================================
Relational operators
============================================
x < y;
x <= y;
x == y;
x === y;
x != y;
x !== y;
x >= y;
x > y;
---
(program
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier)))
(expression_statement (rel_op (identifier) (identifier))))
==============================================
Assignments
==============================================
x = 0;
x.y = 0;
x["y"] = 0;
---
(program
(expression_statement (assignment
(identifier) (number)))
(expression_statement (assignment
(member_access (identifier) (identifier)) (number)))
(expression_statement (assignment
(subscript_access (identifier) (string)) (number))))

@ -0,0 +1,51 @@
============================================
If statements
============================================
if (x)
log(y);
if (a.b) {
log(c);
log(d);
}
----
(program
(if_statement (identifier)
(expression_statement (function_call
(identifier) (identifier))))
(if_statement (member_access (identifier) (identifier))
(statement_block
(expression_statement (function_call
(identifier) (identifier)))
(expression_statement (function_call
(identifier) (identifier))))))
============================================
For statements
============================================
for (i = 0; i < 10; i++)
log(y);
for (;;) {
log(y);
}
---
(program
(for_statement
(expression_statement (assignment (identifier) (number)))
(expression_statement (rel_op (identifier) (number)))
(math_op (identifier))
(expression_statement (function_call (identifier) (identifier))))
(for_statement
(expression_statement)
(expression_statement)
(statement_block
(expression_statement (function_call (identifier) (identifier))))))