ok?
This commit is contained in:
parent
acb9bb442b
commit
16f1174e7d
1 changed files with 102 additions and 0 deletions
102
src/codegen.hpp
102
src/codegen.hpp
|
|
@ -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("]");
|
||||
}
|
||||
}
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue