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_indent();
|
||||||
write("end\n");
|
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)
|
void generate_expr(const Expr &expr)
|
||||||
{
|
{
|
||||||
|
|
@ -187,5 +200,94 @@ private:
|
||||||
}
|
}
|
||||||
write(")");
|
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