From 5df6fce48a1b9ca50f9c55961925cfb396a66015 Mon Sep 17 00:00:00 2001 From: Jan Date: Mon, 1 Nov 2021 10:14:24 +0100 Subject: [PATCH] Add MenuMatcherFactory with extensions for Numeric and Text token types --- .../Parsing/Menu/MenuMatcherFactory.cpp | 48 +++++++++++++++++++ .../Parsing/Menu/MenuMatcherFactory.h | 19 ++++++++ .../Menu/Sequence/Properties/SequenceName.cpp | 11 ++--- .../Menu/Sequence/SequenceCloseBlock.cpp | 4 +- .../Menu/Sequence/SequenceFunctionDef.cpp | 4 +- .../Parsing/Menu/Sequence/SequenceItemDef.cpp | 4 +- .../Menu/Sequence/SequenceLoadMenu.cpp | 4 +- .../Parsing/Menu/Sequence/SequenceMenuDef.cpp | 4 +- .../Sequence/SequenceOpenGlobalScopeBlock.cpp | 4 +- .../Simple/Matcher/SimpleMatcherFactory.h | 2 +- 10 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 src/ObjLoading/Parsing/Menu/MenuMatcherFactory.cpp create mode 100644 src/ObjLoading/Parsing/Menu/MenuMatcherFactory.h diff --git a/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.cpp b/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.cpp new file mode 100644 index 00000000..1219311b --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.cpp @@ -0,0 +1,48 @@ +#include "MenuMatcherFactory.h" + +using namespace menu; + +MenuMatcherFactory::MenuMatcherFactory(const IMatcherForLabelSupplier* labelSupplier) + : SimpleMatcherFactory(labelSupplier) +{ +} + +MatcherFactoryWrapper MenuMatcherFactory::Text() const +{ + return MatcherFactoryWrapper(Or({String(), Identifier()})); +} + +MatcherFactoryWrapper MenuMatcherFactory::Numeric() const +{ + return MatcherFactoryWrapper(Or({FloatingPoint(), Integer()})); +} + +int MenuMatcherFactory::TokenNumericIntValue(const SimpleParserValue& value) +{ + if(value.m_type == SimpleParserValueType::FLOATING_POINT) + { + return static_cast(value.FloatingPointValue()); + } + + return value.IntegerValue(); +} + +double MenuMatcherFactory::TokenNumericFloatingPointValue(const SimpleParserValue& value) +{ + if (value.m_type == SimpleParserValueType::INTEGER) + { + return static_cast(value.IntegerValue()); + } + + return value.FloatingPointValue(); +} + +std::string& MenuMatcherFactory::TokenTextValue(const SimpleParserValue& value) +{ + if(value.m_type == SimpleParserValueType::IDENTIFIER) + { + return value.IdentifierValue(); + } + + return value.StringValue(); +} diff --git a/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.h b/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.h new file mode 100644 index 00000000..58baff2a --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/MenuMatcherFactory.h @@ -0,0 +1,19 @@ +#pragma once + +#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" + +namespace menu +{ + class MenuMatcherFactory : public SimpleMatcherFactory + { + public: + explicit MenuMatcherFactory(const IMatcherForLabelSupplier* labelSupplier); + + _NODISCARD MatcherFactoryWrapper Text() const; + _NODISCARD MatcherFactoryWrapper Numeric() const; + + _NODISCARD static int TokenNumericIntValue(const SimpleParserValue& value); + _NODISCARD static double TokenNumericFloatingPointValue(const SimpleParserValue& value); + _NODISCARD static std::string& TokenTextValue(const SimpleParserValue& value); + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp index 0e5d6536..505fa8ca 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/Properties/SequenceName.cpp @@ -1,25 +1,24 @@ #include "SequenceName.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceName::SequenceName() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.KeywordIgnoreCase("name"), - create.Or({create.String(), create.Identifier()}).Capture(CAPTURE_NAME) + create.Text().Capture(CAPTURE_NAME) }); } void SequenceName::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const { assert(state->m_current_item || state->m_current_menu || state->m_current_function); - - const auto& nameToken = result.NextCapture(CAPTURE_NAME); - const auto nameValue = nameToken.m_type == SimpleParserValueType::IDENTIFIER ? nameToken.IdentifierValue() : nameToken.StringValue(); + + const auto nameValue = MenuMatcherFactory::TokenTextValue(result.NextCapture(CAPTURE_NAME)); if (state->m_current_item) state->m_current_item->m_name = nameValue; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp index 08c5587d..8cff5ca8 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp @@ -2,13 +2,13 @@ #include -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceCloseBlock::SequenceCloseBlock() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Char('}').Capture(CAPTURE_TOKEN) diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp index 5ed3245c..297573a3 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp @@ -1,12 +1,12 @@ #include "SequenceFunctionDef.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceFunctionDef::SequenceFunctionDef() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Keyword("functionDef"), diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp index bc88bf7d..07cbab9e 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp @@ -1,12 +1,12 @@ #include "SequenceItemDef.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceItemDef::SequenceItemDef() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Keyword("itemDef"), diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp index 7e97b5da..92a90d3a 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp @@ -1,12 +1,12 @@ #include "SequenceLoadMenu.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceLoadMenu::SequenceLoadMenu() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Keyword("loadMenu"), diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp index 9b39bdca..32a0f2d8 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp @@ -1,12 +1,12 @@ #include "SequenceMenuDef.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceMenuDef::SequenceMenuDef() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Keyword("menuDef"), diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp index b84a7754..2d86abb2 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp @@ -1,12 +1,12 @@ #include "SequenceOpenGlobalScopeBlock.h" -#include "Parsing/Simple/Matcher/SimpleMatcherFactory.h" +#include "Parsing/Menu/MenuMatcherFactory.h" using namespace menu; SequenceOpenGlobalScopeBlock::SequenceOpenGlobalScopeBlock() { - const SimpleMatcherFactory create(this); + const MenuMatcherFactory create(this); AddMatchers({ create.Char('{') diff --git a/src/Parser/Parsing/Simple/Matcher/SimpleMatcherFactory.h b/src/Parser/Parsing/Simple/Matcher/SimpleMatcherFactory.h index a0e7159a..9841a93e 100644 --- a/src/Parser/Parsing/Simple/Matcher/SimpleMatcherFactory.h +++ b/src/Parser/Parsing/Simple/Matcher/SimpleMatcherFactory.h @@ -5,7 +5,7 @@ #include "Parsing/Simple/SimpleParserValue.h" #include "Parsing/Matcher/AbstractMatcherFactory.h" -class SimpleMatcherFactory final : public AbstractMatcherFactory +class SimpleMatcherFactory : public AbstractMatcherFactory { public: explicit SimpleMatcherFactory(const IMatcherForLabelSupplier* labelSupplier);