part of print_visitor + interpreter_tree fixes

This commit is contained in:
ProgramSnail 2023-03-26 23:15:42 +03:00
parent f0a95ee2df
commit c8b52f9ade
8 changed files with 417 additions and 163 deletions

View file

@ -24,8 +24,8 @@ void PrintVisitor::Visit(SourceFile* node) {
void PrintVisitor::Visit(Sources* node) {
out_ << "<Sources>\n\n";
for (auto& source_statement : node->statements) {
Visitor::Visit(source_statement);
for (auto& statement : node->statements) {
Visitor::Visit(statement);
}
out_ << "\n</Sources>";
}
@ -254,22 +254,113 @@ void PrintVisitor::Visit(DefinitionArgument* node) {
// Flow control -----------------
void PrintVisitor::Visit(Match* node) {}
void PrintVisitor::Visit(Condition* node) {}
void PrintVisitor::Visit(DoWhileLoop* node) {}
void PrintVisitor::Visit(WhileLoop* node) {};
void PrintVisitor::Visit(ForLoop* node) {};
void PrintVisitor::Visit(LoopLoop* node) {};
void PrintVisitor::Visit(Match* node) {
out_ << "<Match> ";
Visitor::Visit(node->value);
out_ << " with\n";
for (auto& match_case : node->matches) {
out_ << "| ";
Visitor::Visit(match_case.value);
if (match_case.condition.has_value()) {
out_ << " ? ";
Visitor::Visit(match_case.condition.value());
}
if (match_case.statement.has_value()) {
out_ << " -> ";
Visitor::Visit(match_case.statement.value());
}
out_ << '\n';
}
out_ << "</Match>\n";
}
void PrintVisitor::Visit(Condition* node) {
out_ << "<If> ";
Visitor::Visit(node->conditions[0]);
out_ << " then\n";
Visitor::Visit(node->statements[0]);
out_ << '\n';
for (size_t i = 1; i < node->conditions.size(); ++i) {
out_ << "elif ";
Visitor::Visit(node->conditions[i]);
out_ << " then\n";
Visitor::Visit(node->statements[i]);
out_ << '\n';
}
if (node->statements.size() > node->conditions.size()) {
out_ << "else ";
Visitor::Visit(node->statements[node->conditions.size()]);
out_ << '\n';
}
out_ << "</If>\n";
}
void PrintVisitor::Visit(DoWhileLoop* node) {
out_ << "<DoWhile>\n";
Visitor::Visit(node->statement);
out_ << "\nwhile\n";
Visitor::Visit(node->condition);
out_ << "\n</DoWhile>\n";
}
void PrintVisitor::Visit(WhileLoop* node) {
out_ << "<While>\n";
Visitor::Visit(node->statement);
out_ << "\ndo\n";
Visitor::Visit(node->condition);
out_ << "\n</While>\n";
}
void PrintVisitor::Visit(ForLoop* node) {
out_ << "<For>\n";
Visitor::Visit(node->variable);
out_ << "\nin\n";
Visitor::Visit(node->interval);
out_ << "\ndo\n";
Visitor::Visit(node->statement);
out_ << "</For>\n";
}
void PrintVisitor::Visit(LoopLoop* node) {
out_ << "<Loop>\n";
Visitor::Visit(node->statement);
out_ << "<\n/Loop>\n";
}
// Statements, expressions, blocks, etc. -----------------
void PrintVisitor::Visit(Block* node) {}
void PrintVisitor::Visit(ScopedStatement* node) {}
void PrintVisitor::Visit(Block* node) {
out_ << "<Block> {\n";
for (auto& statement : node->statements) {
Visitor::Visit(statement);
}
out_ << "} </Block>\n";
}
void PrintVisitor::Visit(ScopedStatement* node) {
out_ << "<Scoped> ( ";
Visitor::Visit(node->statement);
out_ << " ) </Scoped>";
}
// Operators
void PrintVisitor::Visit(BinaryOperatorExpression* node) {}
void PrintVisitor::Visit(UnaryOperatorExpression* node) {}
void PrintVisitor::Visit(BinaryOperatorExpression* node) {
out_ << "<BinaryOperator> ";
Visitor::Visit(node->left_expression);
out_ << ' ';
Visit(&node->operator_name);
out_ << ' ';
Visitor::Visit(node->right_expression);
out_ << " </BinaryOperator>";
}
void PrintVisitor::Visit(UnaryOperatorExpression* node) {
out_ << "<UnaryOperator> ";
Visit(&node->operator_name);
out_ << ' ';
Visitor::Visit(node->expression);
out_ << " </UnaryOperator>";
}
// Simple Expressions