This commit is contained in:
bronku 2025-12-02 12:44:28 +01:00
parent acb9bb442b
commit 16f1174e7d

View file

@ -154,6 +154,19 @@ private:
write_indent();
write("end\n");
}
else if (auto *class_def = dynamic_cast<const ClassDef *>(&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<const UnaryOpExpr *>(&expr))
{
output << unary_op->op.symbol();
generate_expr(*unary_op->operand);
}
else if (auto *attr = dynamic_cast<const Attribute *>(&expr))
{
generate_expr(*attr->value);
output << "." << attr->attr;
}
else if (auto *subscript = dynamic_cast<const Subscript *>(&expr))
{
generate_expr(*subscript->value);
output << "[";
generate_expr(*subscript->index);
output << "]";
}
else if (auto *slice_sub = dynamic_cast<const SliceSubscript *>(&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<const List *>(&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<const Dict *>(&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<const Tuple *>(&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("]");
}
}
};