Support multiple function arguments
This commit is contained in:
@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -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:
|
||||
};
|
||||
}
|
||||
|
Reference in New Issue
Block a user