diff --git a/src/codegen.hpp b/src/codegen.hpp index 93b8d90..cf445e3 100644 --- a/src/codegen.hpp +++ b/src/codegen.hpp @@ -154,6 +154,19 @@ private: write_indent(); write("end\n"); } + else if (auto *class_def = dynamic_cast(&stmt)) + { + write_indent(); + output << "Class " << class_def->name << "\n"; + indent_level++; + for (const auto &s : class_def->body) + { + generate_stmt(*s); + } + indent_level--; + write_indent(); + write("end\n"); + } } void generate_expr(const Expr &expr) { @@ -187,5 +200,94 @@ private: } write(")"); } + else if (auto *unary_op = dynamic_cast(&expr)) + { + output << unary_op->op.symbol(); + generate_expr(*unary_op->operand); + } + else if (auto *attr = dynamic_cast(&expr)) + { + generate_expr(*attr->value); + output << "." << attr->attr; + } + else if (auto *subscript = dynamic_cast(&expr)) + { + generate_expr(*subscript->value); + output << "["; + generate_expr(*subscript->index); + output << "]"; + } + else if (auto *slice_sub = dynamic_cast(&expr)) + { + generate_expr(*slice_sub->value); + write("["); + + auto &slice = *slice_sub->index; + + if (slice.step) + { + write("# TODO: slice with step not directly translatable"); + } + else + { + if (slice.lower) + { + generate_expr(*slice.lower); + } + else + { + write("0"); + } + + write("..."); + + if (slice.upper) + { + generate_expr(*slice.upper); + } + else + { + write("-1"); + } + } + + write("]"); + } + else if (auto *list = dynamic_cast(&expr)) + { + write("["); + for (size_t i = 0; i < list->elements.size(); i++) + { + if (i > 0) + write(", "); + generate_expr(*list->elements[i]); + } + write("]"); + } + else if (auto *dict = dynamic_cast(&expr)) + { + write("{"); + for (size_t i = 0; i < dict->pairs.size(); i++) + { + if (i > 0) + write(", "); + generate_expr(*dict->pairs[i].first); + write(" => "); + generate_expr(*dict->pairs[i].second); + } + write("}"); + } + else if (auto *tuple = dynamic_cast(&expr)) + { + // #note no direct translation available + write("["); + for (size_t i = 0; i < tuple->elements.size(); i++) + { + if (i > 0) + write(", "); + generate_expr(*tuple->elements[i]); + } + write("]"); + } } }; \ No newline at end of file