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") 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) -> commaSep = (rule) ->
choice(blank(), seq(rule, repeat(seq(",", rule)))) optional(commaSep1(rule))
terminator = -> terminator = ->
choice(";", sym("_line_break")) choice(";", sym("_line_break"))
@ -112,6 +115,7 @@ module.exports = compiler.grammar
@member_access, @member_access,
@subscript_access, @subscript_access,
@function_call, @function_call,
@constructor_call,
@bool_op, @bool_op,
@math_op, @math_op,
@rel_op, @rel_op,
@ -123,34 +127,45 @@ module.exports = compiler.grammar
function_call: -> seq( function_call: -> seq(
@expression, @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, @expression,
".", ".",
@identifier) @identifier))
member_assignment: -> seq( member_assignment: -> prec(10, seq(
@expression, @expression,
".", ".",
@identifier, @identifier,
"=", "=",
@expression) @expression))
subscript_access: -> seq( subscript_access: -> prec(10, seq(
@expression, @expression,
"[", "[",
@expression, @expression,
"]") "]"))
subscript_assignment: -> seq( subscript_assignment: -> prec(10, seq(
@expression, @expression,
"[", "[",
@expression, @expression,
"]", "]",
"=", "=",
@expression) @expression))
object: -> seq( object: -> seq(
"{", "{",
@ -164,13 +179,12 @@ module.exports = compiler.grammar
function: -> seq( function: -> seq(
keyword("function"), keyword("function"),
@formal_parameters, optional(@identifier),
"(", optional(@formal_parameters), ")",
@statement_block) @statement_block)
formal_parameters: -> seq( formal_parameters: ->
"(", commaSep1(@identifier)
commaSep(@identifier),
")")
statement_block: -> seq( statement_block: -> seq(
"{", "{",

@ -113,15 +113,19 @@ function() {};
function(arg1, arg2) { function(arg1, arg2) {
arg2; arg2;
}; };
function stuff() {}
--- ---
(program (program
(expression_statement (function (formal_parameters) (statement_block))) (expression_statement (function (statement_block)))
(expression_statement (function (expression_statement (function
(formal_parameters (identifier) (identifier)) (formal_parameters (identifier) (identifier))
(statement_block (statement_block
(expression_statement (identifier)))))) (expression_statement (identifier)))))
(expression_statement (function
(identifier)
(statement_block))))
============================================ ============================================
Property access Property access
@ -150,9 +154,25 @@ x.someMethod(arg1, "arg2");
(program (program
(expression_statement (function_call (expression_statement (function_call
(member_access (identifier) (identifier)) (member_access (identifier) (identifier))
(identifier) (string))) (arguments (identifier) (string))))
(expression_statement (function_call (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 Math operators

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