static void write_statements(tree *statements) { tree *list; tree *statement; list = statements; assert(list->tag == node_list); while(list) { statement = HEAD(list); switch(statement->tag) { case node_call: write_call(statement); break; case node_cond: write_cond(statement); break; case node_loop: write_loop(statement); break; default: write_expression(statement); } list = TAIL(list); } }
static void write_unary_expression(const unary_expression_t *expression) { switch(expression->base.kind) { case EXPR_UNARY_NEGATE: fputc('-', out); break; case EXPR_UNARY_NOT: fputc('!', out); break; case EXPR_UNARY_CAST: write_expression(expression->value); return; default: panic("unimplemented unary expression"); } write_expression(expression->value); }
static void write_enum(const symbol_t *symbol, const enum_t *entity) { char buf[128]; const char *name; if (symbol == NULL) { static int lastenum = 0; snprintf(buf, sizeof(buf), "AnonEnum%d", lastenum++); name = buf; } else { name = symbol->string; } fprintf(out, "\tpublic static enum %s {\n", name); for (const entity_t *entry = entity->first_value; entry != NULL && entry->kind == ENTITY_ENUM_VALUE; entry = entry->base.next) { fprintf(out, "\t\t%s", entry->base.symbol->string); fprintf(out, "("); if (entry->enum_value.value != NULL) { write_expression(entry->enum_value.value); } fprintf(out, ")"); if (entry->base.next != NULL && entry->base.next->kind == ENTITY_ENUM_VALUE) { fputs(",\n", out); } else { fputs(";\n", out); } } fprintf(out, "\t\tpublic final int val;\n"); fprintf(out, "\n"); fprintf(out, "\t\tprivate static class C {\n"); fprintf(out, "\t\t\tstatic int next_val;\n"); fprintf(out, "\t\t}\n"); fprintf(out, "\n"); fprintf(out, "\t\t%s(int val) {\n", name); fprintf(out, "\t\t\tthis.val = val;\n"); fprintf(out, "\t\t\tC.next_val = val + 1;\n"); fprintf(out, "\t\t}\n"); fprintf(out, "\n"); fprintf(out, "\t\t%s() {\n", name); fprintf(out, "\t\t\tthis.val = C.next_val++;\n"); fprintf(out, "\t\t}\n"); fprintf(out, "\n"); fprintf(out, "\t\tpublic static %s getEnum(int val) {\n", name); fprintf(out, "\t\t\tfor (%s entry : values()) {\n", name); fprintf(out, "\t\t\t\tif (val == entry.val)\n"); fprintf(out, "\t\t\t\t\treturn entry;\n"); fprintf(out, "\t\t\t}\n"); fprintf(out, "\t\t\treturn null;\n"); fprintf(out, "\t\t}\n"); fprintf(out, "\t}\n"); fprintf(out, "\n"); }
static void write_binary_expression(const binary_expression_t *expression) { fputs("(", out); write_expression(expression->left); fputc(' ', out); switch(expression->base.kind) { case EXPR_BINARY_BITWISE_OR: fputs("|", out); break; case EXPR_BINARY_BITWISE_AND: fputs("&", out); break; case EXPR_BINARY_BITWISE_XOR: fputs("^", out); break; case EXPR_BINARY_SHIFTLEFT: fputs("<<", out); break; case EXPR_BINARY_SHIFTRIGHT: fputs(">>", out); break; case EXPR_BINARY_ADD: fputs("+", out); break; case EXPR_BINARY_SUB: fputs("-", out); break; case EXPR_BINARY_MUL: fputs("*", out); break; case EXPR_BINARY_DIV: fputs("/", out); break; default: panic("unimplemented binexpr"); } fputc(' ', out); write_expression(expression->right); fputs(")", out); }
void write_expression(CppWriter& writer, Term* term) { if (is_value(term)) { write_value(writer, term); } else if (term->stringProp("syntax:declarationStyle") == "infix") { write_expression(writer, term->input(0)); writer.write(" "); writer.write(term->stringProp("syntax:functionName")); writer.write(" "); write_expression(writer, term->input(1)); } else { writer.write(term->function->name); writer.write("("); for (int i=0; i < term->numInputs(); i++) { if (i != 0) writer.write(", "); write_expression(writer, term->input(0)); } writer.write(")"); } }
static void write_enum(const symbol_t *symbol, const enum_type_t *type) { fprintf(out, "enum %s:\n", symbol->string); entity_t *entry = type->enume->base.next; for ( ; entry != NULL && entry->kind == ENTITY_ENUM_VALUE; entry = entry->base.next) { fprintf(out, "\t%s", entry->base.symbol->string); if(entry->enum_value.value != NULL) { fprintf(out, " <- "); write_expression(entry->enum_value.value); } fputc('\n', out); } fprintf(out, "typealias %s <- int\n", symbol->string); fprintf(out, "\n"); }
void write_statement(CppWriter& writer, Term* term) { if (is_comment(term)) { if (term->stringProp("comment") != "") { writer.write("//"); writer.write(term->stringProp("comment")); } } else if (is_function(term)) { write_function(writer, term); } else if (is_statement(term)) { if (term->name != "") { write_type_name(writer, term->type); writer.write(" "); writer.write(term->name); writer.write(" = "); } write_expression(writer, term); writer.write(";"); } }