From 065fbe6167e87348175ba842d748db79449c7062 Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Sun, 12 Jan 2025 10:35:24 +0100 Subject: [PATCH] Move type definitions to the program node --- gcc/elna-generic.cc | 2 +- include/elna/source/ast.h | 11 ++++++----- source/ast.cc | 37 ++++++++++++++++++------------------- source/parser.yy | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/gcc/elna-generic.cc b/gcc/elna-generic.cc index 24c00db..97c3e21 100644 --- a/gcc/elna-generic.cc +++ b/gcc/elna-generic.cc @@ -100,7 +100,7 @@ namespace gcc void generic_visitor::visit(source::program *program) { - for (const auto& constant : program->definitions()) + for (const auto& constant : program->type_definitions) { constant->accept(this); } diff --git a/include/elna/source/ast.h b/include/elna/source/ast.h index e090df9..e1463da 100644 --- a/include/elna/source/ast.h +++ b/include/elna/source/ast.h @@ -596,19 +596,16 @@ namespace source class block : public node { - std::vector m_definitions; statement *m_body; public: std::vector value_definitions; - block(const struct position position, std::vector&& definitions, - std::vector&& value_definitions, + block(const struct position position, std::vector&& value_definitions, statement *body); virtual void accept(parser_visitor *visitor) override; statement& body(); - std::vector& definitions(); virtual ~block() override; }; @@ -616,9 +613,13 @@ namespace source class program : public block { public: - program(const struct position position, std::vector&& definitions, + std::vector type_definitions; + + program(const struct position position, std::vector&& type_definitions, std::vector&& value_definitions, statement *body); virtual void accept(parser_visitor *visitor) override; + + virtual ~program() override; }; template diff --git a/source/ast.cc b/source/ast.cc index 1f2cb35..50fca7e 100644 --- a/source/ast.cc +++ b/source/ast.cc @@ -65,10 +65,6 @@ namespace source void empty_visitor::visit(block *block) { - for (const auto& constant : block->definitions()) - { - constant->accept(this); - } for (const auto& definition : block->value_definitions) { definition->accept(this); @@ -78,6 +74,10 @@ namespace source void empty_visitor::visit(program *program) { + for (auto definition : program->type_definitions) + { + definition->accept(this); + } visit(reinterpret_cast(program)); } @@ -447,11 +447,9 @@ namespace source delete m_body; } - block::block(const struct position position, std::vector&& definitions, - std::vector&& value_definitions, + block::block(const struct position position, std::vector&& value_definitions, statement *body) - : node(position), m_definitions(std::move(definitions)), - m_body(std::move(body)), value_definitions(std::move(value_definitions)) + : node(position), m_body(std::move(body)), value_definitions(std::move(value_definitions)) { } @@ -460,11 +458,6 @@ namespace source visitor->visit(this); } - std::vector& block::definitions() - { - return m_definitions; - } - statement& block::body() { return *m_body; @@ -472,10 +465,6 @@ namespace source block::~block() { - for (auto definition : m_definitions) - { - delete definition; - } for (auto definition : value_definitions) { delete definition; @@ -483,9 +472,11 @@ namespace source delete m_body; } - program::program(const struct position position, std::vector&& definitions, + program::program(const struct position position, + std::vector&& type_definitions, std::vector&& value_definitions, statement *body) - : block(position, std::move(definitions), std::move(value_definitions), body) + : block(position, std::move(value_definitions), body), + type_definitions(std::move(type_definitions)) { } @@ -494,6 +485,14 @@ namespace source visitor->visit(this); } + program::~program() + { + for (auto definition : type_definitions) + { + delete definition; + } + } + char_literal::char_literal(const struct position position, const unsigned char value) : expression(position), m_character(value) { diff --git a/source/parser.yy b/source/parser.yy index 0276bb7..1078a31 100644 --- a/source/parser.yy +++ b/source/parser.yy @@ -143,7 +143,7 @@ block: constant_part variable_part statement *definition++ = variable; } $$ = new elna::source::block(elna::source::position{}, - {}, std::move(definitions), std::move($3)); + std::move(definitions), std::move($3)); }; procedure_definition: PROCEDURE IDENTIFIER formal_parameter_list SEMICOLON block SEMICOLON