fixes, expression printers

This commit is contained in:
ProgramSnail 2023-07-24 21:23:18 +03:00
parent 3669084f55
commit bf49f4030c
9 changed files with 349 additions and 101 deletions

View file

@ -7,23 +7,194 @@
namespace printers {
void print_expression(const nodes::Expression &expression,
printers::Printer &printer) {} // IN PROGRESS
printers::Printer &printer) {
if (expression.is_scoped()) {
printer.print("(");
}
switch (expression.get_any()->index()) {
// --- flow control
case 0: // Match
print_match(*expression.get<nodes::Match>().value(), printer);
break;
case 1: // Condition
print_condition(*expression.get<nodes::Condition>().value(), printer);
break;
case 2: // Loop
print_loop(*expression.get<nodes::Loop>().value(), printer);
break;
// --- containers
case 3: // Container
print_container(*expression.get<nodes::Container>().value(), printer);
break;
// --- modifiers
case 4: // Return
print_return(*expression.get<nodes::Return>().value(), printer);
break;
case 5: // NameDefinition
print_name_definition(*expression.get<nodes::NameDefinition>().value(),
printer);
break;
case 6: // Access
print_access(*expression.get<nodes::Access>().value(), printer);
break;
case 7: // LoopControl
print_loop_control(*expression.get<nodes::LoopControl>().value(), printer);
break;
case 8: // ModifierExpression
print_modifier_expression(
*expression.get<nodes::ModifierExpression>().value(), printer);
break;
// --- other
case 9: // NameExpression
print_name_expression(*expression.get<nodes::NameExpression>().value(),
printer);
break;
case 10: // Constructor
print_constructor(*expression.get<nodes::Constructor>().value(), printer);
break;
case 11: // Lambda
print_lambda(*expression.get<nodes::Lambda>().value(), printer);
break;
// --- literal
case 12: // Literal
print_literal(*expression.get<nodes::Literal>().value(), printer);
break;
}
if (expression.is_scoped()) {
printer.print(")");
}
}
// --- flow control
void print_case(const nodes::Match::Case &expression, Printer &printer) {
switch (expression.case_type()) {
case nodes::Match::Case::PATTERN_VALUE:
printer.print(":=");
break;
case nodes::Match::Case::VALUE_PATTERN:
printer.print("=:");
break;
}
printer.space();
print_expression(*expression.get_value(), printer);
if (expression.get_condition().has_value()) {
printer.print(printer.print_words_instead_of_symbols() ? " if " : " ?? ");
print_expression(*expression.get_condition().value(), printer);
}
if (expression.get_expression().has_value()) {
printer.print(printer.print_words_instead_of_symbols() ? " do " : " => ");
print_expression(*expression.get_expression().value(), printer);
}
} // IN PROGRESS
void print_match(const nodes::Match &expression, printers::Printer &printer) {
print_expression(*expression.get_value(), printer);
printer.space();
size_t indentation = printer.get_current_position();
for (size_t i = 0; i < expression.cases_size(); ++i) {
print_case(*expression.get_case(i), printer);
if (i + 1 < expression.cases_size()) {
printer.new_line(indentation);
}
}
} // IN PROGRESS
void print_condition(const nodes::Condition &expression,
printers::Printer &printer) {} // IN PROGRESS
printers::Printer &printer) {
for (size_t i = 0; i < expression.cases_size(); ++i) {
if (i == 0) {
printer.print(printer.print_words_instead_of_symbols() ? "if " : "?? ");
} else {
printer.print(printer.print_words_instead_of_symbols() ? "elif " : "!! ");
}
print_expression(*expression.get_case(i).first, printer);
printer.print(printer.print_words_instead_of_symbols() ? "do " : "=> ");
print_expression(*expression.get_case(i).second, printer);
}
if (expression.get_else_case().has_value()) {
printer.print(printer.print_words_instead_of_symbols() ? "else " : "!!=> ");
print_expression(*expression.get_else_case().value(), printer);
}
}
void print_loop(const nodes::Loop &expression, printers::Printer &printer) {
printer.print(printer.print_words_instead_of_symbols() ? "for " : "@");
switch (expression.get_type()) {
case nodes::Loop::LOOP:
printer.space();
break;
case nodes::Loop::WHILE:
printer.space();
print_expression(*expression.get_condition().value(), printer);
printer.space();
break;
case nodes::Loop::FOR:
printer.space();
print_expression(*expression.get_variable().value(), printer);
printer.print(" : ");
print_expression(*expression.get_interval().value(), printer);
printer.space();
break;
}
printer.print(printer.print_words_instead_of_symbols() ? "do " : "=> ");
print_expression(*expression.get_expression(), printer);
printer.print(";");
} // IN PROGRESS
// --- containers
void print_container(const nodes::Container &expression,
printers::Printer &printer) {} // IN PROGRESS
printers::Printer &printer) {
bool is_array = expression.get_type() == nodes::Container::ARRAY;
if (is_array) {
printer.print("[[");
} else {
printer.print("{");
printer.indent();
printer.new_indent_line();
}
for (size_t i = 0; i < expression.expressions_size(); ++i) {
print_expression(*expression.get_expression(i), printer);
if (is_array) {
printer.space();
} else {
printer.print(";");
printer.new_indent_line();
}
}
if (is_array) {
printer.print("]]");
} else {
printer.deindent();
printer.print("}");
printer.new_indent_line();
}
} // IN PROGRESS
// --- modifiers
@ -78,10 +249,10 @@ void print_access(const nodes::Access &expression, printers::Printer &printer) {
switch (expression.get_type()) {
case nodes::Access::ARRAY:
printer.print('[');
printer.print("[");
break;
case nodes::Access::TUPLE:
printer.print('.');
printer.print(".");
break;
default:
break;
@ -91,7 +262,7 @@ void print_access(const nodes::Access &expression, printers::Printer &printer) {
switch (expression.get_type()) {
case nodes::Access::ARRAY:
printer.print(']');
printer.print("]");
break;
case nodes::Access::TUPLE:
break;
@ -151,10 +322,10 @@ void print_modifier_expression(const nodes::ModifierExpression &expression,
switch (expression.get_modifier()) {
case nodes::Modifier::OR_FALSE:
printer.print('?');
printer.print("?");
break;
case nodes::Modifier::OR_RETURN:
printer.print('!');
printer.print("!");
break;
default:
break;
@ -168,13 +339,13 @@ void print_name_expression(const nodes::NameExpression &expression,
if (expression.is_operator_call() || expression.is_point_call()) {
print_expression(*expression.get_argument_value(0), printer);
if (expression.is_point_call()) {
printer.print('.');
printer.print(".");
} else {
printer.space();
}
} else if (expression.get_prefix().has_value()) {
print_type(*expression.get_prefix().value(), printer);
printer.print('.');
printer.print(".");
}
print_identifier(*expression.get_name(), printer);
@ -216,7 +387,7 @@ void print_lambda(const nodes::Lambda &expression, printers::Printer &printer) {
printer.space();
}
printer.print(printer.print_words_instead_of_symbols() ? "do " : "-> ");
printer.print(printer.print_words_instead_of_symbols() ? "do " : "=> ");
print_expression(*expression.get_expression(), printer);