aboutsummaryrefslogtreecommitdiff
path: root/boot/ast.cc
diff options
context:
space:
mode:
Diffstat (limited to 'boot/ast.cc')
-rw-r--r--boot/ast.cc96
1 files changed, 96 insertions, 0 deletions
diff --git a/boot/ast.cc b/boot/ast.cc
index 9b3fbe4..3727aba 100644
--- a/boot/ast.cc
+++ b/boot/ast.cc
@@ -26,6 +26,11 @@ namespace elna::boot
__builtin_unreachable();
}
+ void empty_visitor::visit(slice_type_expression *)
+ {
+ __builtin_unreachable();
+ }
+
void empty_visitor::visit(pointer_type_expression *)
{
__builtin_unreachable();
@@ -126,6 +131,11 @@ namespace elna::boot
__builtin_unreachable();
}
+ void empty_visitor::visit(slicing_expression *)
+ {
+ __builtin_unreachable();
+ }
+
void empty_visitor::visit(traits_expression *)
{
__builtin_unreachable();
@@ -363,6 +373,11 @@ namespace elna::boot
expression->base().accept(this);
}
+ void walking_visitor::visit(slice_type_expression *expression)
+ {
+ expression->base().accept(this);
+ }
+
void walking_visitor::visit(pointer_type_expression *expression)
{
expression->base().accept(this);
@@ -420,6 +435,13 @@ namespace elna::boot
}
}
+ void walking_visitor::visit(slicing_expression *expression)
+ {
+ expression->base().accept(this);
+ expression->offset().accept(this);
+ expression->length().accept(this);
+ }
+
void walking_visitor::visit(traits_expression *trait)
{
if (!trait->arguments.empty())
@@ -549,6 +571,11 @@ namespace elna::boot
return nullptr;
}
+ slice_type_expression *type_expression::is_slice()
+ {
+ return nullptr;
+ }
+
array_type_expression *type_expression::is_array()
{
return nullptr;
@@ -605,6 +632,32 @@ namespace elna::boot
return *m_base;
}
+ slice_type_expression::slice_type_expression(const source_position position,
+ type_expression *base)
+ : node(position), m_base(base)
+ {
+ }
+
+ slice_type_expression::~slice_type_expression()
+ {
+ delete m_base;
+ }
+
+ void slice_type_expression::accept(parser_visitor *visitor)
+ {
+ visitor->visit(this);
+ }
+
+ slice_type_expression *slice_type_expression::is_slice()
+ {
+ return this;
+ }
+
+ type_expression& slice_type_expression::base()
+ {
+ return *m_base;
+ }
+
pointer_type_expression::pointer_type_expression(const source_position position,
type_expression *base)
: node(position), m_base(base)
@@ -1016,6 +1069,44 @@ namespace elna::boot
}
}
+ slicing_expression::slicing_expression(const source_position position,
+ expression *base, expression *offset, expression *length)
+ : node(position), m_base(base), m_offset(offset), m_length(length)
+ {
+ }
+
+ void slicing_expression::accept(parser_visitor *visitor)
+ {
+ visitor->visit(this);
+ }
+
+ slicing_expression *slicing_expression::is_slicing()
+ {
+ return this;
+ }
+
+ slicing_expression::~slicing_expression()
+ {
+ delete m_base;
+ delete m_offset;
+ delete m_length;
+ }
+
+ expression& slicing_expression::base()
+ {
+ return *this->m_base;
+ }
+
+ expression& slicing_expression::offset()
+ {
+ return *this->m_offset;
+ }
+
+ expression& slicing_expression::length()
+ {
+ return *this->m_length;
+ }
+
named_expression::named_expression(const source_position position, const std::string& name)
: node(position), name(name)
{
@@ -1339,6 +1430,11 @@ namespace elna::boot
return nullptr;
}
+ slicing_expression *designator_expression::is_slicing()
+ {
+ return nullptr;
+ }
+
designator_expression& assign_statement::lvalue()
{
return *m_lvalue;