Author: kjs
Date: Sat Mar 31 05:54:30 2007
New Revision: 17891

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 /output/ (vtable) support for parrot ops and arguments

Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c  (original)
+++ trunk/compilers/pirc/src/pastout.c  Sat Mar 31 05:54:30 2007
@@ -137,6 +137,25 @@
     */
 }
 
+static void
+past_op(struct parser_state *p, char *op) {
+    fprintf(OUT, "%*sFIXME => PMC 'PAST::Op'  {\n", indent, " ");
+    indent();
+    fprintf(OUT, "%*s<pirop> => \"%s\"\n", indent, " ", op);
+
+}
+
+static void
+past_expr(struct parser_state *p, char *expr) {
+    fprintf(OUT, "%*s[%d] => \"%s\"\n", indent, " ", 0, expr); /* fix index */
+}
+
+static void
+past_next(struct parser_state *p) {
+    /* increment index */
+}
+
+
 /*
 
 =item init_past_vtable()
@@ -161,9 +180,13 @@
     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;
+    vtable->op_start     = past_op;
+    vtable->expression   = past_expr;
+    vtable->op_end       = past_close;
+    vtable->next_expr    = past_next;
 
     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:54:30 2007
@@ -98,6 +98,22 @@
 pir_subflagarg(struct parser_state *p, int flag, char *arg) {
     fprintf(OUT, "%s(%s) ", find_keyword(flag), arg);
 }
+
+static void
+pir_expr(struct parser_state *p, char *expr) {
+    fprintf(OUT, "%s ", expr);
+}
+
+static void
+pir_op(struct parser_state *p, char *op) {
+    fprintf(OUT, "%s ", op);
+}
+
+static void
+pir_comma(struct parser_state *p) {
+    fprintf(OUT, ", ");
+}
+
 /*
 
 =item init_pir_vtable()
@@ -122,7 +138,11 @@
     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;
+
     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:54:30 2007
@@ -325,6 +325,10 @@
         case T_PASM_SREG: case T_SREG:
         case T_MACRO_IDENT:
             exprtok = p->curtoken;
+
+            /* emit the expression */
+            emit_expr(p, get_current_token(p->lexer));
+
             next(p);
             break;
         default:
@@ -658,6 +662,9 @@
 */
 static void
 parrot_instruction(parser_state *p) {
+    /* emit the op */
+    emit_op_start(p, get_current_token(p->lexer));
+
     match(p, T_PARROT_OP);
     /* XXX for now, parse as many arguments as necessary,
      * don't know how to handle this. Just try and create the call to the
@@ -665,9 +672,14 @@
      */
     while (p->curtoken != T_NEWLINE) {
         expression(p);
-        if (p->curtoken == T_COMMA) next(p);
+        if (p->curtoken == T_COMMA) {
+            emit_next_expr(p);
+            next(p);
+        }
         else break;
     }
+
+    emit_op_end(p);
     match(p, T_NEWLINE);
 }
 

Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c        (original)
+++ trunk/compilers/pirc/src/pirvtable.c        Sat Mar 31 05:54:30 2007
@@ -82,6 +82,10 @@
     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;
 
     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:54:30 2007
@@ -20,6 +20,10 @@
        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);
 
 
 } pirvtable;
@@ -39,7 +43,10 @@
 #  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)
 
 extern pirvtable *new_pirvtable(void);
 
@@ -54,3 +61,4 @@
  * End:
  * vim: expandtab shiftwidth=4:
  */
+

Reply via email to