Author: kjs
Date: Thu Apr 12 10:07:53 2007
New Revision: 18168
Modified:
trunk/compilers/pirc/src/pirparser.c
trunk/compilers/pirc/src/pirvtable.c
trunk/compilers/pirc/src/pirvtable.h
Log:
compilers/pirc:
* add arg-flags to syntax for long return/yield
* fix syntax for long yield. '.yield' should be '.return'.
* add emit method for results.
Modified: trunk/compilers/pirc/src/pirparser.c
==============================================================================
--- trunk/compilers/pirc/src/pirparser.c (original)
+++ trunk/compilers/pirc/src/pirparser.c Thu Apr 12 10:07:53 2007
@@ -1374,7 +1374,7 @@
| '.invocant' invocant '\n'
'.meth_call' method '\n'
)
- { (local_declaration| '.result' target '\n') }
+ { (local_declaration | '.result' target param_flags '\n')
}
'.pcc_end' '\n'
=cut
@@ -1421,14 +1421,14 @@
}
/* results */
- /*emit_results_start(p);
- */
+ emit_results_start(p);
+
while (more_results) {
switch (p->curtoken) {
case T_LOCAL:
local_declaration(p);
break;
- case T_RESULT: /* '.result' target '\n' */
+ case T_RESULT: /* '.result' target param_flags '\n' */
next(p);
target(p);
param_flags(p);
@@ -1445,8 +1445,8 @@
break;
}
}
- /*emit_results_end(p);
- */
+ emit_results_end(p);
+
match(p, T_PCC_END); /* '.pcc_end' '\n' */
match(p, T_NEWLINE);
@@ -1459,7 +1459,7 @@
=item *
long_return_statement -> '.pcc_begin_return' '\n'
- { '.return' expression '\n' }
+ { '.return' expression arg_flags '\n' }
'.pcc_end_return' '\n'
=cut
@@ -1474,6 +1474,7 @@
while (p->curtoken == T_RETURN) { /* ... { '.return' simple_expr '\n' }
...*/
next(p); /* skip .return */
expression(p);
+ arg_flags(p);
match(p, T_NEWLINE);
}
match(p, T_PCC_END_RETURN); /* ... '.pcc_end_return' '\n' */
@@ -1486,7 +1487,7 @@
=item *
long_yield_statement -> '.pcc_begin_yield' '\n'
- { '.yield' expression '\n' }
+ { '.return' expression arg_flags '\n' }
'.pcc_end_yield' '\n'
=cut
@@ -1498,9 +1499,10 @@
match(p, T_PCC_BEGIN_YIELD);
match(p, T_NEWLINE);
- while (p->curtoken == T_YIELD) { /* { '.yield' expr '\n' } */
+ while (p->curtoken == T_RETURN) { /* { '.return expr arg_flags '\n' } */
next(p); /* skip .yield */
expression(p);
+ arg_flags(p);
match(p, T_NEWLINE);
}
match(p, T_PCC_END_YIELD); /* '.pcc_end_yield' '\n' */
Modified: trunk/compilers/pirc/src/pirvtable.c
==============================================================================
--- trunk/compilers/pirc/src/pirvtable.c (original)
+++ trunk/compilers/pirc/src/pirvtable.c Thu Apr 12 10:07:53 2007
@@ -29,7 +29,7 @@
=item not_implemented()
Default entry that is set to all vtable entries. If a particular vtable entry
is invoked,
-but was never implemented, this method is called. This is usefule, because not
all output
+but was never implemented, this method is called. This is usefulS, because not
all output
type need all vtable methods. The variable arguments are necessary, you never
know how
many args a method has.
@@ -103,7 +103,8 @@
vtable->assign = not_implemented;
vtable->comparison_op = not_implemented;
vtable->binary_op = not_implemented;
-
+ vtable->results_start = not_implemented;
+ vtable->results_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 Thu Apr 12 10:07:53 2007
@@ -69,6 +69,10 @@
void (* binary_op) (struct emit_data *data, char *op);
void (* comparison_op) (struct emit_data *data, char *op);
+ /* function results */
+ void (* results_start) (struct emit_data *data);
+ void (* results_end) (struct emit_data *data);
+
/* finalizer (not destructor, that only should be called to free resources
*/
void (* end) (struct emit_data *data);
@@ -116,6 +120,9 @@
# define emit_assign_end(P) (*P->vtable->assign_end)
(P->vtable->data)
# define emit_assign(P) (*P->vtable->assign)
(P->vtable->data)
+# define emit_results_start(P) (*P->vtable->results_start)
(P->vtable->data)
+# define emit_results_end(P) (*P->vtable->results_end)
(P->vtable->data)
+
# define emit_comparison_op(P,O) (*P->vtable->comparison_op)
(P->vtable->data, O)
# define emit_binary_op(P,O) (*P->vtable->binary_op)
(P->vtable->data, O)