2021-02-18 18:10:49 +01:00

59 lines
1.8 KiB
C++

#include "SequenceEnumMember.h"
#include "Parsing/Header/Block/HeaderBlockEnum.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
SequenceEnumMember::SequenceEnumMember()
{
const HeaderMatcherFactory create(this);
AddMatchers({
create.Identifier().Capture(CAPTURE_NAME),
create.Optional(create.And({
create.Char('='),
create.Or({
create.Identifier().Capture(CAPTURE_VALUE),
create.Integer().Capture(CAPTURE_VALUE)
})
})),
create.Or({
create.Char(','),
create.Char('}').NoConsume()
})
});
}
void SequenceEnumMember::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{
long long value;
auto* enumBlock = dynamic_cast<HeaderBlockEnum*>(state->GetBlock());
if (result.HasNextCapture(CAPTURE_VALUE))
{
const auto& valueToken = result.NextCapture(CAPTURE_VALUE);
if (valueToken.m_type == HeaderParserValueType::IDENTIFIER)
{
auto* enumMember = enumBlock->GetEnumMember(valueToken.IdentifierValue());
if (enumMember == nullptr)
enumMember = state->FindEnumMember(valueToken.IdentifierValue());
if (enumMember == nullptr)
throw ParsingException(valueToken.GetPos(), "Could not find enum member with specified name");
value = enumMember->m_value;
}
else
{
value = valueToken.IntegerValue();
}
}
else
{
value = enumBlock->GetNextEnumMemberValue();
}
enumBlock->AddEnumMember(std::make_unique<EnumMember>(result.NextCapture(CAPTURE_NAME).IdentifierValue(), value));
}