Author: kjs
Date: Sat Mar 31 04:57:08 2007
New Revision: 17882

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:
* vtable and output support for types.

Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c  (original)
+++ trunk/compilers/pirc/src/pastout.c  Sat Mar 31 04:57:08 2007
@@ -120,6 +120,11 @@
     fprintf(OUT, "%*s<scope> => \"parameter\"\n", indent, " ");
 }
 
+static void
+past_type(struct parser_state *p, char *type) {
+    fprintf(OUT, "%*s<type> => \"%s\"\n", indent, " ", type);
+}
+
 
 /*
 
@@ -145,6 +150,8 @@
     vtable->end          = past_close;
     vtable->param_start  = past_param;
     vtable->param_end    = past_close;
+    vtable->type         = past_type;
+
     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 04:57:08 2007
@@ -84,6 +84,11 @@
     fprintf(OUT, "\t.param ");
 }
 
+static void
+pir_type(struct parser_state *p, char *type) {
+    fprintf(OUT, "%s", type);
+}
+
 /*
 
 =item init_pir_vtable()
@@ -105,6 +110,7 @@
     vtable->stmts_start = pir_newline;
     vtable->param_start = pir_param;
     vtable->param_end   = pir_newline;
+    vtable->type        = pir_type;
 
     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 04:57:08 2007
@@ -1757,20 +1757,34 @@
             case T_NUM:
             case T_PMC:
             case T_STRING:
-                type(p);
+                emit_type(p, get_current_token(p->lexer));
+                /* type(p); -- we know what it is; just skip it! */
+                next(p);
+
+                /* Maybe combine these 2 statements into an 'identifier'() 
function? */
                 emit_name(p, get_current_token(p->lexer));
                 match(p, T_IDENTIFIER);
                 param_flags(p);
                 break;
             case T_PREG:
-            case T_NREG:
-            case T_SREG:
-            case T_IREG:
             case T_PASM_PREG:
+                next(p);
+                emit_type(p, "pmc");
+                break;
+            case T_NREG:
             case T_PASM_NREG:
+                next(p);
+                emit_type(p, "num");
+                break;
+            case T_SREG:
             case T_PASM_SREG:
+                next(p);
+                emit_type(p, "string");
+                break;
+            case T_IREG:
             case T_PASM_IREG:
                 next(p);
+                emit_type(p, "int");
                 break;
             default:
                 syntax_error(p, 1, "type or register expected");

Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c        (original)
+++ trunk/compilers/pirc/src/pirvtable.c        Sat Mar 31 04:57:08 2007
@@ -79,6 +79,7 @@
     vtable->end         = not_implemented;
     vtable->param_start = not_implemented;
     vtable->param_end   = not_implemented;
+    vtable->type        = 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 04:57:08 2007
@@ -17,6 +17,8 @@
        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);
+
 
 } pirvtable;
 
@@ -32,6 +34,7 @@
 #  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)
 
 extern pirvtable *new_pirvtable(void);
 

Reply via email to