Author: kjs
Date: Sat Mar 31 05:32:22 2007
New Revision: 17884
Modified:
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:
* add support for output sub flags
Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c (original)
+++ trunk/compilers/pirc/src/pastout.c Sat Mar 31 05:32:22 2007
@@ -125,6 +125,17 @@
fprintf(OUT, "%*s<type> => \"%s\"\n", indent, " ", type);
}
+static void
+past_subflag(struct parser_state *p, int flag) {
+ /* fprintf(OUT, "%*s<???> => \"%s\"\n", indent, " ", type);
+ */
+}
+
+static void
+past_subflagarg(struct parser_state *p, int flag, char *arg) {
+ /*fprintf(OUT, "%*s<type> => \"%s\"\n", indent, " ", type);
+ */
+}
/*
@@ -150,7 +161,9 @@
vtable->end = past_close;
vtable->param_start = past_param;
vtable->param_end = past_close;
- vtable->type = past_type;
+ vtable->type = past_type;
+ vtable->sub_flag = past_subflag;
+ vtable->sub_flag_arg = past_subflagarg;
return vtable;
}
Modified: trunk/compilers/pirc/src/pirout.c
==============================================================================
--- trunk/compilers/pirc/src/pirout.c (original)
+++ trunk/compilers/pirc/src/pirout.c Sat Mar 31 05:32:22 2007
@@ -89,6 +89,15 @@
fprintf(OUT, "%s", type);
}
+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);
+}
/*
=item init_pir_vtable()
@@ -104,14 +113,16 @@
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_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;
+
return vtable;
}
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Sat Mar 31 05:32:22 2007
@@ -1681,38 +1681,30 @@
while (ok || wantmore) {
switch(p->curtoken) {
case T_ANON_FLAG:
- next(p);
- break;
case T_INIT_FLAG:
- next(p);
- break;
case T_LOAD_FLAG:
- next(p);
- break;
case T_MAIN_FLAG:
- next(p);
- break;
case T_METHOD_FLAG:
- next(p);
- break;
case T_LEX_FLAG:
+ case T_POSTCOMP_FLAG: /* :postcomp and :immediate are the same
*/
+ case T_IMMEDIATE_FLAG:
+ emit_sub_flag(p, p->curtoken);
next(p);
break;
case T_OUTER_FLAG:
- case T_VTABLE_FLAG:
+ case T_VTABLE_FLAG: {
+ token flag = p->curtoken; /* store the flag for the emit() to
come */
next(p);
match(p, T_LPAREN);
+ emit_sub_flag_arg(p, flag, get_current_token(p->lexer));
stringconstant(p);
match(p, T_RPAREN);
break;
+ }
case T_MULTI_FLAG:
next(p);
multi_type_list(p);
break;
- case T_POSTCOMP_FLAG: /* :postcomp and :immediate are the same
*/
- case T_IMMEDIATE_FLAG:
- next(p);
- break;
case T_NEWLINE:
ok = 0; /* stop loop; wantmore is always cleared, so loop will
stop */
if (wantmore) syntax_error(p, 1, "sub flag expected after
','");
Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c (original)
+++ trunk/compilers/pirc/src/pirvtable.c Sat Mar 31 05:32:22 2007
@@ -70,16 +70,18 @@
/* 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->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;
return vtable;
}
Modified: trunk/compilers/pirc/src/pirvtable.h
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.h (original)
+++ trunk/compilers/pirc/src/pirvtable.h Sat Mar 31 05:32:22 2007
@@ -18,6 +18,8 @@
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);
} pirvtable;
@@ -25,16 +27,19 @@
/* #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_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)
+
extern pirvtable *new_pirvtable(void);