From 57547854c4533e6d0627b961120c0dc09e2e245a Mon Sep 17 00:00:00 2001 From: Jan Date: Thu, 18 Feb 2021 18:38:00 +0100 Subject: [PATCH] Parse forward declarations --- .../Domain/Definition/ForwardDeclaration.h | 2 +- .../Header/Sequence/SequenceForwardDecl.cpp | 30 ++++++++++++++++--- .../Header/Sequence/SequenceForwardDecl.h | 3 +- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h index a7b221fa..89283ae7 100644 --- a/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h +++ b/src/ZoneCodeGeneratorLib/Domain/Definition/ForwardDeclaration.h @@ -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); diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp index f840bb39..77dc1b60 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.cpp @@ -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& 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(state->m_namespace.ToString(), result.NextCapture(CAPTURE_NAME).IdentifierValue(), type)); } diff --git a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h index dffa5e17..44304de2 100644 --- a/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h +++ b/src/ZoneCodeGeneratorLib/Parsing/Header/Sequence/SequenceForwardDecl.h @@ -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& result) const override;