From 137bfe48caed8c5fd892c055491004e98243386c Mon Sep 17 00:00:00 2001 From: WerWolv Date: Mon, 7 Feb 2022 21:37:10 +0100 Subject: [PATCH] pattern: Fixed precedence of comparison operators --- .../include/hex/pattern_language/parser.hpp | 8 +- .../source/pattern_language/parser.cpp | 78 +++++++++---------- 2 files changed, 44 insertions(+), 42 deletions(-) diff --git a/lib/libimhex/include/hex/pattern_language/parser.hpp b/lib/libimhex/include/hex/pattern_language/parser.hpp index 1dd16d543..dacfa7152 100644 --- a/lib/libimhex/include/hex/pattern_language/parser.hpp +++ b/lib/libimhex/include/hex/pattern_language/parser.hpp @@ -79,14 +79,14 @@ namespace hex::pl { ASTNode *parseMultiplicativeExpression(); ASTNode *parseAdditiveExpression(); ASTNode *parseShiftExpression(); - ASTNode *parseRelationExpression(); - ASTNode *parseEqualityExpression(); ASTNode *parseBinaryAndExpression(); ASTNode *parseBinaryXorExpression(); ASTNode *parseBinaryOrExpression(); ASTNode *parseBooleanAnd(); ASTNode *parseBooleanXor(); ASTNode *parseBooleanOr(); + ASTNode *parseRelationExpression(); + ASTNode *parseEqualityExpression(); ASTNode *parseTernaryConditional(); ASTNode *parseMathematicalExpression(); @@ -149,7 +149,9 @@ namespace hex::pl { /* Token consuming */ - enum class Setting { }; + enum class Setting + { + }; constexpr static auto Normal = static_cast(0); constexpr static auto Not = static_cast(1); diff --git a/lib/libimhex/source/pattern_language/parser.cpp b/lib/libimhex/source/pattern_language/parser.cpp index ef99db0a6..aeb52a0c3 100644 --- a/lib/libimhex/source/pattern_language/parser.cpp +++ b/lib/libimhex/source/pattern_language/parser.cpp @@ -250,46 +250,14 @@ namespace hex::pl { return node; } - // (parseAdditiveExpression) < >=|<=|>|< > (parseAdditiveExpression) - ASTNode *Parser::parseRelationExpression() { + // (parseShiftExpression) & (parseShiftExpression) + ASTNode *Parser::parseBinaryAndExpression() { auto node = this->parseShiftExpression(); auto nodeCleanup = SCOPE_GUARD { delete node; }; - while (MATCHES(sequence(OPERATOR_BOOLGREATERTHAN) || sequence(OPERATOR_BOOLLESSTHAN) || sequence(OPERATOR_BOOLGREATERTHANOREQUALS) || sequence(OPERATOR_BOOLLESSTHANOREQUALS))) { - auto op = getValue(-1); - node = create(new ASTNodeMathematicalExpression(node, this->parseShiftExpression(), op)); - } - - nodeCleanup.release(); - - return node; - } - - // (parseRelationExpression) <==|!=> (parseRelationExpression) - ASTNode *Parser::parseEqualityExpression() { - auto node = this->parseRelationExpression(); - - auto nodeCleanup = SCOPE_GUARD { delete node; }; - - while (MATCHES(sequence(OPERATOR_BOOLEQUALS) || sequence(OPERATOR_BOOLNOTEQUALS))) { - auto op = getValue(-1); - node = create(new ASTNodeMathematicalExpression(node, this->parseRelationExpression(), op)); - } - - nodeCleanup.release(); - - return node; - } - - // (parseEqualityExpression) & (parseEqualityExpression) - ASTNode *Parser::parseBinaryAndExpression() { - auto node = this->parseEqualityExpression(); - - auto nodeCleanup = SCOPE_GUARD { delete node; }; - while (MATCHES(sequence(OPERATOR_BITAND))) { - node = create(new ASTNodeMathematicalExpression(node, this->parseEqualityExpression(), Token::Operator::BitAnd)); + node = create(new ASTNodeMathematicalExpression(node, this->parseShiftExpression(), Token::Operator::BitAnd)); } nodeCleanup.release(); @@ -372,19 +340,51 @@ namespace hex::pl { return node; } - // (parseBooleanOr) ? (parseBooleanOr) : (parseBooleanOr) - ASTNode *Parser::parseTernaryConditional() { + // (parseBooleanOr) < >=|<=|>|< > (parseBooleanOr) + ASTNode *Parser::parseRelationExpression() { auto node = this->parseBooleanOr(); auto nodeCleanup = SCOPE_GUARD { delete node; }; + while (MATCHES(sequence(OPERATOR_BOOLGREATERTHAN) || sequence(OPERATOR_BOOLLESSTHAN) || sequence(OPERATOR_BOOLGREATERTHANOREQUALS) || sequence(OPERATOR_BOOLLESSTHANOREQUALS))) { + auto op = getValue(-1); + node = create(new ASTNodeMathematicalExpression(node, this->parseBooleanOr(), op)); + } + + nodeCleanup.release(); + + return node; + } + + // (parseRelationExpression) <==|!=> (parseRelationExpression) + ASTNode *Parser::parseEqualityExpression() { + auto node = this->parseRelationExpression(); + + auto nodeCleanup = SCOPE_GUARD { delete node; }; + + while (MATCHES(sequence(OPERATOR_BOOLEQUALS) || sequence(OPERATOR_BOOLNOTEQUALS))) { + auto op = getValue(-1); + node = create(new ASTNodeMathematicalExpression(node, this->parseRelationExpression(), op)); + } + + nodeCleanup.release(); + + return node; + } + + // (parseEqualityExpression) ? (parseEqualityExpression) : (parseEqualityExpression) + ASTNode *Parser::parseTernaryConditional() { + auto node = this->parseEqualityExpression(); + + auto nodeCleanup = SCOPE_GUARD { delete node; }; + while (MATCHES(sequence(OPERATOR_TERNARYCONDITIONAL))) { - auto second = this->parseBooleanOr(); + auto second = this->parseEqualityExpression(); if (!MATCHES(sequence(OPERATOR_INHERIT))) throwParserError("expected ':' in ternary expression"); - auto third = this->parseBooleanOr(); + auto third = this->parseEqualityExpression(); node = create(new ASTNodeTernaryExpression(node, second, third, Token::Operator::TernaryConditional)); }