/* * All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or * its licensors. * * For complete copyright and license terms please see the LICENSE at the root of this * distribution (the "License"). All use of this software is governed by the License, * or, if provided, by the license below or the license accompanying this file. Do not * remove or modify any license notices. This file is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * */ #include #include #include #include #include namespace ExpressionEvaluation { //////////////////// // PrimitiveParser //////////////////// void PrimitiveParser::EvaluateToken(const ElementInformation& parseResult, ExpressionResultStack& evaluationStack) const { evaluationStack.emplace(parseResult.m_extraStore); } /////////////////////////// // NumericPrimitiveParser /////////////////////////// NumericPrimitiveParser::NumericPrimitiveParser() : m_regex(R"(^(0|([1-9][0-9]*))(\.[0-9]+)?)") { } ExpressionParserId NumericPrimitiveParser::GetParserId() const { return Interfaces::NumericPrimitives; } NumericPrimitiveParser::ParseResult NumericPrimitiveParser::ParseElement(const AZStd::string& inputText, size_t offset) const { AZStd::smatch match; ParseResult result; if (AZStd::regex_search(&inputText.at(offset), match, m_regex)) { AZStd::string matchedCharacters = match[0].str(); result.m_charactersConsumed = static_cast(matchedCharacters.length()); double numericValue = AzFramework::StringFunc::ToDouble(matchedCharacters.c_str()); result.m_element = Primitive::GetPrimitiveElement(numericValue); } return result; } /////////////////////////// // BooleanPrimitiveParser /////////////////////////// BooleanPrimitiveParser::BooleanPrimitiveParser() : m_regex(R"((true|false))", AZStd::regex::ECMAScript | AZStd::regex::icase) { } ExpressionParserId BooleanPrimitiveParser::GetParserId() const { return Interfaces::BooleanPrimitives; } BooleanPrimitiveParser::ParseResult BooleanPrimitiveParser::ParseElement(const AZStd::string& inputText, size_t offset) const { AZStd::smatch match; ParseResult result; if (AZStd::regex_search(&inputText.at(offset), match, m_regex)) { AZStd::string matchedCharacters = match[0].str(); AZStd::to_lower(matchedCharacters.begin(), matchedCharacters.end()); result.m_charactersConsumed = matchedCharacters.length(); bool booleanValue = AzFramework::StringFunc::ToBool(matchedCharacters.c_str()); result.m_element = Primitive::GetPrimitiveElement(booleanValue); } return result; } }