Replace type expression with traits
This commit is contained in:
@ -58,14 +58,13 @@ namespace boot
|
||||
class constant_definition;
|
||||
class procedure_definition;
|
||||
class type_definition;
|
||||
class call_expression;
|
||||
class procedure_call;
|
||||
class cast_expression;
|
||||
class type_expression;
|
||||
class assign_statement;
|
||||
class if_statement;
|
||||
class while_statement;
|
||||
class return_statement;
|
||||
class call_statement;
|
||||
class traits_expression;
|
||||
class block;
|
||||
class program;
|
||||
class binary_expression;
|
||||
@ -93,10 +92,9 @@ namespace boot
|
||||
virtual void visit(constant_definition *) = 0;
|
||||
virtual void visit(procedure_definition *) = 0;
|
||||
virtual void visit(type_definition *) = 0;
|
||||
virtual void visit(call_expression *) = 0;
|
||||
virtual void visit(procedure_call *) = 0;
|
||||
virtual void visit(cast_expression *) = 0;
|
||||
virtual void visit(type_expression *) = 0;
|
||||
virtual void visit(call_statement *) = 0;
|
||||
virtual void visit(traits_expression *) = 0;
|
||||
virtual void visit(assign_statement *) = 0;
|
||||
virtual void visit(if_statement *) = 0;
|
||||
virtual void visit(while_statement *) = 0;
|
||||
@ -134,10 +132,9 @@ namespace boot
|
||||
virtual void visit(constant_definition *definition) override;
|
||||
virtual void visit(procedure_definition *definition) override;
|
||||
virtual void visit(type_definition *definition) override;
|
||||
virtual void visit(call_expression *expression) override;
|
||||
virtual void visit(traits_expression *trait) override;
|
||||
virtual void visit(procedure_call *call) override;
|
||||
virtual void visit(cast_expression *expression) override;
|
||||
virtual void visit(type_expression *expression) override;
|
||||
virtual void visit(call_statement *statement) override;
|
||||
virtual void visit(assign_statement *statement) override;
|
||||
virtual void visit(if_statement *) override;
|
||||
virtual void visit(while_statement *) override;
|
||||
@ -189,22 +186,16 @@ namespace boot
|
||||
const struct position& position() const;
|
||||
};
|
||||
|
||||
class statement : public node
|
||||
class statement : public virtual node
|
||||
{
|
||||
protected:
|
||||
/**
|
||||
* \param position Source code position.
|
||||
*/
|
||||
explicit statement(const struct position position);
|
||||
statement();
|
||||
};
|
||||
|
||||
class expression : public node
|
||||
class expression : public virtual node
|
||||
{
|
||||
protected:
|
||||
/**
|
||||
* \param position Source code position.
|
||||
*/
|
||||
explicit expression(const struct position position);
|
||||
expression();
|
||||
};
|
||||
|
||||
/**
|
||||
@ -331,7 +322,7 @@ namespace boot
|
||||
class literal : public expression
|
||||
{
|
||||
protected:
|
||||
explicit literal(const struct position position);
|
||||
literal();
|
||||
};
|
||||
|
||||
/**
|
||||
@ -435,31 +426,17 @@ namespace boot
|
||||
virtual ~cast_expression() override;
|
||||
};
|
||||
|
||||
/**
|
||||
* Type inside an expression.
|
||||
*/
|
||||
class type_expression : public expression
|
||||
class traits_expression : public expression
|
||||
{
|
||||
std::shared_ptr<top_type> m_body;
|
||||
std::shared_ptr<top_type> m_type;
|
||||
|
||||
public:
|
||||
type_expression(const struct position position, std::shared_ptr<top_type> body);
|
||||
const std::string name;
|
||||
|
||||
traits_expression(const struct position position, const std::string& name, std::shared_ptr<top_type> type);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
top_type& body();
|
||||
};
|
||||
|
||||
class call_statement : public statement
|
||||
{
|
||||
call_expression *m_body;
|
||||
|
||||
public:
|
||||
call_statement(const struct position position, call_expression *body);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
call_expression& body();
|
||||
|
||||
virtual ~call_statement() override;
|
||||
top_type& type();
|
||||
};
|
||||
|
||||
/**
|
||||
@ -501,19 +478,17 @@ namespace boot
|
||||
virtual dereference_expression *is_dereference();
|
||||
|
||||
protected:
|
||||
designator_expression(const struct position position);
|
||||
designator_expression();
|
||||
};
|
||||
|
||||
class variable_expression : public designator_expression
|
||||
{
|
||||
std::string m_name;
|
||||
|
||||
public:
|
||||
const std::string name;
|
||||
|
||||
variable_expression(const struct position position, const std::string& name);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
const std::string& name() const;
|
||||
|
||||
variable_expression *is_variable() override;
|
||||
};
|
||||
|
||||
@ -570,19 +545,19 @@ namespace boot
|
||||
/**
|
||||
* Procedure call expression.
|
||||
*/
|
||||
class call_expression : public expression
|
||||
class procedure_call : public expression, public statement
|
||||
{
|
||||
designator_expression *m_callable;
|
||||
|
||||
public:
|
||||
std::vector<expression *> arguments;
|
||||
|
||||
call_expression(const struct position position, designator_expression *callable);
|
||||
procedure_call(const struct position position, designator_expression *callable);
|
||||
virtual void accept(parser_visitor *visitor) override;
|
||||
|
||||
designator_expression& callable();
|
||||
|
||||
virtual ~call_expression() override;
|
||||
virtual ~procedure_call() override;
|
||||
};
|
||||
|
||||
class assign_statement : public statement
|
||||
@ -676,7 +651,7 @@ namespace boot
|
||||
T value;
|
||||
|
||||
number_literal(const struct position position, const T& value)
|
||||
: literal(position), value(value)
|
||||
: node(position), value(value)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -60,15 +60,16 @@ namespace gcc
|
||||
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);
|
||||
void visit_statements(const std::vector<boot::statement *>& statements);
|
||||
|
||||
public:
|
||||
generic_visitor(std::shared_ptr<symbol_table> symbol_table);
|
||||
|
||||
void visit(boot::program *program) override;
|
||||
void visit(boot::procedure_definition *definition) override;
|
||||
void visit(boot::call_expression *expression) override;
|
||||
void visit(boot::procedure_call *call) override;
|
||||
void visit(boot::cast_expression *expression) override;
|
||||
void visit(boot::type_expression *expression) override;
|
||||
void visit(boot::traits_expression *trait) override;
|
||||
void visit(boot::number_literal<std::int32_t> *literal) override;
|
||||
void visit(boot::number_literal<std::uint32_t> *literal) override;
|
||||
void visit(boot::number_literal<double> *literal) override;
|
||||
@ -85,10 +86,10 @@ namespace gcc
|
||||
void visit(boot::array_access_expression *expression) override;
|
||||
void visit(boot::field_access_expression *expression) override;
|
||||
void visit(boot::dereference_expression *expression) override;
|
||||
void visit(boot::block *block) override;
|
||||
void visit(boot::assign_statement *statement) override;
|
||||
void visit(boot::if_statement *statement) override;
|
||||
void visit(boot::while_statement *statement) override;
|
||||
void visit(boot::call_statement *statement) override;
|
||||
void visit(boot::return_statement *statement) override;
|
||||
void visit(boot::defer_statement *statement) override;
|
||||
};
|
||||
|
Reference in New Issue
Block a user