Introduce float type

This commit is contained in:
2024-12-31 18:10:34 +01:00
parent 75a691134f
commit 8176da5f9b
8 changed files with 100 additions and 60 deletions

View File

@ -27,7 +27,8 @@ namespace gcc
public:
void visit(source::program *program) override;
void visit(source::call_statement *statement) override;
void visit(source::integer_literal *literal) override;
void visit(source::number_literal<std::int32_t> *literal) override;
void visit(source::number_literal<double> *literal) override;
void visit(source::boolean_literal *literal) override;
void visit(source::binary_expression *expression) override;
void visit(source::constant_definition *definition) override;

View File

@ -46,7 +46,8 @@ namespace source
class unary_expression;
class type_expression;
class variable_expression;
class integer_literal;
template<typename T>
class number_literal;
class boolean_literal;
/**
@ -68,7 +69,8 @@ namespace source
virtual void visit(unary_expression *) = 0;
virtual void visit(type_expression *) = 0;
virtual void visit(variable_expression *) = 0;
virtual void visit(integer_literal *) = 0;
virtual void visit(number_literal<std::int32_t> *) = 0;
virtual void visit(number_literal<double> *) = 0;
virtual void visit(boolean_literal *) = 0;
};
@ -91,7 +93,8 @@ namespace source
virtual void visit(unary_expression *expression) override;
virtual void visit(type_expression *variable) override;
virtual void visit(variable_expression *variable) override;
virtual void visit(integer_literal *number) override;
virtual void visit(number_literal<std::int32_t> *number) override;
virtual void visit(number_literal<double> *) override;
virtual void visit(boolean_literal *boolean) override;
};
@ -267,7 +270,7 @@ namespace source
*/
class constant_definition : public definition
{
std::unique_ptr<integer_literal> m_body;
std::unique_ptr<number_literal<std::int32_t>> m_body;
public:
/**
@ -276,10 +279,10 @@ namespace source
* \param body Constant value.
*/
constant_definition(const struct position position, const std::string& identifier,
std::unique_ptr<integer_literal>&& body);
std::unique_ptr<number_literal<std::int32_t>>&& body);
virtual void accept(parser_visitor *visitor) override;
integer_literal& body();
number_literal<std::int32_t>& body();
};
/**
@ -427,15 +430,26 @@ namespace source
virtual void accept(parser_visitor *visitor) override;
};
class integer_literal : public expression
template<typename T>
class number_literal : public expression
{
std::int32_t m_number;
T m_number;
public:
integer_literal(const struct position position, const std::int32_t value);
virtual void accept(parser_visitor *visitor) override;
number_literal(const struct position position, const T value)
: expression(position), m_number(value)
{
}
std::int32_t number() const noexcept;
virtual void accept(parser_visitor *visitor) override
{
visitor->visit(this);
}
T number() const noexcept
{
return m_number;
}
};
class boolean_literal : public expression