diff --git a/src/ObjLoading/Parsing/Menu/Domain/CommonFunctionDef.h b/src/ObjLoading/Parsing/Menu/Domain/CommonFunctionDef.h index ef459bc3..a9ec384d 100644 --- a/src/ObjLoading/Parsing/Menu/Domain/CommonFunctionDef.h +++ b/src/ObjLoading/Parsing/Menu/Domain/CommonFunctionDef.h @@ -2,11 +2,14 @@ #include +#include "Parsing/Simple/Expression/ISimpleExpression.h" + namespace menu { class CommonFunctionDef { public: std::string m_name; + std::unique_ptr m_value; }; } diff --git a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp index 1834102e..4f2bc425 100644 --- a/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp +++ b/src/ObjLoading/Parsing/Menu/Sequence/FunctionScopeSequences.cpp @@ -2,6 +2,7 @@ #include +#include "Generic/GenericExpressionPropertySequence.h" #include "Generic/GenericStringPropertySequence.h" #include "Parsing/Menu/Matcher/MenuMatcherFactory.h" @@ -9,51 +10,55 @@ using namespace menu; namespace menu::function_scope_sequences { - class SequenceCloseBlock final : public MenuFileParser::sequence_t - { - static constexpr auto CAPTURE_TOKEN = 1; + class SequenceCloseBlock final : public MenuFileParser::sequence_t + { + static constexpr auto CAPTURE_TOKEN = 1; - public: - SequenceCloseBlock() - { - const MenuMatcherFactory create(this); + public: + SequenceCloseBlock() + { + const MenuMatcherFactory create(this); - AddMatchers({ - create.Char('}') - }); - } + AddMatchers({ + create.Char('}').Capture(CAPTURE_TOKEN) + }); + } - 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)); - 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()); - } - } - }; + 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)); + state->m_current_function = nullptr; + } + else + { + std::ostringstream ss; + ss << "Function with name \"" << state->m_current_function->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) + : AbstractScopeSequenceHolder(allSequences, scopeSequences) { } void FunctionScopeSequences::AddSequences(FeatureLevel featureLevel, bool permissive) { - AddSequence(std::make_unique()); - AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const TokenPos&, const std::string& value) - { - state->m_current_function->m_name = value; - })); + AddSequence(std::make_unique()); + AddSequence(std::make_unique("name", [](const MenuFileParserState* state, const TokenPos&, const std::string& value) + { + state->m_current_function->m_name = value; + })); + AddSequence(GenericExpressionPropertySequence::WithKeyword("value", [](const MenuFileParserState* state, const TokenPos&, std::unique_ptr value) + { + state->m_current_function->m_value = std::move(value); + })); }