Cast expressions

This commit is contained in:
2025-01-28 11:21:02 +01:00
parent 18d8ded239
commit be1a56a557
9 changed files with 183 additions and 136 deletions

View File

@ -41,7 +41,8 @@ namespace gcc
void visit(source::program *program) override;
void visit(source::procedure_definition *definition) override;
void visit(source::call_expression *statement) override;
void visit(source::call_expression *expression) override;
void visit(source::cast_expression *expression) override;
void visit(source::number_literal<std::int32_t> *literal) override;
void visit(source::number_literal<std::uint32_t> *literal) override;
void visit(source::number_literal<double> *literal) override;

View File

@ -27,6 +27,7 @@ namespace gcc
void init_ttree();
bool is_pointer_type(tree type);
bool is_string_type(tree type);
bool is_integral_type(tree type);
class tree_chain_base
{

View File

@ -41,6 +41,7 @@ namespace source
class procedure_definition;
class type_definition;
class call_expression;
class cast_expression;
class assign_statement;
class if_statement;
class while_statement;
@ -74,6 +75,7 @@ namespace source
virtual void visit(procedure_definition *) = 0;
virtual void visit(type_definition *) = 0;
virtual void visit(call_expression *) = 0;
virtual void visit(cast_expression *) = 0;
virtual void visit(expression_statement *) = 0;
virtual void visit(assign_statement *) = 0;
virtual void visit(if_statement *) = 0;
@ -109,7 +111,8 @@ namespace source
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 *statement) override;
virtual void visit(call_expression *expression) override;
virtual void visit(cast_expression *expression) override;
virtual void visit(expression_statement *statement) override;
virtual void visit(assign_statement *statement) override;
virtual void visit(if_statement *) override;
@ -136,55 +139,6 @@ namespace source
virtual void visit(string_literal *) override;
};
/**
* Operand representing a subexpression in the 3 address code.
*/
struct operand
{
public:
virtual ~operand() = 0;
};
struct integer_operand final : public operand
{
std::int32_t m_value;
public:
explicit integer_operand(const std::int32_t value);
std::int32_t value() const;
};
class variable_operand final : public operand
{
std::string m_name;
public:
explicit variable_operand(const std::string& name);
const std::string& name() const;
};
struct temporary_variable final : public operand
{
std::size_t m_counter;
public:
explicit temporary_variable(const std::size_t counter);
std::size_t counter() const;
};
struct label_operand final : public operand
{
std::size_t m_counter;
public:
explicit label_operand(const std::size_t counter);
std::size_t counter() const;
};
/**
* AST node.
*/
@ -219,9 +173,6 @@ namespace source
class expression : public node
{
public:
std::shared_ptr<operand> place;
protected:
/**
* \param position Source code position.
@ -448,7 +399,7 @@ namespace source
};
/**
* Call statement.
* Procedure call expression.
*/
class call_expression : public expression
{
@ -469,6 +420,24 @@ namespace source
virtual ~call_expression() override;
};
/**
* Cast expression.
*/
class cast_expression : public expression
{
type_expression *m_target;
expression *m_value;
public:
cast_expression(const struct position position, type_expression *target, expression *value);
virtual void accept(parser_visitor *visitor) override;
type_expression& target();
expression& value();
virtual ~cast_expression() override;
};
class expression_statement : public statement
{
expression *m_body;