mirror of
https://codeberg.org/ProgramSnail/lang.git
synced 2025-12-07 15:38:49 +00:00
fixes, expression printers
This commit is contained in:
parent
3669084f55
commit
bf49f4030c
9 changed files with 349 additions and 101 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue