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; 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: public:
HeaderBlockType GetType() override; HeaderBlockType GetType() override;
const std::vector<sequence_t*>& GetTestsForBlock() override; const std::vector<sequence_t*>& GetTestsForBlock() override;
void OnOpen() override; void OnOpen(HeaderParserState* state) override;
void OnClose() override; void OnClose(HeaderParserState* state) override;
void OnChildBlockClose(IHeaderBlock* block) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
}; };

View File

@ -8,6 +8,11 @@
#include "Parsing/Header/Sequence/SequenceTypedef.h" #include "Parsing/Header/Sequence/SequenceTypedef.h"
#include "Parsing/Header/Sequence/SequenceUnion.h" #include "Parsing/Header/Sequence/SequenceUnion.h"
HeaderBlockNamespace::HeaderBlockNamespace(std::string namespaceName)
: m_namespace_name(std::move(namespaceName))
{
}
HeaderBlockType HeaderBlockNamespace::GetType() HeaderBlockType HeaderBlockNamespace::GetType()
{ {
return HeaderBlockType::NAMESPACE; return HeaderBlockType::NAMESPACE;
@ -28,14 +33,16 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockNamespace::GetTestsForB
return tests; 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 class HeaderBlockNamespace final : public IHeaderBlock
{ {
std::string m_namespace_name;
public: public:
explicit HeaderBlockNamespace(std::string namespaceName);
HeaderBlockType GetType() override; HeaderBlockType GetType() override;
const std::vector<sequence_t*>& GetTestsForBlock() override; const std::vector<sequence_t*>& GetTestsForBlock() override;
void OnOpen() override; void OnOpen(HeaderParserState* state) override;
void OnClose() override; void OnClose(HeaderParserState* state) override;
void OnChildBlockClose(IHeaderBlock* block) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
}; };

View File

@ -26,14 +26,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockNone::GetTestsForBlock(
return tests; 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: public:
HeaderBlockType GetType() override; HeaderBlockType GetType() override;
const std::vector<sequence_t*>& GetTestsForBlock() override; const std::vector<sequence_t*>& GetTestsForBlock() override;
void OnOpen() override; void OnOpen(HeaderParserState* state) override;
void OnClose() override; void OnClose(HeaderParserState* state) override;
void OnChildBlockClose(IHeaderBlock* block) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
}; };

View File

@ -24,14 +24,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockStruct::GetTestsForBloc
return tests; 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: public:
HeaderBlockType GetType() override; HeaderBlockType GetType() override;
const std::vector<sequence_t*>& GetTestsForBlock() override; const std::vector<sequence_t*>& GetTestsForBlock() override;
void OnOpen() override; void OnOpen(HeaderParserState* state) override;
void OnClose() override; void OnClose(HeaderParserState* state) override;
void OnChildBlockClose(IHeaderBlock* block) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
}; };

View File

@ -24,14 +24,14 @@ const std::vector<IHeaderBlock::sequence_t*>& HeaderBlockUnion::GetTestsForBlock
return tests; 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: public:
HeaderBlockType GetType() override; HeaderBlockType GetType() override;
const std::vector<sequence_t*>& GetTestsForBlock() override; const std::vector<sequence_t*>& GetTestsForBlock() override;
void OnOpen() override; void OnOpen(HeaderParserState* state) override;
void OnClose() override; void OnClose(HeaderParserState* state) override;
void OnChildBlockClose(IHeaderBlock* block) override; void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) override;
}; };

View File

@ -32,7 +32,7 @@ public:
virtual const std::vector<sequence_t*>& GetTestsForBlock() = 0; virtual const std::vector<sequence_t*>& GetTestsForBlock() = 0;
virtual void OnOpen() = 0; virtual void OnOpen(HeaderParserState* state) = 0;
virtual void OnClose() = 0; virtual void OnClose(HeaderParserState* state) = 0;
virtual void OnChildBlockClose(IHeaderBlock* block) = 0; virtual void OnChildBlockClose(HeaderParserState* state, IHeaderBlock* block) = 0;
}; };

View File

@ -11,3 +11,21 @@ IHeaderBlock* HeaderParserState::GetBlock() const
{ {
return m_blocks.top().get(); 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 <stack>
#include "Utils/ClassUtils.h" #include "Utils/ClassUtils.h"
#include "Utils/NamespaceBuilder.h"
#include "Parsing/Header/Block/IHeaderBlock.h" #include "Parsing/Header/Block/IHeaderBlock.h"
class IHeaderBlock; class IHeaderBlock;
@ -12,7 +13,11 @@ class HeaderParserState
std::stack<std::unique_ptr<IHeaderBlock>> m_blocks; std::stack<std::unique_ptr<IHeaderBlock>> m_blocks;
public: public:
NamespaceBuilder m_namespace;
HeaderParserState(); HeaderParserState();
_NODISCARD IHeaderBlock* GetBlock() const; _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 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 "SequenceEnum.h"
#include "Parsing/Header/Block/HeaderBlockEnum.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
@ -22,4 +23,5 @@ SequenceEnum::SequenceEnum()
void SequenceEnum::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const 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 "SequenceNamespace.h"
#include "Parsing/Header/Block/HeaderBlockNamespace.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
SequenceNamespace::SequenceNamespace() SequenceNamespace::SequenceNamespace()
@ -15,4 +17,6 @@ SequenceNamespace::SequenceNamespace()
void SequenceNamespace::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const 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 "SequenceStruct.h"
#include "Parsing/Header/Block/HeaderBlockStruct.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
@ -25,4 +26,5 @@ SequenceStruct::SequenceStruct()
void SequenceStruct::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const 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 "SequenceUnion.h"
#include "Parsing/Header/Block/HeaderBlockUnion.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
@ -25,4 +26,5 @@ SequenceUnion::SequenceUnion()
void SequenceUnion::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const void SequenceUnion::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{ {
state->PushBlock(std::make_unique<HeaderBlockUnion>());
} }