diff --git a/include/interpreter_tree.hpp b/include/interpreter_tree.hpp index cad604d..b889888 100644 --- a/include/interpreter_tree.hpp +++ b/include/interpreter_tree.hpp @@ -451,19 +451,19 @@ using FunctionArgument = std::variant< struct FunctionCallExpression : public Node { std::unique_ptr name; - std::vector> arguments; + std::vector arguments; }; struct TupleExpression : public Node { - std::vector> expressions; + std::vector expressions; }; struct VariantExpression : public Node { - std::vector> expressions; + std::vector expressions; }; struct ReturnExpression : public Node { - std::unique_ptr expression; + Expression expression; }; // Lambda ----------------- @@ -471,14 +471,14 @@ struct ReturnExpression : public Node { struct LambdaFunction : public Node { std::vector> parameters; std::vector> arguments; - std::unique_ptr expression; + Expression expression; }; // Name ----------------- struct NameSuperExpression : public Node { - std::vector> namespaces; - std::vector> expressions; // last is not SuperExpression + std::vector namespaces; + std::vector expressions; // last is not SuperExpression }; struct NameExpression : public Node { @@ -505,12 +505,12 @@ struct AnnotatedName : public Node { struct TypeConstructor : public Node { std::unique_ptr type; - std::vector>> parameters; + std::vector> parameters; }; struct TupleType : public Node { TypeIdentifierDefinition type; // optional - std::vector>> entities; // NameIdentifier is optional + std::vector> entities; // NameIdentifier is optional }; struct VariantType : public Node { @@ -529,11 +529,11 @@ using TypeParameter = std::variant< struct ParametrizedType : public Node { std::unique_ptr type_expression; - std::vector> parameters; + std::vector parameters; }; struct TypeExpression : public Node { - std::vector> namespaces; + std::vector namespaces; AnyTypeIdentifier type; }; @@ -546,11 +546,11 @@ struct AnnotatedTypeclass : public Node { struct ParametrizedTypeclass : public Node { std::unique_ptr typeclass_expression; - std::vector> parameters; + std::vector parameters; }; struct TypeclassExpression : public Node { - std::vector> namespaces; + std::vector namespaces; TypeclassIdentifier typeclass; }; diff --git a/src/print_visitor.cpp b/src/print_visitor.cpp index aea8d0f..934ff8b 100644 --- a/src/print_visitor.cpp +++ b/src/print_visitor.cpp @@ -364,37 +364,228 @@ void PrintVisitor::Visit(UnaryOperatorExpression* node) { // Simple Expressions -void PrintVisitor::Visit(FunctionCallExpression* node) {} -void PrintVisitor::Visit(TupleExpression* node) {} -void PrintVisitor::Visit(VariantExpression* node) {} -void PrintVisitor::Visit(ReturnExpression* node) {} +void PrintVisitor::Visit(FunctionCallExpression* node) { + out_ << " "; + Visit(node->name.get()); + out_ << ' '; + for (auto& argument : node->arguments) { + Visitor::Visit(argument); + out_ << ' '; + } + out_ << ""; +} + +void PrintVisitor::Visit(TupleExpression* node) { + out_ << " "; + out_ << ' '; + for (auto& expression : node->expressions) { + out_ << "& "; + Visitor::Visit(expression); + } + out_ << " "; +} + +void PrintVisitor::Visit(VariantExpression* node) { + out_ << " "; + out_ << ' '; + for (auto& expression : node->expressions) { + out_ << "& "; + Visitor::Visit(expression); + } + out_ << " "; +} + +void PrintVisitor::Visit(ReturnExpression* node) { + out_ << " "; + Visitor::Visit(node->expression); + out_ << " "; +} // Lambda -void PrintVisitor::Visit(LambdaFunction* node) {} +void PrintVisitor::Visit(LambdaFunction* node) { + out_ << " \\ "; + for (auto& parameter : node->parameters) { + Visit(parameter.get()); + } + if (node->parameters.size() > 0) { + out_ << " : "; + } + for (auto& argument : node->arguments) { + Visit(argument.get()); + } + out_ << " -> "; + Visitor::Visit(node->expression); + out_ << " "; +} // Name -void PrintVisitor::Visit(NameSuperExpression* node) {} -void PrintVisitor::Visit(NameExpression* node) {} -void PrintVisitor::Visit(TupleName* node) {} -void PrintVisitor::Visit(VariantName* node) {} -void PrintVisitor::Visit(AnnotatedName* node) {} +void PrintVisitor::Visit(NameSuperExpression* node) { + out_ << " "; + for (auto& variable_namespace : node->namespaces) { + Visitor::Visit(variable_namespace); + out_ << '.'; + } + for (int i = 0; i < node->expressions.size(); ++i) { + Visitor::Visit(node->expressions[i]); + if (i + 1 < node->expressions.size()) { + out_ << '.'; + } + } + out_ << "\n"; +} + +void PrintVisitor::Visit(NameExpression* node) { + out_ << " "; + for (auto& variable_namespace : node->namespaces) { + Visitor::Visit(variable_namespace); + out_ << '.'; + } + for (int i = 0; i < node->names.size(); ++i) { + Visit(&node->names[i]); + if (i + 1 < node->names.size()) { + out_ << '.'; + } + } + out_ << "\n"; +} + +void PrintVisitor::Visit(TupleName* node) { + out_ << " "; + for (auto& name : node->names) { + out_ << '&'; + Visit(name.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(VariantName* node) { + out_ << " "; + for (auto& name : node->names) { + out_ << '|'; + Visit(name.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(AnnotatedName* node) { + out_ << " "; + Visit(&node->name); + out_ << ' '; + Visit(node->type.get()); + out_ << " "; +} // Type -void PrintVisitor::Visit(TypeConstructor* node) {} -void PrintVisitor::Visit(TupleType* node) {} -void PrintVisitor::Visit(VariantType* node) {} -void PrintVisitor::Visit(AnnotatedType* node) {} -void PrintVisitor::Visit(ParametrizedType* node) {} -void PrintVisitor::Visit(TypeExpression* node) {} +void PrintVisitor::Visit(TypeConstructor* node) { + out_ << " "; + Visit(node->type.get()); + out_ << '\n'; + for (auto& parameter : node->parameters) { + Visit(¶meter.first); + out_ << " = "; + Visitor::Visit(parameter.second); + out_ << '\n'; + } + out_ << "\n"; +} + +void PrintVisitor::Visit(TupleType* node) { + out_ << " "; + Visit(&node->type); // optional + out_ << ' '; + for (auto& entity : node->entities) { + out_ << "& "; + if (entity.first != "") { + Visit(&entity.first); + out_ << " : "; + } + Visitor::Visit(entity.second); + } + out_ << ""; +} + +void PrintVisitor::Visit(VariantType* node) { + out_ << " "; + Visit(&node->type); // optional + out_ << ' '; + for (auto& constructor : node->constructors) { + out_ << "| "; + Visit(&constructor.first); + Visit(constructor.second.get()); + } + out_ << ""; +} + +void PrintVisitor::Visit(AnnotatedType* node) { + out_ << " "; + Visit(node->type_expression.get()); + if (node->annotations.size() > 0) { + out_ << " :"; + } + for (auto& annotation : node->annotations) { + out_ << " "; + Visit(annotation.get()); + } + out_ << ""; +} + +void PrintVisitor::Visit(ParametrizedType* node) { + out_ << " "; + Visit(node->type_expression.get()); + for (auto& paramater : node->parameters) { + out_ << ' '; + Visitor::Visit(paramater); + } + out_ << " "; +} + +void PrintVisitor::Visit(TypeExpression* node) { + out_ << " "; + for (auto& type_namespace : node->namespaces) { + Visitor::Visit(type_namespace); + out_ << '.'; + } + Visit(&node->type); + out_ << " "; +} // Typeclass -void PrintVisitor::Visit(AnnotatedTypeclass* node) {} -void PrintVisitor::Visit(ParametrizedTypeclass* node) {} -void PrintVisitor::Visit(TypeclassExpression* node) {} +void PrintVisitor::Visit(AnnotatedTypeclass* node) { + out_ << " "; + Visit(node->typeclass_expression.get()); + if (node->annotations.size() > 0) { + out_ << " :"; + } + for (auto& annotation : node->annotations) { + out_ << " "; + Visit(annotation.get()); + } + out_ << ""; +} + +void PrintVisitor::Visit(ParametrizedTypeclass* node) { + out_ << " "; + Visit(node->typeclass_expression.get()); + for (auto& paramater : node->parameters) { + out_ << ' '; + Visitor::Visit(paramater); + } + out_ << " "; +} + +void PrintVisitor::Visit(TypeclassExpression* node) { + out_ << " "; + for (auto& typeclass_namespace : node->namespaces) { + Visitor::Visit(typeclass_namespace); + out_ << '.'; + } + Visit(&node->typeclass); + out_ << " "; +} // Identifiers, constants, etc. -----------------