diff --git a/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp b/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp index f26372fd..2789c868 100644 --- a/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp +++ b/src/ObjLoading/Parsing/Menu/MenuFileParser.cpp @@ -1,14 +1,10 @@ #include "MenuFileParser.h" -#include "Sequence/SequenceCloseBlock.h" -#include "Sequence/SequenceFunctionDef.h" -#include "Sequence/SequenceItemDef.h" -#include "Sequence/SequenceLoadMenu.h" -#include "Sequence/SequenceMenuDef.h" -#include "Sequence/SequenceOpenGlobalScopeBlock.h" -#include "Sequence/Properties/FunctionPropertySequences.h" -#include "Sequence/Properties/ItemPropertySequences.h" -#include "Sequence/Properties/MenuPropertySequences.h" +#include "Sequence/FunctionScopeSequences.h" +#include "Sequence/GlobalScopeSequences.h" +#include "Sequence/ItemScopeSequences.h" +#include "Sequence/MenuScopeSequences.h" +#include "Sequence/NoScopeSequences.h" using namespace menu; @@ -26,39 +22,31 @@ void MenuFileParser::AddSequence(std::vector& collection, std::uniq void MenuFileParser::CreateNoScopeTests() { - AddSequence(m_no_scope_tests, std::make_unique()); + NoScopeSequences noScopeSequences(m_all_tests, m_no_scope_tests); + noScopeSequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateGlobalScopeTests() { - AddSequence(m_global_scope_tests, std::make_unique()); - AddSequence(m_global_scope_tests, std::make_unique()); - AddSequence(m_global_scope_tests, std::make_unique()); - AddSequence(m_global_scope_tests, std::make_unique()); + GlobalScopeSequences globalScopeSequences(m_all_tests, m_global_scope_tests); + globalScopeSequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateFunctionScopeTests() { - AddSequence(m_function_scope_tests, std::make_unique()); - - FunctionPropertySequences functionPropertySequences(m_all_tests, m_function_scope_tests); + FunctionScopeSequences functionPropertySequences(m_all_tests, m_function_scope_tests); functionPropertySequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateMenuScopeTests() { - AddSequence(m_menu_scope_tests, std::make_unique()); - AddSequence(m_menu_scope_tests, std::make_unique()); - - MenuPropertySequences menuPropertySequences(m_all_tests, m_menu_scope_tests); + MenuScopeSequences menuPropertySequences(m_all_tests, m_menu_scope_tests); menuPropertySequences.AddSequences(m_state->m_feature_level); } void MenuFileParser::CreateItemScopeTests() { - AddSequence(m_item_scope_tests, std::make_unique()); - - ItemPropertySequences itemPropertySequences(m_all_tests, m_item_scope_tests); + ItemScopeSequences itemPropertySequences(m_all_tests, m_item_scope_tests); itemPropertySequences.AddSequences(m_state->m_feature_level); } @@ -80,9 +68,6 @@ void MenuFileParser::CreateTestCollections() const std::vector& MenuFileParser::GetTestsForState() { - if (!m_state->m_in_global_scope) - return m_no_scope_tests; - if (m_state->m_current_item) return m_item_scope_tests; @@ -92,7 +77,10 @@ const std::vector& MenuFileParser::GetTestsForState if (m_state->m_current_menu) return m_menu_scope_tests; - return m_global_scope_tests; + if (m_state->m_in_global_scope) + return m_global_scope_tests; + + return m_no_scope_tests; } MenuFileParserState* MenuFileParser::GetState() const diff --git a/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.cpp b/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.cpp new file mode 100644 index 00000000..0edffba5 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.cpp @@ -0,0 +1,15 @@ +#include "AbstractScopeSequenceHolder.h" + +using namespace menu; + +AbstractScopeSequenceHolder::AbstractScopeSequenceHolder(std::vector>& allSequences, std::vector& scopeSequences) + : m_all_sequences(allSequences), + m_scope_sequences(scopeSequences) +{ +} + +void AbstractScopeSequenceHolder::AddSequence(std::unique_ptr test) const +{ + m_scope_sequences.push_back(test.get()); + m_all_sequences.emplace_back(std::move(test)); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.h b/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.h new file mode 100644 index 00000000..ced55ec6 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/AbstractScopeSequenceHolder.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include + +#include "Parsing/Menu/MenuFileParser.h" + +namespace menu +{ + class AbstractScopeSequenceHolder + { + std::vector>& m_all_sequences; + std::vector& m_scope_sequences; + + protected: + AbstractScopeSequenceHolder(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequence(std::unique_ptr test) const; + + public: + virtual ~AbstractScopeSequenceHolder() = default; + AbstractScopeSequenceHolder(const AbstractScopeSequenceHolder& other) = delete; + AbstractScopeSequenceHolder(AbstractScopeSequenceHolder&& other) noexcept = default; + AbstractScopeSequenceHolder& operator=(const AbstractScopeSequenceHolder& other) = delete; + AbstractScopeSequenceHolder& operator=(AbstractScopeSequenceHolder&& other) noexcept = default; + + virtual void AddSequences(FeatureLevel featureLevel) = 0; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp new file mode 100644 index 00000000..914683ac --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp @@ -0,0 +1,60 @@ +#include "FunctionScopeSequences.h" + +#include + +#include "Generic/GenericStringPropertySequence.h" +#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::function_scope_sequences +{ + class SequenceCloseBlock final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_TOKEN = 1; + + public: + SequenceCloseBlock() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Char('}') + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + const auto existingFunction = state->m_functions_by_name.find(state->m_current_function->m_name); + if (existingFunction == state->m_functions_by_name.end()) + { + state->m_functions_by_name.emplace(std::make_pair(state->m_current_function->m_name, state->m_current_function.get())); + state->m_functions.emplace_back(std::move(state->m_current_function)); + state->m_current_function = nullptr; + } + else + { + std::ostringstream ss; + ss << "Function with name \"" << state->m_current_menu->m_name << "\" already exists"; + throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), ss.str()); + } + } + }; +} + +using namespace function_scope_sequences; + +FunctionScopeSequences::FunctionScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) +{ +} + +void FunctionScopeSequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); + AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) + { + state->m_current_function->m_name = value; + })); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.h b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.h new file mode 100644 index 00000000..612610c8 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractScopeSequenceHolder.h" + +namespace menu +{ + class FunctionScopeSequences final : AbstractScopeSequenceHolder + { + public: + FunctionScopeSequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericBoolPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericBoolPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericBoolPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericBoolPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericBoolPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericColorPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericColorPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericColorPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericColorPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericColorPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericExpressionPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericExpressionPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericExpressionPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericExpressionPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericExpressionPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericExpressionPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericExpressionPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericExpressionPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericFloatingPointPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericFloatingPointPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericFloatingPointPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericFloatingPointPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericFloatingPointPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericIntPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericIntPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericIntPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericIntPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericIntPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericKeywordPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericKeywordPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericKeywordPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericKeywordPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericKeywordPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericStringPropertySequence.cpp similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericStringPropertySequence.cpp diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h b/src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericStringPropertySequence.h similarity index 100% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/GenericStringPropertySequence.h rename to src/ObjLoading/Parsing/Menu/Sequence/Generic/GenericStringPropertySequence.h diff --git a/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp new file mode 100644 index 00000000..7953e671 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.cpp @@ -0,0 +1,112 @@ +#include "GlobalScopeSequences.h" + +#include "Generic/GenericStringPropertySequence.h" +#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::global_scope_sequences +{ + class SequenceCloseBlock final : public MenuFileParser::sequence_t + { + public: + SequenceCloseBlock() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Char('}') + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_in_global_scope = false; + } + }; + + class SequenceFunctionDef final : public MenuFileParser::sequence_t + { + public: + SequenceFunctionDef() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Keyword("functionDef"), + create.Char('{'), + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_current_function = std::make_unique(); + } + }; + + class SequenceMenuDef final : public MenuFileParser::sequence_t + { + public: + SequenceMenuDef() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Keyword("menuDef"), + create.Char('{'), + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_current_menu = std::make_unique(); + } + }; + + class SequenceLoadMenu final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_MENU_NAME = 1; + + public: + SequenceLoadMenu() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Keyword("loadMenu"), + create.Char('{'), + create.String().Capture(CAPTURE_MENU_NAME), + create.Char('}'), + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + const auto& menuNameToken = result.NextCapture(CAPTURE_MENU_NAME); + + if (menuNameToken.StringValue().empty()) + throw ParsingException(menuNameToken.GetPos(), "Invalid menu name"); + + state->m_menus_to_load.emplace_back(menuNameToken.StringValue()); + } + }; +} + +using namespace global_scope_sequences; + +GlobalScopeSequences::GlobalScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) +{ +} + +void GlobalScopeSequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); + AddSequence(std::make_unique()); + AddSequence(std::make_unique()); + AddSequence(std::make_unique()); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.h b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.h new file mode 100644 index 00000000..1521baae --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/GlobalScopeSequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractScopeSequenceHolder.h" + +namespace menu +{ + class GlobalScopeSequences final : AbstractScopeSequenceHolder + { + public: + GlobalScopeSequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp similarity index 90% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp index ed56caaf..2485b339 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.cpp @@ -1,19 +1,39 @@ -#include "ItemPropertySequences.h" +#include "ItemScopeSequences.h" #include #include -#include "GenericColorPropertySequence.h" -#include "GenericFloatingPointPropertySequence.h" -#include "GenericIntPropertySequence.h" -#include "GenericKeywordPropertySequence.h" -#include "GenericStringPropertySequence.h" +#include "Generic/GenericColorPropertySequence.h" +#include "Generic/GenericFloatingPointPropertySequence.h" +#include "Generic/GenericIntPropertySequence.h" +#include "Generic/GenericKeywordPropertySequence.h" +#include "Generic/GenericStringPropertySequence.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" using namespace menu; -namespace menu::item_properties +namespace menu::item_scope_sequences { + class SequenceCloseBlock final : public MenuFileParser::sequence_t + { + public: + SequenceCloseBlock() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Char('}') + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_current_menu->m_items.emplace_back(std::move(state->m_current_item)); + state->m_current_item = nullptr; + } + }; + class SequenceRect final : public MenuFileParser::sequence_t { static constexpr auto CAPTURE_X = 1; @@ -142,15 +162,16 @@ namespace menu::item_properties }; } -using namespace item_properties; +using namespace item_scope_sequences; -ItemPropertySequences::ItemPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) - : AbstractPropertySequenceHolder(allSequences, scopeSequences) +ItemScopeSequences::ItemScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) { } -void ItemPropertySequences::AddSequences(FeatureLevel featureLevel) +void ItemScopeSequences::AddSequences(FeatureLevel featureLevel) { + AddSequence(std::make_unique()); AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) { state->m_current_item->m_name = value; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.h b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.h new file mode 100644 index 00000000..0ecb0882 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/ItemScopeSequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractScopeSequenceHolder.h" + +namespace menu +{ + class ItemScopeSequences final : AbstractScopeSequenceHolder + { + public: + ItemScopeSequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp similarity index 76% rename from src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp rename to src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp index 58e362f6..d1538b53 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.cpp @@ -1,20 +1,80 @@ -#include "MenuPropertySequences.h" +#include "MenuScopeSequences.h" -#include "GenericBoolPropertySequence.h" -#include "GenericColorPropertySequence.h" -#include "GenericExpressionPropertySequence.h" -#include "GenericFloatingPointPropertySequence.h" -#include "GenericIntPropertySequence.h" -#include "GenericKeywordPropertySequence.h" -#include "GenericStringPropertySequence.h" +#include + +#include "Generic/GenericBoolPropertySequence.h" +#include "Generic/GenericColorPropertySequence.h" +#include "Generic/GenericExpressionPropertySequence.h" +#include "Generic/GenericFloatingPointPropertySequence.h" +#include "Generic/GenericIntPropertySequence.h" +#include "Generic/GenericKeywordPropertySequence.h" +#include "Generic/GenericStringPropertySequence.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" #include "Parsing/Menu/Domain/CommonMenuTypes.h" #include "Parsing/Menu/Matcher/MenuCommonMatchers.h" using namespace menu; -namespace menu::menu_properties +namespace menu::menu_scope_sequences { + class SequenceCloseBlock final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_TOKEN = 1; + + public: + SequenceCloseBlock() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Char('}').Capture(CAPTURE_TOKEN) + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + if (state->m_current_menu->m_name.empty()) + throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), "Menu must have a name"); + + const auto existingMenu = state->m_menus_by_name.find(state->m_current_menu->m_name); + if (existingMenu == state->m_menus_by_name.end()) + { + state->m_menus_by_name.emplace(std::make_pair(state->m_current_menu->m_name, state->m_current_menu.get())); + state->m_menus.emplace_back(std::move(state->m_current_menu)); + state->m_current_menu = nullptr; + } + else + { + std::ostringstream ss; + ss << "Menu with name \"" << state->m_current_menu->m_name << "\" already exists"; + throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), ss.str()); + } + } + }; + + class SequenceItemDef final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_TOKEN = 1; + + public: + SequenceItemDef() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Keyword("itemDef"), + create.Char('{') + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_current_item = std::make_unique(); + } + }; + class SequenceRect final : public MenuFileParser::sequence_t { static constexpr auto CAPTURE_X = 1; @@ -67,15 +127,17 @@ namespace menu::menu_properties }; } -using namespace menu_properties; +using namespace menu_scope_sequences; -MenuPropertySequences::MenuPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) - : AbstractPropertySequenceHolder(allSequences, scopeSequences) +MenuScopeSequences::MenuScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) { } -void MenuPropertySequences::AddSequences(FeatureLevel featureLevel) +void MenuScopeSequences::AddSequences(FeatureLevel featureLevel) { + AddSequence(std::make_unique()); + AddSequence(std::make_unique()); AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) { state->m_current_menu->m_name = value; diff --git a/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.h b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.h new file mode 100644 index 00000000..d3f6484c --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/MenuScopeSequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractScopeSequenceHolder.h" + +namespace menu +{ + class MenuScopeSequences final : AbstractScopeSequenceHolder + { + public: + MenuScopeSequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.cpp new file mode 100644 index 00000000..cb4dc0d9 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.cpp @@ -0,0 +1,40 @@ +#include "NoScopeSequences.h" + +#include "Generic/GenericStringPropertySequence.h" +#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" + +using namespace menu; + +namespace menu::no_scope_sequences +{ + class SequenceOpenGlobalScope final : public MenuFileParser::sequence_t + { + public: + SequenceOpenGlobalScope() + { + const MenuMatcherFactory create(this); + + AddMatchers({ + create.Char('{') + }); + } + + protected: + void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override + { + state->m_in_global_scope = true; + } + }; +} + +using namespace no_scope_sequences; + +NoScopeSequences::NoScopeSequences(std::vector>& allSequences, std::vector& scopeSequences) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) +{ +} + +void NoScopeSequences::AddSequences(FeatureLevel featureLevel) +{ + AddSequence(std::make_unique()); +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.h b/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.h new file mode 100644 index 00000000..f0469e81 --- /dev/null +++ b/src/ObjLoading/Parsing/Menu/Sequence/NoScopeSequences.h @@ -0,0 +1,14 @@ +#pragma once + +#include "AbstractScopeSequenceHolder.h" + +namespace menu +{ + class NoScopeSequences final : AbstractScopeSequenceHolder + { + public: + NoScopeSequences(std::vector>& allSequences, std::vector& scopeSequences); + + void AddSequences(FeatureLevel featureLevel) override; + }; +} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp deleted file mode 100644 index a4147697..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "AbstractPropertySequenceHolder.h" - -using namespace menu; - -AbstractPropertySequenceHolder::AbstractPropertySequenceHolder(std::vector>& allSequences, std::vector& scopeSequences) - : m_all_sequences(allSequences), - m_scope_sequences(scopeSequences) -{ -} - -void AbstractPropertySequenceHolder::AddSequence(std::unique_ptr test) const -{ - m_scope_sequences.push_back(test.get()); - m_all_sequences.emplace_back(std::move(test)); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h deleted file mode 100644 index 4f314c7d..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/AbstractPropertySequenceHolder.h +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include -#include - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class AbstractPropertySequenceHolder - { - std::vector>& m_all_sequences; - std::vector& m_scope_sequences; - - protected: - AbstractPropertySequenceHolder(std::vector>& allSequences, std::vector& scopeSequences); - - void AddSequence(std::unique_ptr test) const; - - public: - virtual ~AbstractPropertySequenceHolder() = default; - AbstractPropertySequenceHolder(const AbstractPropertySequenceHolder& other) = delete; - AbstractPropertySequenceHolder(AbstractPropertySequenceHolder&& other) noexcept = default; - AbstractPropertySequenceHolder& operator=(const AbstractPropertySequenceHolder& other) = delete; - AbstractPropertySequenceHolder& operator=(AbstractPropertySequenceHolder&& other) noexcept = default; - - virtual void AddSequences(FeatureLevel featureLevel) = 0; - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp deleted file mode 100644 index dab5affb..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "FunctionPropertySequences.h" - -#include "GenericStringPropertySequence.h" -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -namespace menu::function_properties -{ -} - -using namespace function_properties; - -FunctionPropertySequences::FunctionPropertySequences(std::vector>& allSequences, std::vector& scopeSequences) - : AbstractPropertySequenceHolder(allSequences, scopeSequences) -{ -} - -void FunctionPropertySequences::AddSequences(FeatureLevel featureLevel) -{ - AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const std::string& value) - { - state->m_current_function->m_name = value; - })); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h deleted file mode 100644 index d971d130..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/FunctionPropertySequences.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "AbstractPropertySequenceHolder.h" - -namespace menu -{ - class FunctionPropertySequences final : AbstractPropertySequenceHolder - { - public: - FunctionPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); - - void AddSequences(FeatureLevel featureLevel) override; - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h deleted file mode 100644 index 820180d8..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/ItemPropertySequences.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "AbstractPropertySequenceHolder.h" - -namespace menu -{ - class ItemPropertySequences final : AbstractPropertySequenceHolder - { - public: - ItemPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); - - void AddSequences(FeatureLevel featureLevel) override; - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h b/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h deleted file mode 100644 index b81328a3..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/Properties/MenuPropertySequences.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "AbstractPropertySequenceHolder.h" - -namespace menu -{ - class MenuPropertySequences final : AbstractPropertySequenceHolder - { - public: - MenuPropertySequences(std::vector>& allSequences, std::vector& scopeSequences); - - void AddSequences(FeatureLevel featureLevel) override; - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp deleted file mode 100644 index 6c877177..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.cpp +++ /dev/null @@ -1,69 +0,0 @@ -#include "SequenceCloseBlock.h" - -#include - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceCloseBlock::SequenceCloseBlock() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Char('}').Capture(CAPTURE_TOKEN) - }); -} - -void SequenceCloseBlock::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(state->m_current_item || state->m_current_menu || state->m_current_function || state->m_in_global_scope); - assert(!state->m_current_item || (state->m_current_item && state->m_current_menu)); - - if(state->m_current_item && state->m_current_menu) - { - state->m_current_menu->m_items.emplace_back(std::move(state->m_current_item)); - state->m_current_item = nullptr; - } - else if(state->m_current_menu) - { - if(state->m_current_menu->m_name.empty()) - throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), "Menu must have a name"); - - const auto existingMenu = state->m_menus_by_name.find(state->m_current_menu->m_name); - if(existingMenu == state->m_menus_by_name.end()) - { - state->m_menus_by_name.emplace(std::make_pair(state->m_current_menu->m_name, state->m_current_menu.get())); - state->m_menus.emplace_back(std::move(state->m_current_menu)); - state->m_current_menu = nullptr; - } - else - { - std::ostringstream ss; - ss << "Menu with name \"" << state->m_current_menu->m_name << "\" already exists"; - throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), ss.str()); - } - } - else if(state->m_current_function) - { - const auto existingFunction = state->m_functions_by_name.find(state->m_current_function->m_name); - if (existingFunction == state->m_functions_by_name.end()) - { - state->m_functions_by_name.emplace(std::make_pair(state->m_current_function->m_name, state->m_current_function.get())); - state->m_functions.emplace_back(std::move(state->m_current_function)); - state->m_current_function = nullptr; - } - else - { - std::ostringstream ss; - ss << "Function with name \"" << state->m_current_menu->m_name << "\" already exists"; - throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), ss.str()); - } - } - else if(state->m_in_global_scope) - { - state->m_in_global_scope = false; - } - else - throw ParsingException(result.NextCapture(CAPTURE_TOKEN).GetPos(), "Invalid close block"); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.h deleted file mode 100644 index a6870824..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceCloseBlock.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceCloseBlock final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_TOKEN = 1; - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceCloseBlock(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp deleted file mode 100644 index 512460d4..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "SequenceFunctionDef.h" - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceFunctionDef::SequenceFunctionDef() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Keyword("functionDef"), - create.Char('{'), - }); -} - -void SequenceFunctionDef::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(!state->m_current_menu); - - state->m_current_item = std::make_unique(); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.h deleted file mode 100644 index 78af061b..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceFunctionDef.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceFunctionDef final : public MenuFileParser::sequence_t - { - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceFunctionDef(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp deleted file mode 100644 index 2b08df04..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "SequenceItemDef.h" - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceItemDef::SequenceItemDef() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Keyword("itemDef"), - create.Char('{'), - }); -} - -void SequenceItemDef::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(state->m_current_menu); - - state->m_current_item = std::make_unique(); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.h deleted file mode 100644 index a04cd8b9..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceItemDef.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceItemDef final : public MenuFileParser::sequence_t - { - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceItemDef(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp deleted file mode 100644 index d9a2d377..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.cpp +++ /dev/null @@ -1,29 +0,0 @@ -#include "SequenceLoadMenu.h" - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceLoadMenu::SequenceLoadMenu() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Keyword("loadMenu"), - create.Char('{'), - create.String().Capture(CAPTURE_MENU_NAME), - create.Char('}'), - }); -} - -void SequenceLoadMenu::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(!state->m_current_menu); - - const auto& menuNameToken = result.NextCapture(CAPTURE_MENU_NAME); - - if (menuNameToken.StringValue().empty()) - throw ParsingException(menuNameToken.GetPos(), "Invalid menu name"); - - state->m_menus_to_load.emplace_back(menuNameToken.StringValue()); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.h deleted file mode 100644 index aefe4415..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceLoadMenu.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceLoadMenu final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_MENU_NAME = 1; - - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceLoadMenu(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp deleted file mode 100644 index 6d3df6e2..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "SequenceMenuDef.h" - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceMenuDef::SequenceMenuDef() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Keyword("menuDef"), - create.Char('{'), - }); -} - -void SequenceMenuDef::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(!state->m_current_menu); - - state->m_current_menu = std::make_unique(); -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.h deleted file mode 100644 index 1577620f..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceMenuDef.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceMenuDef final : public MenuFileParser::sequence_t - { - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceMenuDef(); - }; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp b/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp deleted file mode 100644 index ec71b90f..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "SequenceOpenGlobalScopeBlock.h" - -#include "Parsing/Menu/Matcher/MenuMatcherFactory.h" - -using namespace menu; - -SequenceOpenGlobalScopeBlock::SequenceOpenGlobalScopeBlock() -{ - const MenuMatcherFactory create(this); - - AddMatchers({ - create.Char('{') - }); -} - -void SequenceOpenGlobalScopeBlock::ProcessMatch(MenuFileParserState* state, SequenceResult& result) const -{ - assert(!state->m_in_global_scope); - state->m_in_global_scope = true; -} diff --git a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.h b/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.h deleted file mode 100644 index 6aa93d12..00000000 --- a/src/ObjLoading/Parsing/Menu/Sequence/SequenceOpenGlobalScopeBlock.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "Parsing/Menu/MenuFileParser.h" - -namespace menu -{ - class SequenceOpenGlobalScopeBlock final : public MenuFileParser::sequence_t - { - protected: - void ProcessMatch(MenuFileParserState* state, SequenceResult& result) const override; - - public: - SequenceOpenGlobalScopeBlock(); - }; -}