Author: kjs
Date: Tue Apr 10 01:52:18 2007
New Revision: 18106
Modified:
trunk/compilers/pirc/src/jsonout.c
Log:
compilers/pirc:
* improve json back-end (but still not complete yet, only simple examples are
correct)
Modified: trunk/compilers/pirc/src/jsonout.c
==============================================================================
--- trunk/compilers/pirc/src/jsonout.c (original)
+++ trunk/compilers/pirc/src/jsonout.c Tue Apr 10 01:52:18 2007
@@ -12,14 +12,16 @@
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
+#include <stdarg.h>
-#define OUT stdout
-#define INDENT 4
+#define OUT stdout
+#define INDENT 4
/* make it look like a function call */
-#define indent(D) D->indent += INDENT
-#define dedent(D) D->indent -= INDENT
+#define indent(D) D->indent += INDENT
+#define dedent(D) D->indent -= INDENT
+#define print_comma(D) fprintf(OUT, "%*s,\n", data->indent, " ");
/*
@@ -52,6 +54,7 @@
int indent; /* keep track of indention */
/* has the first item in a list already been emitted? If so, we need a
comma as separator */
int need_comma;
+
struct target *targets; /* list of targets for temp. storage */
} emit_data;
@@ -91,6 +94,12 @@
*/
static void
+json_start_object(emit_data *data) {
+ fprintf(OUT, "%*s{\n", data->indent, data->indent ? " " : "");
+ indent(data);
+}
+
+static void
json_init(emit_data *data) {
fprintf(OUT, "{\n");
indent(data);
@@ -105,53 +114,76 @@
static void
json_sub_start(emit_data *data, char *source, int pos) {
- fprintf(OUT, "%*s\"sub\" : {\n", data->indent, " ");
+ if (data->need_comma) print_comma(data);
+ fprintf(OUT, "%*s{ \"sub\" :\n", data->indent, " ");
indent(data);
+
+ fprintf(OUT, "%*s{\n", data->indent, " ");
+ indent(data);
+
fprintf(OUT, "%*s{ \"source\" : \"%s\" },\n", data->indent, " ", source);
fprintf(OUT, "%*s{ \"pos\" : %d },\n", data->indent, " ", pos);
}
static void
+json_sub_end(emit_data *data) {
+ dedent(data);
+ fprintf(OUT, "%*s}\n", data->indent, " ");
+
+ dedent(data);
+ fprintf(OUT, "%*s}\n", data->indent, " ");
+ data->need_comma = 1;
+}
+
+static void
json_name(emit_data *data, char *name) {
fprintf(OUT, "%*s{ \"name\" : \"%s\" }\n", data->indent, " ", name);
}
static void
json_stmts_start(emit_data *data) {
- fprintf(OUT, "%*s\"instructions\" : [\n", data->indent, " ");
+ fprintf(OUT, "%*s{ \"instructions\" :\n", data->indent, " ");
+ indent(data);
+ fprintf(OUT, "%*s[\n", data->indent, " ");
indent(data);
+ data->need_comma = 0;
}
static void
json_param_start(emit_data *data) {
- fprintf(OUT, "%*s\"parameters\" : [\n", data->indent, " ");
+ fprintf(OUT, "%*s\"parameters\" :\n", data->indent, " ");
indent(data);
+ fprintf(OUT, "%*s[\n", data->indent, " ");
+ indent(data);
+ data->need_comma = 0;
}
static void
json_sub_flag_start(emit_data *data) {
- fprintf(OUT, "%*s{ \"subflags\" : [\n", data->indent, " ");
+ fprintf(OUT, "%*s{ \"subflags\" :\n", data->indent, " ");
+ indent(data);
+ fprintf(OUT, "%*s[\n", data->indent, " ");
indent(data);
+ data->need_comma = 0;
}
static void
json_sub_flag_end(emit_data *data) {
dedent(data);
- fprintf(OUT, "%*s] }\n", data->indent, " ");
+ fprintf(OUT, "%*s]\n", data->indent, " ");
+ dedent(data);
+ fprintf(OUT, "%*s},\n", data->indent, " ");
}
static void
json_sub_flag(emit_data *data, int flag) {
- if (data->need_comma) {
- fprintf(OUT, ",");
- data->need_comma = 0;
- }
+ if (data->need_comma) print_comma(data);
fprintf(OUT, "%*s{ \"subflag\" : \"%s\" }\n", data->indent, " ", "TODO");
}
static void
json_list_start(emit_data *data) {
- fprintf(OUT, "%*s[\n", data->indent, " ");
+ fprintf(OUT, "%*s[", data->indent, " ");
indent(data);
data->need_comma = 0;
}
@@ -163,58 +195,66 @@
}
static void
+json_stmts_end(emit_data *data) {
+ dedent(data);
+ fprintf(OUT, "%*s]\n", data->indent, " ");
+ dedent(data);
+ fprintf(OUT, "%*s}\n", data->indent, " ");
+}
+
+static void
json_op_start(emit_data *data, char *op) {
- fprintf(OUT, "%*s{ \"op\" : \"%s\",\n", data->indent, " ", op);
- fprintf(OUT, "%*s\"args\" : [\n", data->indent, " ");
+ if (data->need_comma) print_comma(data);
+ fprintf(OUT, "%*s{ \"op\" : \"%s\" },\n", data->indent, " ", op);
+ fprintf(OUT, "%*s{ \"operands\" :\n", data->indent, " ");
+ indent(data);
+ fprintf(OUT, "%*s[\n", data->indent, " ");
indent(data);
}
static void
json_op_end(emit_data *data) {
+ dedent(data);
fprintf(OUT, "%*s]\n", data->indent, " ");
dedent(data);
fprintf(OUT, "%*s}\n", data->indent, " ");
+
}
static void
json_expr(emit_data *data, char *expr) {
+ if (data->need_comma) print_comma(data);
fprintf(OUT, "%*s{ \"expr\" : \"%s\" }\n", data->indent, " ", expr);
+ data->need_comma = 1;
}
-/*
-Destructor for emit_data structure
-
-*/
-static void
-json_destroy(emit_data *data) {
- free(data);
- data = NULL;
-}
static void
json_method(emit_data *data, char *name) {
- fprintf(OUT, "%*s\"method\" : \"%s\"\n", data->indent, " ", name);
+ fprintf(OUT, "%*s{ \"method\" : \"%s\" }\n", data->indent, " ", name);
}
static void
json_invocant(emit_data *data, char *invocant) {
- fprintf(OUT, "%*s\"invocant\" : \"%s\"\n", data->indent, " ", invocant);
+ fprintf(OUT, "%*s{ \"invocant\" : \"%s\" }\n", data->indent, " ",
invocant);
}
static void
json_args_start(emit_data *data) {
- fprintf(OUT, "%*s{ \"arguments\" : [", data->indent, " ");
+ fprintf(OUT, "%*s{ \"arguments\" :\n", data->indent, " ");
+ indent(data);
+ fprintf(OUT, "%*s[\n", data->indent, " ");
indent(data);
}
static void
json_args_end(emit_data *data) {
- /* fprintf(OUT, "%*s] }\n", data->indent, " "); */
dedent(data);
- fprintf(OUT, "]\n");
-
+ fprintf(OUT, "%*s]\n", data->indent, " ");
+ dedent(data);
+ fprintf(OUT, "%*s}\n", data->indent, " ");
}
@@ -229,12 +269,11 @@
static void
json_invokable(emit_data *data, char *invokable) {
fprintf(OUT, "%*s{ \"invokable\" : \"%s\" }\n", data->indent, " ",
invokable);
- /* indent(data); */
}
static void
json_invocation_start(emit_data *data) {
- fprintf(OUT, "%*s{ \"invocation\" : {\n", data->indent, " ");
+ fprintf(OUT, "%*s{ \"invocation\" :\n%*s{\n", data->indent, " ",
data->indent, " ");
indent(data);
}
@@ -245,6 +284,27 @@
}
+/*
+
+Destructor for emit_data structure
+
+*/
+static void
+json_destroy(emit_data *data) {
+ free(data);
+ data = NULL;
+}
+
+/*
+
+=item init_json_vtable()
+
+Initializes a vtable for the JSON back-end. Each of the vtable method slots is
+assigned a function address that implements that method.
+
+=cut
+
+*/
pirvtable *
init_json_vtable(void) {
pirvtable *vtable = new_pirvtable();
@@ -253,10 +313,10 @@
vtable->initialize = json_init;
vtable->destroy = json_destroy;
vtable->sub_start = json_sub_start;
- vtable->sub_end = json_end;
+ vtable->sub_end = json_sub_end;
vtable->end = json_end;
vtable->stmts_start = json_stmts_start;
- vtable->stmts_end = json_list_end;
+ vtable->stmts_end = json_stmts_end;
vtable->name = json_name;
vtable->sub_flag = json_sub_flag;
vtable->op_start = json_op_start;
@@ -291,6 +351,8 @@
+
+
/*
* Local variables:
* c-file-style: "parrot"