diff options
Diffstat (limited to 'boot/ast.cc')
| -rw-r--r-- | boot/ast.cc | 96 |
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; |
