mirror of
https://codeberg.org/ProgramSnail/lang_2023.git
synced 2025-12-06 06:58:45 +00:00
part of print_visitor + interpreter_tree fixes
This commit is contained in:
parent
f0a95ee2df
commit
c8b52f9ade
8 changed files with 417 additions and 163 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue