Author: kjs
Date: Tue Apr 10 02:40:49 2007
New Revision: 18111
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:
* remove source and pos info from sub_start vtable method
* add separate source and position vtable methods; they will be used in more
locations than only sub-starts.
Modified: trunk/compilers/pirc/src/jsonout.c
==============================================================================
--- trunk/compilers/pirc/src/jsonout.c (original)
+++ trunk/compilers/pirc/src/jsonout.c Tue Apr 10 02:40:49 2007
@@ -132,15 +132,22 @@
}
static void
-json_sub_start(emit_data *data, char *source, int pos) {
+json_sub_start(emit_data *data) {
if (data->need_comma) print_comma(data);
fprintf(OUT, "%*s{ \"sub\" :\n", data->indent, " ");
indent(data);
fprintf(OUT, "%*s{\n", data->indent, " ");
indent(data);
+}
+static void
+json_source(emit_data *data, char *source) {
fprintf(OUT, "%*s{ \"source\" : \"%s\" },\n", data->indent, " ", source);
+}
+
+static void
+json_position(emit_data *data, int pos) {
fprintf(OUT, "%*s{ \"pos\" : %d },\n", data->indent, " ", pos);
}
@@ -335,6 +342,8 @@
/* set vtable methods to the appropiate implementation */
vtable->initialize = json_init;
vtable->destroy = json_destroy;
+ vtable->source = json_source;
+ vtable->position = json_position;
vtable->sub_start = json_sub_start;
vtable->sub_end = json_sub_end;
vtable->end = json_end;
Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c (original)
+++ trunk/compilers/pirc/src/pastout.c Tue Apr 10 02:40:49 2007
@@ -71,10 +71,18 @@
*/
static void
-past_block(struct emit_data *data, char *source, int pos) {
+past_block(struct emit_data *data) {
fprintf(OUT, "%*sPMC 'PAST::Block' {\n", data->indent, " ");
indent(data);
+}
+
+static void
+past_source(emit_data *data, char *source) {
fprintf(OUT, "%*s<source> => \"%s\"\n", data->indent, " ", source);
+}
+
+static void
+past_position(emit_data *data, int pos) {
fprintf(OUT, "%*s<pos> => %d\n", data->indent, " ", pos);
}
@@ -235,6 +243,8 @@
/* override vtable methods */
vtable->initialize = past_init;
vtable->destroy = past_destroy;
+ vtable->source = past_source;
+ vtable->position = past_position;
vtable->sub_start = past_block;
vtable->sub_end = past_close;
vtable->name = past_name;
Modified: trunk/compilers/pirc/src/pirout.c
==============================================================================
--- trunk/compilers/pirc/src/pirout.c (original)
+++ trunk/compilers/pirc/src/pirout.c Tue Apr 10 02:40:49 2007
@@ -41,8 +41,7 @@
}
static void
-pir_sub(struct emit_data *data, char *source, int pos) {
- fprintf(OUT, "#character position %d\n", pos);
+pir_sub(struct emit_data *data) {
fprintf(OUT, ".sub");
}
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Tue Apr 10 02:40:49 2007
@@ -2062,7 +2062,7 @@
static void
sub_definition(parser_state *p) {
/* call emit method */
- emit_sub_start(p, "", get_current_filepos(p->lexer));
+ emit_sub_start(p);
next(p); /* skip '.sub' or '.pcc_sub' */
switch (p->curtoken) { /* subname -> IDENTIFIER | STRINGC */
Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c (original)
+++ trunk/compilers/pirc/src/pirvtable.c Tue Apr 10 02:40:49 2007
@@ -71,6 +71,8 @@
*/
vtable->initialize = not_implemented;
vtable->destroy = not_implemented; /* destructor; highly
recommended to implement! */
+ vtable->source = not_implemented;
+ vtable->position = not_implemented;
vtable->name = not_implemented;
vtable->sub_start = not_implemented;
vtable->sub_end = not_implemented;
Modified: trunk/compilers/pirc/src/pirvtable.h
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.h (original)
+++ trunk/compilers/pirc/src/pirvtable.h Tue Apr 10 02:40:49 2007
@@ -10,26 +10,42 @@
* 'emit_data' structure is left to each back-end separately.
*/
typedef struct pirvtable {
- struct emit_data *data;
+ struct emit_data *data; /* keep data here; where to store else? */
+
+ /* initializer and destructor */
void (* initialize) (struct emit_data *data);
void (* destroy) (struct emit_data *data);
- void (* sub_start) (struct emit_data *data, char *source, int pos);
+
+ /* location and debug info */
+ void (* source) (struct emit_data *data, char *source);
+ void (* position) (struct emit_data *data, int pos);
+
+ /* sub handling */
+ void (* sub_start) (struct emit_data *data);
void (* sub_end) (struct emit_data *data);
- void (* name) (struct emit_data *data, char *name);
- void (* stmts_start) (struct emit_data *data);
- void (* stmts_end) (struct emit_data *data);
- void (* end) (struct emit_data *data);
+ void (* sub_flag) (struct emit_data *data, int flag);
+ void (* sub_flag_start) (struct emit_data *data);
+ void (* sub_flag_end) (struct emit_data *data);
+ /* parameter handling */
void (* param_start) (struct emit_data *data);
void (* param_end) (struct emit_data *data);
void (* type) (struct emit_data *data, char *type);
- void (* sub_flag) (struct emit_data *data, int flag);
+ void (* name) (struct emit_data *data, char *name);
+
+ /* statement handling */
+ void (* stmts_start) (struct emit_data *data);
+ void (* stmts_end) (struct emit_data *data);
+
+ /* ops handling */
void (* op_start) (struct emit_data *data, char *op);
void (* op_end) (struct emit_data *data);
void (* expression) (struct emit_data *data, char *expr);
+
+ /* general list handling */
void (* list_start) (struct emit_data *data);
void (* list_end) (struct emit_data *data);
- void (* sub_flag_start) (struct emit_data *data);
- void (* sub_flag_end) (struct emit_data *data);
+
+ /* invocation of subs and methods */
void (* method_name) (struct emit_data *data, char *name);
void (* invocant) (struct emit_data *data, char *invocant);
void (* args_start) (struct emit_data *data);
@@ -39,29 +55,40 @@
void (* invocation_start)(struct emit_data *data);
void (* invocation_end) (struct emit_data *data);
+ /* finalizer (not destructor, that only should be called to free resources
*/
+ void (* end) (struct emit_data *data);
+
} pirvtable;
/* #defines for cleaner invocation syntax */
# define emit_init(P) (*P->vtable->initialize)
(P->vtable->data)
# define emit_destroy(P) (*P->vtable->destroy)
(P->vtable->data)
-# define emit_sub_start(P,S,L) (*P->vtable->sub_start)
(P->vtable->data, S,L)
+
+# define emit_source(P,S) (*P->vtable->source)
(P->vtable->data, S)
+# define emit_position(P,L) (*P->vtable->position)
(P->vtable->data, L)
+
+# define emit_sub_start(P) (*P->vtable->sub_start)
(P->vtable->data)
# define emit_sub_end(P) (*P->vtable->sub_end)
(P->vtable->data)
+# define emit_sub_flag(P,F) (*p->vtable->sub_flag)
(P->vtable->data, F)
+# define emit_sub_flag_start(P) (*P->vtable->sub_flag_start)
(P->vtable->data)
+# define emit_sub_flag_end(P) (*P->vtable->sub_flag_end)
(P->vtable->data)
+# define emit_param_start(P) (*P->vtable->param_start)
(P->vtable->data)
+# define emit_param_end(P) (*P->vtable->param_end)
(P->vtable->data)
+# define emit_type(P,T) (*P->vtable->type)
(P->vtable->data, T)
# define emit_name(P,N) (*P->vtable->name)
(P->vtable->data, N)
+
# define emit_stmts_start(P) (*P->vtable->stmts_start)
(P->vtable->data)
# define emit_stmts_end(P) (*P->vtable->stmts_end)
(P->vtable->data)
# define emit_end(P) (*P->vtable->end)
(P->vtable->data)
-# define emit_param_start(P) (*P->vtable->param_start)
(P->vtable->data)
-# define emit_param_end(P) (*P->vtable->param_end)
(P->vtable->data)
-# define emit_type(P,T) (*P->vtable->type)
(P->vtable->data, T)
-# define emit_sub_flag(P,F) (*p->vtable->sub_flag)
(P->vtable->data, F)
-# define emit_sub_flag_start(P) (*P->vtable->sub_flag_start)
(P->vtable->data)
-# define emit_sub_flag_end(P) (*P->vtable->sub_flag_end)
(P->vtable->data)
+
# define emit_op_start(P,O) (*P->vtable->op_start)
(P->vtable->data, O)
# define emit_op_end(P) (*P->vtable->op_end)
(P->vtable->data)
# define emit_expr(P,E) (*P->vtable->expression)
(P->vtable->data, E)
+
# define emit_list_start(P) (*P->vtable->list_start)
(P->vtable->data)
# define emit_list_end(P) (*P->vtable->list_end)
(P->vtable->data)
+
# define emit_method_name(P,N) (*P->vtable->method_name)
(P->vtable->data, N)
# define emit_invocant(P,N) (*P->vtable->invocant)
(P->vtable->data, N)
# define emit_args_start(P) (*P->vtable->args_start)
(P->vtable->data)