Make array ptr and length properties constant
This commit is contained in:
@ -481,11 +481,16 @@ namespace elna::boot
|
||||
|
||||
public:
|
||||
return_statement(const struct position position, expression *return_expression);
|
||||
void accept(parser_visitor *visitor);
|
||||
virtual return_statement *is_return() override;
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
expression *return_expression();
|
||||
|
||||
virtual return_statement *is_return() override;
|
||||
virtual ~return_statement() override;
|
||||
};
|
||||
|
||||
@ -497,8 +502,29 @@ namespace elna::boot
|
||||
virtual field_access_expression *is_field_access();
|
||||
virtual dereference_expression *is_dereference();
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
if (variable_expression *node = is_variable())
|
||||
{
|
||||
return visitor->visit(node);
|
||||
}
|
||||
else if (array_access_expression *node = is_array_access())
|
||||
{
|
||||
return visitor->visit(node);
|
||||
}
|
||||
else if (field_access_expression *node = is_field_access())
|
||||
{
|
||||
return visitor->visit(node);
|
||||
}
|
||||
else if (dereference_expression *node = is_dereference())
|
||||
{
|
||||
return visitor->visit(node);
|
||||
}
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
designator_expression *is_designator() override;
|
||||
void accept(parser_visitor *visitor);
|
||||
~designator_expression() = 0;
|
||||
|
||||
protected:
|
||||
@ -511,7 +537,12 @@ namespace elna::boot
|
||||
const std::string name;
|
||||
|
||||
variable_expression(const struct position position, const std::string& name);
|
||||
void accept(parser_visitor *visitor);
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
variable_expression *is_variable() override;
|
||||
};
|
||||
@ -523,7 +554,12 @@ namespace elna::boot
|
||||
|
||||
public:
|
||||
array_access_expression(const struct position position, expression *base, expression *index);
|
||||
void accept(parser_visitor *visitor);
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
expression& base();
|
||||
expression& index();
|
||||
@ -541,7 +577,12 @@ namespace elna::boot
|
||||
public:
|
||||
field_access_expression(const struct position position, expression *base,
|
||||
const std::string& field);
|
||||
void accept(parser_visitor *visitor);
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
expression& base();
|
||||
std::string& field();
|
||||
@ -557,12 +598,16 @@ namespace elna::boot
|
||||
|
||||
public:
|
||||
dereference_expression(const struct position position, expression *base);
|
||||
void accept(parser_visitor *visitor);
|
||||
|
||||
template<typename V>
|
||||
void accept(parser_visitor *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
expression& base();
|
||||
|
||||
dereference_expression *is_dereference() override;
|
||||
|
||||
~dereference_expression() override;
|
||||
};
|
||||
|
||||
@ -577,12 +622,17 @@ namespace elna::boot
|
||||
std::vector<expression *> arguments;
|
||||
|
||||
procedure_call(const struct position position, designator_expression *callable);
|
||||
void accept(parser_visitor *visitor);
|
||||
virtual procedure_call *is_call_statement() override;
|
||||
virtual procedure_call *is_call_expression() override;
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
designator_expression& callable();
|
||||
|
||||
virtual procedure_call *is_call_statement() override;
|
||||
virtual procedure_call *is_call_expression() override;
|
||||
virtual ~procedure_call() override;
|
||||
};
|
||||
|
||||
@ -599,13 +649,18 @@ namespace elna::boot
|
||||
*/
|
||||
assign_statement(const struct position position, designator_expression *lvalue,
|
||||
expression *rvalue);
|
||||
void accept(parser_visitor *visitor);
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
designator_expression& lvalue();
|
||||
expression& rvalue();
|
||||
|
||||
virtual ~assign_statement() override;
|
||||
assign_statement *is_assign() override;
|
||||
virtual ~assign_statement() override;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -621,12 +676,17 @@ namespace elna::boot
|
||||
|
||||
if_statement(const struct position position, conditional_statements *body,
|
||||
std::vector<statement *> *alternative = nullptr);
|
||||
void accept(parser_visitor *visitor);
|
||||
virtual if_statement *is_if() override;
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
conditional_statements& body();
|
||||
std::vector<statement *> *alternative();
|
||||
|
||||
virtual if_statement *is_if() override;
|
||||
virtual ~if_statement() override;
|
||||
};
|
||||
|
||||
@ -640,11 +700,16 @@ namespace elna::boot
|
||||
public:
|
||||
std::vector<conditional_statements *> branches;
|
||||
while_statement(const struct position position, conditional_statements *body);
|
||||
void accept(parser_visitor *visitor);
|
||||
while_statement *is_while() override;
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
conditional_statements& body();
|
||||
|
||||
while_statement *is_while() override;
|
||||
virtual ~while_statement() override;
|
||||
};
|
||||
|
||||
@ -781,9 +846,14 @@ namespace elna::boot
|
||||
std::vector<statement *> statements;
|
||||
|
||||
defer_statement(const struct position position);
|
||||
void accept(parser_visitor *visitor);
|
||||
defer_statement *is_defer() override;
|
||||
|
||||
template<typename V>
|
||||
void accept(V *visitor)
|
||||
{
|
||||
visitor->visit(this);
|
||||
}
|
||||
|
||||
defer_statement *is_defer() override;
|
||||
virtual ~defer_statement() override;
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user