mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-20 16:15:43 +00:00
Add blocks to header parsing state that manipulate which sequences are valid
This commit is contained in:
parent
3f08be0564
commit
e685348abd
@ -18,14 +18,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockEnum::GetTestsForBlock(
|
||||
return tests;
|
||||
}
|
||||
|
||||
void HeaderBlockEnum::OnOpen()
|
||||
void HeaderBlockEnum::OnOpen(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockEnum::OnClose()
|
||||
void HeaderBlockEnum::OnClose(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockEnum::OnChildBlockClose(IHeaderBlock* block)
|
||||
void HeaderBlockEnum::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
|
||||
{
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ class HeaderBlockEnum final : public IHeaderBlock
|
||||
public:
|
||||
HeaderBlockType GetType() override;
|
||||
const std::vector<sequence_t*>& GetTestsForBlock() override;
|
||||
void OnOpen() override;
|
||||
void OnClose() override;
|
||||
void OnChildBlockClose(IHeaderBlock* block) override;
|
||||
void OnOpen(HeaderParserState* state) override;
|
||||
void OnClose(HeaderParserState* state) override;
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
};
|
||||
|
@ -8,6 +8,11 @@
|
||||
#include "Parsing/Header/Sequence/SequenceTypedef.h"
|
||||
#include "Parsing/Header/Sequence/SequenceUnion.h"
|
||||
|
||||
HeaderBlockNamespace::HeaderBlockNamespace(std::string namespaceName)
|
||||
: m_namespace_name(std::move(namespaceName))
|
||||
{
|
||||
}
|
||||
|
||||
HeaderBlockType HeaderBlockNamespace::GetType()
|
||||
{
|
||||
return HeaderBlockType::NAMESPACE;
|
||||
@ -28,14 +33,16 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockNamespace::GetTestsForB
|
||||
return tests;
|
||||
}
|
||||
|
||||
void HeaderBlockNamespace::OnOpen()
|
||||
void HeaderBlockNamespace::OnOpen(HeaderParserState* state)
|
||||
{
|
||||
state->m_namespace.Push(m_namespace_name);
|
||||
}
|
||||
|
||||
void HeaderBlockNamespace::OnClose()
|
||||
void HeaderBlockNamespace::OnClose(HeaderParserState* state)
|
||||
{
|
||||
state->m_namespace.Pop();
|
||||
}
|
||||
|
||||
void HeaderBlockNamespace::OnChildBlockClose(IHeaderBlock* block)
|
||||
void HeaderBlockNamespace::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
|
||||
{
|
||||
}
|
||||
|
@ -4,10 +4,14 @@
|
||||
|
||||
class HeaderBlockNamespace final : public IHeaderBlock
|
||||
{
|
||||
std::string m_namespace_name;
|
||||
|
||||
public:
|
||||
explicit HeaderBlockNamespace(std::string namespaceName);
|
||||
|
||||
HeaderBlockType GetType() override;
|
||||
const std::vector<sequence_t*>& GetTestsForBlock() override;
|
||||
void OnOpen() override;
|
||||
void OnClose() override;
|
||||
void OnChildBlockClose(IHeaderBlock* block) override;
|
||||
void OnOpen(HeaderParserState* state) override;
|
||||
void OnClose(HeaderParserState* state) override;
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
};
|
||||
|
@ -26,14 +26,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockNone::GetTestsForBlock(
|
||||
return tests;
|
||||
}
|
||||
|
||||
void HeaderBlockNone::OnOpen()
|
||||
void HeaderBlockNone::OnOpen(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockNone::OnClose()
|
||||
void HeaderBlockNone::OnClose(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockNone::OnChildBlockClose(IHeaderBlock* block)
|
||||
void HeaderBlockNone::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
|
||||
{
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ class HeaderBlockNone final : public IHeaderBlock
|
||||
public:
|
||||
HeaderBlockType GetType() override;
|
||||
const std::vector<sequence_t*>& GetTestsForBlock() override;
|
||||
void OnOpen() override;
|
||||
void OnClose() override;
|
||||
void OnChildBlockClose(IHeaderBlock* block) override;
|
||||
void OnOpen(HeaderParserState* state) override;
|
||||
void OnClose(HeaderParserState* state) override;
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
};
|
||||
|
@ -24,14 +24,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockStruct::GetTestsForBloc
|
||||
return tests;
|
||||
}
|
||||
|
||||
void HeaderBlockStruct::OnOpen()
|
||||
void HeaderBlockStruct::OnOpen(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockStruct::OnClose()
|
||||
void HeaderBlockStruct::OnClose(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockStruct::OnChildBlockClose(IHeaderBlock* block)
|
||||
void HeaderBlockStruct::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
|
||||
{
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ class HeaderBlockStruct final : public IHeaderBlock
|
||||
public:
|
||||
HeaderBlockType GetType() override;
|
||||
const std::vector<sequence_t*>& GetTestsForBlock() override;
|
||||
void OnOpen() override;
|
||||
void OnClose() override;
|
||||
void OnChildBlockClose(IHeaderBlock* block) override;
|
||||
void OnOpen(HeaderParserState* state) override;
|
||||
void OnClose(HeaderParserState* state) override;
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
};
|
||||
|
@ -24,14 +24,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockUnion::GetTestsForBlock
|
||||
return tests;
|
||||
}
|
||||
|
||||
void HeaderBlockUnion::OnOpen()
|
||||
void HeaderBlockUnion::OnOpen(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockUnion::OnClose()
|
||||
void HeaderBlockUnion::OnClose(HeaderParserState* state)
|
||||
{
|
||||
}
|
||||
|
||||
void HeaderBlockUnion::OnChildBlockClose(IHeaderBlock* block)
|
||||
void HeaderBlockUnion::OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block)
|
||||
{
|
||||
}
|
||||
|
@ -7,7 +7,7 @@ class HeaderBlockUnion final : public IHeaderBlock
|
||||
public:
|
||||
HeaderBlockType GetType() override;
|
||||
const std::vector<sequence_t*>& GetTestsForBlock() override;
|
||||
void OnOpen() override;
|
||||
void OnClose() override;
|
||||
void OnChildBlockClose(IHeaderBlock* block) override;
|
||||
void OnOpen(HeaderParserState* state) override;
|
||||
void OnClose(HeaderParserState* state) override;
|
||||
void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
|
||||
};
|
||||
|
@ -32,7 +32,7 @@ public:
|
||||
|
||||
virtual const std::vector<sequence_t*>& GetTestsForBlock() = 0;
|
||||
|
||||
virtual void OnOpen() = 0;
|
||||
virtual void OnClose() = 0;
|
||||
virtual void OnChildBlockClose(IHeaderBlock* block) = 0;
|
||||
virtual void OnOpen(HeaderParserState* state) = 0;
|
||||
virtual void OnClose(HeaderParserState* state) = 0;
|
||||
virtual void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) = 0;
|
||||
};
|
@ -11,3 +11,21 @@ IHeaderBlock* HeaderParserState::GetBlock() const
|
||||
{
|
||||
return m_blocks.top().get();
|
||||
}
|
||||
|
||||
void HeaderParserState::PushBlock(std::unique_ptr<IHeaderBlock> block)
|
||||
{
|
||||
m_blocks.emplace(std::move(block));
|
||||
m_blocks.top()->OnOpen(this);
|
||||
}
|
||||
|
||||
void HeaderParserState::PopBlock()
|
||||
{
|
||||
// Leave at least one block on the stack which should be the only "none" block
|
||||
if (m_blocks.size() > 1)
|
||||
{
|
||||
std::unique_ptr<IHeaderBlock> poppedBlock = std::move(m_blocks.top());
|
||||
m_blocks.pop();
|
||||
poppedBlock->OnClose(this);
|
||||
m_blocks.top()->OnChildBlockClose(this, poppedBlock.get());
|
||||
}
|
||||
}
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <stack>
|
||||
|
||||
#include "Utils/ClassUtils.h"
|
||||
#include "Utils/NamespaceBuilder.h"
|
||||
#include "Parsing/Header/Block/IHeaderBlock.h"
|
||||
|
||||
class IHeaderBlock;
|
||||
@ -12,7 +13,11 @@ class HeaderParserState
|
||||
std::stack<std::unique_ptr<IHeaderBlock>> m_blocks;
|
||||
|
||||
public:
|
||||
NamespaceBuilder m_namespace;
|
||||
|
||||
HeaderParserState();
|
||||
|
||||
_NODISCARD IHeaderBlock* GetBlock() const;
|
||||
void PushBlock(std::unique_ptr<IHeaderBlock> block);
|
||||
void PopBlock();
|
||||
};
|
||||
|
@ -18,4 +18,6 @@ SequenceCloseBlock::SequenceCloseBlock()
|
||||
|
||||
void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
// TODO: Set variable name to last block
|
||||
state->PopBlock();
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "SequenceEnum.h"
|
||||
|
||||
#include "Parsing/Header/Block/HeaderBlockEnum.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
|
||||
|
||||
@ -22,4 +23,5 @@ SequenceEnum::SequenceEnum()
|
||||
|
||||
void SequenceEnum::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
state->PushBlock(std::make_unique<HeaderBlockEnum>());
|
||||
}
|
||||
|
@ -1,5 +1,7 @@
|
||||
#include "SequenceNamespace.h"
|
||||
|
||||
|
||||
#include "Parsing/Header/Block/HeaderBlockNamespace.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
|
||||
SequenceNamespace::SequenceNamespace()
|
||||
@ -15,4 +17,6 @@ SequenceNamespace::SequenceNamespace()
|
||||
|
||||
void SequenceNamespace::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
assert(result.HasNextCapture(CAPTURE_NAME));
|
||||
state->PushBlock(std::make_unique<HeaderBlockNamespace>(result.NextCapture(CAPTURE_NAME).IdentifierValue()));
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "SequenceStruct.h"
|
||||
|
||||
#include "Parsing/Header/Block/HeaderBlockStruct.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
|
||||
|
||||
@ -25,4 +26,5 @@ SequenceStruct::SequenceStruct()
|
||||
|
||||
void SequenceStruct::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
state->PushBlock(std::make_unique<HeaderBlockStruct>());
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "SequenceUnion.h"
|
||||
|
||||
#include "Parsing/Header/Block/HeaderBlockUnion.h"
|
||||
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
|
||||
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
|
||||
|
||||
@ -25,4 +26,5 @@ SequenceUnion::SequenceUnion()
|
||||
|
||||
void SequenceUnion::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
|
||||
{
|
||||
state->PushBlock(std::make_unique<HeaderBlockUnion>());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user