diff --git a/grammar.coffee b/grammar.coffee index cde7da8cf..cab9e22be 100644 --- a/grammar.coffee +++ b/grammar.coffee @@ -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( "{", diff --git a/grammar_test/expressions.txt b/grammar_test/expressions.txt index f0700823f..63ef189dc 100644 --- a/grammar_test/expressions.txt +++ b/grammar_test/expressions.txt @@ -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 diff --git a/grammar_test/statements.txt b/grammar_test/statements.txt index a9cc9b7d3..98383c700 100644 --- a/grammar_test/statements.txt +++ b/grammar_test/statements.txt @@ -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