From 3c2d496a85ca9aec253f3bc36418ebf856eb2b3c Mon Sep 17 00:00:00 2001 From: ProgramSnail Date: Mon, 10 Apr 2023 01:48:07 +0300 Subject: [PATCH] grammar refactoring: part of build_visitor fixed --- include/build_visitor.hpp | 2 +- include/interpreter_tree.hpp | 2 +- src/build_visitor.cpp | 120 +++++++++++++++++++++-------------- 3 files changed, 75 insertions(+), 49 deletions(-) diff --git a/include/build_visitor.hpp b/include/build_visitor.hpp index 71e7d09..d13d568 100644 --- a/include/build_visitor.hpp +++ b/include/build_visitor.hpp @@ -77,7 +77,7 @@ private: void Visit(UnaryOperatorExpression* node) override; void Visit(ReferenceExpression* node) override; - // Simple Expressions + // Other expressions void Visit(FunctionCallExpression* node) override; diff --git a/include/interpreter_tree.hpp b/include/interpreter_tree.hpp index 991a282..0b67f73 100644 --- a/include/interpreter_tree.hpp +++ b/include/interpreter_tree.hpp @@ -135,7 +135,7 @@ struct BinaryOperatorExpression; struct UnaryOperatorExpression; struct ReferenceExpression; -// Other Expressions +// Other expressions struct FunctionCallExpression; diff --git a/src/build_visitor.cpp b/src/build_visitor.cpp index 33cd4f7..3ad1a2d 100644 --- a/src/build_visitor.cpp +++ b/src/build_visitor.cpp @@ -391,8 +391,6 @@ void BuildVisitor::Visit(DefinitionParameter* node) { current_node_ = parse_node; } -// TODO <-- fixes ended there - // Flow control ----------------- void BuildVisitor::Visit(MatchCase* node) { @@ -544,6 +542,32 @@ void BuildVisitor::Visit(FlowControl& node) { // Statements, expressions, blocks, etc. ----------------- +void BuildVisitor::Visit(BlockStatement& node) { + auto parse_node = current_node_; + + current_node_ = parse_node.NthNamedChild(0); + + std::string current_node_type = current_node_.GetType(); + + if (current_node_type == parser::tokens::Expression) { // optimize ?? + node = std::make_unique(); + Visit(*std::get>(node)); + } else if (current_node_type == parser::tokens::VariableDefinitionStatement) { + node = std::make_unique(); + Visit(std::get>(node).get()); + } else if (current_node_type == parser::tokens::FlowControl) { + node = std::make_unique(); + Visit(*std::get>(node)); + } else if (current_node_type == parser::tokens::PrefixedExpression) { + node = std::make_unique(); + Visit(*std::get>(node)); + } else { + // error + } + + current_node_ = parse_node; +} + void BuildVisitor::Visit(Block* node) { auto parse_node = current_node_; size_t statement_count = parse_node.NamedChildCount(); @@ -558,29 +582,6 @@ void BuildVisitor::Visit(Block* node) { current_node_ = parse_node; } -void BuildVisitor::Visit(ScopedStatement* node) { - auto parse_node = current_node_; - - current_node_ = parse_node.ChildByFieldName("statement"); - Visit(node->statement); - - current_node_ = parse_node; -} - -void BuildVisitor::Visit(LoopControlExpression& node) { - std::string value = current_node_.NthChild(0).GetValue(); - - if (value == "break") { - node = LoopControlExpression::Break; - } else if (value == "continue") { - node = LoopControlExpression::Continue; - } else { - // error - } -} - -// - void BuildVisitor::Visit(SubExpressionToken& node) { auto parse_node = current_node_; @@ -617,6 +618,12 @@ 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::ArrayExpression) { + node = std::make_unique(); + Visit(std::get>(node)); + } else if (current_node_type == parser::tokens::ReferenceExpression) { + node = std::make_unique(); + Visit(std::get>(node)); } else { // error } @@ -702,29 +709,11 @@ void BuildVisitor::Visit(SuperExpression& node) { current_node_ = parse_node; } - -void BuildVisitor::Visit(BlockStatement& node) { +void BuildVisitor::Visit(ScopedStatement* node) { auto parse_node = current_node_; - current_node_ = parse_node.NthNamedChild(0); - - std::string current_node_type = current_node_.GetType(); - - if (current_node_type == parser::tokens::Expression) { // optimize ?? - node = std::make_unique(); - Visit(*std::get>(node)); - } else if (current_node_type == parser::tokens::VariableDefinitionStatement) { - node = std::make_unique(); - Visit(std::get>(node).get()); - } else if (current_node_type == parser::tokens::FlowControl) { - node = std::make_unique(); - Visit(*std::get>(node)); - } else if (current_node_type == parser::tokens::PrefixedExpression) { - node = std::make_unique(); - Visit(*std::get>(node)); - } else { - // error - } + current_node_ = parse_node.ChildByFieldName("statement"); + Visit(node->statement); current_node_ = parse_node; } @@ -756,7 +745,32 @@ void BuildVisitor::Visit(UnaryOperatorExpression* node) { current_node_ = parse_node; } -// Simple Expressions +void BuildVisitor::Visit(ReferenceExpression* node) { + auto parse_node = current_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] = ReferenceType::Reference; + } else if (reference == "@") { + node->references[i] = ReferenceType::UniqueReference; + } + } + } + + current_node_ = parse_node.ChildByFieldName("expression"); + Visit(node->expression.get()); + + current_node_ = parse_node; +} + +// TODO <-- current place + +// Other expressions void BuildVisitor::Visit(FunctionCallExpression* node) { auto parse_node = current_node_; @@ -818,6 +832,18 @@ void BuildVisitor::Visit(ReturnExpression* node) { current_node_ = parse_node; } +void BuildVisitor::Visit(LoopControlExpression& node) { + std::string value = current_node_.NthChild(0).GetValue(); + + if (value == "break") { + node = LoopControlExpression::Break; + } else if (value == "continue") { + node = LoopControlExpression::Continue; + } else { + // error + } +} + // void BuildVisitor::Visit(FunctionArgument& node) {