mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-06 06:58:45 +00:00
build_visitor fixed, going to test it
This commit is contained in:
parent
5bf0c1bf48
commit
c34523bd4f
23 changed files with 45468 additions and 45273 deletions
|
|
@ -159,7 +159,7 @@ void BuildVisitor::Visit(AliasDefinitionStatement* node) {
|
|||
}
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("value");
|
||||
node->value = std::make_unique<ParametrizedType>();
|
||||
node->value = std::make_unique<TypeExpression>();
|
||||
Visit(node->value.get());
|
||||
|
||||
current_node_ = parse_node;
|
||||
|
|
@ -194,7 +194,7 @@ void BuildVisitor::Visit(VariableDefinitionStatement* node) {
|
|||
void BuildVisitor::Visit(FunctionDeclaration* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
node->name = parse_node.ChildByFieldName("name").GetValue();
|
||||
node->name.name = parse_node.ChildByFieldName("name").GetValue();
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
|
|
@ -330,7 +330,7 @@ void BuildVisitor::Visit(SourceStatement& node) {
|
|||
void BuildVisitor::Visit(FunctionDefinition* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
node->name = parse_node.ChildByFieldName("name").GetValue();
|
||||
node->name.name = parse_node.ChildByFieldName("name").GetValue();
|
||||
|
||||
if (parse_node.NthChild(0).GetValue() == "(") {
|
||||
node->modifier = FunctionDefinition::Operator;
|
||||
|
|
@ -395,7 +395,7 @@ void BuildVisitor::Visit(AnyAnnotatedType* node) {
|
|||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->typeclasses[i]);
|
||||
Visit(node->typeclasses[i].get());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -404,6 +404,87 @@ void BuildVisitor::Visit(AnyAnnotatedType* node) {
|
|||
|
||||
// Flow control -----------------
|
||||
|
||||
void BuildVisitor::Visit(TypeConstructorPatternParameter* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
current_node_ = parse_node.ChildByFieldName("name"),
|
||||
|
||||
node->name.emplace();
|
||||
Visit(&node->name.value());
|
||||
}
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("value"),
|
||||
Visit(node->value);
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeConstructorPattern* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
node->constructor = parse_node.ChildByFieldName("constructor").GetValue();
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->parameters.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(&node->parameters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
|
||||
void BuildVisitor::Visit(PatternToken& 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::ExtendedName) { // optimize ??
|
||||
node = std::make_unique<ExtendedName>();
|
||||
Visit(std::get<std::unique_ptr<ExtendedName>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::Literal) {
|
||||
node = std::make_unique<Literal>();
|
||||
Visit(*std::get<std::unique_ptr<Literal>>(node));
|
||||
} else if (current_node_type == parser::tokens::TypeConstructorPattern) {
|
||||
node = std::make_unique<TypeConstructorPattern>();
|
||||
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node).get());
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(Pattern& 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::TypeConstructorPattern) { // optimize ??
|
||||
node = std::make_unique<TypeConstructorPattern>();
|
||||
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::PatternToken) {
|
||||
node = std::make_unique<PatternToken>();
|
||||
Visit(*std::get<std::unique_ptr<PatternToken>>(node));
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(MatchCase* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
|
|
@ -635,9 +716,6 @@ void BuildVisitor::Visit(SubExpression& node) {
|
|||
} else if (current_node_type == parser::tokens::SubExpressionToken) {
|
||||
node = std::make_unique<SubExpressionToken>();
|
||||
Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node));
|
||||
} else if (current_node_type == parser::tokens::ArrayExpression) {
|
||||
node = std::make_unique<ArrayExpression>();
|
||||
Visit(std::get<std::unique_ptr<ArrayExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::ReferenceExpression) {
|
||||
node = std::make_unique<ReferenceExpression>();
|
||||
Visit(std::get<std::unique_ptr<ReferenceExpression>>(node).get());
|
||||
|
|
@ -716,6 +794,9 @@ void BuildVisitor::Visit(SuperExpression& node) {
|
|||
} else if (current_node_type == parser::tokens::VariantExpression) {
|
||||
node = std::make_unique<VariantExpression>();
|
||||
Visit(std::get<std::unique_ptr<VariantExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::ArrayExpression) {
|
||||
node = std::make_unique<ArrayExpression>();
|
||||
Visit(std::get<std::unique_ptr<ArrayExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::Expression) {
|
||||
node = std::make_unique<Expression>();
|
||||
Visit(*std::get<std::unique_ptr<Expression>>(node));
|
||||
|
|
@ -823,20 +904,38 @@ void BuildVisitor::Visit(FunctionArgument& node) {
|
|||
void BuildVisitor::Visit(FunctionCallExpression* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
size_t excluded_child_count = 0;
|
||||
|
||||
current_node_ = parse_node.NthNamedChild(0);
|
||||
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type == parser::tokens::SubExpressionToken) {
|
||||
node->prefix = std::make_unique<SubExpressionToken>();
|
||||
Visit(*std::get<std::unique_ptr<SubExpressionToken>>(node->prefix.value()));
|
||||
++excluded_child_count;
|
||||
} else if (current_node_type == parser::tokens::TypeExpression) {
|
||||
node->prefix = std::make_unique<TypeExpression>();
|
||||
Visit(std::get<std::unique_ptr<TypeExpression>>(node->prefix.value()).get());
|
||||
++excluded_child_count;
|
||||
} else {
|
||||
// no prefix
|
||||
}
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("name");
|
||||
node->name = std::make_unique<NameExpression>();
|
||||
Visit(node->name.get());
|
||||
Visit(&node->name);
|
||||
++excluded_child_count;
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
// if (child_count > 1) { // always true (repeat1)
|
||||
node->arguments.resize(child_count - 1);
|
||||
if (child_count > excluded_child_count) { // always true (repeat1)
|
||||
node->arguments.resize(child_count - excluded_child_count);
|
||||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->arguments[i]);
|
||||
for (size_t i = 0; i + excluded_child_count < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + excluded_child_count);
|
||||
Visit(node->arguments[i]);
|
||||
}
|
||||
}
|
||||
// }
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
|
@ -880,31 +979,45 @@ void BuildVisitor::Visit(ReturnExpression* node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeConstructorParameter* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
current_node_ = parse_node.ChildByFieldName("name");
|
||||
node->name.emplace();
|
||||
Visit(&node->name.value());
|
||||
|
||||
std::string assignment_modifier = current_node_.NextSibling().GetValue();
|
||||
if (assignment_modifier == "=") {
|
||||
node->asignment_modifier = TypeConstructorParameter::Assign;
|
||||
} else if (assignment_modifier == "<-") {
|
||||
node->asignment_modifier = TypeConstructorParameter::Move;
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("value");
|
||||
Visit(node->value);
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
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());
|
||||
current_node_ = parse_node.ChildByFieldName("constructor");
|
||||
node->constructor = std::make_unique<TypeExpression>();
|
||||
Visit(node->constructor.get());
|
||||
|
||||
size_t parameter_count = (parse_node.NamedChildCount() - 1) / 2;
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
node->parameters.resize(parameter_count);
|
||||
if (child_count > 1) {
|
||||
node->parameters.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i < parameter_count * 2; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
|
||||
if (i % 2 == 0) {
|
||||
Visit(&std::get<0>(node->parameters[i / 2]));
|
||||
|
||||
std::string assignment_modifier = current_node_.NextSibling().GetValue();
|
||||
if (assignment_modifier == "=") {
|
||||
std::get<1>(node->parameters[i / 2]) = TypeConstructor::Assign;
|
||||
} else if (assignment_modifier == "<-") {
|
||||
std::get<1>(node->parameters[i / 2]) = TypeConstructor::Move;
|
||||
}
|
||||
} else {
|
||||
Visit(std::get<2>(node->parameters[i / 2]));
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(&node->parameters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -976,23 +1089,10 @@ void BuildVisitor::Visit(NameExpression* node) {
|
|||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
bool namespaces_ended = false;
|
||||
|
||||
node->names.resize(child_count);
|
||||
for (size_t i = 0; i < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i);
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type != parser::tokens::TypeSubExpression) {
|
||||
namespaces_ended = true;
|
||||
}
|
||||
|
||||
if (!namespaces_ended) {
|
||||
node->namespaces.emplace_back();
|
||||
Visit(node->namespaces.back());
|
||||
} else {
|
||||
node->expressions.emplace_back();
|
||||
Visit(&node->expressions.back());
|
||||
}
|
||||
Visit(&node->names[i]);
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
|
|
@ -1037,7 +1137,7 @@ void BuildVisitor::Visit(AnnotatedName* node) {
|
|||
|
||||
if (parse_node.NamedChildCount() > 1) {
|
||||
current_node_ = parse_node.ChildByFieldName("type");
|
||||
node->type = std::make_unique<ParametrizedType>();
|
||||
node->type.emplace();
|
||||
Visit(node->type.value());
|
||||
|
||||
current_node_ = parse_node;
|
||||
|
|
@ -1156,27 +1256,6 @@ void BuildVisitor::Visit(VariantType* node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(ParametrizedType* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("type_expression");
|
||||
node->type_expression = std::make_unique<TypeExpression>();
|
||||
Visit(node->type_expression.get());
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->parameters.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->parameters[i]);
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeExpression* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
|
|
@ -1185,7 +1264,7 @@ void BuildVisitor::Visit(TypeExpression* node) {
|
|||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("type");
|
||||
node->type = current_node_.GetValue();
|
||||
Visit(node->type);
|
||||
++excluded_child_count;
|
||||
|
||||
current_node_ = current_node_.NextSibling();
|
||||
|
|
@ -1203,11 +1282,11 @@ void BuildVisitor::Visit(TypeExpression* node) {
|
|||
}
|
||||
|
||||
if (child_count > excluded_child_count) {
|
||||
node->namespaces.resize(child_count - excluded_child_count);
|
||||
node->path.resize(child_count - excluded_child_count);
|
||||
|
||||
for (size_t i = 0; i + excluded_child_count < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i);
|
||||
Visit(node->namespaces[i]);
|
||||
Visit(node->path[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1222,8 +1301,8 @@ void BuildVisitor::Visit(AnyType& node) {
|
|||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type == parser::tokens::ParametrizedType) {
|
||||
node = std::make_unique<ParametrizedType>();
|
||||
Visit(std::get<std::unique_ptr<ParametrizedType>>(node).get());
|
||||
node = std::make_unique<TypeExpression>();
|
||||
Visit(std::get<std::unique_ptr<TypeExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::TupleType) {
|
||||
node = std::make_unique<TupleType>();
|
||||
Visit(std::get<std::unique_ptr<TupleType>>(node).get());
|
||||
|
|
@ -1265,16 +1344,36 @@ void BuildVisitor::Visit(ExtendedScopedAnyType* node) {
|
|||
|
||||
// Typeclass
|
||||
|
||||
void BuildVisitor::Visit(TypeclassUsage& node) {
|
||||
void BuildVisitor::Visit(TypeclassExpression* node) {
|
||||
auto parse_node = current_node_;
|
||||
//
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
//
|
||||
// if (child_count > 1) {
|
||||
// node->path.resize(child_count - 1);
|
||||
//
|
||||
// for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
// current_node_ = parse_node.NthNamedChild(i);
|
||||
// Visit(node->path[i]);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
current_node_ = parse_node.ChildByFieldName("typeclass");
|
||||
Visit(node->typeclass);
|
||||
//
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeclassSubExpression& 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::TypeclassExpression) {
|
||||
node = std::make_unique<TypeclassExpression>();
|
||||
Visit(std::get<std::unique_ptr<TypeclassExpression>>(node).get());
|
||||
if (current_node_type == parser::tokens::TypeclassIdentifier) {
|
||||
node = std::make_unique<TypeclassIdentifier>();
|
||||
Visit(std::get<std::unique_ptr<TypeclassIdentifier>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::ParametrizedTypeclass) {
|
||||
node = std::make_unique<ParametrizedTypeclass>();
|
||||
Visit(std::get<std::unique_ptr<ParametrizedTypeclass>>(node).get());
|
||||
|
|
@ -1288,9 +1387,7 @@ void BuildVisitor::Visit(TypeclassUsage& node) {
|
|||
void BuildVisitor::Visit(ParametrizedTypeclass* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("typeclass_expression");
|
||||
node->typeclass_expression = std::make_unique<TypeclassExpression>();
|
||||
Visit(node->typeclass_expression.get());
|
||||
node->typeclass = parse_node.ChildByFieldName("typeclass").GetValue();
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
|
|
@ -1299,54 +1396,16 @@ void BuildVisitor::Visit(ParametrizedTypeclass* node) {
|
|||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
Visit(node->parameters[i]);
|
||||
node->parameters[i] = std::make_unique<TypeExpression>();
|
||||
Visit(node->parameters[i].get());
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeclassExpression* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->namespaces.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i);
|
||||
Visit(node->namespaces[i]);
|
||||
}
|
||||
}
|
||||
|
||||
node->typeclass = parse_node.ChildByFieldName("typeclass").GetValue();
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
// Typeclass & Type -----------------
|
||||
|
||||
void BuildVisitor::Visit(TypeParameter& 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::TypeExpression) {
|
||||
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 {
|
||||
// error
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(TypeSubExpression& node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
|
|
@ -1370,6 +1429,26 @@ void BuildVisitor::Visit(TypeSubExpression& node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(ParametrizedType* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
node->type = parse_node.ChildByFieldName("type").GetValue();
|
||||
|
||||
size_t child_count = parse_node.NamedChildCount();
|
||||
|
||||
if (child_count > 1) {
|
||||
node->parameters.resize(child_count - 1);
|
||||
|
||||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
current_node_ = parse_node.NthNamedChild(i + 1);
|
||||
node->parameters[i] = std::make_unique<TypeExpression>();
|
||||
Visit(node->parameters[i].get());
|
||||
}
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
// Identifiers, constants, etc. -----------------
|
||||
|
||||
void BuildVisitor::Visit(ExtendedName* node) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue