develooper Front page | perl.cvs.parrot | Postings from December 2008

[svn:parrot] r34705 - in trunk: . compilers/pirc/new config/gen/makefiles

From:
kjs
Date:
December 31, 2008 07:23
Subject:
[svn:parrot] r34705 - in trunk: . compilers/pirc/new config/gen/makefiles
Message ID:
20081231152249.D9E3FCB9FA@x12.develooper.com
Author: kjs
Date: Wed Dec 31 07:22:45 2008
New Revision: 34705

Added:
   trunk/compilers/pirc/new/pirerr.c   (contents, props changed)
   trunk/compilers/pirc/new/pirerr.h   (contents, props changed)
Modified:
   trunk/MANIFEST
   trunk/compilers/pirc/new/main.c
   trunk/compilers/pirc/new/pir.l
   trunk/compilers/pirc/new/pir.y
   trunk/compilers/pirc/new/pircompiler.c
   trunk/compilers/pirc/new/pircompunit.c
   trunk/compilers/pirc/new/pircompunit.h
   trunk/compilers/pirc/new/piremit.c
   trunk/compilers/pirc/new/pirlexer.c
   trunk/compilers/pirc/new/pirlexer.h
   trunk/compilers/pirc/new/pirparser.c
   trunk/compilers/pirc/new/pirparser.h
   trunk/compilers/pirc/new/pirpcc.c
   trunk/compilers/pirc/new/pirsymbol.c
   trunk/compilers/pirc/new/piryy.h
   trunk/config/gen/makefiles/pirc.in

Log:
[pirc] refactoring of error handling code.
+ update MANIFEST
+ update pirc.in.


Modified: trunk/MANIFEST
==============================================================================
--- trunk/MANIFEST	(original)
+++ trunk/MANIFEST	Wed Dec 31 07:22:45 2008
@@ -1,7 +1,7 @@
 # ex: set ro:
 # $Id$
 #
-# generated by tools\dev\mk_manifest_and_skip.pl Wed Dec 31 13:54:12 2008 UT
+# generated by tools\dev\mk_manifest_and_skip.pl Wed Dec 31 15:21:23 2008 UT
 #
 # See tools/dev/install_files.pl for documentation on the
 # format of this file.
@@ -172,6 +172,8 @@
 compilers/pirc/new/pirdefines.h                             []
 compilers/pirc/new/piremit.c                                []
 compilers/pirc/new/piremit.h                                []
+compilers/pirc/new/pirerr.c                                 []
+compilers/pirc/new/pirerr.h                                 []
 compilers/pirc/new/pirheredoc.h                             []
 compilers/pirc/new/pirlexer.c                               []
 compilers/pirc/new/pirlexer.h                               []

Modified: trunk/compilers/pirc/new/main.c
==============================================================================
--- trunk/compilers/pirc/new/main.c	(original)
+++ trunk/compilers/pirc/new/main.c	Wed Dec 31 07:22:45 2008
@@ -508,42 +508,7 @@
 
 
 
-/*
-
-=item C<int
-yypirerror(yyscan_t yyscanner, lexer_state * const lexer, char const * const message, ...)>
-
-Default parse error handling routine, that is invoked when the bison-generated
-parser finds a syntax error.
-
-=cut
-
-*/
-PARROT_IGNORABLE_RESULT
-int
-yypirerror(yyscan_t yyscanner, NOTNULL(lexer_state * const lexer),
-        NOTNULL(char const * const message), ...)
-{
-    char const * const current_token = yypirget_text(yyscanner);
-    va_list arg_ptr;
-
-    fprintf(stderr, "\nError in file '%s' (line %d)\n\t", lexer->filename,
-            yypirget_lineno(yyscanner));
-
-    va_start(arg_ptr, message);
-    vfprintf(stderr, message, arg_ptr);
-    va_end(arg_ptr);
-
-    /* print current token if it doesn't contain a newline token. */
-    if (!strstr(current_token, "\n"))
-        fprintf(stderr, "\n\tcurrent token: '%s'", current_token);
-
-    fprintf(stderr, "\n\n");
-
-    ++lexer->parse_errors;
 
-    return 0;
-}
 
 
 /*

Modified: trunk/compilers/pirc/new/pir.l
==============================================================================
--- trunk/compilers/pirc/new/pir.l	(original)
+++ trunk/compilers/pirc/new/pir.l	Wed Dec 31 07:22:45 2008
@@ -66,6 +66,7 @@
 #include "pircompiler.h"
 #include "piryy.h"
 #include "pirmacro.h"
+#include "pirerr.h"
 
 /* define the type of the extra field in the yyscan_t object that is passed around;
  * this is the lexer_state structure, defined in "pircompiler.h"

Modified: trunk/compilers/pirc/new/pir.y
==============================================================================
--- trunk/compilers/pirc/new/pir.y	(original)
+++ trunk/compilers/pirc/new/pir.y	Wed Dec 31 07:22:45 2008
@@ -61,6 +61,7 @@
 #include "piryy.h"
 #include "pirmacro.h"
 #include "pirpcc.h"
+#include "pirerr.h"
 
 /* #defines to prevent declarations of malloc() and free() in pirparser.h */
 #define YYMALLOC

Modified: trunk/compilers/pirc/new/pircompiler.c
==============================================================================
--- trunk/compilers/pirc/new/pircompiler.c	(original)
+++ trunk/compilers/pirc/new/pircompiler.c	Wed Dec 31 07:22:45 2008
@@ -13,6 +13,7 @@
 #include "piryy.h"
 #include "pirmacro.h"
 #include "pirregalloc.h"
+#include "pirerr.h"
 
 /* XXX count memory, so we can check out mem. savings of string reuse
  * Only temporarily used, so no need to "fix" this.

Modified: trunk/compilers/pirc/new/pircompunit.c
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.c	(original)
+++ trunk/compilers/pirc/new/pircompunit.c	Wed Dec 31 07:22:45 2008
@@ -29,6 +29,7 @@
 #include "piryy.h"
 #include "pirdefines.h"
 #include "pirpcc.h"
+#include "pirerr.h"
 #include "bcgen.h"
 
 #include <stdio.h>
@@ -42,7 +43,6 @@
 #include "parrot/dynext.h"
 
 
-
 static unsigned const prime_numbers[] = {113 /* XXX think of more primes */ };
 
 /*
@@ -51,29 +51,6 @@
 
 =over 4
 
-
-=item C<void
-panic(lexer_state * lexer, char const * const message)>
-
-Function to emit a final last cry that something's wrong and exit.
-
-=cut
-
-*/
-void
-panic(lexer_state * lexer, char const * const message, ...) {
-    va_list arg_ptr;
-    fprintf(stderr, "Fatal: ");
-    va_start(arg_ptr, message);
-    vfprintf(stderr, message, arg_ptr);
-    va_end(arg_ptr);
-    release_resources(lexer);
-    exit(EXIT_FAILURE);
-}
-
-
-/*
-
 =item C<void
 reset_register_allocator(lexer_state * const lexer)>
 
@@ -2066,10 +2043,10 @@
     if (instr->opinfo)
         lexer->codesize -= instr->opinfo->op_count;
 
-/*
-    fprintf(stderr, "updateop(): %s\n", CURRENT_INSTRUCTION(lexer)->opname);
-*/
-    /* else the instruction was already set; decrement the codesize, as it was added already */
+    /* We cannot undo the counting of ops of var-arg ops such as get_params.
+     * Is that ever necessary? Don't think so, as they're added through new_sub_instr()
+     * which is special anyway.
+     */
 
     /* now get the opinfo structure, update the name, and update the opcode. */
     instr->opinfo = &lexer->interp->op_info_table[newop];
@@ -2081,11 +2058,6 @@
 }
 
 
-
-
-
-
-
 /*
 
 =item C<static label *
@@ -2130,7 +2102,7 @@
         return;
 
     do {
-        iter = iter->next; /* init pointer to first instruction */
+        iter = iter->next; /* first time init pointer to first instruction */
 
         /* Do a quick global check if any label bits have been set
          * if no label at all, skip this whole block.

Modified: trunk/compilers/pirc/new/pircompunit.h
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.h	(original)
+++ trunk/compilers/pirc/new/pircompunit.h	Wed Dec 31 07:22:45 2008
@@ -453,11 +453,6 @@
 void update_sub_register_usage(struct lexer_state * const lexer,
                                unsigned reg_usage[NUM_PARROT_TYPES]);
 
-
-
-void panic(struct lexer_state * lexer, char const * const message, ...);
-
-
 void new_sub_instr(struct lexer_state * const lexer, int opcode, char const * const opname,
               unsigned num_var_args);
 

Modified: trunk/compilers/pirc/new/piremit.c
==============================================================================
--- trunk/compilers/pirc/new/piremit.c	(original)
+++ trunk/compilers/pirc/new/piremit.c	Wed Dec 31 07:22:45 2008
@@ -7,6 +7,7 @@
 #include "piremit.h"
 #include "pircompunit.h"
 #include "pircompiler.h"
+#include "pirerr.h"
 #include "bcgen.h"
 
 #include "parrot/oplib/ops.h"

Added: trunk/compilers/pirc/new/pirerr.c
==============================================================================
--- (empty file)
+++ trunk/compilers/pirc/new/pirerr.c	Wed Dec 31 07:22:45 2008
@@ -0,0 +1,93 @@
+/*
+ * $Id$
+ * Copyright (C) 2007-2008, The Perl Foundation.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+#include "pircompiler.h"
+
+#include "pirparser.h"
+#include "piryy.h"
+#include "pirlexer.h"
+/*
+
+=head1 FUNCTIONS
+
+=over 4
+
+
+=item C<void
+panic(lexer_state * lexer, char const * const message)>
+
+Function to emit a final last cry that something's wrong and exit.
+
+=cut
+
+*/
+void
+panic(lexer_state * lexer, char const * const message, ...) {
+    va_list arg_ptr;
+    fprintf(stderr, "Fatal: ");
+    va_start(arg_ptr, message);
+    vfprintf(stderr, message, arg_ptr);
+    va_end(arg_ptr);
+    release_resources(lexer);
+    exit(EXIT_FAILURE);
+}
+
+
+/*
+
+=item C<int
+yypirerror(yyscan_t yyscanner, lexer_state * const lexer, char const * const message, ...)>
+
+Default parse error handling routine, that is invoked when the bison-generated
+parser finds a syntax error.
+
+=cut
+
+*/
+PARROT_IGNORABLE_RESULT
+int
+yypirerror(yyscan_t yyscanner, NOTNULL(lexer_state * const lexer),
+        NOTNULL(char const * const message), ...)
+{
+    char const * const current_token = yypirget_text(yyscanner);
+    va_list arg_ptr;
+
+    fprintf(stderr, "\nError in file '%s' (line %d)\n\t", lexer->filename,
+            yypirget_lineno(yyscanner));
+
+    va_start(arg_ptr, message);
+    vfprintf(stderr, message, arg_ptr);
+    va_end(arg_ptr);
+
+    /* print current token if it doesn't contain a newline token. */
+    if (!strstr(current_token, "\n"))
+        fprintf(stderr, "\n\tcurrent token: '%s'", current_token);
+
+    fprintf(stderr, "\n\n");
+
+    ++lexer->parse_errors;
+
+    return 0;
+}
+
+/*
+
+=back
+
+=cut
+
+*/
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
+
+
+

Added: trunk/compilers/pirc/new/pirerr.h
==============================================================================
--- (empty file)
+++ trunk/compilers/pirc/new/pirerr.h	Wed Dec 31 07:22:45 2008
@@ -0,0 +1,24 @@
+/*
+ * $Id$
+ * Copyright (C) 2008, The Perl Foundation.
+ */
+
+#ifndef PARROT_PIR_PIRERR_H_GUARD
+#define PARROT_PIR_PIRERR_H_GUARD
+
+#include "piryy.h"
+
+void panic(lexer_state * lexer, char const * const message, ...);
+
+int yypirerror(yyscan_t yyscanner, struct lexer_state * const lexer,
+               char const * const message, ...);
+
+#endif /* PARROT_PIR_PIRERR_H_GUARD */
+
+/*
+ * Local variables:
+ *   c-file-style: "parrot"
+ * End:
+ * vim: expandtab shiftwidth=4:
+ */
+

Modified: trunk/compilers/pirc/new/pirlexer.c
==============================================================================
--- trunk/compilers/pirc/new/pirlexer.c	(original)
+++ trunk/compilers/pirc/new/pirlexer.c	Wed Dec 31 07:22:45 2008
@@ -1325,29 +1325,29 @@
 
 static yyconst flex_int16_t yy_rule_linenum[204] =
     {   0,
-      218,  240,  242,  244,  249,  250,  251,  252,  253,  254,
-      255,  256,  257,  258,  259,  260,  262,  263,  264,  265,
-      267,  268,  269,  270,  271,  272,  273,  274,  275,  276,
-      277,  278,  280,  285,  286,  288,  289,  290,  291,  292,
-      293,  294,  295,  296,  297,  298,  300,  301,  302,  303,
-      305,  306,  307,  308,  310,  311,  312,  313,  314,  316,
-      317,  318,  319,  320,  321,  322,  323,  324,  326,  327,
-      328,  329,  330,  331,  332,  333,  334,  335,  336,  337,
-      338,  339,  340,  341,  342,  343,  346,  353,  354,  355,
-      356,  357,  358,  359,  360,  361,  362,  363,  364,  365,
-
-      366,  368,  369,  370,  371,  372,  373,  374,  377,  382,
-      383,  384,  385,  387,  392,  404,  419,  420,  421,  422,
-      423,  425,  477,  490,  512,  517,  522,  529,  530,  545,
-      550,  551,  556,  557,  558,  560,  576,  630,  658,  663,
-      668,  669,  670,  671,  676,  687,  688,  690,  692,  703,
-      717,  722,  723,  724,  725,  727,  742,  756,  785,  810,
-      812,  817,  827,  832,  850,  856,  863,  896,  898,  903,
-      939,  940,  941,  943,  944,  945,  946,  947,  948,  950,
-      951,  952,  954,  959,  964,  965,  968, 1002, 1007, 1010,
-     1011, 1012, 1013, 1015, 1020, 1021, 1022, 1023, 1024, 1026,
+      219,  241,  243,  245,  250,  251,  252,  253,  254,  255,
+      256,  257,  258,  259,  260,  261,  263,  264,  265,  266,
+      268,  269,  270,  271,  272,  273,  274,  275,  276,  277,
+      278,  279,  281,  286,  287,  289,  290,  291,  292,  293,
+      294,  295,  296,  297,  298,  299,  301,  302,  303,  304,
+      306,  307,  308,  309,  311,  312,  313,  314,  315,  317,
+      318,  319,  320,  321,  322,  323,  324,  325,  327,  328,
+      329,  330,  331,  332,  333,  334,  335,  336,  337,  338,
+      339,  340,  341,  342,  343,  344,  347,  354,  355,  356,
+      357,  358,  359,  360,  361,  362,  363,  364,  365,  366,
+
+      367,  369,  370,  371,  372,  373,  374,  375,  378,  383,
+      384,  385,  386,  388,  393,  405,  420,  421,  422,  423,
+      424,  426,  478,  491,  513,  518,  523,  530,  531,  546,
+      551,  552,  557,  558,  559,  561,  577,  631,  659,  664,
+      669,  670,  671,  672,  677,  688,  689,  691,  693,  704,
+      718,  723,  724,  725,  726,  728,  743,  757,  786,  811,
+      813,  818,  828,  833,  851,  857,  864,  897,  899,  904,
+      940,  941,  942,  944,  945,  946,  947,  948,  949,  951,
+      952,  953,  955,  960,  965,  966,  969, 1003, 1008, 1011,
+     1012, 1013, 1014, 1016, 1021, 1022, 1023, 1024, 1025, 1027,
 
-     1031, 1033, 1035
+     1032, 1034, 1036
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -1389,6 +1389,7 @@
 #include "pircompiler.h"
 #include "piryy.h"
 #include "pirmacro.h"
+#include "pirerr.h"
 
 /* define the type of the extra field in the yyscan_t object that is passed around;
  * this is the lexer_state structure, defined in "pircompiler.h"
@@ -1465,7 +1466,7 @@
 
 /* The PASM state is an exclusive state, recognizing ONLY PASM tokens. */
 
-#line 1469 "pirlexer.c"
+#line 1470 "pirlexer.c"
 
 #define INITIAL 0
 #define MACROHEAD 1
@@ -1771,11 +1772,11 @@
     struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
 
 /* %% [7.0] user's declarations go here */
-#line 215 "pir.l"
+#line 216 "pir.l"
 
 
 
-#line 1779 "pirlexer.c"
+#line 1780 "pirlexer.c"
 
     yylval = yylval_param;
 
@@ -1902,7 +1903,7 @@
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 218 "pir.l"
+#line 219 "pir.l"
 { /* only when the scanning starts, is this state used. Only a single
                          * character is read, pushed back, and then, depending on the
                          * lexer flags, either PASM or PIR mode (INITIAL state) is activated.
@@ -1927,19 +1928,19 @@
     YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 240 "pir.l"
+#line 241 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 3:
 /* rule 3 can match eol */
 YY_RULE_SETUP
-#line 242 "pir.l"
+#line 243 "pir.l"
 { /* ignore line comments */ }
     YY_BREAK
 case 4:
 /* rule 4 can match eol */
 YY_RULE_SETUP
-#line 244 "pir.l"
+#line 245 "pir.l"
 { /* a set of continuous newlines yields a single newline token. */
                     yylval->sval = "\n";
                     return TK_NL;
@@ -1947,419 +1948,419 @@
     YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 249 "pir.l"
+#line 250 "pir.l"
 { return TK_ASSIGN_USHIFT; }
     YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 250 "pir.l"
+#line 251 "pir.l"
 { return TK_USHIFT; }
     YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 251 "pir.l"
+#line 252 "pir.l"
 { return TK_ASSIGN_RSHIFT; }
     YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 252 "pir.l"
+#line 253 "pir.l"
 { return TK_RSHIFT; }
     YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 253 "pir.l"
+#line 254 "pir.l"
 { return TK_LSHIFT; }
     YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 254 "pir.l"
+#line 255 "pir.l"
 { return TK_ARROW; }
     YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 255 "pir.l"
+#line 256 "pir.l"
 { return TK_EQ; }
     YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 256 "pir.l"
+#line 257 "pir.l"
 { return TK_NE; }
     YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 257 "pir.l"
+#line 258 "pir.l"
 { return TK_LE; }
     YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 258 "pir.l"
+#line 259 "pir.l"
 { return TK_GE; }
     YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 259 "pir.l"
+#line 260 "pir.l"
 { return TK_LT; }
     YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 260 "pir.l"
+#line 261 "pir.l"
 { return TK_GT; }
     YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 262 "pir.l"
+#line 263 "pir.l"
 { return TK_FDIV; }
     YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 263 "pir.l"
+#line 264 "pir.l"
 { return TK_AND; }
     YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 264 "pir.l"
+#line 265 "pir.l"
 { return TK_OR; }
     YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 265 "pir.l"
+#line 266 "pir.l"
 { return TK_XOR; }
     YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 267 "pir.l"
+#line 268 "pir.l"
 { return '+'; }
     YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 268 "pir.l"
+#line 269 "pir.l"
 { return '%'; }
     YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 269 "pir.l"
+#line 270 "pir.l"
 { return '*'; }
     YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 270 "pir.l"
+#line 271 "pir.l"
 { return '/'; }
     YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 271 "pir.l"
+#line 272 "pir.l"
 { return '!'; }
     YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 272 "pir.l"
+#line 273 "pir.l"
 { return '~'; }
     YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 273 "pir.l"
+#line 274 "pir.l"
 { return '-'; }
     YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 274 "pir.l"
+#line 275 "pir.l"
 { return '('; }
     YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 275 "pir.l"
+#line 276 "pir.l"
 { return ')'; }
     YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 276 "pir.l"
+#line 277 "pir.l"
 { return ','; }
     YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 277 "pir.l"
+#line 278 "pir.l"
 { return '['; }
     YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 278 "pir.l"
+#line 279 "pir.l"
 { return ']'; }
     YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 280 "pir.l"
+#line 281 "pir.l"
 { /* if the dot is surrounded by whitespace, it's a concatenation operator */
                     return TK_CONC;
                   }
     YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 285 "pir.l"
+#line 286 "pir.l"
 { return '='; }
     YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 286 "pir.l"
+#line 287 "pir.l"
 { return ';'; }
     YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 288 "pir.l"
+#line 289 "pir.l"
 { return TK_ASSIGN_INC; }
     YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 289 "pir.l"
+#line 290 "pir.l"
 { return TK_ASSIGN_DEC; }
     YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 290 "pir.l"
+#line 291 "pir.l"
 { return TK_ASSIGN_DIV; }
     YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 291 "pir.l"
+#line 292 "pir.l"
 { return TK_ASSIGN_MUL; }
     YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 292 "pir.l"
+#line 293 "pir.l"
 { return TK_ASSIGN_MOD; }
     YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 293 "pir.l"
+#line 294 "pir.l"
 { return TK_ASSIGN_POW; }
     YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 294 "pir.l"
+#line 295 "pir.l"
 { return TK_ASSIGN_BOR; }
     YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 295 "pir.l"
+#line 296 "pir.l"
 { return TK_ASSIGN_BAND; }
     YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 296 "pir.l"
+#line 297 "pir.l"
 { return TK_ASSIGN_FDIV; }
     YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 297 "pir.l"
+#line 298 "pir.l"
 { return TK_ASSIGN_BNOT; }
     YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 298 "pir.l"
+#line 299 "pir.l"
 { return TK_ASSIGN_CONC; }
     YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 300 "pir.l"
+#line 301 "pir.l"
 { return TK_IF; }
     YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 301 "pir.l"
+#line 302 "pir.l"
 { return TK_GOTO; }
     YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 302 "pir.l"
+#line 303 "pir.l"
 { return TK_UNLESS; }
     YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 303 "pir.l"
+#line 304 "pir.l"
 { return TK_NULL; }
     YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 305 "pir.l"
+#line 306 "pir.l"
 { return TK_INT; }
     YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 306 "pir.l"
+#line 307 "pir.l"
 { return TK_NUM; }
     YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 307 "pir.l"
+#line 308 "pir.l"
 { return TK_PMC; }
     YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 308 "pir.l"
+#line 309 "pir.l"
 { return TK_STRING; }
     YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 310 "pir.l"
+#line 311 "pir.l"
 { return TK_ANNOTATE; }
     YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 311 "pir.l"
+#line 312 "pir.l"
 { return TK_SET_ARG; }
     YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 312 "pir.l"
+#line 313 "pir.l"
 { return TK_CONST; }
     YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 313 "pir.l"
+#line 314 "pir.l"
 { return TK_END; }
     YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 314 "pir.l"
+#line 315 "pir.l"
 { return TK_FILE; }
     YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 316 "pir.l"
+#line 317 "pir.l"
 { return TK_GET_RESULTS; }
     YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 317 "pir.l"
+#line 318 "pir.l"
 { return TK_GLOBALCONST; }
     YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 318 "pir.l"
+#line 319 "pir.l"
 { return TK_HLL; }
     YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 319 "pir.l"
+#line 320 "pir.l"
 { return TK_HLL_MAP; }
     YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 320 "pir.l"
+#line 321 "pir.l"
 { return TK_INVOCANT; }
     YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 321 "pir.l"
+#line 322 "pir.l"
 { return TK_LEX; }
     YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 322 "pir.l"
+#line 323 "pir.l"
 { return TK_LINE; }
     YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 323 "pir.l"
+#line 324 "pir.l"
 { return TK_LOADLIB; }
     YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 324 "pir.l"
+#line 325 "pir.l"
 { return TK_LOCAL; }
     YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 326 "pir.l"
+#line 327 "pir.l"
 { return TK_METH_CALL; }
     YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 327 "pir.l"
+#line 328 "pir.l"
 { return TK_NAMESPACE; }
     YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 328 "pir.l"
+#line 329 "pir.l"
 { return TK_NCI_CALL; }
     YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 329 "pir.l"
+#line 330 "pir.l"
 { return TK_PARAM; }
     YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 330 "pir.l"
+#line 331 "pir.l"
 { return TK_BEGIN_CALL; }
     YY_BREAK
 case 74:
 YY_RULE_SETUP
-#line 331 "pir.l"
+#line 332 "pir.l"
 { return TK_BEGIN_RETURN; }
     YY_BREAK
 case 75:
 YY_RULE_SETUP
-#line 332 "pir.l"
+#line 333 "pir.l"
 { return TK_BEGIN_YIELD; }
     YY_BREAK
 case 76:
 YY_RULE_SETUP
-#line 333 "pir.l"
+#line 334 "pir.l"
 { return TK_CALL; }
     YY_BREAK
 case 77:
 YY_RULE_SETUP
-#line 334 "pir.l"
+#line 335 "pir.l"
 { return TK_END_CALL; }
     YY_BREAK
 case 78:
 YY_RULE_SETUP
-#line 335 "pir.l"
+#line 336 "pir.l"
 { return TK_END_RETURN; }
     YY_BREAK
 case 79:
 YY_RULE_SETUP
-#line 336 "pir.l"
+#line 337 "pir.l"
 { return TK_END_YIELD; }
     YY_BREAK
 case 80:
 YY_RULE_SETUP
-#line 337 "pir.l"
+#line 338 "pir.l"
 { return TK_GET_RESULT; }
     YY_BREAK
 case 81:
 YY_RULE_SETUP
-#line 338 "pir.l"
+#line 339 "pir.l"
 { return TK_RETURN; }
     YY_BREAK
 case 82:
 YY_RULE_SETUP
-#line 339 "pir.l"
+#line 340 "pir.l"
 { return TK_SUB; }
     YY_BREAK
 case 83:
 YY_RULE_SETUP
-#line 340 "pir.l"
+#line 341 "pir.l"
 { return TK_YIELD; }
     YY_BREAK
 case 84:
 YY_RULE_SETUP
-#line 341 "pir.l"
+#line 342 "pir.l"
 { return TK_SET_RETURN; }
     YY_BREAK
 case 85:
 YY_RULE_SETUP
-#line 342 "pir.l"
+#line 343 "pir.l"
 { return TK_SET_YIELD; }
     YY_BREAK
 case 86:
 YY_RULE_SETUP
-#line 343 "pir.l"
+#line 344 "pir.l"
 { return TK_TAILCALL; }
     YY_BREAK
 case 87:
 YY_RULE_SETUP
-#line 346 "pir.l"
+#line 347 "pir.l"
 { /* make sure these are not used outside macro defs */
                     yypirerror(yyscanner, yypirget_extra(yyscanner),
                                "cannot use '%s' outside of macro definitions", yytext);
@@ -2367,112 +2368,112 @@
     YY_BREAK
 case 88:
 YY_RULE_SETUP
-#line 353 "pir.l"
+#line 354 "pir.l"
 { return TK_FLAG_ANON; }
     YY_BREAK
 case 89:
 YY_RULE_SETUP
-#line 354 "pir.l"
+#line 355 "pir.l"
 { return TK_FLAG_INIT; }
     YY_BREAK
 case 90:
 YY_RULE_SETUP
-#line 355 "pir.l"
+#line 356 "pir.l"
 { return TK_FLAG_LOAD; }
     YY_BREAK
 case 91:
 YY_RULE_SETUP
-#line 356 "pir.l"
+#line 357 "pir.l"
 { return TK_FLAG_POSTCOMP; }
     YY_BREAK
 case 92:
 YY_RULE_SETUP
-#line 357 "pir.l"
+#line 358 "pir.l"
 { return TK_FLAG_IMMEDIATE; }
     YY_BREAK
 case 93:
 YY_RULE_SETUP
-#line 358 "pir.l"
+#line 359 "pir.l"
 { return TK_FLAG_MAIN; }
     YY_BREAK
 case 94:
 YY_RULE_SETUP
-#line 359 "pir.l"
+#line 360 "pir.l"
 { return TK_FLAG_METHOD; }
     YY_BREAK
 case 95:
 YY_RULE_SETUP
-#line 360 "pir.l"
+#line 361 "pir.l"
 { return TK_FLAG_LEX; }
     YY_BREAK
 case 96:
 YY_RULE_SETUP
-#line 361 "pir.l"
+#line 362 "pir.l"
 { return TK_FLAG_OUTER; }
     YY_BREAK
 case 97:
 YY_RULE_SETUP
-#line 362 "pir.l"
+#line 363 "pir.l"
 { return TK_FLAG_VTABLE; }
     YY_BREAK
 case 98:
 YY_RULE_SETUP
-#line 363 "pir.l"
+#line 364 "pir.l"
 { return TK_FLAG_MULTI; }
     YY_BREAK
 case 99:
 YY_RULE_SETUP
-#line 364 "pir.l"
+#line 365 "pir.l"
 { return TK_FLAG_SUBID; }
     YY_BREAK
 case 100:
 YY_RULE_SETUP
-#line 365 "pir.l"
+#line 366 "pir.l"
 { return TK_FLAG_INSTANCEOF; }
     YY_BREAK
 case 101:
 YY_RULE_SETUP
-#line 366 "pir.l"
+#line 367 "pir.l"
 { return TK_FLAG_NSENTRY; }
     YY_BREAK
 case 102:
 YY_RULE_SETUP
-#line 368 "pir.l"
+#line 369 "pir.l"
 { return TK_FLAG_UNIQUE_REG; }
     YY_BREAK
 case 103:
 YY_RULE_SETUP
-#line 369 "pir.l"
+#line 370 "pir.l"
 { return TK_FLAG_OPTIONAL; }
     YY_BREAK
 case 104:
 YY_RULE_SETUP
-#line 370 "pir.l"
+#line 371 "pir.l"
 { return TK_FLAG_OPT_FLAG; }
     YY_BREAK
 case 105:
 YY_RULE_SETUP
-#line 371 "pir.l"
+#line 372 "pir.l"
 { return TK_FLAG_SLURPY; }
     YY_BREAK
 case 106:
 YY_RULE_SETUP
-#line 372 "pir.l"
+#line 373 "pir.l"
 { return TK_FLAG_NAMED; }
     YY_BREAK
 case 107:
 YY_RULE_SETUP
-#line 373 "pir.l"
+#line 374 "pir.l"
 { return TK_FLAG_FLAT; }
     YY_BREAK
 case 108:
 YY_RULE_SETUP
-#line 374 "pir.l"
+#line 375 "pir.l"
 { return TK_FLAG_INVOCANT; }
     YY_BREAK
 case 109:
 YY_RULE_SETUP
-#line 377 "pir.l"
+#line 378 "pir.l"
 { /* copy the string, remove the quotes. */
                     yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext + 1, yyleng - 2);
                     return TK_STRINGC;
@@ -2480,27 +2481,27 @@
     YY_BREAK
 case 110:
 YY_RULE_SETUP
-#line 382 "pir.l"
+#line 383 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_PREG; }
     YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 383 "pir.l"
+#line 384 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_SREG; }
     YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 384 "pir.l"
+#line 385 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_NREG; }
     YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 385 "pir.l"
+#line 386 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_IREG; }
     YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 387 "pir.l"
+#line 388 "pir.l"
 { /* make the label Id available in the parser. remove the ":" first. */
                     yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext, yyleng - 1);
                     return TK_LABEL;
@@ -2508,7 +2509,7 @@
     YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 392 "pir.l"
+#line 393 "pir.l"
 { /* give a warning when using PASM registers as PIR identifiers */
                     lexer_state * const lexer = yypirget_extra(yyscanner);
 
@@ -2523,7 +2524,7 @@
     YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 404 "pir.l"
+#line 405 "pir.l"
 { /* identifier; can be a global (sub or const), local or parrot op */
                     lexer_state * const lexer = yypirget_extra(yyscanner);
                     constant *c = find_global_constant(lexer, yytext);
@@ -2541,32 +2542,32 @@
     YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 419 "pir.l"
+#line 420 "pir.l"
 { yylval->dval = atof(yytext); return TK_NUMC; }
     YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 420 "pir.l"
+#line 421 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 421 "pir.l"
+#line 422 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 422 "pir.l"
+#line 423 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 423 "pir.l"
+#line 424 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 425 "pir.l"
+#line 426 "pir.l"
 { /* XXX some work to be done to disallow $P0 . foo()
                      * spaces should not be allowed.
                      */
@@ -2589,7 +2590,7 @@
 
 
 case YY_STATE_EOF(SCANSTR):
-#line 448 "pir.l"
+#line 449 "pir.l"
 { /* switch back from .macro_const buffer to file. */
                      lexer_state * const lexer = yypirget_extra(yyscanner);
                      yy_pop_state(yyscanner);
@@ -2597,7 +2598,7 @@
                    }
     YY_BREAK
 case YY_STATE_EOF(SCANMACRO):
-#line 454 "pir.l"
+#line 455 "pir.l"
 { /* override the default <<EOF>> action; go back to normal state and
                       * switch back to the saved file.
                       */
@@ -2623,7 +2624,7 @@
     YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 477 "pir.l"
+#line 478 "pir.l"
 { /* when scanning a macro body, the @ marker indicates the {IDENT} must
                           * be munged.
                           */
@@ -2634,14 +2635,14 @@
                        }
     YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 486 "pir.l"
+#line 487 "pir.l"
 { /* end of file, stop scanning. */
                     yyterminate();
                   }
     YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 490 "pir.l"
+#line 491 "pir.l"
 { /* any character not covered in the rules above is an error. */
                     yypirerror(yyscanner, yypirget_extra(yyscanner),
                                "unexpected character: '%c'", yytext[0]);
@@ -2662,7 +2663,7 @@
 
 case 125:
 YY_RULE_SETUP
-#line 512 "pir.l"
+#line 513 "pir.l"
 {
                                yy_push_state(MACROCONST, yyscanner);
                                return TK_MACRO_CONST;
@@ -2670,7 +2671,7 @@
     YY_BREAK
 case 126:
 YY_RULE_SETUP
-#line 517 "pir.l"
+#line 518 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_IDENT;
@@ -2678,7 +2679,7 @@
     YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 522 "pir.l"
+#line 523 "pir.l"
 {
                                /* only these tokens can be macro constant values */
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
@@ -2688,19 +2689,19 @@
     YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 529 "pir.l"
+#line 530 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 530 "pir.l"
+#line 531 "pir.l"
 {
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "unknown character: '%c'", yytext[0]);
                              }
     YY_BREAK
 case YY_STATE_EOF(MACROCONST):
-#line 534 "pir.l"
+#line 535 "pir.l"
 {
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "read end of file during .macro_const definition");
@@ -2713,7 +2714,7 @@
 
 case 130:
 YY_RULE_SETUP
-#line 545 "pir.l"
+#line 546 "pir.l"
 { /* start a macro definition */
                                yy_push_state(MACROHEAD, yyscanner);
                                return TK_MACRO;
@@ -2721,12 +2722,12 @@
     YY_BREAK
 case 131:
 YY_RULE_SETUP
-#line 550 "pir.l"
+#line 551 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 551 "pir.l"
+#line 552 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_IDENT;
@@ -2734,23 +2735,23 @@
     YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 556 "pir.l"
+#line 557 "pir.l"
 { return '('; }
     YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 557 "pir.l"
+#line 558 "pir.l"
 { return ')'; }
     YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 558 "pir.l"
+#line 559 "pir.l"
 { return ','; }
     YY_BREAK
 case 136:
 /* rule 136 can match eol */
 YY_RULE_SETUP
-#line 560 "pir.l"
+#line 561 "pir.l"
 { /* a set of continuous newlines yields a single newline token. */
                                yy_pop_state(yyscanner); /* remove MACROHEAD state */
                                yy_push_state(MACROBODY, yyscanner); /* enter MACROBODY state */
@@ -2768,7 +2769,7 @@
 
 case 137:
 YY_RULE_SETUP
-#line 576 "pir.l"
+#line 577 "pir.l"
 { /* .foo; it can be a macro, macro_local, or just $P0.foo(),
                                 * but we need to check that.
                                 */
@@ -2825,7 +2826,7 @@
     YY_BREAK
 case 138:
 YY_RULE_SETUP
-#line 630 "pir.l"
+#line 631 "pir.l"
 { /* expand a .macro_const or parameter in argument list */
                                lexer_state * const lexer = yypirget_extra(yyscanner);
                                macro_def   * const macro = find_macro(lexer->macros, yytext + 1);
@@ -2856,7 +2857,7 @@
     YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 658 "pir.l"
+#line 659 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_IDENT;
@@ -2864,7 +2865,7 @@
     YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 663 "pir.l"
+#line 664 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_OTHER;
@@ -2872,22 +2873,22 @@
     YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 668 "pir.l"
+#line 669 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 669 "pir.l"
+#line 670 "pir.l"
 { return ','; }
     YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 670 "pir.l"
+#line 671 "pir.l"
 { return '('; }
     YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 671 "pir.l"
+#line 672 "pir.l"
 {
                                yy_pop_state(yyscanner); /* leave MACROEXPAND state */
                                return ')';
@@ -2895,14 +2896,14 @@
     YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 676 "pir.l"
+#line 677 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_OTHER;
                              }
     YY_BREAK
 case YY_STATE_EOF(STRINGEXPAND):
-#line 681 "pir.l"
+#line 682 "pir.l"
 {
                                lexer_state * const lexer = yypirget_extra(yyscanner);
                                yy_pop_state(yyscanner);
@@ -2911,23 +2912,23 @@
     YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 687 "pir.l"
+#line 688 "pir.l"
 { return '{'; }
     YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 688 "pir.l"
+#line 689 "pir.l"
 { return '}'; }
     YY_BREAK
 case 148:
 /* rule 148 can match eol */
 YY_RULE_SETUP
-#line 690 "pir.l"
+#line 691 "pir.l"
 { yylval->sval = "\n"; return TK_NL; }
     YY_BREAK
 case 149:
 YY_RULE_SETUP
-#line 692 "pir.l"
+#line 693 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "unknown character in macro expansion: %c", yytext[0]);
                              }
@@ -2939,7 +2940,7 @@
 
 case 150:
 YY_RULE_SETUP
-#line 703 "pir.l"
+#line 704 "pir.l"
 { /* give a warning if the right flag is set */
                               /*
                               lexer_state * const lexer = yypirget_extra(yyscanner);
@@ -2955,7 +2956,7 @@
     YY_BREAK
 case 151:
 YY_RULE_SETUP
-#line 717 "pir.l"
+#line 718 "pir.l"
 {
                               yy_push_state(MACROLOCAL, yyscanner);
                               return TK_MACRO_LOCAL;
@@ -2963,27 +2964,27 @@
     YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 722 "pir.l"
+#line 723 "pir.l"
 { return TK_INT; }
     YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 723 "pir.l"
+#line 724 "pir.l"
 { return TK_PMC; }
     YY_BREAK
 case 154:
 YY_RULE_SETUP
-#line 724 "pir.l"
+#line 725 "pir.l"
 { return TK_NUM; }
     YY_BREAK
 case 155:
 YY_RULE_SETUP
-#line 725 "pir.l"
+#line 726 "pir.l"
 { return TK_STRING; }
     YY_BREAK
 case 156:
 YY_RULE_SETUP
-#line 727 "pir.l"
+#line 728 "pir.l"
 { /* normal .macro_local */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
                               /* reserve space for {IDENT}, the @ marker and the NULL char. */
@@ -3001,7 +3002,7 @@
     YY_BREAK
 case 157:
 YY_RULE_SETUP
-#line 742 "pir.l"
+#line 743 "pir.l"
 { /* declare a .macro_local based on a parameter */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
 
@@ -3018,7 +3019,7 @@
     YY_BREAK
 case 158:
 YY_RULE_SETUP
-#line 756 "pir.l"
+#line 757 "pir.l"
 { /* .$foo */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
                               macro_table * const table = peek_macro_table(lexer);
@@ -3050,7 +3051,7 @@
     YY_BREAK
 case 159:
 YY_RULE_SETUP
-#line 785 "pir.l"
+#line 786 "pir.l"
 { /* expanding a .macro_local using a macro parameter value */
                              lexer_state * const lexer     = yypirget_extra(yyscanner);
                              char  const * const paramname = dupstrn(lexer, yytext + 1, yyleng - 2);
@@ -3078,13 +3079,13 @@
     YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 810 "pir.l"
+#line 811 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 161:
 /* rule 161 can match eol */
 YY_RULE_SETUP
-#line 812 "pir.l"
+#line 813 "pir.l"
 { /* newline after .macro_local <type> <ident> line */
                               yy_pop_state(yyscanner);
                               return TK_NL;
@@ -3092,7 +3093,7 @@
     YY_BREAK
 case 162:
 YY_RULE_SETUP
-#line 817 "pir.l"
+#line 818 "pir.l"
 { /* this state is only used for declaring .macro_locals */
                               yypirerror(yyscanner, yypirget_extra(yyscanner),
                                  "unknown character '%c' when declaring .macro_local", yytext[0]);
@@ -3105,7 +3106,7 @@
 
 case 163:
 YY_RULE_SETUP
-#line 827 "pir.l"
+#line 828 "pir.l"
 {
                               yy_push_state(MACROLABEL, yyscanner);
                               return TK_MACRO_LABEL;
@@ -3113,7 +3114,7 @@
     YY_BREAK
 case 164:
 YY_RULE_SETUP
-#line 832 "pir.l"
+#line 833 "pir.l"
 { /* if the "$" is there, it's a macro label using a macro
                                * parameter's value; otherwise it's a normal macro label
                                */
@@ -3134,7 +3135,7 @@
 case 165:
 /* rule 165 can match eol */
 YY_RULE_SETUP
-#line 850 "pir.l"
+#line 851 "pir.l"
 { /* the newline character after a ".macro_label $foo:" declaration */
                               yy_pop_state(yyscanner); /* leave MACROLABEL state */
                               return TK_NL;
@@ -3142,7 +3143,7 @@
     YY_BREAK
 case 166:
 YY_RULE_SETUP
-#line 856 "pir.l"
+#line 857 "pir.l"
 { /* scan a label when expanding a buffer; declared as .macro_label */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
                               char const  * const label = dupstrn(lexer, yytext, yyleng - 2);
@@ -3152,7 +3153,7 @@
     YY_BREAK
 case 167:
 YY_RULE_SETUP
-#line 863 "pir.l"
+#line 864 "pir.l"
 { /* scan a label when expanding macro; was a macro parameter */
                              lexer_state * const lexer     = yypirget_extra(yyscanner);
                              char const  * const paramname = dupstrn(lexer, yytext + 1, yyleng - 3);
@@ -3187,12 +3188,12 @@
 case 168:
 /* rule 168 can match eol */
 YY_RULE_SETUP
-#line 896 "pir.l"
+#line 897 "pir.l"
 { store_macro_char(CURRENT_MACRO(yypirget_extra(yyscanner)), '\n'); }
     YY_BREAK
 case 169:
 YY_RULE_SETUP
-#line 898 "pir.l"
+#line 899 "pir.l"
 {
                                yy_pop_state(yyscanner); /* leave MACROBODY state */
                                return TK_ENDM;
@@ -3200,13 +3201,13 @@
     YY_BREAK
 case 170:
 YY_RULE_SETUP
-#line 903 "pir.l"
+#line 904 "pir.l"
 { /* store everything else */
                                store_macro_char(CURRENT_MACRO(yypirget_extra(yyscanner)), yytext[0]);
                              }
     YY_BREAK
 case YY_STATE_EOF(MACROBODY):
-#line 907 "pir.l"
+#line 908 "pir.l"
 { /* catch run-away macro bodys */
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "read end of file while reading macro body");
@@ -3238,67 +3239,67 @@
 
 case 171:
 YY_RULE_SETUP
-#line 939 "pir.l"
+#line 940 "pir.l"
 { return ','; }
     YY_BREAK
 case 172:
 YY_RULE_SETUP
-#line 940 "pir.l"
+#line 941 "pir.l"
 { return '['; }
     YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 941 "pir.l"
+#line 942 "pir.l"
 { return ']'; }
     YY_BREAK
 case 174:
 YY_RULE_SETUP
-#line 943 "pir.l"
+#line 944 "pir.l"
 { return TK_FLAG_MAIN; }
     YY_BREAK
 case 175:
 YY_RULE_SETUP
-#line 944 "pir.l"
+#line 945 "pir.l"
 { return TK_FLAG_LOAD; }
     YY_BREAK
 case 176:
 YY_RULE_SETUP
-#line 945 "pir.l"
+#line 946 "pir.l"
 { return TK_FLAG_INIT; }
     YY_BREAK
 case 177:
 YY_RULE_SETUP
-#line 946 "pir.l"
+#line 947 "pir.l"
 { return TK_FLAG_ANON; }
     YY_BREAK
 case 178:
 YY_RULE_SETUP
-#line 947 "pir.l"
+#line 948 "pir.l"
 { return TK_FLAG_POSTCOMP; }
     YY_BREAK
 case 179:
 YY_RULE_SETUP
-#line 948 "pir.l"
+#line 949 "pir.l"
 { return TK_FLAG_IMMEDIATE; }
     YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 950 "pir.l"
+#line 951 "pir.l"
 { return TK_PCC_SUB; }
     YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 951 "pir.l"
+#line 952 "pir.l"
 { return TK_LEX; }
     YY_BREAK
 case 182:
 YY_RULE_SETUP
-#line 952 "pir.l"
+#line 953 "pir.l"
 { return TK_NAMESPACE; }
     YY_BREAK
 case 183:
 YY_RULE_SETUP
-#line 954 "pir.l"
+#line 955 "pir.l"
 {
                           yy_push_state(MACROHEAD, yyscanner);
                           return TK_MACRO;
@@ -3306,7 +3307,7 @@
     YY_BREAK
 case 184:
 YY_RULE_SETUP
-#line 959 "pir.l"
+#line 960 "pir.l"
 {
                           yy_push_state(MACROCONST, yyscanner);
                           return TK_MACRO_CONST;
@@ -3314,17 +3315,17 @@
     YY_BREAK
 case 185:
 YY_RULE_SETUP
-#line 964 "pir.l"
+#line 965 "pir.l"
 { return TK_LINE; }
     YY_BREAK
 case 186:
 YY_RULE_SETUP
-#line 965 "pir.l"
+#line 966 "pir.l"
 { return TK_FILE; }
     YY_BREAK
 case 187:
 YY_RULE_SETUP
-#line 968 "pir.l"
+#line 969 "pir.l"
 { /* macro expansion in PASM mode. */
                           lexer_state * const lexer = yypirget_extra(yyscanner);
                           macro_def   * const macro = find_macro(lexer->macros, yytext + 1);
@@ -3361,7 +3362,7 @@
     YY_BREAK
 case 188:
 YY_RULE_SETUP
-#line 1002 "pir.l"
+#line 1003 "pir.l"
 { /* a label in PASM */
                           yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext, yyleng - 1);
                           return TK_LABEL;
@@ -3369,34 +3370,34 @@
     YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 1007 "pir.l"
+#line 1008 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                      "symbolic registers are not allowed in PASM mode");
                         }
     YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 1010 "pir.l"
+#line 1011 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_PREG; }
     YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 1011 "pir.l"
+#line 1012 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_NREG; }
     YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 1012 "pir.l"
+#line 1013 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_IREG; }
     YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 1013 "pir.l"
+#line 1014 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_SREG; }
     YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 1015 "pir.l"
+#line 1016 "pir.l"
 { /* can be a parrot op or a label; the check is done in the parser. */
                           yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                           return TK_IDENT;
@@ -3404,32 +3405,32 @@
     YY_BREAK
 case 195:
 YY_RULE_SETUP
-#line 1020 "pir.l"
+#line 1021 "pir.l"
 { yylval->dval = atof(yytext); return TK_NUMC; }
     YY_BREAK
 case 196:
 YY_RULE_SETUP
-#line 1021 "pir.l"
+#line 1022 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 197:
 YY_RULE_SETUP
-#line 1022 "pir.l"
+#line 1023 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 198:
 YY_RULE_SETUP
-#line 1023 "pir.l"
+#line 1024 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 199:
 YY_RULE_SETUP
-#line 1024 "pir.l"
+#line 1025 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 1026 "pir.l"
+#line 1027 "pir.l"
 { /* copy the string, remove the quotes. */
                           yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext + 1, yyleng - 2);
                           return TK_STRINGC;
@@ -3437,32 +3438,32 @@
     YY_BREAK
 case 201:
 YY_RULE_SETUP
-#line 1031 "pir.l"
+#line 1032 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 202:
 /* rule 202 can match eol */
 YY_RULE_SETUP
-#line 1033 "pir.l"
+#line 1034 "pir.l"
 { return TK_NL; }
     YY_BREAK
 case 203:
 YY_RULE_SETUP
-#line 1035 "pir.l"
+#line 1036 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                      "unrecognized character: %c", yytext[0]);
                         }
     YY_BREAK
 case YY_STATE_EOF(PASM):
-#line 1038 "pir.l"
+#line 1039 "pir.l"
 { yyterminate(); }
     YY_BREAK
 case 204:
 YY_RULE_SETUP
-#line 1040 "pir.l"
+#line 1041 "pir.l"
 ECHO;
     YY_BREAK
-#line 3466 "pirlexer.c"
+#line 3467 "pirlexer.c"
 case YY_STATE_EOF(MACROHEAD):
 case YY_STATE_EOF(MACROLOCAL):
 case YY_STATE_EOF(MACROLABEL):
@@ -4716,7 +4717,7 @@
 
 /* %ok-for-header */
 
-#line 1040 "pir.l"
+#line 1041 "pir.l"
 
 
 

Modified: trunk/compilers/pirc/new/pirlexer.h
==============================================================================
--- trunk/compilers/pirc/new/pirlexer.h	(original)
+++ trunk/compilers/pirc/new/pirlexer.h	Wed Dec 31 07:22:45 2008
@@ -492,7 +492,7 @@
 #undef YY_DECL
 #endif
 
-#line 1040 "pir.l"
+#line 1041 "pir.l"
 
 
 #line 499 "pirlexer.h"

Modified: trunk/compilers/pirc/new/pirparser.c
==============================================================================
--- trunk/compilers/pirc/new/pirparser.c	(original)
+++ trunk/compilers/pirc/new/pirparser.c	Wed Dec 31 07:22:45 2008
@@ -378,6 +378,7 @@
 #include "piryy.h"
 #include "pirmacro.h"
 #include "pirpcc.h"
+#include "pirerr.h"
 
 /* #defines to prevent declarations of malloc() and free() in pirparser.h */
 #define YYMALLOC
@@ -566,7 +567,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 235 "pir.y"
+#line 236 "pir.y"
 {
     double              dval;
     int                 ival;
@@ -584,7 +585,7 @@
     struct macro_param *pval;
 }
 /* Line 187 of yacc.c.  */
-#line 588 "pirparser.c"
+#line 589 "pirparser.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -597,7 +598,7 @@
 
 
 /* Line 216 of yacc.c.  */
-#line 601 "pirparser.c"
+#line 602 "pirparser.c"
 
 #ifdef short
 # undef short
@@ -1052,49 +1053,49 @@
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   549,   549,   550,   555,   561,   562,   565,   566,   569,
-     570,   571,   572,   573,   574,   575,   576,   577,   584,   585,
-     588,   592,   598,   605,   606,   609,   610,   613,   617,   618,
-     621,   622,   625,   628,   629,   632,   636,   647,   651,   653,
-     657,   662,   666,   670,   675,   676,   680,   682,   686,   690,
-     696,   700,   704,   705,   708,   709,   712,   714,   716,   718,
-     720,   722,   724,   726,   728,   730,   732,   734,   736,   738,
-     742,   747,   751,   755,   764,   775,   777,   779,   783,   792,
-     793,   806,   810,   815,   816,   820,   821,   822,   825,   832,
-     838,   839,   849,   851,   854,   855,   856,   857,   858,   859,
-     860,   861,   862,   863,   864,   865,   866,   867,   868,   874,
-     877,   882,   883,   888,   889,   892,   894,   902,   910,   911,
-     913,   916,   922,   923,   932,   933,   934,   935,   943,   947,
-     951,   960,   967,   974,   977,   978,   981,   990,   997,  1000,
-    1001,  1004,  1005,  1008,  1044,  1046,  1053,  1055,  1060,  1062,
-    1066,  1089,  1093,  1095,  1104,  1115,  1127,  1137,  1140,  1141,
-    1144,  1153,  1162,  1167,  1172,  1193,  1198,  1239,  1257,  1264,
-    1269,  1280,  1291,  1302,  1313,  1318,  1323,  1328,  1338,  1357,
-    1391,  1393,  1395,  1397,  1399,  1401,  1403,  1405,  1410,  1419,
-    1421,  1423,  1425,  1427,  1429,  1431,  1433,  1435,  1437,  1449,
-    1454,  1456,  1458,  1460,  1462,  1464,  1466,  1468,  1470,  1472,
-    1474,  1476,  1478,  1509,  1535,  1543,  1552,  1561,  1563,  1565,
-    1567,  1569,  1573,  1578,  1580,  1585,  1586,  1589,  1590,  1593,
-    1594,  1597,  1605,  1609,  1611,  1615,  1619,  1620,  1623,  1638,
-    1642,  1643,  1646,  1658,  1659,  1663,  1665,  1669,  1673,  1675,
-    1677,  1683,  1684,  1689,  1690,  1694,  1696,  1705,  1707,  1711,
-    1715,  1717,  1719,  1723,  1724,  1727,  1747,  1754,  1756,  1766,
-    1783,  1785,  1787,  1791,  1800,  1805,  1812,  1813,  1817,  1819,
-    1823,  1825,  1830,  1831,  1835,  1837,  1839,  1841,  1851,  1855,
-    1856,  1857,  1858,  1861,  1866,  1877,  1884,  1889,  1890,  1894,
-    1896,  1900,  1901,  1904,  1908,  1912,  1916,  1925,  1935,  1936,
-    1941,  1943,  1948,  1953,  1954,  1958,  1960,  1964,  1970,  1971,
-    1975,  1977,  1985,  1986,  1990,  1994,  1997,  1998,  2001,  2005,
-    2009,  2011,  2013,  2015,  2023,  2024,  2028,  2029,  2030,  2031,
-    2034,  2035,  2036,  2037,  2038,  2039,  2042,  2043,  2044,  2045,
-    2053,  2056,  2057,  2068,  2069,  2070,  2071,  2075,  2076,  2079,
-    2080,  2081,  2082,  2083,  2084,  2085,  2086,  2089,  2090,  2091,
-    2094,  2095,  2096,  2097,  2098,  2099,  2100,  2101,  2102,  2103,
-    2104,  2105,  2106,  2107,  2108,  2109,  2110,  2111,  2112,  2113,
-    2114,  2115,  2116,  2122,  2123,  2124,  2125,  2126,  2127,  2128,
-    2129,  2130,  2131,  2132,  2133,  2145,  2153,  2157,  2158,  2161,
-    2162,  2163,  2164,  2165,  2166,  2169,  2171,  2172,  2175,  2176,
-    2179,  2183,  2188
+       0,   550,   550,   551,   556,   562,   563,   566,   567,   570,
+     571,   572,   573,   574,   575,   576,   577,   578,   585,   586,
+     589,   593,   599,   606,   607,   610,   611,   614,   618,   619,
+     622,   623,   626,   629,   630,   633,   637,   648,   652,   654,
+     658,   663,   667,   671,   676,   677,   681,   683,   687,   691,
+     697,   701,   705,   706,   709,   710,   713,   715,   717,   719,
+     721,   723,   725,   727,   729,   731,   733,   735,   737,   739,
+     743,   748,   752,   756,   765,   776,   778,   780,   784,   793,
+     794,   807,   811,   816,   817,   821,   822,   823,   826,   833,
+     839,   840,   850,   852,   855,   856,   857,   858,   859,   860,
+     861,   862,   863,   864,   865,   866,   867,   868,   869,   875,
+     878,   883,   884,   889,   890,   893,   895,   903,   911,   912,
+     914,   917,   923,   924,   933,   934,   935,   936,   944,   948,
+     952,   961,   968,   975,   978,   979,   982,   991,   998,  1001,
+    1002,  1005,  1006,  1009,  1045,  1047,  1054,  1056,  1061,  1063,
+    1067,  1090,  1094,  1096,  1105,  1116,  1128,  1138,  1141,  1142,
+    1145,  1154,  1163,  1168,  1173,  1194,  1199,  1240,  1258,  1265,
+    1270,  1281,  1292,  1303,  1314,  1319,  1324,  1329,  1339,  1358,
+    1392,  1394,  1396,  1398,  1400,  1402,  1404,  1406,  1411,  1420,
+    1422,  1424,  1426,  1428,  1430,  1432,  1434,  1436,  1438,  1450,
+    1455,  1457,  1459,  1461,  1463,  1465,  1467,  1469,  1471,  1473,
+    1475,  1477,  1479,  1510,  1536,  1544,  1553,  1562,  1564,  1566,
+    1568,  1570,  1574,  1579,  1581,  1586,  1587,  1590,  1591,  1594,
+    1595,  1598,  1606,  1610,  1612,  1616,  1620,  1621,  1624,  1639,
+    1643,  1644,  1647,  1659,  1660,  1664,  1666,  1670,  1674,  1676,
+    1678,  1684,  1685,  1690,  1691,  1695,  1697,  1706,  1708,  1712,
+    1716,  1718,  1720,  1724,  1725,  1728,  1748,  1755,  1757,  1767,
+    1784,  1786,  1788,  1792,  1801,  1806,  1813,  1814,  1818,  1820,
+    1824,  1826,  1831,  1832,  1836,  1838,  1840,  1842,  1852,  1856,
+    1857,  1858,  1859,  1862,  1867,  1878,  1885,  1890,  1891,  1895,
+    1897,  1901,  1902,  1905,  1909,  1913,  1917,  1926,  1936,  1937,
+    1942,  1944,  1949,  1954,  1955,  1959,  1961,  1965,  1971,  1972,
+    1976,  1978,  1986,  1987,  1991,  1995,  1998,  1999,  2002,  2006,
+    2010,  2012,  2014,  2016,  2024,  2025,  2029,  2030,  2031,  2032,
+    2035,  2036,  2037,  2038,  2039,  2040,  2043,  2044,  2045,  2046,
+    2054,  2057,  2058,  2069,  2070,  2071,  2072,  2076,  2077,  2080,
+    2081,  2082,  2083,  2084,  2085,  2086,  2087,  2090,  2091,  2092,
+    2095,  2096,  2097,  2098,  2099,  2100,  2101,  2102,  2103,  2104,
+    2105,  2106,  2107,  2108,  2109,  2110,  2111,  2112,  2113,  2114,
+    2115,  2116,  2117,  2123,  2124,  2125,  2126,  2127,  2128,  2129,
+    2130,  2131,  2132,  2133,  2134,  2146,  2154,  2158,  2159,  2162,
+    2163,  2164,  2165,  2166,  2167,  2170,  2172,  2173,  2176,  2177,
+    2180,  2184,  2189
 };
 #endif
 
@@ -2605,22 +2606,22 @@
   switch (yyn)
     {
         case 4:
-#line 558 "pir.y"
+#line 559 "pir.y"
     { fixup_global_labels(lexer); ;}
     break;
 
   case 20:
-#line 589 "pir.y"
+#line 590 "pir.y"
     { new_macro_const(lexer->macros, (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].sval), yypirget_lineno(yyscanner)); ;}
     break;
 
   case 21:
-#line 595 "pir.y"
+#line 596 "pir.y"
     { /* fprintf(stderr, "macro body: [%s]\n", CURRENT_MACRO(lexer)->body);*/ ;}
     break;
 
   case 22:
-#line 599 "pir.y"
+#line 600 "pir.y"
     {
                           new_macro(lexer->macros, (yyvsp[(2) - (2)].sval), yypirget_lineno(yyscanner), TRUE,
                                     lexer->macro_size);
@@ -2628,17 +2629,17 @@
     break;
 
   case 27:
-#line 614 "pir.y"
+#line 615 "pir.y"
     { add_macro_param(CURRENT_MACRO(lexer), (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 35:
-#line 633 "pir.y"
+#line 634 "pir.y"
     { store_macro_string(CURRENT_MACRO(lexer), "%s\n", (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 36:
-#line 637 "pir.y"
+#line 638 "pir.y"
     {
                           store_macro_string(CURRENT_MACRO(lexer), ".local %s %s\n",
                                              pir_type_names[(yyvsp[(2) - (3)].ival)], (yyvsp[(3) - (3)].sval));
@@ -2646,147 +2647,147 @@
     break;
 
   case 37:
-#line 648 "pir.y"
+#line 649 "pir.y"
     { load_library(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 38:
-#line 652 "pir.y"
+#line 653 "pir.y"
     { yypirset_lineno ((yyvsp[(2) - (2)].ival), yyscanner); ;}
     break;
 
   case 39:
-#line 654 "pir.y"
+#line 655 "pir.y"
     { lexer->filename = (yyvsp[(2) - (2)].sval); ;}
     break;
 
   case 41:
-#line 663 "pir.y"
+#line 664 "pir.y"
     { set_hll(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 42:
-#line 667 "pir.y"
+#line 668 "pir.y"
     { set_hll_map(lexer, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 43:
-#line 671 "pir.y"
+#line 672 "pir.y"
     { set_namespace(lexer, (yyvsp[(3) - (4)].key)); ;}
     break;
 
   case 44:
-#line 675 "pir.y"
+#line 676 "pir.y"
     { (yyval.key) = NULL; ;}
     break;
 
   case 45:
-#line 677 "pir.y"
+#line 678 "pir.y"
     { (yyval.key) = (yyvsp[(1) - (1)].key); ;}
     break;
 
   case 46:
-#line 681 "pir.y"
+#line 682 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 47:
-#line 683 "pir.y"
+#line 684 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 48:
-#line 687 "pir.y"
+#line 688 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval))); ;}
     break;
 
   case 50:
-#line 697 "pir.y"
+#line 698 "pir.y"
     { close_sub(lexer); ;}
     break;
 
   case 51:
-#line 701 "pir.y"
+#line 702 "pir.y"
     { new_subr(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 56:
-#line 713 "pir.y"
+#line 714 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_ANON);;}
     break;
 
   case 57:
-#line 715 "pir.y"
+#line 716 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_INIT); ;}
     break;
 
   case 58:
-#line 717 "pir.y"
+#line 718 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LOAD); ;}
     break;
 
   case 59:
-#line 719 "pir.y"
+#line 720 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MAIN); ;}
     break;
 
   case 60:
-#line 721 "pir.y"
+#line 722 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LEX); ;}
     break;
 
   case 61:
-#line 723 "pir.y"
+#line 724 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_POSTCOMP); ;}
     break;
 
   case 62:
-#line 725 "pir.y"
+#line 726 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_IMMEDIATE); ;}
     break;
 
   case 63:
-#line 727 "pir.y"
+#line 728 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MULTI); ;}
     break;
 
   case 64:
-#line 729 "pir.y"
+#line 730 "pir.y"
     { set_sub_outer(lexer, (yyvsp[(3) - (4)].sval)); ;}
     break;
 
   case 65:
-#line 731 "pir.y"
+#line 732 "pir.y"
     { set_sub_methodname(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 66:
-#line 733 "pir.y"
+#line 734 "pir.y"
     { set_sub_vtable(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 67:
-#line 735 "pir.y"
+#line 736 "pir.y"
     { set_sub_subid(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 68:
-#line 737 "pir.y"
+#line 738 "pir.y"
     { set_sub_instanceof(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 69:
-#line 739 "pir.y"
+#line 740 "pir.y"
     { set_sub_nsentry(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 70:
-#line 743 "pir.y"
+#line 744 "pir.y"
     { set_sub_multi_types(lexer, (yyvsp[(2) - (3)].expr)); ;}
     break;
 
   case 71:
-#line 747 "pir.y"
+#line 748 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 1;
                           /* n=1 means :multi() -- without any types. */
@@ -2794,12 +2795,12 @@
     break;
 
   case 72:
-#line 752 "pir.y"
+#line 753 "pir.y"
     { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
     break;
 
   case 73:
-#line 756 "pir.y"
+#line 757 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 2;
                           /* start counting multi types; always 1 higher than actual number
@@ -2811,7 +2812,7 @@
     break;
 
   case 74:
-#line 765 "pir.y"
+#line 766 "pir.y"
     {
                           ++CURRENT_SUB(lexer)->info.num_multi_types;
                           /* link the multi types in reverse other. That's fine,
@@ -2823,22 +2824,22 @@
     break;
 
   case 75:
-#line 776 "pir.y"
+#line 777 "pir.y"
     { (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 76:
-#line 778 "pir.y"
+#line 779 "pir.y"
     { (yyval.expr) = expr_from_string(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 77:
-#line 780 "pir.y"
+#line 781 "pir.y"
     { (yyval.expr) = expr_from_key(lexer, (yyvsp[(1) - (1)].key)); ;}
     break;
 
   case 78:
-#line 784 "pir.y"
+#line 785 "pir.y"
     {
                            /* if there are parameters, then emit a get_params instruction. */
                            if ((yyvsp[(1) - (1)].uval) > 0)
@@ -2847,12 +2848,12 @@
     break;
 
   case 79:
-#line 792 "pir.y"
+#line 793 "pir.y"
     { (yyval.uval) = 0; ;}
     break;
 
   case 80:
-#line 794 "pir.y"
+#line 795 "pir.y"
     {
                           /* if the :named flag was set, there's an extra
                            * constant string argument for the name. count that too.
@@ -2866,27 +2867,27 @@
     break;
 
   case 81:
-#line 807 "pir.y"
+#line 808 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(2) - (4)].targ), (yyvsp[(3) - (4)].ival)); ;}
     break;
 
   case 82:
-#line 811 "pir.y"
+#line 812 "pir.y"
     { (yyval.targ) = add_param(lexer, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 83:
-#line 815 "pir.y"
+#line 816 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 84:
-#line 817 "pir.y"
+#line 818 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 88:
-#line 826 "pir.y"
+#line 827 "pir.y"
     { (yyval.ival) = TARGET_FLAG_INVOCANT;
                            /* XXX handle multi_type */
 
@@ -2894,12 +2895,12 @@
     break;
 
   case 89:
-#line 833 "pir.y"
+#line 834 "pir.y"
     { (yyval.ival) = TARGET_FLAG_UNIQUE_REG; ;}
     break;
 
   case 91:
-#line 840 "pir.y"
+#line 841 "pir.y"
     {
                          ++lexer->stmt_counter;
                          /* increment the logical statement counter; a statement can be
@@ -2910,37 +2911,37 @@
     break;
 
   case 92:
-#line 850 "pir.y"
+#line 851 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 110:
-#line 878 "pir.y"
+#line 879 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (3)].mval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
   case 111:
-#line 882 "pir.y"
+#line 883 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 112:
-#line 884 "pir.y"
+#line 885 "pir.y"
     { (yyval.pval) = (yyvsp[(2) - (3)].pval); ;}
     break;
 
   case 113:
-#line 888 "pir.y"
+#line 889 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 115:
-#line 893 "pir.y"
+#line 894 "pir.y"
     { (yyval.pval) = new_macro_param((yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 116:
-#line 895 "pir.y"
+#line 896 "pir.y"
     {
                           macro_param *param = new_macro_param((yyvsp[(3) - (3)].sval));
                           param->next = (yyvsp[(1) - (3)].pval);
@@ -2949,7 +2950,7 @@
     break;
 
   case 117:
-#line 903 "pir.y"
+#line 904 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                           if (sym == NULL) {
@@ -2960,22 +2961,22 @@
     break;
 
   case 119:
-#line 912 "pir.y"
+#line 913 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 121:
-#line 917 "pir.y"
+#line 918 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 122:
-#line 922 "pir.y"
+#line 923 "pir.y"
     { (yyval.sval) = ""; ;}
     break;
 
   case 123:
-#line 924 "pir.y"
+#line 925 "pir.y"
     { /* XXX cleanup memory stuff */
                           char *newbuff = (char *)mem_sys_allocate((strlen((yyvsp[(1) - (2)].sval)) + strlen((yyvsp[(2) - (2)].sval)) + 2)
                                                                    * sizeof (char));
@@ -2985,17 +2986,17 @@
     break;
 
   case 127:
-#line 936 "pir.y"
+#line 937 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 128:
-#line 944 "pir.y"
+#line 945 "pir.y"
     { set_instr(lexer, NULL); ;}
     break;
 
   case 130:
-#line 952 "pir.y"
+#line 953 "pir.y"
     {
                            if (lexer->parse_errors > MAX_NUM_ERRORS)
                                panic(lexer, "Too many errors. Compilation aborted.\n");
@@ -3005,7 +3006,7 @@
     break;
 
   case 131:
-#line 961 "pir.y"
+#line 962 "pir.y"
     {
                            set_instrf(lexer, "null", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3013,7 +3014,7 @@
     break;
 
   case 132:
-#line 968 "pir.y"
+#line 969 "pir.y"
     {
                            set_instrf(lexer, "get_results", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3021,7 +3022,7 @@
     break;
 
   case 136:
-#line 982 "pir.y"
+#line 983 "pir.y"
     { /* at this point, TK_IDENT may in fact be a symbol identifier,
                             * not an op, so don't do any checks like is_parrot_op() just yet.
                             */
@@ -3031,7 +3032,7 @@
     break;
 
   case 137:
-#line 991 "pir.y"
+#line 992 "pir.y"
     { /* when this rule is activated, the initial identifier must
                            * be a parrot op.
                            */
@@ -3041,7 +3042,7 @@
     break;
 
   case 143:
-#line 1009 "pir.y"
+#line 1010 "pir.y"
     {
                          /* the "instruction" that was set now appears to be
                           * an identifier; get the name, and check its type.
@@ -3078,22 +3079,22 @@
     break;
 
   case 144:
-#line 1045 "pir.y"
+#line 1046 "pir.y"
     { push_operand(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 145:
-#line 1050 "pir.y"
+#line 1051 "pir.y"
     { push_operand(lexer, expr_from_key(lexer, (yyvsp[(1) - (1)].key))); ;}
     break;
 
   case 146:
-#line 1054 "pir.y"
+#line 1055 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 147:
-#line 1056 "pir.y"
+#line 1057 "pir.y"
     { /* this is either a LABEL or a symbol; in the latter case, the type
                             * will be filled in later. */
                            (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval));
@@ -3101,17 +3102,17 @@
     break;
 
   case 148:
-#line 1061 "pir.y"
+#line 1062 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 149:
-#line 1063 "pir.y"
+#line 1064 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 150:
-#line 1067 "pir.y"
+#line 1068 "pir.y"
     {
                            /* if $1 is a register, just return that */
                            if (TEST_FLAG((yyvsp[(1) - (2)].targ)->flags, TARGET_FLAG_IS_REG))
@@ -3135,22 +3136,22 @@
     break;
 
   case 151:
-#line 1090 "pir.y"
+#line 1091 "pir.y"
     { (yyval.key) = (yyvsp[(2) - (3)].key); ;}
     break;
 
   case 152:
-#line 1094 "pir.y"
+#line 1095 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 153:
-#line 1096 "pir.y"
+#line 1097 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 154:
-#line 1105 "pir.y"
+#line 1106 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (6)].expr));
@@ -3164,7 +3165,7 @@
     break;
 
   case 155:
-#line 1116 "pir.y"
+#line 1117 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (4)].expr));
@@ -3179,7 +3180,7 @@
     break;
 
   case 156:
-#line 1128 "pir.y"
+#line 1129 "pir.y"
     { /* XXX create a PMC const for $4 */
                           unshift_operand(lexer, expr_from_key(lexer, (yyvsp[(4) - (6)].key)));
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (6)].targ)));
@@ -3190,7 +3191,7 @@
     break;
 
   case 160:
-#line 1145 "pir.y"
+#line 1146 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3202,7 +3203,7 @@
     break;
 
   case 161:
-#line 1154 "pir.y"
+#line 1155 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 0.0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3214,7 +3215,7 @@
     break;
 
   case 162:
-#line 1163 "pir.y"
+#line 1164 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%s", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].sval));
                           get_opinfo(yyscanner);
@@ -3222,7 +3223,7 @@
     break;
 
   case 163:
-#line 1168 "pir.y"
+#line 1169 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3230,7 +3231,7 @@
     break;
 
   case 164:
-#line 1173 "pir.y"
+#line 1174 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (3)].sval));
                           if (sym) {
@@ -3254,7 +3255,7 @@
     break;
 
   case 165:
-#line 1194 "pir.y"
+#line 1195 "pir.y"
     {
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (3)].targ)));
                           get_opinfo(yyscanner);
@@ -3262,7 +3263,7 @@
     break;
 
   case 166:
-#line 1199 "pir.y"
+#line 1200 "pir.y"
     {
                           /*   $P0 = foo ["bar"]
                            *
@@ -3306,7 +3307,7 @@
     break;
 
   case 167:
-#line 1240 "pir.y"
+#line 1241 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (4)].sval));
                           target *t;
@@ -3327,7 +3328,7 @@
     break;
 
   case 168:
-#line 1258 "pir.y"
+#line 1259 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (4)].ival));
                           set_target_key(preg, (yyvsp[(4) - (4)].key));
@@ -3337,7 +3338,7 @@
     break;
 
   case 169:
-#line 1265 "pir.y"
+#line 1266 "pir.y"
     {
                           set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%E", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].expr));
                           get_opinfo(yyscanner);
@@ -3345,7 +3346,7 @@
     break;
 
   case 170:
-#line 1270 "pir.y"
+#line 1271 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3359,7 +3360,7 @@
     break;
 
   case 171:
-#line 1281 "pir.y"
+#line 1282 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3373,7 +3374,7 @@
     break;
 
   case 172:
-#line 1292 "pir.y"
+#line 1293 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3387,7 +3388,7 @@
     break;
 
   case 173:
-#line 1303 "pir.y"
+#line 1304 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3401,7 +3402,7 @@
     break;
 
   case 174:
-#line 1314 "pir.y"
+#line 1315 "pir.y"
     {
                           set_instrf(lexer, "add", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3409,7 +3410,7 @@
     break;
 
   case 175:
-#line 1319 "pir.y"
+#line 1320 "pir.y"
     {
                           set_instrf(lexer, "sub", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3417,7 +3418,7 @@
     break;
 
   case 176:
-#line 1324 "pir.y"
+#line 1325 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(3) - (4)].sval), "%T%E", (yyvsp[(1) - (4)].targ), (yyvsp[(4) - (4)].expr));
                           get_opinfo(yyscanner);
@@ -3425,7 +3426,7 @@
     break;
 
   case 177:
-#line 1329 "pir.y"
+#line 1330 "pir.y"
     {
                           if (targets_equal((yyvsp[(1) - (5)].targ), (yyvsp[(3) - (5)].targ))) /* $P0 = $P0 + $P1 ==> $P0 += $P1 */
                               set_instrf(lexer, opnames[(yyvsp[(4) - (5)].ival)], "%T%E", (yyvsp[(1) - (5)].targ), (yyvsp[(5) - (5)].expr));
@@ -3438,7 +3439,7 @@
     break;
 
   case 178:
-#line 1339 "pir.y"
+#line 1340 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (4)].sval));
                           target *t;
@@ -3460,7 +3461,7 @@
     break;
 
   case 179:
-#line 1358 "pir.y"
+#line 1359 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (4)].ival));
                           set_target_key(preg, (yyvsp[(2) - (4)].key));
@@ -3470,97 +3471,97 @@
     break;
 
   case 180:
-#line 1392 "pir.y"
+#line 1393 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%i%T", (yyvsp[(1) - (3)].ival), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 181:
-#line 1394 "pir.y"
+#line 1395 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%n%T", (yyvsp[(1) - (3)].dval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 182:
-#line 1396 "pir.y"
+#line 1397 "pir.y"
     { set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%s%T", (yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 183:
-#line 1398 "pir.y"
+#line 1399 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_s_s(yyscanner, (yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval))); ;}
     break;
 
   case 184:
-#line 1400 "pir.y"
+#line 1401 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_i(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 185:
-#line 1402 "pir.y"
+#line 1403 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_n(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 186:
-#line 1404 "pir.y"
+#line 1405 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_i_n(yyscanner, (yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval))); ;}
     break;
 
   case 187:
-#line 1406 "pir.y"
+#line 1407 "pir.y"
     { set_instrf(lexer, "set", "%C", fold_n_i(yyscanner, (yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival))); ;}
     break;
 
   case 188:
-#line 1411 "pir.y"
+#line 1412 "pir.y"
     { get_opinfo(yyscanner); ;}
     break;
 
   case 189:
-#line 1420 "pir.y"
+#line 1421 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, (yyvsp[(3) - (5)].sval), (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 190:
-#line 1422 "pir.y"
+#line 1423 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "int", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 191:
-#line 1424 "pir.y"
+#line 1425 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "num", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 192:
-#line 1426 "pir.y"
+#line 1427 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "pmc", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 193:
-#line 1428 "pir.y"
+#line 1429 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "string", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 194:
-#line 1430 "pir.y"
+#line 1431 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "if", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 195:
-#line 1432 "pir.y"
+#line 1433 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "unless", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 196:
-#line 1434 "pir.y"
+#line 1435 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "goto", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 197:
-#line 1436 "pir.y"
+#line 1437 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (5)].ival), 1, "null", (yyvsp[(5) - (5)].sval)); ;}
     break;
 
   case 198:
-#line 1438 "pir.y"
+#line 1439 "pir.y"
     {
                           int istrue = evaluate_c(lexer, (yyvsp[(2) - (4)].cval));
                           /* if "unless", invert the true-ness */
@@ -3575,7 +3576,7 @@
     break;
 
   case 199:
-#line 1450 "pir.y"
+#line 1451 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(1) - (5)].ival) ? "unless_null" : "if_null", "%T%I",
                                      new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (5)].ival)), (yyvsp[(5) - (5)].sval));
@@ -3583,67 +3584,67 @@
     break;
 
   case 200:
-#line 1455 "pir.y"
+#line 1456 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 201:
-#line 1457 "pir.y"
+#line 1458 "pir.y"
     { set_instrf(lexer, (yyvsp[(1) - (4)].ival) ? "unless" : "if", "%T%I", (yyvsp[(2) - (4)].targ), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 202:
-#line 1459 "pir.y"
+#line 1460 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "int", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 203:
-#line 1461 "pir.y"
+#line 1462 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "num", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 204:
-#line 1463 "pir.y"
+#line 1464 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "pmc", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 205:
-#line 1465 "pir.y"
+#line 1466 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "string", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 206:
-#line 1467 "pir.y"
+#line 1468 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "if", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 207:
-#line 1469 "pir.y"
+#line 1470 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "unless", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 208:
-#line 1471 "pir.y"
+#line 1472 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 209:
-#line 1473 "pir.y"
+#line 1474 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "goto", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 210:
-#line 1475 "pir.y"
+#line 1476 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 211:
-#line 1477 "pir.y"
+#line 1478 "pir.y"
     { create_if_instr(yyscanner, lexer, (yyvsp[(1) - (4)].ival), 0, "null", (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 212:
-#line 1479 "pir.y"
+#line 1480 "pir.y"
     {
                           if ((yyvsp[(2) - (4)].ival) == COMPUTE_DURING_RUNTIME) {
                              if ((yyvsp[(1) - (4)].ival) == NEED_INVERT_OPNAME) /* "unless" */
@@ -3671,7 +3672,7 @@
     break;
 
   case 213:
-#line 1510 "pir.y"
+#line 1511 "pir.y"
     {
                           /* the instructions "gt" and "ge" are converted to "lt" and "le".
                            * if so, then the arguments must be reversed as well. "lt" and
@@ -3700,7 +3701,7 @@
     break;
 
   case 214:
-#line 1536 "pir.y"
+#line 1537 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%i", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].ival));
@@ -3711,7 +3712,7 @@
     break;
 
   case 215:
-#line 1544 "pir.y"
+#line 1545 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival) + 1], "%T%n", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].dval));
@@ -3723,7 +3724,7 @@
     break;
 
   case 216:
-#line 1553 "pir.y"
+#line 1554 "pir.y"
     {
                           if (((yyvsp[(0) - (3)].ival) != NEED_INVERT_OPNAME) && ((yyvsp[(2) - (3)].ival) == OP_GE || (yyvsp[(2) - (3)].ival) == OP_GT))
                               set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%s", (yyvsp[(3) - (3)].targ), (yyvsp[(1) - (3)].sval));
@@ -3735,32 +3736,32 @@
     break;
 
   case 217:
-#line 1562 "pir.y"
+#line 1563 "pir.y"
     { (yyval.ival) = evaluate_i_i((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 218:
-#line 1564 "pir.y"
+#line 1565 "pir.y"
     { (yyval.ival) = evaluate_i_n((yyvsp[(1) - (3)].ival), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 219:
-#line 1566 "pir.y"
+#line 1567 "pir.y"
     { (yyval.ival) = evaluate_n_i((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].ival)); ;}
     break;
 
   case 220:
-#line 1568 "pir.y"
+#line 1569 "pir.y"
     { (yyval.ival) = evaluate_n_n((yyvsp[(1) - (3)].dval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].dval)); ;}
     break;
 
   case 221:
-#line 1570 "pir.y"
+#line 1571 "pir.y"
     { (yyval.ival) = evaluate_s_s((yyvsp[(1) - (3)].sval), (yyvsp[(2) - (3)].ival), (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 222:
-#line 1574 "pir.y"
+#line 1575 "pir.y"
     {
                           yypirerror(yyscanner, lexer, "cannot compare string to %s",
                                      (yyvsp[(3) - (3)].ival) == INT_TYPE ? "integer" : "number");
@@ -3768,37 +3769,37 @@
     break;
 
   case 223:
-#line 1579 "pir.y"
+#line 1580 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare integer to string"); ;}
     break;
 
   case 224:
-#line 1581 "pir.y"
+#line 1582 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare number to string"); ;}
     break;
 
   case 225:
-#line 1585 "pir.y"
+#line 1586 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 226:
-#line 1586 "pir.y"
+#line 1587 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 227:
-#line 1589 "pir.y"
+#line 1590 "pir.y"
     { (yyval.ival) = DONT_INVERT_OPNAME; /* no need to invert */ ;}
     break;
 
   case 228:
-#line 1590 "pir.y"
+#line 1591 "pir.y"
     { (yyval.ival) = NEED_INVERT_OPNAME; /* yes, invert opname */ ;}
     break;
 
   case 231:
-#line 1598 "pir.y"
+#line 1599 "pir.y"
     {
                           set_instrf(lexer, "branch", "%I", (yyvsp[(2) - (3)].sval));
                           set_op_labelflag(lexer, BIT(0)); /* bit 0 means: "1 << 0" */
@@ -3807,37 +3808,37 @@
     break;
 
   case 232:
-#line 1606 "pir.y"
+#line 1607 "pir.y"
     { declare_local(lexer, (yyvsp[(2) - (4)].ival), (yyvsp[(3) - (4)].symb)); ;}
     break;
 
   case 233:
-#line 1610 "pir.y"
+#line 1611 "pir.y"
     { (yyval.symb) = (yyvsp[(1) - (1)].symb); ;}
     break;
 
   case 234:
-#line 1612 "pir.y"
+#line 1613 "pir.y"
     { (yyval.symb) = add_local((yyvsp[(1) - (3)].symb), (yyvsp[(3) - (3)].symb)); ;}
     break;
 
   case 235:
-#line 1616 "pir.y"
+#line 1617 "pir.y"
     { (yyval.symb) = new_local(lexer, (yyvsp[(1) - (2)].sval), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 236:
-#line 1619 "pir.y"
+#line 1620 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 237:
-#line 1620 "pir.y"
+#line 1621 "pir.y"
     { (yyval.ival) = 1; ;}
     break;
 
   case 238:
-#line 1624 "pir.y"
+#line 1625 "pir.y"
     { /* if $4 is not a register, it must be a declared symbol */
                           if (!TEST_FLAG((yyvsp[(4) - (5)].targ)->flags, TARGET_FLAG_IS_REG)) {
 
@@ -3850,12 +3851,12 @@
     break;
 
   case 239:
-#line 1639 "pir.y"
+#line 1640 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 242:
-#line 1651 "pir.y"
+#line 1652 "pir.y"
     { /* $4 contains an invocation object */
                               set_invocation_args(lexer, (yyvsp[(4) - (8)].invo), (yyvsp[(3) - (8)].argm));
                               (yyval.invo) = set_invocation_results(lexer, (yyvsp[(4) - (8)].invo), (yyvsp[(6) - (8)].targ));
@@ -3863,72 +3864,72 @@
     break;
 
   case 243:
-#line 1658 "pir.y"
+#line 1659 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 244:
-#line 1660 "pir.y"
+#line 1661 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 245:
-#line 1664 "pir.y"
+#line 1665 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 246:
-#line 1666 "pir.y"
+#line 1667 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 247:
-#line 1670 "pir.y"
+#line 1671 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 248:
-#line 1674 "pir.y"
+#line 1675 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(2) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 249:
-#line 1676 "pir.y"
+#line 1677 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_NCI, (yyvsp[(2) - (2)].targ)); ;}
     break;
 
   case 250:
-#line 1679 "pir.y"
+#line 1680 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_METHOD, (yyvsp[(2) - (5)].targ), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 251:
-#line 1683 "pir.y"
+#line 1684 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 252:
-#line 1685 "pir.y"
+#line 1686 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (2)].targ); ;}
     break;
 
   case 253:
-#line 1689 "pir.y"
+#line 1690 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 254:
-#line 1691 "pir.y"
+#line 1692 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 255:
-#line 1695 "pir.y"
+#line 1696 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 256:
-#line 1697 "pir.y"
+#line 1698 "pir.y"
     {
                              if ((yyvsp[(2) - (2)].targ))
                                  (yyval.targ) = add_target(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].targ));
@@ -3938,32 +3939,32 @@
     break;
 
   case 257:
-#line 1706 "pir.y"
+#line 1707 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 258:
-#line 1708 "pir.y"
+#line 1709 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 260:
-#line 1716 "pir.y"
+#line 1717 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 261:
-#line 1718 "pir.y"
+#line 1719 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 262:
-#line 1720 "pir.y"
+#line 1721 "pir.y"
     {  (yyval.invo) = set_invocation_results(lexer, (yyvsp[(1) - (1)].invo), NULL); ;}
     break;
 
   case 265:
-#line 1728 "pir.y"
+#line 1729 "pir.y"
     {
                              /* if $1 is not a register, check whether the symbol was declared */
                              if (!TEST_FLAG((yyvsp[(1) - (4)].targ)->flags, TARGET_FLAG_IS_REG)) {
@@ -3984,7 +3985,7 @@
     break;
 
   case 266:
-#line 1748 "pir.y"
+#line 1749 "pir.y"
     {
                              (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(1) - (2)].targ), NULL);
                              set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (2)].argm));
@@ -3992,12 +3993,12 @@
     break;
 
   case 267:
-#line 1755 "pir.y"
+#line 1756 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 268:
-#line 1757 "pir.y"
+#line 1758 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4008,7 +4009,7 @@
     break;
 
   case 269:
-#line 1767 "pir.y"
+#line 1768 "pir.y"
     { /* check that this identifier was declared */
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
 
@@ -4028,22 +4029,22 @@
     break;
 
   case 270:
-#line 1784 "pir.y"
+#line 1785 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 271:
-#line 1786 "pir.y"
+#line 1787 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival))); ;}
     break;
 
   case 272:
-#line 1788 "pir.y"
+#line 1789 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval))); ;}
     break;
 
   case 273:
-#line 1792 "pir.y"
+#line 1793 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4055,74 +4056,74 @@
     break;
 
   case 274:
-#line 1801 "pir.y"
+#line 1802 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 275:
-#line 1806 "pir.y"
+#line 1807 "pir.y"
     {
                              (yyval.targ) = (yyvsp[(2) - (3)].targ);
                            ;}
     break;
 
   case 276:
-#line 1812 "pir.y"
+#line 1813 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 277:
-#line 1814 "pir.y"
+#line 1815 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 278:
-#line 1818 "pir.y"
+#line 1819 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 279:
-#line 1820 "pir.y"
+#line 1821 "pir.y"
     { (yyval.targ) = add_target(lexer, (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 280:
-#line 1824 "pir.y"
+#line 1825 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 281:
-#line 1826 "pir.y"
+#line 1827 "pir.y"
     { (yyval.targ) = set_param_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 282:
-#line 1830 "pir.y"
+#line 1831 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 283:
-#line 1832 "pir.y"
+#line 1833 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 284:
-#line 1836 "pir.y"
+#line 1837 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPTIONAL; ;}
     break;
 
   case 285:
-#line 1838 "pir.y"
+#line 1839 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPT_FLAG; ;}
     break;
 
   case 286:
-#line 1840 "pir.y"
+#line 1841 "pir.y"
     { (yyval.ival) = TARGET_FLAG_SLURPY; ;}
     break;
 
   case 287:
-#line 1842 "pir.y"
+#line 1843 "pir.y"
     {
                              (yyval.ival) = TARGET_FLAG_NAMED;
                              set_param_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4130,12 +4131,12 @@
     break;
 
   case 288:
-#line 1852 "pir.y"
+#line 1853 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 293:
-#line 1862 "pir.y"
+#line 1863 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4143,7 +4144,7 @@
     break;
 
   case 294:
-#line 1867 "pir.y"
+#line 1868 "pir.y"
     { /* was the invocation a method call? then it becomes a method tail
                                * call, otherwise it's just a normal (sub) tail call.
                                */
@@ -4155,7 +4156,7 @@
     break;
 
   case 295:
-#line 1878 "pir.y"
+#line 1879 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4163,47 +4164,47 @@
     break;
 
   case 296:
-#line 1885 "pir.y"
+#line 1886 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 297:
-#line 1889 "pir.y"
+#line 1890 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 298:
-#line 1891 "pir.y"
+#line 1892 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 299:
-#line 1895 "pir.y"
+#line 1896 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 300:
-#line 1897 "pir.y"
+#line 1898 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (3)].argm), (yyvsp[(3) - (3)].argm)); ;}
     break;
 
   case 303:
-#line 1905 "pir.y"
+#line 1906 "pir.y"
     { (yyval.argm) = set_arg_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 304:
-#line 1909 "pir.y"
+#line 1910 "pir.y"
     { (yyval.argm) = set_arg_flag((yyval.argm), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 305:
-#line 1913 "pir.y"
+#line 1914 "pir.y"
     { (yyval.argm) = set_curarg(lexer, new_argument(lexer, (yyvsp[(1) - (1)].expr)));  ;}
     break;
 
   case 306:
-#line 1919 "pir.y"
+#line 1920 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4211,7 +4212,7 @@
     break;
 
   case 307:
-#line 1928 "pir.y"
+#line 1929 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4219,72 +4220,72 @@
     break;
 
   case 308:
-#line 1935 "pir.y"
+#line 1936 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 309:
-#line 1937 "pir.y"
+#line 1938 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 310:
-#line 1942 "pir.y"
+#line 1943 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 311:
-#line 1944 "pir.y"
+#line 1945 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 312:
-#line 1949 "pir.y"
+#line 1950 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 313:
-#line 1953 "pir.y"
+#line 1954 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 314:
-#line 1955 "pir.y"
+#line 1956 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 315:
-#line 1959 "pir.y"
+#line 1960 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 316:
-#line 1961 "pir.y"
+#line 1962 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 317:
-#line 1965 "pir.y"
+#line 1966 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 318:
-#line 1970 "pir.y"
+#line 1971 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 319:
-#line 1972 "pir.y"
+#line 1973 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 320:
-#line 1976 "pir.y"
+#line 1977 "pir.y"
     { (yyval.ival) = ARG_FLAG_FLAT; ;}
     break;
 
   case 321:
-#line 1978 "pir.y"
+#line 1979 "pir.y"
     {
                                (yyval.ival) = ARG_FLAG_NAMED;
                                set_arg_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4292,137 +4293,137 @@
     break;
 
   case 322:
-#line 1985 "pir.y"
+#line 1986 "pir.y"
     { (yyval.sval) = NULL; ;}
     break;
 
   case 323:
-#line 1987 "pir.y"
+#line 1988 "pir.y"
     { (yyval.sval) = (yyvsp[(1) - (1)].sval); ;}
     break;
 
   case 324:
-#line 1991 "pir.y"
+#line 1992 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 328:
-#line 2002 "pir.y"
+#line 2003 "pir.y"
     { store_global_constant(lexer, (yyvsp[(2) - (2)].cval)); ;}
     break;
 
   case 329:
-#line 2006 "pir.y"
+#line 2007 "pir.y"
     { /* XXX is .globalconst to be kept? */ ;}
     break;
 
   case 330:
-#line 2010 "pir.y"
+#line 2011 "pir.y"
     { (yyval.cval) = new_named_const(lexer, INT_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
     break;
 
   case 331:
-#line 2012 "pir.y"
+#line 2013 "pir.y"
     { (yyval.cval) = new_named_const(lexer, NUM_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
     break;
 
   case 332:
-#line 2014 "pir.y"
+#line 2015 "pir.y"
     { (yyval.cval) = new_named_const(lexer, STRING_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 333:
-#line 2016 "pir.y"
+#line 2017 "pir.y"
     { (yyval.cval) = new_pmc_const((yyvsp[(1) - (4)].sval), (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].cval)); ;}
     break;
 
   case 334:
-#line 2023 "pir.y"
+#line 2024 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 335:
-#line 2024 "pir.y"
+#line 2025 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 336:
-#line 2028 "pir.y"
+#line 2029 "pir.y"
     { (yyval.cval) = new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 337:
-#line 2029 "pir.y"
+#line 2030 "pir.y"
     { (yyval.cval) = new_const(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 338:
-#line 2030 "pir.y"
+#line 2031 "pir.y"
     { (yyval.cval) = new_const(lexer, NUM_TYPE, (yyvsp[(1) - (1)].dval)); ;}
     break;
 
   case 339:
-#line 2031 "pir.y"
+#line 2032 "pir.y"
     { (yyval.cval) = (yyvsp[(1) - (1)].cval); ;}
     break;
 
   case 340:
-#line 2034 "pir.y"
+#line 2035 "pir.y"
     { (yyval.ival) = OP_NE; ;}
     break;
 
   case 341:
-#line 2035 "pir.y"
+#line 2036 "pir.y"
     { (yyval.ival) = OP_EQ; ;}
     break;
 
   case 342:
-#line 2036 "pir.y"
+#line 2037 "pir.y"
     { (yyval.ival) = OP_LT; ;}
     break;
 
   case 343:
-#line 2037 "pir.y"
+#line 2038 "pir.y"
     { (yyval.ival) = OP_LE; ;}
     break;
 
   case 344:
-#line 2038 "pir.y"
+#line 2039 "pir.y"
     { (yyval.ival) = OP_GE; ;}
     break;
 
   case 345:
-#line 2039 "pir.y"
+#line 2040 "pir.y"
     { (yyval.ival) = OP_GT; ;}
     break;
 
   case 346:
-#line 2042 "pir.y"
+#line 2043 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 347:
-#line 2043 "pir.y"
+#line 2044 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 348:
-#line 2044 "pir.y"
+#line 2045 "pir.y"
     { (yyval.ival) = PMC_TYPE; ;}
     break;
 
   case 349:
-#line 2045 "pir.y"
+#line 2046 "pir.y"
     { (yyval.ival) = STRING_TYPE; ;}
     break;
 
   case 350:
-#line 2053 "pir.y"
+#line 2054 "pir.y"
     { set_curtarget(lexer, (yyvsp[(1) - (1)].targ));  ;}
     break;
 
   case 352:
-#line 2057 "pir.y"
+#line 2058 "pir.y"
     { /* a symbol must have been declared; check that at this point. */
                            symbol * sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                            if (sym == NULL) {
@@ -4435,277 +4436,277 @@
     break;
 
   case 353:
-#line 2068 "pir.y"
+#line 2069 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 354:
-#line 2069 "pir.y"
+#line 2070 "pir.y"
     { (yyval.targ) = new_reg(lexer, NUM_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 355:
-#line 2070 "pir.y"
+#line 2071 "pir.y"
     { (yyval.targ) = new_reg(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
   case 356:
-#line 2071 "pir.y"
+#line 2072 "pir.y"
     { (yyval.targ) = new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 359:
-#line 2079 "pir.y"
+#line 2080 "pir.y"
     { (yyval.sval) = "if"; ;}
     break;
 
   case 360:
-#line 2080 "pir.y"
+#line 2081 "pir.y"
     { (yyval.sval) = "unless"; ;}
     break;
 
   case 361:
-#line 2081 "pir.y"
+#line 2082 "pir.y"
     { (yyval.sval) = "goto"; ;}
     break;
 
   case 362:
-#line 2082 "pir.y"
+#line 2083 "pir.y"
     { (yyval.sval) = "int"; ;}
     break;
 
   case 363:
-#line 2083 "pir.y"
+#line 2084 "pir.y"
     { (yyval.sval) = "num"; ;}
     break;
 
   case 364:
-#line 2084 "pir.y"
+#line 2085 "pir.y"
     { (yyval.sval) = "string"; ;}
     break;
 
   case 365:
-#line 2085 "pir.y"
+#line 2086 "pir.y"
     { (yyval.sval) = "pmc"; ;}
     break;
 
   case 366:
-#line 2086 "pir.y"
+#line 2087 "pir.y"
     { (yyval.sval) = "null"; ;}
     break;
 
   case 367:
-#line 2089 "pir.y"
+#line 2090 "pir.y"
     { (yyval.sval) = "neg"; ;}
     break;
 
   case 368:
-#line 2090 "pir.y"
+#line 2091 "pir.y"
     { (yyval.sval) = "not"; ;}
     break;
 
   case 369:
-#line 2091 "pir.y"
+#line 2092 "pir.y"
     { (yyval.sval) = "bnot"; ;}
     break;
 
   case 370:
-#line 2094 "pir.y"
+#line 2095 "pir.y"
     { (yyval.ival) = OP_ADD; ;}
     break;
 
   case 371:
-#line 2095 "pir.y"
+#line 2096 "pir.y"
     { (yyval.ival) = OP_SUB; ;}
     break;
 
   case 372:
-#line 2096 "pir.y"
+#line 2097 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 373:
-#line 2097 "pir.y"
+#line 2098 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 374:
-#line 2098 "pir.y"
+#line 2099 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 375:
-#line 2099 "pir.y"
+#line 2100 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 376:
-#line 2100 "pir.y"
+#line 2101 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 377:
-#line 2101 "pir.y"
+#line 2102 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 378:
-#line 2102 "pir.y"
+#line 2103 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 379:
-#line 2103 "pir.y"
+#line 2104 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 380:
-#line 2104 "pir.y"
+#line 2105 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 381:
-#line 2105 "pir.y"
+#line 2106 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 382:
-#line 2106 "pir.y"
+#line 2107 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 383:
-#line 2107 "pir.y"
+#line 2108 "pir.y"
     { (yyval.ival) = OP_OR; ;}
     break;
 
   case 384:
-#line 2108 "pir.y"
+#line 2109 "pir.y"
     { (yyval.ival) = OP_AND; ;}
     break;
 
   case 385:
-#line 2109 "pir.y"
+#line 2110 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 386:
-#line 2110 "pir.y"
+#line 2111 "pir.y"
     { (yyval.ival) = OP_XOR; ;}
     break;
 
   case 387:
-#line 2111 "pir.y"
+#line 2112 "pir.y"
     { (yyval.ival) = OP_ISEQ; ;}
     break;
 
   case 388:
-#line 2112 "pir.y"
+#line 2113 "pir.y"
     { (yyval.ival) = OP_ISLE; ;}
     break;
 
   case 389:
-#line 2113 "pir.y"
+#line 2114 "pir.y"
     { (yyval.ival) = OP_ISLT; ;}
     break;
 
   case 390:
-#line 2114 "pir.y"
+#line 2115 "pir.y"
     { (yyval.ival) = OP_ISGE; ;}
     break;
 
   case 391:
-#line 2115 "pir.y"
+#line 2116 "pir.y"
     { (yyval.ival) = OP_ISGT; ;}
     break;
 
   case 392:
-#line 2116 "pir.y"
+#line 2117 "pir.y"
     { (yyval.ival) = OP_ISNE; ;}
     break;
 
   case 393:
-#line 2122 "pir.y"
+#line 2123 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
   case 394:
-#line 2123 "pir.y"
+#line 2124 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
   case 395:
-#line 2124 "pir.y"
+#line 2125 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
   case 396:
-#line 2125 "pir.y"
+#line 2126 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
   case 397:
-#line 2126 "pir.y"
+#line 2127 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
   case 398:
-#line 2127 "pir.y"
+#line 2128 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
   case 399:
-#line 2128 "pir.y"
+#line 2129 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
   case 400:
-#line 2129 "pir.y"
+#line 2130 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
   case 401:
-#line 2130 "pir.y"
+#line 2131 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
   case 402:
-#line 2131 "pir.y"
+#line 2132 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
   case 403:
-#line 2132 "pir.y"
+#line 2133 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
   case 404:
-#line 2133 "pir.y"
+#line 2134 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
   case 406:
-#line 2154 "pir.y"
+#line 2155 "pir.y"
     { new_subr(lexer, "@start"); ;}
     break;
 
   case 415:
-#line 2170 "pir.y"
+#line 2171 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 420:
-#line 2180 "pir.y"
+#line 2181 "pir.y"
     { set_sub_name(lexer, (yyvsp[(3) - (3)].sval)); ;}
     break;
 
   case 421:
-#line 2184 "pir.y"
+#line 2185 "pir.y"
     { new_subr(lexer, NULL); ;}
     break;
 
   case 422:
-#line 2189 "pir.y"
+#line 2190 "pir.y"
     {
                                   if (is_parrot_op(lexer, (yyvsp[(1) - (3)].sval)))
                                       get_opinfo(yyscanner);
@@ -4717,7 +4718,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 4721 "pirparser.c"
+#line 4722 "pirparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -4931,7 +4932,7 @@
 }
 
 
-#line 2200 "pir.y"
+#line 2201 "pir.y"
 
 
 

Modified: trunk/compilers/pirc/new/pirparser.h
==============================================================================
--- trunk/compilers/pirc/new/pirparser.h	(original)
+++ trunk/compilers/pirc/new/pirparser.h	Wed Dec 31 07:22:45 2008
@@ -280,7 +280,7 @@
 
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 typedef union YYSTYPE
-#line 235 "pir.y"
+#line 236 "pir.y"
 {
     double              dval;
     int                 ival;

Modified: trunk/compilers/pirc/new/pirpcc.c
==============================================================================
--- trunk/compilers/pirc/new/pirpcc.c	(original)
+++ trunk/compilers/pirc/new/pirpcc.c	Wed Dec 31 07:22:45 2008
@@ -22,6 +22,7 @@
 #include "pirpcc.h"
 #include "pircompunit.h"
 #include "pircompiler.h"
+#include "pirerr.h"
 
 #include "parrot/oplib/ops.h"
 
@@ -182,7 +183,18 @@
     }
 }
 
+/*
+
+=item C<static void
+add_alias_operand(lexer_state * const lexer, PMC *array, int index, char const * const alias)>
+
+Add an alias operand to current instruction; C<array> is the signature
+array, which must hold the right flags for this new operand (at position C<index>).
+The alias name is passed in C<alias>.
+
+=cut
 
+*/
 static void
 add_alias_operand(lexer_state * const lexer, PMC *array, int index, char const * const alias) {
     PARROT_ASSERT(alias);
@@ -245,20 +257,12 @@
          * :named flag) of the target operand.
          */
         if (TEST_FLAG(iter->flags, TARGET_FLAG_NAMED)) {
-
             add_alias_operand(lexer, signature_array, i, iter->alias);
-
-
-            /*
-            VTABLE_set_integer_keyed_int(lexer->interp, signature_array, i,
-                                         PARROT_ARG_NAME | PARROT_ARG_SC);
-
-            push_operand(lexer, expr_from_string(lexer, iter->alias));
-            */
-
+            /* number of operands was already counted correctly,
+             * respecting the extra :named operand.
+             */
             ++i;
-
-            /* clear flag on the target that was marked :named XXX is this correct? */
+            /* clear flag on the target that was marked :named */
             CLEAR_FLAG(iter->flags, TARGET_FLAG_NAMED);
         }
 
@@ -267,9 +271,6 @@
         /* store the flag at position i in the array */
         VTABLE_set_integer_keyed_int(lexer->interp, signature_array, i, flag);
 
-        /* add the current target as an operand; these targets have already
-         * got an assigned register, so we're emitting that register number.
-         */
         PARROT_ASSERT(iter->info->color != NO_REG_ALLOCATED);
 
         /* be sure to push the target as a whole as operand, not just an integer
@@ -326,16 +327,7 @@
         int flag = calculate_pcc_argument_flags(argiter);
 
         if (TEST_FLAG(argiter->flags, TARGET_FLAG_NAMED)) {
-
-            /*
-            VTABLE_set_integer_keyed_int(lexer->interp, signature_array, i,
-                                         PARROT_ARG_NAME | PARROT_ARG_SC);
-
-            push_operand(lexer, expr_from_string(lexer, argiter->alias));
-            */
-
             add_alias_operand(lexer, signature_array, i, argiter->alias);
-
             ++i;
             CLEAR_FLAG(argiter->flags, TARGET_FLAG_NAMED);
         }

Modified: trunk/compilers/pirc/new/pirsymbol.c
==============================================================================
--- trunk/compilers/pirc/new/pirsymbol.c	(original)
+++ trunk/compilers/pirc/new/pirsymbol.c	Wed Dec 31 07:22:45 2008
@@ -6,6 +6,7 @@
 #include "pirsymbol.h"
 #include "pircompunit.h"
 #include "piryy.h"
+#include "pirerr.h"
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>

Modified: trunk/compilers/pirc/new/piryy.h
==============================================================================
--- trunk/compilers/pirc/new/piryy.h	(original)
+++ trunk/compilers/pirc/new/piryy.h	Wed Dec 31 07:22:45 2008
@@ -22,8 +22,7 @@
 
 
 int yypirparse(yyscan_t yyscanner, struct lexer_state * const lexer);
-int yypirerror(yyscan_t yyscanner, struct lexer_state * const lexer,
-                                   char const * const message, ...);
+
 
 int yypirget_lineno(yyscan_t yyscanner);
 

Modified: trunk/config/gen/makefiles/pirc.in
==============================================================================
--- trunk/config/gen/makefiles/pirc.in	(original)
+++ trunk/config/gen/makefiles/pirc.in	Wed Dec 31 07:22:45 2008
@@ -36,7 +36,8 @@
 new/hdocprep.c \
 new/pirmacro.c \
 new/pirregalloc.c \
-new/bcgen.c
+new/bcgen.c \
+new/pirerr.c
 
 OBJS          = \
 new/main$(O) \
@@ -50,7 +51,8 @@
 new/pirmacro$(O) \
 new/pirregalloc$(O) \
 new/bcgen$(O) \
-new/pirpcc$(O)
+new/pirpcc$(O) \
+new/pirerr$(O)
 
 .c$(O) :
 	@$(PERL) ../../tools/dev/cc_flags.pl -v ../../CFLAGS $(CC) "" $(CFLAGS) -I$(@D) @cc_o_out@$@ -c $<
@@ -76,6 +78,7 @@
 new/pirregalloc$(O): new/pirregalloc.c new/pirregalloc.h
 new/bcgen$(O): new/bcgen.c new/bcgen.h
 new/pirpcc$(O): new/pirpcc.c new/pirpcc.h
+new/pirerr$(O): new/pirerr.c new/pirerr.h
 
 test: all
 	podchecker $(SOURCES) README.pod



nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About