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

@ -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;
}
MenuFileParserState* MenuFileParser::GetState() const
{
return m_state.get();
}

View File

@ -1,5 +1,6 @@
#pragma once
#include "Utils/ClassUtils.h"
#include "MenuFileParserState.h"
#include "Parsing/Simple/SimpleLexer.h"
#include "Parsing/Simple/SimpleParserValue.h"
@ -27,4 +28,5 @@ protected:
public:
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();
}
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 parser = std::make_unique<MenuFileParser>(lexer.get(), m_feature_level);
if (parser->Parse())
return true;
if (!parser->Parse())
{
std::cout << "Parsing menu file failed!" << std::endl;
return nullptr;
}
std::cout << "Parsing menu file failed!" << std::endl;
return false;
auto* parserEndState = parser->GetState();
if (!IsValidEndState(parserEndState))
return nullptr;
return CreateParsingResult(parserEndState);
}

View File

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