Add constructor calls

pull/70/head
Max Brunsfeld 2014-08-25 17:46:15 +07:00
parent 0554ae719f
commit f9ecf791a3
3 changed files with 66 additions and 32 deletions

@ -1,8 +1,11 @@
compiler = require("tree-sitter-compiler")
{ blank, choice, repeat, seq, sym, keyword, token, optional } = compiler.rules
{ choice, repeat, seq, sym, keyword, token, optional, prec } = compiler.rules
commaSep1 = (rule) ->
seq(rule, repeat(seq(",", rule)))
commaSep = (rule) ->
choice(blank(), seq(rule, repeat(seq(",", rule))))
optional(commaSep1(rule))
terminator = ->
choice(";", sym("_line_break"))
@ -112,6 +115,7 @@ module.exports = compiler.grammar
@member_access,
@subscript_access,
@function_call,
@constructor_call,
@bool_op,
@math_op,
@rel_op,
@ -123,34 +127,45 @@ module.exports = compiler.grammar
function_call: -> seq(
@expression,
"(",
commaSep(@expression),
optional(@arguments),
")")
member_access: -> seq(
constructor_call: -> prec(1, seq(
keyword("new"),
@expression,
optional(seq(
"(",
optional(@arguments),
")"))))
arguments: ->
commaSep1(@expression)
member_access: -> prec(10, seq(
@expression,
".",
@identifier)
@identifier))
member_assignment: -> seq(
@expression,
".",
@identifier,
"=",
@expression)
member_assignment: -> prec(10, seq(
@expression,
".",
@identifier,
"=",
@expression))
subscript_access: -> seq(
subscript_access: -> prec(10, seq(
@expression,
"[",
@expression,
"]")
"]"))
subscript_assignment: -> seq(
subscript_assignment: -> prec(10, seq(
@expression,
"[",
@expression,
"]",
"=",
@expression)
@expression))
object: -> seq(
"{",
@ -164,13 +179,12 @@ module.exports = compiler.grammar
function: -> seq(
keyword("function"),
@formal_parameters,
optional(@identifier),
"(", optional(@formal_parameters), ")",
@statement_block)
formal_parameters: -> seq(
"(",
commaSep(@identifier),
")")
formal_parameters: ->
commaSep1(@identifier)
statement_block: -> seq(
"{",

@ -113,15 +113,19 @@ function() {};
function(arg1, arg2) {
arg2;
};
function stuff() {}
---
(program
(expression_statement (function (formal_parameters) (statement_block)))
(expression_statement (function (statement_block)))
(expression_statement (function
(formal_parameters (identifier) (identifier))
(statement_block
(expression_statement (identifier))))))
(expression_statement (identifier)))))
(expression_statement (function
(identifier)
(statement_block))))
============================================
Property access
@ -150,9 +154,25 @@ x.someMethod(arg1, "arg2");
(program
(expression_statement (function_call
(member_access (identifier) (identifier))
(identifier) (string)))
(arguments (identifier) (string))))
(expression_statement (function_call
(expression (function (formal_parameters) (statement_block))))))
(expression (function (statement_block))))))
============================================
Constructor calls
============================================
new module.Klass(1, "two");
new Thing;
---
(program
(expression_statement (constructor_call
(member_access (identifier) (identifier))
(arguments (number) (string))))
(expression_statement (constructor_call
(identifier))))
============================================
Math operators

@ -15,13 +15,13 @@ if (a.b) {
(program
(if_statement (identifier)
(expression_statement (function_call
(identifier) (identifier))))
(identifier) (arguments (identifier)))))
(if_statement (member_access (identifier) (identifier))
(statement_block
(expression_statement (function_call
(identifier) (identifier)))
(identifier) (arguments (identifier))))
(expression_statement (function_call
(identifier) (identifier))))))
(identifier) (arguments (identifier)))))))
============================================
For statements
@ -41,11 +41,11 @@ for (;;) {
(var_assignment (identifier) (number))
(rel_op (identifier) (number))
(math_op (identifier))
(expression_statement (function_call (identifier) (identifier))))
(expression_statement (function_call (identifier) (arguments (identifier)))))
(for_statement
(statement_block
(expression_statement (function_call (identifier) (identifier))))))
(expression_statement (function_call (identifier) (arguments (identifier)))))))
============================================
For-in statements
@ -61,9 +61,9 @@ for (item in items)
(program
(for_in_statement (identifier) (identifier)
(expression_statement (function_call (identifier) (identifier))))
(expression_statement (function_call (identifier) (arguments (identifier)))))
(for_in_statement (identifier) (identifier)
(expression_statement (function_call (identifier) (identifier)))))
(expression_statement (function_call (identifier) (arguments (identifier))))))
============================================
Return statements
@ -118,7 +118,7 @@ Comments
(comment)
(pair (identifier) (number))
(comment)
(pair (identifier) (function (formal_parameters) (statement_block))))))
(pair (identifier) (function (statement_block))))))
============================================
Automatic semicolon insertion