Add Menu Parsing Result

This commit is contained in:
Jan 2021-10-31 17:33:46 +01:00
parent e79376eb3e
commit ca1059b05c
6 changed files with 95 additions and 8 deletions

View File

@ -37,10 +37,25 @@ bool AssetLoaderMenuList::LoadFromRaw(const std::string& assetName, ISearchPath*
return std::move(foundFileToInclude.m_stream); return std::move(foundFileToInclude.m_stream);
}); });
if(!reader.ReadMenuFile()) const auto menuFileResult = reader.ReadMenuFile();
if(menuFileResult)
{ {
std::cout << "Could not read menu list \"" << assetName << "\"\n"; std::cout << "Successfully read menu list \"" << assetName << "\":\n";
std::cout << " " << menuFileResult->m_menus_to_load.size() << " menus to load:\n";
for (const auto& menuToLoad : menuFileResult->m_menus_to_load)
std::cout << " " << menuToLoad << "\n";
std::cout << " " << menuFileResult->m_menus.size() << " menus:\n";
for (const auto& menu : menuFileResult->m_menus)
std::cout << " " << menu->m_name << "\n";
std::cout << " " << menuFileResult->m_functions.size() << " functions:\n";
for (const auto& function : menuFileResult->m_functions)
std::cout << " " << function->m_name << "\n";
} }
else
std::cout << "Could not read menu list \"" << assetName << "\"\n";
return true; return true;
} }

View File

@ -0,0 +1,15 @@
#pragma once
#include <memory>
#include <vector>
#include "CommonFunctionDef.h"
#include "CommonMenuDef.h"
class MenuParsingResult
{
public:
std::vector<std::unique_ptr<CommonMenuDef>> m_menus;
std::vector<std::unique_ptr<CommonFunctionDef>> m_functions;
std::vector<std::string> m_menus_to_load;
};

View File

@ -80,3 +80,8 @@ const std::vector<MenuFileParser::sequence_t*>& MenuFileParser::GetTestsForState
return m_global_scope_tests; return m_global_scope_tests;
} }
MenuFileParserState* MenuFileParser::GetState() const
{
return m_state.get();
}

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "Utils/ClassUtils.h"
#include "MenuFileParserState.h" #include "MenuFileParserState.h"
#include "Parsing/Simple/SimpleLexer.h" #include "Parsing/Simple/SimpleLexer.h"
#include "Parsing/Simple/SimpleParserValue.h" #include "Parsing/Simple/SimpleParserValue.h"
@ -27,4 +28,5 @@ protected:
public: public:
MenuFileParser(SimpleLexer* lexer, MenuFeatureLevel featureLevel); MenuFileParser(SimpleLexer* lexer, MenuFeatureLevel featureLevel);
_NODISCARD MenuFileParserState* GetState() const;
}; };

View File

@ -68,14 +68,59 @@ void MenuFileReader::SetupStreamProxies()
m_stream = m_open_streams.back().get(); m_stream = m_open_streams.back().get();
} }
bool MenuFileReader::ReadMenuFile() bool MenuFileReader::IsValidEndState(const MenuFileParserState* state) const
{
if(state->m_current_item)
{
std::cout << "In \"" << m_file_name << "\": Unclosed item at end of file!\n";
return false;
}
if(state->m_current_menu)
{
std::cout << "In \"" << m_file_name << "\": Unclosed menu at end of file!\n";
return false;
}
if(state->m_current_function)
{
std::cout << "In \"" << m_file_name << "\": Unclosed function at end of file!\n";
return false;
}
if(state->m_in_global_scope)
{
std::cout << "In \"" << m_file_name << "\": Did not close global scope!\n";
return false;
}
return true;
}
std::unique_ptr<MenuParsingResult> MenuFileReader::CreateParsingResult(MenuFileParserState* state) const
{
auto result = std::make_unique<MenuParsingResult>();
result->m_menus = std::move(state->m_menus);
result->m_functions = std::move(state->m_functions);
result->m_menus_to_load = std::move(state->m_menus_to_load);
return result;
}
std::unique_ptr<MenuParsingResult> MenuFileReader::ReadMenuFile()
{ {
const auto lexer = std::make_unique<SimpleLexer>(m_stream, SimpleLexer::Config{false, true, false}); const auto lexer = std::make_unique<SimpleLexer>(m_stream, SimpleLexer::Config{false, true, false});
const auto parser = std::make_unique<MenuFileParser>(lexer.get(), m_feature_level); const auto parser = std::make_unique<MenuFileParser>(lexer.get(), m_feature_level);
if (parser->Parse()) if (!parser->Parse())
return true; {
std::cout << "Parsing menu file failed!" << std::endl; std::cout << "Parsing menu file failed!" << std::endl;
return false; return nullptr;
}
auto* parserEndState = parser->GetState();
if (!IsValidEndState(parserEndState))
return nullptr;
return CreateParsingResult(parserEndState);
} }

View File

@ -4,7 +4,9 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "MenuFileParserState.h"
#include "Domain/MenuFeatureLevel.h" #include "Domain/MenuFeatureLevel.h"
#include "Domain/MenuParsingResult.h"
#include "Parsing/IParserLineStream.h" #include "Parsing/IParserLineStream.h"
class MenuFileReader class MenuFileReader
@ -23,9 +25,12 @@ private:
void SetupDefinesProxy(); void SetupDefinesProxy();
void SetupStreamProxies(); void SetupStreamProxies();
bool IsValidEndState(const MenuFileParserState* state) const;
std::unique_ptr<MenuParsingResult> CreateParsingResult(MenuFileParserState* state) const;
public: public:
MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel); MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel);
MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback); MenuFileReader(std::istream& stream, std::string fileName, MenuFeatureLevel featureLevel, include_callback_t includeCallback);
bool ReadMenuFile(); std::unique_ptr<MenuParsingResult> ReadMenuFile();
}; };