develooper Front page | perl.cvs.parrot | Postings from January 2009

[svn:parrot] r34870 - trunk/compilers/pirc/new

From:
kjs
Date:
January 3, 2009 03:56
Subject:
[svn:parrot] r34870 - trunk/compilers/pirc/new
Message ID:
20090103115549.679ABCB9FA@x12.develooper.com
Author: kjs
Date: Sat Jan  3 03:55:47 2009
New Revision: 34870

Modified:
   trunk/compilers/pirc/new/bcgen.c
   trunk/compilers/pirc/new/pir.l
   trunk/compilers/pirc/new/pir.y
   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

Log:
[pirc] Add a new constant type for unicode strings. 
+ move unicode string parsing to the lexer
+ const objects now use the value_type enumeration, not the pir_types
+ function docs.

Modified: trunk/compilers/pirc/new/bcgen.c
==============================================================================
--- trunk/compilers/pirc/new/bcgen.c	(original)
+++ trunk/compilers/pirc/new/bcgen.c	Sat Jan  3 03:55:47 2009
@@ -131,63 +131,6 @@
     return oldcount;
 }
 
-/*
-
-=item C<STRING *
-parse_pir_string(bytecode * const bc, char const * const str)>
-
-Parse the PIR string C<str> which is stored as:
-
- <encoding>":"<quoted string>
-
-Encoding can be for instance "iso-8859-1". Example:
-
- iso-8859-1:"hi there".
-
-A Parrot STRING is returned. If no encoding was specified,
-then the default encoding is "ascii".
-
-=cut
-
-*/
-STRING *
-parse_pir_string(bytecode * const bc, char const * const str) {
-    /* normal strings that don't specify an encoding are already
-     * stripped from their quotes.
-     */
-    const size_t len   = strlen(str);
-    fprintf(stderr, "parse pir string() [%s]\n", str);
-
-    /* if str contains the unquoted string 'hello', len is 5.
-     * only encoding-specifying strings store quotes. Check
-     * whether the very last character is a double quote, in
-     * which case we know for sure it's an encoding-specifying
-     * string. If the last character is not a quote, the string
-     * is already stripped, in which case it's a normal string.
-     */
-    if (str[len - 1] == '"') {
-        /* find the location of the colon */
-        char *colon = strchr(str, ':');
-        char const *encoding;
-        char *quotedstring = colon + 1;
-
-        PARROT_ASSERT(colon + 1 == '"'); /* after the ":" there must be the opening quote */
-
-
-        /* change the colon into a NULL character, so that encoding points to the encoding
-         * string. So, [iso-8859-1:"hi there"] becomes [iso-8859-1\0"hi there"].
-         */
-        *colon = '\0';
-        /* the NULL character just added makes sure that encoding only
-         * contains the part before the colon
-         */
-        encoding = str;
-
-        return string_unescape_cstring(bc->interp, quotedstring, '"', encoding);
-    }
-
-    return string_make(bc->interp, str, strlen(str), "ascii", PObj_constant_FLAG);
-}
 
 
 /*
@@ -211,6 +154,7 @@
     return index;
 }
 
+
 /*
 
 =item C<int
@@ -465,7 +409,14 @@
 
 /*
 
-=item C<void()>
+=item C<int
+store_key_bytecode(bytecode * const bc, opcode_t * key)>
+
+Store the bytecode for a key. The bytecode was emitted in an
+array, passed in C<key>. The bytecode is I<unpacked> into the
+current PackFile, pointed to by the interpreter in C<bc>.
+The key PMC is added to the constants table, and the index
+in the constants table is returned.
 
 =cut
 
@@ -710,6 +661,7 @@
             break;
         default:
             fprintf(stderr, "unknown key type"); /* XXX exception? */
+            namespace_pmc = NULL;
             break;
     }
     return namespace_pmc;

Modified: trunk/compilers/pirc/new/pir.l
==============================================================================
--- trunk/compilers/pirc/new/pir.l	(original)
+++ trunk/compilers/pirc/new/pir.l	Sat Jan  3 03:55:47 2009
@@ -385,8 +385,28 @@
                     return TK_STRINGC;
                   }
 
-{UNICODE}         { /* copy the string completely*/
-                    yylval->sval = dupstr(yyget_extra(yyscanner), yytext);
+{UNICODE}         { /* parse yytext, which contains the encoding, a ':', and the quoted string */
+                    char        *colon = strchr(yytext, ':');
+                    lexer_state *lexer = yyget_extra(yyscanner);
+                    ucstring    *ustr  = (ucstring *)pir_mem_allocate(lexer, sizeof (ucstring));
+                    /* copy the encoding part */
+                    ustr->encoding     = dupstrn(lexer, yytext, colon - yytext);
+                    /* the colon becomes a NULL character to end the encoding string */
+                    *colon = '\0';
+                    /* copy the string contents, strip the quotes. Example:
+                     *   iso-8859-1:"hi there"
+                     *   123456789012345678901
+                     *
+                     * colon points to the colon, add 2 to point to the first character
+                     * in the string ('h'). yyleng is 20 in the example, subtract
+                     * string length of the encoding part (10) and 3 for the quotes and colon.
+                     */
+
+                    ustr->contents = dupstrn(lexer, colon + 2, yyleng - strlen(ustr->encoding) - 3);
+
+                    fprintf(stderr, "ucstring: [%s]:[%s]\n", ustr->encoding, ustr->contents);
+
+                    yylval->ustr = ustr;
                     return TK_USTRINGC;
                   }
 "$P"{DIGIT}+      { yylval->ival = atoi(yytext + 2); return TK_PREG; }

Modified: trunk/compilers/pirc/new/pir.y
==============================================================================
--- trunk/compilers/pirc/new/pir.y	(original)
+++ trunk/compilers/pirc/new/pir.y	Sat Jan  3 03:55:47 2009
@@ -239,6 +239,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
     struct target      *targ;
@@ -300,7 +301,7 @@
        <sval> TK_GOTO       "goto"
 
 %token <sval> TK_STRINGC    "string constant"
-       <sval> TK_USTRINGC   "unicode string"
+       <ustr> TK_USTRINGC   "unicode string"
        <ival> TK_INTC       "integer constant"
        <dval> TK_NUMC       "number constant"
        <ival> TK_PREG       "PMC register"
@@ -493,6 +494,8 @@
 
 %type <cval> const_tail
              constant
+             stringconst
+
 
 /* all exported functions start with "yypir", instead of default "yy". */
 %name-prefix="yypir"
@@ -1159,9 +1162,9 @@
 
                           get_opinfo(yyscanner);
                         }
-                  | target '=' TK_STRINGC
+                  | target '=' stringconst
                         {
-                          set_instrf(lexer, "set", "%T%s", $1, $3);
+                          set_instrf(lexer, "set", "%T%C", $1, $3);
                           get_opinfo(yyscanner);
                         }
                   | target '=' reg
@@ -2007,11 +2010,11 @@
                       ;
 
 const_tail            : "int" identifier '=' TK_INTC
-                            { $$ = new_named_const(lexer, INT_TYPE, $2, $4); }
+                            { $$ = new_named_const(lexer, INT_VAL, $2, $4); }
                       | "num" identifier '=' TK_NUMC
-                            { $$ = new_named_const(lexer, NUM_TYPE, $2, $4); }
+                            { $$ = new_named_const(lexer, NUM_VAL, $2, $4); }
                       | "string" identifier '=' TK_STRINGC
-                            { $$ = new_named_const(lexer, STRING_TYPE, $2, $4); }
+                            { $$ = new_named_const(lexer, STRING_VAL, $2, $4); }
                       | TK_STRINGC identifier '=' constant
                             { $$ = new_pmc_const($1, $2, $4); }
                       ;
@@ -2025,10 +2028,15 @@
             ;
 
 
-constant    : TK_STRINGC     { $$ = new_const(lexer, STRING_TYPE, $1); }
-            | TK_INTC        { $$ = new_const(lexer, INT_TYPE, $1); }
-            | TK_NUMC        { $$ = new_const(lexer, NUM_TYPE, $1); }
+constant    : TK_STRINGC     { $$ = new_const(lexer, STRING_VAL, $1); }
+            | TK_INTC        { $$ = new_const(lexer, INT_VAL, $1); }
+            | TK_NUMC        { $$ = new_const(lexer, NUM_VAL, $1); }
             | TK_CONST_VALUE { $$ = $1; }
+            | TK_USTRINGC    { $$ = new_const(lexer, USTRING_VAL, $1); }
+            ;
+
+stringconst : TK_STRINGC     { $$ = new_const(lexer, STRING_VAL, $1); }
+            | TK_USTRINGC    { $$ = new_const(lexer, USTRING_VAL, $1); }
             ;
 
 rel_op      : "!="           { $$ = OP_NE; }
@@ -2203,8 +2211,12 @@
 
 /* the order of these letters match with the pir_type enumeration.
  * These are used for generating the full opname (set I0, 10 -> set_i_ic).
+ * The first 5 correspond to the values in the pir_type enumeration,
+ * the last 5 correspond to the values in the value_type enumeration.
+ * Note that the last 's' corresponds to USTRING_VAL, which is a unicode
+ * string, but when used it's still a string.
  */
-static char const type_codes[5] = {'i', 's', 'p', 'n', '?'};
+static char const type_codes[10] = {'i', 's', 'p', 'n', '?', 'i', 's', 'p', 'n', 's'};
 
 
 /*
@@ -2312,7 +2324,7 @@
                   "detected 'inc' or 'dec' in fold_i_i()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), INT_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), INT_VAL, result);
 }
 
 /*
@@ -2396,7 +2408,7 @@
                   "detected 'inc' or 'dec' in fold_n_i()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -2480,7 +2492,7 @@
                   "detected 'inc' or 'dec' in fold_i_n()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -2565,7 +2577,7 @@
         default:
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -2587,7 +2599,7 @@
     lexer_state *lexer = (lexer_state *)yypirget_extra(yyscanner);
     switch (op) {
         case OP_CONCAT:
-            return new_const(lexer, STRING_TYPE, concat_strings(lexer, a, b));
+            return new_const(lexer, STRING_VAL, concat_strings(lexer, a, b));
 
         case OP_ADD:
         case OP_SUB:
@@ -2607,7 +2619,7 @@
         case OP_FDIV:
             yypirerror(yyscanner, lexer,
                     "cannot apply binary operator '%s' to arguments of type number", opnames[op]);
-            return new_const(lexer, STRING_TYPE, a);
+            return new_const(lexer, STRING_VAL, a);
 
         case OP_ISEQ:
         case OP_ISLE:
@@ -2615,7 +2627,7 @@
         case OP_ISGE:
         case OP_ISGT:
         case OP_ISNE:
-            return new_const(lexer, INT_TYPE, (1 == evaluate_s_s(a, op, b)));
+            return new_const(lexer, INT_VAL, (1 == evaluate_s_s(a, op, b)));
 
 
         /* OP_INC and OP_DEC are here only to keep the C compiler happy */
@@ -2795,12 +2807,14 @@
 static int
 evaluate_c(NOTNULL(lexer_state * const lexer), NOTNULL(constant * const c)) {
     switch (c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             return (c->val.ival != 0);
-        case NUM_TYPE:
+        case NUM_VAL:
             return (c->val.nval != 0);
-        case STRING_TYPE:
+        case STRING_VAL:
             return evaluate_s(c->val.sval);
+        case USTRING_VAL:
+            return evaluate_s(c->val.ustr->contents);
         default:
             panic(lexer, "impossible constant type in evaluate_c()");
             return 0;
@@ -2890,9 +2904,9 @@
 static int
 check_value(NOTNULL(constant * const c), int val) {
     switch(c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             return (c->val.ival == val);
-        case NUM_TYPE:
+        case NUM_VAL:
             return (c->val.nval == val);
         default:
             break;
@@ -3309,7 +3323,7 @@
             int n;
             /* if the key is an integer constant, then signature becomes '_kic', otherwise _kc. */
             if (e->expr.k->head->expr->type         == EXPR_CONSTANT
-            &&  e->expr.k->head->expr->expr.c->type == INT_TYPE)
+            &&  e->expr.k->head->expr->expr.c->type == INT_VAL)
                 n = 3;
             else
                 n = 2;
@@ -3372,7 +3386,7 @@
                         break;
                     case EXPR_CONSTANT:
                         /* integer constant key results in '_kic' signature */
-                        if (iter->expr.c->type == INT_TYPE)
+                        if (iter->expr.c->type == INT_VAL)
                             *instr_writer++ = 'i';
 
                         *instr_writer++ = 'c';

Modified: trunk/compilers/pirc/new/pircompunit.c
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.c	(original)
+++ trunk/compilers/pirc/new/pircompunit.c	Sat Jan  3 03:55:47 2009
@@ -136,11 +136,11 @@
 
         switch (multitype->type) {
             case EXPR_CONSTANT:
-                mtype->u.ident    = multitype->expr.c->val.sval;
+                mtype->entry.ident    = multitype->expr.c->val.sval;
                 mtype->entry_type = MULTI_TYPE_IDENT;
                 break;
             case EXPR_IDENT:
-                mtype->u.ident    = multitype->expr.id;
+                mtype->entry.ident    = multitype->expr.id;
                 mtype->entry_type = MULTI_TYPE_IDENT;
                 break;
             case EXPR_KEY:
@@ -477,12 +477,15 @@
 int
 targets_equal(target const * const left, target const * const right) {
 
+
     if (TEST_FLAG(left->flags, TARGET_FLAG_IS_REG)) {      /* if left is a reg */
         if (TEST_FLAG(right->flags, TARGET_FLAG_IS_REG)) { /* then right must be a reg */
             if ((left->info->type  == right->info->type)       /* types must match */
             &&  (left->info->id.regno == right->info->id.regno /* PIR regno must match */
-            &&  (left->info->color == right->info->color)))    /* PASM regno must match */
+            &&  (left->info->color == right->info->color))) {   /* PASM regno must match */
+                assert(left->info == right->info);
                 return TRUE;
+            }
         }
         else /* left is a reg, right is not */
             return FALSE;
@@ -492,8 +495,10 @@
 
         if (!TEST_FLAG(right->flags, TARGET_FLAG_IS_REG)  /* right must not be a reg */
         && (left->info->id.name && right->info->id.name       /* both must have a name */
-        && STREQ(left->info->id.name, right->info->id.name))) /* and they must be equal */
+        && STREQ(left->info->id.name, right->info->id.name))) { /* and they must be equal */
+            assert(left->info == right->info);
             return TRUE;
+        }
     }
 
     return FALSE;
@@ -902,13 +907,13 @@
             expr = expr_from_const(lexer, va_arg(arg_ptr, constant *));                            \
             break;                                                                                 \
         case 'i': /* integer */                                                                    \
-            expr = expr_from_const(lexer, new_const(lexer, INT_TYPE, va_arg(arg_ptr, int)));       \
+            expr = expr_from_const(lexer, new_const(lexer, INT_VAL, va_arg(arg_ptr, int)));        \
             break;                                                                                 \
         case 'n': /* number */                                                                     \
-            expr = expr_from_const(lexer, new_const(lexer, NUM_TYPE, va_arg(arg_ptr, double)));    \
+            expr = expr_from_const(lexer, new_const(lexer, NUM_VAL, va_arg(arg_ptr, double)));     \
             break;                                                                                 \
         case 's': /* string */                                                                     \
-            expr = expr_from_const(lexer, new_const(lexer, STRING_TYPE, va_arg(arg_ptr, char *))); \
+            expr = expr_from_const(lexer, new_const(lexer, STRING_VAL, va_arg(arg_ptr, char *)));  \
             break;                                                                                 \
         default:                                                                                   \
             panic(lexer, "unknown format specifier in set_instrf()");                              \
@@ -1227,7 +1232,7 @@
 /*
 
 =item C<static constant *
-create_const(lexer_state * const lexer, pir_type type, char * const name, va_list arg_ptr)>
+create_const(lexer_state * const lexer, value_type type, char * const name, va_list arg_ptr)>
 
 Constant constructor; based on C<type>, retrieve a value of the
 appropriate type from C<arg_ptr>.
@@ -1238,7 +1243,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 static constant *
-create_const(lexer_state * const lexer, pir_type type, char const * const name, va_list arg_ptr) {
+create_const(lexer_state * const lexer, value_type type, char const * const name, va_list arg_ptr) {
     constant *c = pir_mem_allocate_zeroed_typed(lexer, constant);
     c->name     = name;
     c->type     = type;
@@ -1246,19 +1251,21 @@
 
     /* based on the indicated type, cast the variable argument to the right type. */
     switch (type) {
-        case INT_TYPE:
+        case INT_VAL:
             c->val.ival = va_arg(arg_ptr, int);
             break;
-        case NUM_TYPE:
+        case NUM_VAL:
             c->val.nval = va_arg(arg_ptr, double);
             break;
-        case PMC_TYPE:
-        case STRING_TYPE:
+        case PMC_VAL:
+        case STRING_VAL:
             c->val.sval = va_arg(arg_ptr, char *);
             break;
-        case UNKNOWN_TYPE:
+        case USTRING_VAL:
+            c->val.ustr = va_arg(arg_ptr, ucstring *);
+            break;
         default:
-            panic(lexer, "unknown data type in create_const()");
+            panic(lexer, "unknown data type in create_const() (%d)", type);
             break;
     }
 
@@ -1268,7 +1275,7 @@
 /*
 
 =item C<constant *
-new_named_const(lexer_state * const lexer, pir_type type, char * const name, ...)>
+new_named_const(lexer_state * const lexer, value_type type, char * const name, ...)>
 
 Creates a new constant node of the given type, by the given name.
 Wrapper function for C<create_const>.
@@ -1279,7 +1286,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 constant *
-new_named_const(lexer_state * const lexer, pir_type type, char const * const name, ...) {
+new_named_const(lexer_state * const lexer, value_type type, char const * const name, ...) {
     constant *c;
     va_list arg_ptr;
     va_start(arg_ptr, name);
@@ -1312,7 +1319,7 @@
 /*
 
 =item C<constant *
-new_const(lexer_state * const lexer, pir_type type, ...)>
+new_const(lexer_state * const lexer, value_type type, ...)>
 
 Creates a new constant node of the given type.
 Wrapper function for C<create_const>
@@ -1323,7 +1330,7 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 constant *
-new_const(lexer_state * const lexer, pir_type type, ...) {
+new_const(lexer_state * const lexer, value_type type, ...) {
     constant *c;
     va_list arg_ptr;
     va_start(arg_ptr, type);
@@ -1469,7 +1476,7 @@
 PARROT_CANNOT_RETURN_NULL
 expression *
 expr_from_int(lexer_state * const lexer, int ival) {
-    return expr_from_const(lexer, new_const(lexer, INT_TYPE, ival));
+    return expr_from_const(lexer, new_const(lexer, INT_VAL, ival));
 }
 
 /*
@@ -1487,7 +1494,7 @@
 PARROT_CANNOT_RETURN_NULL
 expression *
 expr_from_num(lexer_state * const lexer, double nval) {
-    return expr_from_const(lexer, new_const(lexer, NUM_TYPE, nval));
+    return expr_from_const(lexer, new_const(lexer, NUM_VAL, nval));
 }
 
 /*
@@ -1504,7 +1511,7 @@
 PARROT_CANNOT_RETURN_NULL
 expression *
 expr_from_string(lexer_state * const lexer, char const * const sval) {
-    return expr_from_const(lexer, new_const(lexer, STRING_TYPE, sval));
+    return expr_from_const(lexer, new_const(lexer, STRING_VAL, sval));
 }
 
 

Modified: trunk/compilers/pirc/new/pircompunit.h
==============================================================================
--- trunk/compilers/pirc/new/pircompunit.h	(original)
+++ trunk/compilers/pirc/new/pircompunit.h	Sat Jan  3 03:55:47 2009
@@ -119,28 +119,45 @@
 
 #define NOT(X)          !(X)
 
-/* selector for the value union */
+/* selector for the value union. Use explicit values to distinguish them
+ * from the pir_type enumeration, this makes it easier to find bugs, where
+ * a pir_type value is used where a value_type should be used. These
+ * value_types continue where pir_type values end.
+ */
 typedef enum value_types {
-    INT_VAL,
-    NUM_VAL,
-    PMC_VAL,
-    STR_VAL,
+    INT_VAL     = 5,
+    STRING_VAL  = 6,
+    PMC_VAL     = 7,
+    NUM_VAL     = 8,
+    USTRING_VAL = 9
 
 } value_type;
 
+/* structure representing a "unicode" string;
+ * it holds the name of the encoding, the character set
+ * and the string itself.
+ */
+typedef struct ucstring {
+    char const *contents; /* the actual string */
+    char const *charset;
+    char const *encoding;
+} ucstring;
+
 /* for representing constant values */
 typedef union value {
-    char    *sval;
-    double   nval;
-    int      ival;
-    char    *pval;
+    char     *sval;
+    double    nval;
+    int       ival;
+    char     *pval;
+    ucstring *ustr;
 
 } value;
 
+
 /* literal constants, possibly named */
 typedef struct constant {
     char const      *name;     /* name of the constant, if declared as a constant */
-    pir_type         type;     /* type of the constant */
+    value_type       type;     /* type of the constant; see enum value_types */
     value            val;      /* value of the constant */
     struct constant *next;
 
@@ -359,10 +376,10 @@
 argument *set_arg_alias(struct lexer_state * const lexer, char const * const alias);
 
 /* constructors for constant nodes */
-constant *new_named_const(struct lexer_state * const lexer, pir_type type,
+constant *new_named_const(struct lexer_state * const lexer, value_type type,
                           char const * const name, ...);
 
-constant *new_const(struct lexer_state * const lexer, pir_type type, ...);
+constant *new_const(struct lexer_state * const lexer, value_type type, ...);
 
 constant *new_pmc_const(char const * const type, char const * const name, constant * const value);
 

Modified: trunk/compilers/pirc/new/piremit.c
==============================================================================
--- trunk/compilers/pirc/new/piremit.c	(original)
+++ trunk/compilers/pirc/new/piremit.c	Sat Jan  3 03:55:47 2009
@@ -142,19 +142,21 @@
 void
 print_constant(lexer_state * const lexer, constant * const c) {
     switch (c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             fprintf(out, "%d", c->val.ival);
             break;
-        case NUM_TYPE:
+        case NUM_VAL:
             fprintf(out, "%f", c->val.nval);
             break;
-        case STRING_TYPE:
+        case STRING_VAL:
             fprintf(out, "\"%s\"", c->val.sval);
             break;
-        case PMC_TYPE:
+        case PMC_VAL:
             fprintf(out, "\"%s\"", c->val.pval);
             break;
-        case UNKNOWN_TYPE:
+        case USTRING_VAL:
+            fprintf(out, "\"%s\"", c->val.ustr->contents); /* XXX also encoding? */
+            break;
         default:
             panic(lexer, "Unknown type detected in print_constant()");
             break;
@@ -463,21 +465,21 @@
 static void
 emit_pbc_const_arg(lexer_state * const lexer, constant * const c) {
     switch (c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             emit_int_arg(lexer->bc, c->val.ival);
             break;
-        case NUM_TYPE: {
+        case NUM_VAL: {
             int index = add_num_const(lexer->bc, c->val.nval);
             emit_int_arg(lexer->bc, index);
             break;
         }
-        case STRING_TYPE: {
+        case STRING_VAL: {
             int index = add_string_const(lexer->bc, c->val.sval);
             fprintf(stderr, "index of string const: %d\n", index);
             emit_int_arg(lexer->bc, index);
             break;
         }
-        case PMC_TYPE: {
+        case PMC_VAL: {
             /*
 
             int index = add_pmc_const(lexer->bc, c->val.pval);
@@ -490,6 +492,9 @@
             fprintf(stderr, "emit_pbc_const_arg: pmc type\n");
             break;
         }
+        case USTRING_VAL:
+            /* XXX */
+            break;
         default:
             break;
     }
@@ -558,11 +563,11 @@
             case EXPR_CONSTANT: {
                 constant *c = iter->expr->expr.c;
                 switch (c->type) {
-                    case INT_TYPE:
+                    case INT_VAL:
                         *pc++ = PARROT_ARG_IC;
                         *pc++ = c->val.ival;
                         break;
-                    case STRING_TYPE:
+                    case STRING_VAL:
                         *pc++ = PARROT_ARG_SC;
                         *pc++ = add_string_const(lexer->bc, c->val.sval);
                         break;
@@ -735,7 +740,7 @@
 
             /* replace 2nd operand with the new one. */
             second_operand->expr.c->val.ival = index;
-            second_operand->expr.c->type     = INT_TYPE;
+            second_operand->expr.c->type     = INT_VAL;
 
             break;
         }
@@ -757,7 +762,7 @@
 
             /* replace 2nd operand with the new one. */
             second_operand->expr.c->val.ival = index;
-            second_operand->expr.c->type     = INT_TYPE;
+            second_operand->expr.c->type     = INT_VAL;
 
             break;
         }

Modified: trunk/compilers/pirc/new/pirlexer.c
==============================================================================
--- trunk/compilers/pirc/new/pirlexer.c	(original)
+++ trunk/compilers/pirc/new/pirlexer.c	Sat Jan  3 03:55:47 2009
@@ -1378,17 +1378,17 @@
       362,  363,  364,  365,  366,  367,  368,  369,  370,  371,
 
       372,  374,  375,  376,  377,  378,  379,  380,  383,  388,
-      392,  393,  394,  395,  397,  402,  414,  429,  430,  431,
-      432,  433,  435,  487,  500,  522,  527,  532,  539,  540,
-      555,  560,  561,  566,  567,  568,  570,  586,  640,  668,
-      673,  678,  679,  680,  681,  686,  697,  698,  700,  702,
-      713,  727,  732,  733,  734,  735,  737,  752,  766,  795,
-      820,  822,  827,  837,  842,  860,  866,  873,  906,  908,
-      913,  949,  950,  951,  953,  954,  955,  956,  957,  958,
-      960,  961,  962,  964,  969,  974,  975,  978, 1012, 1017,
-     1020, 1021, 1022, 1023, 1025, 1030, 1031, 1032, 1033, 1034,
+      412,  413,  414,  415,  417,  422,  434,  449,  450,  451,
+      452,  453,  455,  507,  520,  542,  547,  552,  559,  560,
+      575,  580,  581,  586,  587,  588,  590,  606,  660,  688,
+      693,  698,  699,  700,  701,  706,  717,  718,  720,  722,
+      733,  747,  752,  753,  754,  755,  757,  772,  786,  815,
+      840,  842,  847,  857,  862,  880,  886,  893,  926,  928,
+      933,  969,  970,  971,  973,  974,  975,  976,  977,  978,
+      980,  981,  982,  984,  989,  994,  995,  998, 1032, 1037,
+     1040, 1041, 1042, 1043, 1045, 1050, 1051, 1052, 1053, 1054,
 
-     1036, 1041, 1043, 1045
+     1056, 1061, 1063, 1065
     } ;
 
 /* The intent behind this definition is that it'll catch
@@ -2523,34 +2523,54 @@
 case 110:
 YY_RULE_SETUP
 #line 388 "pir.l"
-{ /* copy the string completely*/
-                    yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
+{ /* parse yytext, which contains the encoding, a ':', and the quoted string */
+                    char *colon        = strchr(yytext, ':');
+                    lexer_state *lexer = yypirget_extra(yyscanner);
+                    ucstring *ustr     = (ucstring *)pir_mem_allocate(lexer, sizeof (ucstring));
+                    /* copy the encoding part */
+                    ustr->encoding     = dupstrn(lexer, yytext, colon - yytext);
+                    /* the colon becomes a NULL character to end the encoding string */
+                    *colon = '\0';
+                    /* copy the string contents, strip the quotes. Example:
+                     *   iso-8859-1:"hi there"
+                     *   123456789012345678901
+                     *
+                     * colon points to the colon, add 2 to point to the first character
+                     * in the string ('h'). yyleng is 20 in the example, subtract
+                     * string length of the encoding part (10) and 3 for the quotes and colon.
+                     */
+
+                    ustr->contents = dupstrn(lexer, colon + 2, yyleng - strlen(ustr->encoding) - 3);
+
+                    fprintf(stderr, "ucstring: [%s]:[%s]\n", ustr->encoding, ustr->contents);
+
+                    yylval->ustr = ustr;
                     return TK_USTRINGC;
                   }
     YY_BREAK
 case 111:
 YY_RULE_SETUP
-#line 392 "pir.l"
+#line 412 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_PREG; }
     YY_BREAK
 case 112:
 YY_RULE_SETUP
-#line 393 "pir.l"
+#line 413 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_SREG; }
     YY_BREAK
 case 113:
 YY_RULE_SETUP
-#line 394 "pir.l"
+#line 414 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_NREG; }
     YY_BREAK
 case 114:
 YY_RULE_SETUP
-#line 395 "pir.l"
+#line 415 "pir.l"
 { yylval->ival = atoi(yytext + 2); return TK_IREG; }
     YY_BREAK
 case 115:
 YY_RULE_SETUP
-#line 397 "pir.l"
+#line 417 "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;
@@ -2558,7 +2578,7 @@
     YY_BREAK
 case 116:
 YY_RULE_SETUP
-#line 402 "pir.l"
+#line 422 "pir.l"
 { /* give a warning when using PASM registers as PIR identifiers */
                     lexer_state * const lexer = yypirget_extra(yyscanner);
 
@@ -2573,7 +2593,7 @@
     YY_BREAK
 case 117:
 YY_RULE_SETUP
-#line 414 "pir.l"
+#line 434 "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);
@@ -2591,32 +2611,32 @@
     YY_BREAK
 case 118:
 YY_RULE_SETUP
-#line 429 "pir.l"
+#line 449 "pir.l"
 { yylval->dval = atof(yytext); return TK_NUMC; }
     YY_BREAK
 case 119:
 YY_RULE_SETUP
-#line 430 "pir.l"
+#line 450 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 120:
 YY_RULE_SETUP
-#line 431 "pir.l"
+#line 451 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 121:
 YY_RULE_SETUP
-#line 432 "pir.l"
+#line 452 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 122:
 YY_RULE_SETUP
-#line 433 "pir.l"
+#line 453 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 123:
 YY_RULE_SETUP
-#line 435 "pir.l"
+#line 455 "pir.l"
 { /* XXX some work to be done to disallow $P0 . foo()
                      * spaces should not be allowed.
                      */
@@ -2639,7 +2659,7 @@
 
 
 case YY_STATE_EOF(SCANSTR):
-#line 458 "pir.l"
+#line 478 "pir.l"
 { /* switch back from .macro_const buffer to file. */
                      lexer_state * const lexer = yypirget_extra(yyscanner);
                      yy_pop_state(yyscanner);
@@ -2647,7 +2667,7 @@
                    }
     YY_BREAK
 case YY_STATE_EOF(SCANMACRO):
-#line 464 "pir.l"
+#line 484 "pir.l"
 { /* override the default <<EOF>> action; go back to normal state and
                       * switch back to the saved file.
                       */
@@ -2673,7 +2693,7 @@
     YY_BREAK
 case 124:
 YY_RULE_SETUP
-#line 487 "pir.l"
+#line 507 "pir.l"
 { /* when scanning a macro body, the @ marker indicates the {IDENT} must
                           * be munged.
                           */
@@ -2684,14 +2704,14 @@
                        }
     YY_BREAK
 case YY_STATE_EOF(INITIAL):
-#line 496 "pir.l"
+#line 516 "pir.l"
 { /* end of file, stop scanning. */
                     yyterminate();
                   }
     YY_BREAK
 case 125:
 YY_RULE_SETUP
-#line 500 "pir.l"
+#line 520 "pir.l"
 { /* any character not covered in the rules above is an error. */
                     yypirerror(yyscanner, yypirget_extra(yyscanner),
                                "unexpected character: '%c'", yytext[0]);
@@ -2712,7 +2732,7 @@
 
 case 126:
 YY_RULE_SETUP
-#line 522 "pir.l"
+#line 542 "pir.l"
 {
                                yy_push_state(MACROCONST, yyscanner);
                                return TK_MACRO_CONST;
@@ -2720,7 +2740,7 @@
     YY_BREAK
 case 127:
 YY_RULE_SETUP
-#line 527 "pir.l"
+#line 547 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_IDENT;
@@ -2728,7 +2748,7 @@
     YY_BREAK
 case 128:
 YY_RULE_SETUP
-#line 532 "pir.l"
+#line 552 "pir.l"
 {
                                /* only these tokens can be macro constant values */
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
@@ -2738,19 +2758,19 @@
     YY_BREAK
 case 129:
 YY_RULE_SETUP
-#line 539 "pir.l"
+#line 559 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 130:
 YY_RULE_SETUP
-#line 540 "pir.l"
+#line 560 "pir.l"
 {
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "unknown character: '%c'", yytext[0]);
                              }
     YY_BREAK
 case YY_STATE_EOF(MACROCONST):
-#line 544 "pir.l"
+#line 564 "pir.l"
 {
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "read end of file during .macro_const definition");
@@ -2763,7 +2783,7 @@
 
 case 131:
 YY_RULE_SETUP
-#line 555 "pir.l"
+#line 575 "pir.l"
 { /* start a macro definition */
                                yy_push_state(MACROHEAD, yyscanner);
                                return TK_MACRO;
@@ -2771,12 +2791,12 @@
     YY_BREAK
 case 132:
 YY_RULE_SETUP
-#line 560 "pir.l"
+#line 580 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 133:
 YY_RULE_SETUP
-#line 561 "pir.l"
+#line 581 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_IDENT;
@@ -2784,23 +2804,23 @@
     YY_BREAK
 case 134:
 YY_RULE_SETUP
-#line 566 "pir.l"
+#line 586 "pir.l"
 { return '('; }
     YY_BREAK
 case 135:
 YY_RULE_SETUP
-#line 567 "pir.l"
+#line 587 "pir.l"
 { return ')'; }
     YY_BREAK
 case 136:
 YY_RULE_SETUP
-#line 568 "pir.l"
+#line 588 "pir.l"
 { return ','; }
     YY_BREAK
 case 137:
 /* rule 137 can match eol */
 YY_RULE_SETUP
-#line 570 "pir.l"
+#line 590 "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 */
@@ -2818,7 +2838,7 @@
 
 case 138:
 YY_RULE_SETUP
-#line 586 "pir.l"
+#line 606 "pir.l"
 { /* .foo; it can be a macro, macro_local, or just $P0.foo(),
                                 * but we need to check that.
                                 */
@@ -2875,7 +2895,7 @@
     YY_BREAK
 case 139:
 YY_RULE_SETUP
-#line 640 "pir.l"
+#line 660 "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);
@@ -2906,7 +2926,7 @@
     YY_BREAK
 case 140:
 YY_RULE_SETUP
-#line 668 "pir.l"
+#line 688 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_IDENT;
@@ -2914,7 +2934,7 @@
     YY_BREAK
 case 141:
 YY_RULE_SETUP
-#line 673 "pir.l"
+#line 693 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_OTHER;
@@ -2922,22 +2942,22 @@
     YY_BREAK
 case 142:
 YY_RULE_SETUP
-#line 678 "pir.l"
+#line 698 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 143:
 YY_RULE_SETUP
-#line 679 "pir.l"
+#line 699 "pir.l"
 { return ','; }
     YY_BREAK
 case 144:
 YY_RULE_SETUP
-#line 680 "pir.l"
+#line 700 "pir.l"
 { return '('; }
     YY_BREAK
 case 145:
 YY_RULE_SETUP
-#line 681 "pir.l"
+#line 701 "pir.l"
 {
                                yy_pop_state(yyscanner); /* leave MACROEXPAND state */
                                return ')';
@@ -2945,14 +2965,14 @@
     YY_BREAK
 case 146:
 YY_RULE_SETUP
-#line 686 "pir.l"
+#line 706 "pir.l"
 {
                                yylval->sval = dupstr(yypirget_extra(yyscanner), yytext);
                                return TK_MACRO_ARG_OTHER;
                              }
     YY_BREAK
 case YY_STATE_EOF(STRINGEXPAND):
-#line 691 "pir.l"
+#line 711 "pir.l"
 {
                                lexer_state * const lexer = yypirget_extra(yyscanner);
                                yy_pop_state(yyscanner);
@@ -2961,23 +2981,23 @@
     YY_BREAK
 case 147:
 YY_RULE_SETUP
-#line 697 "pir.l"
+#line 717 "pir.l"
 { return '{'; }
     YY_BREAK
 case 148:
 YY_RULE_SETUP
-#line 698 "pir.l"
+#line 718 "pir.l"
 { return '}'; }
     YY_BREAK
 case 149:
 /* rule 149 can match eol */
 YY_RULE_SETUP
-#line 700 "pir.l"
+#line 720 "pir.l"
 { yylval->sval = "\n"; return TK_NL; }
     YY_BREAK
 case 150:
 YY_RULE_SETUP
-#line 702 "pir.l"
+#line 722 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "unknown character in macro expansion: %c", yytext[0]);
                              }
@@ -2989,7 +3009,7 @@
 
 case 151:
 YY_RULE_SETUP
-#line 713 "pir.l"
+#line 733 "pir.l"
 { /* give a warning if the right flag is set */
                               /*
                               lexer_state * const lexer = yypirget_extra(yyscanner);
@@ -3005,7 +3025,7 @@
     YY_BREAK
 case 152:
 YY_RULE_SETUP
-#line 727 "pir.l"
+#line 747 "pir.l"
 {
                               yy_push_state(MACROLOCAL, yyscanner);
                               return TK_MACRO_LOCAL;
@@ -3013,27 +3033,27 @@
     YY_BREAK
 case 153:
 YY_RULE_SETUP
-#line 732 "pir.l"
+#line 752 "pir.l"
 { return TK_INT; }
     YY_BREAK
 case 154:
 YY_RULE_SETUP
-#line 733 "pir.l"
+#line 753 "pir.l"
 { return TK_PMC; }
     YY_BREAK
 case 155:
 YY_RULE_SETUP
-#line 734 "pir.l"
+#line 754 "pir.l"
 { return TK_NUM; }
     YY_BREAK
 case 156:
 YY_RULE_SETUP
-#line 735 "pir.l"
+#line 755 "pir.l"
 { return TK_STRING; }
     YY_BREAK
 case 157:
 YY_RULE_SETUP
-#line 737 "pir.l"
+#line 757 "pir.l"
 { /* normal .macro_local */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
                               /* reserve space for {IDENT}, the @ marker and the NULL char. */
@@ -3051,7 +3071,7 @@
     YY_BREAK
 case 158:
 YY_RULE_SETUP
-#line 752 "pir.l"
+#line 772 "pir.l"
 { /* declare a .macro_local based on a parameter */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
 
@@ -3068,7 +3088,7 @@
     YY_BREAK
 case 159:
 YY_RULE_SETUP
-#line 766 "pir.l"
+#line 786 "pir.l"
 { /* .$foo */
                               lexer_state * const lexer = yypirget_extra(yyscanner);
                               macro_table * const table = peek_macro_table(lexer);
@@ -3100,7 +3120,7 @@
     YY_BREAK
 case 160:
 YY_RULE_SETUP
-#line 795 "pir.l"
+#line 815 "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);
@@ -3128,13 +3148,13 @@
     YY_BREAK
 case 161:
 YY_RULE_SETUP
-#line 820 "pir.l"
+#line 840 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 162:
 /* rule 162 can match eol */
 YY_RULE_SETUP
-#line 822 "pir.l"
+#line 842 "pir.l"
 { /* newline after .macro_local <type> <ident> line */
                               yy_pop_state(yyscanner);
                               return TK_NL;
@@ -3142,7 +3162,7 @@
     YY_BREAK
 case 163:
 YY_RULE_SETUP
-#line 827 "pir.l"
+#line 847 "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]);
@@ -3155,7 +3175,7 @@
 
 case 164:
 YY_RULE_SETUP
-#line 837 "pir.l"
+#line 857 "pir.l"
 {
                               yy_push_state(MACROLABEL, yyscanner);
                               return TK_MACRO_LABEL;
@@ -3163,7 +3183,7 @@
     YY_BREAK
 case 165:
 YY_RULE_SETUP
-#line 842 "pir.l"
+#line 862 "pir.l"
 { /* if the "$" is there, it's a macro label using a macro
                                * parameter's value; otherwise it's a normal macro label
                                */
@@ -3184,7 +3204,7 @@
 case 166:
 /* rule 166 can match eol */
 YY_RULE_SETUP
-#line 860 "pir.l"
+#line 880 "pir.l"
 { /* the newline character after a ".macro_label $foo:" declaration */
                               yy_pop_state(yyscanner); /* leave MACROLABEL state */
                               return TK_NL;
@@ -3192,7 +3212,7 @@
     YY_BREAK
 case 167:
 YY_RULE_SETUP
-#line 866 "pir.l"
+#line 886 "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);
@@ -3202,7 +3222,7 @@
     YY_BREAK
 case 168:
 YY_RULE_SETUP
-#line 873 "pir.l"
+#line 893 "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);
@@ -3237,12 +3257,12 @@
 case 169:
 /* rule 169 can match eol */
 YY_RULE_SETUP
-#line 906 "pir.l"
+#line 926 "pir.l"
 { store_macro_char(CURRENT_MACRO(yypirget_extra(yyscanner)), '\n'); }
     YY_BREAK
 case 170:
 YY_RULE_SETUP
-#line 908 "pir.l"
+#line 928 "pir.l"
 {
                                yy_pop_state(yyscanner); /* leave MACROBODY state */
                                return TK_ENDM;
@@ -3250,13 +3270,13 @@
     YY_BREAK
 case 171:
 YY_RULE_SETUP
-#line 913 "pir.l"
+#line 933 "pir.l"
 { /* store everything else */
                                store_macro_char(CURRENT_MACRO(yypirget_extra(yyscanner)), yytext[0]);
                              }
     YY_BREAK
 case YY_STATE_EOF(MACROBODY):
-#line 917 "pir.l"
+#line 937 "pir.l"
 { /* catch run-away macro bodys */
                                yypirerror(yyscanner, yypirget_extra(yyscanner),
                                           "read end of file while reading macro body");
@@ -3288,67 +3308,67 @@
 
 case 172:
 YY_RULE_SETUP
-#line 949 "pir.l"
+#line 969 "pir.l"
 { return ','; }
     YY_BREAK
 case 173:
 YY_RULE_SETUP
-#line 950 "pir.l"
+#line 970 "pir.l"
 { return '['; }
     YY_BREAK
 case 174:
 YY_RULE_SETUP
-#line 951 "pir.l"
+#line 971 "pir.l"
 { return ']'; }
     YY_BREAK
 case 175:
 YY_RULE_SETUP
-#line 953 "pir.l"
+#line 973 "pir.l"
 { return TK_FLAG_MAIN; }
     YY_BREAK
 case 176:
 YY_RULE_SETUP
-#line 954 "pir.l"
+#line 974 "pir.l"
 { return TK_FLAG_LOAD; }
     YY_BREAK
 case 177:
 YY_RULE_SETUP
-#line 955 "pir.l"
+#line 975 "pir.l"
 { return TK_FLAG_INIT; }
     YY_BREAK
 case 178:
 YY_RULE_SETUP
-#line 956 "pir.l"
+#line 976 "pir.l"
 { return TK_FLAG_ANON; }
     YY_BREAK
 case 179:
 YY_RULE_SETUP
-#line 957 "pir.l"
+#line 977 "pir.l"
 { return TK_FLAG_POSTCOMP; }
     YY_BREAK
 case 180:
 YY_RULE_SETUP
-#line 958 "pir.l"
+#line 978 "pir.l"
 { return TK_FLAG_IMMEDIATE; }
     YY_BREAK
 case 181:
 YY_RULE_SETUP
-#line 960 "pir.l"
+#line 980 "pir.l"
 { return TK_PCC_SUB; }
     YY_BREAK
 case 182:
 YY_RULE_SETUP
-#line 961 "pir.l"
+#line 981 "pir.l"
 { return TK_LEX; }
     YY_BREAK
 case 183:
 YY_RULE_SETUP
-#line 962 "pir.l"
+#line 982 "pir.l"
 { return TK_NAMESPACE; }
     YY_BREAK
 case 184:
 YY_RULE_SETUP
-#line 964 "pir.l"
+#line 984 "pir.l"
 {
                           yy_push_state(MACROHEAD, yyscanner);
                           return TK_MACRO;
@@ -3356,7 +3376,7 @@
     YY_BREAK
 case 185:
 YY_RULE_SETUP
-#line 969 "pir.l"
+#line 989 "pir.l"
 {
                           yy_push_state(MACROCONST, yyscanner);
                           return TK_MACRO_CONST;
@@ -3364,17 +3384,17 @@
     YY_BREAK
 case 186:
 YY_RULE_SETUP
-#line 974 "pir.l"
+#line 994 "pir.l"
 { return TK_LINE; }
     YY_BREAK
 case 187:
 YY_RULE_SETUP
-#line 975 "pir.l"
+#line 995 "pir.l"
 { return TK_FILE; }
     YY_BREAK
 case 188:
 YY_RULE_SETUP
-#line 978 "pir.l"
+#line 998 "pir.l"
 { /* macro expansion in PASM mode. */
                           lexer_state * const lexer = yypirget_extra(yyscanner);
                           macro_def   * const macro = find_macro(lexer->macros, yytext + 1);
@@ -3411,7 +3431,7 @@
     YY_BREAK
 case 189:
 YY_RULE_SETUP
-#line 1012 "pir.l"
+#line 1032 "pir.l"
 { /* a label in PASM */
                           yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext, yyleng - 1);
                           return TK_LABEL;
@@ -3419,34 +3439,34 @@
     YY_BREAK
 case 190:
 YY_RULE_SETUP
-#line 1017 "pir.l"
+#line 1037 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                      "symbolic registers are not allowed in PASM mode");
                         }
     YY_BREAK
 case 191:
 YY_RULE_SETUP
-#line 1020 "pir.l"
+#line 1040 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_PREG; }
     YY_BREAK
 case 192:
 YY_RULE_SETUP
-#line 1021 "pir.l"
+#line 1041 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_NREG; }
     YY_BREAK
 case 193:
 YY_RULE_SETUP
-#line 1022 "pir.l"
+#line 1042 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_IREG; }
     YY_BREAK
 case 194:
 YY_RULE_SETUP
-#line 1023 "pir.l"
+#line 1043 "pir.l"
 { yylval->ival = atoi(yytext + 1); return TK_SREG; }
     YY_BREAK
 case 195:
 YY_RULE_SETUP
-#line 1025 "pir.l"
+#line 1045 "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;
@@ -3454,32 +3474,32 @@
     YY_BREAK
 case 196:
 YY_RULE_SETUP
-#line 1030 "pir.l"
+#line 1050 "pir.l"
 { yylval->dval = atof(yytext); return TK_NUMC; }
     YY_BREAK
 case 197:
 YY_RULE_SETUP
-#line 1031 "pir.l"
+#line 1051 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 198:
 YY_RULE_SETUP
-#line 1032 "pir.l"
+#line 1052 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 199:
 YY_RULE_SETUP
-#line 1033 "pir.l"
+#line 1053 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 200:
 YY_RULE_SETUP
-#line 1034 "pir.l"
+#line 1054 "pir.l"
 { yylval->ival = atoi(yytext); return TK_INTC; }
     YY_BREAK
 case 201:
 YY_RULE_SETUP
-#line 1036 "pir.l"
+#line 1056 "pir.l"
 { /* copy the string, remove the quotes. */
                           yylval->sval = dupstrn(yypirget_extra(yyscanner), yytext + 1, yyleng - 2);
                           return TK_STRINGC;
@@ -3487,32 +3507,32 @@
     YY_BREAK
 case 202:
 YY_RULE_SETUP
-#line 1041 "pir.l"
+#line 1061 "pir.l"
 { /* ignore whitespace */ }
     YY_BREAK
 case 203:
 /* rule 203 can match eol */
 YY_RULE_SETUP
-#line 1043 "pir.l"
+#line 1063 "pir.l"
 { return TK_NL; }
     YY_BREAK
 case 204:
 YY_RULE_SETUP
-#line 1045 "pir.l"
+#line 1065 "pir.l"
 { yypirerror(yyscanner, yypirget_extra(yyscanner),
                                      "unrecognized character: %c", yytext[0]);
                         }
     YY_BREAK
 case YY_STATE_EOF(PASM):
-#line 1048 "pir.l"
+#line 1068 "pir.l"
 { yyterminate(); }
     YY_BREAK
 case 205:
 YY_RULE_SETUP
-#line 1050 "pir.l"
+#line 1070 "pir.l"
 ECHO;
     YY_BREAK
-#line 3516 "pirlexer.c"
+#line 3536 "pirlexer.c"
 case YY_STATE_EOF(MACROHEAD):
 case YY_STATE_EOF(MACROLOCAL):
 case YY_STATE_EOF(MACROLABEL):
@@ -4766,7 +4786,7 @@
 
 /* %ok-for-header */
 
-#line 1050 "pir.l"
+#line 1070 "pir.l"
 
 
 

Modified: trunk/compilers/pirc/new/pirlexer.h
==============================================================================
--- trunk/compilers/pirc/new/pirlexer.h	(original)
+++ trunk/compilers/pirc/new/pirlexer.h	Sat Jan  3 03:55:47 2009
@@ -492,7 +492,7 @@
 #undef YY_DECL
 #endif
 
-#line 1050 "pir.l"
+#line 1070 "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	Sat Jan  3 03:55:47 2009
@@ -576,6 +576,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
     struct target      *targ;
@@ -587,7 +588,7 @@
     struct macro_param *pval;
 }
 /* Line 187 of yacc.c.  */
-#line 591 "pirparser.c"
+#line 592 "pirparser.c"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1
@@ -600,7 +601,7 @@
 
 
 /* Line 216 of yacc.c.  */
-#line 604 "pirparser.c"
+#line 605 "pirparser.c"
 
 #ifdef short
 # undef short
@@ -815,16 +816,16 @@
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  10
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1053
+#define YYLAST   1073
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  140
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  166
+#define YYNNTS  167
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  422
+#define YYNRULES  425
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  659
+#define YYNSTATES  662
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -921,36 +922,36 @@
     1093,  1095,  1097,  1099,  1101,  1103,  1105,  1107,  1109,  1111,
     1113,  1115,  1117,  1119,  1121,  1123,  1125,  1127,  1129,  1131,
     1133,  1135,  1137,  1139,  1141,  1143,  1145,  1147,  1149,  1151,
-    1153,  1155,  1157,  1159,  1161,  1163,  1166,  1168,  1170,  1173,
-    1175,  1178,  1180,  1183,  1186,  1188,  1191,  1194,  1196,  1198,
-    1200,  1204,  1206
+    1153,  1155,  1157,  1159,  1161,  1163,  1165,  1167,  1169,  1172,
+    1174,  1176,  1179,  1181,  1184,  1186,  1189,  1192,  1194,  1197,
+    1200,  1202,  1204,  1206,  1210,  1212
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-     141,     0,    -1,   117,   142,    -1,   116,   297,    -1,   143,
+     141,     0,    -1,   117,   142,    -1,   116,   298,    -1,   143,
      144,   143,    -1,    -1,    35,    -1,   145,    -1,   144,    35,
      145,    -1,   168,    -1,   282,    -1,   164,    -1,   162,    -1,
      163,    -1,   159,    -1,   160,    -1,   161,    -1,   146,    -1,
      147,    -1,   148,    -1,   109,    37,   115,    -1,   149,   120,
-     150,   121,    35,   153,   106,    -1,   105,   292,    -1,    -1,
-     151,    -1,   152,    -1,   151,   122,   152,    -1,   292,    -1,
+     150,   121,    35,   153,   106,    -1,   105,   293,    -1,    -1,
+     151,    -1,   152,    -1,   151,   122,   152,    -1,   293,    -1,
       -1,   154,    -1,   155,    -1,   154,   155,    -1,   156,    35,
-      -1,   157,    -1,   158,    -1,   108,   110,    -1,   107,   288,
+      -1,   157,    -1,   158,    -1,   108,   110,    -1,   107,   289,
      111,    -1,     5,    46,    -1,    10,    48,    -1,    11,    46,
       -1,    34,    46,   122,    46,    -1,     3,    46,    -1,     4,
       46,   123,    46,    -1,    13,   124,   165,   125,    -1,    -1,
      166,    -1,   167,    -1,   166,   126,   167,    -1,    46,    -1,
      170,   172,    35,   178,   186,   169,    -1,     7,    -1,     6,
-     171,    -1,   292,    -1,    46,    -1,    -1,   172,   173,    -1,
+     171,    -1,   293,    -1,    46,    -1,    -1,   172,   173,    -1,
       87,    -1,    84,    -1,    85,    -1,    86,    -1,    91,    -1,
       93,    -1,    94,    -1,    92,   174,    -1,    89,   120,   171,
      121,    -1,    88,   278,    -1,    90,   278,    -1,    95,   279,
       -1,    96,   279,    -1,    97,   279,    -1,   120,   175,   121,
       -1,    -1,   176,    -1,   177,    -1,   176,   122,   177,    -1,
-     292,    -1,    46,    -1,   213,    -1,   179,    -1,    -1,   179,
-     180,    -1,     8,   181,   182,    35,    -1,   288,   292,    -1,
+     293,    -1,    46,    -1,   213,    -1,   179,    -1,    -1,   179,
+     180,    -1,     8,   181,   182,    35,    -1,   289,   293,    -1,
       -1,   182,   183,    -1,   256,    -1,   184,    -1,   185,    -1,
      104,   120,   177,   121,    -1,    98,    -1,    -1,   186,   187,
       -1,    36,   188,    -1,   188,    -1,   203,    -1,   220,    -1,
@@ -962,48 +963,48 @@
      112,   191,    -1,   195,    -1,   127,   196,   128,    -1,    -1,
      196,   197,    -1,    35,    -1,   114,    -1,   113,    -1,   112,
      191,    -1,    35,    -1,   160,    35,    -1,     1,    35,    -1,
-      44,   289,    35,    -1,    28,   251,    35,    -1,   204,    35,
+      44,   290,    35,    -1,    28,   251,    35,    -1,   204,    35,
       -1,   205,   206,    -1,   215,    -1,    37,    -1,   207,    -1,
      209,    -1,    -1,   208,    -1,   210,    -1,   208,   122,   210,
       -1,   213,   123,   285,    -1,   211,    -1,   213,    -1,   286,
-      -1,   292,    -1,   291,    -1,   212,    -1,   250,   213,    -1,
+      -1,   293,    -1,   292,    -1,   212,    -1,   250,   213,    -1,
      124,   214,   125,    -1,   285,    -1,   214,   126,   285,    -1,
-     289,   123,   205,   211,   122,   208,    -1,   289,   123,   205,
-     211,    -1,   289,   123,   205,   213,   122,   208,    -1,   218,
-      35,    -1,    37,    -1,   293,    -1,   289,   123,    48,    -1,
-     289,   123,    49,    -1,   289,   123,    46,    -1,   289,   123,
-     291,    -1,   289,   123,   217,    -1,   289,   123,   219,    -1,
-     289,   123,   205,   213,    -1,   289,   123,   293,   213,    -1,
-     289,   123,    50,   213,    -1,   289,   296,   285,    -1,   289,
-      73,    48,    -1,   289,    73,    49,    -1,   289,    74,    48,
-      -1,   289,    74,    49,    -1,   289,    73,   289,    -1,   289,
-      74,   289,    -1,   289,   123,   294,   285,    -1,   289,   123,
-     289,   295,   285,    -1,   293,   213,   123,   285,    -1,    50,
-     213,   123,   285,    -1,    48,   295,   289,    -1,    49,   295,
-     289,    -1,    46,   295,   289,    -1,    46,   295,    46,    -1,
-      48,   295,    48,    -1,    49,   295,    49,    -1,    48,   295,
-      49,    -1,    49,   295,    48,    -1,   221,    35,    -1,   224,
-      44,    37,    45,   292,    -1,   224,    44,    38,    45,   292,
-      -1,   224,    44,    39,    45,   292,    -1,   224,    44,    40,
-      45,   292,    -1,   224,    44,    41,    45,   292,    -1,   224,
-      44,    42,    45,   292,    -1,   224,    44,    43,    45,   292,
-      -1,   224,    44,    45,    45,   292,    -1,   224,    44,    44,
-      45,   292,    -1,   224,   286,   225,   292,    -1,   224,    44,
-      50,   225,   292,    -1,   224,    37,   225,   292,    -1,   224,
-     291,   225,   292,    -1,   224,    38,   225,   292,    -1,   224,
-      39,   225,   292,    -1,   224,    40,   225,   292,    -1,   224,
-      41,   225,   292,    -1,   224,    42,   225,   292,    -1,   224,
-      43,   225,   292,    -1,   224,    45,    45,   292,    -1,   224,
-      45,   122,   292,    -1,   224,    44,    45,   292,    -1,   224,
-      44,   122,   292,    -1,   224,   222,    45,   292,    -1,   289,
-     287,   285,    -1,    48,   287,   289,    -1,    49,   287,   289,
-      -1,    46,   287,   289,    -1,    48,   287,    48,    -1,    48,
-     287,    49,    -1,    49,   287,    48,    -1,    49,   287,    49,
-      -1,    46,   287,    46,    -1,    46,   287,   223,    -1,    48,
-     287,    46,    -1,    49,   287,    46,    -1,    48,    -1,    49,
+     290,   123,   205,   211,   122,   208,    -1,   290,   123,   205,
+     211,    -1,   290,   123,   205,   213,   122,   208,    -1,   218,
+      35,    -1,    37,    -1,   294,    -1,   290,   123,    48,    -1,
+     290,   123,    49,    -1,   290,   123,   287,    -1,   290,   123,
+     292,    -1,   290,   123,   217,    -1,   290,   123,   219,    -1,
+     290,   123,   205,   213,    -1,   290,   123,   294,   213,    -1,
+     290,   123,    50,   213,    -1,   290,   297,   285,    -1,   290,
+      73,    48,    -1,   290,    73,    49,    -1,   290,    74,    48,
+      -1,   290,    74,    49,    -1,   290,    73,   290,    -1,   290,
+      74,   290,    -1,   290,   123,   295,   285,    -1,   290,   123,
+     290,   296,   285,    -1,   294,   213,   123,   285,    -1,    50,
+     213,   123,   285,    -1,    48,   296,   290,    -1,    49,   296,
+     290,    -1,    46,   296,   290,    -1,    46,   296,    46,    -1,
+      48,   296,    48,    -1,    49,   296,    49,    -1,    48,   296,
+      49,    -1,    49,   296,    48,    -1,   221,    35,    -1,   224,
+      44,    37,    45,   293,    -1,   224,    44,    38,    45,   293,
+      -1,   224,    44,    39,    45,   293,    -1,   224,    44,    40,
+      45,   293,    -1,   224,    44,    41,    45,   293,    -1,   224,
+      44,    42,    45,   293,    -1,   224,    44,    43,    45,   293,
+      -1,   224,    44,    45,    45,   293,    -1,   224,    44,    44,
+      45,   293,    -1,   224,   286,   225,   293,    -1,   224,    44,
+      50,   225,   293,    -1,   224,    37,   225,   293,    -1,   224,
+     292,   225,   293,    -1,   224,    38,   225,   293,    -1,   224,
+      39,   225,   293,    -1,   224,    40,   225,   293,    -1,   224,
+      41,   225,   293,    -1,   224,    42,   225,   293,    -1,   224,
+      43,   225,   293,    -1,   224,    45,    45,   293,    -1,   224,
+      45,   122,   293,    -1,   224,    44,    45,   293,    -1,   224,
+      44,   122,   293,    -1,   224,   222,    45,   293,    -1,   290,
+     288,   285,    -1,    48,   288,   290,    -1,    49,   288,   290,
+      -1,    46,   288,   290,    -1,    48,   288,    48,    -1,    48,
+     288,    49,    -1,    49,   288,    48,    -1,    49,   288,    49,
+      -1,    46,   288,    46,    -1,    46,   288,   223,    -1,    48,
+     288,    46,    -1,    49,   288,    46,    -1,    48,    -1,    49,
       -1,    42,    -1,    43,    -1,    45,    -1,   122,    -1,    45,
-     292,    35,    -1,    12,   288,   228,    35,    -1,   229,    -1,
-     228,   122,   229,    -1,   292,   230,    -1,    -1,    98,    -1,
+     293,    35,    -1,    12,   289,   228,    35,    -1,   229,    -1,
+     228,   122,   229,    -1,   293,   230,    -1,    -1,    98,    -1,
        9,    46,   122,   250,    35,    -1,   233,    -1,   234,    -1,
      243,    -1,    26,    35,   235,   238,    35,   240,    27,    35,
       -1,    -1,   236,    -1,   237,    -1,   236,   237,    -1,    30,
@@ -1011,12 +1012,12 @@
       14,   250,    35,    15,   249,    -1,    -1,   122,   250,    -1,
       -1,   241,    -1,   242,    -1,   241,   242,    -1,    31,   254,
       35,    -1,   227,    -1,   244,    35,    -1,   251,   123,   245,
-      -1,   289,   123,   245,    -1,   245,    -1,   247,    -1,   246,
+      -1,   290,   123,   245,    -1,   245,    -1,   247,    -1,   246,
       -1,   250,   129,   249,   261,    -1,   248,   261,    -1,   250,
-      -1,    46,    -1,   292,    -1,    50,    -1,    52,    -1,    46,
-      -1,   292,    -1,    50,    -1,   120,   252,   121,    -1,    -1,
-     253,    -1,   254,    -1,   253,   122,   254,    -1,   289,   255,
-      -1,    46,    55,   289,    -1,    -1,   255,   256,    -1,   102,
+      -1,    46,    -1,   293,    -1,    50,    -1,    52,    -1,    46,
+      -1,   293,    -1,    50,    -1,   120,   252,   121,    -1,    -1,
+     253,    -1,   254,    -1,   253,   122,   254,    -1,   290,   255,
+      -1,    46,    55,   290,    -1,    -1,   255,   256,    -1,   102,
       -1,   103,    -1,   100,    -1,    99,   278,    -1,   258,    -1,
      259,    -1,   268,    -1,   260,    -1,   269,    -1,    18,   261,
       35,    -1,    33,   245,    35,    -1,    19,   261,    35,    -1,
@@ -1029,75 +1030,76 @@
       35,    -1,    -1,   276,   277,    -1,   101,    -1,    99,   278,
       -1,    -1,   279,    -1,   120,    46,   121,    -1,   281,    35,
       -1,   282,    -1,   283,    -1,    17,   284,    -1,    16,   284,
-      -1,    38,   292,   123,    48,    -1,    39,   292,   123,    49,
-      -1,    41,   292,   123,    46,    -1,    46,   292,   123,   286,
-      -1,   289,    -1,   286,    -1,    46,    -1,    48,    -1,    49,
-      -1,    54,    -1,    56,    -1,    57,    -1,    58,    -1,    59,
-      -1,    61,    -1,    60,    -1,    38,    -1,    39,    -1,    40,
-      -1,    41,    -1,   290,    -1,   291,    -1,   292,    -1,    50,
-      -1,    51,    -1,    53,    -1,    52,    -1,    37,    -1,   293,
-      -1,    42,    -1,    43,    -1,    45,    -1,    38,    -1,    39,
-      -1,    41,    -1,    40,    -1,    44,    -1,   130,    -1,   131,
-      -1,   132,    -1,   133,    -1,   130,    -1,   134,    -1,   135,
-      -1,   136,    -1,   137,    -1,   138,    -1,   132,    -1,   139,
-      -1,    69,    -1,    62,    -1,    63,    -1,    64,    -1,    66,
-      -1,    67,    -1,    65,    -1,    68,    -1,    57,    -1,    59,
-      -1,    58,    -1,    61,    -1,    60,    -1,    56,    -1,    75,
-      -1,    76,    -1,    77,    -1,    78,    -1,    81,    -1,    79,
-      -1,    80,    -1,    82,    -1,    83,    -1,    71,    -1,    72,
-      -1,    70,    -1,   298,   299,    -1,   143,    -1,   300,    -1,
-     299,   300,    -1,   301,    -1,   164,    35,    -1,   231,    -1,
-     160,    35,    -1,   146,    35,    -1,   190,    -1,    36,   302,
-      -1,   303,   302,    -1,   305,    -1,   198,    -1,   305,    -1,
-     304,   172,    36,    -1,   118,    -1,   205,   207,    35,    -1
+      -1,    38,   293,   123,    48,    -1,    39,   293,   123,    49,
+      -1,    41,   293,   123,    46,    -1,    46,   293,   123,   286,
+      -1,   290,    -1,   286,    -1,    46,    -1,    48,    -1,    49,
+      -1,    54,    -1,    47,    -1,    46,    -1,    47,    -1,    56,
+      -1,    57,    -1,    58,    -1,    59,    -1,    61,    -1,    60,
+      -1,    38,    -1,    39,    -1,    40,    -1,    41,    -1,   291,
+      -1,   292,    -1,   293,    -1,    50,    -1,    51,    -1,    53,
+      -1,    52,    -1,    37,    -1,   294,    -1,    42,    -1,    43,
+      -1,    45,    -1,    38,    -1,    39,    -1,    41,    -1,    40,
+      -1,    44,    -1,   130,    -1,   131,    -1,   132,    -1,   133,
+      -1,   130,    -1,   134,    -1,   135,    -1,   136,    -1,   137,
+      -1,   138,    -1,   132,    -1,   139,    -1,    69,    -1,    62,
+      -1,    63,    -1,    64,    -1,    66,    -1,    67,    -1,    65,
+      -1,    68,    -1,    57,    -1,    59,    -1,    58,    -1,    61,
+      -1,    60,    -1,    56,    -1,    75,    -1,    76,    -1,    77,
+      -1,    78,    -1,    81,    -1,    79,    -1,    80,    -1,    82,
+      -1,    83,    -1,    71,    -1,    72,    -1,    70,    -1,   299,
+     300,    -1,   143,    -1,   301,    -1,   300,   301,    -1,   302,
+      -1,   164,    35,    -1,   231,    -1,   160,    35,    -1,   146,
+      35,    -1,   190,    -1,    36,   303,    -1,   304,   303,    -1,
+     306,    -1,   198,    -1,   306,    -1,   305,   172,    36,    -1,
+     118,    -1,   205,   207,    35,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   551,   551,   552,   557,   563,   564,   567,   568,   571,
-     572,   573,   574,   575,   576,   577,   578,   579,   586,   587,
-     590,   594,   600,   607,   608,   611,   612,   615,   619,   620,
-     623,   624,   627,   630,   631,   634,   638,   649,   653,   655,
-     659,   665,   669,   673,   678,   679,   683,   685,   689,   693,
-     699,   703,   707,   708,   711,   712,   715,   717,   719,   721,
-     723,   725,   727,   729,   731,   733,   735,   737,   739,   741,
-     745,   750,   754,   758,   767,   778,   780,   782,   786,   795,
-     796,   809,   813,   818,   819,   823,   824,   825,   828,   835,
-     841,   842,   852,   854,   857,   858,   859,   860,   861,   862,
-     863,   864,   865,   866,   867,   868,   869,   870,   871,   877,
-     880,   885,   886,   891,   892,   895,   897,   905,   913,   914,
-     916,   919,   925,   926,   935,   936,   937,   938,   946,   950,
-     954,   963,   970,   977,   980,   981,   984,   993,  1000,  1003,
-    1004,  1007,  1008,  1011,  1047,  1049,  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,   554,   554,   555,   560,   566,   567,   570,   571,   574,
+     575,   576,   577,   578,   579,   580,   581,   582,   589,   590,
+     593,   597,   603,   610,   611,   614,   615,   618,   622,   623,
+     626,   627,   630,   633,   634,   637,   641,   652,   656,   658,
+     662,   668,   672,   676,   681,   682,   686,   688,   692,   696,
+     702,   706,   710,   711,   714,   715,   718,   720,   722,   724,
+     726,   728,   730,   732,   734,   736,   738,   740,   742,   744,
+     748,   753,   757,   761,   770,   781,   783,   785,   789,   798,
+     799,   812,   816,   821,   822,   826,   827,   828,   831,   838,
+     844,   845,   855,   857,   860,   861,   862,   863,   864,   865,
+     866,   867,   868,   869,   870,   871,   872,   873,   874,   880,
+     883,   888,   889,   894,   895,   898,   900,   908,   916,   917,
+     919,   922,   928,   929,   938,   939,   940,   941,   949,   953,
+     957,   966,   973,   980,   983,   984,   987,   996,  1003,  1006,
+    1007,  1010,  1011,  1014,  1050,  1052,  1056,  1058,  1063,  1065,
+    1069,  1092,  1096,  1098,  1107,  1118,  1130,  1140,  1143,  1144,
+    1147,  1156,  1165,  1170,  1175,  1196,  1201,  1242,  1260,  1267,
+    1272,  1283,  1294,  1305,  1316,  1321,  1326,  1331,  1341,  1360,
+    1394,  1396,  1398,  1400,  1402,  1404,  1406,  1408,  1413,  1422,
+    1424,  1426,  1428,  1430,  1432,  1434,  1436,  1438,  1440,  1452,
+    1457,  1459,  1461,  1463,  1465,  1467,  1469,  1471,  1473,  1475,
+    1477,  1479,  1481,  1512,  1538,  1546,  1555,  1564,  1566,  1568,
+    1570,  1572,  1576,  1581,  1583,  1588,  1589,  1592,  1593,  1596,
+    1597,  1600,  1608,  1612,  1614,  1618,  1622,  1623,  1626,  1641,
+    1645,  1646,  1649,  1661,  1662,  1666,  1668,  1672,  1676,  1678,
+    1680,  1686,  1687,  1692,  1693,  1697,  1699,  1708,  1710,  1714,
+    1718,  1720,  1722,  1726,  1727,  1730,  1750,  1757,  1759,  1769,
+    1786,  1788,  1790,  1794,  1803,  1808,  1815,  1816,  1820,  1822,
+    1826,  1828,  1833,  1834,  1838,  1840,  1842,  1844,  1854,  1858,
+    1859,  1860,  1861,  1864,  1869,  1880,  1887,  1892,  1893,  1897,
+    1899,  1903,  1904,  1907,  1911,  1915,  1919,  1928,  1938,  1939,
+    1944,  1946,  1951,  1956,  1957,  1961,  1963,  1967,  1973,  1974,
+    1978,  1980,  1988,  1989,  1993,  1997,  2000,  2001,  2004,  2008,
+    2012,  2014,  2016,  2018,  2026,  2027,  2031,  2032,  2033,  2034,
+    2035,  2038,  2039,  2042,  2043,  2044,  2045,  2046,  2047,  2050,
+    2051,  2052,  2053,  2061,  2064,  2065,  2076,  2077,  2078,  2079,
+    2083,  2084,  2087,  2088,  2089,  2090,  2091,  2092,  2093,  2094,
+    2097,  2098,  2099,  2102,  2103,  2104,  2105,  2106,  2107,  2108,
+    2109,  2110,  2111,  2112,  2113,  2114,  2115,  2116,  2117,  2118,
+    2119,  2120,  2121,  2122,  2123,  2124,  2130,  2131,  2132,  2133,
+    2134,  2135,  2136,  2137,  2138,  2139,  2140,  2141,  2153,  2161,
+    2165,  2166,  2169,  2170,  2171,  2172,  2173,  2174,  2177,  2179,
+    2180,  2183,  2184,  2187,  2191,  2196
 };
 #endif
 
@@ -1171,8 +1173,8 @@
   "opt_return_expressions", "return_expressions", "return_expression",
   "arg_flags", "arg_flag", "opt_paren_string", "paren_string",
   "const_decl_stat", "const_stat", "const_decl", "globalconst_decl",
-  "const_tail", "expression", "constant", "rel_op", "type", "target",
-  "symbol", "reg", "identifier", "keyword", "unop", "binop",
+  "const_tail", "expression", "constant", "stringconst", "rel_op", "type",
+  "target", "symbol", "reg", "identifier", "keyword", "unop", "binop",
   "augmented_op", "pasm_contents", "pasm_init", "pasm_lines", "pasm_line",
   "pasm_statement", "opt_pasm_instruction", "pasm_sub_directive",
   "pasm_sub_head", "pasm_instruction", 0
@@ -1238,15 +1240,15 @@
      271,   271,   272,   273,   273,   274,   274,   275,   276,   276,
      277,   277,   278,   278,   279,   280,   281,   281,   282,   283,
      284,   284,   284,   284,   285,   285,   286,   286,   286,   286,
-     287,   287,   287,   287,   287,   287,   288,   288,   288,   288,
-     289,   290,   290,   291,   291,   291,   291,   292,   292,   293,
-     293,   293,   293,   293,   293,   293,   293,   294,   294,   294,
-     295,   295,   295,   295,   295,   295,   295,   295,   295,   295,
-     295,   295,   295,   295,   295,   295,   295,   295,   295,   295,
+     286,   287,   287,   288,   288,   288,   288,   288,   288,   289,
+     289,   289,   289,   290,   291,   291,   292,   292,   292,   292,
+     293,   293,   294,   294,   294,   294,   294,   294,   294,   294,
      295,   295,   295,   296,   296,   296,   296,   296,   296,   296,
-     296,   296,   296,   296,   296,   297,   298,   299,   299,   300,
-     300,   300,   300,   300,   300,   301,   301,   301,   302,   302,
-     303,   304,   305
+     296,   296,   296,   296,   296,   296,   296,   296,   296,   296,
+     296,   296,   296,   296,   296,   296,   297,   297,   297,   297,
+     297,   297,   297,   297,   297,   297,   297,   297,   298,   299,
+     300,   300,   301,   301,   301,   301,   301,   301,   302,   302,
+     302,   303,   303,   304,   305,   306
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -1292,9 +1294,9 @@
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       1,     1,     1,     1,     1,     2,     1,     1,     2,     1,
-       2,     1,     2,     2,     1,     2,     2,     1,     1,     1,
-       3,     1,     3
+       1,     1,     1,     1,     1,     1,     1,     1,     2,     1,
+       1,     2,     1,     2,     1,     2,     2,     1,     2,     2,
+       1,     1,     1,     3,     1,     3
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -1302,412 +1304,418 @@
    means the default is an error.  */
 static const yytype_uint16 yydefact[] =
 {
-       0,     5,     5,     0,     6,   406,     3,     0,     2,     0,
+       0,     5,     5,     0,     6,   409,     3,     0,     2,     0,
        1,     0,     0,     0,     0,     0,   136,     0,     0,   111,
-     421,     0,    18,    19,     0,     0,     0,   414,   139,   411,
-     405,   407,   409,     0,    54,   417,     0,     0,     0,     0,
+     424,     0,    18,    19,     0,     0,     0,   417,   139,   414,
+     408,   410,   412,     0,    54,   420,     0,     0,     0,     0,
        0,     0,     5,     7,    17,    14,    15,    16,    12,    13,
-      11,     9,    54,    10,     0,    38,    39,    44,   128,   418,
-     415,   419,   357,   362,   363,   365,   364,   359,   360,   366,
-     361,    22,   358,     0,   113,     0,   413,    23,   412,   410,
-     336,   337,   338,   353,   354,   356,   355,   339,     0,     0,
-     140,   141,   144,   149,   145,     0,   146,   148,   147,   408,
-     416,     0,    41,     0,    37,    53,    51,    52,     0,     0,
-       0,     0,   328,     0,     6,     4,     0,     0,    48,     0,
-      45,    46,    20,   111,   117,   118,   122,     0,   114,   115,
-     120,   110,     0,    24,    25,    27,   353,     0,   152,   335,
-     334,   350,   351,   352,   422,     0,   150,   420,    57,    58,
-      59,    56,   322,     0,   322,    60,     0,    61,    62,     0,
-       0,     0,    55,     0,     0,     0,     0,     0,     0,     8,
-      79,   274,     0,   273,    43,     0,   119,     0,   112,     0,
-       0,     0,   151,     0,   142,     0,    65,   323,     0,    66,
-      71,    63,    67,    68,    69,    42,     0,     0,     0,     0,
-      40,    90,    78,   238,    47,   124,   111,   126,   125,   121,
-     123,   116,    28,    26,   153,     0,     0,    76,     0,    72,
-      73,    77,    75,   330,   331,   332,   333,     0,     0,    80,
-     127,     0,     0,     0,    29,    30,     0,    33,    34,   324,
-      64,    70,     0,     0,    50,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   136,   359,   360,   366,   361,
-     268,   353,   276,     0,    49,    91,    93,   107,   109,   105,
-     106,   108,   104,   103,    94,     0,   139,   135,   102,     0,
-      95,     0,     0,    96,    97,    98,   101,   239,   240,   241,
-       0,   262,   264,   263,     0,   267,     0,   100,   288,   289,
-     291,   290,   292,    99,     0,   326,   327,     0,   352,   358,
-     346,   347,   348,   349,    83,     0,     0,    35,    21,    31,
-      32,    74,   130,     0,   329,   297,     0,     0,   308,   313,
-     243,     0,     0,    92,     0,     0,     0,     0,     0,   277,
-     278,   282,   129,   133,   134,   137,   138,   145,   157,   188,
-     357,   362,   363,   365,   364,   359,   360,   366,   361,   336,
-     337,   338,     0,     0,     0,   351,   259,   266,     0,     0,
-     325,   404,   402,   403,     0,     0,   393,   394,   395,   396,
-     398,   399,   397,   400,   401,     0,     0,     0,     0,    82,
-      36,     0,   233,   236,   336,     0,   298,   299,   302,   301,
-     318,   305,   293,   295,     0,     0,   309,   310,     0,     0,
-     314,   315,     0,     0,   244,   245,   132,   294,   131,   231,
-       0,     0,   275,     0,   280,     0,   229,   230,     0,     0,
+      11,     9,    54,    10,     0,    38,    39,    44,   128,   421,
+     418,   422,   360,   365,   366,   368,   367,   362,   363,   369,
+     364,    22,   361,     0,   113,     0,   416,    23,   415,   413,
+     336,   340,   337,   338,   356,   357,   359,   358,   339,     0,
+       0,   140,   141,   144,   149,   145,     0,   146,   148,   147,
+     411,   419,     0,    41,     0,    37,    53,    51,    52,     0,
+       0,     0,     0,   328,     0,     6,     4,     0,     0,    48,
+       0,    45,    46,    20,   111,   117,   118,   122,     0,   114,
+     115,   120,   110,     0,    24,    25,    27,   356,     0,   152,
+     335,   334,   353,   354,   355,   425,     0,   150,   423,    57,
+      58,    59,    56,   322,     0,   322,    60,     0,    61,    62,
+       0,     0,     0,    55,     0,     0,     0,     0,     0,     0,
+       8,    79,   274,     0,   273,    43,     0,   119,     0,   112,
+       0,     0,     0,   151,     0,   142,     0,    65,   323,     0,
+      66,    71,    63,    67,    68,    69,    42,     0,     0,     0,
+       0,    40,    90,    78,   238,    47,   124,   111,   126,   125,
+     121,   123,   116,    28,    26,   153,     0,     0,    76,     0,
+      72,    73,    77,    75,   330,   331,   332,   333,     0,     0,
+      80,   127,     0,     0,     0,    29,    30,     0,    33,    34,
+     324,    64,    70,     0,     0,    50,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   136,   227,   228,   369,
+     364,   268,   356,   276,     0,    49,    91,    93,   107,   109,
+     105,   106,   108,   104,   103,    94,     0,   139,   135,   102,
+       0,    95,     0,     0,    96,    97,    98,   101,   239,   240,
+     241,     0,   262,   264,   263,     0,   267,     0,   100,   288,
+     289,   291,   290,   292,    99,     0,   326,   327,     0,   355,
+     361,   349,   350,   351,   352,    83,     0,     0,    35,    21,
+      31,    32,    74,   130,     0,   329,   297,     0,     0,   308,
+     313,   243,     0,     0,    92,     0,     0,     0,     0,     0,
+     277,   278,   282,   129,   133,   134,   137,   138,   145,   157,
+     188,   360,   365,   366,   368,   367,   362,   363,   369,   364,
+     336,   337,   338,     0,     0,     0,   354,   259,   266,     0,
+       0,   325,   407,   405,   406,     0,     0,   396,   397,   398,
+     399,   401,   402,   400,   403,   404,     0,     0,     0,     0,
+      82,    36,     0,   233,   236,   336,     0,   298,   299,   302,
+     301,   318,   305,   293,   295,     0,     0,   309,   310,     0,
+       0,   314,   315,     0,     0,   244,   245,   132,   294,   131,
+     231,     0,     0,   275,     0,   280,     0,   229,   230,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   340,   341,
-     342,   343,   345,   344,     0,     0,     0,     0,     0,     0,
-       0,   272,   270,   271,     0,   269,   260,   170,   171,   174,
-     172,   173,   175,   357,   162,   160,   161,   353,   367,   368,
-     369,     0,   164,   165,   261,     0,   351,   358,     0,   169,
-       0,    81,    89,   322,   286,   284,   285,     0,    84,    86,
-      87,    85,   232,     0,   237,   235,     0,   296,     0,   304,
-       0,     0,   311,     0,     0,   316,     0,     0,     0,     0,
-       0,   246,   179,   281,   279,   283,   143,   200,   202,   203,
-     204,   205,   206,   207,     0,     0,     0,     0,     0,     0,
-       0,     0,   361,   210,     0,   211,   208,   209,   221,   225,
-     226,   222,   216,   223,   217,   218,   214,   224,   219,   220,
-     215,   212,   198,   213,   201,   265,   392,   387,   389,   388,
-     391,   390,   380,   381,   382,   385,   383,   384,   386,   379,
-     371,   377,   370,   372,   373,   374,   375,   376,   378,     0,
-       0,     0,   168,   155,   166,     0,   167,   176,   178,   287,
-       0,   234,   303,   300,   322,   320,   319,   312,   307,   317,
-     306,   247,     0,   251,   267,   249,   253,   189,   190,   191,
-     192,   193,   194,   195,   197,   196,   199,   183,   182,   184,
-     186,   180,   187,   185,   181,     0,     0,   177,     0,   321,
-       0,     0,   248,     0,   258,     0,   254,   255,   154,   156,
-      88,     0,   252,     0,     0,   256,   250,   257,   242
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   343,
+     344,   345,   346,   348,   347,     0,     0,     0,     0,     0,
+       0,     0,   272,   270,   271,     0,   269,   260,   170,   171,
+     174,   172,   173,   175,   360,   268,   342,   160,   161,   356,
+     370,   371,   372,     0,   164,   165,   261,   162,     0,   354,
+     361,     0,   169,     0,    81,    89,   322,   286,   284,   285,
+       0,    84,    86,    87,    85,   232,     0,   237,   235,     0,
+     296,     0,   304,     0,     0,   311,     0,     0,   316,     0,
+       0,     0,     0,     0,   246,   179,   281,   279,   283,   143,
+     200,   202,   203,   204,   205,   206,   207,     0,     0,     0,
+       0,     0,     0,     0,     0,   364,   210,     0,   211,   208,
+     209,   221,   225,   226,   222,   216,   223,   217,   218,   214,
+     224,   219,   220,   215,   212,   198,   213,   201,   265,   395,
+     390,   392,   391,   394,   393,   383,   384,   385,   388,   386,
+     387,   389,   382,   374,   380,   373,   375,   376,   377,   378,
+     379,   381,     0,     0,     0,   168,   155,   166,     0,   167,
+     176,   178,   287,     0,   234,   303,   300,   322,   320,   319,
+     312,   307,   317,   306,   247,     0,   251,   267,   249,   253,
+     189,   190,   191,   192,   193,   194,   195,   197,   196,   199,
+     183,   182,   184,   186,   180,   187,   185,   181,     0,     0,
+     177,     0,   321,     0,     0,   248,     0,   258,     0,   254,
+     255,   154,   156,    88,     0,   252,     0,     0,   256,   250,
+     257,   242
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
       -1,     3,     8,     5,    42,    43,    21,    22,    23,    24,
-     132,   133,   134,   233,   234,   235,   236,   237,   238,    45,
-      25,    47,    48,    49,    26,   119,   120,   121,    51,   264,
-      52,   106,   101,   162,   191,   218,   219,   220,   201,   202,
-     229,   314,   388,   498,   499,   500,   227,   265,   266,   267,
-      27,    75,   127,   128,   129,   130,   177,   210,    59,   270,
-     271,   272,   273,   274,   275,    28,   344,    89,    90,   346,
-      91,    92,    93,    94,   137,   277,   278,   482,   279,   483,
-     280,   281,   362,   551,   282,   428,   283,   284,   391,   392,
-     505,    29,   286,   287,   288,   413,   414,   415,   520,   642,
-     645,   646,   647,   289,   290,   291,   292,   293,   294,   464,
-      95,   296,   338,   339,   340,   424,   501,   297,   298,   299,
-     300,   326,   395,   396,   397,   398,   399,   400,   301,   302,
-     405,   406,   407,   409,   410,   411,   509,   606,   186,   187,
-     303,   304,    53,   306,   112,   401,   139,   454,   315,   140,
-     141,   142,   143,    72,   488,   589,   386,     6,     7,    30,
-      31,    32,    60,    33,    34,    35
+     133,   134,   135,   234,   235,   236,   237,   238,   239,    45,
+      25,    47,    48,    49,    26,   120,   121,   122,    51,   265,
+      52,   107,   102,   163,   192,   219,   220,   221,   202,   203,
+     230,   315,   389,   501,   502,   503,   228,   266,   267,   268,
+      27,    75,   128,   129,   130,   131,   178,   211,    59,   271,
+     272,   273,   274,   275,   276,    28,   345,    90,    91,   347,
+      92,    93,    94,    95,   138,   278,   279,   484,   280,   485,
+     281,   282,   363,   554,   283,   429,   284,   285,   392,   393,
+     508,    29,   287,   288,   289,   414,   415,   416,   523,   645,
+     648,   649,   650,   290,   291,   292,   293,   294,   295,   465,
+      96,   297,   339,   340,   341,   425,   504,   298,   299,   300,
+     301,   327,   396,   397,   398,   399,   400,   401,   302,   303,
+     406,   407,   408,   410,   411,   412,   512,   609,   187,   188,
+     304,   305,    53,   307,   113,   402,   140,   487,   455,   316,
+     141,   142,   143,   144,    72,   491,   592,   387,     6,     7,
+      30,    31,    32,    60,    33,    34,    35
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -591
+#define YYPACT_NINF -577
 static const yytype_int16 yypact[] =
 {
-      -2,    11,    11,    54,  -591,  -591,  -591,    14,  -591,    25,
-    -591,    49,    58,    75,     3,    96,  -591,   715,   111,    35,
-    -591,   125,  -591,  -591,    43,   134,   161,  -591,   428,  -591,
-      14,  -591,  -591,    96,  -591,  -591,   165,   178,   181,   998,
-     108,   202,   172,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,   128,  -591,  -591,   206,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,   143,    23,   221,  -591,   715,  -591,  -591,
-    -591,  -591,  -591,   147,  -591,  -591,  -591,  -591,   742,   237,
-     152,  -591,  -591,  -591,  -591,   151,  -591,  -591,   157,  -591,
-    -591,   613,  -591,   160,  -591,  -591,  -591,  -591,   715,   715,
-     715,   715,  -591,   166,    25,  -591,   598,   292,  -591,   164,
-     169,  -591,  -591,    35,  -591,  -591,  -591,   175,   168,  -591,
-    -591,  -591,   179,   180,  -591,  -591,  -591,    56,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,   428,  -591,  -591,  -591,  -591,
-    -591,  -591,   185,   187,   185,  -591,   189,  -591,  -591,   185,
-     185,   185,  -591,   276,   200,   201,   216,   217,   295,  -591,
-    -591,  -591,   310,  -591,  -591,   206,  -591,    -3,  -591,    23,
-     311,   715,  -591,   742,  -591,   302,  -591,  -591,   998,  -591,
-     223,  -591,  -591,  -591,  -591,  -591,   301,   304,   308,   113,
-    -591,  -591,   342,  -591,  -591,  -591,    35,  -591,  -591,  -591,
-    -591,  -591,   115,  -591,  -591,   234,   235,  -591,   236,   240,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,   275,   239,  -591,
-    -591,   239,   248,   253,   115,  -591,   326,  -591,  -591,  -591,
-    -591,  -591,   223,   328,  -591,   239,   108,   244,   244,   331,
-     332,   334,   250,   984,   527,   641,   760,   778,   562,   715,
-    -591,    84,   453,   336,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,   337,   428,  -591,  -591,   338,
-    -591,   339,   796,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-     340,  -591,  -591,  -591,   244,   247,   255,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,   344,  -591,  -591,   655,   -72,   151,
-    -591,  -591,  -591,  -591,  -591,   715,   272,  -591,  -591,  -591,
-    -591,  -591,  -591,   715,  -591,   814,   349,   350,   368,   370,
-     359,   357,   358,  -591,   362,   363,   271,   345,   278,   279,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,   282,  -591,  -591,
-      -6,    -6,    -6,    -6,    -6,    -6,    -6,   407,    -5,   174,
-     174,   174,   364,    -6,   174,    -6,  -591,  -591,   968,   984,
-    -591,  -591,  -591,  -591,   883,   900,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,    26,   742,   284,   117,  -591,
-    -591,   -20,  -591,   312,   365,   297,   299,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,   742,   396,   368,  -591,   742,   397,
-     370,  -591,   742,    76,   359,  -591,  -591,  -591,  -591,  -591,
-     742,   562,  -591,   453,   141,   742,  -591,  -591,   715,   715,
-     715,   715,   715,   715,   715,   378,   379,   380,   382,   386,
-     387,   388,   390,  1008,    -6,   715,   715,   715,  -591,  -591,
-    -591,  -591,  -591,  -591,   832,   849,   866,   715,   715,   742,
-     715,  -591,  -591,  -591,   244,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,   149,   528,   612,   612,    84,  -591,  -591,
-    -591,   428,  -591,  -591,  -591,   612,   401,   -21,   742,  -591,
-     742,  -591,  -591,   185,  -591,  -591,  -591,   317,  -591,  -591,
-    -591,  -591,  -591,   715,  -591,  -591,   742,  -591,   814,    79,
-     403,   404,  -591,   418,   423,  -591,   424,   292,   984,   292,
-     425,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,   715,   715,   715,   715,   715,   715,
-     715,   715,   715,  -591,   715,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,   951,
-     917,   934,  -591,   320,   341,   742,  -591,  -591,  -591,  -591,
-     223,  -591,  -591,  -591,   185,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,   426,   353,  -591,  -591,    21,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,   428,   428,  -591,   366,  -591,
-     447,   292,  -591,   453,  -591,   456,    21,  -591,   152,   152,
-    -591,   968,  -591,   449,   450,  -591,  -591,  -591,  -591
+      53,    -4,    -4,    18,  -577,  -577,  -577,    15,  -577,    71,
+    -577,   -11,    31,    45,   -12,   146,  -577,   672,    89,    12,
+    -577,   105,  -577,  -577,    64,   116,   164,  -577,   640,  -577,
+      15,  -577,  -577,   146,  -577,  -577,   145,   155,   158,  1018,
+     106,   183,   175,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,   108,  -577,  -577,   186,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,   121,    23,   204,  -577,   672,  -577,  -577,
+    -577,  -577,  -577,  -577,   117,  -577,  -577,  -577,  -577,   849,
+     207,   122,  -577,  -577,  -577,  -577,   123,  -577,  -577,   124,
+    -577,  -577,   696,  -577,   126,  -577,  -577,  -577,  -577,   672,
+     672,   672,   672,  -577,   129,    71,  -577,   634,  1004,  -577,
+     120,   133,  -577,  -577,    12,  -577,  -577,  -577,   125,   139,
+    -577,  -577,  -577,   134,   140,  -577,  -577,  -577,    -8,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,   640,  -577,  -577,  -577,
+    -577,  -577,  -577,   160,   161,   160,  -577,   162,  -577,  -577,
+     160,   160,   160,  -577,   237,   163,   165,   166,   209,   238,
+    -577,  -577,  -577,   250,  -577,  -577,   186,  -577,    -5,  -577,
+      23,   298,   672,  -577,   849,  -577,   294,  -577,  -577,  1018,
+    -577,    25,  -577,  -577,  -577,  -577,  -577,   293,   295,   296,
+     149,  -577,  -577,   335,  -577,  -577,  -577,    12,  -577,  -577,
+    -577,  -577,  -577,   111,  -577,  -577,   224,   225,  -577,   228,
+     229,  -577,  -577,  -577,  -577,  -577,  -577,  -577,   531,   168,
+    -577,  -577,   168,   240,   241,   111,  -577,   319,  -577,  -577,
+    -577,  -577,  -577,    25,   320,  -577,   168,   106,   236,   236,
+     322,   323,   324,   242,   355,   622,   748,   674,   734,   410,
+     672,  -577,    19,   285,   325,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,   328,   640,  -577,  -577,
+     330,  -577,   331,   867,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,   332,  -577,  -577,  -577,   236,   239,   251,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,   340,  -577,  -577,   762,   -18,
+     123,  -577,  -577,  -577,  -577,  -577,   672,   265,  -577,  -577,
+    -577,  -577,  -577,  -577,   672,  -577,   885,   342,   343,   359,
+     360,   350,   348,   367,  -577,   368,   375,   288,   364,   299,
+     301,  -577,  -577,  -577,  -577,  -577,  -577,  -577,   302,  -577,
+    -577,   -24,   -24,   -24,   -24,   -24,   -24,   -24,   118,   -22,
+     156,   156,   156,   376,   -24,   156,   -24,  -577,  -577,   988,
+     355,  -577,  -577,  -577,  -577,   253,   937,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,   430,   849,   305,    90,
+    -577,  -577,   -16,  -577,   334,   379,   314,   315,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,   849,   413,   359,  -577,   849,
+     414,   360,  -577,   849,    99,   350,  -577,  -577,  -577,  -577,
+    -577,   849,   410,  -577,   285,   -13,   849,  -577,  -577,   672,
+     672,   672,   672,   672,   672,   672,   393,   395,   398,   400,
+     401,   412,   419,   420,  1028,   -24,   672,   672,   672,  -577,
+    -577,  -577,  -577,  -577,  -577,   226,   903,   920,   672,   672,
+     849,   672,  -577,  -577,  -577,   236,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,   552,   252,  -577,   639,   639,    19,
+    -577,  -577,  -577,   640,  -577,  -577,  -577,  -577,   639,   449,
+     -20,   849,  -577,   849,  -577,  -577,   160,  -577,  -577,  -577,
+     365,  -577,  -577,  -577,  -577,  -577,   672,  -577,  -577,   849,
+    -577,   885,    86,   451,   452,  -577,   453,   455,  -577,   457,
+    1004,   355,  1004,   475,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,   672,   672,   672,
+     672,   672,   672,   672,   672,   672,  -577,   672,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,   456,   954,   971,  -577,   369,   390,   849,  -577,
+    -577,  -577,  -577,    25,  -577,  -577,  -577,   160,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,   478,   392,  -577,  -577,    24,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,   640,   640,
+    -577,   394,  -577,   501,  1004,  -577,   285,  -577,   490,    24,
+    -577,   122,   122,  -577,   988,  -577,   483,   484,  -577,  -577,
+    -577,  -577
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -591,  -591,  -591,    39,  -591,   374,     8,  -591,  -591,  -591,
-    -591,  -591,   327,  -591,  -591,   273,  -591,  -591,  -591,  -591,
-      -1,  -591,  -591,  -591,    10,  -591,  -591,   314,  -591,  -591,
-    -591,   322,   459,  -591,  -591,  -591,  -591,  -235,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -591,  -591,  -591,   258,  -591,
-    -207,  -102,  -591,  -591,   335,  -591,  -591,  -591,  -193,  -591,
-    -591,  -591,  -591,  -591,  -591,  -217,  -591,   254,  -397,  -591,
-     371,    34,  -591,   -91,  -591,  -591,  -591,  -591,  -591,  -591,
-    -591,  -591,  -591,  -591,  -591,  -267,  -591,  -590,  -591,    28,
-    -591,  -172,  -591,  -591,  -591,  -591,  -591,   118,  -591,  -591,
-    -591,  -591,  -113,  -591,  -591,  -240,  -591,  -591,    16,  -116,
-    -115,   288,  -591,  -591,  -414,  -591,   123,  -591,  -591,  -591,
-    -591,  -236,  -591,  -591,    33,  -591,  -229,    36,  -591,  -591,
-    -591,  -591,   142,  -591,  -591,   140,  -591,  -591,  -149,   -19,
-    -591,  -591,  -147,  -591,   313,   -82,   -27,  -155,  -148,  -209,
-    -591,   -25,   -17,  -211,  -591,  -332,  -591,  -591,  -591,  -591,
-     524,  -591,   523,  -591,  -591,    29
+    -577,  -577,  -577,    30,  -577,   418,     1,  -577,  -577,  -577,
+    -577,  -577,   347,  -577,  -577,   300,  -577,  -577,  -577,  -577,
+      -1,  -577,  -577,  -577,     7,  -577,  -577,   358,  -577,  -577,
+    -577,   356,   485,  -577,  -577,  -577,  -577,  -239,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -577,  -577,  -577,   281,  -577,
+    -201,  -104,  -577,  -577,   371,  -577,  -577,  -577,  -199,  -577,
+    -577,  -577,  -577,  -577,  -577,  -215,  -577,   262,  -414,  -577,
+     406,    73,  -577,   -57,  -577,  -577,  -577,  -577,  -577,  -577,
+    -577,  -577,  -577,  -577,  -577,  -307,  -577,  -576,  -577,    38,
+    -577,  -175,  -577,  -577,  -577,  -577,  -577,   143,  -577,  -577,
+    -577,  -577,   -95,  -577,  -577,  -240,  -577,  -577,    42,   -89,
+    -113,   326,  -577,  -577,  -415,  -577,   153,  -577,  -577,  -577,
+    -577,  -237,  -577,  -577,    69,  -577,  -371,    76,  -577,  -577,
+    -577,  -577,   181,  -577,  -577,   196,  -577,  -577,  -148,    61,
+    -577,  -577,  -145,  -577,   361,   -87,   -27,  -577,  -183,  -147,
+    -222,  -577,   -25,   -17,  -211,  -577,  -311,  -577,  -577,  -577,
+    -577,   579,  -577,   577,  -577,  -577,    63
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
    If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -358
+#define YYTABLE_NINF -364
 static const yytype_int16 yytable[] =
 {
-      71,    96,   172,    97,   146,   189,   138,   321,    46,   524,
-     276,    98,   327,   332,  -159,   502,   309,    44,   307,    50,
-     268,   176,   107,    11,    12,    13,   644,    14,    36,    37,
-      38,    39,   205,   245,   269,    12,    13,   276,    14,   426,
-     446,     9,    40,   309,    61,   307,     4,   268,  -273,   334,
-      15,    16,   643,   341,    10,   285,   644,  -273,   367,    41,
-     135,   269,    61,   473,    63,    64,    65,    66,    67,    68,
-      69,    70,   474,   364,   475,   476,   477,    84,    85,    86,
-     305,   115,   285,   316,   429,   430,   431,   432,   433,   434,
-     517,   164,   165,   166,   167,    54,   458,   323,   460,   221,
-     173,   214,   503,    88,   230,   518,    55,   305,   519,   206,
-     207,   208,   295,    46,     1,     2,   427,   447,    96,    17,
-      97,    56,    44,    18,    50,   209,    19,    57,    98,   466,
-      17,    58,    20,    16,    18,   123,   124,   125,   295,   295,
-     192,   193,   194,   590,   591,   484,   108,   109,    73,   110,
-     126,   221,   491,   595,   111,    74,   478,   479,   480,    80,
-      76,    81,    82,    77,   135,   469,   472,    87,   481,    78,
-     336,   107,   226,   222,   487,   510,   485,   544,   604,   513,
-     605,   182,   183,   516,  -158,   347,  -136,  -136,  -136,  -136,
-    -136,  -136,  -136,  -136,  -136,  -136,    79,  -136,  -136,  -136,
-    -136,  -136,  -136,  -136,  -274,   455,   456,   114,    88,   459,
-     308,   102,   523,  -274,   341,   492,   493,   494,   387,   495,
-     496,   497,   231,   232,   103,   222,   263,   104,   565,   653,
-     448,   449,   450,   451,   452,   453,   173,   308,   648,   649,
-     493,   494,   335,   495,   496,   552,   556,   560,   113,    96,
-     117,    97,   118,   263,   295,   363,   131,   365,   122,    98,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,   217,
-     295,  -274,   144,  -136,   145,    88,   243,   310,   311,   312,
-     313,  -273,   244,   163,    11,    12,    13,   245,   168,   174,
-     179,   246,    40,   247,   248,   175,   178,   249,   389,   250,
-     180,   251,   181,   252,   489,   185,   393,   188,   253,   190,
-      58,   254,   255,    63,    64,    65,    66,   256,   257,   258,
-     259,   260,   195,   196,   197,   261,    84,    85,    86,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,   522,   198,
-     199,   200,   171,   526,   599,   203,   212,    88,   215,   223,
-     228,   465,   173,   224,   225,   239,   240,   241,   317,   318,
-     486,   320,   242,   322,   325,   638,   328,   329,   308,   330,
-     262,   342,   343,   348,   349,   366,   368,   563,   369,   370,
-     628,   631,   634,   390,   402,   403,   592,    19,   404,   412,
-     594,   408,   416,   417,   420,   262,   596,   418,   419,   422,
-     421,   423,   612,   614,   615,   425,   597,   490,   598,   457,
-     504,   527,   528,   529,   530,   531,   532,   533,   507,   511,
-     506,   508,   514,   534,   535,   536,   543,   537,   545,   546,
-     547,   538,   539,   540,   341,   541,  -163,   600,   607,   608,
-     561,   562,   635,   564,   435,   436,   437,   438,   439,   440,
-     441,   442,   443,   609,    96,   639,    97,   444,   610,   611,
-     616,   640,   651,   636,    98,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,    80,   641,    81,    82,    83,    84,
-      85,    86,    87,   654,   657,   658,   393,   650,   169,   204,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,   337,
-     173,   173,   173,   136,    84,    85,    86,   319,   213,   221,
-     216,   116,   333,   637,   211,   593,   184,   617,   618,   619,
-     620,   621,   622,   623,   624,   625,   652,   626,   243,   445,
-     345,   601,   521,   655,   613,   656,    11,    12,    13,   245,
-     331,   603,   602,   246,    40,   247,   248,   525,   512,   249,
-     515,   250,    88,   251,    99,   252,   100,     0,     0,   324,
-     253,     0,    58,     0,   255,    63,    64,    65,    66,   256,
-     257,   258,   259,   260,     0,     0,     0,   261,    84,    85,
-      86,     0,     0,   222,   566,   567,   568,   569,   570,   571,
-     572,   573,   574,   575,   576,   577,   578,   579,     0,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    96,    96,
-      97,    97,   136,    84,    85,    86,     0,     0,    98,    98,
-       0,     0,     0,     0,   173,     0,     0,     0,     0,     0,
-       0,     0,     0,   170,   465,     0,     0,     0,     0,    19,
-       0,     0,     0,     0,     0,     0,     0,   262,  -268,   147,
-       0,     0,     0,     0,     0,     0,     0,     0,   580,     0,
-     581,   582,   583,   584,   585,   586,   587,   588,   566,   567,
-     568,   569,   570,   571,   572,   573,   574,   575,   576,   577,
-     578,   579,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,   158,   159,   160,   161,     0,   148,   149,   150,
+      71,    97,   139,    98,   322,   173,   308,   190,    46,   527,
+      44,    99,   328,   277,   333,  -159,    50,   310,    10,   505,
+     177,   427,   108,   447,    11,    12,    13,   269,    14,   270,
+     206,     4,     9,   308,   513,    54,   246,   335,   516,   147,
+     277,   342,   519,   647,   310,   430,   431,   432,   433,   434,
+     435,    15,    16,   286,   269,   646,   270,   459,   368,   461,
+     136,   365,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,   218,   116,   647,    36,    37,    38,    39,    61,    55,
+     286,    12,    13,   306,    14,   317,   496,   497,    40,   498,
+     499,    56,   165,   166,   167,   168,    61,   215,   428,   324,
+     448,   174,  -273,   231,    89,    41,   506,   207,   208,   209,
+     306,  -273,    57,   520,    46,   296,    44,   183,   184,    97,
+      17,    98,    50,   210,    18,   494,    73,    19,   521,    99,
+     467,   522,    74,    20,   222,   124,   125,   126,   547,  -274,
+      76,   296,   296,    89,   109,   110,   486,   111,  -274,    89,
+     127,    78,   112,   470,   473,   436,   437,   438,   439,   440,
+     441,   442,   443,   444,   488,   136,   593,   594,   445,     1,
+       2,   483,   108,   227,   223,   490,    17,   598,   456,   457,
+      18,    58,   460,    16,    77,   607,   222,   608,   495,   496,
+     497,   103,   498,   499,   500,    80,    81,    82,    83,    79,
+     526,   104,   342,    88,   105,   337,   311,   312,   313,   314,
+     115,   309,   449,   450,   451,   452,   453,   454,   232,   233,
+     348,   193,   194,   195,   651,   652,   223,   264,   568,   114,
+     118,   656,   119,   555,   559,   563,   123,   174,   309,   132,
+     446,  -274,   145,   336,   146,   175,   179,    89,  -273,   164,
+      97,   169,    98,   388,   264,   181,   364,   296,   366,   176,
+      99,   180,   182,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,   551,   296,   552,   553,   137,    85,    86,    87,
+     186,   189,   191,   196,   201,   204,   197,  -341,   198,   199,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,   390,
+     492,   468,   469,   137,    85,    86,    87,   394,   569,   570,
+     571,   572,   573,   574,   575,   576,   577,   578,   579,   580,
+     581,   582,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,   338,   200,   213,   525,   137,    85,    86,    87,   529,
+     216,   224,   226,   229,   225,   240,   241,   319,   602,   242,
+     318,   243,   466,   174,   321,   323,   326,   329,   330,   331,
+     343,   489,   263,   344,   641,   349,   350,   367,   369,   309,
+     631,   634,   637,   566,   370,   371,   391,   403,   404,   405,
+     413,   409,   583,   417,   584,   585,   586,   587,   588,   589,
+     590,   591,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,   261,   418,   419,   600,   172,   601,   615,   617,   618,
+     420,   421,   530,   531,   532,   533,   534,   535,   536,   422,
+     423,   458,   595,   424,   342,   426,   597,   546,   493,   548,
+     549,   550,   507,   599,   509,   510,   514,   511,   537,   517,
+     538,   564,   565,   539,   567,   540,   541,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    97,   542,    98,   642,
+     137,    85,    86,    87,   543,   544,    99,   474,    63,    64,
+      65,    66,    67,    68,    69,    70,   475,   476,   477,   478,
+     479,    85,    86,    87,  -163,   603,   610,   611,   612,   394,
+     613,   638,   614,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,   630,   174,   174,   174,   137,    85,    86,    87,
+     619,   640,   639,   643,   644,   653,   654,   657,   660,   661,
+     620,   621,   622,   623,   624,   625,   626,   627,   628,   214,
+     629,   655,   244,   170,   205,   320,   334,   117,   245,   346,
+      11,    12,    13,   246,   604,   217,   222,   247,    40,   248,
+     249,   212,   185,   250,   658,   251,   596,   252,   524,   253,
+     480,   481,   482,   616,   254,   659,    58,   255,   256,    63,
+      64,    65,    66,   257,   258,   259,   260,   261,   528,   332,
+     606,   262,    85,    86,    87,   605,   223,  -158,   515,  -136,
+    -136,  -136,  -136,  -136,  -136,  -136,  -136,  -136,  -136,  -136,
+    -136,  -136,  -136,  -136,  -136,  -136,  -136,   518,   325,   100,
+     101,    97,    97,    98,    98,     0,     0,     0,     0,     0,
+       0,    99,    99,   244,     0,     0,     0,   174,     0,     0,
+       0,    11,    12,    13,   246,     0,     0,   466,   247,    40,
+     248,   249,     0,    19,   250,     0,   251,     0,   252,     0,
+     253,   263,     0,     0,     0,   254,     0,    58,     0,   256,
+      63,    64,    65,    66,   257,   258,   259,   260,   261,   171,
+       0,     0,   262,    85,    86,    87,  -136,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,    80,    81,    82,    83,
+      84,    85,    86,    87,    88,   569,   570,   571,   572,   573,
+     574,   575,   576,   577,   578,   579,   580,   581,   582,    62,
+      63,    64,    65,    66,    67,    68,    69,    70,   149,   150,
      151,   152,   153,   154,   155,   156,   157,   158,   159,   160,
-     161,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,  -357,
-    -357,  -357,  -357,  -357,  -357,   371,   372,   373,   374,   375,
-     376,   377,   378,   379,   380,   381,   382,   383,   384,     0,
-       0,     0,   580,     0,   581,   582,   583,   584,   585,   586,
-     587,   588,    62,    63,    64,    65,    66,    67,    68,    69,
-      70,  -357,     0,     0,  -357,     0,     0,     0,     0,     0,
-    -357,     0,     0,     0,     0,     0,     0,     0,   385,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,    80,     0,
-      81,    82,   136,    84,    85,    86,    87,  -227,  -227,  -227,
-    -227,  -227,  -227,  -227,  -227,  -227,  -227,     0,  -227,  -227,
-    -227,  -227,  -227,  -227,  -227,  -228,  -228,  -228,  -228,  -228,
-    -228,  -228,  -228,  -228,  -228,     0,  -228,  -228,  -228,  -228,
-    -228,  -228,  -228,   350,   351,   352,   353,   354,   355,   356,
-     357,   358,   359,     0,   360,   361,   136,    84,    85,    86,
+     161,   162,   148,     0,    19,     0,     0,     0,     0,     0,
+       0,     0,   263,     0,  -362,  -362,  -362,  -362,  -362,  -362,
+    -362,  -362,  -362,  -362,  -362,  -362,  -362,  -362,     0,     0,
+       0,     0,     0,     0,    89,     0,     0,     0,     0,   583,
+       0,   584,   585,   586,   587,   588,   589,   590,   591,     0,
+     149,   150,   151,   152,   153,   154,   155,   156,   157,   158,
+     159,   160,   161,   162,  -362,     0,     0,  -362,  -362,     0,
+       0,     0,     0,  -362,  -363,  -363,  -363,  -363,  -363,  -363,
+    -363,  -363,  -363,  -363,  -363,  -363,  -363,  -363,  -360,  -360,
+    -360,  -360,  -360,  -360,  -360,  -360,  -360,  -360,  -360,  -360,
+    -360,  -360,   372,   373,   374,   375,   376,   377,   378,   379,
+     380,   381,   382,   383,   384,   385,     0,     0,     0,     0,
+       0,     0,     0,     0,  -363,     0,     0,  -363,  -363,     0,
+       0,     0,     0,  -363,     0,     0,     0,     0,  -360,     0,
+       0,  -360,     0,     0,     0,     0,     0,  -360,     0,     0,
+       0,     0,     0,     0,     0,   386,    62,    63,    64,    65,
+      66,    67,    68,    69,    70,    80,    81,    82,    83,   137,
+      85,    86,    87,    88,   351,   352,   353,   354,   355,   356,
+     357,   358,   359,   360,    81,   361,   362,   137,    85,    86,
+      87,    88,    62,    63,    64,    65,    66,    67,    68,    69,
+      70,   395,    81,    82,    83,   137,    85,    86,    87,    88,
+      62,    63,    64,    65,    66,    67,    68,    69,    70,   556,
+       0,   557,   558,   137,    85,    86,    87,    62,    63,    64,
+      65,    66,    67,    68,    69,    70,   560,     0,   561,   562,
+     137,    85,    86,    87,    62,    63,    64,    65,    66,    67,
+      68,    69,    70,     0,     0,   471,   472,   137,    85,    86,
       87,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-     394,     0,    81,    82,   136,    84,    85,    86,    87,    62,
-      63,    64,    65,    66,    67,    68,    69,    70,   548,     0,
-     549,   550,   136,    84,    85,    86,    62,    63,    64,    65,
-      66,    67,    68,    69,    70,   553,     0,   554,   555,   136,
-      84,    85,    86,    62,    63,    64,    65,    66,    67,    68,
-      69,    70,   557,     0,   558,   559,   136,    84,    85,    86,
-      62,    63,    64,    65,    66,    67,    68,    69,    70,     0,
-       0,   467,   468,   136,    84,    85,    86,    62,    63,    64,
-      65,    66,    67,    68,    69,    70,     0,     0,   470,   471,
-     136,    84,    85,    86,    62,    63,    64,    65,    66,    67,
-      68,    69,    70,     0,     0,   629,   630,   136,    84,    85,
-      86,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-       0,     0,   632,   633,   136,    84,    85,    86,    62,    63,
-      64,    65,    66,    67,    68,    69,    70,   627,     0,     0,
-       0,   136,    84,    85,    86,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,   461,     0,     0,     0,   462,     0,
-     463,    62,    63,    64,    65,    66,    67,    68,    69,    70,
-     260,     0,     0,     0,   171,    62,    63,    64,    65,    66,
-      67,    68,    69,    70,   105,    62,    63,    64,    65,    66,
-      67,    68,    69,   542
+       0,     0,   632,   633,   137,    85,    86,    87,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,     0,     0,   635,
+     636,   137,    85,    86,    87,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,   462,     0,     0,     0,   463,     0,
+     464,    62,    63,    64,    65,    66,    67,    68,    69,    70,
+       0,     0,     0,     0,   172,    62,    63,    64,    65,    66,
+      67,    68,    69,    70,   106,    62,    63,    64,    65,    66,
+      67,    68,    69,   545
 };
 
 static const yytype_int16 yycheck[] =
 {
-      17,    28,   117,    28,    95,   154,    88,   242,     9,   423,
-     227,    28,   248,   253,    35,    35,   227,     9,   227,     9,
-     227,   123,    39,     9,    10,    11,   616,    13,     3,     4,
-       5,     6,    35,    12,   227,    10,    11,   254,    13,    45,
-      45,     2,    17,   254,    15,   254,    35,   254,   120,   258,
-      36,    37,    31,   262,     0,   227,   646,   129,   294,    34,
-      77,   254,    33,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,   282,    48,    49,    50,    51,    52,    53,
-     227,    42,   254,   231,   351,   352,   353,   354,   355,   356,
-      14,   108,   109,   110,   111,    46,   363,   245,   365,   190,
-     117,   183,   122,   124,   206,    29,    48,   254,    32,   112,
-     113,   114,   227,   114,   116,   117,   122,   122,   145,   105,
-     145,    46,   114,   109,   114,   128,   112,   124,   145,   369,
-     105,    35,   118,    37,   109,   112,   113,   114,   253,   254,
-     159,   160,   161,   475,   476,   385,    38,    39,    37,    41,
-     127,   242,    35,   485,    46,   120,   130,   131,   132,    46,
-      35,    48,    49,   120,   181,   374,   375,    54,   385,    35,
-     261,   188,   199,   190,   385,   404,   385,   444,    99,   408,
-     101,   125,   126,   412,    35,   276,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    35,    48,    49,    50,
-      51,    52,    53,    54,   120,   360,   361,    35,   124,   364,
-     227,    46,   421,   129,   423,    98,    99,   100,   309,   102,
-     103,   104,   107,   108,    46,   242,   227,    46,   464,   643,
-      56,    57,    58,    59,    60,    61,   253,   254,   635,   636,
-      99,   100,   259,   102,   103,   454,   455,   456,    46,   276,
-     122,   276,    46,   254,   369,   282,    35,   282,   115,   276,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-     385,   124,    35,   124,   122,   124,     1,    38,    39,    40,
-      41,   124,     7,   123,     9,    10,    11,    12,   122,   125,
-     122,    16,    17,    18,    19,   126,   121,    22,   315,    24,
-     121,    26,   122,    28,   386,   120,   323,   120,    33,   120,
-      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    46,   123,   123,    50,    51,    52,    53,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,   420,   123,
-     123,    46,    50,   425,   493,    35,    35,   124,    46,    48,
-       8,   368,   369,    49,    46,   121,   121,   121,   110,   106,
-     385,    35,   122,    35,   120,   600,    35,    35,   385,    35,
-     120,    35,    35,    35,    35,    35,   129,   459,   123,    35,
-     589,   590,   591,   111,    35,    35,   477,   112,    20,    30,
-     481,    21,    35,    35,   123,   120,   487,    35,    35,   121,
-      55,   122,   517,   518,   519,   123,   488,   123,   490,    45,
-      98,   428,   429,   430,   431,   432,   433,   434,   121,    23,
-      55,   122,    25,    45,    45,    45,   443,    45,   445,   446,
-     447,    45,    45,    45,   643,    45,    35,   120,    35,    35,
-     457,   458,   122,   460,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    35,   481,   604,   481,    50,    35,    35,
-      35,    35,    15,   122,   481,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,   122,    48,    49,    50,    51,
-      52,    53,    54,    27,    35,    35,   503,   121,   114,   175,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-     517,   518,   519,    50,    51,    52,    53,   234,   181,   600,
-     188,    52,   254,   595,   179,   481,   145,   534,   535,   536,
-     537,   538,   539,   540,   541,   542,   641,   544,     1,   122,
-     276,   503,   414,   646,   518,   651,     9,    10,    11,    12,
-     252,   508,   506,    16,    17,    18,    19,   424,   406,    22,
-     410,    24,   124,    26,    30,    28,    33,    -1,    -1,   246,
-      33,    -1,    35,    -1,    37,    38,    39,    40,    41,    42,
-      43,    44,    45,    46,    -1,    -1,    -1,    50,    51,    52,
-      53,    -1,    -1,   600,    56,    57,    58,    59,    60,    61,
-      62,    63,    64,    65,    66,    67,    68,    69,    -1,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,   635,   636,
-     635,   636,    50,    51,    52,    53,    -1,    -1,   635,   636,
-      -1,    -1,    -1,    -1,   641,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    35,   651,    -1,    -1,    -1,    -1,   112,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,   120,   120,    36,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   130,    -1,
-     132,   133,   134,   135,   136,   137,   138,   139,    56,    57,
+      17,    28,    89,    28,   243,   118,   228,   155,     9,   424,
+       9,    28,   249,   228,   254,    35,     9,   228,     0,    35,
+     124,    45,    39,    45,     9,    10,    11,   228,    13,   228,
+      35,    35,     2,   255,   405,    46,    12,   259,   409,    96,
+     255,   263,   413,   619,   255,   352,   353,   354,   355,   356,
+     357,    36,    37,   228,   255,    31,   255,   364,   295,   366,
+      77,   283,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    42,   649,     3,     4,     5,     6,    15,    48,
+     255,    10,    11,   228,    13,   232,    99,   100,    17,   102,
+     103,    46,   109,   110,   111,   112,    33,   184,   122,   246,
+     122,   118,   120,   207,   124,    34,   122,   112,   113,   114,
+     255,   129,   124,    14,   115,   228,   115,   125,   126,   146,
+     105,   146,   115,   128,   109,    35,    37,   112,    29,   146,
+     370,    32,   120,   118,   191,   112,   113,   114,   445,   120,
+      35,   254,   255,   124,    38,    39,   386,    41,   129,   124,
+     127,    35,    46,   375,   376,    37,    38,    39,    40,    41,
+      42,    43,    44,    45,   386,   182,   477,   478,    50,   116,
+     117,   386,   189,   200,   191,   386,   105,   488,   361,   362,
+     109,    35,   365,    37,   120,    99,   243,   101,    98,    99,
+     100,    46,   102,   103,   104,    46,    47,    48,    49,    35,
+     422,    46,   424,    54,    46,   262,    38,    39,    40,    41,
+      35,   228,    56,    57,    58,    59,    60,    61,   107,   108,
+     277,   160,   161,   162,   638,   639,   243,   228,   465,    46,
+     122,   646,    46,   455,   456,   457,   115,   254,   255,    35,
+     122,   124,    35,   260,   122,   125,   121,   124,   124,   123,
+     277,   122,   277,   310,   255,   121,   283,   370,   283,   126,
+     277,   122,   122,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,   386,    48,    49,    50,    51,    52,    53,
+     120,   120,   120,    46,    46,    35,   123,    35,   123,   123,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,   316,
+     387,    48,    49,    50,    51,    52,    53,   324,    56,    57,
       58,    59,    60,    61,    62,    63,    64,    65,    66,    67,
-      68,    69,    84,    85,    86,    87,    88,    89,    90,    91,
-      92,    93,    94,    95,    96,    97,    -1,    84,    85,    86,
-      87,    88,    89,    90,    91,    92,    93,    94,    95,    96,
-      97,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,    70,    71,    72,    73,    74,
-      75,    76,    77,    78,    79,    80,    81,    82,    83,    -1,
-      -1,    -1,   130,    -1,   132,   133,   134,   135,   136,   137,
+      68,    69,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,   123,    35,   421,    50,    51,    52,    53,   426,
+      46,    48,    46,     8,    49,   121,   121,   106,   496,   121,
+     110,   122,   369,   370,    35,    35,   120,    35,    35,    35,
+      35,   386,   120,    35,   603,    35,    35,    35,   129,   386,
+     592,   593,   594,   460,   123,    35,   111,    35,    35,    20,
+      30,    21,   130,    35,   132,   133,   134,   135,   136,   137,
      138,   139,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,   120,    -1,    -1,   123,    -1,    -1,    -1,    -1,    -1,
-     129,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   123,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    -1,
-      48,    49,    50,    51,    52,    53,    54,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    46,    -1,    48,    49,
-      50,    51,    52,    53,    54,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    46,    -1,    48,    49,    50,    51,
-      52,    53,    54,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    -1,    48,    49,    50,    51,    52,    53,
-      54,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    -1,    48,    49,    50,    51,    52,    53,    54,    37,
-      38,    39,    40,    41,    42,    43,    44,    45,    46,    -1,
-      48,    49,    50,    51,    52,    53,    37,    38,    39,    40,
-      41,    42,    43,    44,    45,    46,    -1,    48,    49,    50,
-      51,    52,    53,    37,    38,    39,    40,    41,    42,    43,
-      44,    45,    46,    -1,    48,    49,    50,    51,    52,    53,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    -1,
+      45,    46,    35,    35,   491,    50,   493,   520,   521,   522,
+      35,   123,   429,   430,   431,   432,   433,   434,   435,    55,
+     121,    45,   479,   122,   646,   123,   483,   444,   123,   446,
+     447,   448,    98,   490,    55,   121,    23,   122,    45,    25,
+      45,   458,   459,    45,   461,    45,    45,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,   483,    45,   483,   607,
+      50,    51,    52,    53,    45,    45,   483,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    35,   120,    35,    35,    35,   506,
+      35,   122,    35,    37,    38,    39,    40,    41,    42,    43,
+      44,    45,    46,   520,   521,   522,    50,    51,    52,    53,
+      35,   598,   122,    35,   122,   121,    15,    27,    35,    35,
+     537,   538,   539,   540,   541,   542,   543,   544,   545,   182,
+     547,   644,     1,   115,   176,   235,   255,    52,     7,   277,
+       9,    10,    11,    12,   506,   189,   603,    16,    17,    18,
+      19,   180,   146,    22,   649,    24,   483,    26,   415,    28,
+     130,   131,   132,   521,    33,   654,    35,    36,    37,    38,
+      39,    40,    41,    42,    43,    44,    45,    46,   425,   253,
+     511,    50,    51,    52,    53,   509,   603,    35,   407,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    47,
+      48,    49,    50,    51,    52,    53,    54,   411,   247,    30,
+      33,   638,   639,   638,   639,    -1,    -1,    -1,    -1,    -1,
+      -1,   638,   639,     1,    -1,    -1,    -1,   644,    -1,    -1,
+      -1,     9,    10,    11,    12,    -1,    -1,   654,    16,    17,
+      18,    19,    -1,   112,    22,    -1,    24,    -1,    26,    -1,
+      28,   120,    -1,    -1,    -1,    33,    -1,    35,    -1,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    46,    35,
+      -1,    -1,    50,    51,    52,    53,   124,    37,    38,    39,
+      40,    41,    42,    43,    44,    45,    46,    47,    48,    49,
+      50,    51,    52,    53,    54,    56,    57,    58,    59,    60,
+      61,    62,    63,    64,    65,    66,    67,    68,    69,    37,
+      38,    39,    40,    41,    42,    43,    44,    45,    84,    85,
+      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+      96,    97,    36,    -1,   112,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,   120,    -1,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    -1,    -1,
+      -1,    -1,    -1,    -1,   124,    -1,    -1,    -1,    -1,   130,
+      -1,   132,   133,   134,   135,   136,   137,   138,   139,    -1,
+      84,    85,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    96,    97,   120,    -1,    -1,   123,   124,    -1,
+      -1,    -1,    -1,   129,    70,    71,    72,    73,    74,    75,
+      76,    77,    78,    79,    80,    81,    82,    83,    70,    71,
+      72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
+      82,    83,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,   120,    -1,    -1,   123,   124,    -1,
+      -1,    -1,    -1,   129,    -1,    -1,    -1,    -1,   120,    -1,
+      -1,   123,    -1,    -1,    -1,    -1,    -1,   129,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,   123,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    46,    47,    48,    49,    50,
+      51,    52,    53,    54,    37,    38,    39,    40,    41,    42,
+      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
+      53,    54,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
+      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
       -1,    48,    49,    50,    51,    52,    53,    37,    38,    39,
-      40,    41,    42,    43,    44,    45,    -1,    -1,    48,    49,
+      40,    41,    42,    43,    44,    45,    46,    -1,    48,    49,
       50,    51,    52,    53,    37,    38,    39,    40,    41,    42,
       43,    44,    45,    -1,    -1,    48,    49,    50,    51,    52,
       53,    37,    38,    39,    40,    41,    42,    43,    44,    45,
       -1,    -1,    48,    49,    50,    51,    52,    53,    37,    38,
-      39,    40,    41,    42,    43,    44,    45,    46,    -1,    -1,
-      -1,    50,    51,    52,    53,    37,    38,    39,    40,    41,
+      39,    40,    41,    42,    43,    44,    45,    -1,    -1,    48,
+      49,    50,    51,    52,    53,    37,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    -1,    -1,    -1,    50,    -1,
       52,    37,    38,    39,    40,    41,    42,    43,    44,    45,
-      46,    -1,    -1,    -1,    50,    37,    38,    39,    40,    41,
+      -1,    -1,    -1,    -1,    50,    37,    38,    39,    40,    41,
       42,    43,    44,    45,    46,    37,    38,    39,    40,    41,
       42,    43,    44,    45
 };
@@ -1716,72 +1724,73 @@
    symbol of state STATE-NUM.  */
 static const yytype_uint16 yystos[] =
 {
-       0,   116,   117,   141,    35,   143,   297,   298,   142,   143,
+       0,   116,   117,   141,    35,   143,   298,   299,   142,   143,
        0,     9,    10,    11,    13,    36,    37,   105,   109,   112,
      118,   146,   147,   148,   149,   160,   164,   190,   205,   231,
-     299,   300,   301,   303,   304,   305,     3,     4,     5,     6,
+     300,   301,   302,   304,   305,   306,     3,     4,     5,     6,
       17,    34,   144,   145,   146,   159,   160,   161,   162,   163,
      164,   168,   170,   282,    46,    48,    46,   124,    35,   198,
-     302,   305,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,   292,   293,    37,   120,   191,    35,   120,    35,    35,
-      46,    48,    49,    50,    51,    52,    53,    54,   124,   207,
-     208,   210,   211,   212,   213,   250,   286,   291,   292,   300,
-     302,   172,    46,    46,    46,    46,   171,   292,    38,    39,
-      41,    46,   284,    46,    35,   143,   172,   122,    46,   165,
-     166,   167,   115,   112,   113,   114,   127,   192,   193,   194,
-     195,    35,   150,   151,   152,   292,    50,   214,   285,   286,
-     289,   290,   291,   292,    35,   122,   213,    36,    84,    85,
-      86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
-      96,    97,   173,   123,   292,   292,   292,   292,   122,   145,
-      35,    50,   250,   292,   125,   126,   191,   196,   121,   122,
-     121,   122,   125,   126,   210,   120,   278,   279,   120,   278,
-     120,   174,   279,   279,   279,    46,   123,   123,   123,   123,
-      46,   178,   179,    35,   167,    35,   112,   113,   114,   128,
-     197,   194,    35,   152,   285,    46,   171,    46,   175,   176,
-     177,   213,   292,    48,    49,    46,   286,   186,     8,   180,
-     191,   107,   108,   153,   154,   155,   156,   157,   158,   121,
-     121,   121,   122,     1,     7,    12,    16,    18,    19,    22,
-      24,    26,    28,    33,    36,    37,    42,    43,    44,    45,
-      46,    50,   120,   160,   169,   187,   188,   189,   190,   198,
-     199,   200,   201,   202,   203,   204,   205,   215,   216,   218,
-     220,   221,   224,   226,   227,   231,   232,   233,   234,   243,
-     244,   245,   246,   247,   248,   250,   251,   257,   258,   259,
-     260,   268,   269,   280,   281,   282,   283,   289,   292,   293,
-      38,    39,    40,    41,   181,   288,   288,   110,   106,   155,
-      35,   177,    35,   288,   284,   120,   261,   261,    35,    35,
-      35,   251,   245,   188,   289,   292,   213,    46,   252,   253,
-     254,   289,    35,    35,   206,   207,   209,   213,    35,    35,
-      37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
-      48,    49,   222,   286,   289,   291,    35,   261,   129,   123,
-      35,    70,    71,    72,    73,    74,    75,    76,    77,    78,
-      79,    80,    81,    82,    83,   123,   296,   213,   182,   292,
-     111,   228,   229,   292,    46,   262,   263,   264,   265,   266,
-     267,   285,    35,    35,    20,   270,   271,   272,    21,   273,
-     274,   275,    30,   235,   236,   237,    35,    35,    35,    35,
-     123,    55,   121,   122,   255,   123,    45,   122,   225,   225,
-     225,   225,   225,   225,   225,    37,    38,    39,    40,    41,
-      42,    43,    44,    45,    50,   122,    45,   122,    56,    57,
-      58,    59,    60,    61,   287,   287,   287,    45,   225,   287,
-     225,    46,    50,    52,   249,   292,   245,    48,    49,   289,
-      48,    49,   289,    37,    46,    48,    49,    50,   130,   131,
-     132,   205,   217,   219,   245,   289,   291,   293,   294,   285,
-     123,    35,    98,    99,   100,   102,   103,   104,   183,   184,
-     185,   256,    35,   122,    98,   230,    55,   121,   122,   276,
-     266,    23,   272,   266,    25,   275,   266,    14,    29,    32,
-     238,   237,   285,   289,   254,   256,   285,   292,   292,   292,
-     292,   292,   292,   292,    45,    45,    45,    45,    45,    45,
-      45,    45,    45,   292,   225,   292,   292,   292,    46,    48,
-      49,   223,   289,    46,    48,    49,   289,    46,    48,    49,
-     289,   292,   292,   285,   292,   261,    56,    57,    58,    59,
-      60,    61,    62,    63,    64,    65,    66,    67,    68,    69,
-     130,   132,   133,   134,   135,   136,   137,   138,   139,   295,
-     295,   295,   213,   211,   213,   295,   213,   285,   285,   278,
-     120,   229,   267,   264,    99,   101,   277,    35,    35,    35,
-      35,    35,   250,   248,   250,   250,    35,   292,   292,   292,
-     292,   292,   292,   292,   292,   292,   292,    46,   289,    48,
-      49,   289,    48,    49,   289,   122,   122,   285,   177,   278,
-      35,   122,   239,    31,   227,   240,   241,   242,   208,   208,
-     121,    15,   250,   254,    27,   242,   249,    35,    35
+     303,   306,    37,    38,    39,    40,    41,    42,    43,    44,
+      45,   293,   294,    37,   120,   191,    35,   120,    35,    35,
+      46,    47,    48,    49,    50,    51,    52,    53,    54,   124,
+     207,   208,   210,   211,   212,   213,   250,   286,   292,   293,
+     301,   303,   172,    46,    46,    46,    46,   171,   293,    38,
+      39,    41,    46,   284,    46,    35,   143,   172,   122,    46,
+     165,   166,   167,   115,   112,   113,   114,   127,   192,   193,
+     194,   195,    35,   150,   151,   152,   293,    50,   214,   285,
+     286,   290,   291,   292,   293,    35,   122,   213,    36,    84,
+      85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
+      95,    96,    97,   173,   123,   293,   293,   293,   293,   122,
+     145,    35,    50,   250,   293,   125,   126,   191,   196,   121,
+     122,   121,   122,   125,   126,   210,   120,   278,   279,   120,
+     278,   120,   174,   279,   279,   279,    46,   123,   123,   123,
+     123,    46,   178,   179,    35,   167,    35,   112,   113,   114,
+     128,   197,   194,    35,   152,   285,    46,   171,    46,   175,
+     176,   177,   213,   293,    48,    49,    46,   286,   186,     8,
+     180,   191,   107,   108,   153,   154,   155,   156,   157,   158,
+     121,   121,   121,   122,     1,     7,    12,    16,    18,    19,
+      22,    24,    26,    28,    33,    36,    37,    42,    43,    44,
+      45,    46,    50,   120,   160,   169,   187,   188,   189,   190,
+     198,   199,   200,   201,   202,   203,   204,   205,   215,   216,
+     218,   220,   221,   224,   226,   227,   231,   232,   233,   234,
+     243,   244,   245,   246,   247,   248,   250,   251,   257,   258,
+     259,   260,   268,   269,   280,   281,   282,   283,   290,   293,
+     294,    38,    39,    40,    41,   181,   289,   289,   110,   106,
+     155,    35,   177,    35,   289,   284,   120,   261,   261,    35,
+      35,    35,   251,   245,   188,   290,   293,   213,    46,   252,
+     253,   254,   290,    35,    35,   206,   207,   209,   213,    35,
+      35,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+      46,    48,    49,   222,   286,   290,   292,    35,   261,   129,
+     123,    35,    70,    71,    72,    73,    74,    75,    76,    77,
+      78,    79,    80,    81,    82,    83,   123,   297,   213,   182,
+     293,   111,   228,   229,   293,    46,   262,   263,   264,   265,
+     266,   267,   285,    35,    35,    20,   270,   271,   272,    21,
+     273,   274,   275,    30,   235,   236,   237,    35,    35,    35,
+      35,   123,    55,   121,   122,   255,   123,    45,   122,   225,
+     225,   225,   225,   225,   225,   225,    37,    38,    39,    40,
+      41,    42,    43,    44,    45,    50,   122,    45,   122,    56,
+      57,    58,    59,    60,    61,   288,   288,   288,    45,   225,
+     288,   225,    46,    50,    52,   249,   293,   245,    48,    49,
+     290,    48,    49,   290,    37,    46,    47,    48,    49,    50,
+     130,   131,   132,   205,   217,   219,   245,   287,   290,   292,
+     294,   295,   285,   123,    35,    98,    99,   100,   102,   103,
+     104,   183,   184,   185,   256,    35,   122,    98,   230,    55,
+     121,   122,   276,   266,    23,   272,   266,    25,   275,   266,
+      14,    29,    32,   238,   237,   285,   290,   254,   256,   285,
+     293,   293,   293,   293,   293,   293,   293,    45,    45,    45,
+      45,    45,    45,    45,    45,    45,   293,   225,   293,   293,
+     293,    46,    48,    49,   223,   290,    46,    48,    49,   290,
+      46,    48,    49,   290,   293,   293,   285,   293,   261,    56,
+      57,    58,    59,    60,    61,    62,    63,    64,    65,    66,
+      67,    68,    69,   130,   132,   133,   134,   135,   136,   137,
+     138,   139,   296,   296,   296,   213,   211,   213,   296,   213,
+     285,   285,   278,   120,   229,   267,   264,    99,   101,   277,
+      35,    35,    35,    35,    35,   250,   248,   250,   250,    35,
+     293,   293,   293,   293,   293,   293,   293,   293,   293,   293,
+      46,   290,    48,    49,   290,    48,    49,   290,   122,   122,
+     285,   177,   278,    35,   122,   239,    31,   227,   240,   241,
+     242,   208,   208,   121,    15,   250,   254,    27,   242,   249,
+      35,    35
 };
 
 #define yyerrok		(yyerrstatus = 0)
@@ -2609,22 +2618,22 @@
   switch (yyn)
     {
         case 4:
-#line 560 "pir.y"
+#line 563 "pir.y"
     { fixup_global_labels(lexer); ;}
     break;
 
   case 20:
-#line 591 "pir.y"
+#line 594 "pir.y"
     { new_macro_const(lexer->macros, (yyvsp[(2) - (3)].sval), (yyvsp[(3) - (3)].sval), yypirget_lineno(yyscanner)); ;}
     break;
 
   case 21:
-#line 597 "pir.y"
+#line 600 "pir.y"
     { /* fprintf(stderr, "macro body: [%s]\n", CURRENT_MACRO(lexer)->body);*/ ;}
     break;
 
   case 22:
-#line 601 "pir.y"
+#line 604 "pir.y"
     {
                           new_macro(lexer->macros, (yyvsp[(2) - (2)].sval), yypirget_lineno(yyscanner), TRUE,
                                     lexer->macro_size);
@@ -2632,17 +2641,17 @@
     break;
 
   case 27:
-#line 616 "pir.y"
+#line 619 "pir.y"
     { add_macro_param(CURRENT_MACRO(lexer), (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 35:
-#line 635 "pir.y"
+#line 638 "pir.y"
     { store_macro_string(CURRENT_MACRO(lexer), "%s\n", (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 36:
-#line 639 "pir.y"
+#line 642 "pir.y"
     {
                           store_macro_string(CURRENT_MACRO(lexer), ".local %s %s\n",
                                              pir_type_names[(yyvsp[(2) - (3)].ival)], (yyvsp[(3) - (3)].sval));
@@ -2650,152 +2659,152 @@
     break;
 
   case 37:
-#line 650 "pir.y"
+#line 653 "pir.y"
     { load_library(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 38:
-#line 654 "pir.y"
+#line 657 "pir.y"
     { yypirset_lineno ((yyvsp[(2) - (2)].ival), yyscanner); ;}
     break;
 
   case 39:
-#line 656 "pir.y"
+#line 659 "pir.y"
     { lexer->filename = (yyvsp[(2) - (2)].sval); ;}
     break;
 
   case 40:
-#line 660 "pir.y"
+#line 663 "pir.y"
     { annotate(lexer, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 41:
-#line 666 "pir.y"
+#line 669 "pir.y"
     { set_hll(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 42:
-#line 670 "pir.y"
+#line 673 "pir.y"
     { set_hll_map(lexer, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 43:
-#line 674 "pir.y"
+#line 677 "pir.y"
     { set_namespace(lexer, (yyvsp[(3) - (4)].key)); ;}
     break;
 
   case 44:
-#line 678 "pir.y"
+#line 681 "pir.y"
     { (yyval.key) = NULL; ;}
     break;
 
   case 45:
-#line 680 "pir.y"
+#line 683 "pir.y"
     { (yyval.key) = (yyvsp[(1) - (1)].key); ;}
     break;
 
   case 46:
-#line 684 "pir.y"
+#line 687 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 47:
-#line 686 "pir.y"
+#line 689 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 48:
-#line 690 "pir.y"
+#line 693 "pir.y"
     { (yyval.expr) = expr_from_string(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 50:
-#line 700 "pir.y"
+#line 703 "pir.y"
     { close_sub(lexer); ;}
     break;
 
   case 51:
-#line 704 "pir.y"
+#line 707 "pir.y"
     { new_subr(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 56:
-#line 716 "pir.y"
+#line 719 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_ANON);;}
     break;
 
   case 57:
-#line 718 "pir.y"
+#line 721 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_INIT); ;}
     break;
 
   case 58:
-#line 720 "pir.y"
+#line 723 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LOAD); ;}
     break;
 
   case 59:
-#line 722 "pir.y"
+#line 725 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MAIN); ;}
     break;
 
   case 60:
-#line 724 "pir.y"
+#line 727 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_LEX); ;}
     break;
 
   case 61:
-#line 726 "pir.y"
+#line 729 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_POSTCOMP); ;}
     break;
 
   case 62:
-#line 728 "pir.y"
+#line 731 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_IMMEDIATE); ;}
     break;
 
   case 63:
-#line 730 "pir.y"
+#line 733 "pir.y"
     { set_sub_flag(lexer, PIRC_SUB_FLAG_MULTI); ;}
     break;
 
   case 64:
-#line 732 "pir.y"
+#line 735 "pir.y"
     { set_sub_outer(lexer, (yyvsp[(3) - (4)].sval)); ;}
     break;
 
   case 65:
-#line 734 "pir.y"
+#line 737 "pir.y"
     { set_sub_methodname(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 66:
-#line 736 "pir.y"
+#line 739 "pir.y"
     { set_sub_vtable(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 67:
-#line 738 "pir.y"
+#line 741 "pir.y"
     { set_sub_subid(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 68:
-#line 740 "pir.y"
+#line 743 "pir.y"
     { set_sub_instanceof(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 69:
-#line 742 "pir.y"
+#line 745 "pir.y"
     { set_sub_nsentry(lexer, (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 70:
-#line 746 "pir.y"
+#line 749 "pir.y"
     { set_sub_multi_types(lexer, (yyvsp[(2) - (3)].expr)); ;}
     break;
 
   case 71:
-#line 750 "pir.y"
+#line 753 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 1;
                           /* n=1 means :multi() -- without any types. */
@@ -2803,12 +2812,12 @@
     break;
 
   case 72:
-#line 755 "pir.y"
+#line 758 "pir.y"
     { (yyval.expr) = (yyvsp[(1) - (1)].expr); ;}
     break;
 
   case 73:
-#line 759 "pir.y"
+#line 762 "pir.y"
     {
                           CURRENT_SUB(lexer)->info.num_multi_types = 2;
                           /* start counting multi types; always 1 higher than actual number
@@ -2820,7 +2829,7 @@
     break;
 
   case 74:
-#line 768 "pir.y"
+#line 771 "pir.y"
     {
                           ++CURRENT_SUB(lexer)->info.num_multi_types;
                           /* link the multi types in reverse other. That's fine,
@@ -2832,22 +2841,22 @@
     break;
 
   case 75:
-#line 779 "pir.y"
+#line 782 "pir.y"
     { (yyval.expr) = expr_from_ident(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 76:
-#line 781 "pir.y"
+#line 784 "pir.y"
     { (yyval.expr) = expr_from_string(lexer, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 77:
-#line 783 "pir.y"
+#line 786 "pir.y"
     { (yyval.expr) = expr_from_key(lexer, (yyvsp[(1) - (1)].key)); ;}
     break;
 
   case 78:
-#line 787 "pir.y"
+#line 790 "pir.y"
     {
                            /* if there are parameters, then emit a get_params instruction. */
                            if ((yyvsp[(1) - (1)].uval) > 0)
@@ -2856,12 +2865,12 @@
     break;
 
   case 79:
-#line 795 "pir.y"
+#line 798 "pir.y"
     { (yyval.uval) = 0; ;}
     break;
 
   case 80:
-#line 797 "pir.y"
+#line 800 "pir.y"
     {
                           /* if the :named flag was set, there's an extra
                            * constant string argument for the name. count that too.
@@ -2875,27 +2884,27 @@
     break;
 
   case 81:
-#line 810 "pir.y"
+#line 813 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(2) - (4)].targ), (yyvsp[(3) - (4)].ival)); ;}
     break;
 
   case 82:
-#line 814 "pir.y"
+#line 817 "pir.y"
     { (yyval.targ) = add_param(lexer, (yyvsp[(1) - (2)].ival), (yyvsp[(2) - (2)].sval)); ;}
     break;
 
   case 83:
-#line 818 "pir.y"
+#line 821 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 84:
-#line 820 "pir.y"
+#line 823 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 88:
-#line 829 "pir.y"
+#line 832 "pir.y"
     { (yyval.ival) = TARGET_FLAG_INVOCANT;
                            /* XXX handle multi_type */
 
@@ -2903,12 +2912,12 @@
     break;
 
   case 89:
-#line 836 "pir.y"
+#line 839 "pir.y"
     { (yyval.ival) = TARGET_FLAG_UNIQUE_REG; ;}
     break;
 
   case 91:
-#line 843 "pir.y"
+#line 846 "pir.y"
     {
                          ++lexer->stmt_counter;
                          /* increment the logical statement counter; a statement can be
@@ -2919,37 +2928,37 @@
     break;
 
   case 92:
-#line 853 "pir.y"
+#line 856 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
   case 110:
-#line 881 "pir.y"
+#line 884 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (3)].mval), (yyvsp[(2) - (3)].pval)); ;}
     break;
 
   case 111:
-#line 885 "pir.y"
+#line 888 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 112:
-#line 887 "pir.y"
+#line 890 "pir.y"
     { (yyval.pval) = (yyvsp[(2) - (3)].pval); ;}
     break;
 
   case 113:
-#line 891 "pir.y"
+#line 894 "pir.y"
     { (yyval.pval) = NULL; ;}
     break;
 
   case 115:
-#line 896 "pir.y"
+#line 899 "pir.y"
     { (yyval.pval) = new_macro_param((yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 116:
-#line 898 "pir.y"
+#line 901 "pir.y"
     {
                           macro_param *param = new_macro_param((yyvsp[(3) - (3)].sval));
                           param->next = (yyvsp[(1) - (3)].pval);
@@ -2958,7 +2967,7 @@
     break;
 
   case 117:
-#line 906 "pir.y"
+#line 909 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                           if (sym == NULL) {
@@ -2969,22 +2978,22 @@
     break;
 
   case 119:
-#line 915 "pir.y"
+#line 918 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 121:
-#line 920 "pir.y"
+#line 923 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 122:
-#line 925 "pir.y"
+#line 928 "pir.y"
     { (yyval.sval) = ""; ;}
     break;
 
   case 123:
-#line 927 "pir.y"
+#line 930 "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));
@@ -2994,17 +3003,17 @@
     break;
 
   case 127:
-#line 939 "pir.y"
+#line 942 "pir.y"
     { (yyval.sval) = expand_macro(yyscanner, (yyvsp[(1) - (2)].mval), (yyvsp[(2) - (2)].pval)); ;}
     break;
 
   case 128:
-#line 947 "pir.y"
+#line 950 "pir.y"
     { set_instr(lexer, NULL); ;}
     break;
 
   case 130:
-#line 955 "pir.y"
+#line 958 "pir.y"
     {
                            if (lexer->parse_errors > MAX_NUM_ERRORS)
                                panic(lexer, "Too many errors. Compilation aborted.\n");
@@ -3014,7 +3023,7 @@
     break;
 
   case 131:
-#line 964 "pir.y"
+#line 967 "pir.y"
     {
                            set_instrf(lexer, "null", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3022,7 +3031,7 @@
     break;
 
   case 132:
-#line 971 "pir.y"
+#line 974 "pir.y"
     {
                            set_instrf(lexer, "get_results", "%T", (yyvsp[(2) - (3)].targ));
                            get_opinfo(yyscanner);
@@ -3030,7 +3039,7 @@
     break;
 
   case 136:
-#line 985 "pir.y"
+#line 988 "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.
                             */
@@ -3040,7 +3049,7 @@
     break;
 
   case 137:
-#line 994 "pir.y"
+#line 997 "pir.y"
     { /* when this rule is activated, the initial identifier must
                            * be a parrot op.
                            */
@@ -3050,7 +3059,7 @@
     break;
 
   case 143:
-#line 1012 "pir.y"
+#line 1015 "pir.y"
     {
                          /* the "instruction" that was set now appears to be
                           * an identifier; get the name, and check its type.
@@ -3087,22 +3096,22 @@
     break;
 
   case 144:
-#line 1048 "pir.y"
+#line 1051 "pir.y"
     { push_operand(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 145:
-#line 1050 "pir.y"
+#line 1053 "pir.y"
     { push_operand(lexer, expr_from_key(lexer, (yyvsp[(1) - (1)].key))); ;}
     break;
 
   case 146:
-#line 1054 "pir.y"
+#line 1057 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 147:
-#line 1056 "pir.y"
+#line 1059 "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));
@@ -3110,17 +3119,17 @@
     break;
 
   case 148:
-#line 1061 "pir.y"
+#line 1064 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 149:
-#line 1063 "pir.y"
+#line 1066 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 150:
-#line 1067 "pir.y"
+#line 1070 "pir.y"
     {
                            /* if $1 is a register, just return that */
                            if (TEST_FLAG((yyvsp[(1) - (2)].targ)->flags, TARGET_FLAG_IS_REG))
@@ -3144,22 +3153,22 @@
     break;
 
   case 151:
-#line 1090 "pir.y"
+#line 1093 "pir.y"
     { (yyval.key) = (yyvsp[(2) - (3)].key); ;}
     break;
 
   case 152:
-#line 1094 "pir.y"
+#line 1097 "pir.y"
     { (yyval.key) = new_key(lexer, (yyvsp[(1) - (1)].expr)); ;}
     break;
 
   case 153:
-#line 1096 "pir.y"
+#line 1099 "pir.y"
     { (yyval.key) = add_key(lexer, (yyvsp[(1) - (3)].key), (yyvsp[(3) - (3)].expr)); ;}
     break;
 
   case 154:
-#line 1105 "pir.y"
+#line 1108 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (6)].expr));
@@ -3173,7 +3182,7 @@
     break;
 
   case 155:
-#line 1116 "pir.y"
+#line 1119 "pir.y"
     {
                           /* the instruction is already set in parrot_op rule */
                           unshift_operand(lexer, (yyvsp[(4) - (4)].expr));
@@ -3188,7 +3197,7 @@
     break;
 
   case 156:
-#line 1128 "pir.y"
+#line 1131 "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)));
@@ -3199,7 +3208,7 @@
     break;
 
   case 160:
-#line 1145 "pir.y"
+#line 1148 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3211,7 +3220,7 @@
     break;
 
   case 161:
-#line 1154 "pir.y"
+#line 1157 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 0.0)
                               set_instrf(lexer, "null", "%T", (yyvsp[(1) - (3)].targ));
@@ -3223,15 +3232,15 @@
     break;
 
   case 162:
-#line 1163 "pir.y"
+#line 1166 "pir.y"
     {
-                          set_instrf(lexer, "set", "%T%s", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].sval));
+                          set_instrf(lexer, "set", "%T%C", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].cval));
                           get_opinfo(yyscanner);
                         ;}
     break;
 
   case 163:
-#line 1168 "pir.y"
+#line 1171 "pir.y"
     {
                           set_instrf(lexer, "set", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3239,7 +3248,7 @@
     break;
 
   case 164:
-#line 1173 "pir.y"
+#line 1176 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (3)].sval));
                           if (sym) {
@@ -3263,7 +3272,7 @@
     break;
 
   case 165:
-#line 1194 "pir.y"
+#line 1197 "pir.y"
     {
                           unshift_operand(lexer, expr_from_target(lexer, (yyvsp[(1) - (3)].targ)));
                           get_opinfo(yyscanner);
@@ -3271,7 +3280,7 @@
     break;
 
   case 166:
-#line 1199 "pir.y"
+#line 1202 "pir.y"
     {
                           /*   $P0 = foo ["bar"]
                            *
@@ -3315,7 +3324,7 @@
     break;
 
   case 167:
-#line 1240 "pir.y"
+#line 1243 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(3) - (4)].sval));
                           target *t;
@@ -3336,7 +3345,7 @@
     break;
 
   case 168:
-#line 1258 "pir.y"
+#line 1261 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(3) - (4)].ival));
                           set_target_key(preg, (yyvsp[(4) - (4)].key));
@@ -3346,7 +3355,7 @@
     break;
 
   case 169:
-#line 1265 "pir.y"
+#line 1268 "pir.y"
     {
                           set_instrf(lexer, opnames[(yyvsp[(2) - (3)].ival)], "%T%E", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].expr));
                           get_opinfo(yyscanner);
@@ -3354,7 +3363,7 @@
     break;
 
   case 170:
-#line 1270 "pir.y"
+#line 1273 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3368,7 +3377,7 @@
     break;
 
   case 171:
-#line 1281 "pir.y"
+#line 1284 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "inc", "%T", (yyvsp[(1) - (3)].targ));
@@ -3382,7 +3391,7 @@
     break;
 
   case 172:
-#line 1292 "pir.y"
+#line 1295 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].ival) == 1)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3396,7 +3405,7 @@
     break;
 
   case 173:
-#line 1303 "pir.y"
+#line 1306 "pir.y"
     {
                           if ((yyvsp[(3) - (3)].dval) == 1.0)
                               set_instrf(lexer, "dec", "%T", (yyvsp[(1) - (3)].targ));
@@ -3410,7 +3419,7 @@
     break;
 
   case 174:
-#line 1314 "pir.y"
+#line 1317 "pir.y"
     {
                           set_instrf(lexer, "add", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3418,7 +3427,7 @@
     break;
 
   case 175:
-#line 1319 "pir.y"
+#line 1322 "pir.y"
     {
                           set_instrf(lexer, "sub", "%T%T", (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ));
                           get_opinfo(yyscanner);
@@ -3426,7 +3435,7 @@
     break;
 
   case 176:
-#line 1324 "pir.y"
+#line 1327 "pir.y"
     {
                           set_instrf(lexer, (yyvsp[(3) - (4)].sval), "%T%E", (yyvsp[(1) - (4)].targ), (yyvsp[(4) - (4)].expr));
                           get_opinfo(yyscanner);
@@ -3434,7 +3443,7 @@
     break;
 
   case 177:
-#line 1329 "pir.y"
+#line 1332 "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));
@@ -3447,7 +3456,7 @@
     break;
 
   case 178:
-#line 1339 "pir.y"
+#line 1342 "pir.y"
     {
                           symbol *sym = find_symbol(lexer, (yyvsp[(1) - (4)].sval));
                           target *t;
@@ -3469,7 +3478,7 @@
     break;
 
   case 179:
-#line 1358 "pir.y"
+#line 1361 "pir.y"
     {
                           target *preg = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (4)].ival));
                           set_target_key(preg, (yyvsp[(2) - (4)].key));
@@ -3479,97 +3488,97 @@
     break;
 
   case 180:
-#line 1392 "pir.y"
+#line 1395 "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 1397 "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 1399 "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 1401 "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 1403 "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 1405 "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 1407 "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 1409 "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 1414 "pir.y"
     { get_opinfo(yyscanner); ;}
     break;
 
   case 189:
-#line 1420 "pir.y"
+#line 1423 "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 1425 "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 1427 "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 1429 "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 1431 "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 1433 "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 1435 "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 1437 "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 1439 "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 1441 "pir.y"
     {
                           int istrue = evaluate_c(lexer, (yyvsp[(2) - (4)].cval));
                           /* if "unless", invert the true-ness */
@@ -3584,7 +3593,7 @@
     break;
 
   case 199:
-#line 1450 "pir.y"
+#line 1453 "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));
@@ -3592,67 +3601,67 @@
     break;
 
   case 200:
-#line 1455 "pir.y"
+#line 1458 "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 1460 "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 1462 "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 1464 "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 1466 "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 1468 "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 1470 "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 1472 "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 1474 "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 1476 "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 1478 "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 1480 "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 1482 "pir.y"
     {
                           if ((yyvsp[(2) - (4)].ival) == COMPUTE_DURING_RUNTIME) {
                              if ((yyvsp[(1) - (4)].ival) == NEED_INVERT_OPNAME) /* "unless" */
@@ -3680,7 +3689,7 @@
     break;
 
   case 213:
-#line 1510 "pir.y"
+#line 1513 "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
@@ -3709,7 +3718,7 @@
     break;
 
   case 214:
-#line 1536 "pir.y"
+#line 1539 "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));
@@ -3720,7 +3729,7 @@
     break;
 
   case 215:
-#line 1544 "pir.y"
+#line 1547 "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));
@@ -3732,7 +3741,7 @@
     break;
 
   case 216:
-#line 1553 "pir.y"
+#line 1556 "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));
@@ -3744,32 +3753,32 @@
     break;
 
   case 217:
-#line 1562 "pir.y"
+#line 1565 "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 1567 "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 1569 "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 1571 "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 1573 "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 1577 "pir.y"
     {
                           yypirerror(yyscanner, lexer, "cannot compare string to %s",
                                      (yyvsp[(3) - (3)].ival) == INT_TYPE ? "integer" : "number");
@@ -3777,37 +3786,37 @@
     break;
 
   case 223:
-#line 1579 "pir.y"
+#line 1582 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare integer to string"); ;}
     break;
 
   case 224:
-#line 1581 "pir.y"
+#line 1584 "pir.y"
     { yypirerror(yyscanner, lexer, "cannot compare number to string"); ;}
     break;
 
   case 225:
-#line 1585 "pir.y"
+#line 1588 "pir.y"
     { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 226:
-#line 1586 "pir.y"
+#line 1589 "pir.y"
     { (yyval.ival) = NUM_TYPE; ;}
     break;
 
   case 227:
-#line 1589 "pir.y"
+#line 1592 "pir.y"
     { (yyval.ival) = DONT_INVERT_OPNAME; /* no need to invert */ ;}
     break;
 
   case 228:
-#line 1590 "pir.y"
+#line 1593 "pir.y"
     { (yyval.ival) = NEED_INVERT_OPNAME; /* yes, invert opname */ ;}
     break;
 
   case 231:
-#line 1598 "pir.y"
+#line 1601 "pir.y"
     {
                           set_instrf(lexer, "branch", "%I", (yyvsp[(2) - (3)].sval));
                           set_op_labelflag(lexer, BIT(0)); /* bit 0 means: "1 << 0" */
@@ -3816,37 +3825,37 @@
     break;
 
   case 232:
-#line 1606 "pir.y"
+#line 1609 "pir.y"
     { declare_local(lexer, (yyvsp[(2) - (4)].ival), (yyvsp[(3) - (4)].symb)); ;}
     break;
 
   case 233:
-#line 1610 "pir.y"
+#line 1613 "pir.y"
     { (yyval.symb) = (yyvsp[(1) - (1)].symb); ;}
     break;
 
   case 234:
-#line 1612 "pir.y"
+#line 1615 "pir.y"
     { (yyval.symb) = add_local((yyvsp[(1) - (3)].symb), (yyvsp[(3) - (3)].symb)); ;}
     break;
 
   case 235:
-#line 1616 "pir.y"
+#line 1619 "pir.y"
     { (yyval.symb) = new_local(lexer, (yyvsp[(1) - (2)].sval), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 236:
-#line 1619 "pir.y"
+#line 1622 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 237:
-#line 1620 "pir.y"
+#line 1623 "pir.y"
     { (yyval.ival) = 1; ;}
     break;
 
   case 238:
-#line 1624 "pir.y"
+#line 1627 "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)) {
 
@@ -3859,12 +3868,12 @@
     break;
 
   case 239:
-#line 1639 "pir.y"
+#line 1642 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 242:
-#line 1651 "pir.y"
+#line 1654 "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));
@@ -3872,72 +3881,72 @@
     break;
 
   case 243:
-#line 1658 "pir.y"
+#line 1661 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 244:
-#line 1660 "pir.y"
+#line 1663 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 245:
-#line 1664 "pir.y"
+#line 1667 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 246:
-#line 1666 "pir.y"
+#line 1669 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 247:
-#line 1670 "pir.y"
+#line 1673 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 248:
-#line 1674 "pir.y"
+#line 1677 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(2) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 249:
-#line 1676 "pir.y"
+#line 1679 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_NCI, (yyvsp[(2) - (2)].targ)); ;}
     break;
 
   case 250:
-#line 1679 "pir.y"
+#line 1682 "pir.y"
     { (yyval.invo) = invoke(lexer, CALL_METHOD, (yyvsp[(2) - (5)].targ), (yyvsp[(5) - (5)].expr)); ;}
     break;
 
   case 251:
-#line 1683 "pir.y"
+#line 1686 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 252:
-#line 1685 "pir.y"
+#line 1688 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (2)].targ); ;}
     break;
 
   case 253:
-#line 1689 "pir.y"
+#line 1692 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 254:
-#line 1691 "pir.y"
+#line 1694 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 255:
-#line 1695 "pir.y"
+#line 1698 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 256:
-#line 1697 "pir.y"
+#line 1700 "pir.y"
     {
                              if ((yyvsp[(2) - (2)].targ))
                                  (yyval.targ) = add_target(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].targ));
@@ -3947,32 +3956,32 @@
     break;
 
   case 257:
-#line 1706 "pir.y"
+#line 1709 "pir.y"
     { (yyval.targ) = (yyvsp[(2) - (3)].targ); ;}
     break;
 
   case 258:
-#line 1708 "pir.y"
+#line 1711 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 260:
-#line 1716 "pir.y"
+#line 1719 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 261:
-#line 1718 "pir.y"
+#line 1721 "pir.y"
     { (yyval.invo) = set_invocation_results(lexer, (yyvsp[(3) - (3)].invo), (yyvsp[(1) - (3)].targ)); ;}
     break;
 
   case 262:
-#line 1720 "pir.y"
+#line 1723 "pir.y"
     {  (yyval.invo) = set_invocation_results(lexer, (yyvsp[(1) - (1)].invo), NULL); ;}
     break;
 
   case 265:
-#line 1728 "pir.y"
+#line 1731 "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)) {
@@ -3993,7 +4002,7 @@
     break;
 
   case 266:
-#line 1748 "pir.y"
+#line 1751 "pir.y"
     {
                              (yyval.invo) = invoke(lexer, CALL_PCC, (yyvsp[(1) - (2)].targ), NULL);
                              set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (2)].argm));
@@ -4001,12 +4010,12 @@
     break;
 
   case 267:
-#line 1755 "pir.y"
+#line 1758 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 268:
-#line 1757 "pir.y"
+#line 1760 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4017,7 +4026,7 @@
     break;
 
   case 269:
-#line 1767 "pir.y"
+#line 1770 "pir.y"
     { /* check that this identifier was declared */
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
 
@@ -4037,22 +4046,22 @@
     break;
 
   case 270:
-#line 1784 "pir.y"
+#line 1787 "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 1789 "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 1791 "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 1795 "pir.y"
     {
                              symbol *sym = find_symbol(lexer, (yyvsp[(1) - (1)].sval));
                              if (sym == NULL)
@@ -4064,74 +4073,74 @@
     break;
 
   case 274:
-#line 1801 "pir.y"
+#line 1804 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 275:
-#line 1806 "pir.y"
+#line 1809 "pir.y"
     {
                              (yyval.targ) = (yyvsp[(2) - (3)].targ);
                            ;}
     break;
 
   case 276:
-#line 1812 "pir.y"
+#line 1815 "pir.y"
     { (yyval.targ) = NULL; ;}
     break;
 
   case 277:
-#line 1814 "pir.y"
+#line 1817 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 278:
-#line 1818 "pir.y"
+#line 1821 "pir.y"
     { (yyval.targ) = (yyvsp[(1) - (1)].targ); ;}
     break;
 
   case 279:
-#line 1820 "pir.y"
+#line 1823 "pir.y"
     { (yyval.targ) = add_target(lexer, (yyvsp[(1) - (3)].targ), (yyvsp[(3) - (3)].targ)); ;}
     break;
 
   case 280:
-#line 1824 "pir.y"
+#line 1827 "pir.y"
     { (yyval.targ) = set_param_flag(lexer, (yyvsp[(1) - (2)].targ), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 281:
-#line 1826 "pir.y"
+#line 1829 "pir.y"
     { (yyval.targ) = set_param_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 282:
-#line 1830 "pir.y"
+#line 1833 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 283:
-#line 1832 "pir.y"
+#line 1835 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 284:
-#line 1836 "pir.y"
+#line 1839 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPTIONAL; ;}
     break;
 
   case 285:
-#line 1838 "pir.y"
+#line 1841 "pir.y"
     { (yyval.ival) = TARGET_FLAG_OPT_FLAG; ;}
     break;
 
   case 286:
-#line 1840 "pir.y"
+#line 1843 "pir.y"
     { (yyval.ival) = TARGET_FLAG_SLURPY; ;}
     break;
 
   case 287:
-#line 1842 "pir.y"
+#line 1845 "pir.y"
     {
                              (yyval.ival) = TARGET_FLAG_NAMED;
                              set_param_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4139,12 +4148,12 @@
     break;
 
   case 288:
-#line 1852 "pir.y"
+#line 1855 "pir.y"
     { convert_inv_to_instr(lexer, (yyvsp[(1) - (1)].invo)); ;}
     break;
 
   case 293:
-#line 1862 "pir.y"
+#line 1865 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4152,7 +4161,7 @@
     break;
 
   case 294:
-#line 1867 "pir.y"
+#line 1870 "pir.y"
     { /* was the invocation a method call? then it becomes a method tail
                                * call, otherwise it's just a normal (sub) tail call.
                                */
@@ -4164,7 +4173,7 @@
     break;
 
   case 295:
-#line 1878 "pir.y"
+#line 1881 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(2) - (3)].argm));
@@ -4172,47 +4181,47 @@
     break;
 
   case 296:
-#line 1885 "pir.y"
+#line 1888 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 297:
-#line 1889 "pir.y"
+#line 1892 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 298:
-#line 1891 "pir.y"
+#line 1894 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 299:
-#line 1895 "pir.y"
+#line 1898 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 300:
-#line 1897 "pir.y"
+#line 1900 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (3)].argm), (yyvsp[(3) - (3)].argm)); ;}
     break;
 
   case 303:
-#line 1905 "pir.y"
+#line 1908 "pir.y"
     { (yyval.argm) = set_arg_alias(lexer, (yyvsp[(1) - (3)].sval)); ;}
     break;
 
   case 304:
-#line 1909 "pir.y"
+#line 1912 "pir.y"
     { (yyval.argm) = set_arg_flag((yyval.argm), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 305:
-#line 1913 "pir.y"
+#line 1916 "pir.y"
     { (yyval.argm) = set_curarg(lexer, new_argument(lexer, (yyvsp[(1) - (1)].expr)));  ;}
     break;
 
   case 306:
-#line 1919 "pir.y"
+#line 1922 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_RETURN);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4220,7 +4229,7 @@
     break;
 
   case 307:
-#line 1928 "pir.y"
+#line 1931 "pir.y"
     {
                               (yyval.invo) = invoke(lexer, CALL_YIELD);
                               set_invocation_args(lexer, (yyval.invo), (yyvsp[(3) - (5)].argm));
@@ -4228,72 +4237,72 @@
     break;
 
   case 308:
-#line 1935 "pir.y"
+#line 1938 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 309:
-#line 1937 "pir.y"
+#line 1940 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 310:
-#line 1942 "pir.y"
+#line 1945 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 311:
-#line 1944 "pir.y"
+#line 1947 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 312:
-#line 1949 "pir.y"
+#line 1952 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 313:
-#line 1953 "pir.y"
+#line 1956 "pir.y"
     { (yyval.argm) = NULL; ;}
     break;
 
   case 314:
-#line 1955 "pir.y"
+#line 1958 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 315:
-#line 1959 "pir.y"
+#line 1962 "pir.y"
     { (yyval.argm) = (yyvsp[(1) - (1)].argm); ;}
     break;
 
   case 316:
-#line 1961 "pir.y"
+#line 1964 "pir.y"
     { (yyval.argm) = add_arg((yyvsp[(1) - (2)].argm), (yyvsp[(2) - (2)].argm)); ;}
     break;
 
   case 317:
-#line 1965 "pir.y"
+#line 1968 "pir.y"
     { (yyval.argm) = (yyvsp[(2) - (3)].argm); ;}
     break;
 
   case 318:
-#line 1970 "pir.y"
+#line 1973 "pir.y"
     { (yyval.ival) = 0; ;}
     break;
 
   case 319:
-#line 1972 "pir.y"
+#line 1975 "pir.y"
     { SET_FLAG((yyval.ival), (yyvsp[(2) - (2)].ival)); ;}
     break;
 
   case 320:
-#line 1976 "pir.y"
+#line 1979 "pir.y"
     { (yyval.ival) = ARG_FLAG_FLAT; ;}
     break;
 
   case 321:
-#line 1978 "pir.y"
+#line 1981 "pir.y"
     {
                                (yyval.ival) = ARG_FLAG_NAMED;
                                set_arg_alias(lexer, (yyvsp[(2) - (2)].sval));
@@ -4301,137 +4310,152 @@
     break;
 
   case 322:
-#line 1985 "pir.y"
+#line 1988 "pir.y"
     { (yyval.sval) = NULL; ;}
     break;
 
   case 323:
-#line 1987 "pir.y"
+#line 1990 "pir.y"
     { (yyval.sval) = (yyvsp[(1) - (1)].sval); ;}
     break;
 
   case 324:
-#line 1991 "pir.y"
+#line 1994 "pir.y"
     { (yyval.sval) = (yyvsp[(2) - (3)].sval); ;}
     break;
 
   case 328:
-#line 2002 "pir.y"
+#line 2005 "pir.y"
     { store_global_constant(lexer, (yyvsp[(2) - (2)].cval)); ;}
     break;
 
   case 329:
-#line 2006 "pir.y"
+#line 2009 "pir.y"
     { /* XXX is .globalconst to be kept? */ ;}
     break;
 
   case 330:
-#line 2010 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, INT_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
+#line 2013 "pir.y"
+    { (yyval.cval) = new_named_const(lexer, INT_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].ival)); ;}
     break;
 
   case 331:
-#line 2012 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, NUM_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
+#line 2015 "pir.y"
+    { (yyval.cval) = new_named_const(lexer, NUM_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].dval)); ;}
     break;
 
   case 332:
-#line 2014 "pir.y"
-    { (yyval.cval) = new_named_const(lexer, STRING_TYPE, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
+#line 2017 "pir.y"
+    { (yyval.cval) = new_named_const(lexer, STRING_VAL, (yyvsp[(2) - (4)].sval), (yyvsp[(4) - (4)].sval)); ;}
     break;
 
   case 333:
-#line 2016 "pir.y"
+#line 2019 "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 2026 "pir.y"
     { (yyval.expr) = expr_from_target(lexer, (yyvsp[(1) - (1)].targ)); ;}
     break;
 
   case 335:
-#line 2024 "pir.y"
+#line 2027 "pir.y"
     { (yyval.expr) = expr_from_const(lexer, (yyvsp[(1) - (1)].cval)); ;}
     break;
 
   case 336:
-#line 2028 "pir.y"
-    { (yyval.cval) = new_const(lexer, STRING_TYPE, (yyvsp[(1) - (1)].sval)); ;}
+#line 2031 "pir.y"
+    { (yyval.cval) = new_const(lexer, STRING_VAL, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 337:
-#line 2029 "pir.y"
-    { (yyval.cval) = new_const(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival)); ;}
+#line 2032 "pir.y"
+    { (yyval.cval) = new_const(lexer, INT_VAL, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
   case 338:
-#line 2030 "pir.y"
-    { (yyval.cval) = new_const(lexer, NUM_TYPE, (yyvsp[(1) - (1)].dval)); ;}
+#line 2033 "pir.y"
+    { (yyval.cval) = new_const(lexer, NUM_VAL, (yyvsp[(1) - (1)].dval)); ;}
     break;
 
   case 339:
-#line 2031 "pir.y"
+#line 2034 "pir.y"
     { (yyval.cval) = (yyvsp[(1) - (1)].cval); ;}
     break;
 
   case 340:
-#line 2034 "pir.y"
-    { (yyval.ival) = OP_NE; ;}
+#line 2035 "pir.y"
+    { (yyval.cval) = new_const(lexer, USTRING_VAL, (yyvsp[(1) - (1)].ustr)); ;}
     break;
 
   case 341:
-#line 2035 "pir.y"
-    { (yyval.ival) = OP_EQ; ;}
+#line 2038 "pir.y"
+    { (yyval.cval) = new_const(lexer, STRING_VAL, (yyvsp[(1) - (1)].sval)); ;}
     break;
 
   case 342:
-#line 2036 "pir.y"
-    { (yyval.ival) = OP_LT; ;}
+#line 2039 "pir.y"
+    { (yyval.cval) = new_const(lexer, USTRING_VAL, (yyvsp[(1) - (1)].ustr)); ;}
     break;
 
   case 343:
-#line 2037 "pir.y"
-    { (yyval.ival) = OP_LE; ;}
+#line 2042 "pir.y"
+    { (yyval.ival) = OP_NE; ;}
     break;
 
   case 344:
-#line 2038 "pir.y"
-    { (yyval.ival) = OP_GE; ;}
+#line 2043 "pir.y"
+    { (yyval.ival) = OP_EQ; ;}
     break;
 
   case 345:
-#line 2039 "pir.y"
-    { (yyval.ival) = OP_GT; ;}
+#line 2044 "pir.y"
+    { (yyval.ival) = OP_LT; ;}
     break;
 
   case 346:
-#line 2042 "pir.y"
-    { (yyval.ival) = INT_TYPE; ;}
+#line 2045 "pir.y"
+    { (yyval.ival) = OP_LE; ;}
     break;
 
   case 347:
-#line 2043 "pir.y"
-    { (yyval.ival) = NUM_TYPE; ;}
+#line 2046 "pir.y"
+    { (yyval.ival) = OP_GE; ;}
     break;
 
   case 348:
-#line 2044 "pir.y"
-    { (yyval.ival) = PMC_TYPE; ;}
+#line 2047 "pir.y"
+    { (yyval.ival) = OP_GT; ;}
     break;
 
   case 349:
-#line 2045 "pir.y"
-    { (yyval.ival) = STRING_TYPE; ;}
+#line 2050 "pir.y"
+    { (yyval.ival) = INT_TYPE; ;}
     break;
 
   case 350:
+#line 2051 "pir.y"
+    { (yyval.ival) = NUM_TYPE; ;}
+    break;
+
+  case 351:
+#line 2052 "pir.y"
+    { (yyval.ival) = PMC_TYPE; ;}
+    break;
+
+  case 352:
 #line 2053 "pir.y"
+    { (yyval.ival) = STRING_TYPE; ;}
+    break;
+
+  case 353:
+#line 2061 "pir.y"
     { set_curtarget(lexer, (yyvsp[(1) - (1)].targ));  ;}
     break;
 
-  case 352:
-#line 2057 "pir.y"
+  case 355:
+#line 2065 "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) {
@@ -4443,278 +4467,278 @@
                          ;}
     break;
 
-  case 353:
-#line 2068 "pir.y"
+  case 356:
+#line 2076 "pir.y"
     { (yyval.targ) = new_reg(lexer, PMC_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
-  case 354:
-#line 2069 "pir.y"
+  case 357:
+#line 2077 "pir.y"
     { (yyval.targ) = new_reg(lexer, NUM_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
-  case 355:
-#line 2070 "pir.y"
+  case 358:
+#line 2078 "pir.y"
     { (yyval.targ) = new_reg(lexer, INT_TYPE, (yyvsp[(1) - (1)].ival));    ;}
     break;
 
-  case 356:
-#line 2071 "pir.y"
+  case 359:
+#line 2079 "pir.y"
     { (yyval.targ) = new_reg(lexer, STRING_TYPE, (yyvsp[(1) - (1)].ival)); ;}
     break;
 
-  case 359:
-#line 2079 "pir.y"
+  case 362:
+#line 2087 "pir.y"
     { (yyval.sval) = "if"; ;}
     break;
 
-  case 360:
-#line 2080 "pir.y"
+  case 363:
+#line 2088 "pir.y"
     { (yyval.sval) = "unless"; ;}
     break;
 
-  case 361:
-#line 2081 "pir.y"
+  case 364:
+#line 2089 "pir.y"
     { (yyval.sval) = "goto"; ;}
     break;
 
-  case 362:
-#line 2082 "pir.y"
+  case 365:
+#line 2090 "pir.y"
     { (yyval.sval) = "int"; ;}
     break;
 
-  case 363:
-#line 2083 "pir.y"
+  case 366:
+#line 2091 "pir.y"
     { (yyval.sval) = "num"; ;}
     break;
 
-  case 364:
-#line 2084 "pir.y"
+  case 367:
+#line 2092 "pir.y"
     { (yyval.sval) = "string"; ;}
     break;
 
-  case 365:
-#line 2085 "pir.y"
+  case 368:
+#line 2093 "pir.y"
     { (yyval.sval) = "pmc"; ;}
     break;
 
-  case 366:
-#line 2086 "pir.y"
+  case 369:
+#line 2094 "pir.y"
     { (yyval.sval) = "null"; ;}
     break;
 
-  case 367:
-#line 2089 "pir.y"
+  case 370:
+#line 2097 "pir.y"
     { (yyval.sval) = "neg"; ;}
     break;
 
-  case 368:
-#line 2090 "pir.y"
+  case 371:
+#line 2098 "pir.y"
     { (yyval.sval) = "not"; ;}
     break;
 
-  case 369:
-#line 2091 "pir.y"
+  case 372:
+#line 2099 "pir.y"
     { (yyval.sval) = "bnot"; ;}
     break;
 
-  case 370:
-#line 2094 "pir.y"
+  case 373:
+#line 2102 "pir.y"
     { (yyval.ival) = OP_ADD; ;}
     break;
 
-  case 371:
-#line 2095 "pir.y"
+  case 374:
+#line 2103 "pir.y"
     { (yyval.ival) = OP_SUB; ;}
     break;
 
-  case 372:
-#line 2096 "pir.y"
+  case 375:
+#line 2104 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
-  case 373:
-#line 2097 "pir.y"
+  case 376:
+#line 2105 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
-  case 374:
-#line 2098 "pir.y"
+  case 377:
+#line 2106 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
-  case 375:
-#line 2099 "pir.y"
+  case 378:
+#line 2107 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
-  case 376:
-#line 2100 "pir.y"
+  case 379:
+#line 2108 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
-  case 377:
-#line 2101 "pir.y"
+  case 380:
+#line 2109 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
-  case 378:
-#line 2102 "pir.y"
+  case 381:
+#line 2110 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
-  case 379:
-#line 2103 "pir.y"
+  case 382:
+#line 2111 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
-  case 380:
-#line 2104 "pir.y"
+  case 383:
+#line 2112 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
-  case 381:
-#line 2105 "pir.y"
+  case 384:
+#line 2113 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
-  case 382:
-#line 2106 "pir.y"
+  case 385:
+#line 2114 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
-  case 383:
-#line 2107 "pir.y"
+  case 386:
+#line 2115 "pir.y"
     { (yyval.ival) = OP_OR; ;}
     break;
 
-  case 384:
-#line 2108 "pir.y"
+  case 387:
+#line 2116 "pir.y"
     { (yyval.ival) = OP_AND; ;}
     break;
 
-  case 385:
-#line 2109 "pir.y"
+  case 388:
+#line 2117 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
-  case 386:
-#line 2110 "pir.y"
+  case 389:
+#line 2118 "pir.y"
     { (yyval.ival) = OP_XOR; ;}
     break;
 
-  case 387:
-#line 2111 "pir.y"
+  case 390:
+#line 2119 "pir.y"
     { (yyval.ival) = OP_ISEQ; ;}
     break;
 
-  case 388:
-#line 2112 "pir.y"
+  case 391:
+#line 2120 "pir.y"
     { (yyval.ival) = OP_ISLE; ;}
     break;
 
-  case 389:
-#line 2113 "pir.y"
+  case 392:
+#line 2121 "pir.y"
     { (yyval.ival) = OP_ISLT; ;}
     break;
 
-  case 390:
-#line 2114 "pir.y"
+  case 393:
+#line 2122 "pir.y"
     { (yyval.ival) = OP_ISGE; ;}
     break;
 
-  case 391:
-#line 2115 "pir.y"
+  case 394:
+#line 2123 "pir.y"
     { (yyval.ival) = OP_ISGT; ;}
     break;
 
-  case 392:
-#line 2116 "pir.y"
+  case 395:
+#line 2124 "pir.y"
     { (yyval.ival) = OP_ISNE; ;}
     break;
 
-  case 393:
-#line 2122 "pir.y"
+  case 396:
+#line 2130 "pir.y"
     { (yyval.ival) = OP_MUL; ;}
     break;
 
-  case 394:
-#line 2123 "pir.y"
+  case 397:
+#line 2131 "pir.y"
     { (yyval.ival) = OP_MOD; ;}
     break;
 
-  case 395:
-#line 2124 "pir.y"
+  case 398:
+#line 2132 "pir.y"
     { (yyval.ival) = OP_POW; ;}
     break;
 
-  case 396:
-#line 2125 "pir.y"
+  case 399:
+#line 2133 "pir.y"
     { (yyval.ival) = OP_DIV; ;}
     break;
 
-  case 397:
-#line 2126 "pir.y"
+  case 400:
+#line 2134 "pir.y"
     { (yyval.ival) = OP_FDIV; ;}
     break;
 
-  case 398:
-#line 2127 "pir.y"
+  case 401:
+#line 2135 "pir.y"
     { (yyval.ival) = OP_BOR; ;}
     break;
 
-  case 399:
-#line 2128 "pir.y"
+  case 402:
+#line 2136 "pir.y"
     { (yyval.ival) = OP_BAND; ;}
     break;
 
-  case 400:
-#line 2129 "pir.y"
+  case 403:
+#line 2137 "pir.y"
     { (yyval.ival) = OP_BXOR; ;}
     break;
 
-  case 401:
-#line 2130 "pir.y"
+  case 404:
+#line 2138 "pir.y"
     { (yyval.ival) = OP_CONCAT; ;}
     break;
 
-  case 402:
-#line 2131 "pir.y"
+  case 405:
+#line 2139 "pir.y"
     { (yyval.ival) = OP_SHR; ;}
     break;
 
-  case 403:
-#line 2132 "pir.y"
+  case 406:
+#line 2140 "pir.y"
     { (yyval.ival) = OP_SHL; ;}
     break;
 
-  case 404:
-#line 2133 "pir.y"
+  case 407:
+#line 2141 "pir.y"
     { (yyval.ival) = OP_LSR; ;}
     break;
 
-  case 406:
-#line 2154 "pir.y"
+  case 409:
+#line 2162 "pir.y"
     { new_subr(lexer, "@start"); ;}
     break;
 
-  case 415:
-#line 2170 "pir.y"
+  case 418:
+#line 2178 "pir.y"
     { set_label(lexer, (yyvsp[(1) - (2)].sval)); ;}
     break;
 
-  case 420:
-#line 2180 "pir.y"
+  case 423:
+#line 2188 "pir.y"
     { set_sub_name(lexer, (yyvsp[(3) - (3)].sval)); ;}
     break;
 
-  case 421:
-#line 2184 "pir.y"
+  case 424:
+#line 2192 "pir.y"
     { new_subr(lexer, NULL); ;}
     break;
 
-  case 422:
-#line 2189 "pir.y"
+  case 425:
+#line 2197 "pir.y"
     {
                                   if (is_parrot_op(lexer, (yyvsp[(1) - (3)].sval)))
                                       get_opinfo(yyscanner);
@@ -4726,7 +4750,7 @@
 
 
 /* Line 1267 of yacc.c.  */
-#line 4730 "pirparser.c"
+#line 4754 "pirparser.c"
       default: break;
     }
   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -4940,15 +4964,19 @@
 }
 
 
-#line 2200 "pir.y"
+#line 2208 "pir.y"
 
 
 
 
 /* the order of these letters match with the pir_type enumeration.
  * These are used for generating the full opname (set I0, 10 -> set_i_ic).
+ * The first 5 correspond to the values in the pir_type enumeration,
+ * the last 5 correspond to the values in the value_type enumeration.
+ * Note that the last 's' corresponds to USTRING_VAL, which is a unicode
+ * string, but when used it's still a string.
  */
-static char const type_codes[5] = {'i', 's', 'p', 'n', '?'};
+static char const type_codes[10] = {'i', 's', 'p', 'n', '?', 'i', 's', 'p', 'n', 's'};
 
 
 /*
@@ -5056,7 +5084,7 @@
                   "detected 'inc' or 'dec' in fold_i_i()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), INT_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), INT_VAL, result);
 }
 
 /*
@@ -5140,7 +5168,7 @@
                   "detected 'inc' or 'dec' in fold_n_i()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -5224,7 +5252,7 @@
                   "detected 'inc' or 'dec' in fold_i_n()");
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -5309,7 +5337,7 @@
         default:
             break;
     }
-    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_TYPE, result);
+    return new_const((lexer_state * const)yypirget_extra(yyscanner), NUM_VAL, result);
 }
 
 /*
@@ -5331,7 +5359,7 @@
     lexer_state *lexer = (lexer_state *)yypirget_extra(yyscanner);
     switch (op) {
         case OP_CONCAT:
-            return new_const(lexer, STRING_TYPE, concat_strings(lexer, a, b));
+            return new_const(lexer, STRING_VAL, concat_strings(lexer, a, b));
 
         case OP_ADD:
         case OP_SUB:
@@ -5351,7 +5379,7 @@
         case OP_FDIV:
             yypirerror(yyscanner, lexer,
                     "cannot apply binary operator '%s' to arguments of type number", opnames[op]);
-            return new_const(lexer, STRING_TYPE, a);
+            return new_const(lexer, STRING_VAL, a);
 
         case OP_ISEQ:
         case OP_ISLE:
@@ -5359,7 +5387,7 @@
         case OP_ISGE:
         case OP_ISGT:
         case OP_ISNE:
-            return new_const(lexer, INT_TYPE, (1 == evaluate_s_s(a, op, b)));
+            return new_const(lexer, INT_VAL, (1 == evaluate_s_s(a, op, b)));
 
 
         /* OP_INC and OP_DEC are here only to keep the C compiler happy */
@@ -5539,12 +5567,14 @@
 static int
 evaluate_c(NOTNULL(lexer_state * const lexer), NOTNULL(constant * const c)) {
     switch (c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             return (c->val.ival != 0);
-        case NUM_TYPE:
+        case NUM_VAL:
             return (c->val.nval != 0);
-        case STRING_TYPE:
+        case STRING_VAL:
             return evaluate_s(c->val.sval);
+        case USTRING_VAL:
+            return evaluate_s(c->val.ustr->contents);
         default:
             panic(lexer, "impossible constant type in evaluate_c()");
             return 0;
@@ -5634,9 +5664,9 @@
 static int
 check_value(NOTNULL(constant * const c), int val) {
     switch(c->type) {
-        case INT_TYPE:
+        case INT_VAL:
             return (c->val.ival == val);
-        case NUM_TYPE:
+        case NUM_VAL:
             return (c->val.nval == val);
         default:
             break;
@@ -6053,7 +6083,7 @@
             int n;
             /* if the key is an integer constant, then signature becomes '_kic', otherwise _kc. */
             if (e->expr.k->head->expr->type         == EXPR_CONSTANT
-            &&  e->expr.k->head->expr->expr.c->type == INT_TYPE)
+            &&  e->expr.k->head->expr->expr.c->type == INT_VAL)
                 n = 3;
             else
                 n = 2;
@@ -6116,7 +6146,7 @@
                         break;
                     case EXPR_CONSTANT:
                         /* integer constant key results in '_kic' signature */
-                        if (iter->expr.c->type == INT_TYPE)
+                        if (iter->expr.c->type == INT_VAL)
                             *instr_writer++ = 'i';
 
                         *instr_writer++ = 'c';

Modified: trunk/compilers/pirc/new/pirparser.h
==============================================================================
--- trunk/compilers/pirc/new/pirparser.h	(original)
+++ trunk/compilers/pirc/new/pirparser.h	Sat Jan  3 03:55:47 2009
@@ -289,6 +289,7 @@
     unsigned            uval;
     char   const       *sval;
     struct constant    *cval;
+    struct ucstring    *ustr;
     struct instruction *instr;
     struct expression  *expr;
     struct target      *targ;
@@ -300,7 +301,7 @@
     struct macro_param *pval;
 }
 /* Line 1489 of yacc.c.  */
-#line 304 "pirparser.h"
+#line 305 "pirparser.h"
 	YYSTYPE;
 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
 # define YYSTYPE_IS_DECLARED 1

Modified: trunk/compilers/pirc/new/pirpcc.c
==============================================================================
--- trunk/compilers/pirc/new/pirpcc.c	(original)
+++ trunk/compilers/pirc/new/pirpcc.c	Sat Jan  3 03:55:47 2009
@@ -177,7 +177,7 @@
         /* default sub epilogue; no return values, hence 0 */
         int array_index = generate_signature_pmc(lexer, 0);
         new_sub_instr(lexer, PARROT_OP_set_returns_pc, "set_returns_pc", 0);
-        push_operand(lexer, expr_from_const(lexer, new_const(lexer, INT_TYPE, array_index)));
+        push_operand(lexer, expr_from_int(lexer, array_index));
 
         new_sub_instr(lexer, PARROT_OP_returncc, "returncc", 0);
     }



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