mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-06 06:58:45 +00:00
access syntax changed, sync with grammar, type_chack_visitor in progress
This commit is contained in:
parent
3d74b1383e
commit
6fc91aafa0
19 changed files with 110221 additions and 102967 deletions
|
|
@ -606,6 +606,12 @@ void BuildVisitor::Visit(SubExpressionToken& node) {
|
|||
} else if (current_node_type == parser::tokens::ScopedStatement) {
|
||||
node = std::make_unique<ScopedStatement>();
|
||||
Visit(std::get<std::unique_ptr<ScopedStatement>>(node).get());
|
||||
} if (current_node_type == parser::tokens::AccessExpression) {
|
||||
node = std::make_unique<AccessExpression>();
|
||||
Visit(std::get<std::unique_ptr<AccessExpression>>(node).get());
|
||||
} else if (current_node_type == parser::tokens::Literal) {
|
||||
node = std::make_unique<Literal>();
|
||||
Visit(*std::get<std::unique_ptr<Literal>>(node));
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
|
|
@ -766,9 +772,9 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
|
|||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
std::string reference = parse_node.NthChild(i).GetValue();
|
||||
if (reference == "~") {
|
||||
node->references[i] = ReferenceType::Reference;
|
||||
node->references[i] = utils::ReferenceType::Reference;
|
||||
} else if (reference == "@") {
|
||||
node->references[i] = ReferenceType::UniqueReference;
|
||||
node->references[i] = utils::ReferenceType::UniqueReference;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -780,6 +786,18 @@ void BuildVisitor::Visit(ReferenceExpression* node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(AccessExpression* node) {
|
||||
auto parse_node = current_node_;
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("name");
|
||||
Visit(node->name.get());
|
||||
|
||||
current_node_ = parse_node.ChildByFieldName("id");
|
||||
Visit(node->id);
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
// Other expressions
|
||||
|
||||
void BuildVisitor::Visit(FunctionArgument& node) {
|
||||
|
|
@ -964,25 +982,8 @@ void BuildVisitor::Visit(NameExpression* node) {
|
|||
current_node_ = parse_node.NthNamedChild(i);
|
||||
std::string current_node_type = current_node_.GetType();
|
||||
|
||||
if (current_node_type != parser::tokens::TypeSubExpression && !namespaces_ended) {
|
||||
if (current_node_type != parser::tokens::TypeSubExpression) {
|
||||
namespaces_ended = true;
|
||||
|
||||
if (i + 1 == child_count) {
|
||||
node->expressions.emplace_back();
|
||||
|
||||
if (current_node_type == parser::tokens::ExtendedName) {
|
||||
node->expressions.back() = std::make_unique<ExtendedName>();
|
||||
Visit(node->expressions.back());
|
||||
} else if (current_node_type == parser::tokens::Literal) {
|
||||
node->expressions.back() = std::make_unique<Literal>();
|
||||
Visit(*std::get<std::unique_ptr<Literal>>(node->expressions.back()));
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
}
|
||||
|
||||
if (!namespaces_ended) {
|
||||
|
|
@ -990,7 +991,7 @@ void BuildVisitor::Visit(NameExpression* node) {
|
|||
Visit(node->namespaces.back());
|
||||
} else {
|
||||
node->expressions.emplace_back();
|
||||
Visit(node->expressions.back());
|
||||
Visit(&node->expressions.back());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1249,9 +1250,9 @@ void BuildVisitor::Visit(ExtendedScopedAnyType* node) {
|
|||
for (size_t i = 0; i + 1 < child_count; ++i) {
|
||||
std::string reference = parse_node.NthChild(i).GetValue();
|
||||
if (reference == "~") {
|
||||
node->references[i] = ReferenceType::Reference;
|
||||
node->references[i] = utils::ReferenceType::Reference;
|
||||
} else if (reference == "@") {
|
||||
node->references[i] = ReferenceType::UniqueReference;
|
||||
node->references[i] = utils::ReferenceType::UniqueReference;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1428,27 +1429,4 @@ void BuildVisitor::Visit(Literal& node) {
|
|||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
void BuildVisitor::Visit(NameSubExpression& 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) {
|
||||
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::SuperExpression) {
|
||||
node = std::make_unique<SuperExpression>();
|
||||
Visit(*std::get<std::unique_ptr<SuperExpression>>(node));
|
||||
} else {
|
||||
// error
|
||||
}
|
||||
|
||||
current_node_ = parse_node;
|
||||
}
|
||||
|
||||
} // namespace interpreter
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue