diff --git a/include/interpreter_tree.hpp b/include/interpreter_tree.hpp index eee663c..01b61b2 100644 --- a/include/interpreter_tree.hpp +++ b/include/interpreter_tree.hpp @@ -122,19 +122,19 @@ using Literal = std::variant< struct NameExpression; struct ScopedStatement; struct AccessExpression; +struct ReferenceExpression; using SubExpressionToken = std::variant< std::unique_ptr, std::unique_ptr, std::unique_ptr, - std::unique_ptr>; + std::unique_ptr, + std::unique_ptr>; // struct FunctionCallExpression; struct ArrayExpression; -struct ReferenceExpression; using SubExpression = std::variant< // BiaryOperatorExpression is FunctionCallExpression std::unique_ptr, - std::unique_ptr, - std::unique_ptr>; + std::unique_ptr>; // enum class LoopControlExpression { Break, @@ -497,7 +497,7 @@ struct ScopedStatement { struct ReferenceExpression { BaseNode base; - std::vector references; + utils::ReferenceModifier reference; std::unique_ptr expression; }; diff --git a/lang-parser b/lang-parser index ed33952..ad07e6d 160000 --- a/lang-parser +++ b/lang-parser @@ -1 +1 @@ -Subproject commit ed339526706e0e9289a112fa2cec6ecfdcb362ab +Subproject commit ad07e6d8fb84b902aea295baf0c1c2faccdce849 diff --git a/src/build_visitor.cpp b/src/build_visitor.cpp index 323646b..6982618 100644 --- a/src/build_visitor.cpp +++ b/src/build_visitor.cpp @@ -749,6 +749,9 @@ void BuildVisitor::Visit(SubExpressionToken& node) { } else if (current_node_type == parser::tokens::Literal) { node = std::make_unique(); Visit(*std::get>(node)); + } else if (current_node_type == parser::tokens::ReferenceExpression) { + node = std::make_unique(); + Visit(std::get>(node).get()); } else { // error } @@ -772,9 +775,6 @@ void BuildVisitor::Visit(SubExpression& node) { } else if (current_node_type == parser::tokens::SubExpressionToken) { node = std::make_unique(); Visit(*std::get>(node)); - } else if (current_node_type == parser::tokens::ReferenceExpression) { - node = std::make_unique(); - Visit(std::get>(node).get()); } else { // error } @@ -919,16 +919,15 @@ void BuildVisitor::Visit(ReferenceExpression* node) { size_t child_count = parse_node.ChildCount(); if (child_count > 1) { - node->references.resize(child_count - 1); - for (size_t i = 0; i + 1 < child_count; ++i) { - std::string reference = parse_node.NthChild(i).GetValue(); - if (reference == "^") { - node->references[i] = utils::ReferenceModifier::Reference; - } else if (reference == "~") { - node->references[i] = utils::ReferenceModifier::Dereference; - } else if (reference == "@") { - node->references[i] = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ?? - } + std::string reference_name = parse_node.NthChild(0).GetValue(); + if (reference_name == "^") { + node->reference = utils::ReferenceModifier::Reference; + } else if (reference_name == "~") { + node->reference = utils::ReferenceModifier::Dereference; + } else if (reference_name == "@") { + node->reference = utils::ReferenceModifier::UniqueReference; // TODO: rename to move ?? + } else { + // error } } diff --git a/src/execute_visitor.cpp b/src/execute_visitor.cpp index 111005d..09da633 100644 --- a/src/execute_visitor.cpp +++ b/src/execute_visitor.cpp @@ -360,7 +360,7 @@ void ExecuteVisitor::Visit(ReferenceExpression* node) { utils::ValueType value_type = context_manager_.GetValueType(current_value_); current_value_ = context_manager_.AddValue( - info::value::ReferenceToValue(node->references, current_value_, context_manager_.GetValueManager()), + info::value::ReferenceToValue({node->reference}, current_value_, context_manager_.GetValueManager()), value_type); } diff --git a/src/print_visitor.cpp b/src/print_visitor.cpp index 17ec189..077d233 100644 --- a/src/print_visitor.cpp +++ b/src/print_visitor.cpp @@ -386,18 +386,16 @@ void PrintVisitor::Visit(LoopControlExpression& node) { // enum void PrintVisitor::Visit(ReferenceExpression* node) { out_ << "[ReferenceExpression "; - for (auto& reference : node->references) { - switch (reference) { - case utils::ReferenceModifier::Reference: - out_ << '^'; - break; - case utils::ReferenceModifier::UniqueReference: - out_ << '@'; - break; - case utils::ReferenceModifier::Dereference: - out_ << '~'; - break; - } + switch (node->reference) { + case utils::ReferenceModifier::Reference: + out_ << '^'; + break; + case utils::ReferenceModifier::UniqueReference: + out_ << '@'; + break; + case utils::ReferenceModifier::Dereference: + out_ << '~'; + break; } out_ << "] ("; Visit(node->expression.get()); diff --git a/src/type_check_visitor.cpp b/src/type_check_visitor.cpp index b6ad075..3811182 100644 --- a/src/type_check_visitor.cpp +++ b/src/type_check_visitor.cpp @@ -718,7 +718,7 @@ void TypeCheckVisitor::Visit(ReferenceExpression* node) { Visit(node->expression.get()); current_type_ = context_manager_.AddValue( - info::type::ReferenceToType(node->references, + info::type::ReferenceToType({node->reference}, current_type_, context_manager_.GetValueManager()), context_manager_.GetValueType(current_type_)); // ?? diff --git a/src/typed_print_visitor.cpp b/src/typed_print_visitor.cpp index 4286127..c92bc83 100644 --- a/src/typed_print_visitor.cpp +++ b/src/typed_print_visitor.cpp @@ -545,18 +545,16 @@ void TypedPrintVisitor::Visit(ReferenceExpression* node) { } out_ << ") "; - for (auto& reference : node->references) { - switch (reference) { - case utils::ReferenceModifier::Reference: - out_ << '^'; - break; - case utils::ReferenceModifier::UniqueReference: - out_ << '@'; - break; - case utils::ReferenceModifier::Dereference: - out_ << '~'; - break; - } + switch (node->reference) { + case utils::ReferenceModifier::Reference: + out_ << '^'; + break; + case utils::ReferenceModifier::UniqueReference: + out_ << '@'; + break; + case utils::ReferenceModifier::Dereference: + out_ << '~'; + break; } out_ << "] ("; Visit(node->expression.get()); diff --git a/src/visitor.cpp b/src/visitor.cpp index c30508b..86450a7 100644 --- a/src/visitor.cpp +++ b/src/visitor.cpp @@ -134,6 +134,9 @@ void Visitor::Visit(SubExpressionToken& node) { case 3: Visit(*std::get>(node)); break; + case 4: + Visit(std::get>(node).get()); + break; default: // error break; @@ -148,9 +151,6 @@ void Visitor::Visit(SubExpression& node) { case 1: Visit(*std::get>(node)); break; - case 2: - Visit(std::get>(node).get()); - break; default: // error break;