From 8eb4bd5ac56c8a8ea3e3e30b9887ebde54cc0d5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Thu, 28 Dec 2023 14:51:42 +0100 Subject: [PATCH] Fix conflict between comparison & compound operators Everyone makes mistakes. --- .../secondary/infix/assignment_with_infix.lua | 38 ++++++++++--------- parser/expression/secondary/init.lua | 4 +- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/parser/expression/secondary/infix/assignment_with_infix.lua b/parser/expression/secondary/infix/assignment_with_infix.lua index 5a897cb..e11a0f6 100644 --- a/parser/expression/secondary/infix/assignment_with_infix.lua +++ b/parser/expression/secondary/infix/assignment_with_infix.lua @@ -5,31 +5,35 @@ local assignment = require("parser.expression.secondary.infix.assignment") local assignment_call = require("parser.expression.secondary.infix.assignment_call") local infixes = require("common").regular_operators.infixes +local operator_priority = require("common").operator_priority local generated = {} for _, infix in ipairs(infixes) do - local operator = infix[1].."=" + local compound_operator = infix[1].."=" local identifier = "_=_" local infix_identifier = "_"..infix[1].."_" - table.insert(generated, assignment { - operator = operator, - identifier = identifier, - build_ast = function(self, left, right) - right = Call:new(Identifier:new(infix_identifier), ArgumentTuple:new(left, right)) - return assignment.build_ast(self, left, right) - end - }) + -- avoid a lot of unecessary trouble with <= & friends. why would you ever want to use i <= 7 as i = i < 7 anyway. + if not operator_priority["_"..compound_operator.."_"] then + table.insert(generated, assignment { + operator = compound_operator, + identifier = identifier, + build_ast = function(self, left, right) + right = Call:new(Identifier:new(infix_identifier), ArgumentTuple:new(left, right)) + return assignment.build_ast(self, left, right) + end + }) - table.insert(generated, assignment_call { - operator = operator, - identifier = identifier, - build_ast = function(self, left, right) - right = Call:new(Identifier:new(infix_identifier), ArgumentTuple:new(left, right)) - return assignment_call.build_ast(self, left, right) - end - }) + table.insert(generated, assignment_call { + operator = compound_operator, + identifier = identifier, + build_ast = function(self, left, right) + right = Call:new(Identifier:new(infix_identifier), ArgumentTuple:new(left, right)) + return assignment_call.build_ast(self, left, right) + end + }) + end end return generated diff --git a/parser/expression/secondary/init.lua b/parser/expression/secondary/init.lua index e7426b2..a249870 100644 --- a/parser/expression/secondary/init.lua +++ b/parser/expression/secondary/init.lua @@ -62,8 +62,8 @@ local secondaries = { } -- add generated assignement+infix operator combos, before the rest -local assignment_operators = r("infix.assignment_with_infix") -for i, op in ipairs(assignment_operators) do +local compound_assignments = r("infix.assignment_with_infix") +for i, op in ipairs(compound_assignments) do table.insert(secondaries, i, op) end