diff --git a/lib/libimhex/include/hex/pattern_language/ast_node.hpp b/lib/libimhex/include/hex/pattern_language/ast_node.hpp index f4b1fe188..7be236ea3 100644 --- a/lib/libimhex/include/hex/pattern_language/ast_node.hpp +++ b/lib/libimhex/include/hex/pattern_language/ast_node.hpp @@ -2115,11 +2115,20 @@ namespace hex::pl { return this->m_rvalue; } + [[nodiscard]] std::vector createPatterns(Evaluator *evaluator) const override { + this->execute(evaluator); + + return { }; + } + FunctionResult execute(Evaluator *evaluator) const override { auto literal = dynamic_cast(this->getRValue()->evaluate(evaluator)); ON_SCOPE_EXIT { delete literal; }; - evaluator->setVariable(this->getLValueName(), literal->getValue()); + if (this->getLValueName() == "$") + evaluator->dataOffset() = Token::literalToUnsigned(literal->getValue()); + else + evaluator->setVariable(this->getLValueName(), literal->getValue()); return {}; } diff --git a/lib/libimhex/source/pattern_language/parser.cpp b/lib/libimhex/source/pattern_language/parser.cpp index 4678e3490..de071a686 100644 --- a/lib/libimhex/source/pattern_language/parser.cpp +++ b/lib/libimhex/source/pattern_language/parser.cpp @@ -491,6 +491,8 @@ namespace hex::pl { if (MATCHES(sequence(IDENTIFIER, OPERATOR_ASSIGNMENT))) statement = parseFunctionVariableAssignment(); + else if (MATCHES(sequence(OPERATOR_DOLLAR, OPERATOR_ASSIGNMENT))) + statement = create(new ASTNodeAssignment("$", parseMathematicalExpression())); else if (MATCHES(oneOf(KEYWORD_RETURN, KEYWORD_BREAK, KEYWORD_CONTINUE))) statement = parseFunctionControlFlowStatement(); else if (MATCHES(sequence(KEYWORD_IF, SEPARATOR_ROUNDBRACKETOPEN))) { @@ -877,6 +879,8 @@ namespace hex::pl { member = new ASTNodeControlFlowStatement(ControlFlowStatement::Break, nullptr); else if (MATCHES(sequence(KEYWORD_CONTINUE))) member = new ASTNodeControlFlowStatement(ControlFlowStatement::Continue, nullptr); + else if (MATCHES(sequence(OPERATOR_DOLLAR, OPERATOR_ASSIGNMENT))) + member = create(new ASTNodeAssignment("$", parseMathematicalExpression())); else throwParseError("invalid struct member", 0);