diff --git a/src/print_visitor.cpp b/src/print_visitor.cpp new file mode 100644 index 0000000..d598c66 --- /dev/null +++ b/src/print_visitor.cpp @@ -0,0 +1,330 @@ +// for clangd +#include "../include/print_visitor.hpp" + +namespace interpreter { + +void PrintVisitor::Visit(Node* node) { + out_ << "[Node]\n"; +} + +// Sources ----------------- +void PrintVisitor::Visit(SourceFile* node) { + out_ << "\n\n"; + for (auto& statement : node->statements) { + if (std::holds_alternative(statement)) { + Visit(&std::get(statement)); + } else if (std::holds_alternative(statement)) { + Visitor::Visit(std::get(statement)); + } else { + // error + } + } + out_ << "\n"; +} + +void PrintVisitor::Visit(Sources* node) { + out_ << "\n\n"; + for (auto& source_statement : node->statements) { + Visitor::Visit(source_statement); + } + out_ << "\n"; +} + +// Namespaces, partittions ----------------- + +void PrintVisitor::Visit(Partition* node) { + out_ << " "; + switch (node->type) { + case Partition::Test: + out_ << "TEST"; + break; + case Partition::Interface: + out_ << "INTERFACE"; + break; + case Partition::Core: + out_ << "CORE"; + break; + case Partition::Lib: + out_ << "LIB"; + break; + case Partition::Module: + out_ << "MODULE"; + break; + case Partition::Exe: + out_ << "EXE"; + break; + } + out_ << " {\n"; + Visit(node->scope.get()); + out_ << "} \n"; +} + +void PrintVisitor::Visit(Namespace* node) { + out_ << " "; + if (std::holds_alternative>(node->name)) { + Visit(std::get>(node->name).get()); + } else if (std::holds_alternative>(node->name)) { + Visit(std::get>(node->name).get()); + } else { + // error + } + out_ << "{\n"; + Visit(node->scope.get()); + out_ << "} \n"; +} + +// Definitions ----------------- + +void PrintVisitor::Visit(ImportStatement* node) { + out_ << " \"" << node->module_name << "\" "; + if (node->symbols.size() > 0) { + out_ << '\n'; + } + for (auto& symbol : node->symbols) { + Visitor::Visit(symbol); + out_ << '\n'; + } + out_ << "\n"; +} + +void PrintVisitor::Visit(UsageDefinition* node) { + out_ << " "; + Visit(&node->name); + out_ << " = "; + Visit(node->import_statement.get()); + out_ << "\n"; +} + +void PrintVisitor::Visit(AliasDefinition* node) { + out_ << " "; + Visit(node->type.get()); + out_ << " = "; + Visit(node->value.get()); + out_ << "\n"; +} + +void PrintVisitor::Visit(VariableDefinition* node) { + out_ << " " << (node->is_const ? "const" : "var") << ' '; + Visit(&node->name); + out_ << " = "; + Visitor::Visit(node->value); + out_ << "\n"; +} + +void PrintVisitor::Visit(FunctionDeclaration* node) { + out_ << " "; + Visit(&node->name); + out_ << "\n"; + for (auto& parameter : node->parameters) { + Visit(parameter.get()); + } + out_ << " : \n"; + for (auto& argument_type : node->argument_types) { + Visitor::Visit(argument_type); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(FunctionDefinition* node) { + out_ << " "; + Visit(node->name.get()); + out_ << " = "; + Visitor::Visit(node->value); + out_ << "\n"; +} + +void PrintVisitor::Visit(AliasTypeDefinition* node) { + out_ << " "; + Visit(node->name.get()); + out_ << " = "; + Visit(node->value.get()); + out_ << "\n"; +} + +void PrintVisitor::Visit(TypeDefinition* node) { + out_ << " "; + Visit(node->name.get()); + out_ << " = "; + Visitor::Visit(node->value); + out_ << "\n"; +} + +void PrintVisitor::Visit(TypeclassDefinition* node) { + out_ << " "; + Visit(node->name.get()); + if (node->requirements.size() > 0) { + out_ << " : \n"; + } + for (auto& requirement : node->requirements) { + out_ << "& "; + Visit(requirement.get()); + } + out_ << "\n"; +} + +// Definition parts + +void PrintVisitor::Visit(DefinedName* node) { + out_ << " "; + Visit(&node->name); + if (node->parameters.size() > 0) { + out_ << "\n"; + } + for (auto& parameter : node->parameters) { + Visit(parameter.get()); + } + if (node->arguments.size() > 0) { + out_ << " : \n"; + } + for (auto& argument : node->arguments) { + Visit(argument.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(DefinedAnnotatedName* node) { + out_ << " "; + Visit(&node->name); + out_ << " : "; + if (std::holds_alternative>(node->type)) { + Visit(std::get>(node->type).get()); + } else if (std::holds_alternative>(node->type)) { + Visit(std::get>(node->type).get()); + } else { + // no annotation + } + out_ << " "; +} + +void PrintVisitor::Visit(DefinedType* node) { + out_ << " "; + Visit(node->type.get()); + if (node->parameters.size() > 0) { + out_ << "\n"; + } + for (auto& parameter : node->parameters) { + Visit(parameter.get()); + } + if (node->arguments.size() > 0) { + out_ << " : \n"; + } + for (auto& argument : node->arguments) { + Visit(argument.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(DefinedTypeclass* node) { + out_ << " "; + Visit(node->typeclass.get()); + if (node->parameters.size() > 0) { + out_ << "\n"; + } + for (auto& parameter : node->parameters) { + Visit(parameter.get()); + } + if (node->arguments.size() > 0) { + out_ << " : \n"; + } + for (auto& argument : node->arguments) { + Visit(argument.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(DefinitionParameter* node) { + out_ << " " << (node->typeclasses.size() > 0 ? "(" : ""); + Visit(&node->type); + out_ << ' '; + for (auto& typeclass : node->typeclasses) { + Visit(typeclass.get()); + } + out_ << "\n"; +} + +void PrintVisitor::Visit(DefinitionArgument* node) { + out_ << " " << (node->types.size() > 0 ? "(" : ""); + Visit(&node->name); + out_ << ' '; + for (auto& type : node->types) { + Visit(type.get()); + } + out_ << "\n"; +} + +// Flow control ----------------- + +void PrintVisitor::Visit(Match* node) {} +void PrintVisitor::Visit(Condition* node) {} +void PrintVisitor::Visit(DoWhileLoop* node) {} +void PrintVisitor::Visit(WhileLoop* node) {}; +void PrintVisitor::Visit(ForLoop* node) {}; +void PrintVisitor::Visit(LoopLoop* node) {}; + +// Statements, expressions, blocks, etc. ----------------- + +void PrintVisitor::Visit(Block* node) {} +void PrintVisitor::Visit(ScopedStatement* node) {} + +// Operators + +void PrintVisitor::Visit(BinaryOperatorExpression* node) {} +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) {} + +// Lambda + +void PrintVisitor::Visit(LambdaFunction* node) {} + +// 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) {} + +// 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) {} + +// Typeclass + +void PrintVisitor::Visit(AnnotatedTypeclass* node) {} +void PrintVisitor::Visit(ParametrizedTypeclass* node) {} +void PrintVisitor::Visit(TypeclassExpression* node) {} + +// Identifiers, constants, etc. ----------------- + +void PrintVisitor::Visit(AnyIdentifier* node) { // std::string + out_ << ""; +} + +void PrintVisitor::Visit(FloatNumberLiteral* node) { + out_ << "value << " />"; +} + +void PrintVisitor::Visit(NumberLiteral* node) { + out_ << "value << " />"; +} + +void PrintVisitor::Visit(StringLiteral* node) { + out_ << "value << " />"; +} + +void PrintVisitor::Visit(CharLiteral* node) { + out_ << "value << " />"; +} + +} // namespace interpreter diff --git a/src/visitor.cpp b/src/visitor.cpp new file mode 100644 index 0000000..4b6d3b4 --- /dev/null +++ b/src/visitor.cpp @@ -0,0 +1,356 @@ +// for clangd +#include "../include/visitor.hpp" + +namespace interpreter { + +// Definitions ----------------- + +void Visitor::Visit(SourceStatement& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(std::get>(node).get()); + break; + case 4: + Visit(std::get>(node).get()); + break; + case 5: + Visit(std::get>(node).get()); + break; + case 6: + Visit(std::get>(node).get()); + break; + case 7: + Visit(std::get>(node).get()); + break; + case 8: + Visit(std::get>(node).get()); + break; + case 9: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(ImportSymbol& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Definition parts + +void Visitor::Visit(FunctionDeclarationType& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Flow control ----------------- + +void Visitor::Visit(FlowControl& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(std::get>(node).get()); + break; + case 4: + Visit(std::get>(node).get()); + break; + case 5: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Statements, expressions, blocks, etc. ----------------- + +void Visitor::Visit(SubExpressionToken& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(SubExpression& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(PrefixedExpression& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(*std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(Expression& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(*std::get>(node).get()); + break; + case 3: + Visit(std::get>(node).get()); + break; + case 4: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(SuperExpression& node) { + switch (node.index()) { + case 0: + Visit(*std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +// + +void Visitor::Visit(BlockStatement& node) { + switch (node.index()) { + case 0: + Visit(*std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(*std::get>(node).get()); + break; + case 4: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Simple Expressions + +void Visitor::Visit(FunctionArgument& node) { + switch (node.index()) { + case 0: + Visit(*std::get>(node).get()); + break; + case 1: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Name + +void Visitor::Visit(AnyName& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Type + +void Visitor::Visit(AnyType& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +void Visitor::Visit(TypeSubExpression& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// + +void Visitor::Visit(TypeParameter& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +// Identifiers, constants, etc. ----------------- + +void Visitor::Visit(Literal& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(std::get>(node).get()); + break; + case 2: + Visit(std::get>(node).get()); + break; + case 3: + Visit(std::get>(node).get()); + break; + default: + // error + break; + } +} + +// + +void Visitor::Visit(NameSubSuperExpression& node) { + switch (node.index()) { + case 0: + Visit(std::get>(node).get()); + break; + case 1: + Visit(*std::get>(node).get()); + break; + case 2: + Visit(*std::get>(node).get()); + break; + default: + // error + break; + } +} + +}; // namespace interpreter