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);
 

Reply via email to