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