Implement procedure pointers
This commit is contained in:
@ -417,28 +417,6 @@ namespace boot
|
||||
top_type& body();
|
||||
};
|
||||
|
||||
/**
|
||||
* Procedure call expression.
|
||||
*/
|
||||
class call_expression : public expression
|
||||
{
|
||||
std::string m_name;
|
||||
std::vector<expression *> m_arguments;
|
||||
|
||||
public:
|
||||
/**
|
||||
* \param position Source code position.
|
||||
* \param name Callable's name.
|
||||
*/
|
||||
call_expression(const struct position position, const std::string& name);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
std::string& name();
|
||||
std::vector<expression *>& arguments();
|
||||
|
||||
virtual ~call_expression() override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Cast expression.
|
||||
*/
|
||||
@ -589,6 +567,24 @@ namespace boot
|
||||
~dereference_expression() override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Procedure call expression.
|
||||
*/
|
||||
class call_expression : public expression
|
||||
{
|
||||
designator_expression *m_callable;
|
||||
|
||||
public:
|
||||
std::vector<expression *> arguments;
|
||||
|
||||
call_expression(const struct position position, designator_expression *callable);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
designator_expression& callable();
|
||||
|
||||
virtual ~call_expression() override;
|
||||
};
|
||||
|
||||
class assign_statement : public statement
|
||||
{
|
||||
designator_expression *m_lvalue;
|
||||
|
@ -40,6 +40,7 @@ namespace gcc
|
||||
std::shared_ptr<symbol_table> symbol_map;
|
||||
|
||||
tree build_label_decl(const char *name, location_t loc);
|
||||
tree build_procedure_type(boot::procedure_type& type);
|
||||
tree build_type(boot::top_type& type);
|
||||
|
||||
void enter_scope();
|
||||
@ -56,7 +57,7 @@ namespace gcc
|
||||
tree build_bit_logic_operation(boot::binary_expression *expression, tree left, tree right);
|
||||
tree build_equality_operation(boot::binary_expression *expression, tree left, tree right);
|
||||
void build_procedure_call(location_t call_location,
|
||||
tree symbol, const std::vector<boot::expression *>& arguments);
|
||||
tree procedure_address, const std::vector<boot::expression *>& arguments);
|
||||
void build_record_call(location_t call_location,
|
||||
tree symbol, const std::vector<boot::expression *>& arguments);
|
||||
|
||||
|
@ -39,7 +39,6 @@ namespace gcc
|
||||
bool is_integral_type(tree type);
|
||||
bool is_numeric_type(tree type);
|
||||
bool is_array_type(tree type);
|
||||
bool is_procedure_type(tree type);
|
||||
bool is_void_type(tree type);
|
||||
|
||||
/**
|
||||
@ -55,6 +54,16 @@ namespace gcc
|
||||
*/
|
||||
bool are_compatible_pointers(tree lhs_type, tree rhs);
|
||||
|
||||
/**
|
||||
* Prepares a value to be bound to a variable or parameter.
|
||||
*
|
||||
* If rvalue is a procedure declaration, builds a procedure pointer.
|
||||
*
|
||||
* \param rvalue Value to be assigned.
|
||||
* \return Processed value.
|
||||
*/
|
||||
tree prepare_rvalue(tree rvalue);
|
||||
|
||||
/**
|
||||
* \param assignee Assignee.
|
||||
* \param assignee Assignment.
|
||||
|
Reference in New Issue
Block a user