mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-08 16:08:45 +00:00
fixes , constructor patter fix, for loop fix
This commit is contained in:
parent
6ba31969d2
commit
70b84c38f0
7 changed files with 33 additions and 49 deletions
|
|
@ -61,7 +61,6 @@ private:
|
||||||
void Visit(ForLoop* node) override;
|
void Visit(ForLoop* node) override;
|
||||||
void Visit(LoopLoop* node) override;
|
void Visit(LoopLoop* node) override;
|
||||||
|
|
||||||
void Visit(PatternToken& node) override; // variant
|
|
||||||
void Visit(Pattern& node) override; // variant
|
void Visit(Pattern& node) override; // variant
|
||||||
void Visit(FlowControl& node) override; // variant
|
void Visit(FlowControl& node) override; // variant
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -246,15 +246,13 @@ struct ExtendedName {
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
using PatternToken = std::variant<
|
using Pattern = std::variant<
|
||||||
std::unique_ptr<ExtendedName>,
|
std::unique_ptr<ExtendedName>,
|
||||||
std::unique_ptr<Literal>,
|
std::unique_ptr<Literal>,
|
||||||
std::unique_ptr<TypeConstructorPattern>>;
|
std::unique_ptr<TypeConstructorPattern>>;
|
||||||
|
|
||||||
|
|
||||||
using Pattern = std::variant<
|
using ScopedPattern = Pattern;
|
||||||
std::unique_ptr<TypeConstructorPattern>,
|
|
||||||
std::unique_ptr<PatternToken>>;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
@ -413,7 +411,7 @@ struct TypeConstructorPatternParameter {
|
||||||
BaseNode base;
|
BaseNode base;
|
||||||
|
|
||||||
std::optional<ExtendedName> name;
|
std::optional<ExtendedName> name;
|
||||||
PatternToken value;
|
ScopedPattern value;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TypeConstructorPattern {
|
struct TypeConstructorPattern {
|
||||||
|
|
@ -462,6 +460,7 @@ struct WhileLoop {
|
||||||
struct ForLoop {
|
struct ForLoop {
|
||||||
BaseNode base;
|
BaseNode base;
|
||||||
|
|
||||||
|
utils::IsConstModifier variable_modifier;
|
||||||
AnyName variable;
|
AnyName variable;
|
||||||
Expression interval;
|
Expression interval;
|
||||||
Expression statement;
|
Expression statement;
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,6 @@ protected:
|
||||||
virtual void Visit(ForLoop* node);
|
virtual void Visit(ForLoop* node);
|
||||||
virtual void Visit(LoopLoop* node);
|
virtual void Visit(LoopLoop* node);
|
||||||
|
|
||||||
virtual void Visit(PatternToken& node); // variant
|
|
||||||
virtual void Visit(Pattern& node); // variant
|
virtual void Visit(Pattern& node); // variant
|
||||||
virtual void Visit(FlowControl& node); // variant
|
virtual void Visit(FlowControl& node); // variant
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -504,7 +504,7 @@ void BuildVisitor::Visit(TypeConstructorPattern* node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BuildVisitor::Visit(PatternToken& node) {
|
void BuildVisitor::Visit(Pattern& node) { // <-> ScopedPattern
|
||||||
auto parse_node = current_node_;
|
auto parse_node = current_node_;
|
||||||
|
|
||||||
current_node_ = parse_node.NthNamedChild(0);
|
current_node_ = parse_node.NthNamedChild(0);
|
||||||
|
|
@ -527,26 +527,6 @@ void BuildVisitor::Visit(PatternToken& node) {
|
||||||
current_node_ = parse_node;
|
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) {
|
void BuildVisitor::Visit(MatchCase* node) {
|
||||||
SetPosition(node->base, current_node_);
|
SetPosition(node->base, current_node_);
|
||||||
|
|
||||||
|
|
@ -653,6 +633,13 @@ void BuildVisitor::Visit(ForLoop* node) {
|
||||||
|
|
||||||
auto parse_node = current_node_;
|
auto parse_node = current_node_;
|
||||||
|
|
||||||
|
std::string modifier = parse_node.NthChild(1).GetValue();
|
||||||
|
if (modifier == "const") {
|
||||||
|
node->variable_modifier = utils::IsConstModifier::Const;
|
||||||
|
} else if (modifier == "var") {
|
||||||
|
node->variable_modifier = utils::IsConstModifier::Var;
|
||||||
|
}
|
||||||
|
|
||||||
current_node_ = parse_node.ChildByFieldName("variable");
|
current_node_ = parse_node.ChildByFieldName("variable");
|
||||||
Visit(node->variable);
|
Visit(node->variable);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -331,7 +331,16 @@ void PrintVisitor::Visit(WhileLoop* node) {
|
||||||
out_ << ")\n";
|
out_ << ")\n";
|
||||||
}
|
}
|
||||||
void PrintVisitor::Visit(ForLoop* node) {
|
void PrintVisitor::Visit(ForLoop* node) {
|
||||||
out_ << "[For] (";
|
out_ << "[For ";
|
||||||
|
switch (node->variable_modifier) {
|
||||||
|
case utils::IsConstModifier::Const:
|
||||||
|
out_ << "const";
|
||||||
|
break;
|
||||||
|
case utils::IsConstModifier::Var:
|
||||||
|
out_ << "var";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
out_ << "] (";
|
||||||
Visitor::Visit(node->variable);
|
Visitor::Visit(node->variable);
|
||||||
out_ << ") [in] (";
|
out_ << ") [in] (";
|
||||||
Visitor::Visit(node->interval);
|
Visitor::Visit(node->interval);
|
||||||
|
|
|
||||||
|
|
@ -319,16 +319,19 @@ void TypeCheckVisitor::Visit(MatchCase* node) {
|
||||||
is_const_definition_ = true; // TODO: or var??
|
is_const_definition_ = true; // TODO: or var??
|
||||||
Visitor::Visit(node->value);
|
Visitor::Visit(node->value);
|
||||||
|
|
||||||
|
utils::IdType value_type = current_type_;
|
||||||
|
|
||||||
switch (node->value.index()) {
|
switch (node->value.index()) {
|
||||||
case 0:
|
case 0:
|
||||||
context_manager_.DefineVariable(std::get<0>(node->value)->name,
|
context_manager_.DefineVariable(std::get<std::unique_ptr<ExtendedName>>(node->value)->name,
|
||||||
current_type_,
|
current_type_,
|
||||||
is_const_definition_.value());
|
is_const_definition_.value());
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
Visitor::Visit(*std::get<std::unique_ptr<Literal>>(node->value));
|
||||||
Visitor::Visit(*std::get<1>(node->value).get());
|
if (context_manager_.EqualTypes(current_type_, value_type)) {
|
||||||
|
error_handling::HandleTypecheckError("Literal and value have different types", node->base);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node->value).get());
|
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node->value).get());
|
||||||
|
|
@ -452,7 +455,9 @@ void TypeCheckVisitor::Visit(ForLoop* node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
current_type_ = context_manager_.AddType(maybe_interval_type.value()->GetElementsType());
|
current_type_ = context_manager_.AddType(maybe_interval_type.value()->GetElementsType());
|
||||||
|
is_const_definition_ = (node->modifier == utils::IsConstModifier::Const);
|
||||||
Visitor::Visit(node->variable); // type passed to variable definition throught current_type_
|
Visitor::Visit(node->variable); // type passed to variable definition throught current_type_
|
||||||
|
is_const_definition_ = std::nullopt;
|
||||||
|
|
||||||
Visitor::Visit(node->statement);
|
Visitor::Visit(node->statement);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,13 +64,13 @@ void Visitor::Visit(SourceStatement& node) {
|
||||||
|
|
||||||
// Flow control -----------------
|
// Flow control -----------------
|
||||||
|
|
||||||
void Visitor::Visit(PatternToken& node) {
|
void Visitor::Visit(Pattern& node) { // <-> ScopedPattern
|
||||||
switch (node.index()) {
|
switch (node.index()) {
|
||||||
case 0:
|
case 0:
|
||||||
Visit(std::get<std::unique_ptr<ExtendedName>>(node).get());
|
Visit(std::get<std::unique_ptr<ExtendedName>>(node).get());
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
Visit(*std::get<std::unique_ptr<Literal>>(node).get());
|
Visit(*std::get<std::unique_ptr<Literal>>(node));
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node).get());
|
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node).get());
|
||||||
|
|
@ -81,20 +81,6 @@ void Visitor::Visit(PatternToken& node) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Visitor::Visit(Pattern& node) {
|
|
||||||
switch (node.index()) {
|
|
||||||
case 0:
|
|
||||||
Visit(std::get<std::unique_ptr<TypeConstructorPattern>>(node).get());
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
Visit(*std::get<std::unique_ptr<PatternToken>>(node));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// error
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Visitor::Visit(FlowControl& node) {
|
void Visitor::Visit(FlowControl& node) {
|
||||||
switch (node.index()) {
|
switch (node.index()) {
|
||||||
case 0:
|
case 0:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue