or_in or_out references added

This commit is contained in:
ProgramSnail 2023-07-29 12:19:37 +03:00
parent fc114ff959
commit 68463509d8
9 changed files with 29 additions and 12 deletions

View file

@ -52,8 +52,13 @@ nodes::Modifier build_modifier(parser::ParseTree::Node parser_node) {
return nodes::Modifier::IN;
} else if (modifier == "<>" || modifier == "ref") {
return nodes::Modifier::REF;
} else if (modifier == "|->" || modifier == "or_out") {
return nodes::Modifier::OR_OUT;
} else if (modifier == "<-|" || modifier == "or_in") {
return nodes::Modifier::OR_IN;
} else {
return nodes::Modifier::NONE;
}
return nodes::Modifier::NONE;
}
nodes::Node build_node(parser::ParseTree::Node parser_node) {

View file

@ -17,6 +17,13 @@ void print_modifier(const nodes::Modifier &modifier, Printer &printer) {
case nodes::Modifier::REF:
printer.print(printer.print_words_instead_of_symbols() ? "ref " : "<> ");
break;
case nodes::Modifier::OR_OUT:
printer.print(printer.print_words_instead_of_symbols() ? "or_out "
: "|-> ");
break;
case nodes::Modifier::OR_IN:
printer.print(printer.print_words_instead_of_symbols() ? "or_in " : "<-| ");
break;
case nodes::Modifier::OPTIONAL:
printer.print("?");
break;

View file

@ -173,7 +173,7 @@ void print_condition(const nodes::Condition &expression,
}
void print_loop(const nodes::Loop &expression, printers::Printer &printer) {
printer.print(printer.print_words_instead_of_symbols() ? "for " : "@");
printer.print(printer.print_words_instead_of_symbols() ? "for" : "@");
switch (expression.get_type()) {
case nodes::Loop::LOOP:
@ -330,9 +330,8 @@ void print_loop_control(const nodes::LoopControl &expression,
void print_modifier_expression(const nodes::ModifierExpression &expression,
printers::Printer &printer) {
if (expression.get_modifier() == nodes::Modifier::OUT ||
expression.get_modifier() == nodes::Modifier::IN ||
expression.get_modifier() == nodes::Modifier::REF) {
if (expression.get_modifier() != nodes::Modifier::OPTIONAL &&
expression.get_modifier() != nodes::Modifier::RESULT) {
print_modifier(expression.get_modifier(), printer);
}

View file

@ -44,6 +44,6 @@ int main(int argc, char **argv) {
auto statements = builders::build_source_file(
parse_tree.get_root(), expression_storage, type_storage, name_tree);
printers::Printer printer(std::cout, 2, 80, false);
printers::Printer printer(std::cout, 2, 80, true);
printers::print_source_file(statements, printer);
}

View file

@ -297,9 +297,8 @@ build_function_definition(parser::ParseTree::Node parser_node,
last_before_modifier = build_modifier(maybe_reference_node);
// only out, in, ref allowed
if (last_before_modifier != nodes::Modifier::OUT &&
last_before_modifier != nodes::Modifier::IN &&
last_before_modifier != nodes::Modifier::REF) {
if (last_before_modifier == nodes::Modifier::OPTIONAL ||
last_before_modifier == nodes::Modifier::RESULT) {
last_before_modifier = nodes::Modifier::NONE;
}
}