Пример #1
0
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);
  }

}
Пример #2
0
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);
}
Пример #3
0
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");
}
Пример #4
0
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);
}
Пример #5
0
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(")");
    }
}
Пример #6
0
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");
}
Пример #7
0
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(";");
    }
}