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