End while and if statements with the end token
This commit is contained in:
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
Reference in New Issue
Block a user