Author: kjs
Date: Tue Apr 3 11:26:53 2007
New Revision: 17963
Modified:
trunk/compilers/pirc/src/jsonout.c
trunk/compilers/pirc/src/pastout.c
trunk/compilers/pirc/src/pirout.c
trunk/compilers/pirc/src/pirparser.c
trunk/compilers/pirc/src/pirvtable.c
trunk/compilers/pirc/src/pirvtable.h
Log:
compilers/pirc:
* some vtable changes
* and fixes for json/past/pir output
Modified: trunk/compilers/pirc/src/jsonout.c
==============================================================================
--- trunk/compilers/pirc/src/jsonout.c (original)
+++ trunk/compilers/pirc/src/jsonout.c Tue Apr 3 11:26:53 2007
@@ -12,7 +12,7 @@
#include "pirparser.h"
#include <stdio.h>
-#define OUT stderr
+#define OUT stdout
/* todo: re-use this code (see pastout.c) , and make it threadsafe: */
static int indent = 0;
@@ -32,15 +32,14 @@
json_end(struct parser_state *p) {
dedent();
fprintf(OUT, "%*s}\n", indent, (indent == 0) ? "" : " ");
-
}
-
static void
json_sub_start(struct parser_state *p, char *source, int pos) {
fprintf(OUT, "%*s'sub' : {\n", indent, " ");
indent();
- fprintf(OUT, "%*s'source' : '%s', 'pos' : %d,\n", indent, " ", source,
pos);
+ fprintf(OUT, "%*s'source' : '%s',\n", indent, " ", source);
+ fprintf(OUT, "%*s'pos' : %d,\n", indent, " ", pos);
}
static void
@@ -50,10 +49,44 @@
static void
json_stmts_start(struct parser_state *p) {
- fprintf(OUT, "%*s'instructions' : {\n", indent, " ");
+ fprintf(OUT, "%*s'instructions' : [\n", indent, " ");
indent();
}
+static void
+json_param_start(struct parser_state *p) {
+ fprintf(OUT, "%*s'parameters' : [\n", indent, " ");
+ indent();
+}
+
+static void
+json_sub_flag_start(struct parser_state *p) {
+ fprintf(OUT, "%*s'subflags' : [\n", indent, " ");
+ indent();
+}
+
+static void
+json_sub_flag_end(struct parser_state *p) {
+ dedent();
+ fprintf(OUT, "%*s]\n", indent, " ");
+}
+
+static void
+json_sub_flag(struct parser_state *p, int flag) {
+ fprintf(OUT, "%*s{ 'subflag' : '%s' }\n", indent, " ", "TODO");
+}
+
+static void
+json_list_start(struct parser_state *p) {
+ fprintf(OUT, "%*s[\n", indent, " ");
+ indent();
+}
+
+static void
+json_list_end(struct parser_state *p) {
+ dedent();
+ fprintf(OUT, "%*s]\n", indent, " ");
+}
/*
static void
json_next(struct parser_state *p) {
@@ -66,13 +99,22 @@
init_json_vtable(void) {
pirvtable *vtable = new_pirvtable();
- vtable->initialize = json_init;
- vtable->sub_start = json_sub_start;
- vtable->sub_end = json_end;
- vtable->end = json_end;
- vtable->stmts_start = json_stmts_start;
- vtable->stmts_end = json_end;
- vtable->name = json_name;
+ vtable->initialize = json_init;
+ vtable->sub_start = json_sub_start;
+ vtable->sub_end = json_end;
+ vtable->end = json_end;
+ vtable->stmts_start = json_stmts_start;
+ vtable->stmts_end = json_list_end;
+ vtable->name = json_name;
+ vtable->sub_flag = json_sub_flag;
+
+ vtable->param_start = json_param_start;
+ vtable->param_end = json_list_end;
+ vtable->sub_flag_start = json_sub_flag_start;
+ vtable->sub_flag_end = json_sub_flag_end;
+ vtable->list_start = json_list_start;
+ vtable->list_end = json_list_end;
+
/* vtable->next_expr = json_next; */
return vtable;
Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c (original)
+++ trunk/compilers/pirc/src/pastout.c Tue Apr 3 11:26:53 2007
@@ -131,11 +131,6 @@
*/
}
-static void
-past_subflagarg(struct parser_state *p, int flag, char *arg) {
- /*fprintf(OUT, "%*s<type> => \"%s\"\n", indent, " ", type);
- */
-}
static void
past_op(struct parser_state *p, char *op) {
@@ -181,8 +176,7 @@
vtable->param_start = past_param;
vtable->param_end = past_close;
vtable->type = past_type;
- vtable->sub_flag = past_subflag;
- vtable->sub_flag_arg = past_subflagarg;
+ vtable->sub_flag = past_subflag;
vtable->op_start = past_op;
vtable->expression = past_expr;
vtable->op_end = past_close;
Modified: trunk/compilers/pirc/src/pirout.c
==============================================================================
--- trunk/compilers/pirc/src/pirout.c (original)
+++ trunk/compilers/pirc/src/pirout.c Tue Apr 3 11:26:53 2007
@@ -5,6 +5,7 @@
#include <malloc.h>
+
#define OUT stderr
/*
@@ -80,7 +81,7 @@
static void
pir_param(struct parser_state *p) {
- fprintf(OUT, "\t.param ");
+ fprintf(OUT, " .param ");
}
static void
@@ -89,13 +90,8 @@
}
static void
-pir_subflag(struct parser_state *p, int flag) {
- fprintf(OUT, "%s ", find_keyword(flag));
-}
-
-static void
-pir_subflagarg(struct parser_state *p, int flag, char *arg) {
- fprintf(OUT, "%s(%s) ", find_keyword(flag), arg);
+pir_sub_flag(struct parser_state *p, int flag) {
+ fprintf(OUT, "%s ", find_keyword(flag));
}
static void
@@ -105,7 +101,7 @@
static void
pir_op(struct parser_state *p, char *op) {
- fprintf(OUT, "%s ", op);
+ fprintf(OUT, " %s ", op);
}
static void
@@ -113,6 +109,27 @@
fprintf(OUT, ", ");
}
+static void
+pir_list_start(struct parser_state *p) {
+ fprintf(OUT, "(");
+}
+
+static void
+pir_list_end(struct parser_state *p) {
+ fprintf(OUT, ")");
+}
+
+static void
+pir_sub_flag_start(struct parser_state *p) {
+ fprintf(OUT, "");
+}
+
+
+static void
+pir_sub_flag_end(struct parser_state *p) {
+ fprintf(OUT, "\n");
+}
+
/*
=item init_pir_vtable()
@@ -128,20 +145,24 @@
pirvtable *vtable = new_pirvtable();
/* override the methods that are needed for PIR output */
- vtable->sub_start = pir_sub;
- vtable->sub_end = pir_end;
- vtable->name = pir_name;
- vtable->stmts_start = pir_newline;
- vtable->param_start = pir_param;
- vtable->param_end = pir_newline;
- vtable->type = pir_type;
- vtable->sub_flag = pir_subflag;
- vtable->sub_flag_arg = pir_subflagarg;
- vtable->op_start = pir_op;
- vtable->op_end = pir_newline;
- vtable->expression = pir_expr;
- vtable->next_expr = pir_comma;
-
+ vtable->sub_start = pir_sub;
+ vtable->sub_end = pir_end;
+ vtable->name = pir_name;
+ vtable->stmts_start = pir_newline;
+ vtable->param_start = pir_param;
+ vtable->param_end = pir_newline;
+ vtable->type = pir_type;
+ vtable->sub_flag = pir_sub_flag;
+ vtable->op_start = pir_op;
+ vtable->op_end = pir_newline;
+ vtable->expression = pir_expr;
+ vtable->next_expr = pir_comma;
+ vtable->list_start = pir_list_start;
+ vtable->list_end = pir_list_end;
+ vtable->sub_flag_start = pir_sub_flag_start;
+ vtable->sub_flag_end = pir_sub_flag_end;
+
+
return vtable;
}
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Tue Apr 3 11:26:53 2007
@@ -1703,11 +1703,14 @@
multi_type_list(parser_state *p) {
int wantmore = 1;
+ emit_list_start(p);
+
match(p, T_LPAREN);
while (wantmore) {
switch (p->curtoken) {
case T_IDENTIFIER:
case T_STRING_CONSTANT:
+ emit_expr(p, get_current_token(p->lexer));
next(p);
break;
case T_LBRACKET:
@@ -1717,6 +1720,7 @@
case T_NUM:
case T_PMC:
case T_STRING:
+ emit_type(p, get_current_token(p->lexer));
next(p);
break;
case T_RPAREN: /* ')', so stop parsing this list */
@@ -1728,10 +1732,14 @@
break;
}
- if (p->curtoken == T_COMMA) next(p);
+ if (p->curtoken == T_COMMA) {
+ emit_next_expr(p);
+ next(p);
+ }
else wantmore = 0; /* no comma, so quit loop */
}
match(p, T_RPAREN);
+ emit_list_end(p);
}
/*
@@ -1760,6 +1768,8 @@
int ok = 1;
int wantmore = 0; /* flag that is set when a ',' is parsed */
+ emit_sub_flag_start(p);
+
while (ok || wantmore) {
switch (p->curtoken) {
case T_ANON_FLAG:
@@ -1775,15 +1785,18 @@
break;
case T_OUTER_FLAG:
case T_VTABLE_FLAG: {
- token flag = p->curtoken; /* store the flag for the emit() to
come */
+ emit_sub_flag(p, p->curtoken);
next(p);
- match(p, T_LPAREN);
- emit_sub_flag_arg(p, flag, get_current_token(p->lexer));
+ emit_list_start(p);
+ match(p, T_LPAREN);
+ emit_expr(p, get_current_token(p->lexer));
match(p, T_STRING_CONSTANT);
+ emit_list_end(p);
match(p, T_RPAREN);
break;
}
case T_MULTI_FLAG:
+ emit_sub_flag(p, p->curtoken);
next(p);
multi_type_list(p);
break;
@@ -1807,6 +1820,8 @@
wantmore = 1; /* after the optional comma we expect another sub
flag */
}
}
+
+ emit_sub_flag_end(p);
}
@@ -1894,9 +1909,9 @@
}
sub_flags(p);
- match(p, T_NEWLINE);
- emit_stmts_start(p); /* open stmts block */
+ match(p, T_NEWLINE);
parameters(p);
+ emit_stmts_start(p); /* open stmts block */
instructions(p);
emit_stmts_end(p); /* close stmts block */
match(p, T_END);
Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c (original)
+++ trunk/compilers/pirc/src/pirvtable.c Tue Apr 3 11:26:53 2007
@@ -70,26 +70,26 @@
/* set all entries to 'default' by default. This way, another output module
* only needs to override the entries that are interesting for that module.
*/
- vtable->initialize = not_implemented;
- vtable->name = not_implemented;
- vtable->sub_start = not_implemented;
- vtable->sub_end = not_implemented;
- vtable->stmts_start = not_implemented;
- vtable->stmts_end = not_implemented;
- vtable->end = not_implemented;
- vtable->param_start = not_implemented;
- vtable->param_end = not_implemented;
- vtable->type = not_implemented;
- vtable->sub_flag = not_implemented;
- vtable->sub_flag_arg = not_implemented;
- vtable->expression = not_implemented;
- vtable->next_expr = not_implemented;
- vtable->op_start = not_implemented;
- vtable->op_end = not_implemented;
- vtable->list_start = not_implemented;
- vtable->list_end = not_implemented;
-
-
+ vtable->initialize = not_implemented;
+ vtable->name = not_implemented;
+ vtable->sub_start = not_implemented;
+ vtable->sub_end = not_implemented;
+ vtable->stmts_start = not_implemented;
+ vtable->stmts_end = not_implemented;
+ vtable->end = not_implemented;
+ vtable->param_start = not_implemented;
+ vtable->param_end = not_implemented;
+ vtable->type = not_implemented;
+ vtable->sub_flag = not_implemented;
+ vtable->expression = not_implemented;
+ vtable->next_expr = not_implemented;
+ vtable->op_start = not_implemented;
+ vtable->op_end = not_implemented;
+ vtable->list_start = not_implemented;
+ vtable->list_end = not_implemented;
+ vtable->sub_flag_start = not_implemented;
+ vtable->sub_flag_end = not_implemented;
+
return vtable;
}
Modified: trunk/compilers/pirc/src/pirvtable.h
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.h (original)
+++ trunk/compilers/pirc/src/pirvtable.h Tue Apr 3 11:26:53 2007
@@ -7,47 +7,49 @@
* routines.
*/
typedef struct pirvtable {
- void (* initialize) (struct parser_state *p);
- void (* sub_start) (struct parser_state *p, char *source, int pos);
- void (* sub_end) (struct parser_state *p);
- void (* name) (struct parser_state *p, char *name);
- void (* stmts_start) (struct parser_state *p);
- void (* stmts_end) (struct parser_state *p);
- void (* end) (struct parser_state *p);
- void (* param_start) (struct parser_state *p);
- void (* param_end) (struct parser_state *p);
- void (* type) (struct parser_state *p, char *type);
- void (* sub_flag) (struct parser_state *p, int flag);
- void (* sub_flag_arg)(struct parser_state *p, int flag, char *arg);
- void (* op_start) (struct parser_state *p, char *op);
- void (* op_end) (struct parser_state *p);
- void (* expression) (struct parser_state *p, char *expr);
- void (* next_expr) (struct parser_state *p);
- void (* list_start) (struct parser_state *p);
- void (* list_end) (struct parser_state *p);
+ void (* initialize) (struct parser_state *p);
+ void (* sub_start) (struct parser_state *p, char *source, int pos);
+ void (* sub_end) (struct parser_state *p);
+ void (* name) (struct parser_state *p, char *name);
+ void (* stmts_start) (struct parser_state *p);
+ void (* stmts_end) (struct parser_state *p);
+ void (* end) (struct parser_state *p);
+ void (* param_start) (struct parser_state *p);
+ void (* param_end) (struct parser_state *p);
+ void (* type) (struct parser_state *p, char *type);
+ void (* sub_flag) (struct parser_state *p, int flag);
+ void (* op_start) (struct parser_state *p, char *op);
+ void (* op_end) (struct parser_state *p);
+ void (* expression) (struct parser_state *p, char *expr);
+ void (* next_expr) (struct parser_state *p);
+ void (* list_start) (struct parser_state *p);
+ void (* list_end) (struct parser_state *p);
+ void (* sub_flag_start) (struct parser_state *p);
+ void (* sub_flag_end) (struct parser_state *p);
} pirvtable;
/* #defines for cleaner invocation syntax */
-# define emit_init(P) (*P->vtable->initialize) (P)
-# define emit_sub_start(P,S,L) (*P->vtable->sub_start) (P,S,L)
-# define emit_sub_end(P) (*P->vtable->sub_end) (P)
-# define emit_name(P,N) (*P->vtable->name) (P,N)
-# define emit_stmts_start(P) (*P->vtable->stmts_start) (P)
-# define emit_stmts_end(P) (*P->vtable->stmts_end) (P)
-# define emit_end(P) (*P->vtable->end) (P)
-# define emit_param_start(P) (*P->vtable->param_start) (P)
-# define emit_param_end(P) (*P->vtable->param_end) (P)
-# define emit_type(P,T) (*P->vtable->type) (P,T)
-# define emit_sub_flag(P,F) (*P->vtable->sub_flag) (P,F)
-# define emit_sub_flag_arg(P,F,A) (*P->vtable->sub_flag_arg)(P,F,A)
-# define emit_op_start(P,O) (*P->vtable->op_start) (P,O)
-# define emit_op_end(P) (*P->vtable->op_end) (P)
-# define emit_expr(P,E) (*P->vtable->expression) (P,E)
-# define emit_next_expr(P) (*P->vtable->next_expr) (P)
-# define emit_list_start(P) (*P->vtable->list_start) (P)
-# define emit_list_end(P) (*P->vtable->list_end) (P)
+# define emit_init(P) (*P->vtable->initialize) (P)
+# define emit_sub_start(P,S,L) (*P->vtable->sub_start) (P,S,L)
+# define emit_sub_end(P) (*P->vtable->sub_end) (P)
+# define emit_name(P,N) (*P->vtable->name) (P,N)
+# define emit_stmts_start(P) (*P->vtable->stmts_start) (P)
+# define emit_stmts_end(P) (*P->vtable->stmts_end) (P)
+# define emit_end(P) (*P->vtable->end) (P)
+# define emit_param_start(P) (*P->vtable->param_start) (P)
+# define emit_param_end(P) (*P->vtable->param_end) (P)
+# define emit_type(P,T) (*P->vtable->type) (P,T)
+# define emit_sub_flag(P,F) (*p->vtable->sub_flag) (P,F)
+# define emit_sub_flag_start(P) (*P->vtable->sub_flag_start)(P)
+# define emit_sub_flag_end(P) (*P->vtable->sub_flag_end) (P)
+# define emit_op_start(P,O) (*P->vtable->op_start) (P,O)
+# define emit_op_end(P) (*P->vtable->op_end) (P)
+# define emit_expr(P,E) (*P->vtable->expression) (P,E)
+# define emit_next_expr(P) (*P->vtable->next_expr) (P)
+# define emit_list_start(P) (*P->vtable->list_start) (P)
+# define emit_list_end(P) (*P->vtable->list_end) (P)
extern pirvtable *new_pirvtable(void);