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:
*/
+