Support multiple function arguments

This commit is contained in:
2024-03-29 11:01:19 +01:00
parent 90430c47f4
commit 5cf0863e0a
8 changed files with 137 additions and 50 deletions

View File

@ -178,11 +178,16 @@ namespace elna::source
/**
* Variable information.
*/
struct variable_info final : public info
class variable_info final : public info
{
class type m_type;
public:
std::ptrdiff_t offset{ 0 };
explicit variable_info(const class type& type);
~variable_info() override;
const class type& type() const noexcept;
};
/**
@ -193,37 +198,41 @@ namespace elna::source
class type m_type;
public:
std::ptrdiff_t offset{ 0 };
explicit parameter_info(const class type& type);
~parameter_info() override;
const class type& type() const noexcept;
};
/**
* Intrinsic and external procedure information.
*/
class intrinsic_info : public info
{
public:
std::vector<parameter_info> parameter_infos;
~intrinsic_info() override;
std::size_t parameter_stack_size() const noexcept;
};
/**
* Procedure information.
*/
class procedure_info final : public info
class procedure_info final : public intrinsic_info
{
std::size_t local_stack_size{ 0 };
std::shared_ptr<symbol_table> local_table;
public:
std::vector<parameter_info> parameter_infos;
std::size_t local_stack_size{ 0 };
std::size_t argument_stack_size{ 0 };
explicit procedure_info(std::shared_ptr<symbol_table> outer_scope);
~procedure_info() override;
void stack_size(const std::size_t size) noexcept;
std::size_t stack_size() const noexcept;
std::shared_ptr<symbol_table> scope();
};
/**
* Intrinsic and external procedure information.
*/
class intrinsic_info final : public info
{
public:
~intrinsic_info() override;
std::size_t stack_size() const noexcept;
};
/**

View File

@ -17,9 +17,14 @@ namespace elna::source
void visit(procedure_definition *procedure) override;
};
/**
* Visitor which allocates registers and stack space for variables and
* parameters.
*/
class allocator_visitor final : public empty_visitor
{
std::ptrdiff_t offset;
std::ptrdiff_t local_offset;
std::ptrdiff_t argument_offset;
std::shared_ptr<symbol_table> table;
public:
@ -28,10 +33,13 @@ namespace elna::source
void visit(declaration *declaration) override;
void visit(program *program) override;
void visit(procedure_definition *procedure) override;
void visit(call_statement *statement) override;
};
/**
* This visitor performs the type checking.
*/
class type_analysis_visitor final : public empty_visitor
{
public:
};
}