From 108cdd550f677c3445ac802425e82094e05c213d Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Tue, 12 Apr 2022 09:13:02 -0500 Subject: [PATCH] allow only one stab clause without a right-hand-side MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only one stab clause in a multi-stab-clause expression may be empty. Multiple is a syntax error. Co-authored-by: Jonatan Kłosko --- grammar.js | 42 ++++++++++++++---------------------------- test/corpus/do_end.txt | 9 +++------ 2 files changed, 17 insertions(+), 34 deletions(-) diff --git a/grammar.js b/grammar.js index 0e7f517..3d82e3d 100644 --- a/grammar.js +++ b/grammar.js @@ -159,16 +159,6 @@ module.exports = grammar({ // * stab arguments item in `arg1, left when right ->` [$.binary_operator, $._stab_clause_arguments_without_parentheses], - // Given `( -> • \n`, the newline could be either: - // * stab clause without a body - // * stab clause with a body - [$._stab_clause_without_body, $._stab_clause_with_body], - - // Given `( -> • /`, `/` token could be either: - // * stab clause with a body - // * -> as an operator followed by `/` - [$._stab_clause_with_body, $.operator_identifier], - // Given `((arg1, arg2 • ,`, `arg3` expression can be either: // * stab parenthesised arguments item in `((arg1, arg2, arg3) ->)` // * stab non-parenthesised arguments item in `((arg1, arg2, arg3 ->))` @@ -739,20 +729,13 @@ module.exports = grammar({ ), stab_clause: ($) => - choice($._stab_clause_with_body, $._stab_clause_without_body), - - _stab_clause_with_body: ($) => - seq( - optional(field("left", $._stab_clause_left)), - field("operator", "->"), - field("right", $.body) - ), - - _stab_clause_without_body: ($) => - seq( - optional(field("left", $._stab_clause_left)), - field("operator", "->"), - optional($._terminator) + // Right precedence, because we want to consume body if any + prec.right( + seq( + optional(field("left", $._stab_clause_left)), + field("operator", "->"), + optional(field("right", $.body)) + ) ), _stab_clause_left: ($) => @@ -834,10 +817,13 @@ module.exports = grammar({ ), body: ($) => - seq( - optional($._terminator), - sep1($._expression, $._terminator), - optional($._terminator) + choice( + $._terminator, + seq( + optional($._terminator), + sep1($._expression, $._terminator), + optional($._terminator) + ) ), anonymous_function: ($) => diff --git a/test/corpus/do_end.txt b/test/corpus/do_end.txt index 1fe5b57..5373a51 100644 --- a/test/corpus/do_end.txt +++ b/test/corpus/do_end.txt @@ -684,12 +684,11 @@ end (integer)))))) ===================================== -stab clause / edge cases / empty right-hand-sides +stab clause / edge cases / empty right-hand-side ===================================== fun do x -> - y -> end --- @@ -700,10 +699,8 @@ end (do_block (stab_clause (arguments - (identifier))) - (stab_clause - (arguments - (identifier)))))) + (identifier)) + (body))))) ===================================== pattern matching