Add blocks to header parsing state that manipulate which sequences are valid

This commit is contained in:
Jan 2021-02-14 10:27:47 +01:00
parent 3f08be0564
commit e685348abd
18 changed files with 79 additions and 33 deletions

View File

@ -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)
{
}

View File

@ -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;
};

View File

@ -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)
{
}

View File

@ -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;
};

View File

@ -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)
{
}

View File

@ -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;
};

View File

@ -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)
{
}

View File

@ -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;
};

View File

@ -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)
{
}

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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());
}
}

View File

@ -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();
};

View File

@ -18,4 +18,6 @@ SequenceCloseBlock::SequenceCloseBlock()
void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{
// TODO: Set variable name to last block
state->PopBlock();
}

View File

@ -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>());
}

View File

@ -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()));
}

View File

@ -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>());
}

View File

@ -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>());
}