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: public:
const DataDefinitionType m_forwarded_type; const DataDefinitionType m_forwarded_type;
DataDefinition* m_definition; const DataDefinition* m_definition;
ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type); ForwardDeclaration(std::string _namespace, std::string name, DataDefinitionType type);

View File

@ -9,10 +9,10 @@ SequenceForwardDecl::SequenceForwardDecl()
AddMatchers({ AddMatchers({
create.Or({ create.Or({
create.Type(HeaderParserValueType::ENUM), create.Type(HeaderParserValueType::ENUM).Tag(TAG_ENUM),
create.Type(HeaderParserValueType::STRUCT), create.Type(HeaderParserValueType::STRUCT).Tag(TAG_STRUCT),
create.Type(HeaderParserValueType::UNION) create.Type(HeaderParserValueType::UNION).Tag(TAG_UNION)
}), }).Capture(CAPTURE_TYPE),
create.Identifier().Capture(CAPTURE_NAME), create.Identifier().Capture(CAPTURE_NAME),
create.Char(';') create.Char(';')
}); });
@ -20,4 +20,26 @@ SequenceForwardDecl::SequenceForwardDecl()
void SequenceForwardDecl::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const 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_STRUCT = 2;
static constexpr auto TAG_UNION = 3; 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: protected:
void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override; void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override;