From 3f6069b9a5d89adfd51a4e49e87c4495baf2809b Mon Sep 17 00:00:00 2001 From: Anthony Stewart Date: Wed, 2 Jul 2025 23:25:13 -0500 Subject: [PATCH] Updated binary parsing to be right-associative. Fixed PopulateExpressionValues bug. --- .../Enhancements/randomizer/logic_expression.cpp | 15 +++------------ .../randomizer/randomizer_logic_tracker.cpp | 3 ++- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/soh/soh/Enhancements/randomizer/logic_expression.cpp b/soh/soh/Enhancements/randomizer/logic_expression.cpp index e5962a0a8..a0f859c66 100644 --- a/soh/soh/Enhancements/randomizer/logic_expression.cpp +++ b/soh/soh/Enhancements/randomizer/logic_expression.cpp @@ -230,37 +230,28 @@ class Parser { std::shared_ptr ParseBinaryOp(size_t& pos, const std::vector& tokens, LowerFunc lowerFunc, const std::vector>& operators) { - size_t initial_pos = pos; auto left = (this->*lowerFunc)(); - while (pos < tokens.size() && tokens[pos].Type == LETokenType::Operator) { - bool matched = false; + if (pos < tokens.size() && tokens[pos].Type == LETokenType::Operator) { for (const auto& [op, exprType] : operators) { if (tokens[pos].Text == op) { ++pos; // consume operator - auto right = (this->*lowerFunc)(); + auto right = ParseBinaryOp(pos, tokens, lowerFunc, operators); auto expr = std::make_shared(); expr->type = exprType; - - // For comparison operators, store the operation if (exprType == LogicExpression::Impl::Type::Comparison) { expr->operation = op; } - expr->children.emplace_back(left); expr->children.back()->parent = expr.get(); expr->children.emplace_back(right); expr->children.back()->parent = expr.get(); expr->startIndex = tokens[initial_pos].StartIndex; expr->endIndex = tokens[pos - 1].EndIndex; - left = expr; - matched = true; - break; + return expr; } } - if (!matched) - break; } return left; } diff --git a/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp b/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp index 34e8ebe59..7bc51a8d1 100644 --- a/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp +++ b/soh/soh/Enhancements/randomizer/randomizer_logic_tracker.cpp @@ -73,8 +73,9 @@ static void PopulateExpressionValues(LogicTrackerCheck::Region::ExpressionRow& r for (auto& rowChild : row.Children) { for (const auto& evalChild : eval.Children) { - if (row.Expression == eval.Expression) { + if (rowChild.Expression == evalChild.Expression) { PopulateExpressionValues(rowChild, evalChild, ageTime); + break; } } }