You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
3.3 KiB
C++
69 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) Contributors to the Open 3D Engine Project.
|
|
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
*
|
|
*/
|
|
#pragma once
|
|
|
|
#include <AzCore/Component/Component.h>
|
|
|
|
#include <ExpressionEvaluation/ExpressionEvaluationBus.h>
|
|
|
|
#include <ExpressionEngine/ExpressionPrimitive.h>
|
|
#include <ExpressionEngine/ExpressionVariable.h>
|
|
|
|
namespace ExpressionEvaluation
|
|
{
|
|
class ExpressionEvaluationSystemComponent
|
|
: public AZ::Component
|
|
, public ExpressionEvaluationRequestBus::Handler
|
|
{
|
|
public:
|
|
AZ_COMPONENT(ExpressionEvaluationSystemComponent, "{55C70DBA-9B11-4A23-83C5-CA90260C917A}");
|
|
|
|
static void Reflect(AZ::ReflectContext* context);
|
|
|
|
static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided);
|
|
static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible);
|
|
static void GetRequiredServices(AZ::ComponentDescriptor::DependencyArrayType& required);
|
|
static void GetDependentServices(AZ::ComponentDescriptor::DependencyArrayType& dependent);
|
|
|
|
~ExpressionEvaluationSystemComponent();
|
|
|
|
// AZ::Component
|
|
void Init() override;
|
|
void Activate() override;
|
|
void Deactivate() override;
|
|
////
|
|
|
|
void RegisterExpressionInterface(ExpressionElementParser* elementInterface);
|
|
void RemoveExpressionInterface(ExpressionParserId interfaceId);
|
|
|
|
// ExpressionEvaluationRequestBus
|
|
ParseOutcome ParseExpression(AZStd::string_view expressionString) const override;
|
|
ParseInPlaceOutcome ParseExpressionInPlace(AZStd::string_view expressionString, ExpressionTree& expressionTree) const override;
|
|
|
|
ParseOutcome ParseRestrictedExpression(const AZStd::unordered_set<ExpressionParserId>& availableParsers, AZStd::string_view expressionString) const override;
|
|
ParseInPlaceOutcome ParseRestrictedExpressionInPlace(const AZStd::unordered_set<ExpressionParserId>& availableParsers, AZStd::string_view expressionString, ExpressionTree& expressionTree) const override;
|
|
|
|
EvaluateStringOutcome EvaluateExpression(AZStd::string_view expression) const override;
|
|
ExpressionResult Evaluate(const ExpressionTree& expressionTree) const override;
|
|
////
|
|
|
|
private:
|
|
|
|
AZ::Outcome<void, ParsingError> ReportMissingValue(size_t offset) const;
|
|
AZ::Outcome<void, ParsingError> ReportUnexpectedOperator(const AZStd::string& parseString, size_t offset, size_t charactersConsumed) const;
|
|
AZ::Outcome<void, ParsingError> ReportUnexpectedValue(const AZStd::string& parseString, size_t offset, size_t charactersConsumed) const;
|
|
AZ::Outcome<void, ParsingError> ReportUnexpectedSymbol(const AZStd::string& parseString, size_t offset, size_t charactersConsumed) const;
|
|
AZ::Outcome<void, ParsingError> ReportUnknownCharacter(const AZStd::string& parseString, size_t offset) const;
|
|
AZ::Outcome<void, ParsingError> ReportUnbalancedParen(size_t offset, const AZStd::string& offsetsString) const;
|
|
|
|
AZStd::vector<ExpressionElementParser*> m_internalParsers;
|
|
|
|
AZStd::unordered_map<ExpressionParserId, ExpressionElementParser*> m_elementInterfaces;
|
|
};
|
|
}
|