mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-07 07:28:44 +00:00
debug
This commit is contained in:
parent
582ad5668e
commit
0d62ae0814
29 changed files with 99479 additions and 1166 deletions
|
|
@ -1,8 +1,10 @@
|
|||
#include <iostream>
|
||||
|
||||
#include <memory>
|
||||
|
||||
// forclangd
|
||||
#include "../include/build_visitor.hpp"
|
||||
#include "../include/parse_token_types.hpp"
|
||||
#include <bits/utility.h>
|
||||
#include <memory>
|
||||
|
||||
namespace interpreter {
|
||||
|
||||
|
|
@ -77,6 +79,7 @@ void BuildVisitor::Visit(Namespace* node) {
|
|||
auto current_node_ = parse_node.ChildByFieldName("name");
|
||||
|
||||
auto current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type == parser::tokens::DefinedAnnotatedName) {
|
||||
std::string name_modifier = parse_node.NthChild(1).GetValue(); // TODO
|
||||
if (name_modifier == "const") {
|
||||
|
|
@ -254,10 +257,11 @@ void BuildVisitor::Visit(TypeclassDefinition* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->requirements.resize(child_count - 1, std::make_unique<FunctionDeclaration>());
|
||||
node->requirements.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < child_count - 1; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
node->requirements[i] = std::make_unique<FunctionDeclaration>();
|
||||
Visit(node->requirements[i].get());
|
||||
}
|
||||
}
|
||||
|
|
@ -463,12 +467,23 @@ void BuildVisitor::Visit(DefinitionParameter* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->typeclasses.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
|
||||
node->typeclasses.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < child_count - 1; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->typeclasses[i].get());
|
||||
// choose between typeclass_expression and parametrized_typeclass
|
||||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
node->typeclasses[i] = std::make_unique<ParametrizedTypeclass>();
|
||||
|
||||
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
|
||||
node->typeclasses[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
|
||||
Visit(node->typeclasses[i]->typeclass_expression.get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
|
||||
Visit(node->typeclasses[i].get());
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -483,12 +498,23 @@ void BuildVisitor::Visit(DefinitionArgument* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->types.resize(child_count - 1, std::make_unique<ParametrizedType>());
|
||||
node->types.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < child_count - 1; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->types[i].get());
|
||||
// choose between type_expression and parametrized_type
|
||||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
node->types[i] = std::make_unique<ParametrizedType>();
|
||||
|
||||
if (current_node_type == parser::tokens::TypeExpression) { // optimize ??
|
||||
node->types[i]->type_expression = std::make_unique<TypeExpression>();
|
||||
Visit(node->types[i]->type_expression.get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedType) {
|
||||
Visit(node->types[i].get());
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1079,10 +1105,11 @@ void BuildVisitor::Visit(TupleName* node) {
|
|||
|
||||
size_t names_count = parse_node.NamedChildCount();
|
||||
|
||||
node->names.resize(names_count, std::make_unique<AnnotatedName>());
|
||||
node->names.resize(names_count);
|
||||
|
||||
for (size_t i = 0; i < names_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i);
|
||||
node->names[i] = std::make_unique<AnnotatedName>();
|
||||
Visit(node->names[i].get());
|
||||
}
|
||||
|
||||
|
|
@ -1094,10 +1121,11 @@ void BuildVisitor::Visit(VariantName* node) {
|
|||
|
||||
size_t names_count = parse_node.NamedChildCount();
|
||||
|
||||
node->names.resize(names_count, std::make_unique<AnnotatedName>());
|
||||
node->names.resize(names_count);
|
||||
|
||||
for (size_t i = 0; i < names_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i);
|
||||
node->names[i] =std::make_unique<AnnotatedName>();
|
||||
Visit(node->names[i].get());
|
||||
}
|
||||
|
||||
|
|
@ -1109,7 +1137,7 @@ void BuildVisitor::Visit(AnnotatedName* node) {
|
|||
|
||||
node->name = parse_node.ChildByFieldName("name").GetValue();
|
||||
|
||||
if (parse_node.ChildCount() > 1) {
|
||||
if (parse_node.NamedChildCount() > 1) {
|
||||
current_node_ = parse_node.ChildByFieldName("type");
|
||||
node->type = std::make_unique<ParametrizedType>();
|
||||
Visit(node->type.value().get());
|
||||
|
|
@ -1144,27 +1172,27 @@ void BuildVisitor::Visit(AnyName& node) {
|
|||
// Type
|
||||
|
||||
void BuildVisitor::Visit(TypeConstructor* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("type");
|
||||
node->type = std::make_unique<ParametrizedType>();
|
||||
Visit(node->type.get());
|
||||
|
||||
size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2;
|
||||
|
||||
node->parameters.resize(parameter_count);
|
||||
|
||||
for (size_t i = 0; i < parameter_count * 2; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
|
||||
if (i % 2 == 0) {
|
||||
node->parameters[i / 2].first = current_node_.GetValue();
|
||||
} else {
|
||||
Visit(node->parameters[i / 2].second);
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
// auto parse_node = current_node_;
|
||||
//
|
||||
// current_node_ = parse_node.ChildByFieldName("type");
|
||||
// node->type = std::make_unique<ParametrizedType>();
|
||||
// Visit(node->type.get());
|
||||
//
|
||||
// size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2;
|
||||
//
|
||||
// node->parameters.resize(parameter_count);
|
||||
//
|
||||
// for (size_t i = 0; i < parameter_count * 2; ++i) {
|
||||
// current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
//
|
||||
// if (i % 2 == 0) {
|
||||
// node->parameters[i / 2].first = current_node_.GetValue();
|
||||
// } else {
|
||||
// Visit(node->parameters[i / 2].second);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TupleType* node) {
|
||||
|
|
@ -1245,11 +1273,23 @@ void BuildVisitor::Visit(AnnotatedType* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->annotations.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
|
||||
node->annotations.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < child_count - 1; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
node->annotations[i] = std::make_unique<ParametrizedTypeclass>();
|
||||
|
||||
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
|
||||
node->annotations[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
|
||||
Visit(node->annotations[i]->typeclass_expression.get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
|
||||
Visit(node->annotations[i].get());
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1296,7 +1336,7 @@ void BuildVisitor::Visit(TypeExpression* node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(AnyType& node) {
|
||||
void BuildVisitor::Visit(AnyType& node) { // Or ScopedAnyType
|
||||
auto parse_node = current_node_;
|
||||
|
||||
current_node_ = parse_node.NthNamedChild(0);
|
||||
|
|
@ -1349,7 +1389,10 @@ void BuildVisitor::Visit(TypeParameter& node) {
|
|||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type == parser::tokens::ParametrizedType) { // optimize ??
|
||||
if (current_node_type == parser::tokens::TypeExpression) { // optimize ??
|
||||
node = std::make_unique<TypeExpression>();
|
||||
Visit(std::get<std::unique_ptr<TypeExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedType) {
|
||||
node = std::make_unique<ParametrizedType>();
|
||||
Visit(std::get<std::unique_ptr<ParametrizedType>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::Expression) {
|
||||
|
|
@ -1374,11 +1417,23 @@ void BuildVisitor::Visit(AnnotatedTypeclass* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->annotations.resize(child_count - 1, std::make_unique<ParametrizedTypeclass>());
|
||||
node->annotations.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < child_count - 1; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->annotations[i].get());
|
||||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
node->annotations[i] = std::make_unique<ParametrizedTypeclass>();
|
||||
|
||||
if (current_node_type == parser::tokens::TypeclassExpression) { // optimize ??
|
||||
node->annotations[i]->typeclass_expression = std::make_unique<TypeclassExpression>();
|
||||
Visit(node->annotations[i]->typeclass_expression.get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
|
||||
Visit(node->annotations[i].get());
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue