mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-20 11:47:55 -05:00
Reformat code with clang format
This commit is contained in:
@ -1,14 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Utils/ClassUtils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleExpressionValue;
|
||||
|
||||
class ISimpleExpressionScopeValues
|
||||
{
|
||||
protected:
|
||||
ISimpleExpressionScopeValues() = default;
|
||||
|
||||
public:
|
||||
virtual ~ISimpleExpressionScopeValues() = default;
|
||||
ISimpleExpressionScopeValues(const ISimpleExpressionScopeValues& other) = default;
|
||||
@ -23,6 +25,7 @@ class ISimpleExpression
|
||||
{
|
||||
protected:
|
||||
ISimpleExpression() = default;
|
||||
|
||||
public:
|
||||
virtual ~ISimpleExpression() = default;
|
||||
ISimpleExpression(const ISimpleExpression& other) = default;
|
||||
@ -37,4 +40,4 @@ public:
|
||||
};
|
||||
|
||||
// Include SimpleExpressionValue after definition to avoid "base class not defined"
|
||||
#include "SimpleExpressionValue.h"
|
||||
#include "SimpleExpressionValue.h"
|
||||
|
@ -3,7 +3,9 @@
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
|
||||
SimpleExpressionBinaryOperationType::SimpleExpressionBinaryOperationType(const SimpleBinaryOperationId id, std::string syntax, const SimpleOperationPrecedence precedence,
|
||||
SimpleExpressionBinaryOperationType::SimpleExpressionBinaryOperationType(const SimpleBinaryOperationId id,
|
||||
std::string syntax,
|
||||
const SimpleOperationPrecedence precedence,
|
||||
evaluation_function_t evaluationFunction)
|
||||
: m_id(id),
|
||||
m_syntax(std::move(syntax)),
|
||||
@ -47,8 +49,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_SUBTRACT(
|
||||
SimpleBinaryOperationId::SUBTRACT,
|
||||
@ -72,8 +73,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_MULTIPLY(
|
||||
SimpleBinaryOperationId::MULTIPLY,
|
||||
@ -97,8 +97,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_DIVIDE(
|
||||
SimpleBinaryOperationId::DIVIDE,
|
||||
@ -122,8 +121,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_REMAINDER(
|
||||
SimpleBinaryOperationId::REMAINDER,
|
||||
@ -135,8 +133,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
return SimpleExpressionValue(operand1.m_int_value % operand2.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_BITWISE_AND(
|
||||
SimpleBinaryOperationId::BITWISE_AND,
|
||||
@ -148,8 +145,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
return SimpleExpressionValue(operand1.m_int_value & operand2.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_BITWISE_OR(
|
||||
SimpleBinaryOperationId::BITWISE_OR,
|
||||
@ -161,8 +157,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
return SimpleExpressionValue(operand1.m_int_value | operand2.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_SHIFT_LEFT(
|
||||
SimpleBinaryOperationId::SHIFT_LEFT,
|
||||
@ -174,8 +169,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
return SimpleExpressionValue(operand1.m_int_value << operand2.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_SHIFT_RIGHT(
|
||||
SimpleBinaryOperationId::SHIFT_RIGHT,
|
||||
@ -187,8 +181,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
return SimpleExpressionValue(operand1.m_int_value >> operand2.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_GREATER_THAN(
|
||||
SimpleBinaryOperationId::GREATER_THAN,
|
||||
@ -215,8 +208,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_GREATER_EQUAL_THAN(
|
||||
SimpleBinaryOperationId::GREATER_EQUAL_THAN,
|
||||
@ -243,8 +235,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_LESS_THAN(
|
||||
SimpleBinaryOperationId::LESS_THAN,
|
||||
@ -271,8 +262,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_LESS_EQUAL_THAN(
|
||||
SimpleBinaryOperationId::LESS_EQUAL_THAN,
|
||||
@ -299,8 +289,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_EQUALS(
|
||||
SimpleBinaryOperationId::EQUALS,
|
||||
@ -337,8 +326,7 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_NOT_EQUAL(
|
||||
SimpleBinaryOperationId::NOT_EQUAL,
|
||||
@ -375,35 +363,31 @@ const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::O
|
||||
}
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_AND(
|
||||
SimpleBinaryOperationId::AND,
|
||||
"&&",
|
||||
SimpleOperationPrecedence::LOGICAL_AND,
|
||||
[](const SimpleExpressionValue& operand1, const SimpleExpressionValue& operand2) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand1.IsTruthy())
|
||||
return operand2;
|
||||
return operand1;
|
||||
}
|
||||
);
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_AND(SimpleBinaryOperationId::AND,
|
||||
"&&",
|
||||
SimpleOperationPrecedence::LOGICAL_AND,
|
||||
[](const SimpleExpressionValue& operand1,
|
||||
const SimpleExpressionValue& operand2) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand1.IsTruthy())
|
||||
return operand2;
|
||||
return operand1;
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_OR(
|
||||
SimpleBinaryOperationId::OR,
|
||||
"||",
|
||||
SimpleOperationPrecedence::LOGICAL_OR,
|
||||
[](const SimpleExpressionValue& operand1, const SimpleExpressionValue& operand2) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand1.IsTruthy())
|
||||
return operand1;
|
||||
return operand2;
|
||||
}
|
||||
);
|
||||
const SimpleExpressionBinaryOperationType SimpleExpressionBinaryOperationType::OPERATION_OR(SimpleBinaryOperationId::OR,
|
||||
"||",
|
||||
SimpleOperationPrecedence::LOGICAL_OR,
|
||||
[](const SimpleExpressionValue& operand1,
|
||||
const SimpleExpressionValue& operand2) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand1.IsTruthy())
|
||||
return operand1;
|
||||
return operand2;
|
||||
});
|
||||
|
||||
const SimpleExpressionBinaryOperationType* const SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[static_cast<int>(SimpleBinaryOperationId::COUNT)]
|
||||
{
|
||||
const SimpleExpressionBinaryOperationType* const SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[static_cast<int>(SimpleBinaryOperationId::COUNT)]{
|
||||
&OPERATION_ADD,
|
||||
&OPERATION_SUBTRACT,
|
||||
&OPERATION_MULTIPLY,
|
||||
@ -420,10 +404,10 @@ const SimpleExpressionBinaryOperationType* const SimpleExpressionBinaryOperation
|
||||
&OPERATION_EQUALS,
|
||||
&OPERATION_NOT_EQUAL,
|
||||
&OPERATION_AND,
|
||||
&OPERATION_OR
|
||||
};
|
||||
&OPERATION_OR};
|
||||
|
||||
SimpleExpressionBinaryOperation::SimpleExpressionBinaryOperation(const SimpleExpressionBinaryOperationType* operationType, std::unique_ptr<ISimpleExpression> operand1,
|
||||
SimpleExpressionBinaryOperation::SimpleExpressionBinaryOperation(const SimpleExpressionBinaryOperationType* operationType,
|
||||
std::unique_ptr<ISimpleExpression> operand1,
|
||||
std::unique_ptr<ISimpleExpression> operand2)
|
||||
: m_operation_type(operationType),
|
||||
m_operand1(std::move(operand1)),
|
||||
@ -447,10 +431,8 @@ bool SimpleExpressionBinaryOperation::Equals(const ISimpleExpression* other) con
|
||||
{
|
||||
const auto* otherBinaryOperation = dynamic_cast<const SimpleExpressionBinaryOperation*>(other);
|
||||
|
||||
return otherBinaryOperation
|
||||
&& m_operation_type->m_id == otherBinaryOperation->m_operation_type->m_id
|
||||
&& m_operand1->Equals(otherBinaryOperation->m_operand1.get())
|
||||
&& m_operand2->Equals(otherBinaryOperation->m_operand2.get());
|
||||
return otherBinaryOperation && m_operation_type->m_id == otherBinaryOperation->m_operation_type->m_id
|
||||
&& m_operand1->Equals(otherBinaryOperation->m_operand1.get()) && m_operand2->Equals(otherBinaryOperation->m_operand2.get());
|
||||
}
|
||||
|
||||
bool SimpleExpressionBinaryOperation::IsStatic() const
|
||||
|
@ -1,12 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
#include "ISimpleExpression.h"
|
||||
#include "SimpleExpressionValue.h"
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
// https://en.cppreference.com/w/cpp/language/operator_precedence
|
||||
enum class SimpleOperationPrecedence
|
||||
{
|
||||
@ -55,7 +55,10 @@ public:
|
||||
evaluation_function_t m_evaluation_function;
|
||||
|
||||
private:
|
||||
SimpleExpressionBinaryOperationType(SimpleBinaryOperationId id, std::string syntax, SimpleOperationPrecedence precedence, evaluation_function_t evaluationFunction);
|
||||
SimpleExpressionBinaryOperationType(SimpleBinaryOperationId id,
|
||||
std::string syntax,
|
||||
SimpleOperationPrecedence precedence,
|
||||
evaluation_function_t evaluationFunction);
|
||||
|
||||
public:
|
||||
static const SimpleExpressionBinaryOperationType OPERATION_ADD;
|
||||
@ -87,8 +90,8 @@ public:
|
||||
std::unique_ptr<ISimpleExpression> m_operand2;
|
||||
|
||||
SimpleExpressionBinaryOperation(const SimpleExpressionBinaryOperationType* operationType,
|
||||
std::unique_ptr<ISimpleExpression> operand1,
|
||||
std::unique_ptr<ISimpleExpression> operand2);
|
||||
std::unique_ptr<ISimpleExpression> operand1,
|
||||
std::unique_ptr<ISimpleExpression> operand2);
|
||||
|
||||
_NODISCARD bool Operand1NeedsParenthesis() const;
|
||||
_NODISCARD bool Operand2NeedsParenthesis() const;
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include "SimpleExpressionConditionalOperator.h"
|
||||
|
||||
SimpleExpressionConditionalOperator::SimpleExpressionConditionalOperator()
|
||||
= default;
|
||||
SimpleExpressionConditionalOperator::SimpleExpressionConditionalOperator() = default;
|
||||
|
||||
SimpleExpressionConditionalOperator::SimpleExpressionConditionalOperator(std::unique_ptr<ISimpleExpression> condition, std::unique_ptr<ISimpleExpression> trueExpression,
|
||||
SimpleExpressionConditionalOperator::SimpleExpressionConditionalOperator(std::unique_ptr<ISimpleExpression> condition,
|
||||
std::unique_ptr<ISimpleExpression> trueExpression,
|
||||
std::unique_ptr<ISimpleExpression> falseExpression)
|
||||
: m_condition(std::move(condition)),
|
||||
m_true_value(std::move(trueExpression)),
|
||||
@ -15,10 +15,8 @@ bool SimpleExpressionConditionalOperator::Equals(const ISimpleExpression* other)
|
||||
{
|
||||
const auto* otherConditionalOperator = dynamic_cast<const SimpleExpressionConditionalOperator*>(other);
|
||||
|
||||
return otherConditionalOperator
|
||||
&& m_condition->Equals(otherConditionalOperator->m_condition.get())
|
||||
&& m_true_value->Equals(otherConditionalOperator->m_true_value.get())
|
||||
&& m_false_value->Equals(otherConditionalOperator->m_false_value.get());
|
||||
return otherConditionalOperator && m_condition->Equals(otherConditionalOperator->m_condition.get())
|
||||
&& m_true_value->Equals(otherConditionalOperator->m_true_value.get()) && m_false_value->Equals(otherConditionalOperator->m_false_value.get());
|
||||
}
|
||||
|
||||
bool SimpleExpressionConditionalOperator::IsStatic() const
|
||||
@ -33,7 +31,6 @@ SimpleExpressionValue SimpleExpressionConditionalOperator::EvaluateStatic() cons
|
||||
|
||||
SimpleExpressionValue SimpleExpressionConditionalOperator::EvaluateNonStatic(const ISimpleExpressionScopeValues* scopeValues) const
|
||||
{
|
||||
return m_condition->EvaluateNonStatic(scopeValues).IsTruthy()
|
||||
? m_true_value->EvaluateNonStatic(scopeValues)
|
||||
: m_false_value->EvaluateNonStatic(scopeValues);
|
||||
return m_condition->EvaluateNonStatic(scopeValues).IsTruthy() ? m_true_value->EvaluateNonStatic(scopeValues)
|
||||
: m_false_value->EvaluateNonStatic(scopeValues);
|
||||
}
|
||||
|
@ -14,5 +14,7 @@ public:
|
||||
_NODISCARD SimpleExpressionValue EvaluateNonStatic(const ISimpleExpressionScopeValues* scopeValues) const override;
|
||||
|
||||
SimpleExpressionConditionalOperator();
|
||||
SimpleExpressionConditionalOperator(std::unique_ptr<ISimpleExpression> condition, std::unique_ptr<ISimpleExpression> trueExpression, std::unique_ptr<ISimpleExpression> falseExpression);
|
||||
SimpleExpressionConditionalOperator(std::unique_ptr<ISimpleExpression> condition,
|
||||
std::unique_ptr<ISimpleExpression> trueExpression,
|
||||
std::unique_ptr<ISimpleExpression> falseExpression);
|
||||
};
|
||||
|
@ -1,13 +1,13 @@
|
||||
#include "SimpleExpressionMatchers.h"
|
||||
|
||||
#include "Parsing/Simple/Expression/SimpleExpressionBinaryOperation.h"
|
||||
#include "Parsing/Simple/Expression/SimpleExpressionUnaryOperation.h"
|
||||
#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h"
|
||||
#include "SimpleExpressionConditionalOperator.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <list>
|
||||
|
||||
#include "SimpleExpressionConditionalOperator.h"
|
||||
#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h"
|
||||
#include "Parsing/Simple/Expression/SimpleExpressionBinaryOperation.h"
|
||||
#include "Parsing/Simple/Expression/SimpleExpressionUnaryOperation.h"
|
||||
|
||||
static constexpr int TAG_EXPRESSION = SimpleExpressionMatchers::TAG_OFFSET_EXPRESSION + 1;
|
||||
static constexpr int TAG_OPERAND = SimpleExpressionMatchers::TAG_OFFSET_EXPRESSION + 2;
|
||||
static constexpr int TAG_UNARY_OPERATION = SimpleExpressionMatchers::TAG_OFFSET_EXPRESSION + 3;
|
||||
@ -29,7 +29,10 @@ SimpleExpressionMatchers::SimpleExpressionMatchers()
|
||||
{
|
||||
}
|
||||
|
||||
SimpleExpressionMatchers::SimpleExpressionMatchers(const bool enableStringOperands, const bool enableIdentifierOperands, const bool enableFloatingPointOperands, const bool enableIntOperands,
|
||||
SimpleExpressionMatchers::SimpleExpressionMatchers(const bool enableStringOperands,
|
||||
const bool enableIdentifierOperands,
|
||||
const bool enableFloatingPointOperands,
|
||||
const bool enableIntOperands,
|
||||
const bool enableConditionalOperator)
|
||||
: m_enable_string_operands(enableStringOperands),
|
||||
m_enable_identifier_operands(enableIdentifierOperands),
|
||||
@ -39,8 +42,7 @@ SimpleExpressionMatchers::SimpleExpressionMatchers(const bool enableStringOperan
|
||||
{
|
||||
}
|
||||
|
||||
SimpleExpressionMatchers::~SimpleExpressionMatchers()
|
||||
= default;
|
||||
SimpleExpressionMatchers::~SimpleExpressionMatchers() = default;
|
||||
|
||||
void SimpleExpressionMatchers::ApplyTokensToLexerConfig(SimpleLexer::Config& lexerConfig)
|
||||
{
|
||||
@ -63,14 +65,16 @@ void SimpleExpressionMatchers::ApplyTokensToLexerConfig(SimpleLexer::Config& lex
|
||||
|
||||
std::vector<const SimpleExpressionUnaryOperationType*> SimpleExpressionMatchers::EnabledUnaryOperations() const
|
||||
{
|
||||
return std::vector(&SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[0],
|
||||
&SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[std::extent_v<decltype(SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES)>]);
|
||||
return std::vector(
|
||||
&SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[0],
|
||||
&SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[std::extent_v<decltype(SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES)>]);
|
||||
}
|
||||
|
||||
std::vector<const SimpleExpressionBinaryOperationType*> SimpleExpressionMatchers::EnabledBinaryOperations() const
|
||||
{
|
||||
return std::vector(&SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[0],
|
||||
&SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[std::extent_v<decltype(SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES)>]);
|
||||
return std::vector(
|
||||
&SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[0],
|
||||
&SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES[std::extent_v<decltype(SimpleExpressionBinaryOperationType::ALL_OPERATION_TYPES)>]);
|
||||
}
|
||||
|
||||
std::unique_ptr<ISimpleExpression> SimpleExpressionMatchers::ProcessExpressionInParenthesis(SequenceResult<SimpleParserValue>& result) const
|
||||
@ -83,7 +87,8 @@ std::unique_ptr<ISimpleExpression> SimpleExpressionMatchers::ProcessExpressionIn
|
||||
return processedEvaluation;
|
||||
}
|
||||
|
||||
std::unique_ptr<ISimpleExpression> SimpleExpressionMatchers::ProcessConditionalOperation(std::unique_ptr<ISimpleExpression> condition, SequenceResult<SimpleParserValue>& result) const
|
||||
std::unique_ptr<ISimpleExpression> SimpleExpressionMatchers::ProcessConditionalOperation(std::unique_ptr<ISimpleExpression> condition,
|
||||
SequenceResult<SimpleParserValue>& result) const
|
||||
{
|
||||
auto trueExpression = ProcessExpression(result);
|
||||
|
||||
@ -194,19 +199,21 @@ std::unique_ptr<ISimpleExpression> SimpleExpressionMatchers::ProcessExpression(S
|
||||
throw ParsingException(TokenPos(), "Expected EvaluationTag @ Evaluation");
|
||||
}
|
||||
|
||||
operators.sort([](const std::pair<unsigned, const SimpleExpressionBinaryOperationType*>& p1, const std::pair<unsigned, const SimpleExpressionBinaryOperationType*>& p2)
|
||||
{
|
||||
if (p1.second->m_precedence != p2.second->m_precedence)
|
||||
return p1.second->m_precedence > p2.second->m_precedence;
|
||||
operators.sort(
|
||||
[](const std::pair<unsigned, const SimpleExpressionBinaryOperationType*>& p1, const std::pair<unsigned, const SimpleExpressionBinaryOperationType*>& p2)
|
||||
{
|
||||
if (p1.second->m_precedence != p2.second->m_precedence)
|
||||
return p1.second->m_precedence > p2.second->m_precedence;
|
||||
|
||||
return p1.first > p2.first;
|
||||
});
|
||||
return p1.first > p2.first;
|
||||
});
|
||||
|
||||
while (!operators.empty())
|
||||
{
|
||||
const auto [operatorIndex, operatorType] = operators.back(); // This must not be a reference
|
||||
|
||||
auto operation = std::make_unique<SimpleExpressionBinaryOperation>(operatorType, std::move(operands[operatorIndex]), std::move(operands[operatorIndex + 1]));
|
||||
auto operation =
|
||||
std::make_unique<SimpleExpressionBinaryOperation>(operatorType, std::move(operands[operatorIndex]), std::move(operands[operatorIndex + 1]));
|
||||
operands.erase(operands.begin() + static_cast<int>(operatorIndex));
|
||||
operands[operatorIndex] = std::move(operation);
|
||||
|
||||
@ -256,48 +263,51 @@ std::unique_ptr<SimpleExpressionMatchers::matcher_t> SimpleExpressionMatchers::P
|
||||
{
|
||||
if (enabledBinaryOperation->m_syntax.size() > 1)
|
||||
{
|
||||
binaryOperationsMatchers.emplace_back(
|
||||
create.MultiChar(MULTI_TOKEN_OFFSET_BINARY + static_cast<int>(enabledBinaryOperation->m_id))
|
||||
.Transform([enabledBinaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(), static_cast<int>(enabledBinaryOperation->m_id));
|
||||
}));
|
||||
binaryOperationsMatchers.emplace_back(create.MultiChar(MULTI_TOKEN_OFFSET_BINARY + static_cast<int>(enabledBinaryOperation->m_id))
|
||||
.Transform(
|
||||
[enabledBinaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(),
|
||||
static_cast<int>(enabledBinaryOperation->m_id));
|
||||
}));
|
||||
}
|
||||
else if (!enabledBinaryOperation->m_syntax.empty())
|
||||
{
|
||||
binaryOperationsMatchers.emplace_back(
|
||||
create.Char(enabledBinaryOperation->m_syntax[0])
|
||||
.Transform([enabledBinaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(), static_cast<int>(enabledBinaryOperation->m_id));
|
||||
}));
|
||||
binaryOperationsMatchers.emplace_back(create.Char(enabledBinaryOperation->m_syntax[0])
|
||||
.Transform(
|
||||
[enabledBinaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(),
|
||||
static_cast<int>(enabledBinaryOperation->m_id));
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
const auto hasAddOperation = std::any_of(enabledBinaryOperations.begin(), enabledBinaryOperations.end(), [](const SimpleExpressionBinaryOperationType* type)
|
||||
{
|
||||
return type == &SimpleExpressionBinaryOperationType::OPERATION_ADD;
|
||||
});
|
||||
const auto hasSubtractOperation = std::any_of(enabledBinaryOperations.begin(), enabledBinaryOperations.end(), [](const SimpleExpressionBinaryOperationType* type)
|
||||
{
|
||||
return type == &SimpleExpressionBinaryOperationType::OPERATION_SUBTRACT;
|
||||
});
|
||||
const auto hasAddOperation = std::any_of(enabledBinaryOperations.begin(),
|
||||
enabledBinaryOperations.end(),
|
||||
[](const SimpleExpressionBinaryOperationType* type)
|
||||
{
|
||||
return type == &SimpleExpressionBinaryOperationType::OPERATION_ADD;
|
||||
});
|
||||
const auto hasSubtractOperation = std::any_of(enabledBinaryOperations.begin(),
|
||||
enabledBinaryOperations.end(),
|
||||
[](const SimpleExpressionBinaryOperationType* type)
|
||||
{
|
||||
return type == &SimpleExpressionBinaryOperationType::OPERATION_SUBTRACT;
|
||||
});
|
||||
|
||||
if (hasAddOperation && hasSubtractOperation)
|
||||
{
|
||||
binaryOperationsMatchers.emplace_back(
|
||||
create.Or({
|
||||
create.IntegerWithSign(),
|
||||
create.FloatingPointWithSign()
|
||||
})
|
||||
.NoConsume()
|
||||
.Transform([](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(), static_cast<int>(SimpleBinaryOperationId::ADD));
|
||||
}));
|
||||
binaryOperationsMatchers.emplace_back(create.Or({create.IntegerWithSign(), create.FloatingPointWithSign()})
|
||||
.NoConsume()
|
||||
.Transform(
|
||||
[](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(),
|
||||
static_cast<int>(SimpleBinaryOperationId::ADD));
|
||||
}));
|
||||
}
|
||||
|
||||
|
||||
return create.Or(std::move(binaryOperationsMatchers)).Capture(CAPTURE_BINARY_OPERATION_TYPE);
|
||||
}
|
||||
|
||||
@ -320,21 +330,23 @@ std::unique_ptr<SimpleExpressionMatchers::matcher_t> SimpleExpressionMatchers::P
|
||||
{
|
||||
if (enabledUnaryOperation->m_syntax.size() > 1)
|
||||
{
|
||||
unaryOperationsMatchers.emplace_back(
|
||||
create.MultiChar(MULTI_TOKEN_OFFSET_UNARY + static_cast<int>(enabledUnaryOperation->m_id))
|
||||
.Transform([enabledUnaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(), static_cast<int>(enabledUnaryOperation->m_id));
|
||||
}));
|
||||
unaryOperationsMatchers.emplace_back(create.MultiChar(MULTI_TOKEN_OFFSET_UNARY + static_cast<int>(enabledUnaryOperation->m_id))
|
||||
.Transform(
|
||||
[enabledUnaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(),
|
||||
static_cast<int>(enabledUnaryOperation->m_id));
|
||||
}));
|
||||
}
|
||||
else if (!enabledUnaryOperation->m_syntax.empty())
|
||||
{
|
||||
unaryOperationsMatchers.emplace_back(
|
||||
create.Char(enabledUnaryOperation->m_syntax[0])
|
||||
.Transform([enabledUnaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(), static_cast<int>(enabledUnaryOperation->m_id));
|
||||
}));
|
||||
unaryOperationsMatchers.emplace_back(create.Char(enabledUnaryOperation->m_syntax[0])
|
||||
.Transform(
|
||||
[enabledUnaryOperation](const SimpleMatcherFactory::token_list_t& values)
|
||||
{
|
||||
return SimpleParserValue::Integer(values[0].get().GetPos(),
|
||||
static_cast<int>(enabledUnaryOperation->m_id));
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
@ -348,40 +360,23 @@ std::unique_ptr<SimpleExpressionMatchers::matcher_t> SimpleExpressionMatchers::P
|
||||
if (!m_enable_conditional_operator)
|
||||
return create.False();
|
||||
|
||||
return create.And({
|
||||
create.Char('?').Tag(TAG_CONDITIONAL_OPERATOR),
|
||||
create.Label(LABEL_EXPRESSION),
|
||||
create.Char(':').Tag(TAG_CONDITIONAL_OPERATOR_SEPARATOR),
|
||||
create.Label(LABEL_EXPRESSION),
|
||||
create.True().Tag(TAG_CONDITIONAL_OPERATOR_END)
|
||||
});
|
||||
return create.And({create.Char('?').Tag(TAG_CONDITIONAL_OPERATOR),
|
||||
create.Label(LABEL_EXPRESSION),
|
||||
create.Char(':').Tag(TAG_CONDITIONAL_OPERATOR_SEPARATOR),
|
||||
create.Label(LABEL_EXPRESSION),
|
||||
create.True().Tag(TAG_CONDITIONAL_OPERATOR_END)});
|
||||
}
|
||||
|
||||
std::unique_ptr<SimpleExpressionMatchers::matcher_t> SimpleExpressionMatchers::Expression(const supplier_t* labelSupplier) const
|
||||
{
|
||||
const SimpleMatcherFactory create(labelSupplier);
|
||||
|
||||
return create.And({
|
||||
create.OptionalLoop(ParseUnaryOperationType(labelSupplier)),
|
||||
create.Or({
|
||||
create.And({
|
||||
create.Char('('),
|
||||
create.Label(LABEL_EXPRESSION),
|
||||
create.Char(')').Tag(TAG_PARENTHESIS_END)
|
||||
}).Tag(TAG_PARENTHESIS),
|
||||
create.And({
|
||||
create.True().Tag(TAG_OPERAND_EXT),
|
||||
ParseOperandExtension(labelSupplier),
|
||||
create.True().Tag(TAG_OPERAND_EXT_END)
|
||||
}),
|
||||
ParseOperand(labelSupplier)
|
||||
}),
|
||||
create.Optional(create.Or({
|
||||
ParseConditionalOperator(labelSupplier),
|
||||
create.And({
|
||||
ParseBinaryOperationType(labelSupplier),
|
||||
create.Label(LABEL_EXPRESSION)
|
||||
}).Tag(TAG_BINARY_OPERATION)
|
||||
}))
|
||||
}).Tag(TAG_EXPRESSION);
|
||||
return create
|
||||
.And({create.OptionalLoop(ParseUnaryOperationType(labelSupplier)),
|
||||
create.Or({create.And({create.Char('('), create.Label(LABEL_EXPRESSION), create.Char(')').Tag(TAG_PARENTHESIS_END)}).Tag(TAG_PARENTHESIS),
|
||||
create.And({create.True().Tag(TAG_OPERAND_EXT), ParseOperandExtension(labelSupplier), create.True().Tag(TAG_OPERAND_EXT_END)}),
|
||||
ParseOperand(labelSupplier)}),
|
||||
create.Optional(create.Or({ParseConditionalOperator(labelSupplier),
|
||||
create.And({ParseBinaryOperationType(labelSupplier), create.Label(LABEL_EXPRESSION)}).Tag(TAG_BINARY_OPERATION)}))})
|
||||
.Tag(TAG_EXPRESSION);
|
||||
}
|
||||
|
@ -1,16 +1,16 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Matcher/MatcherLabel.h"
|
||||
#include "Parsing/Sequence/SequenceResult.h"
|
||||
#include "Parsing/Simple/Expression/ISimpleExpression.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "SimpleExpressionBinaryOperation.h"
|
||||
#include "SimpleExpressionUnaryOperation.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Matcher/MatcherLabel.h"
|
||||
#include "Parsing/Simple/Expression/ISimpleExpression.h"
|
||||
#include "Parsing/Sequence/SequenceResult.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <Parsing/Simple/SimpleLexer.h>
|
||||
#include <memory>
|
||||
|
||||
class SimpleExpressionMatchers
|
||||
{
|
||||
@ -35,7 +35,8 @@ private:
|
||||
|
||||
public:
|
||||
SimpleExpressionMatchers();
|
||||
SimpleExpressionMatchers(bool enableStringOperands, bool enableIdentifierOperands, bool enableFloatingPointOperands, bool enableIntOperands, bool enableConditionalOperator);
|
||||
SimpleExpressionMatchers(
|
||||
bool enableStringOperands, bool enableIdentifierOperands, bool enableFloatingPointOperands, bool enableIntOperands, bool enableConditionalOperator);
|
||||
virtual ~SimpleExpressionMatchers();
|
||||
SimpleExpressionMatchers(const SimpleExpressionMatchers& other) = default;
|
||||
SimpleExpressionMatchers(SimpleExpressionMatchers&& other) noexcept = default;
|
||||
@ -56,7 +57,8 @@ private:
|
||||
std::unique_ptr<matcher_t> ParseConditionalOperator(const supplier_t* labelSupplier) const;
|
||||
|
||||
std::unique_ptr<ISimpleExpression> ProcessExpressionInParenthesis(SequenceResult<SimpleParserValue>& result) const;
|
||||
std::unique_ptr<ISimpleExpression> ProcessConditionalOperation(std::unique_ptr<ISimpleExpression> condition, SequenceResult<SimpleParserValue>& result) const;
|
||||
std::unique_ptr<ISimpleExpression> ProcessConditionalOperation(std::unique_ptr<ISimpleExpression> condition,
|
||||
SequenceResult<SimpleParserValue>& result) const;
|
||||
std::unique_ptr<ISimpleExpression> ProcessOperand(SequenceResult<SimpleParserValue>& result) const;
|
||||
|
||||
public:
|
||||
@ -64,4 +66,4 @@ public:
|
||||
std::unique_ptr<ISimpleExpression> ProcessExpression(SequenceResult<SimpleParserValue>& result) const;
|
||||
|
||||
virtual void ApplyTokensToLexerConfig(SimpleLexer::Config& lexerConfig);
|
||||
};
|
||||
};
|
||||
|
@ -1,10 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "ISimpleExpression.h"
|
||||
#include "SimpleExpressionValue.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleExpressionScopeValue final : public ISimpleExpression
|
||||
{
|
||||
public:
|
||||
|
@ -1,59 +1,57 @@
|
||||
#include "SimpleExpressionUnaryOperation.h"
|
||||
|
||||
#include <cassert>
|
||||
|
||||
#include "SimpleExpressionBinaryOperation.h"
|
||||
|
||||
SimpleExpressionUnaryOperationType::SimpleExpressionUnaryOperationType(const SimpleUnaryOperationId id, std::string syntax, evaluation_function_t evaluationFunction)
|
||||
#include <cassert>
|
||||
|
||||
SimpleExpressionUnaryOperationType::SimpleExpressionUnaryOperationType(const SimpleUnaryOperationId id,
|
||||
std::string syntax,
|
||||
evaluation_function_t evaluationFunction)
|
||||
: m_id(id),
|
||||
m_syntax(std::move(syntax)),
|
||||
m_evaluation_function(std::move(evaluationFunction))
|
||||
{
|
||||
}
|
||||
|
||||
const SimpleExpressionUnaryOperationType SimpleExpressionUnaryOperationType::OPERATION_NOT(
|
||||
SimpleUnaryOperationId::NOT,
|
||||
"!",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
return SimpleExpressionValue(!operand.IsTruthy());
|
||||
}
|
||||
);
|
||||
const SimpleExpressionUnaryOperationType SimpleExpressionUnaryOperationType::OPERATION_NOT(SimpleUnaryOperationId::NOT,
|
||||
"!",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
return SimpleExpressionValue(!operand.IsTruthy());
|
||||
});
|
||||
|
||||
const SimpleExpressionUnaryOperationType SimpleExpressionUnaryOperationType::OPERATION_BITWISE_NOT(
|
||||
SimpleUnaryOperationId::BITWISE_NOT,
|
||||
"~",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand.m_type == SimpleExpressionValue::Type::INT)
|
||||
return SimpleExpressionValue(~operand.m_int_value);
|
||||
const SimpleExpressionUnaryOperationType
|
||||
SimpleExpressionUnaryOperationType::OPERATION_BITWISE_NOT(SimpleUnaryOperationId::BITWISE_NOT,
|
||||
"~",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand.m_type == SimpleExpressionValue::Type::INT)
|
||||
return SimpleExpressionValue(~operand.m_int_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
return SimpleExpressionValue(0);
|
||||
});
|
||||
|
||||
const SimpleExpressionUnaryOperationType SimpleExpressionUnaryOperationType::OPERATION_NEGATIVE(
|
||||
SimpleUnaryOperationId::NEGATIVE,
|
||||
"-",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand.m_type == SimpleExpressionValue::Type::INT)
|
||||
return SimpleExpressionValue(-operand.m_int_value);
|
||||
if (operand.m_type == SimpleExpressionValue::Type::DOUBLE)
|
||||
return SimpleExpressionValue(-operand.m_double_value);
|
||||
const SimpleExpressionUnaryOperationType
|
||||
SimpleExpressionUnaryOperationType::OPERATION_NEGATIVE(SimpleUnaryOperationId::NEGATIVE,
|
||||
"-",
|
||||
[](const SimpleExpressionValue& operand) -> SimpleExpressionValue
|
||||
{
|
||||
if (operand.m_type == SimpleExpressionValue::Type::INT)
|
||||
return SimpleExpressionValue(-operand.m_int_value);
|
||||
if (operand.m_type == SimpleExpressionValue::Type::DOUBLE)
|
||||
return SimpleExpressionValue(-operand.m_double_value);
|
||||
|
||||
return SimpleExpressionValue(0);
|
||||
}
|
||||
);
|
||||
return SimpleExpressionValue(0);
|
||||
});
|
||||
|
||||
const SimpleExpressionUnaryOperationType* const SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[static_cast<int>(SimpleUnaryOperationId::COUNT)]
|
||||
{
|
||||
const SimpleExpressionUnaryOperationType* const SimpleExpressionUnaryOperationType::ALL_OPERATION_TYPES[static_cast<int>(SimpleUnaryOperationId::COUNT)]{
|
||||
&OPERATION_NOT,
|
||||
&OPERATION_BITWISE_NOT,
|
||||
&OPERATION_NEGATIVE,
|
||||
};
|
||||
|
||||
SimpleExpressionUnaryOperation::SimpleExpressionUnaryOperation(const SimpleExpressionUnaryOperationType* operationType, std::unique_ptr<ISimpleExpression> operand)
|
||||
SimpleExpressionUnaryOperation::SimpleExpressionUnaryOperation(const SimpleExpressionUnaryOperationType* operationType,
|
||||
std::unique_ptr<ISimpleExpression> operand)
|
||||
: m_operation_type(operationType),
|
||||
m_operand(std::move(operand))
|
||||
{
|
||||
@ -68,7 +66,8 @@ bool SimpleExpressionUnaryOperation::Equals(const ISimpleExpression* other) cons
|
||||
{
|
||||
const auto* otherUnaryOperation = dynamic_cast<const SimpleExpressionUnaryOperation*>(other);
|
||||
|
||||
return otherUnaryOperation && m_operation_type->m_id == otherUnaryOperation->m_operation_type->m_id && m_operand->Equals(otherUnaryOperation->m_operand.get());
|
||||
return otherUnaryOperation && m_operation_type->m_id == otherUnaryOperation->m_operation_type->m_id
|
||||
&& m_operand->Equals(otherUnaryOperation->m_operand.get());
|
||||
}
|
||||
|
||||
bool SimpleExpressionUnaryOperation::IsStatic() const
|
||||
|
@ -1,12 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
#include "ISimpleExpression.h"
|
||||
#include "SimpleExpressionValue.h"
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
enum class SimpleUnaryOperationId
|
||||
{
|
||||
NOT,
|
||||
|
@ -1,12 +1,13 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
#include "ISimpleExpression.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
class ISimpleExpression;
|
||||
|
||||
class SimpleExpressionValue final : public ISimpleExpression
|
||||
{
|
||||
public:
|
||||
@ -19,6 +20,7 @@ public:
|
||||
|
||||
Type m_type;
|
||||
std::shared_ptr<std::string> m_string_value;
|
||||
|
||||
union
|
||||
{
|
||||
double m_double_value;
|
||||
|
@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
class SimpleMatcherAnyCharacterBesides final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -8,7 +8,6 @@ SimpleMatcherCharacter::SimpleMatcherCharacter(const char c)
|
||||
MatcherResult<SimpleParserValue> SimpleMatcherCharacter::CanMatch(ILexer<SimpleParserValue>* lexer, const unsigned tokenOffset)
|
||||
{
|
||||
const auto& token = lexer->GetToken(tokenOffset);
|
||||
return token.m_type == SimpleParserValueType::CHARACTER && token.CharacterValue() == m_char
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
return token.m_type == SimpleParserValueType::CHARACTER && token.CharacterValue() == m_char ? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
class SimpleMatcherCharacter final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -1,15 +1,15 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcherFactory.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleMatcherFactory : public AbstractMatcherFactory<SimpleParserValue>
|
||||
{
|
||||
public:
|
||||
explicit SimpleMatcherFactory(const IMatcherForLabelSupplier<SimpleParserValue>* labelSupplier);
|
||||
|
||||
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> Type(SimpleParserValueType type) const;
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> Keyword(std::string value) const;
|
||||
_NODISCARD MatcherFactoryWrapper<SimpleParserValue> KeywordIgnoreCase(std::string value) const;
|
||||
|
@ -11,6 +11,6 @@ MatcherResult<SimpleParserValue> SimpleMatcherKeyword::CanMatch(ILexer<SimplePar
|
||||
{
|
||||
const auto& token = lexer->GetToken(tokenOffset);
|
||||
return token.m_type == SimpleParserValueType::IDENTIFIER && token.IdentifierHash() == m_hash && token.IdentifierValue() == m_value
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleMatcherKeyword final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -17,10 +17,14 @@ MatcherResult<SimpleParserValue> SimpleMatcherKeywordIgnoreCase::CanMatch(ILexer
|
||||
return MatcherResult<SimpleParserValue>::NoMatch();
|
||||
|
||||
const auto& identifierValue = token.IdentifierValue();
|
||||
const auto isEqual = std::equal(identifierValue.begin(), identifierValue.end(), m_value.begin(), m_value.end(), [](const char a, const char b)
|
||||
{
|
||||
return tolower(a) == b;
|
||||
});
|
||||
const auto isEqual = std::equal(identifierValue.begin(),
|
||||
identifierValue.end(),
|
||||
m_value.begin(),
|
||||
m_value.end(),
|
||||
[](const char a, const char b)
|
||||
{
|
||||
return tolower(a) == b;
|
||||
});
|
||||
|
||||
if (isEqual)
|
||||
return MatcherResult<SimpleParserValue>::Match(1);
|
||||
|
@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleMatcherKeywordIgnoreCase final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -9,6 +9,6 @@ MatcherResult<SimpleParserValue> SimpleMatcherKeywordPrefix::CanMatch(ILexer<Sim
|
||||
{
|
||||
const auto& token = lexer->GetToken(tokenOffset);
|
||||
return token.m_type == SimpleParserValueType::IDENTIFIER && token.IdentifierValue().compare(0, m_value.size(), m_value) == 0
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
class SimpleMatcherKeywordPrefix final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
class SimpleMatcherMultiCharacter final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -7,7 +7,5 @@ SimpleMatcherValueType::SimpleMatcherValueType(const SimpleParserValueType type)
|
||||
|
||||
MatcherResult<SimpleParserValue> SimpleMatcherValueType::CanMatch(ILexer<SimpleParserValue>* lexer, const unsigned tokenOffset)
|
||||
{
|
||||
return lexer->GetToken(tokenOffset).m_type == m_type
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
return lexer->GetToken(tokenOffset).m_type == m_type ? MatcherResult<SimpleParserValue>::Match(1) : MatcherResult<SimpleParserValue>::NoMatch();
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
class SimpleMatcherValueType final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -9,7 +9,6 @@ SimpleMatcherValueTypeAndHasSignPrefix::SimpleMatcherValueTypeAndHasSignPrefix(c
|
||||
MatcherResult<SimpleParserValue> SimpleMatcherValueTypeAndHasSignPrefix::CanMatch(ILexer<SimpleParserValue>* lexer, const unsigned tokenOffset)
|
||||
{
|
||||
const auto& token = lexer->GetToken(tokenOffset);
|
||||
return token.m_type == m_type && token.m_has_sign_prefix == m_has_sign_prefix
|
||||
? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
return token.m_type == m_type && token.m_has_sign_prefix == m_has_sign_prefix ? MatcherResult<SimpleParserValue>::Match(1)
|
||||
: MatcherResult<SimpleParserValue>::NoMatch();
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
#include "Parsing/Matcher/AbstractMatcher.h"
|
||||
#include "Parsing/Simple/SimpleParserValue.h"
|
||||
|
||||
class SimpleMatcherValueTypeAndHasSignPrefix final : public AbstractMatcher<SimpleParserValue>
|
||||
{
|
||||
|
@ -1,9 +1,9 @@
|
||||
#include "SimpleExpressionInterpreter.h"
|
||||
|
||||
#include "Utils/ClassUtils.h"
|
||||
#include "Expression/SimpleExpressionMatchers.h"
|
||||
#include "Matcher/SimpleMatcherFactory.h"
|
||||
#include "Parsing/Impl/AbstractParser.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
|
||||
class SimpleExpressionInterpreterParserState
|
||||
{
|
||||
@ -47,10 +47,7 @@ public:
|
||||
protected:
|
||||
const std::vector<sequence_t*>& GetTestsForState() override
|
||||
{
|
||||
static std::vector<sequence_t*> sequences
|
||||
{
|
||||
new SimpleExpressionInterpreterExpressionSequence()
|
||||
};
|
||||
static std::vector<sequence_t*> sequences{new SimpleExpressionInterpreterExpressionSequence()};
|
||||
return sequences;
|
||||
}
|
||||
};
|
||||
|
@ -52,7 +52,8 @@ void SimpleLexer::AddMultiCharacterTokenConfigToLookup(Config::MultiCharacterTok
|
||||
}
|
||||
else
|
||||
{
|
||||
m_multi_character_token_lookup[firstCharacterValue] = std::make_unique<MultiCharacterTokenLookupEntry>(tokenConfig.m_id, std::move(tokenConfig.m_value));
|
||||
m_multi_character_token_lookup[firstCharacterValue] =
|
||||
std::make_unique<MultiCharacterTokenLookupEntry>(tokenConfig.m_id, std::move(tokenConfig.m_value));
|
||||
}
|
||||
}
|
||||
|
||||
@ -123,12 +124,13 @@ SimpleParserValue SimpleLexer::GetNextToken()
|
||||
if (m_config.m_read_strings && c == '\"')
|
||||
return SimpleParserValue::String(pos, new std::string(m_config.m_string_escape_sequences ? ReadStringWithEscapeSequences() : ReadString()));
|
||||
|
||||
if (m_config.m_read_integer_numbers && (isdigit(c) || (c == '+' || c == '-' || (m_config.m_read_floating_point_numbers && c == '.')) && isdigit(PeekChar())))
|
||||
if (m_config.m_read_integer_numbers
|
||||
&& (isdigit(c) || (c == '+' || c == '-' || (m_config.m_read_floating_point_numbers && c == '.')) && isdigit(PeekChar())))
|
||||
{
|
||||
bool hasSignPrefix;
|
||||
int integerValue;
|
||||
|
||||
if(m_config.m_read_floating_point_numbers)
|
||||
if (m_config.m_read_floating_point_numbers)
|
||||
{
|
||||
bool isFloatingPointValue;
|
||||
double floatingPointValue;
|
||||
|
@ -1,12 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "Parsing/Impl/AbstractLexer.h"
|
||||
#include "SimpleParserValue.h"
|
||||
|
||||
#include <cstdint>
|
||||
#include <limits>
|
||||
#include <memory>
|
||||
|
||||
#include "SimpleParserValue.h"
|
||||
#include "Parsing/Impl/AbstractLexer.h"
|
||||
|
||||
class SimpleLexer : public AbstractLexer<SimpleParserValue>
|
||||
{
|
||||
public:
|
||||
@ -55,4 +55,4 @@ protected:
|
||||
public:
|
||||
explicit SimpleLexer(IParserLineStream* stream);
|
||||
SimpleLexer(IParserLineStream* stream, Config config);
|
||||
};
|
||||
};
|
||||
|
@ -1,10 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Parsing/IParserValue.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
#include "Parsing/TokenPos.h"
|
||||
#include "Utils/ClassUtils.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
enum class SimpleParserValueType
|
||||
{
|
||||
@ -34,6 +34,7 @@ public:
|
||||
SimpleParserValueType m_type;
|
||||
size_t m_hash;
|
||||
bool m_has_sign_prefix;
|
||||
|
||||
union ValueType
|
||||
{
|
||||
char char_value;
|
||||
|
Reference in New Issue
Block a user