Author: kjs
Date: Sat Mar 31 04:48:31 2007
New Revision: 17881

Modified:
   trunk/compilers/pirc/src/pastout.c
   trunk/compilers/pirc/src/pirlexer.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:
compiler/pirc:
* add vtable+PIR and PAST output support parameters (but not complete)
* fixed some comments here and there.


Modified: trunk/compilers/pirc/src/pastout.c
==============================================================================
--- trunk/compilers/pirc/src/pastout.c  (original)
+++ trunk/compilers/pirc/src/pastout.c  Sat Mar 31 04:48:31 2007
@@ -108,10 +108,19 @@
 */
 static void
 past_stmts(struct parser_state *p) {
-    fprintf(OUT, "%*s[%d] => PMC 'PAST::Stmts'\n", indent, " ", 0); /* fix 
array index */
+    fprintf(OUT, "%*s[%d] => PMC 'PAST::Stmts'  {\n", indent, " ", 0); /* fix 
array index */
     indent();
 }
 
+
+static void
+past_param(struct parser_state *p) {
+    fprintf(OUT, "%*sFIXTHIS => PMC 'PAST::Var'  {\n", indent, " ");
+    indent();
+    fprintf(OUT, "%*s<scope> => \"parameter\"\n", indent, " ");
+}
+
+
 /*
 
 =item init_past_vtable()
@@ -126,7 +135,7 @@
 init_past_vtable(void) {
     pirvtable *vtable = new_pirvtable();
 
-    /* set function pointers */
+    /* override vtable methods */
     vtable->initialize   = past_init;
     vtable->sub_start    = past_block;
     vtable->sub_end      = past_close;
@@ -134,7 +143,8 @@
     vtable->stmts_start  = past_stmts;
     vtable->stmts_end    = past_close;
     vtable->end          = past_close;
-
+    vtable->param_start  = past_param;
+    vtable->param_end    = past_close;
     return vtable;
 }
 

Modified: trunk/compilers/pirc/src/pirlexer.c
==============================================================================
--- trunk/compilers/pirc/src/pirlexer.c (original)
+++ trunk/compilers/pirc/src/pirlexer.c Sat Mar 31 04:48:31 2007
@@ -424,7 +424,7 @@
         ++start;
     }
     /* print an indicator like "^" on the next line */
-    fprintf(stderr, "\n%*s\n", s->curfile->linepos - 1, "^");
+    fprintf(stderr, "\n%*s\n", s->curfile->linepos, "^");
 }
 
 
@@ -774,7 +774,7 @@
 =item read_heredoc()
 
 Reads heredoc text up to the specified heredoc label.
-Returns either T_HEREDOC_STRING if successful, or T_EOF.
+Returns either T_HEREDOC_STRING if successful, or T_EOF (if encountered).
 The heredoc string is stored in the token buffer.
 
 =cut
@@ -859,7 +859,7 @@
         exit(1);
     }
 
-    /* max. token length is 128 for now */
+    /* max. token length is 128 for now. XXX this should be fixed later */
     lexer->token_chars = (char *)calloc(128, sizeof(char));
     lexer->charptr = lexer->token_chars;
     lexer->curfile = NULL;
@@ -900,7 +900,8 @@
 =item clone_string()
 
 clone a string. Copy the characters of src into dest
-and return dest.
+and return dest. Memory allocation is done by this function, keeping
+this function's client code simple. Please free() the memory after usage!
 
 =cut
 

Modified: trunk/compilers/pirc/src/pirout.c
==============================================================================
--- trunk/compilers/pirc/src/pirout.c   (original)
+++ trunk/compilers/pirc/src/pirout.c   Sat Mar 31 04:48:31 2007
@@ -75,10 +75,15 @@
 }
 
 static void
-pir_newline(struct parser_state *p, ...) {
+pir_newline(struct parser_state *p) {
     fprintf(OUT, "\n");
 }
 
+static void
+pir_param(struct parser_state *p) {
+    fprintf(OUT, "\t.param ");
+}
+
 /*
 
 =item init_pir_vtable()
@@ -98,6 +103,8 @@
     vtable->sub_end     = pir_end;
     vtable->name        = pir_name;
     vtable->stmts_start = pir_newline;
+    vtable->param_start = pir_param;
+    vtable->param_end   = pir_newline;
 
     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:48:31 2007
@@ -1751,12 +1751,14 @@
 parameters(parser_state *p) {
     while (p->curtoken == T_PARAM) {
         next(p); /* skip '.param */
+        emit_param_start(p);
         switch (p->curtoken) {
             case T_INT:
             case T_NUM:
             case T_PMC:
             case T_STRING:
                 type(p);
+                emit_name(p, get_current_token(p->lexer));
                 match(p, T_IDENTIFIER);
                 param_flags(p);
                 break;
@@ -1775,6 +1777,7 @@
                 break;
         }
         match(p, T_NEWLINE);
+        emit_param_end(p);
     }
 }
 
@@ -1793,11 +1796,11 @@
     emit_sub_start(p, "", get_current_filepos(p->lexer));
     next(p); /* skip '.sub' or '.pcc_sub' */
 
-    switch (p->curtoken) {
+    switch (p->curtoken) { /* subname -> IDENTIFIER | SINGLE_QUOTED_STRING | 
DOUBLE_QUOTED_STRING */
         case T_IDENTIFIER:
         case T_DOUBLE_QUOTED_STRING:
         case T_SINGLE_QUOTED_STRING:
-            emit_name(p, get_current_token(p->lexer)); /* emit the name */
+            emit_name(p, get_current_token(p->lexer)); /* emit the subname */
             next(p); /* and get next token */
             break;
         default:
@@ -1807,9 +1810,8 @@
 
     sub_flags(p);
     match(p, T_NEWLINE);
-
-    parameters(p);
     emit_stmts_start(p); /* open stmts block */
+    parameters(p);
     instructions(p);
     emit_stmts_end(p);  /* close stmts block */
     match(p, T_END);

Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c        (original)
+++ trunk/compilers/pirc/src/pirvtable.c        Sat Mar 31 04:48:31 2007
@@ -18,6 +18,7 @@
 #include "pirparser.h"
 #include <stdlib.h>
 #include <stdio.h>
+#include <malloc.h>
 
 
 
@@ -66,7 +67,9 @@
         exit(1);
     }
 
-    /* set all entries to 'default' by default */
+    /* 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;
@@ -74,6 +77,8 @@
     vtable->stmts_start = not_implemented;
     vtable->stmts_end   = not_implemented;
     vtable->end         = not_implemented;
+    vtable->param_start = not_implemented;
+    vtable->param_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 04:48:31 2007
@@ -15,6 +15,8 @@
        void (* stmts_start) (struct parser_state *p);
        void (* stmts_end)   (struct parser_state *p);
        void (* end)         (struct parser_state *p);
+       void (* param_start) (struct parser_state *p);
+       void (* param_end)   (struct parser_state *p);
 
 } pirvtable;
 
@@ -28,6 +30,8 @@
 #  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)
 
 extern pirvtable *new_pirvtable(void);
 

Reply via email to