End while and if statements with the end token

This commit is contained in:
2025-01-17 10:11:40 +01:00
parent ef667e3ace
commit a79def50e5
10 changed files with 197 additions and 99 deletions

View File

@ -31,11 +31,11 @@ namespace gcc
void enter_scope();
tree_symbol_mapping leave_scope();
void build_binarary_operation(bool condition, source::binary_expression *expression,
void build_binary_operation(bool condition, source::binary_expression *expression,
tree_code operator_code, tree left, tree right, tree target_type);
public:
generic_visitor();
generic_visitor(std::shared_ptr<source::symbol_table<tree>> symbol_table);
void visit(source::program *program) override;
void visit(source::procedure_definition *definition) override;

View File

@ -26,7 +26,6 @@ namespace gcc
bool is_pointer_type(tree type);
bool is_string_type(tree type);
bool is_array_type(tree type);
bool is_record_type(tree type);
class tree_chain_base
{
@ -58,5 +57,7 @@ namespace gcc
tree bind_expression();
tree block();
};
std::shared_ptr<elna::source::symbol_table<tree>> builtin_symbol_table();
}
}

View File

@ -52,6 +52,7 @@ namespace source
class array_type_expression;
class pointer_type_expression;
class record_type_expression;
class union_type_expression;
class variable_expression;
class array_access_expression;
class field_access_expression;
@ -83,6 +84,7 @@ namespace source
virtual void visit(array_type_expression *) = 0;
virtual void visit(pointer_type_expression *) = 0;
virtual void visit(record_type_expression *) = 0;
virtual void visit(union_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;
@ -116,6 +118,7 @@ namespace source
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(union_type_expression *expression) override;
virtual void visit(variable_expression *) override;
virtual void visit(array_access_expression *expression) override;
virtual void visit(field_access_expression *expression) override;
@ -253,6 +256,7 @@ namespace source
virtual array_type_expression *is_array();
virtual pointer_type_expression *is_pointer();
virtual record_type_expression *is_record();
virtual union_type_expression *is_union();
protected:
type_expression(const struct position position);
@ -310,23 +314,36 @@ namespace source
virtual ~pointer_type_expression() override;
};
class record_type_expression final : public type_expression
using field_t = std::pair<std::string, type_expression *>;
using fields_t = std::vector<field_t>;
class composite_type_expression : public type_expression
{
protected:
composite_type_expression(const struct position position, fields_t&& fields);
public:
fields_t fields;
virtual ~composite_type_expression() override;
};
class record_type_expression final : public composite_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;
};
virtual ~record_type_expression() override;
class union_type_expression final : public composite_type_expression
{
public:
union_type_expression(const struct position position, fields_t&& fields);
private:
fields_t m_fields;
virtual void accept(parser_visitor *visitor) override;
union_type_expression *is_union() override;
};
/**
@ -443,13 +460,11 @@ namespace source
class compound_statement : public statement
{
std::vector<statement *> m_statements;
public:
explicit compound_statement(const struct position position);
virtual void accept(parser_visitor *visitor) override;
std::vector<statement *> statements;
std::vector<statement *>& statements();
compound_statement(const struct position position, std::vector<statement *>&& statements);
virtual void accept(parser_visitor *visitor) override;
virtual ~compound_statement() override;
};
@ -556,8 +571,8 @@ namespace source
class if_statement : public statement
{
expression *m_prerequisite;
statement *m_body;
statement *m_alternative;
compound_statement *m_body;
compound_statement *m_alternative;
public:
/**
@ -567,12 +582,12 @@ namespace source
* \param alternative Statement executed if the condition is not met.
*/
if_statement(const struct position position, expression *prerequisite,
statement *body, statement *alternative = nullptr);
compound_statement *body, compound_statement *alternative = nullptr);
virtual void accept(parser_visitor *visitor) override;
expression& prerequisite();
statement& body();
statement *alternative();
compound_statement& body();
compound_statement *alternative();
virtual ~if_statement() override;
};
@ -583,7 +598,7 @@ namespace source
class while_statement : public statement
{
expression *m_prerequisite;
statement *m_body;
compound_statement *m_body;
public:
/**
@ -592,11 +607,11 @@ namespace source
* \param body Statement executed while the condition is met.
*/
while_statement(const struct position position, expression *prerequisite,
statement *body);
compound_statement *body);
virtual void accept(parser_visitor *visitor) override;
expression& prerequisite();
statement& body();
compound_statement& body();
virtual ~while_statement() override;
};