parse typedefs

This commit is contained in:
Jan 2021-02-19 00:15:00 +01:00
parent f0753c7e3c
commit cce9494856
11 changed files with 90 additions and 11 deletions

View File

@ -1,5 +1,10 @@
#include "ArrayDeclarationModifier.h" #include "ArrayDeclarationModifier.h"
ArrayDeclarationModifier::ArrayDeclarationModifier(const int size)
: m_size(size)
{
}
DeclarationModifierType ArrayDeclarationModifier::GetType() const DeclarationModifierType ArrayDeclarationModifier::GetType() const
{ {
return DeclarationModifierType::ARRAY; return DeclarationModifierType::ARRAY;

View File

@ -2,6 +2,7 @@
#include <memory> #include <memory>
#include "Utils/ClassUtils.h"
#include "DeclarationModifier.h" #include "DeclarationModifier.h"
#include "Domain/Evaluation/IEvaluation.h" #include "Domain/Evaluation/IEvaluation.h"
@ -20,5 +21,7 @@ public:
*/ */
std::unique_ptr<IEvaluation> m_dynamic_count_evaluation; std::unique_ptr<IEvaluation> m_dynamic_count_evaluation;
DeclarationModifierType GetType() const override; explicit ArrayDeclarationModifier(int size);
_NODISCARD DeclarationModifierType GetType() const override;
}; };

View File

@ -5,7 +5,7 @@ EnumMember::EnumMember()
{ {
} }
EnumMember::EnumMember(std::string name, const long long value) EnumMember::EnumMember(std::string name, const int value)
: m_name(std::move(name)), : m_name(std::move(name)),
m_value(value) m_value(value)
{ {

View File

@ -6,8 +6,8 @@ class EnumMember
{ {
public: public:
std::string m_name; std::string m_name;
long long m_value; int m_value;
EnumMember(); EnumMember();
EnumMember(std::string name, long long value); EnumMember(std::string name, int value);
}; };

View File

@ -4,7 +4,7 @@
#include "ArrayDeclarationModifier.h" #include "ArrayDeclarationModifier.h"
TypeDeclaration::TypeDeclaration(DataDefinition* type) TypeDeclaration::TypeDeclaration(const DataDefinition* type)
: m_flags(0), : m_flags(0),
m_size(0), m_size(0),
m_alignment(0), m_alignment(0),

View File

@ -21,12 +21,12 @@ class TypeDeclaration
void CalculateAlignment(); void CalculateAlignment();
public: public:
explicit TypeDeclaration(DataDefinition* type); explicit TypeDeclaration(const DataDefinition* type);
bool m_is_const; bool m_is_const;
bool m_has_custom_bit_size; bool m_has_custom_bit_size;
DataDefinition* m_type; const DataDefinition* m_type;
unsigned m_custom_bit_size; unsigned m_custom_bit_size;
std::vector<std::unique_ptr<DeclarationModifier>> m_declaration_modifiers; std::vector<std::unique_ptr<DeclarationModifier>> m_declaration_modifiers;

View File

@ -72,7 +72,7 @@ EnumMember* HeaderBlockEnum::GetEnumMember(const std::string& name) const
return nullptr; return nullptr;
} }
long long HeaderBlockEnum::GetNextEnumMemberValue() const int HeaderBlockEnum::GetNextEnumMemberValue() const
{ {
return m_next_value; return m_next_value;
} }

View File

@ -14,7 +14,7 @@ class HeaderBlockEnum final : public IHeaderBlock, public IHeaderBlockNameHolder
const BaseTypeDefinition* m_parent_type; const BaseTypeDefinition* m_parent_type;
bool m_is_typedef; bool m_is_typedef;
std::vector<std::unique_ptr<EnumMember>> m_members; std::vector<std::unique_ptr<EnumMember>> m_members;
long long m_next_value; int m_next_value;
EnumDefinition* m_enum_definition; EnumDefinition* m_enum_definition;
std::string m_variable_name; std::string m_variable_name;
@ -30,7 +30,7 @@ public:
void AddEnumMember(std::unique_ptr<EnumMember> enumMember); void AddEnumMember(std::unique_ptr<EnumMember> enumMember);
_NODISCARD EnumMember* GetEnumMember(const std::string& name) const; _NODISCARD EnumMember* GetEnumMember(const std::string& name) const;
_NODISCARD long long GetNextEnumMemberValue() const; _NODISCARD int GetNextEnumMemberValue() const;
void SetBlockName(const TokenPos& nameTokenPos, std::string name) override; void SetBlockName(const TokenPos& nameTokenPos, std::string name) override;
bool IsDefiningVariable() override; bool IsDefiningVariable() override;

View File

@ -26,7 +26,7 @@ SequenceEnumMember::SequenceEnumMember()
void SequenceEnumMember::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const void SequenceEnumMember::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{ {
long long value; int value;
auto* enumBlock = dynamic_cast<HeaderBlockEnum*>(state->GetBlock()); auto* enumBlock = dynamic_cast<HeaderBlockEnum*>(state->GetBlock());
if (result.HasNextCapture(CAPTURE_VALUE)) if (result.HasNextCapture(CAPTURE_VALUE))

View File

@ -1,5 +1,8 @@
#include "SequenceTypedef.h" #include "SequenceTypedef.h"
#include "Domain/Definition/ArrayDeclarationModifier.h"
#include "Domain/Definition/PointerDeclarationModifier.h"
#include "Parsing/Header/Matcher/HeaderMatcherFactory.h" #include "Parsing/Header/Matcher/HeaderMatcherFactory.h"
#include "Parsing/Header/Matcher/HeaderCommonMatchers.h" #include "Parsing/Header/Matcher/HeaderCommonMatchers.h"
@ -43,6 +46,71 @@ SequenceTypedef::SequenceTypedef()
}); });
} }
void SequenceTypedef::AddPointerDeclarationModifiers(SequenceResult<HeaderParserValue>& result, TypeDeclaration* typeDeclaration) const
{
while (result.PeekAndRemoveIfTag(TAG_POINTER) == TAG_POINTER)
typeDeclaration->m_declaration_modifiers.emplace_back(std::make_unique<PointerDeclarationModifier>());
}
void SequenceTypedef::AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult<HeaderParserValue>& result, TypeDeclaration* typeDeclaration) const
{
while (result.HasNextCapture(CAPTURE_ARRAY))
{
const auto& arrayToken = result.NextCapture(CAPTURE_ARRAY);
if (arrayToken.m_type == HeaderParserValueType::INTEGER)
{
typeDeclaration->m_declaration_modifiers.emplace_back(std::make_unique<ArrayDeclarationModifier>(arrayToken.IntegerValue()));
}
else
{
auto* enumMember = state->FindEnumMember(arrayToken.IdentifierValue());
if (enumMember == nullptr)
throw ParsingException(arrayToken.GetPos(), "Unknown enum member");
typeDeclaration->m_declaration_modifiers.emplace_back(std::make_unique<ArrayDeclarationModifier>(enumMember->m_value));
}
}
}
void SequenceTypedef::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const void SequenceTypedef::ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const
{ {
const auto modeTag = result.NextTag();
assert(modeTag == TAG_ARRAY_OF_POINTERS || modeTag == TAG_POINTER_TO_ARRAY);
const auto name = result.NextCapture(CAPTURE_NAME).IdentifierValue();
const auto& typenameToken = result.NextCapture(CAPTURE_TYPE);
const auto* type = state->FindType(typenameToken.TypeNameValue());
if (type == nullptr && !state->m_namespace.IsEmpty())
{
const auto fullTypename = NamespaceBuilder::Combine(state->m_namespace.ToString(), typenameToken.TypeNameValue());
type = state->FindType(fullTypename);
}
if (type == nullptr)
throw ParsingException(typenameToken.GetPos(), "Unknown type");
auto typedefDefinition = std::make_unique<TypedefDefinition>(state->m_namespace.ToString(), name, std::make_unique<TypeDeclaration>(type));
typedefDefinition->m_type_declaration->m_is_const = result.PeekAndRemoveIfTag(TAG_CONST) == TAG_CONST;
if(result.HasNextCapture(CAPTURE_ALIGN))
{
const auto& alignToken = result.NextCapture(CAPTURE_ALIGN);
typedefDefinition->m_alignment_override = static_cast<unsigned>(alignToken.IntegerValue());
typedefDefinition->m_has_alignment_override = true;
}
if (modeTag == TAG_ARRAY_OF_POINTERS)
{
AddArrayDeclarationModifiers(state, result, typedefDefinition->m_type_declaration.get());
AddPointerDeclarationModifiers(result, typedefDefinition->m_type_declaration.get());
}
else
{
AddPointerDeclarationModifiers(result, typedefDefinition->m_type_declaration.get());
AddArrayDeclarationModifiers(state, result, typedefDefinition->m_type_declaration.get());
}
state->AddDataType(std::move(typedefDefinition));
} }

View File

@ -20,6 +20,9 @@ class SequenceTypedef final : public HeaderParser::sequence_t
static constexpr auto LABEL_ARRAY_OF_POINTERS = 1; static constexpr auto LABEL_ARRAY_OF_POINTERS = 1;
static constexpr auto LABEL_POINTER_TO_ARRAY = 2; static constexpr auto LABEL_POINTER_TO_ARRAY = 2;
void AddPointerDeclarationModifiers(SequenceResult<HeaderParserValue>& result, TypeDeclaration* typeDeclaration) const;
void AddArrayDeclarationModifiers(HeaderParserState* state, SequenceResult<HeaderParserValue>& result, TypeDeclaration* typeDeclaration) const;
protected: protected:
void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override; void ProcessMatch(HeaderParserState* state, SequenceResult<HeaderParserValue>& result) const override;