From dcef792c319b7d0078ac96620c369213af9f779e Mon Sep 17 00:00:00 2001 From: Alex Manning Date: Fri, 19 Jul 2024 09:52:47 -0400 Subject: [PATCH 1/2] Support Int/Float operators in guard expressions Closes #90 --- grammar.js | 10 ++++- test/corpus/guard_expressions.txt | 73 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 test/corpus/guard_expressions.txt diff --git a/grammar.js b/grammar.js index 96f12b7..f43f39f 100644 --- a/grammar.js +++ b/grammar.js @@ -455,7 +455,15 @@ module.exports = grammar({ binaryExpr(prec.left, 4, ">", $._case_clause_guard_expression), binaryExpr(prec.left, 4, ">=", $._case_clause_guard_expression), binaryExpr(prec.left, 4, ">.", $._case_clause_guard_expression), - binaryExpr(prec.left, 4, ">=.", $._case_clause_guard_expression) + binaryExpr(prec.left, 4, ">=.", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "+", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "+.", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "-", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "-.", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "*", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "*.", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "/", $._case_clause_guard_expression), + binaryExpr(prec.left, 5, "/.", $._case_clause_guard_expression) ), _case_clause_guard_unit: ($) => choice( diff --git a/test/corpus/guard_expressions.txt b/test/corpus/guard_expressions.txt new file mode 100644 index 0000000..17fad1e --- /dev/null +++ b/test/corpus/guard_expressions.txt @@ -0,0 +1,73 @@ +================================================================================ +Guard Expressions +================================================================================ + +case value { + n if n + 1 > 10 -> True + n if n / 2 < 5 -> False +} + +case value { + n if n -. 1.0 <. 10.0 -> True + n if n *. 2 >. 5 -> False +} + +-------------------------------------------------------------------------------- + +(source_file + (case + (case_subjects + (identifier)) + (case_clauses + (case_clause + (case_clause_patterns + (case_clause_pattern + (identifier))) + (case_clause_guard + (binary_expression + (binary_expression + (identifier) + (integer)) + (integer))) + (record + (constructor_name))) + (case_clause + (case_clause_patterns + (case_clause_pattern + (identifier))) + (case_clause_guard + (binary_expression + (binary_expression + (identifier) + (integer)) + (integer))) + (record + (constructor_name))))) + (case + (case_subjects + (identifier)) + (case_clauses + (case_clause + (case_clause_patterns + (case_clause_pattern + (identifier))) + (case_clause_guard + (binary_expression + (binary_expression + (identifier) + (float)) + (float))) + (record + (constructor_name))) + (case_clause + (case_clause_patterns + (case_clause_pattern + (identifier))) + (case_clause_guard + (binary_expression + (binary_expression + (identifier) + (integer)) + (integer))) + (record + (constructor_name)))))) From c3f17c21761cb30d265eb6f82314d84a88165085 Mon Sep 17 00:00:00 2001 From: Alex Manning Date: Fri, 19 Jul 2024 11:57:03 -0400 Subject: [PATCH 2/2] pemdas --- grammar.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/grammar.js b/grammar.js index f43f39f..f8acc0b 100644 --- a/grammar.js +++ b/grammar.js @@ -460,10 +460,10 @@ module.exports = grammar({ binaryExpr(prec.left, 5, "+.", $._case_clause_guard_expression), binaryExpr(prec.left, 5, "-", $._case_clause_guard_expression), binaryExpr(prec.left, 5, "-.", $._case_clause_guard_expression), - binaryExpr(prec.left, 5, "*", $._case_clause_guard_expression), - binaryExpr(prec.left, 5, "*.", $._case_clause_guard_expression), - binaryExpr(prec.left, 5, "/", $._case_clause_guard_expression), - binaryExpr(prec.left, 5, "/.", $._case_clause_guard_expression) + binaryExpr(prec.left, 6, "*", $._case_clause_guard_expression), + binaryExpr(prec.left, 6, "*.", $._case_clause_guard_expression), + binaryExpr(prec.left, 6, "/", $._case_clause_guard_expression), + binaryExpr(prec.left, 6, "/.", $._case_clause_guard_expression) ), _case_clause_guard_unit: ($) => choice(