2
0
mirror of https://github.com/Laupetin/OpenAssetTools.git synced 2025-09-03 23:37:26 +00:00

Set closing block variable names

This commit is contained in:
Jan
2021-02-18 15:59:22 +01:00
parent bb877f87bb
commit 3c1599c1a0
11 changed files with 96 additions and 13 deletions

View File

@@ -1,14 +1,16 @@
#include "SequenceCloseBlock.h"
#include "Parsing/Header/Block/IHeaderBlockVariableDefining.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
SequenceCloseBlock::SequenceCloseBlock()
SequenceCloseBlock::SequenceCloseBlock(const bool semicolonRequired)
: m_semicolon_required(semicolonRequired)
{
const HeaderMatcherFactory create(this);
AddMatchers({
create.Char('}'),
create.Char('}').Capture(CAPTURE_CLOSING_PARENTHESIS),
create.Optional(create.And({
create.Optional(create.Identifier().Capture(CAPTURE_NAME)),
create.Char(';').Tag(TAG_SEMICOLON)
@@ -18,6 +20,27 @@ SequenceCloseBlock::SequenceCloseBlock()
void SequenceCloseBlock::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{
// TODO: Set variable name to last block
if (result.NextTag() == TAG_SEMICOLON)
{
if(!m_semicolon_required)
throw ParsingException(result.NextCapture(CAPTURE_CLOSING_PARENTHESIS).GetPos(), "Block should not be closed with semicolon");
}
else
{
if (m_semicolon_required)
throw ParsingException(result.NextCapture(CAPTURE_CLOSING_PARENTHESIS).GetPos(), "Block must be closed with semicolon");
}
if (result.HasNextCapture(CAPTURE_NAME))
{
auto* variableDefiningBlock = dynamic_cast<IHeaderBlockVariableDefining*>(state->GetBlock());
const auto& name = result.NextCapture(CAPTURE_NAME);
if (variableDefiningBlock == nullptr)
throw ParsingException(name.GetPos(), "Block does not support holding names.");
variableDefiningBlock->SetVariableName(name.IdentifierValue());
}
state->PopBlock();
}

View File

@@ -10,10 +10,13 @@ class SequenceCloseBlock final : public HeaderParser::sequence_t
static constexpr auto TAG_SEMICOLON = 1;
static constexpr auto CAPTURE_NAME = 1;
static constexpr auto CAPTURE_CLOSING_PARENTHESIS = 2;
bool m_semicolon_required;
protected:
void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override;
public:
SequenceCloseBlock();
explicit SequenceCloseBlock(bool semicolonRequired);
};