Add pointer and field access nodes

This commit is contained in:
2025-01-08 23:23:27 +01:00
parent 2d61828903
commit cf4b6b7ccc
6 changed files with 242 additions and 44 deletions

View File

@ -49,8 +49,12 @@ namespace source
class unary_expression;
class basic_type_expression;
class array_type_expression;
class pointer_type_expression;
class record_type_expression;
class variable_expression;
class array_access_expression;
class field_access_expression;
class dereference_expression;
template<typename T>
class number_literal;
class char_literal;
@ -76,8 +80,12 @@ namespace source
virtual void visit(unary_expression *) = 0;
virtual void visit(basic_type_expression *) = 0;
virtual void visit(array_type_expression *) = 0;
virtual void visit(pointer_type_expression *) = 0;
virtual void visit(record_type_expression *) = 0;
virtual void visit(variable_expression *) = 0;
virtual void visit(array_access_expression *) = 0;
virtual void visit(field_access_expression *is_field_access) = 0;
virtual void visit(dereference_expression *is_dereference) = 0;
virtual void visit(number_literal<std::int32_t> *) = 0;
virtual void visit(number_literal<double> *) = 0;
virtual void visit(number_literal<bool> *) = 0;
@ -105,8 +113,12 @@ namespace source
virtual void visit(unary_expression *expression) override;
virtual void visit(basic_type_expression *) override;
virtual void visit(array_type_expression *expression) override;
virtual void visit(pointer_type_expression *) override;
virtual void visit(record_type_expression *expression) override;
virtual void visit(variable_expression *) override;
virtual void visit(array_access_expression *expression) override;
virtual void visit(field_access_expression *is_field_access) override;
virtual void visit(dereference_expression *is_dereference) override;
virtual void visit(number_literal<std::int32_t> *) override;
virtual void visit(number_literal<double> *) override;
virtual void visit(number_literal<bool> *) override;
@ -240,6 +252,8 @@ namespace source
virtual const std::string& base_name() = 0;
virtual basic_type_expression *is_basic();
virtual array_type_expression *is_array();
virtual pointer_type_expression *is_pointer();
virtual record_type_expression *is_record();
protected:
type_expression(const struct position position);
@ -270,22 +284,11 @@ namespace source
type_expression *m_base;
public:
/**
* Array size.
*/
const std::uint32_t size;
/**
* \param position Source code position.
* \param name Array base type.
* \param name Array size.
*/
array_type_expression(const struct position position, type_expression *base, const std::uint32_t size);
virtual void accept(parser_visitor *visitor) override;
/**
* \return Array base type.
*/
type_expression& base();
const std::string& base_name() override;
@ -294,6 +297,39 @@ namespace source
virtual ~array_type_expression() override;
};
class pointer_type_expression : public type_expression
{
type_expression *m_base;
public:
pointer_type_expression(const struct position position, type_expression *base);
virtual void accept(parser_visitor *visitor) override;
type_expression& base();
const std::string& base_name() override;
pointer_type_expression *is_pointer() override;
virtual ~pointer_type_expression() override;
};
class record_type_expression : public type_expression
{
public:
using field_t = std::pair<std::string, type_expression *>;
using fields_t = std::vector<field_t>;
record_type_expression(const struct position position, fields_t&& fields);
virtual void accept(parser_visitor *visitor) override;
fields_t& fields();
record_type_expression *is_record() override;
private:
fields_t m_fields;
};
/**
* Variable declaration.
*/
@ -418,6 +454,8 @@ namespace source
public:
virtual variable_expression *is_variable();
virtual array_access_expression *is_array_access();
virtual field_access_expression *is_field_access();
virtual dereference_expression *is_dereference();
protected:
designator_expression(const struct position position);
@ -453,6 +491,39 @@ namespace source
~array_access_expression() override;
};
class field_access_expression : public designator_expression
{
designator_expression *m_base;
std::string m_field;
public:
field_access_expression(const struct position position, designator_expression *base,
const std::string& field);
virtual void accept(parser_visitor *visitor) override;
designator_expression& base();
std::string& field();
field_access_expression *is_field_access() override;
~field_access_expression() override;
};
class dereference_expression : public designator_expression
{
designator_expression *m_base;
public:
dereference_expression(const struct position position, designator_expression *base);
virtual void accept(parser_visitor *visitor) override;
designator_expression& base();
dereference_expression *is_dereference() override;
~dereference_expression() override;
};
class assign_statement : public statement
{
designator_expression *m_lvalue;

View File

@ -51,23 +51,5 @@ namespace source
/// Error column in the source text.
std::size_t column() const noexcept;
};
class name_collision final : public error
{
const struct position previous;
std::string name;
public:
/**
* \param name Symbol name.
* \param path Source file name.
* \param current Current symbol position.
* \param previous Position of the previously defined symbol.
*/
name_collision(const std::string& name, const char *path,
const struct position current, const struct position previous);
std::string what() const override;
};
}
}