mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-05 22:48:42 +00:00
print_visitor first iteration
This commit is contained in:
parent
c8b52f9ade
commit
195c536620
2 changed files with 223 additions and 32 deletions
|
|
@ -451,19 +451,19 @@ using FunctionArgument = std::variant<
|
||||||
|
|
||||||
struct FunctionCallExpression : public Node {
|
struct FunctionCallExpression : public Node {
|
||||||
std::unique_ptr<NameSuperExpression> name;
|
std::unique_ptr<NameSuperExpression> name;
|
||||||
std::vector<std::unique_ptr<FunctionArgument>> arguments;
|
std::vector<FunctionArgument> arguments;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TupleExpression : public Node {
|
struct TupleExpression : public Node {
|
||||||
std::vector<std::unique_ptr<SubExpression>> expressions;
|
std::vector<SubExpression> expressions;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VariantExpression : public Node {
|
struct VariantExpression : public Node {
|
||||||
std::vector<std::unique_ptr<SubExpression>> expressions;
|
std::vector<SubExpression> expressions;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ReturnExpression : public Node {
|
struct ReturnExpression : public Node {
|
||||||
std::unique_ptr<Expression> expression;
|
Expression expression;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Lambda -----------------
|
// Lambda -----------------
|
||||||
|
|
@ -471,14 +471,14 @@ struct ReturnExpression : public Node {
|
||||||
struct LambdaFunction : public Node {
|
struct LambdaFunction : public Node {
|
||||||
std::vector<std::unique_ptr<DefinitionParameter>> parameters;
|
std::vector<std::unique_ptr<DefinitionParameter>> parameters;
|
||||||
std::vector<std::unique_ptr<DefinitionArgument>> arguments;
|
std::vector<std::unique_ptr<DefinitionArgument>> arguments;
|
||||||
std::unique_ptr<Expression> expression;
|
Expression expression;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Name -----------------
|
// Name -----------------
|
||||||
|
|
||||||
struct NameSuperExpression : public Node {
|
struct NameSuperExpression : public Node {
|
||||||
std::vector<std::unique_ptr<TypeSubExpression>> namespaces;
|
std::vector<TypeSubExpression> namespaces;
|
||||||
std::vector<std::unique_ptr<NameSubSuperExpression>> expressions; // last is not SuperExpression
|
std::vector<NameSubSuperExpression> expressions; // last is not SuperExpression
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NameExpression : public Node {
|
struct NameExpression : public Node {
|
||||||
|
|
@ -505,12 +505,12 @@ struct AnnotatedName : public Node {
|
||||||
|
|
||||||
struct TypeConstructor : public Node {
|
struct TypeConstructor : public Node {
|
||||||
std::unique_ptr<ParametrizedType> type;
|
std::unique_ptr<ParametrizedType> type;
|
||||||
std::vector<std::pair<NameIdentifier, std::unique_ptr<SubExpression>>> parameters;
|
std::vector<std::pair<NameIdentifier, SubExpression>> parameters;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TupleType : public Node {
|
struct TupleType : public Node {
|
||||||
TypeIdentifierDefinition type; // optional
|
TypeIdentifierDefinition type; // optional
|
||||||
std::vector<std::pair<NameIdentifier, std::unique_ptr<AnyType>>> entities; // NameIdentifier is optional
|
std::vector<std::pair<NameIdentifier, AnyType>> entities; // NameIdentifier is optional
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VariantType : public Node {
|
struct VariantType : public Node {
|
||||||
|
|
@ -529,11 +529,11 @@ using TypeParameter = std::variant<
|
||||||
|
|
||||||
struct ParametrizedType : public Node {
|
struct ParametrizedType : public Node {
|
||||||
std::unique_ptr<TypeExpression> type_expression;
|
std::unique_ptr<TypeExpression> type_expression;
|
||||||
std::vector<std::unique_ptr<TypeParameter>> parameters;
|
std::vector<TypeParameter> parameters;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TypeExpression : public Node {
|
struct TypeExpression : public Node {
|
||||||
std::vector<std::unique_ptr<TypeSubExpression>> namespaces;
|
std::vector<TypeSubExpression> namespaces;
|
||||||
AnyTypeIdentifier type;
|
AnyTypeIdentifier type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -546,11 +546,11 @@ struct AnnotatedTypeclass : public Node {
|
||||||
|
|
||||||
struct ParametrizedTypeclass : public Node {
|
struct ParametrizedTypeclass : public Node {
|
||||||
std::unique_ptr<TypeclassExpression> typeclass_expression;
|
std::unique_ptr<TypeclassExpression> typeclass_expression;
|
||||||
std::vector<std::unique_ptr<TypeParameter>> parameters;
|
std::vector<TypeParameter> parameters;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TypeclassExpression : public Node {
|
struct TypeclassExpression : public Node {
|
||||||
std::vector<std::unique_ptr<TypeSubExpression>> namespaces;
|
std::vector<TypeSubExpression> namespaces;
|
||||||
TypeclassIdentifier typeclass;
|
TypeclassIdentifier typeclass;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -364,37 +364,228 @@ void PrintVisitor::Visit(UnaryOperatorExpression* node) {
|
||||||
|
|
||||||
// Simple Expressions
|
// Simple Expressions
|
||||||
|
|
||||||
void PrintVisitor::Visit(FunctionCallExpression* node) {}
|
void PrintVisitor::Visit(FunctionCallExpression* node) {
|
||||||
void PrintVisitor::Visit(TupleExpression* node) {}
|
out_ << "<FunctionCall> ";
|
||||||
void PrintVisitor::Visit(VariantExpression* node) {}
|
Visit(node->name.get());
|
||||||
void PrintVisitor::Visit(ReturnExpression* node) {}
|
out_ << ' ';
|
||||||
|
for (auto& argument : node->arguments) {
|
||||||
|
Visitor::Visit(argument);
|
||||||
|
out_ << ' ';
|
||||||
|
}
|
||||||
|
out_ << "</FunctionCall>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(TupleExpression* node) {
|
||||||
|
out_ << "<TupleExpression> ";
|
||||||
|
out_ << ' ';
|
||||||
|
for (auto& expression : node->expressions) {
|
||||||
|
out_ << "& ";
|
||||||
|
Visitor::Visit(expression);
|
||||||
|
}
|
||||||
|
out_ << " </TupleExpression>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(VariantExpression* node) {
|
||||||
|
out_ << "<VariantExpression> ";
|
||||||
|
out_ << ' ';
|
||||||
|
for (auto& expression : node->expressions) {
|
||||||
|
out_ << "& ";
|
||||||
|
Visitor::Visit(expression);
|
||||||
|
}
|
||||||
|
out_ << " </VariantExpression>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(ReturnExpression* node) {
|
||||||
|
out_ << "<Return> ";
|
||||||
|
Visitor::Visit(node->expression);
|
||||||
|
out_ << " </Return>";
|
||||||
|
}
|
||||||
|
|
||||||
// Lambda
|
// Lambda
|
||||||
|
|
||||||
void PrintVisitor::Visit(LambdaFunction* node) {}
|
void PrintVisitor::Visit(LambdaFunction* node) {
|
||||||
|
out_ << "<LambdaFunction> \\ ";
|
||||||
|
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_ << " </LambdaFunction>";
|
||||||
|
}
|
||||||
|
|
||||||
// Name
|
// Name
|
||||||
|
|
||||||
void PrintVisitor::Visit(NameSuperExpression* node) {}
|
void PrintVisitor::Visit(NameSuperExpression* node) {
|
||||||
void PrintVisitor::Visit(NameExpression* node) {}
|
out_ << "<NameSuperExpression> ";
|
||||||
void PrintVisitor::Visit(TupleName* node) {}
|
for (auto& variable_namespace : node->namespaces) {
|
||||||
void PrintVisitor::Visit(VariantName* node) {}
|
Visitor::Visit(variable_namespace);
|
||||||
void PrintVisitor::Visit(AnnotatedName* node) {}
|
out_ << '.';
|
||||||
|
}
|
||||||
|
for (int i = 0; i < node->expressions.size(); ++i) {
|
||||||
|
Visitor::Visit(node->expressions[i]);
|
||||||
|
if (i + 1 < node->expressions.size()) {
|
||||||
|
out_ << '.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out_ << "</NameSupperExpression>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(NameExpression* node) {
|
||||||
|
out_ << "<NameExpression> ";
|
||||||
|
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_ << "</NameExpression>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(TupleName* node) {
|
||||||
|
out_ << "<TupleName> ";
|
||||||
|
for (auto& name : node->names) {
|
||||||
|
out_ << '&';
|
||||||
|
Visit(name.get());
|
||||||
|
}
|
||||||
|
out_ << "</TupleName>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(VariantName* node) {
|
||||||
|
out_ << "<VariantName> ";
|
||||||
|
for (auto& name : node->names) {
|
||||||
|
out_ << '|';
|
||||||
|
Visit(name.get());
|
||||||
|
}
|
||||||
|
out_ << "</VariantName>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(AnnotatedName* node) {
|
||||||
|
out_ << "<AnnotatedName> ";
|
||||||
|
Visit(&node->name);
|
||||||
|
out_ << ' ';
|
||||||
|
Visit(node->type.get());
|
||||||
|
out_ << " </AnnotatedName>";
|
||||||
|
}
|
||||||
|
|
||||||
// Type
|
// Type
|
||||||
|
|
||||||
void PrintVisitor::Visit(TypeConstructor* node) {}
|
void PrintVisitor::Visit(TypeConstructor* node) {
|
||||||
void PrintVisitor::Visit(TupleType* node) {}
|
out_ << "<TypeConstructor> ";
|
||||||
void PrintVisitor::Visit(VariantType* node) {}
|
Visit(node->type.get());
|
||||||
void PrintVisitor::Visit(AnnotatedType* node) {}
|
out_ << '\n';
|
||||||
void PrintVisitor::Visit(ParametrizedType* node) {}
|
for (auto& parameter : node->parameters) {
|
||||||
void PrintVisitor::Visit(TypeExpression* node) {}
|
Visit(¶meter.first);
|
||||||
|
out_ << " = ";
|
||||||
|
Visitor::Visit(parameter.second);
|
||||||
|
out_ << '\n';
|
||||||
|
}
|
||||||
|
out_ << "</TypeConstructor>\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(TupleType* node) {
|
||||||
|
out_ << "<TupleType> ";
|
||||||
|
Visit(&node->type); // optional
|
||||||
|
out_ << ' ';
|
||||||
|
for (auto& entity : node->entities) {
|
||||||
|
out_ << "& ";
|
||||||
|
if (entity.first != "") {
|
||||||
|
Visit(&entity.first);
|
||||||
|
out_ << " : ";
|
||||||
|
}
|
||||||
|
Visitor::Visit(entity.second);
|
||||||
|
}
|
||||||
|
out_ << "</TupleType>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(VariantType* node) {
|
||||||
|
out_ << "<VariantType> ";
|
||||||
|
Visit(&node->type); // optional
|
||||||
|
out_ << ' ';
|
||||||
|
for (auto& constructor : node->constructors) {
|
||||||
|
out_ << "| ";
|
||||||
|
Visit(&constructor.first);
|
||||||
|
Visit(constructor.second.get());
|
||||||
|
}
|
||||||
|
out_ << "</VariantType>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(AnnotatedType* node) {
|
||||||
|
out_ << "<AnnotatedType> ";
|
||||||
|
Visit(node->type_expression.get());
|
||||||
|
if (node->annotations.size() > 0) {
|
||||||
|
out_ << " :";
|
||||||
|
}
|
||||||
|
for (auto& annotation : node->annotations) {
|
||||||
|
out_ << " ";
|
||||||
|
Visit(annotation.get());
|
||||||
|
}
|
||||||
|
out_ << "</AnnotatedType>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(ParametrizedType* node) {
|
||||||
|
out_ << "<ParametrizedType> ";
|
||||||
|
Visit(node->type_expression.get());
|
||||||
|
for (auto& paramater : node->parameters) {
|
||||||
|
out_ << ' ';
|
||||||
|
Visitor::Visit(paramater);
|
||||||
|
}
|
||||||
|
out_ << " </ParamtrizedType>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(TypeExpression* node) {
|
||||||
|
out_ << "<TypeExpression> ";
|
||||||
|
for (auto& type_namespace : node->namespaces) {
|
||||||
|
Visitor::Visit(type_namespace);
|
||||||
|
out_ << '.';
|
||||||
|
}
|
||||||
|
Visit(&node->type);
|
||||||
|
out_ << " </TypeExpression>";
|
||||||
|
}
|
||||||
|
|
||||||
// Typeclass
|
// Typeclass
|
||||||
|
|
||||||
void PrintVisitor::Visit(AnnotatedTypeclass* node) {}
|
void PrintVisitor::Visit(AnnotatedTypeclass* node) {
|
||||||
void PrintVisitor::Visit(ParametrizedTypeclass* node) {}
|
out_ << "<AnnotatedTypeclass> ";
|
||||||
void PrintVisitor::Visit(TypeclassExpression* node) {}
|
Visit(node->typeclass_expression.get());
|
||||||
|
if (node->annotations.size() > 0) {
|
||||||
|
out_ << " :";
|
||||||
|
}
|
||||||
|
for (auto& annotation : node->annotations) {
|
||||||
|
out_ << " ";
|
||||||
|
Visit(annotation.get());
|
||||||
|
}
|
||||||
|
out_ << "</AnnotatedTypeclass>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(ParametrizedTypeclass* node) {
|
||||||
|
out_ << "<ParametrizedTypeclass> ";
|
||||||
|
Visit(node->typeclass_expression.get());
|
||||||
|
for (auto& paramater : node->parameters) {
|
||||||
|
out_ << ' ';
|
||||||
|
Visitor::Visit(paramater);
|
||||||
|
}
|
||||||
|
out_ << " </ParamtrizedTypeclass>";
|
||||||
|
}
|
||||||
|
|
||||||
|
void PrintVisitor::Visit(TypeclassExpression* node) {
|
||||||
|
out_ << "<TypeclassExpression> ";
|
||||||
|
for (auto& typeclass_namespace : node->namespaces) {
|
||||||
|
Visitor::Visit(typeclass_namespace);
|
||||||
|
out_ << '.';
|
||||||
|
}
|
||||||
|
Visit(&node->typeclass);
|
||||||
|
out_ << " </TypeclassExpression>";
|
||||||
|
}
|
||||||
|
|
||||||
// Identifiers, constants, etc. -----------------
|
// Identifiers, constants, etc. -----------------
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue