Parse forward declarations

This commit is contained in:
Jan 2021-02-18 18:38:00 +01:00
parent 83b7cd77c7
commit 57547854c4
3 changed files with 29 additions and 6 deletions

View File

@ -6,7 +6,7 @@ class ForwardDeclaration final : public DataDefinition
{
public:
const DataDefinitionType m_forwarded_type;
DataDefinition* m_definition;
const DataDefinition* m_definition;
ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type);

View File

@ -9,10 +9,10 @@ SequenceForwardDecl::SequenceForwardDecl()
AddMatchers({
create.Or({
create.Type(HeaderParserValueType::ENUM),
create.Type(HeaderParserValueType::STRUCT),
create.Type(HeaderParserValueType::UNION)
}),
create.Type(HeaderParserValueType::ENUM).Tag(TAG_ENUM),
create.Type(HeaderParserValueType::STRUCT).Tag(TAG_STRUCT),
create.Type(HeaderParserValueType::UNION).Tag(TAG_UNION)
}).Capture(CAPTURE_TYPE),
create.Identifier().Capture(CAPTURE_NAME),
create.Char(';')
});
@ -20,4 +20,26 @@ SequenceForwardDecl::SequenceForwardDecl()
void SequenceForwardDecl::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{
const auto typeTag = result.NextTag();
DataDefinitionType type;
switch(typeTag)
{
case TAG_ENUM:
type = DataDefinitionType::ENUM;
break;
case TAG_STRUCT:
type = DataDefinitionType::STRUCT;
break;
case TAG_UNION:
type = DataDefinitionType::UNION;
break;
default:
throw ParsingException(result.NextCapture(CAPTURE_TYPE).GetPos(), "Unknown type");
}
state->AddForwardDeclaration(std::make_unique<ForwardDeclaration>(state->m_namespace.ToString(), result.NextCapture(CAPTURE_NAME).IdentifierValue(), type));
}

View File

@ -11,7 +11,8 @@ class SequenceForwardDecl final : public HeaderParser::sequence_t
static constexpr auto TAG_STRUCT = 2;
static constexpr auto TAG_UNION = 3;
static constexpr auto CAPTURE_NAME = 1;
static constexpr auto CAPTURE_TYPE = 1;
static constexpr auto CAPTURE_NAME = 2;
protected:
void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override;