Author: kjs
Date: Wed Apr 4 12:03:45 2007
New Revision: 17977
Modified:
trunk/compilers/pirc/src/jsonout.c (contents, props changed)
trunk/compilers/pirc/src/jsonout.h (props changed)
trunk/compilers/pirc/src/pastout.c (props changed)
trunk/compilers/pirc/src/pbcout.c
trunk/compilers/pirc/src/pirlexer.c (props changed)
trunk/compilers/pirc/src/pirlexer.h (props changed)
trunk/compilers/pirc/src/pirout.c (contents, props changed)
trunk/compilers/pirc/src/pirout.h (props changed)
trunk/compilers/pirc/src/pirparser.c (contents, props changed)
trunk/compilers/pirc/src/pirparser.h (props changed)
trunk/compilers/pirc/src/pirvtable.c
trunk/compilers/pirc/src/pirvtable.h
Log:
compilers/pirc:
* added more pirc vtable methods
* fixed minor things in grammar; now allow for "foo"() (+ updated docs for that)
* gradually completing emit calls.
Modified: trunk/compilers/pirc/src/jsonout.c
==============================================================================
--- trunk/compilers/pirc/src/jsonout.c (original)
+++ trunk/compilers/pirc/src/jsonout.c Wed Apr 4 12:03:45 2007
@@ -21,6 +21,12 @@
#define dedent(D) D->indent -= INDENT
+typedef struct target {
+ char *name;
+ struct target *next;
+
+} target;
+
/* Private declaration of emit_data.
*
*
@@ -28,9 +34,25 @@
typedef struct emit_data {
FILE *outfile;
int indent;
+ int need_comma;
+ struct target *targets;
} emit_data;
+/* helper methods */
+target *
+new_target(char *name) {
+ target *t = (target *)malloc(sizeof(target));
+ t->name = name;
+ t->next = NULL;
+ return t;
+}
+
+static void
+add_target(emit_data *data, target *t) {
+ t->next = data->targets;
+ data->targets = t;
+}
/* Implementation of methods */
@@ -51,13 +73,13 @@
json_sub_start(emit_data *data, char *source, int pos) {
fprintf(OUT, "%*s\"sub\" : {\n", data->indent, " ");
indent(data);
- fprintf(OUT, "%*s\"source\" : \"%s\",\n", data->indent, " ", source);
- fprintf(OUT, "%*s\"pos\" : %d,\n", data->indent, " ", pos);
+ fprintf(OUT, "%*s{ \"source\" : \"%s\" },\n", data->indent, " ", source);
+ fprintf(OUT, "%*s{ \"pos\" : %d },\n", data->indent, " ", pos);
}
static void
json_name(emit_data *data, char *name) {
- fprintf(OUT, "%*s\"name\" : \"%s\"\n", data->indent, " ", name);
+ fprintf(OUT, "%*s{ \"name\" : \"%s\" }\n", data->indent, " ", name);
}
static void
@@ -74,18 +96,22 @@
static void
json_sub_flag_start(emit_data *data) {
- fprintf(OUT, "%*s\"subflags\" : [\n", data->indent, " ");
+ fprintf(OUT, "%*s{ \"subflags\" : [\n", data->indent, " ");
indent(data);
}
static void
json_sub_flag_end(emit_data *data) {
dedent(data);
- fprintf(OUT, "%*s]\n", data->indent, " ");
+ fprintf(OUT, "%*s] }\n", data->indent, " ");
}
static void
json_sub_flag(emit_data *data, int flag) {
+ if (data->need_comma) {
+ fprintf(OUT, ",");
+ data->need_comma = 0;
+ }
fprintf(OUT, "%*s{ \"subflag\" : \"%s\" }\n", data->indent, " ", "TODO");
}
@@ -93,6 +119,7 @@
json_list_start(emit_data *data) {
fprintf(OUT, "%*s[\n", data->indent, " ");
indent(data);
+ data->need_comma = 0;
}
static void
@@ -131,12 +158,57 @@
data = NULL;
}
-/*
+
static void
-json_next(void) {
- fprintf(OUT, ", ");
+json_method(emit_data *data, char *name) {
+ fprintf(OUT, "%*s\"method\" : \"%s\"\n", data->indent, " ", name);
+}
+
+static void
+json_invocant(emit_data *data, char *invocant) {
+ fprintf(OUT, "%*s\"invocant\" : \"%s\"\n", data->indent, " ", invocant);
+}
+
+static void
+json_args_start(emit_data *data) {
+ fprintf(OUT, "%*s{ \"arguments\" : [", data->indent, " ");
+ indent(data);
+}
+
+static void
+json_args_end(emit_data *data) {
+ /* fprintf(OUT, "%*s] }\n", data->indent, " "); */
+ dedent(data);
+ fprintf(OUT, "]\n");
+
+}
+
+
+static void
+json_target(emit_data *data, char *name) {
+ target *t = new_target(name);
+ add_target(data, t);
+}
+
+
+
+static void
+json_invokable(emit_data *data, char *invokable) {
+ fprintf(OUT, "%*s{ \"invokable\" : \"%s\" }\n", data->indent, " ",
invokable);
+ /* indent(data); */
+}
+
+static void
+json_invocation_start(emit_data *data) {
+ fprintf(OUT, "%*s{ \"invocation\" : {\n", data->indent, " ");
+ indent(data);
+}
+
+static void
+json_invocation_end(emit_data *data) {
+ dedent(data);
+ fprintf(OUT, "%*s}\n", data->indent, " ");
}
-*/
pirvtable *
@@ -144,25 +216,32 @@
pirvtable *vtable = new_pirvtable();
/* set vtable methods to the appropiate implementation */
- vtable->initialize = json_init;
- vtable->destroy = json_destroy;
- vtable->sub_start = json_sub_start;
- vtable->sub_end = json_end;
- vtable->end = json_end;
- vtable->stmts_start = json_stmts_start;
- vtable->stmts_end = json_list_end;
- vtable->name = json_name;
- vtable->sub_flag = json_sub_flag;
- vtable->op_start = json_op_start;
- vtable->op_end = json_op_end;
- vtable->param_start = json_param_start;
- vtable->param_end = json_list_end;
- vtable->sub_flag_start = json_sub_flag_start;
- vtable->sub_flag_end = json_sub_flag_end;
- vtable->list_start = json_list_start;
- vtable->list_end = json_list_end;
- vtable->expression = json_expr;
-
+ vtable->initialize = json_init;
+ vtable->destroy = json_destroy;
+ vtable->sub_start = json_sub_start;
+ vtable->sub_end = json_end;
+ vtable->end = json_end;
+ vtable->stmts_start = json_stmts_start;
+ vtable->stmts_end = json_list_end;
+ vtable->name = json_name;
+ vtable->sub_flag = json_sub_flag;
+ vtable->op_start = json_op_start;
+ vtable->op_end = json_op_end;
+ vtable->param_start = json_param_start;
+ vtable->param_end = json_list_end;
+ vtable->sub_flag_start = json_sub_flag_start;
+ vtable->sub_flag_end = json_sub_flag_end;
+ vtable->list_start = json_list_start;
+ vtable->list_end = json_list_end;
+ vtable->expression = json_expr;
+ vtable->invocant = json_invocant;
+ vtable->method_name = json_method;
+ vtable->args_start = json_args_start;
+ vtable->args_end = json_args_end;
+ vtable->target = json_target;
+ vtable->invokable = json_invokable;
+ vtable->invocation_start = json_invocation_start;
+ vtable->invocation_end = json_invocation_end;
vtable->data = (emit_data *)malloc(sizeof(emit_data));
if (vtable->data == NULL) {
Modified: trunk/compilers/pirc/src/pbcout.c
==============================================================================
--- trunk/compilers/pirc/src/pbcout.c (original)
+++ trunk/compilers/pirc/src/pbcout.c Wed Apr 4 12:03:45 2007
@@ -2,7 +2,12 @@
=head1 NAME
-pbcout.c - Back-end for emitting PBC. Not implemented.
+pbcout.c - Back-end for emitting PBC.
+
+
+XXX Not implemented XXX
+
+IIUC, the PBC format is not yet fixed.
=cut
Modified: trunk/compilers/pirc/src/pirout.c
==============================================================================
--- trunk/compilers/pirc/src/pirout.c (original)
+++ trunk/compilers/pirc/src/pirout.c Wed Apr 4 12:03:45 2007
@@ -1,3 +1,12 @@
+/*
+
+=head1 NAME
+
+pirout.c - Back-end for outputting PIR.
+
+=cut
+
+*/
#include "pirout.h"
#include "pirvtable.h"
#include "pirlexer.h"
@@ -104,6 +113,11 @@
data = NULL;
}
+static void
+pir_begin_return(emit_data *data) {
+ fprintf(OUT, " ");
+}
+
/*
=over 4
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Wed Apr 4 12:03:45 2007
@@ -386,8 +386,16 @@
*/
static void
method(parser_state *p) {
- if (p->curtoken == T_IDENTIFIER) next(p);
- else match(p, T_STRING_CONSTANT);
+ switch (p->curtoken) {
+ case T_IDENTIFIER:
+ case T_STRING_CONSTANT:
+ emit_method_name(p, get_current_token(p->lexer));
+ next(p);
+ break;
+ default:
+ syntax_error(p, 1, "method identifier expected");
+ break;
+ }
}
@@ -407,6 +415,7 @@
case T_PASM_PREG: case T_PREG: case T_PASM_IREG: case T_IREG:
case T_PASM_NREG: case T_NREG: case T_PASM_SREG: case T_SREG:
case T_IDENTIFIER:
+ emit_target(p, get_current_token(p->lexer));
next(p);
break;
default:
@@ -428,19 +437,10 @@
type(parser_state *p) {
switch (p->curtoken) {
case T_INT:
- emit_type(p, "int");
- next(p);
- break;
case T_NUM:
- emit_type(p, "num");
- next(p);
- break;
case T_PMC:
- emit_type(p, "pmc");
- next(p);
- break;
case T_STRING:
- emit_type(p, "string");
+ emit_type(p, get_current_token(p->lexer));
next(p);
break;
default:
@@ -560,6 +560,7 @@
*/
static void
arguments(parser_state *p) {
+ emit_args_start(p);
match(p, T_LPAREN);
if (p->curtoken != T_RPAREN) argument_list(p);
match(p, T_RPAREN);
@@ -587,6 +588,7 @@
/* clear heredoc index */
p->heredoc_index = 0;
}
+ emit_args_end(p);
}
@@ -601,9 +603,12 @@
*/
static void
methodcall(parser_state *p) {
+ emit_invocation_start(p);
+ emit_invocant(p, get_current_token(p->lexer));
match(p, T_INVOCANT_IDENT);
method(p);
arguments(p);
+ emit_invocation_end(p);
}
@@ -718,32 +723,47 @@
case T_INVOCANT_IDENT: /* method call */
methodcall(p);
break;
- case T_STRING_CONSTANT: /* "foo"() */
+ case T_STRING_CONSTANT: { /* "foo"() */
+ char *invokable = clone_string(get_current_token(p->lexer));
+ emit_invocation_start(p);
+ emit_invokable(p, invokable);
next(p);
arguments(p);
+ emit_invocation_end(p);
break;
+ }
case T_IDENTIFIER:
case T_PREG:
- case T_PASM_PREG:
+ case T_PASM_PREG: {
+ char *obj = clone_string(get_current_token(p->lexer)); /* save it
for now */
next(p);
switch (p->curtoken) {
case T_LPAREN: /* function call; foo() */
+ emit_invocation_start(p);
+ emit_invokable(p, obj);
arguments(p);
+ emit_invocation_end(p);
break;
case T_PTR: /* method call; foo '->' method arguments */
+ emit_invocation_start(p);
+ emit_invocant(p, obj);
next(p);
method(p);
arguments(p);
+ emit_invocation_end(p);
break;
case T_LBRACKET: /* target '=' target '[' expression ']' */
+ emit_target(p, obj);
keylist(p);
break;
default: /* expression with a PMC target/id as first operand */
+ emit_expr(p, obj);
arith_expression(p);
break;
}
break;
+ }
case T_GLOBAL: /* x = global string_value */
next(p);
string_value(p);
@@ -1096,37 +1116,38 @@
*/
static void
const_definition(parser_state *p) {
- switch (p->curtoken) {
+ token type = p->curtoken; /* save type for check later */
+ switch (type) {
case T_INT:
- emit_type(p, "int");
+ case T_NUM:
+ case T_STRING:
+ case T_PMC:
+ emit_type(p, get_current_token(p->lexer));
next(p);
- match(p, T_IDENTIFIER);
- match(p, T_ASSIGN);
+ break;
+ default:
+ syntax_error(p, 1, "type expected");
+ break;
+ }
+
+ match(p, T_IDENTIFIER);
+ match(p, T_ASSIGN);
+
+ /* parse a literal of the type according to the parsed type keyword */
+ emit_expr(p, get_current_token(p->lexer)); /* emit the literal */
+ switch (type) {
+ case T_INT:
match(p, T_INTEGER_CONSTANT);
break;
case T_NUM:
- emit_type(p, "num");
- next(p);
- match(p, T_IDENTIFIER);
- match(p, T_ASSIGN);
match(p, T_NUMBER_CONSTANT);
break;
- case T_STRING:
- emit_type(p, "string");
- next(p);
- match(p, T_IDENTIFIER);
- match(p, T_ASSIGN);
- match(p, T_STRING_CONSTANT);
- break;
- case T_PMC: /* both string and PMC have strings as constants */
- emit_type(p, "pmc");
- next(p);
- match(p, T_IDENTIFIER);
- match(p, T_ASSIGN);
+ case T_STRING: /* both string and PMC have strings as constants */
+ case T_PMC:
match(p, T_STRING_CONSTANT);
break;
default:
- syntax_error(p, 1, "type expected");
+ syntax_error(p, 2, find_keyword(type), "expected");
break;
}
}
@@ -1232,16 +1253,22 @@
long_invocation(parser_state *p) {
int more_results = 1; /* flag for while loop */
+ emit_invocation_start(p);
+
match(p, T_PCC_BEGIN); /* '.pcc_begin '\n' ... */
match(p, T_NEWLINE);
+ /* arguments */
+ emit_args_start(p);
while (p->curtoken == T_ARG) { /* ... { '.arg' expr [flag] '\n' } ... */
next(p);
expression(p);
arg_flags(p);
match(p, T_NEWLINE);
}
+ emit_args_end(p);
+ /* the invocant and/or sub to be called */
switch (p->curtoken) {
case T_PCC_CALL: /* ... '.pcc_call' target '\n' ... */
case T_NCI_CALL: /* ... '.nci_call' target '\n' ... */
@@ -1262,7 +1289,9 @@
break;
}
-
+ /* results */
+ /*emit_results_start(p);
+ */
while (more_results) {
switch (p->curtoken) {
case T_LOCAL:
@@ -1274,7 +1303,7 @@
param_flags(p);
match(p, T_NEWLINE);
break;
- case T_PCC_END:
+ case T_PCC_END: /* we encountered '.pcc_end', so stop looking for
more results */
more_results = 0; /* no more results, break loop */
break;
default:
@@ -1285,9 +1314,12 @@
break;
}
}
-
+ /*emit_results_end(p);
+ */
match(p, T_PCC_END); /* '.pcc_end' '\n' */
match(p, T_NEWLINE);
+
+ emit_invocation_end(p);
}
@@ -1315,6 +1347,7 @@
}
match(p, T_PCC_END_RETURN); /* ... '.pcc_end_return' '\n' */
match(p, T_NEWLINE);
+ emit_op_end(p);
}
/*
@@ -1368,6 +1401,7 @@
switch (p->curtoken) {
case T_ASSIGN: /* target '=' expression */
+
assignment(p);
break;
case T_PLUS_ASSIGN: /* target '+=' simple_expr '\n' (and '-=' etc.) */
@@ -1434,13 +1468,16 @@
=item *
- multi-result-invocation -> target_list '=' (subcall | methodcall)
+ multi-result-invocation -> target_list '=' (invokable arguments |
methodcall)) '\n'
+
+ invokable -> IDENTIFIER | PREG | STRINGC
=cut
*/
static void
multi_result_invocation(parser_state *p) {
+ emit_invocation_start(p);
target_list(p);
match(p, T_ASSIGN);
@@ -1448,18 +1485,22 @@
case T_IDENTIFIER: /* target_list '=' subcall */
case T_PASM_PREG:
case T_PREG:
+ case T_STRING_CONSTANT: {
+ char *invokable = clone_string(get_current_token(p->lexer));
+ emit_invokable(p, invokable);
next(p);
arguments(p);
- match(p, T_NEWLINE);
break;
+ }
case T_INVOCANT_IDENT: /* target_list '=' methodcall */
methodcall(p);
- match(p, T_NEWLINE);
break;
default:
syntax_error(p, 1, "sub or method invocation expected");
break;
}
+ match(p, T_NEWLINE);
+ emit_invocation_end(p);
}
/*
@@ -1571,6 +1612,7 @@
| yield_statement
| macro_expansion
| target_statement
+ | STRINGC arguments
| methodcall
| long_invocation
| long_return_statement
@@ -1647,6 +1689,15 @@
case T_PASM_SREG: case T_SREG: case T_PASM_IREG: case T_IREG:
target_statement(p);
break;
+ case T_STRING_CONSTANT: {
+ char *invokable = clone_string(get_current_token(p->lexer));
+ emit_invocation_start(p);
+ emit_invokable(p, invokable);
+ next(p);
+ arguments(p);
+ emit_invocation_end(p);
+ break;
+ }
case T_INVOCANT_IDENT: /* dot attached to identifier, like 'id.'
*/
methodcall(p);
match(p, T_NEWLINE);
@@ -1862,8 +1913,7 @@
case T_PMC:
case T_STRING:
emit_type(p, get_current_token(p->lexer));
- /* type(p); -- we know what it is; just skip it! */
- next(p);
+ next(p); /*we know what it is; just skip it! */
emit_name(p, get_current_token(p->lexer));
match(p, T_IDENTIFIER);
param_flags(p);
Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c (original)
+++ trunk/compilers/pirc/src/pirvtable.c Wed Apr 4 12:03:45 2007
@@ -69,26 +69,34 @@
/* 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->destroy = not_implemented; /* destructor; highly
recommended to implement! */
- vtable->name = not_implemented;
- vtable->sub_start = not_implemented;
- vtable->sub_end = not_implemented;
- vtable->stmts_start = not_implemented;
- vtable->stmts_end = not_implemented;
- vtable->end = not_implemented;
- vtable->param_start = not_implemented;
- vtable->param_end = not_implemented;
- vtable->type = not_implemented;
- vtable->sub_flag = not_implemented;
- vtable->expression = not_implemented;
- vtable->next_expr = not_implemented;
- vtable->op_start = not_implemented;
- vtable->op_end = not_implemented;
- vtable->list_start = not_implemented;
- vtable->list_end = not_implemented;
- vtable->sub_flag_start = not_implemented;
- vtable->sub_flag_end = not_implemented;
+ vtable->initialize = not_implemented;
+ vtable->destroy = not_implemented; /* destructor; highly
recommended to implement! */
+ vtable->name = not_implemented;
+ vtable->sub_start = not_implemented;
+ vtable->sub_end = not_implemented;
+ vtable->stmts_start = not_implemented;
+ vtable->stmts_end = not_implemented;
+ vtable->end = not_implemented;
+ vtable->param_start = not_implemented;
+ vtable->param_end = not_implemented;
+ vtable->type = not_implemented;
+ vtable->sub_flag = not_implemented;
+ vtable->expression = not_implemented;
+ vtable->next_expr = not_implemented;
+ vtable->op_start = not_implemented;
+ vtable->op_end = not_implemented;
+ vtable->list_start = not_implemented;
+ vtable->list_end = not_implemented;
+ vtable->sub_flag_start = not_implemented;
+ vtable->sub_flag_end = not_implemented;
+ vtable->method_name = not_implemented;
+ vtable->invocant = not_implemented;
+ vtable->args_start = not_implemented;
+ vtable->args_end = not_implemented;
+ vtable->target = not_implemented;
+ vtable->invokable = not_implemented;
+ vtable->invocation_start = not_implemented;
+ vtable->invocation_end = not_implemented;
/* set data to NULL, it's initialized in the backend module */
vtable->data = NULL;
Modified: trunk/compilers/pirc/src/pirvtable.h
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.h (original)
+++ trunk/compilers/pirc/src/pirvtable.h Wed Apr 4 12:03:45 2007
@@ -10,52 +10,68 @@
* 'emit_data' structure is left to each back-end separately.
*/
typedef struct pirvtable {
- struct emit_data *data;
- void (* initialize) (struct emit_data *);
- void (* destroy) (struct emit_data *);
- void (* sub_start) (struct emit_data *, char *source, int pos);
- void (* sub_end) (struct emit_data *);
- void (* name) (struct emit_data *, char *name);
- void (* stmts_start) (struct emit_data *);
- void (* stmts_end) (struct emit_data *);
- void (* end) (struct emit_data *);
- void (* param_start) (struct emit_data *);
- void (* param_end) (struct emit_data *);
- void (* type) (struct emit_data *, char *type);
- void (* sub_flag) (struct emit_data *, int flag);
- void (* op_start) (struct emit_data *, char *op);
- void (* op_end) (struct emit_data *);
- void (* expression) (struct emit_data *, char *expr);
- void (* next_expr) (struct emit_data *);
- void (* list_start) (struct emit_data *);
- void (* list_end) (struct emit_data *);
- void (* sub_flag_start) (struct emit_data *);
- void (* sub_flag_end) (struct emit_data *);
+ struct emit_data *data;
+ void (* initialize) (struct emit_data *data);
+ void (* destroy) (struct emit_data *data);
+ void (* sub_start) (struct emit_data *data, char *source, int pos);
+ void (* sub_end) (struct emit_data *data);
+ void (* name) (struct emit_data *data, char *name);
+ void (* stmts_start) (struct emit_data *data);
+ void (* stmts_end) (struct emit_data *data);
+ void (* end) (struct emit_data *data);
+ void (* param_start) (struct emit_data *data);
+ void (* param_end) (struct emit_data *data);
+ void (* type) (struct emit_data *data, char *type);
+ void (* sub_flag) (struct emit_data *data, int flag);
+ void (* op_start) (struct emit_data *data, char *op);
+ void (* op_end) (struct emit_data *data);
+ void (* expression) (struct emit_data *data, char *expr);
+ void (* next_expr) (struct emit_data *data);
+ void (* list_start) (struct emit_data *data);
+ void (* list_end) (struct emit_data *data);
+ void (* sub_flag_start) (struct emit_data *data);
+ void (* sub_flag_end) (struct emit_data *data);
+ void (* method_name) (struct emit_data *data, char *name);
+ void (* invocant) (struct emit_data *data, char *invocant);
+ void (* args_start) (struct emit_data *data);
+ void (* args_end) (struct emit_data *data);
+ void (* target) (struct emit_data *data, char *target);
+ void (* invokable) (struct emit_data *data, char *invokable);
+ void (* invocation_start)(struct emit_data *data);
+ void (* invocation_end) (struct emit_data *data);
} pirvtable;
/* #defines for cleaner invocation syntax */
-# define emit_init(P) (*P->vtable->initialize)
(P->vtable->data)
-# define emit_destroy(P) (*P->vtable->destroy)
(P->vtable->data)
-# define emit_sub_start(P,S,L) (*P->vtable->sub_start)
(P->vtable->data, S,L)
-# define emit_sub_end(P) (*P->vtable->sub_end)
(P->vtable->data)
-# define emit_name(P,N) (*P->vtable->name)
(P->vtable->data, N)
-# define emit_stmts_start(P) (*P->vtable->stmts_start)
(P->vtable->data)
-# define emit_stmts_end(P) (*P->vtable->stmts_end)
(P->vtable->data)
-# define emit_end(P) (*P->vtable->end)
(P->vtable->data)
-# define emit_param_start(P) (*P->vtable->param_start)
(P->vtable->data)
-# define emit_param_end(P) (*P->vtable->param_end)
(P->vtable->data)
-# define emit_type(P,T) (*P->vtable->type)
(P->vtable->data, T)
-# define emit_sub_flag(P,F) (*p->vtable->sub_flag)
(P->vtable->data, F)
-# define emit_sub_flag_start(P)
(*P->vtable->sub_flag_start)(P->vtable->data)
-# define emit_sub_flag_end(P) (*P->vtable->sub_flag_end)
(P->vtable->data)
-# define emit_op_start(P,O) (*P->vtable->op_start)
(P->vtable->data, O)
-# define emit_op_end(P) (*P->vtable->op_end)
(P->vtable->data)
-# define emit_expr(P,E) (*P->vtable->expression)
(P->vtable->data, E)
-# define emit_next_expr(P) (*P->vtable->next_expr)
(P->vtable->data)
-# define emit_list_start(P) (*P->vtable->list_start)
(P->vtable->data)
-# define emit_list_end(P) (*P->vtable->list_end)
(P->vtable->data)
+# define emit_init(P) (*P->vtable->initialize)
(P->vtable->data)
+# define emit_destroy(P) (*P->vtable->destroy)
(P->vtable->data)
+# define emit_sub_start(P,S,L) (*P->vtable->sub_start)
(P->vtable->data, S,L)
+# define emit_sub_end(P) (*P->vtable->sub_end)
(P->vtable->data)
+# define emit_name(P,N) (*P->vtable->name)
(P->vtable->data, N)
+# define emit_stmts_start(P) (*P->vtable->stmts_start)
(P->vtable->data)
+# define emit_stmts_end(P) (*P->vtable->stmts_end)
(P->vtable->data)
+# define emit_end(P) (*P->vtable->end)
(P->vtable->data)
+# define emit_param_start(P) (*P->vtable->param_start)
(P->vtable->data)
+# define emit_param_end(P) (*P->vtable->param_end)
(P->vtable->data)
+# define emit_type(P,T) (*P->vtable->type)
(P->vtable->data, T)
+# define emit_sub_flag(P,F) (*p->vtable->sub_flag)
(P->vtable->data, F)
+# define emit_sub_flag_start(P) (*P->vtable->sub_flag_start)
(P->vtable->data)
+# define emit_sub_flag_end(P) (*P->vtable->sub_flag_end)
(P->vtable->data)
+# define emit_op_start(P,O) (*P->vtable->op_start)
(P->vtable->data, O)
+# define emit_op_end(P) (*P->vtable->op_end)
(P->vtable->data)
+# define emit_expr(P,E) (*P->vtable->expression)
(P->vtable->data, E)
+# define emit_next_expr(P) (*P->vtable->next_expr)
(P->vtable->data)
+# define emit_list_start(P) (*P->vtable->list_start)
(P->vtable->data)
+# define emit_list_end(P) (*P->vtable->list_end)
(P->vtable->data)
+# define emit_method_name(P,N) (*P->vtable->method_name)
(P->vtable->data, N)
+# define emit_invocant(P,N) (*P->vtable->invocant)
(P->vtable->data, N)
+# define emit_args_start(P) (*P->vtable->args_start)
(P->vtable->data)
+# define emit_args_end(P) (*P->vtable->args_end)
(P->vtable->data)
+# define emit_target(P,T) (*P->vtable->target)
(P->vtable->data, T)
+# define emit_invokable(P,S) (*P->vtable->invokable)
(P->vtable->data, S)
+# define emit_invocation_start(P) (*P->vtable->invocation_start)
(P->vtable->data)
+# define emit_invocation_end(P) (*P->vtable->invocation_end)
(P->vtable->data)
extern pirvtable *new_pirvtable(void);