gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, constants, updated. a0f85571ce3250f6d69d


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, constants, updated. a0f85571ce3250f6d69d9973ea47ba6e3e604843
Date: Sun, 10 Mar 2013 08:14:47 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, constants has been updated
       via  a0f85571ce3250f6d69d9973ea47ba6e3e604843 (commit)
      from  16b28a5a3024c5ffefe60aa27ab9d7b925968465 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=a0f85571ce3250f6d69d9973ea47ba6e3e604843

commit a0f85571ce3250f6d69d9973ea47ba6e3e604843
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Mar 10 10:08:43 2013 +0200

    Rework constant values. Add := operator, more tests.

diff --git a/ChangeLog b/ChangeLog
index 4c40c3d..2118e0f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,36 @@
+2013-03-10         Arnold D. Robbins     <address@hidden>
+
+       Change how constants are handled; use a flag in the value, not
+       a new node type.  Add ":=" assignment operator to create constants
+       at the awk level. Array elements need work. Still needs documenting.
+
+       * awk.h (Node_var_const): Removed.
+       (VAR_CONST): New flag.
+       (Op_assign_const): New op code.
+       (dupnode): If value is a constant, call r_dupnode.
+       * awkgram.y (ASSIGN_CONST): New token.
+       (statement): Don't check Node_var_const.
+       (assign): Allow ASSIGN_CONST.
+       (yylex): Return ASSIGN_CONST for ":=".
+       (valinfo): Enhance for constant values.
+       (mk_assignment): Check for Op_assign_const.
+       * builtin.c (do_sub): Disallow assignment in sub/gsub to constants.
+       * debug.c (print_symbol, do_set_var, watchpoint_triggered,
+       initialize_watch, print_memory, do_print_f): Remove use of
+       Node_var_const.
+       * eval.c (nodetypes, setup_frame): Remove Node_var_const.
+       (optypetab): Add Op_assign_const;
+       (r_get_lhs, op_assign): Check value for VAR_CONST instead of node type.
+       * gawkapi.c (sym_update_real): Update value with flag, not node type.
+       * interpret.h (r_interpret): Check for flag value where appropriate
+       instead of checking node type. Add op_assign_const.
+       * io.c (do_getline_redir, do_getline): Check for constant.
+       * node.c (r_dupnode): If a constant, copy the value, don't up the
+       reference count.
+       * profile.c (pprint): Remove Node_var_const.
+       * symbol.c (destroy_symbol, make_symbol, print_vars): Remove
+       Node_var_const.
+
 2013-03-04         Arnold D. Robbins     <address@hidden>
 
        Provide the API with the ability to create true constants.
diff --git a/awk.h b/awk.h
index 105ae2c..57acc26 100644
--- a/awk.h
+++ b/awk.h
@@ -289,7 +289,6 @@ typedef enum nodevals {
 
        /* symbol table values */
        Node_var,               /* scalar variable, lnode is value */
-       Node_var_const,         /* unassignable scalar variable, lnode is value 
*/
        Node_var_array,         /* array is ptr to elements, table_size num of 
eles */
        Node_var_new,           /* newly created variable, may become an array 
*/
        Node_param_list,        /* lnode is a variable, rnode is more list */
@@ -437,6 +436,8 @@ typedef struct exp_node {
 #              define  HALFHAT         0x8000       /* half-capacity Hashed 
Array Tree;
                                                      * See cint_array.c */
 #              define  XARRAY          0x10000
+
+#              define  VAR_CONST       0x20000     /* value is for a const */
 } NODE;
 
 #define vname sub.nodep.name
@@ -588,6 +589,7 @@ typedef enum opcodeval {
 
        /* assignments */
        Op_assign,
+       Op_assign_const,
        Op_store_var,           /* simple variable assignment optimization */
        Op_store_sub,           /* array[subscript] assignment optimization */
        Op_store_field,         /* $n assignment optimization */
@@ -1782,6 +1784,9 @@ in_array(NODE *a, NODE *s)
 static inline NODE *
 dupnode(NODE *n)
 {
+       if ((n->flags & VAR_CONST) != 0)
+               return r_dupnode(n);
+
        if ((n->flags & MALLOC) != 0) {
                n->valref++;
                return n;
diff --git a/awkgram.c b/awkgram.c
index 4c9d539..741c539 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -243,46 +243,47 @@ extern int yydebug;
      IO_IN = 266,
      ASSIGNOP = 267,
      ASSIGN = 268,
-     MATCHOP = 269,
-     CONCAT_OP = 270,
-     SUBSCRIPT = 271,
-     LEX_BEGIN = 272,
-     LEX_END = 273,
-     LEX_IF = 274,
-     LEX_ELSE = 275,
-     LEX_RETURN = 276,
-     LEX_DELETE = 277,
-     LEX_SWITCH = 278,
-     LEX_CASE = 279,
-     LEX_DEFAULT = 280,
-     LEX_WHILE = 281,
-     LEX_DO = 282,
-     LEX_FOR = 283,
-     LEX_BREAK = 284,
-     LEX_CONTINUE = 285,
-     LEX_PRINT = 286,
-     LEX_PRINTF = 287,
-     LEX_NEXT = 288,
-     LEX_EXIT = 289,
-     LEX_FUNCTION = 290,
-     LEX_BEGINFILE = 291,
-     LEX_ENDFILE = 292,
-     LEX_GETLINE = 293,
-     LEX_NEXTFILE = 294,
-     LEX_IN = 295,
-     LEX_AND = 296,
-     LEX_OR = 297,
-     INCREMENT = 298,
-     DECREMENT = 299,
-     LEX_BUILTIN = 300,
-     LEX_LENGTH = 301,
-     LEX_EOF = 302,
-     LEX_INCLUDE = 303,
-     LEX_EVAL = 304,
-     LEX_LOAD = 305,
-     NEWLINE = 306,
-     SLASH_BEFORE_EQUAL = 307,
-     UNARY = 308
+     ASSIGN_CONST = 269,
+     MATCHOP = 270,
+     CONCAT_OP = 271,
+     SUBSCRIPT = 272,
+     LEX_BEGIN = 273,
+     LEX_END = 274,
+     LEX_IF = 275,
+     LEX_ELSE = 276,
+     LEX_RETURN = 277,
+     LEX_DELETE = 278,
+     LEX_SWITCH = 279,
+     LEX_CASE = 280,
+     LEX_DEFAULT = 281,
+     LEX_WHILE = 282,
+     LEX_DO = 283,
+     LEX_FOR = 284,
+     LEX_BREAK = 285,
+     LEX_CONTINUE = 286,
+     LEX_PRINT = 287,
+     LEX_PRINTF = 288,
+     LEX_NEXT = 289,
+     LEX_EXIT = 290,
+     LEX_FUNCTION = 291,
+     LEX_BEGINFILE = 292,
+     LEX_ENDFILE = 293,
+     LEX_GETLINE = 294,
+     LEX_NEXTFILE = 295,
+     LEX_IN = 296,
+     LEX_AND = 297,
+     LEX_OR = 298,
+     INCREMENT = 299,
+     DECREMENT = 300,
+     LEX_BUILTIN = 301,
+     LEX_LENGTH = 302,
+     LEX_EOF = 303,
+     LEX_INCLUDE = 304,
+     LEX_EVAL = 305,
+     LEX_LOAD = 306,
+     NEWLINE = 307,
+     SLASH_BEFORE_EQUAL = 308,
+     UNARY = 309
    };
 #endif
 /* Tokens.  */
@@ -297,46 +298,47 @@ extern int yydebug;
 #define IO_IN 266
 #define ASSIGNOP 267
 #define ASSIGN 268
-#define MATCHOP 269
-#define CONCAT_OP 270
-#define SUBSCRIPT 271
-#define LEX_BEGIN 272
-#define LEX_END 273
-#define LEX_IF 274
-#define LEX_ELSE 275
-#define LEX_RETURN 276
-#define LEX_DELETE 277
-#define LEX_SWITCH 278
-#define LEX_CASE 279
-#define LEX_DEFAULT 280
-#define LEX_WHILE 281
-#define LEX_DO 282
-#define LEX_FOR 283
-#define LEX_BREAK 284
-#define LEX_CONTINUE 285
-#define LEX_PRINT 286
-#define LEX_PRINTF 287
-#define LEX_NEXT 288
-#define LEX_EXIT 289
-#define LEX_FUNCTION 290
-#define LEX_BEGINFILE 291
-#define LEX_ENDFILE 292
-#define LEX_GETLINE 293
-#define LEX_NEXTFILE 294
-#define LEX_IN 295
-#define LEX_AND 296
-#define LEX_OR 297
-#define INCREMENT 298
-#define DECREMENT 299
-#define LEX_BUILTIN 300
-#define LEX_LENGTH 301
-#define LEX_EOF 302
-#define LEX_INCLUDE 303
-#define LEX_EVAL 304
-#define LEX_LOAD 305
-#define NEWLINE 306
-#define SLASH_BEFORE_EQUAL 307
-#define UNARY 308
+#define ASSIGN_CONST 269
+#define MATCHOP 270
+#define CONCAT_OP 271
+#define SUBSCRIPT 272
+#define LEX_BEGIN 273
+#define LEX_END 274
+#define LEX_IF 275
+#define LEX_ELSE 276
+#define LEX_RETURN 277
+#define LEX_DELETE 278
+#define LEX_SWITCH 279
+#define LEX_CASE 280
+#define LEX_DEFAULT 281
+#define LEX_WHILE 282
+#define LEX_DO 283
+#define LEX_FOR 284
+#define LEX_BREAK 285
+#define LEX_CONTINUE 286
+#define LEX_PRINT 287
+#define LEX_PRINTF 288
+#define LEX_NEXT 289
+#define LEX_EXIT 290
+#define LEX_FUNCTION 291
+#define LEX_BEGINFILE 292
+#define LEX_ENDFILE 293
+#define LEX_GETLINE 294
+#define LEX_NEXTFILE 295
+#define LEX_IN 296
+#define LEX_AND 297
+#define LEX_OR 298
+#define INCREMENT 299
+#define DECREMENT 300
+#define LEX_BUILTIN 301
+#define LEX_LENGTH 302
+#define LEX_EOF 303
+#define LEX_INCLUDE 304
+#define LEX_EVAL 305
+#define LEX_LOAD 306
+#define NEWLINE 307
+#define SLASH_BEFORE_EQUAL 308
+#define UNARY 309
 
 
 
@@ -368,7 +370,7 @@ int yyparse ();
 /* Copy the second part of user declarations.  */
 
 /* Line 390 of yacc.c  */
-#line 372 "awkgram.c"
+#line 374 "awkgram.c"
 
 #ifdef short
 # undef short
@@ -588,20 +590,20 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1155
+#define YYLAST   1122
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  75
+#define YYNTOKENS  76
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  65
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  188
+#define YYNRULES  189
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  335
+#define YYNSTATES  336
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   308
+#define YYMAXUTOK   309
 
 #define YYTRANSLATE(YYX)                                               \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -612,16 +614,16 @@ static const yytype_uint8 yytranslate[] =
        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    63,     2,     2,    66,    62,     2,     2,
-      67,    68,    60,    58,    55,    59,     2,    61,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    54,    74,
-      56,     2,    57,    53,    69,     2,     2,     2,     2,     2,
+       2,     2,     2,    64,     2,     2,    67,    63,     2,     2,
+      68,    69,    61,    59,    56,    60,     2,    62,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    55,    75,
+      57,     2,    58,    54,    70,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    70,     2,    71,    65,     2,     2,     2,     2,     2,
+       2,    71,     2,    72,    66,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,     2,     2,    72,     2,    73,     2,     2,     2,     2,
+       2,     2,     2,    73,     2,    74,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
@@ -639,7 +641,7 @@ static const yytype_uint8 yytranslate[] =
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
-      45,    46,    47,    48,    49,    50,    51,    52,    64
+      45,    46,    47,    48,    49,    50,    51,    52,    53,    65
 };
 
 #if YYDEBUG
@@ -659,77 +661,77 @@ static const yytype_uint16 yyprhs[] =
      299,   301,   302,   305,   306,   308,   310,   314,   316,   319,
      323,   324,   326,   327,   329,   331,   335,   337,   340,   344,
      348,   352,   356,   360,   364,   368,   372,   378,   380,   382,
-     384,   387,   389,   391,   393,   395,   397,   399,   402,   404,
-     408,   412,   416,   420,   424,   428,   432,   435,   438,   444,
-     449,   453,   457,   461,   465,   469,   473,   475,   478,   482,
-     487,   492,   494,   496,   498,   501,   504,   506,   508,   511,
-     514,   516,   519,   524,   525,   527,   528,   531,   533,   536,
-     538,   542,   544,   547,   550,   552,   555,   557,   561,   563,
-     565,   566,   569,   572,   574,   575,   577,   579,   581
+     384,   386,   389,   391,   393,   395,   397,   399,   401,   404,
+     406,   410,   414,   418,   422,   426,   430,   434,   437,   440,
+     446,   451,   455,   459,   463,   467,   471,   475,   477,   480,
+     484,   489,   494,   496,   498,   500,   503,   506,   508,   510,
+     513,   516,   518,   521,   526,   527,   529,   530,   533,   535,
+     538,   540,   544,   546,   549,   552,   554,   557,   559,   563,
+     565,   567,   568,   571,   574,   576,   577,   579,   581,   583
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
 static const yytype_int16 yyrhs[] =
 {
-      76,     0,    -1,    -1,    76,    77,    -1,    76,   105,    -1,
-      76,    47,    -1,    76,     1,    -1,    80,    81,    -1,    80,
-      89,    -1,    84,    81,    -1,    69,    48,    78,    89,    -1,
-      69,    50,    79,    89,    -1,     6,    -1,     6,     1,    -1,
+      77,     0,    -1,    -1,    77,    78,    -1,    77,   106,    -1,
+      77,    48,    -1,    77,     1,    -1,    81,    82,    -1,    81,
+      90,    -1,    85,    82,    -1,    70,    49,    79,    90,    -1,
+      70,    51,    80,    90,    -1,     6,    -1,     6,     1,    -1,
        1,    -1,     6,    -1,     6,     1,    -1,     1,    -1,    -1,
-     113,    -1,   113,    55,   106,   113,    -1,    17,    -1,    18,
-      -1,    36,    -1,    37,    -1,   133,    88,   134,   136,   106,
-      -1,     4,    -1,     3,    -1,    83,    -1,    69,    49,    -1,
-      45,    -1,    46,    -1,    35,    82,    67,   108,   135,   106,
-      -1,    -1,    87,    86,     5,    -1,    61,    -1,    52,    -1,
-      -1,    88,    90,    -1,    88,     1,    -1,   105,    -1,   137,
-     106,    -1,   137,   106,    -1,   133,    88,   134,    -1,   104,
-      -1,    23,    67,   113,   135,   106,   133,    97,   106,   134,
-      -1,    26,    67,   113,   135,   106,    90,    -1,    27,   106,
-      90,    26,    67,   113,   135,   106,    -1,    28,    67,     4,
-      40,   130,   135,   106,    90,    -1,    28,    67,    96,   137,
-     106,   113,   137,   106,    96,   135,   106,    90,    -1,    28,
-      67,    96,   137,   106,   137,   106,    96,   135,   106,    90,
-      -1,    91,    -1,    29,    89,    -1,    30,    89,    -1,    33,
-      89,    -1,    39,    89,    -1,    34,   110,    89,    -1,    -1,
-      21,    92,   110,    89,    -1,    93,    89,    -1,    -1,   100,
-      94,   101,   102,    -1,    -1,    22,     4,    95,   124,    -1,
-      22,    67,     4,    68,    -1,   113,    -1,    -1,    93,    -1,
-      -1,    97,    98,    -1,    97,     1,    -1,    24,    99,   138,
-     106,    88,    -1,    25,   138,   106,    88,    -1,     7,    -1,
-      59,     7,    -1,    58,     7,    -1,     8,    -1,    85,    -1,
-      31,    -1,    32,    -1,   111,    -1,    67,   112,   135,    -1,
-      -1,    -1,    10,   103,   117,    -1,    19,    67,   113,   135,
-     106,    90,    -1,    19,    67,   113,   135,   106,    90,    20,
-     106,    90,    -1,    51,    -1,   105,    51,    -1,    -1,   105,
-      -1,    -1,    56,   118,    -1,    -1,   109,    -1,     4,    -1,
-     109,   139,     4,    -1,     1,    -1,   109,     1,    -1,   109,
-     139,     1,    -1,    -1,   113,    -1,    -1,   112,    -1,   113,
-      -1,   112,   139,   113,    -1,     1,    -1,   112,     1,    -1,
-     112,     1,   113,    -1,   112,   139,     1,    -1,   131,   114,
-     113,    -1,   113,    41,   113,    -1,   113,    42,   113,    -1,
-     113,    14,   113,    -1,   113,    40,   130,    -1,   113,   116,
-     113,    -1,   113,    53,   113,    54,   113,    -1,   117,    -1,
-      13,    -1,    12,    -1,    52,    13,    -1,     9,    -1,    56,
-      -1,   115,    -1,    57,    -1,   118,    -1,   119,    -1,   117,
-     118,    -1,   120,    -1,   118,    65,   118,    -1,   118,    60,
-     118,    -1,   118,    61,   118,    -1,   118,    62,   118,    -1,
-     118,    58,   118,    -1,   118,    59,   118,    -1,    38,   123,
-     107,    -1,   131,    43,    -1,   131,    44,    -1,    67,   112,
-     135,    40,   130,    -1,   117,    11,    38,   123,    -1,   119,
-      65,   118,    -1,   119,    60,   118,    -1,   119,    61,   118,
-      -1,   119,    62,   118,    -1,   119,    58,   118,    -1,   119,
-      59,   118,    -1,    85,    -1,    63,   118,    -1,    67,   113,
-     135,    -1,    45,    67,   111,   135,    -1,    46,    67,   111,
-     135,    -1,    46,    -1,   121,    -1,   131,    -1,    43,   131,
-      -1,    44,   131,    -1,     7,    -1,     8,    -1,    59,   118,
-      -1,    58,   118,    -1,   122,    -1,    69,   122,    -1,     3,
-      67,   111,   135,    -1,    -1,   131,    -1,    -1,   125,    16,
-      -1,   126,    -1,   125,   126,    -1,   127,    -1,    70,   112,
-      71,    -1,   127,    -1,   128,   127,    -1,   128,    16,    -1,
-       4,    -1,     4,   129,    -1,   130,    -1,    66,   120,   132,
-      -1,    43,    -1,    44,    -1,    -1,    72,   106,    -1,    73,
-     106,    -1,    68,    -1,    -1,   137,    -1,    74,    -1,    54,
-      -1,    55,   106,    -1
+     114,    -1,   114,    56,   107,   114,    -1,    18,    -1,    19,
+      -1,    37,    -1,    38,    -1,   134,    89,   135,   137,   107,
+      -1,     4,    -1,     3,    -1,    84,    -1,    70,    50,    -1,
+      46,    -1,    47,    -1,    36,    83,    68,   109,   136,   107,
+      -1,    -1,    88,    87,     5,    -1,    62,    -1,    53,    -1,
+      -1,    89,    91,    -1,    89,     1,    -1,   106,    -1,   138,
+     107,    -1,   138,   107,    -1,   134,    89,   135,    -1,   105,
+      -1,    24,    68,   114,   136,   107,   134,    98,   107,   135,
+      -1,    27,    68,   114,   136,   107,    91,    -1,    28,   107,
+      91,    27,    68,   114,   136,   107,    -1,    29,    68,     4,
+      41,   131,   136,   107,    91,    -1,    29,    68,    97,   138,
+     107,   114,   138,   107,    97,   136,   107,    91,    -1,    29,
+      68,    97,   138,   107,   138,   107,    97,   136,   107,    91,
+      -1,    92,    -1,    30,    90,    -1,    31,    90,    -1,    34,
+      90,    -1,    40,    90,    -1,    35,   111,    90,    -1,    -1,
+      22,    93,   111,    90,    -1,    94,    90,    -1,    -1,   101,
+      95,   102,   103,    -1,    -1,    23,     4,    96,   125,    -1,
+      23,    68,     4,    69,    -1,   114,    -1,    -1,    94,    -1,
+      -1,    98,    99,    -1,    98,     1,    -1,    25,   100,   139,
+     107,    89,    -1,    26,   139,   107,    89,    -1,     7,    -1,
+      60,     7,    -1,    59,     7,    -1,     8,    -1,    86,    -1,
+      32,    -1,    33,    -1,   112,    -1,    68,   113,   136,    -1,
+      -1,    -1,    10,   104,   118,    -1,    20,    68,   114,   136,
+     107,    91,    -1,    20,    68,   114,   136,   107,    91,    21,
+     107,    91,    -1,    52,    -1,   106,    52,    -1,    -1,   106,
+      -1,    -1,    57,   119,    -1,    -1,   110,    -1,     4,    -1,
+     110,   140,     4,    -1,     1,    -1,   110,     1,    -1,   110,
+     140,     1,    -1,    -1,   114,    -1,    -1,   113,    -1,   114,
+      -1,   113,   140,   114,    -1,     1,    -1,   113,     1,    -1,
+     113,     1,   114,    -1,   113,   140,     1,    -1,   132,   115,
+     114,    -1,   114,    42,   114,    -1,   114,    43,   114,    -1,
+     114,    15,   114,    -1,   114,    41,   131,    -1,   114,   117,
+     114,    -1,   114,    54,   114,    55,   114,    -1,   118,    -1,
+      13,    -1,    12,    -1,    14,    -1,    53,    13,    -1,     9,
+      -1,    57,    -1,   116,    -1,    58,    -1,   119,    -1,   120,
+      -1,   118,   119,    -1,   121,    -1,   119,    66,   119,    -1,
+     119,    61,   119,    -1,   119,    62,   119,    -1,   119,    63,
+     119,    -1,   119,    59,   119,    -1,   119,    60,   119,    -1,
+      39,   124,   108,    -1,   132,    44,    -1,   132,    45,    -1,
+      68,   113,   136,    41,   131,    -1,   118,    11,    39,   124,
+      -1,   120,    66,   119,    -1,   120,    61,   119,    -1,   120,
+      62,   119,    -1,   120,    63,   119,    -1,   120,    59,   119,
+      -1,   120,    60,   119,    -1,    86,    -1,    64,   119,    -1,
+      68,   114,   136,    -1,    46,    68,   112,   136,    -1,    47,
+      68,   112,   136,    -1,    47,    -1,   122,    -1,   132,    -1,
+      44,   132,    -1,    45,   132,    -1,     7,    -1,     8,    -1,
+      60,   119,    -1,    59,   119,    -1,   123,    -1,    70,   123,
+      -1,     3,    68,   112,   136,    -1,    -1,   132,    -1,    -1,
+     126,    17,    -1,   127,    -1,   126,   127,    -1,   128,    -1,
+      71,   113,    72,    -1,   128,    -1,   129,   128,    -1,   129,
+      17,    -1,     4,    -1,     4,   130,    -1,   131,    -1,    67,
+     121,   133,    -1,    44,    -1,    45,    -1,    -1,    73,   107,
+      -1,    74,   107,    -1,    69,    -1,    -1,   138,    -1,    75,
+      -1,    55,    -1,    56,   107,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -739,21 +741,21 @@ static const yytype_uint16 yyrline[] =
      247,   252,   260,   268,   270,   275,   283,   285,   291,   292,
      294,   320,   331,   342,   348,   357,   367,   369,   371,   377,
      382,   383,   387,   406,   405,   439,   441,   446,   447,   460,
-     465,   466,   470,   472,   474,   481,   571,   613,   655,   771,
-     778,   785,   795,   804,   813,   822,   833,   849,   848,   872,
-     884,   884,   982,   982,  1015,  1045,  1051,  1052,  1058,  1059,
-    1066,  1071,  1083,  1097,  1099,  1107,  1112,  1114,  1122,  1124,
-    1133,  1134,  1142,  1147,  1147,  1158,  1162,  1170,  1171,  1174,
-    1176,  1181,  1182,  1191,  1192,  1197,  1202,  1208,  1210,  1212,
-    1219,  1220,  1226,  1227,  1232,  1234,  1239,  1241,  1249,  1254,
-    1263,  1270,  1272,  1274,  1290,  1300,  1307,  1309,  1314,  1316,
-    1318,  1326,  1328,  1333,  1335,  1340,  1342,  1344,  1394,  1396,
-    1398,  1400,  1402,  1404,  1406,  1408,  1431,  1436,  1441,  1466,
-    1472,  1474,  1476,  1478,  1480,  1482,  1487,  1491,  1523,  1525,
-    1531,  1537,  1550,  1551,  1552,  1557,  1562,  1566,  1570,  1585,
-    1598,  1603,  1639,  1657,  1658,  1664,  1665,  1670,  1672,  1679,
-    1696,  1713,  1715,  1722,  1727,  1735,  1745,  1757,  1766,  1770,
-    1774,  1778,  1782,  1786,  1789,  1791,  1795,  1799,  1803
+     465,   466,   470,   472,   474,   481,   571,   613,   655,   768,
+     775,   782,   792,   801,   810,   819,   830,   846,   845,   869,
+     881,   881,   979,   979,  1012,  1042,  1048,  1049,  1055,  1056,
+    1063,  1068,  1080,  1094,  1096,  1104,  1109,  1111,  1119,  1121,
+    1130,  1131,  1139,  1144,  1144,  1155,  1159,  1167,  1168,  1171,
+    1173,  1178,  1179,  1188,  1189,  1194,  1199,  1205,  1207,  1209,
+    1216,  1217,  1223,  1224,  1229,  1231,  1236,  1238,  1246,  1251,
+    1260,  1267,  1269,  1271,  1287,  1297,  1304,  1306,  1311,  1313,
+    1315,  1317,  1325,  1327,  1332,  1334,  1339,  1341,  1343,  1393,
+    1395,  1397,  1399,  1401,  1403,  1405,  1407,  1430,  1435,  1440,
+    1465,  1471,  1473,  1475,  1477,  1479,  1481,  1486,  1490,  1522,
+    1524,  1530,  1536,  1549,  1550,  1551,  1556,  1561,  1565,  1569,
+    1584,  1597,  1602,  1638,  1656,  1657,  1663,  1664,  1669,  1671,
+    1678,  1695,  1712,  1714,  1721,  1726,  1734,  1744,  1756,  1765,
+    1769,  1773,  1777,  1781,  1785,  1788,  1790,  1794,  1798,  1802
 };
 #endif
 
@@ -764,29 +766,30 @@ static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "FUNC_CALL", "NAME", "REGEXP",
   "FILENAME", "YNUMBER", "YSTRING", "RELOP", "IO_OUT", "IO_IN", "ASSIGNOP",
-  "ASSIGN", "MATCHOP", "CONCAT_OP", "SUBSCRIPT", "LEX_BEGIN", "LEX_END",
-  "LEX_IF", "LEX_ELSE", "LEX_RETURN", "LEX_DELETE", "LEX_SWITCH",
-  "LEX_CASE", "LEX_DEFAULT", "LEX_WHILE", "LEX_DO", "LEX_FOR", "LEX_BREAK",
-  "LEX_CONTINUE", "LEX_PRINT", "LEX_PRINTF", "LEX_NEXT", "LEX_EXIT",
-  "LEX_FUNCTION", "LEX_BEGINFILE", "LEX_ENDFILE", "LEX_GETLINE",
-  "LEX_NEXTFILE", "LEX_IN", "LEX_AND", "LEX_OR", "INCREMENT", "DECREMENT",
-  "LEX_BUILTIN", "LEX_LENGTH", "LEX_EOF", "LEX_INCLUDE", "LEX_EVAL",
-  "LEX_LOAD", "NEWLINE", "SLASH_BEFORE_EQUAL", "'?'", "':'", "','", "'<'",
-  "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "UNARY", "'^'", "'$'",
-  "'('", "')'", "'@'", "'['", "']'", "'{'", "'}'", "';'", "$accept",
-  "program", "rule", "source", "library", "pattern", "action", "func_name",
-  "lex_builtin", "function_prologue", "regexp", "address@hidden", "a_slash",
-  "statements", "statement_term", "statement", "non_compound_stmt", 
"address@hidden",
-  "simple_stmt", "address@hidden", "address@hidden", "opt_simple_stmt", 
"case_statements",
-  "case_statement", "case_value", "print", "print_expression_list",
-  "output_redir", "address@hidden", "if_statement", "nls", "opt_nls", 
"input_redir",
-  "opt_param_list", "param_list", "opt_exp", "opt_expression_list",
-  "expression_list", "exp", "assign_operator", "relop_or_less", "a_relop",
-  "common_exp", "simp_exp", "simp_exp_nc", "non_post_simp_exp",
-  "func_call", "direct_func_call", "opt_variable", "delete_subscript_list",
-  "delete_subscript", "delete_exp_list", "bracketed_exp_list", "subscript",
-  "subscript_list", "simple_variable", "variable", "opt_incdec", "l_brace",
-  "r_brace", "r_paren", "opt_semi", "semi", "colon", "comma", YY_NULL
+  "ASSIGN", "ASSIGN_CONST", "MATCHOP", "CONCAT_OP", "SUBSCRIPT",
+  "LEX_BEGIN", "LEX_END", "LEX_IF", "LEX_ELSE", "LEX_RETURN", "LEX_DELETE",
+  "LEX_SWITCH", "LEX_CASE", "LEX_DEFAULT", "LEX_WHILE", "LEX_DO",
+  "LEX_FOR", "LEX_BREAK", "LEX_CONTINUE", "LEX_PRINT", "LEX_PRINTF",
+  "LEX_NEXT", "LEX_EXIT", "LEX_FUNCTION", "LEX_BEGINFILE", "LEX_ENDFILE",
+  "LEX_GETLINE", "LEX_NEXTFILE", "LEX_IN", "LEX_AND", "LEX_OR",
+  "INCREMENT", "DECREMENT", "LEX_BUILTIN", "LEX_LENGTH", "LEX_EOF",
+  "LEX_INCLUDE", "LEX_EVAL", "LEX_LOAD", "NEWLINE", "SLASH_BEFORE_EQUAL",
+  "'?'", "':'", "','", "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'",
+  "'!'", "UNARY", "'^'", "'$'", "'('", "')'", "'@'", "'['", "']'", "'{'",
+  "'}'", "';'", "$accept", "program", "rule", "source", "library",
+  "pattern", "action", "func_name", "lex_builtin", "function_prologue",
+  "regexp", "address@hidden", "a_slash", "statements", "statement_term", 
"statement",
+  "non_compound_stmt", "address@hidden", "simple_stmt", "address@hidden", 
"address@hidden",
+  "opt_simple_stmt", "case_statements", "case_statement", "case_value",
+  "print", "print_expression_list", "output_redir", "address@hidden", 
"if_statement",
+  "nls", "opt_nls", "input_redir", "opt_param_list", "param_list",
+  "opt_exp", "opt_expression_list", "expression_list", "exp",
+  "assign_operator", "relop_or_less", "a_relop", "common_exp", "simp_exp",
+  "simp_exp_nc", "non_post_simp_exp", "func_call", "direct_func_call",
+  "opt_variable", "delete_subscript_list", "delete_subscript",
+  "delete_exp_list", "bracketed_exp_list", "subscript", "subscript_list",
+  "simple_variable", "variable", "opt_incdec", "l_brace", "r_brace",
+  "r_paren", "opt_semi", "semi", "colon", "comma", YY_NULL
 };
 #endif
 
@@ -800,34 +803,34 @@ static const yytype_uint16 yytoknum[] =
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
      295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
-     305,   306,   307,    63,    58,    44,    60,    62,    43,    45,
-      42,    47,    37,    33,   308,    94,    36,    40,    41,    64,
-      91,    93,   123,   125,    59
+     305,   306,   307,   308,    63,    58,    44,    60,    62,    43,
+      45,    42,    47,    37,    33,   309,    94,    36,    40,    41,
+      64,    91,    93,   123,   125,    59
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    75,    76,    76,    76,    76,    76,    77,    77,    77,
-      77,    77,    78,    78,    78,    79,    79,    79,    80,    80,
-      80,    80,    80,    80,    80,    81,    82,    82,    82,    82,
-      83,    83,    84,    86,    85,    87,    87,    88,    88,    88,
-      89,    89,    90,    90,    90,    90,    90,    90,    90,    90,
-      90,    90,    91,    91,    91,    91,    91,    92,    91,    91,
-      94,    93,    95,    93,    93,    93,    96,    96,    97,    97,
-      97,    98,    98,    99,    99,    99,    99,    99,   100,   100,
-     101,   101,   102,   103,   102,   104,   104,   105,   105,   106,
-     106,   107,   107,   108,   108,   109,   109,   109,   109,   109,
-     110,   110,   111,   111,   112,   112,   112,   112,   112,   112,
-     113,   113,   113,   113,   113,   113,   113,   113,   114,   114,
-     114,   115,   115,   116,   116,   117,   117,   117,   118,   118,
-     118,   118,   118,   118,   118,   118,   118,   118,   118,   119,
-     119,   119,   119,   119,   119,   119,   120,   120,   120,   120,
-     120,   120,   120,   120,   120,   120,   120,   120,   120,   120,
-     121,   121,   122,   123,   123,   124,   124,   125,   125,   126,
-     127,   128,   128,   129,   130,   130,   131,   131,   132,   132,
-     132,   133,   134,   135,   136,   136,   137,   138,   139
+       0,    76,    77,    77,    77,    77,    77,    78,    78,    78,
+      78,    78,    79,    79,    79,    80,    80,    80,    81,    81,
+      81,    81,    81,    81,    81,    82,    83,    83,    83,    83,
+      84,    84,    85,    87,    86,    88,    88,    89,    89,    89,
+      90,    90,    91,    91,    91,    91,    91,    91,    91,    91,
+      91,    91,    92,    92,    92,    92,    92,    93,    92,    92,
+      95,    94,    96,    94,    94,    94,    97,    97,    98,    98,
+      98,    99,    99,   100,   100,   100,   100,   100,   101,   101,
+     102,   102,   103,   104,   103,   105,   105,   106,   106,   107,
+     107,   108,   108,   109,   109,   110,   110,   110,   110,   110,
+     111,   111,   112,   112,   113,   113,   113,   113,   113,   113,
+     114,   114,   114,   114,   114,   114,   114,   114,   115,   115,
+     115,   115,   116,   116,   117,   117,   118,   118,   118,   119,
+     119,   119,   119,   119,   119,   119,   119,   119,   119,   119,
+     120,   120,   120,   120,   120,   120,   120,   121,   121,   121,
+     121,   121,   121,   121,   121,   121,   121,   121,   121,   121,
+     121,   122,   122,   123,   124,   124,   125,   125,   126,   126,
+     127,   128,   129,   129,   130,   131,   131,   132,   132,   133,
+     133,   133,   134,   135,   136,   137,   137,   138,   139,   140
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -845,13 +848,13 @@ static const yytype_uint8 yyr2[] =
        1,     0,     2,     0,     1,     1,     3,     1,     2,     3,
        0,     1,     0,     1,     1,     3,     1,     2,     3,     3,
        3,     3,     3,     3,     3,     3,     5,     1,     1,     1,
-       2,     1,     1,     1,     1,     1,     1,     2,     1,     3,
-       3,     3,     3,     3,     3,     3,     2,     2,     5,     4,
-       3,     3,     3,     3,     3,     3,     1,     2,     3,     4,
-       4,     1,     1,     1,     2,     2,     1,     1,     2,     2,
-       1,     2,     4,     0,     1,     0,     2,     1,     2,     1,
-       3,     1,     2,     2,     1,     2,     1,     3,     1,     1,
-       0,     2,     2,     1,     0,     1,     1,     1,     2
+       1,     2,     1,     1,     1,     1,     1,     1,     2,     1,
+       3,     3,     3,     3,     3,     3,     3,     2,     2,     5,
+       4,     3,     3,     3,     3,     3,     3,     1,     2,     3,
+       4,     4,     1,     1,     1,     2,     2,     1,     1,     2,
+       2,     1,     2,     4,     0,     1,     0,     2,     1,     2,
+       1,     3,     1,     2,     2,     1,     2,     1,     3,     1,
+       1,     0,     2,     2,     1,     0,     1,     1,     1,     2
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -859,105 +862,105 @@ static const yytype_uint8 yyr2[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,     6,     0,   174,   156,   157,    21,    22,
-       0,    23,    24,   163,     0,     0,     0,   151,     5,    87,
+       2,     0,     1,     6,     0,   175,   157,   158,    21,    22,
+       0,    23,    24,   164,     0,     0,     0,   152,     5,    87,
       36,     0,     0,    35,     0,     0,     0,     0,     3,     0,
-       0,   146,    33,     4,    19,   117,   125,   126,   128,   152,
-     160,   176,   153,     0,     0,   171,     0,   175,    27,    26,
-      30,    31,     0,     0,    28,    91,   164,   154,   155,     0,
-       0,     0,   159,   153,   158,   147,     0,   180,   153,   106,
-       0,   104,     0,     0,   161,    89,   186,     7,     8,    40,
-      37,    89,     9,     0,    88,   121,     0,     0,     0,     0,
-       0,    89,   122,   124,   123,     0,     0,   127,     0,     0,
+       0,   147,    33,     4,    19,   117,   126,   127,   129,   153,
+     161,   177,   154,     0,     0,   172,     0,   176,    27,    26,
+      30,    31,     0,     0,    28,    91,   165,   155,   156,     0,
+       0,     0,   160,   154,   159,   148,     0,   181,   154,   106,
+       0,   104,     0,     0,   162,    89,   187,     7,     8,    40,
+      37,    89,     9,     0,    88,   122,     0,     0,     0,     0,
+       0,    89,   123,   125,   124,     0,     0,   128,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     119,   118,   136,   137,     0,     0,     0,     0,   104,     0,
-     173,   172,    29,     0,     0,   135,     0,     0,     0,   178,
-     179,   177,   107,    89,   183,     0,     0,   148,    14,     0,
-       0,    17,     0,     0,    90,   181,     0,    41,    34,   113,
-     114,   111,   112,     0,     0,   115,   163,   133,   134,   130,
-     131,   132,   129,   144,   145,   141,   142,   143,   140,   120,
-     110,   162,   170,    97,    95,     0,     0,    92,   149,   150,
-     108,   188,     0,   109,   105,    13,    10,    16,    11,    39,
-       0,    57,     0,     0,     0,    89,     0,     0,     0,    78,
-      79,     0,   100,     0,    89,    38,    51,     0,    60,    44,
-      65,    37,   184,    89,     0,    20,   139,    89,    98,     0,
-     138,     0,   100,    62,     0,     0,     0,     0,    66,    52,
-      53,    54,     0,   101,    55,   182,    59,     0,     0,    89,
-     185,    42,   116,    32,    99,    96,     0,     0,   165,     0,
-       0,     0,     0,   174,    67,     0,    56,     0,    82,    80,
-      43,    25,    89,    58,    63,     0,   167,   169,    64,    89,
-      89,     0,     0,    89,     0,    83,    61,     0,   166,   168,
-       0,     0,     0,     0,     0,    81,     0,    85,    68,    46,
-       0,    89,     0,    89,    84,    89,     0,    89,     0,    89,
-      66,     0,    70,     0,     0,    69,     0,    47,    48,    66,
-       0,    86,    73,    76,     0,     0,    77,     0,   187,    89,
-      45,     0,    89,    75,    74,    89,    37,    89,     0,    37,
-       0,     0,    50,     0,    49
+     119,   118,   120,   137,   138,     0,     0,     0,     0,   104,
+       0,   174,   173,    29,     0,     0,   136,     0,     0,     0,
+     179,   180,   178,   107,    89,   184,     0,     0,   149,    14,
+       0,     0,    17,     0,     0,    90,   182,     0,    41,    34,
+     113,   114,   111,   112,     0,     0,   115,   164,   134,   135,
+     131,   132,   133,   130,   145,   146,   142,   143,   144,   141,
+     121,   110,   163,   171,    97,    95,     0,     0,    92,   150,
+     151,   108,   189,     0,   109,   105,    13,    10,    16,    11,
+      39,     0,    57,     0,     0,     0,    89,     0,     0,     0,
+      78,    79,     0,   100,     0,    89,    38,    51,     0,    60,
+      44,    65,    37,   185,    89,     0,    20,   140,    89,    98,
+       0,   139,     0,   100,    62,     0,     0,     0,     0,    66,
+      52,    53,    54,     0,   101,    55,   183,    59,     0,     0,
+      89,   186,    42,   116,    32,    99,    96,     0,     0,   166,
+       0,     0,     0,     0,   175,    67,     0,    56,     0,    82,
+      80,    43,    25,    89,    58,    63,     0,   168,   170,    64,
+      89,    89,     0,     0,    89,     0,    83,    61,     0,   167,
+     169,     0,     0,     0,     0,     0,    81,     0,    85,    68,
+      46,     0,    89,     0,    89,    84,    89,     0,    89,     0,
+      89,    66,     0,    70,     0,     0,    69,     0,    47,    48,
+      66,     0,    86,    73,    76,     0,     0,    77,     0,   188,
+      89,    45,     0,    89,    75,    74,    89,    37,    89,     0,
+      37,     0,     0,    50,     0,    49
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,    28,   140,   143,    29,    77,    53,    54,    30,
-      31,    83,    32,   146,    78,   205,   206,   222,   207,   237,
-     248,   255,   296,   305,   317,   208,   258,   276,   286,   209,
-     144,   145,   125,   175,   176,   232,   116,   117,   210,   115,
-      94,    95,    35,    36,    37,    38,    39,    40,    55,   264,
-     265,   266,    45,    46,    47,    41,    42,   131,   211,   212,
-     137,   239,   213,   319,   136
+      -1,     1,    28,   141,   144,    29,    77,    53,    54,    30,
+      31,    83,    32,   147,    78,   206,   207,   223,   208,   238,
+     249,   256,   297,   306,   318,   209,   259,   277,   287,   210,
+     145,   146,   126,   176,   177,   233,   117,   118,   211,   116,
+      94,    95,    35,    36,    37,    38,    39,    40,    55,   265,
+     266,   267,    45,    46,    47,    41,    42,   132,   212,   213,
+     138,   240,   214,   320,   137
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -273
+#define YYPACT_NINF -267
 static const yytype_int16 yypact[] =
 {
-    -273,   376,  -273,  -273,   -27,   -21,  -273,  -273,  -273,  -273,
-     157,  -273,  -273,    11,    11,    11,    -5,    -3,  -273,  -273,
-    -273,  1019,  1019,  -273,  1019,  1065,   821,   116,  -273,   -20,
-       1,  -273,  -273,    35,   758,   992,   252,   296,  -273,  -273,
-    -273,  -273,   233,   789,   821,  -273,     2,  -273,  -273,  -273,
-    -273,  -273,    63,    54,  -273,    69,  -273,  -273,  -273,   789,
-     789,   127,    87,   115,    87,    87,  1019,   131,  -273,  -273,
-      55,   295,    40,    47,  -273,    83,  -273,  -273,  -273,    35,
-    -273,    83,  -273,   151,  -273,  -273,  1019,   132,  1019,  1019,
-    1019,    83,  -273,  -273,  -273,  1019,   124,   252,  1019,  1019,
-    1019,  1019,  1019,  1019,  1019,  1019,  1019,  1019,  1019,  1019,
-    -273,  -273,  -273,  -273,   152,  1019,   100,    16,  1034,    37,
-    -273,  -273,  -273,    43,  1019,  -273,   100,   100,   295,  -273,
-    -273,  -273,  1019,    83,  -273,   137,   867,  -273,  -273,    75,
-     -19,  -273,    77,   -19,    35,  -273,   596,  -273,  -273,   123,
-    -273,   141,   175,  1098,  1019,   161,    11,   -26,   -26,    87,
-      87,    87,    87,   -26,   -26,    87,    87,    87,    87,  -273,
-    1034,  -273,  -273,  -273,  -273,   100,    65,   252,  -273,  -273,
-    1034,  -273,   132,  -273,  1034,  -273,  -273,  -273,  -273,  -273,
-     104,  -273,    26,   118,   119,    83,   121,   -19,   -19,  -273,
-    -273,   -19,  1019,   -19,    83,  -273,  -273,   -19,  -273,  -273,
-    1034,  -273,   117,    83,  1019,  1034,  -273,    83,  -273,   112,
-    -273,  1019,  1019,  -273,   188,  1019,  1019,   710,   900,  -273,
-    -273,  -273,   -19,  1034,  -273,  -273,  -273,   642,   596,    83,
-    -273,  -273,  1034,  -273,  -273,  -273,   295,   -19,   -21,   126,
-     295,   295,   169,   -13,  -273,   117,  -273,   821,   186,  -273,
-    -273,  -273,    83,  -273,  -273,    13,  -273,  -273,  -273,    83,
-      83,   139,   132,    83,    55,  -273,  -273,   710,  -273,  -273,
-       1,   710,  1019,   100,   743,   137,  1019,   192,  -273,  -273,
-     295,    83,   286,    83,   992,    83,    44,    83,   710,    83,
-     946,   710,  -273,   247,   154,  -273,   156,  -273,  -273,   946,
-     100,  -273,  -273,  -273,   226,   228,  -273,   154,  -273,    83,
-    -273,   100,    83,  -273,  -273,    83,  -273,    83,   710,  -273,
-     448,   710,  -273,   522,  -273
+    -267,   372,  -267,  -267,   -30,   -22,  -267,  -267,  -267,  -267,
+      88,  -267,  -267,    26,    26,    26,    -4,     0,  -267,  -267,
+    -267,   977,   977,  -267,   977,  1024,   795,   156,  -267,   -20,
+      -7,  -267,  -267,    19,  1039,   950,   288,   367,  -267,  -267,
+    -267,  -267,   293,   748,   795,  -267,    11,  -267,  -267,  -267,
+    -267,  -267,    20,    10,  -267,    27,  -267,  -267,  -267,   748,
+     748,   119,    58,    -8,    58,    58,   977,    73,  -267,  -267,
+     130,   344,    33,    45,  -267,    75,  -267,  -267,  -267,    19,
+    -267,    75,  -267,   124,  -267,  -267,   977,   126,   977,   977,
+     977,    75,  -267,  -267,  -267,   977,    94,   288,   977,   977,
+     977,   977,   977,   977,   977,   977,   977,   977,   977,   977,
+    -267,  -267,  -267,  -267,  -267,   136,   977,    87,   194,  1064,
+      23,  -267,  -267,  -267,    44,   977,  -267,    87,    87,   344,
+    -267,  -267,  -267,   977,    75,  -267,   116,   822,  -267,  -267,
+       5,   -21,  -267,    15,   -21,    19,  -267,   595,  -267,  -267,
+      18,  -267,   271,   111,  1057,   977,   105,    26,   128,   128,
+      58,    58,    58,    58,   128,   128,    58,    58,    58,    58,
+    -267,  1064,  -267,  -267,  -267,  -267,    87,   150,   288,  -267,
+    -267,  1064,  -267,   126,  -267,  1064,  -267,  -267,  -267,  -267,
+    -267,   103,  -267,    13,   107,   110,    75,   112,   -21,   -21,
+    -267,  -267,   -21,   977,   -21,    75,  -267,  -267,   -21,  -267,
+    -267,  1064,  -267,   118,    75,   977,  1064,  -267,    75,  -267,
+      46,  -267,   977,   977,  -267,   205,   977,   977,   668,   870,
+    -267,  -267,  -267,   -21,  1064,  -267,  -267,  -267,   251,   595,
+      75,  -267,  -267,  1064,  -267,  -267,  -267,   344,   -21,   -22,
+     129,   344,   344,   184,   -15,  -267,   118,  -267,   795,   203,
+    -267,  -267,  -267,    75,  -267,  -267,    12,  -267,  -267,  -267,
+      75,    75,   149,   126,    75,   130,  -267,  -267,   668,  -267,
+    -267,    -7,   668,   977,    87,   715,   116,   977,   197,  -267,
+    -267,   344,    75,   992,    75,   950,    75,   250,    75,   668,
+      75,   903,   668,  -267,   263,   169,  -267,   154,  -267,  -267,
+     903,    87,  -267,  -267,  -267,   223,   225,  -267,   169,  -267,
+      75,  -267,    87,    75,  -267,  -267,    75,  -267,    75,   668,
+    -267,   445,   668,  -267,   520,  -267
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -273,  -273,  -273,  -273,  -273,  -273,   208,  -273,  -273,  -273,
-     -64,  -273,  -273,  -202,    71,   -58,  -273,  -273,  -218,  -273,
-    -273,  -272,  -273,  -273,  -273,  -273,  -273,  -273,  -273,  -273,
-      50,    76,  -273,  -273,  -273,    19,   -54,   -23,    -1,  -273,
-    -273,  -273,   -44,    39,  -273,   224,  -273,   -11,    94,  -273,
-    -273,    -7,   -38,  -273,  -273,   -73,    -2,  -273,   -28,  -231,
-     -46,  -273,   -25,   -57,    85
+    -267,  -267,  -267,  -267,  -267,  -267,   204,  -267,  -267,  -267,
+     -71,  -267,  -267,  -202,   -32,  -117,  -267,  -267,  -224,  -267,
+    -267,  -266,  -267,  -267,  -267,  -267,  -267,  -267,  -267,  -267,
+      40,    69,  -267,  -267,  -267,    17,   -51,   -23,    -1,  -267,
+    -267,  -267,   -46,    39,  -267,   218,  -267,    -9,    90,  -267,
+    -267,   -17,   -39,  -267,  -267,   -73,    -2,  -267,   -28,  -199,
+     -55,  -267,   -25,   -56,    68
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
@@ -966,288 +969,282 @@ static const yytype_int16 yypgoto[] =
 #define YYTABLE_NINF -104
 static const yytype_int16 yytable[] =
 {
-      34,    80,    80,    70,    81,   126,   127,   260,   121,   238,
-     254,    56,    57,    58,   150,     5,    74,   132,   120,    63,
-      63,   119,    63,    68,   135,    71,  -103,   272,   310,   278,
-     223,    19,    19,    63,   100,   101,   102,   321,   132,   103,
-      43,   138,   118,   118,   173,   302,   139,   174,   141,    44,
-      74,    33,    75,   142,    76,    76,   132,    44,   118,   118,
-      62,    64,    59,    65,    60,   128,   218,  -103,   303,   304,
-     171,   133,    44,    75,    97,   320,   185,    25,   187,    79,
-     178,   179,   254,    44,  -103,   149,    84,   151,   152,   153,
-    -103,   254,   133,   224,   155,    19,    63,    63,    63,    63,
-      63,    63,    63,    63,    63,    63,    63,    63,   172,   220,
-     133,   -93,   122,   244,   170,    81,   245,   -89,    81,     4,
-     133,   123,    63,   134,   330,   124,   -12,   333,   -15,   217,
-       4,   180,    85,   -94,    19,   184,     5,   157,   158,   159,
-     160,   161,   162,   163,   164,   165,   166,   167,   168,   -12,
-      85,   -15,   103,   215,    56,    86,   148,   147,   112,   113,
-      48,    49,   156,   177,    72,   169,    73,   154,   134,   252,
-    -104,   221,    81,    81,   129,   130,    81,   182,    81,    92,
-      93,    87,    81,   259,    85,   225,   226,   240,   228,    86,
-      79,    76,   249,    79,   268,   271,   275,    92,    93,   283,
-     262,   233,    50,    51,   269,   270,   282,    81,   318,   181,
-     267,   186,   295,   242,   188,    87,    88,  -104,  -104,   287,
-     246,   233,    81,   289,   250,   251,    52,   267,   285,   204,
-     273,    92,    93,   323,   274,   324,   118,   291,    82,   316,
-     308,   247,   294,   311,   297,   110,   111,    79,    79,    67,
-     216,    79,   288,    79,   312,   313,    71,    79,   279,   293,
-     325,   219,     0,     0,   322,     0,     0,   299,   229,   230,
-     332,   227,   231,   334,   234,   327,   112,   113,   236,     0,
-     235,   290,    79,   292,    63,   114,     0,     0,     0,   241,
-       0,     0,    63,   243,     0,    85,     0,    79,     0,    20,
-      86,     0,     0,   256,    85,   314,   315,     0,    23,    86,
-      98,    99,   100,   101,   102,   261,     0,   103,   263,     0,
-       0,     0,     0,     0,     0,     0,    87,    88,    89,     0,
-       0,     0,     0,    97,     0,    87,    88,    89,   277,    90,
-       0,     0,    92,    93,     0,   280,   281,     0,    90,   284,
-       0,    92,    93,     0,   104,   105,   106,   107,   108,     0,
-      76,   109,     0,   134,     0,     0,     0,   298,     0,   300,
-       0,   301,   306,   307,     0,   309,     2,     3,     0,     4,
-       5,     0,     0,     6,     7,     0,     0,     0,     0,     0,
-       0,     0,     0,     8,     9,   326,     0,     0,   328,     0,
-       0,   329,     0,   331,     0,     0,     0,     0,     0,     0,
-       0,    10,    11,    12,    13,     0,     0,     0,     0,    14,
-      15,    16,    17,    18,     0,     0,     0,    19,    20,     0,
+      34,    80,    80,    70,    81,   255,   186,   122,   127,   128,
+     239,    56,    57,    58,   151,   136,   188,   224,    74,    63,
+      63,   120,    63,    68,   133,    71,   273,    85,   121,   279,
+       5,    19,    19,    63,   139,   311,   113,   114,    43,   140,
+     261,    33,   119,   119,   322,   174,   142,   245,   175,    44,
+     246,   143,    74,    75,    76,    76,    44,   -12,   119,   119,
+      62,    64,   172,    65,    59,   129,    75,   -15,    60,    79,
+     123,    84,   179,   180,    97,    92,    93,   255,   124,   134,
+     -12,   225,    44,    44,   125,   150,   255,   152,   153,   154,
+     -15,    48,    49,    25,   156,   173,    63,    63,    63,    63,
+      63,    63,    63,    63,    63,    63,    63,    63,   321,   187,
+     221,   253,   189,   -93,  -104,   171,    81,   130,   131,    81,
+      85,   218,     4,    63,   103,   331,    86,    19,   334,   149,
+       5,   133,   181,   157,    50,    51,   185,   158,   159,   160,
+     161,   162,   163,   164,   165,   166,   167,   168,   169,   170,
+     148,   219,    87,    88,   216,    56,   135,   183,    52,     4,
+     155,   288,  -104,  -104,   178,   290,   230,   231,    92,    93,
+     232,   222,   235,    81,    81,   226,   237,    81,   227,    81,
+     229,    79,   309,    81,    79,   312,   134,   260,   241,   100,
+     101,   102,   263,    76,   103,   133,   270,   271,   269,   135,
+     284,   257,   234,   182,  -103,    72,   134,    73,    81,   250,
+     268,   272,   333,   276,   243,   335,   264,   283,   296,   -94,
+     286,   247,   234,    81,   319,   251,   252,   268,   205,   292,
+     324,   274,   325,   317,    82,   275,   298,   119,    79,    79,
+     248,   295,    79,    67,    79,   220,  -103,   217,    79,   280,
+     134,   303,    69,   289,     4,     5,   323,    71,     6,     7,
+     294,  -102,   326,  -103,     0,   228,     0,   328,   300,  -103,
+     313,   314,     0,    79,   236,   304,   305,     0,     0,     0,
+      85,     0,   291,   242,   293,    63,    86,   244,    79,     0,
+      13,     0,     0,    63,     0,    14,    15,    16,    17,     0,
+       0,     0,    19,  -102,    20,   110,   111,   112,     0,   262,
+      21,    22,    87,    23,     0,    24,    20,     0,    25,   258,
+    -102,    61,   315,   316,   -89,    23,  -102,     0,    92,    93,
+       0,     0,   278,     0,    97,     0,     0,   113,   114,   281,
+     282,     0,     0,   285,     0,     0,   115,    98,    99,   100,
+     101,   102,     0,    85,   103,     0,     0,     0,     0,    86,
+       0,   299,     0,   301,     0,   302,   307,   308,     0,   310,
+       0,     0,     2,     3,     0,     4,     5,     0,     0,     6,
+       7,     0,     0,     0,     0,    87,    88,    89,     0,   327,
+       8,     9,   329,     0,     0,   330,     0,   332,    90,     0,
+       0,    92,    93,     0,     0,     0,     0,     0,    10,    11,
+      12,    13,     0,   135,     0,     0,    14,    15,    16,    17,
+      18,     0,     0,     0,    19,    20,   104,   105,   106,   107,
+     108,    21,    22,   109,    23,     0,    24,     0,     0,    25,
+      26,     0,    27,     0,     0,   -18,   190,   -18,     4,     5,
+       0,     0,     6,     7,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   191,     0,   192,   193,   194,
+     -72,   -72,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,     0,     0,     0,    13,   204,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,   -72,    20,     0,
        0,     0,     0,     0,    21,    22,     0,    23,     0,    24,
-       0,     0,    25,    26,     0,    27,     0,     0,   -18,   189,
-     -18,     4,     5,     0,     0,     6,     7,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   190,     0,   191,
-     192,   193,   -72,   -72,   194,   195,   196,   197,   198,   199,
-     200,   201,   202,     0,     0,     0,    13,   203,     0,     0,
-       0,    14,    15,    16,    17,     0,     0,     0,     0,   -72,
-      20,     0,     0,     0,     0,     0,    21,    22,     0,    23,
-       0,    24,     0,     0,    25,    26,     0,    61,     0,     0,
-      75,   -72,    76,   189,     0,     4,     5,     0,     0,     6,
-       7,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,   190,     0,   191,   192,   193,   -71,   -71,   194,   195,
-     196,   197,   198,   199,   200,   201,   202,     0,     0,     0,
-      13,   203,     0,     0,     0,    14,    15,    16,    17,     0,
-       0,     0,     0,   -71,    20,     0,     0,     0,     0,     0,
-      21,    22,     0,    23,     0,    24,     0,     0,    25,    26,
-       0,    61,     0,     0,    75,   -71,    76,   189,     0,     4,
-       5,     0,     0,     6,     7,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   190,     0,   191,   192,   193,
-       0,     0,   194,   195,   196,   197,   198,   199,   200,   201,
-     202,     0,     0,     0,    13,   203,     0,     0,     0,    14,
-      15,    16,    17,    69,     0,     4,     5,     0,    20,     6,
-       7,     0,  -102,     0,    21,    22,     0,    23,     0,    24,
-       0,     0,    25,    26,     0,    61,     0,     0,    75,   204,
-      76,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      13,     0,     0,     0,     0,    14,    15,    16,    17,     0,
-       0,     0,     0,  -102,    20,     0,     0,     0,     0,     0,
-      21,    22,     0,    23,     0,    24,     0,     0,    25,   257,
-    -102,    61,     0,     4,     5,     0,  -102,     6,     7,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   190,
-       0,   191,   192,   193,     0,     0,   194,   195,   196,   197,
-     198,   199,   200,   201,   202,     0,     4,     5,    13,   203,
-       6,     7,     0,    14,    15,    16,    17,     0,     0,     0,
-       0,     0,    20,     0,     0,     0,     0,    85,    21,    22,
-       0,    23,    86,    24,     0,     0,    25,    26,     0,    61,
-       0,    13,    75,     0,    76,     0,    14,    15,    16,    17,
-      69,     0,     4,     5,     0,    20,     6,     7,    87,    88,
-      89,    21,    22,     0,    23,     0,    24,     0,     0,    25,
-      26,    90,    61,    91,    92,    93,     0,    76,     0,     0,
-       0,     0,    69,     0,     4,     5,     0,    13,     6,     7,
-       0,     0,    14,    15,    16,    17,     0,     0,     0,     0,
-       0,    20,     0,     0,     0,     0,     0,    21,    22,     0,
-      23,     0,    24,     0,     0,    25,    26,  -102,    61,    13,
-       0,     0,     0,     0,    14,    15,    16,    17,   183,     0,
-       4,     5,     0,    20,     6,     7,     0,     0,     0,    21,
+       0,     0,    25,    26,     0,    61,     0,     0,    75,   -72,
+      76,   190,     0,     4,     5,     0,     0,     6,     7,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     191,     0,   192,   193,   194,   -71,   -71,   195,   196,   197,
+     198,   199,   200,   201,   202,   203,     0,     0,     0,    13,
+     204,     0,     0,     0,    14,    15,    16,    17,     0,     0,
+       0,     0,   -71,    20,     0,     0,     0,     0,     0,    21,
       22,     0,    23,     0,    24,     0,     0,    25,    26,     0,
-      61,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     4,   253,    13,     0,     6,     7,     0,
-      14,    15,    16,    17,     0,     0,     0,     0,     0,    20,
-       0,     0,   192,     0,     0,    21,    22,     0,    23,     0,
-      24,   199,   200,    25,    26,     0,    61,     0,    13,     0,
-       0,     0,     0,    14,    15,    16,    17,     0,     0,     4,
-       5,     0,    20,     6,     7,     0,     0,     0,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,   192,    61,
-       0,     0,     0,     0,     0,     0,     0,   199,   200,     0,
-       0,     0,     0,     0,    13,     0,     0,     0,     0,    14,
-      15,    16,    17,     0,     0,     4,     5,     0,    20,     6,
-       7,     0,     0,    96,    21,    22,     0,    23,     0,    24,
-       0,     0,    25,    26,     0,    61,     0,     0,     0,     0,
-       0,     0,     4,     5,     0,     0,     6,     7,     0,     0,
-      13,     0,     0,     0,     0,    14,    15,    16,    17,     0,
-       0,     0,     0,    85,    20,     0,     0,     0,    86,     0,
-      21,    22,     0,    23,     0,    24,     0,    13,    25,    26,
-       0,    61,    14,    15,    16,    17,     0,     0,     4,     5,
-       0,    20,     6,     7,    87,    88,    89,    21,    22,     0,
-      23,     0,    24,     0,     0,    25,    26,    90,    61,     0,
-      92,    93,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,    85,    14,    15,
-      16,    17,    86,     0,     0,     0,     0,    20,     0,     0,
-       0,     0,     0,    21,    22,     0,    23,     0,    24,     0,
-       0,    25,    66,     0,    61,     0,     0,     0,    87,    88,
-      89,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    90,   214,     0,    92,    93
+      61,     0,     0,    75,   -71,    76,   190,     0,     4,     5,
+       0,     0,     6,     7,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   191,     0,   192,   193,   194,
+       0,     0,   195,   196,   197,   198,   199,   200,   201,   202,
+     203,     0,     0,     0,    13,   204,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,    20,     0,
+       0,     0,     0,     0,    21,    22,     0,    23,     0,    24,
+       0,     0,    25,    26,     0,    61,     0,     0,    75,   205,
+      76,     4,     5,     0,     0,     6,     7,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   191,     0,
+     192,   193,   194,     0,     0,   195,   196,   197,   198,   199,
+     200,   201,   202,   203,     0,     0,     0,    13,   204,     0,
+       0,     0,    14,    15,    16,    17,     0,     0,     4,     5,
+       0,    20,     6,     7,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,     0,
+       0,    75,     0,    76,     0,     0,     0,     0,     0,    69,
+       0,     4,     5,     0,    13,     6,     7,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,    20,     0,
+       0,     0,     0,     0,    21,    22,     0,    23,     0,    24,
+       0,     0,    25,    26,     0,    61,     0,    13,     0,     0,
+      76,     0,    14,    15,    16,    17,    69,     0,     4,     5,
+       0,    20,     6,     7,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,  -102,    61,     0,
+       0,     0,     0,   184,     0,     4,     5,     0,     0,     6,
+       7,     0,     0,     0,    13,     0,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,    20,     0,
+       0,     0,     0,     0,    21,    22,     0,    23,     0,    24,
+       0,    13,    25,    26,     0,    61,    14,    15,    16,    17,
+       0,     0,     0,     4,   254,    20,     0,     6,     7,     0,
+       0,    21,    22,     0,    23,     0,    24,     0,     0,    25,
+      26,     0,    61,   193,     0,     0,     0,     0,     0,     0,
+       0,     0,   200,   201,     0,     0,     4,     5,     0,    13,
+       6,     7,     0,     0,    14,    15,    16,    17,     0,     0,
+       0,     0,     0,    20,     0,     0,   193,     0,     0,    21,
+      22,     0,    23,     0,    24,   200,   201,    25,    26,     0,
+      61,     0,    13,     0,     0,     0,     0,    14,    15,    16,
+      17,     0,     0,     4,     5,     0,    20,     6,     7,     0,
+       0,    96,    21,    22,     0,    23,     0,    24,     0,     0,
+      25,    26,     0,    61,     0,     0,     0,     0,     0,     0,
+       4,     5,     0,     0,     6,     7,     0,     0,     0,    13,
+       0,     0,     0,     0,    14,    15,    16,    17,     0,     0,
+       0,    85,     0,    20,     0,     0,     0,    86,     0,    21,
+      22,     0,    23,     0,    24,     0,    13,    25,    26,     0,
+      61,    14,    15,    16,    17,     0,     0,     4,     5,     0,
+      20,     6,     7,    87,    88,    89,    21,    22,     0,    23,
+       0,    24,     0,     0,    25,    26,    90,    61,    85,    92,
+      93,     0,     0,     0,    86,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    85,    76,    14,    15,
+      16,    17,    86,    85,     0,     0,     0,    20,     0,    86,
+      87,    88,    89,    21,    22,     0,    23,     0,    24,     0,
+       0,    25,    66,    90,    61,    91,    92,    93,    87,    88,
+      89,     0,     0,     0,     0,    87,    88,    89,     0,     0,
+       0,    90,   215,     0,    92,    93,     0,     0,    90,     0,
+       0,    92,    93
 };
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-273)))
+  (!!((Yystate) == (-267)))
 
 #define yytable_value_is_error(Yytable_value) \
   (!!((Yytable_value) == (-104)))
 
 static const yytype_int16 yycheck[] =
 {
-       1,    29,    30,    26,    29,    59,    60,   238,    46,   211,
-     228,    13,    14,    15,    87,     4,    27,     1,    16,    21,
-      22,    44,    24,    25,    70,    26,    10,    40,   300,    16,
-       4,    51,    51,    35,    60,    61,    62,   309,     1,    65,
-      67,     1,    43,    44,     1,     1,     6,     4,     1,    70,
-      61,     1,    72,     6,    74,    74,     1,    70,    59,    60,
-      21,    22,    67,    24,    67,    66,     1,    51,    24,    25,
-     116,    55,    70,    72,    35,   306,     1,    66,     1,    29,
-     126,   127,   300,    70,    68,    86,    51,    88,    89,    90,
-      74,   309,    55,    67,    95,    51,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,    71,   182,
-      55,    68,    49,     1,   115,   140,     4,    73,   143,     3,
-      55,    67,   124,    68,   326,    56,    51,   329,    51,   175,
-       3,   132,     9,    68,    51,   136,     4,    98,    99,   100,
-     101,   102,   103,   104,   105,   106,   107,   108,   109,    74,
-       9,    74,    65,   154,   156,    14,     5,    81,    43,    44,
-       3,     4,    38,   124,    48,    13,    50,    91,    68,   227,
-       9,    67,   197,   198,    43,    44,   201,    40,   203,    56,
-      57,    40,   207,   237,     9,    67,    67,   212,    67,    14,
-     140,    74,     4,   143,    68,    26,    10,    56,    57,   272,
-     246,   202,    45,    46,   250,   251,    67,   232,    54,   133,
-     248,   140,    20,   214,   143,    40,    41,    56,    57,   277,
-     221,   222,   247,   281,   225,   226,    69,   265,   274,    73,
-     255,    56,    57,     7,   257,     7,   237,   283,    30,   303,
-     298,   222,   286,   301,   290,    12,    13,   197,   198,    25,
-     156,   201,   280,   203,     7,     8,   257,   207,   265,   284,
-     317,   176,    -1,    -1,   310,    -1,    -1,   292,   197,   198,
-     328,   195,   201,   331,   203,   321,    43,    44,   207,    -1,
-     204,   282,   232,   284,   286,    52,    -1,    -1,    -1,   213,
-      -1,    -1,   294,   217,    -1,     9,    -1,   247,    -1,    52,
-      14,    -1,    -1,   232,     9,    58,    59,    -1,    61,    14,
-      58,    59,    60,    61,    62,   239,    -1,    65,   247,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    40,    41,    42,    -1,
-      -1,    -1,    -1,   294,    -1,    40,    41,    42,   262,    53,
-      -1,    -1,    56,    57,    -1,   269,   270,    -1,    53,   273,
-      -1,    56,    57,    -1,    58,    59,    60,    61,    62,    -1,
-      74,    65,    -1,    68,    -1,    -1,    -1,   291,    -1,   293,
-      -1,   295,   296,   297,    -1,   299,     0,     1,    -1,     3,
-       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    17,    18,   319,    -1,    -1,   322,    -1,
-      -1,   325,    -1,   327,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    35,    36,    37,    38,    -1,    -1,    -1,    -1,    43,
-      44,    45,    46,    47,    -1,    -1,    -1,    51,    52,    -1,
-      -1,    -1,    -1,    -1,    58,    59,    -1,    61,    -1,    63,
-      -1,    -1,    66,    67,    -1,    69,    -1,    -1,    72,     1,
-      74,     3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    19,    -1,    21,
-      22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    -1,    -1,    -1,    38,    39,    -1,    -1,
-      -1,    43,    44,    45,    46,    -1,    -1,    -1,    -1,    51,
-      52,    -1,    -1,    -1,    -1,    -1,    58,    59,    -1,    61,
-      -1,    63,    -1,    -1,    66,    67,    -1,    69,    -1,    -1,
-      72,    73,    74,     1,    -1,     3,     4,    -1,    -1,     7,
-       8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    19,    -1,    21,    22,    23,    24,    25,    26,    27,
-      28,    29,    30,    31,    32,    33,    34,    -1,    -1,    -1,
-      38,    39,    -1,    -1,    -1,    43,    44,    45,    46,    -1,
-      -1,    -1,    -1,    51,    52,    -1,    -1,    -1,    -1,    -1,
-      58,    59,    -1,    61,    -1,    63,    -1,    -1,    66,    67,
-      -1,    69,    -1,    -1,    72,    73,    74,     1,    -1,     3,
-       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    19,    -1,    21,    22,    23,
-      -1,    -1,    26,    27,    28,    29,    30,    31,    32,    33,
-      34,    -1,    -1,    -1,    38,    39,    -1,    -1,    -1,    43,
-      44,    45,    46,     1,    -1,     3,     4,    -1,    52,     7,
-       8,    -1,    10,    -1,    58,    59,    -1,    61,    -1,    63,
-      -1,    -1,    66,    67,    -1,    69,    -1,    -1,    72,    73,
-      74,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      38,    -1,    -1,    -1,    -1,    43,    44,    45,    46,    -1,
-      -1,    -1,    -1,    51,    52,    -1,    -1,    -1,    -1,    -1,
-      58,    59,    -1,    61,    -1,    63,    -1,    -1,    66,    67,
-      68,    69,    -1,     3,     4,    -1,    74,     7,     8,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    19,
-      -1,    21,    22,    23,    -1,    -1,    26,    27,    28,    29,
-      30,    31,    32,    33,    34,    -1,     3,     4,    38,    39,
-       7,     8,    -1,    43,    44,    45,    46,    -1,    -1,    -1,
-      -1,    -1,    52,    -1,    -1,    -1,    -1,     9,    58,    59,
-      -1,    61,    14,    63,    -1,    -1,    66,    67,    -1,    69,
-      -1,    38,    72,    -1,    74,    -1,    43,    44,    45,    46,
-       1,    -1,     3,     4,    -1,    52,     7,     8,    40,    41,
-      42,    58,    59,    -1,    61,    -1,    63,    -1,    -1,    66,
-      67,    53,    69,    55,    56,    57,    -1,    74,    -1,    -1,
-      -1,    -1,     1,    -1,     3,     4,    -1,    38,     7,     8,
-      -1,    -1,    43,    44,    45,    46,    -1,    -1,    -1,    -1,
-      -1,    52,    -1,    -1,    -1,    -1,    -1,    58,    59,    -1,
-      61,    -1,    63,    -1,    -1,    66,    67,    68,    69,    38,
-      -1,    -1,    -1,    -1,    43,    44,    45,    46,     1,    -1,
-       3,     4,    -1,    52,     7,     8,    -1,    -1,    -1,    58,
-      59,    -1,    61,    -1,    63,    -1,    -1,    66,    67,    -1,
-      69,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,     3,     4,    38,    -1,     7,     8,    -1,
-      43,    44,    45,    46,    -1,    -1,    -1,    -1,    -1,    52,
-      -1,    -1,    22,    -1,    -1,    58,    59,    -1,    61,    -1,
-      63,    31,    32,    66,    67,    -1,    69,    -1,    38,    -1,
-      -1,    -1,    -1,    43,    44,    45,    46,    -1,    -1,     3,
-       4,    -1,    52,     7,     8,    -1,    -1,    -1,    58,    59,
-      -1,    61,    -1,    63,    -1,    -1,    66,    67,    22,    69,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,    32,    -1,
-      -1,    -1,    -1,    -1,    38,    -1,    -1,    -1,    -1,    43,
-      44,    45,    46,    -1,    -1,     3,     4,    -1,    52,     7,
-       8,    -1,    -1,    11,    58,    59,    -1,    61,    -1,    63,
-      -1,    -1,    66,    67,    -1,    69,    -1,    -1,    -1,    -1,
-      -1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,    -1,
-      38,    -1,    -1,    -1,    -1,    43,    44,    45,    46,    -1,
-      -1,    -1,    -1,     9,    52,    -1,    -1,    -1,    14,    -1,
-      58,    59,    -1,    61,    -1,    63,    -1,    38,    66,    67,
-      -1,    69,    43,    44,    45,    46,    -1,    -1,     3,     4,
-      -1,    52,     7,     8,    40,    41,    42,    58,    59,    -1,
-      61,    -1,    63,    -1,    -1,    66,    67,    53,    69,    -1,
-      56,    57,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,     9,    43,    44,
-      45,    46,    14,    -1,    -1,    -1,    -1,    52,    -1,    -1,
-      -1,    -1,    -1,    58,    59,    -1,    61,    -1,    63,    -1,
-      -1,    66,    67,    -1,    69,    -1,    -1,    -1,    40,    41,
-      42,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    53,    54,    -1,    56,    57
+       1,    29,    30,    26,    29,   229,     1,    46,    59,    60,
+     212,    13,    14,    15,    87,    70,     1,     4,    27,    21,
+      22,    44,    24,    25,     1,    26,    41,     9,    17,    17,
+       4,    52,    52,    35,     1,   301,    44,    45,    68,     6,
+     239,     1,    43,    44,   310,     1,     1,     1,     4,    71,
+       4,     6,    61,    73,    75,    75,    71,    52,    59,    60,
+      21,    22,   117,    24,    68,    66,    73,    52,    68,    29,
+      50,    52,   127,   128,    35,    57,    58,   301,    68,    56,
+      75,    68,    71,    71,    57,    86,   310,    88,    89,    90,
+      75,     3,     4,    67,    95,    72,    98,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   307,   141,
+     183,   228,   144,    69,     9,   116,   141,    44,    45,   144,
+       9,   176,     3,   125,    66,   327,    15,    52,   330,     5,
+       4,     1,   133,    39,    46,    47,   137,    98,    99,   100,
+     101,   102,   103,   104,   105,   106,   107,   108,   109,    13,
+      81,     1,    41,    42,   155,   157,    69,    41,    70,     3,
+      91,   278,    57,    58,   125,   282,   198,   199,    57,    58,
+     202,    68,   204,   198,   199,    68,   208,   202,    68,   204,
+      68,   141,   299,   208,   144,   302,    56,   238,   213,    61,
+      62,    63,   247,    75,    66,     1,   251,   252,    69,    69,
+     273,   233,   203,   134,    10,    49,    56,    51,   233,     4,
+     249,    27,   329,    10,   215,   332,   248,    68,    21,    69,
+     275,   222,   223,   248,    55,   226,   227,   266,    74,   284,
+       7,   256,     7,   304,    30,   258,   291,   238,   198,   199,
+     223,   287,   202,    25,   204,   177,    52,   157,   208,   266,
+      56,     1,     1,   281,     3,     4,   311,   258,     7,     8,
+     285,    10,   318,    69,    -1,   196,    -1,   322,   293,    75,
+       7,     8,    -1,   233,   205,    25,    26,    -1,    -1,    -1,
+       9,    -1,   283,   214,   285,   287,    15,   218,   248,    -1,
+      39,    -1,    -1,   295,    -1,    44,    45,    46,    47,    -1,
+      -1,    -1,    52,    52,    53,    12,    13,    14,    -1,   240,
+      59,    60,    41,    62,    -1,    64,    53,    -1,    67,    68,
+      69,    70,    59,    60,    74,    62,    75,    -1,    57,    58,
+      -1,    -1,   263,    -1,   295,    -1,    -1,    44,    45,   270,
+     271,    -1,    -1,   274,    -1,    -1,    53,    59,    60,    61,
+      62,    63,    -1,     9,    66,    -1,    -1,    -1,    -1,    15,
+      -1,   292,    -1,   294,    -1,   296,   297,   298,    -1,   300,
+      -1,    -1,     0,     1,    -1,     3,     4,    -1,    -1,     7,
+       8,    -1,    -1,    -1,    -1,    41,    42,    43,    -1,   320,
+      18,    19,   323,    -1,    -1,   326,    -1,   328,    54,    -1,
+      -1,    57,    58,    -1,    -1,    -1,    -1,    -1,    36,    37,
+      38,    39,    -1,    69,    -1,    -1,    44,    45,    46,    47,
+      48,    -1,    -1,    -1,    52,    53,    59,    60,    61,    62,
+      63,    59,    60,    66,    62,    -1,    64,    -1,    -1,    67,
+      68,    -1,    70,    -1,    -1,    73,     1,    75,     3,     4,
+      -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    -1,    -1,    -1,    39,    40,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    52,    53,    -1,
+      -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
+      -1,    -1,    67,    68,    -1,    70,    -1,    -1,    73,    74,
+      75,     1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      20,    -1,    22,    23,    24,    25,    26,    27,    28,    29,
+      30,    31,    32,    33,    34,    35,    -1,    -1,    -1,    39,
+      40,    -1,    -1,    -1,    44,    45,    46,    47,    -1,    -1,
+      -1,    -1,    52,    53,    -1,    -1,    -1,    -1,    -1,    59,
+      60,    -1,    62,    -1,    64,    -1,    -1,    67,    68,    -1,
+      70,    -1,    -1,    73,    74,    75,     1,    -1,     3,     4,
+      -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    23,    24,
+      -1,    -1,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    -1,    -1,    -1,    39,    40,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,    -1,
+      -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
+      -1,    -1,    67,    68,    -1,    70,    -1,    -1,    73,    74,
+      75,     3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,    -1,
+      22,    23,    24,    -1,    -1,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    -1,    -1,    -1,    39,    40,    -1,
+      -1,    -1,    44,    45,    46,    47,    -1,    -1,     3,     4,
+      -1,    53,     7,     8,    -1,    -1,    -1,    59,    60,    -1,
+      62,    -1,    64,    -1,    -1,    67,    68,    -1,    70,    -1,
+      -1,    73,    -1,    75,    -1,    -1,    -1,    -1,    -1,     1,
+      -1,     3,     4,    -1,    39,     7,     8,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,    -1,
+      -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
+      -1,    -1,    67,    68,    -1,    70,    -1,    39,    -1,    -1,
+      75,    -1,    44,    45,    46,    47,     1,    -1,     3,     4,
+      -1,    53,     7,     8,    -1,    -1,    -1,    59,    60,    -1,
+      62,    -1,    64,    -1,    -1,    67,    68,    69,    70,    -1,
+      -1,    -1,    -1,     1,    -1,     3,     4,    -1,    -1,     7,
+       8,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,    -1,
+      -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
+      -1,    39,    67,    68,    -1,    70,    44,    45,    46,    47,
+      -1,    -1,    -1,     3,     4,    53,    -1,     7,     8,    -1,
+      -1,    59,    60,    -1,    62,    -1,    64,    -1,    -1,    67,
+      68,    -1,    70,    23,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    32,    33,    -1,    -1,     3,     4,    -1,    39,
+       7,     8,    -1,    -1,    44,    45,    46,    47,    -1,    -1,
+      -1,    -1,    -1,    53,    -1,    -1,    23,    -1,    -1,    59,
+      60,    -1,    62,    -1,    64,    32,    33,    67,    68,    -1,
+      70,    -1,    39,    -1,    -1,    -1,    -1,    44,    45,    46,
+      47,    -1,    -1,     3,     4,    -1,    53,     7,     8,    -1,
+      -1,    11,    59,    60,    -1,    62,    -1,    64,    -1,    -1,
+      67,    68,    -1,    70,    -1,    -1,    -1,    -1,    -1,    -1,
+       3,     4,    -1,    -1,     7,     8,    -1,    -1,    -1,    39,
+      -1,    -1,    -1,    -1,    44,    45,    46,    47,    -1,    -1,
+      -1,     9,    -1,    53,    -1,    -1,    -1,    15,    -1,    59,
+      60,    -1,    62,    -1,    64,    -1,    39,    67,    68,    -1,
+      70,    44,    45,    46,    47,    -1,    -1,     3,     4,    -1,
+      53,     7,     8,    41,    42,    43,    59,    60,    -1,    62,
+      -1,    64,    -1,    -1,    67,    68,    54,    70,     9,    57,
+      58,    -1,    -1,    -1,    15,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,     9,    75,    44,    45,
+      46,    47,    15,     9,    -1,    -1,    -1,    53,    -1,    15,
+      41,    42,    43,    59,    60,    -1,    62,    -1,    64,    -1,
+      -1,    67,    68,    54,    70,    56,    57,    58,    41,    42,
+      43,    -1,    -1,    -1,    -1,    41,    42,    43,    -1,    -1,
+      -1,    54,    55,    -1,    57,    58,    -1,    -1,    54,    -1,
+      -1,    57,    58
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       0,    76,     0,     1,     3,     4,     7,     8,    17,    18,
-      35,    36,    37,    38,    43,    44,    45,    46,    47,    51,
-      52,    58,    59,    61,    63,    66,    67,    69,    77,    80,
-      84,    85,    87,   105,   113,   117,   118,   119,   120,   121,
-     122,   130,   131,    67,    70,   127,   128,   129,     3,     4,
-      45,    46,    69,    82,    83,   123,   131,   131,   131,    67,
-      67,    69,   118,   131,   118,   118,    67,   120,   131,     1,
-     112,   113,    48,    50,   122,    72,    74,    81,    89,   105,
-     133,   137,    81,    86,    51,     9,    14,    40,    41,    42,
-      53,    55,    56,    57,   115,   116,    11,   118,    58,    59,
-      60,    61,    62,    65,    58,    59,    60,    61,    62,    65,
-      12,    13,    43,    44,    52,   114,   111,   112,   113,   112,
-      16,   127,    49,    67,    56,   107,   111,   111,   113,    43,
-      44,   132,     1,    55,    68,   135,   139,   135,     1,     6,
-      78,     1,     6,    79,   105,   106,    88,   106,     5,   113,
-     130,   113,   113,   113,   106,   113,    38,   118,   118,   118,
-     118,   118,   118,   118,   118,   118,   118,   118,   118,    13,
-     113,   135,    71,     1,     4,   108,   109,   118,   135,   135,
-     113,   106,    40,     1,   113,     1,    89,     1,    89,     1,
-      19,    21,    22,    23,    26,    27,    28,    29,    30,    31,
-      32,    33,    34,    39,    73,    90,    91,    93,   100,   104,
-     113,   133,   134,   137,    54,   113,   123,   135,     1,   139,
-     130,    67,    92,     4,    67,    67,    67,   106,    67,    89,
-      89,    89,   110,   113,    89,   106,    89,    94,    88,   136,
-     137,   106,   113,   106,     1,     4,   113,   110,    95,     4,
-     113,   113,    90,     4,    93,    96,    89,    67,   101,   111,
-     134,   106,   135,    89,   124,   125,   126,   127,    68,   135,
-     135,    26,    40,   137,   112,    10,   102,   106,    16,   126,
-     106,   106,    67,   130,   106,   135,   103,    90,   133,    90,
-     113,   135,   113,   137,   117,    20,    97,   135,   106,   137,
-     106,   106,     1,    24,    25,    98,   106,   106,    90,   106,
-      96,    90,     7,     8,    58,    59,    85,    99,    54,   138,
-     134,    96,   135,     7,     7,   138,   106,   135,   106,   106,
-      88,   106,    90,    88,    90
+       0,    77,     0,     1,     3,     4,     7,     8,    18,    19,
+      36,    37,    38,    39,    44,    45,    46,    47,    48,    52,
+      53,    59,    60,    62,    64,    67,    68,    70,    78,    81,
+      85,    86,    88,   106,   114,   118,   119,   120,   121,   122,
+     123,   131,   132,    68,    71,   128,   129,   130,     3,     4,
+      46,    47,    70,    83,    84,   124,   132,   132,   132,    68,
+      68,    70,   119,   132,   119,   119,    68,   121,   132,     1,
+     113,   114,    49,    51,   123,    73,    75,    82,    90,   106,
+     134,   138,    82,    87,    52,     9,    15,    41,    42,    43,
+      54,    56,    57,    58,   116,   117,    11,   119,    59,    60,
+      61,    62,    63,    66,    59,    60,    61,    62,    63,    66,
+      12,    13,    14,    44,    45,    53,   115,   112,   113,   114,
+     113,    17,   128,    50,    68,    57,   108,   112,   112,   114,
+      44,    45,   133,     1,    56,    69,   136,   140,   136,     1,
+       6,    79,     1,     6,    80,   106,   107,    89,   107,     5,
+     114,   131,   114,   114,   114,   107,   114,    39,   119,   119,
+     119,   119,   119,   119,   119,   119,   119,   119,   119,   119,
+      13,   114,   136,    72,     1,     4,   109,   110,   119,   136,
+     136,   114,   107,    41,     1,   114,     1,    90,     1,    90,
+       1,    20,    22,    23,    24,    27,    28,    29,    30,    31,
+      32,    33,    34,    35,    40,    74,    91,    92,    94,   101,
+     105,   114,   134,   135,   138,    55,   114,   124,   136,     1,
+     140,   131,    68,    93,     4,    68,    68,    68,   107,    68,
+      90,    90,    90,   111,   114,    90,   107,    90,    95,    89,
+     137,   138,   107,   114,   107,     1,     4,   114,   111,    96,
+       4,   114,   114,    91,     4,    94,    97,    90,    68,   102,
+     112,   135,   107,   136,    90,   125,   126,   127,   128,    69,
+     136,   136,    27,    41,   138,   113,    10,   103,   107,    17,
+     127,   107,   107,    68,   131,   107,   136,   104,    91,   134,
+      91,   114,   136,   114,   138,   118,    21,    98,   136,   107,
+     138,   107,   107,     1,    25,    26,    99,   107,   107,    91,
+     107,    97,    91,     7,     8,    59,    60,    86,   100,    55,
+     139,   135,    97,   136,     7,     7,   139,   107,   136,   107,
+     107,    89,   107,    91,    89,    91
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -2614,9 +2611,6 @@ yyreduce:
                INSTRUCTION *ip;
                char *var_name = (yyvsp[(3) - (8)])->lextok;
 
-               if ((yyvsp[(3) - (8)])->memory->type == Node_var_const)
-                       fatal(_("cannot use defined constant as loop variable 
in `for' statement"));
-
                if ((yyvsp[(8) - (8)]) != NULL
                                && (yyvsp[(8) - (8)])->lasti->opcode == 
Op_K_delete
                                && (yyvsp[(8) - (8)])->lasti->expr_count == 1
@@ -2729,7 +2723,7 @@ regular_loop:
 
   case 49:
 /* Line 1792 of yacc.c  */
-#line 772 "awkgram.y"
+#line 769 "awkgram.y"
     {
                (yyval) = mk_for_loop((yyvsp[(1) - (12)]), (yyvsp[(3) - (12)]), 
(yyvsp[(6) - (12)]), (yyvsp[(9) - (12)]), (yyvsp[(12) - (12)]));
 
@@ -2740,7 +2734,7 @@ regular_loop:
 
   case 50:
 /* Line 1792 of yacc.c  */
-#line 779 "awkgram.y"
+#line 776 "awkgram.y"
     {
                (yyval) = mk_for_loop((yyvsp[(1) - (11)]), (yyvsp[(3) - (11)]), 
(INSTRUCTION *) NULL, (yyvsp[(8) - (11)]), (yyvsp[(11) - (11)]));
 
@@ -2751,7 +2745,7 @@ regular_loop:
 
   case 51:
 /* Line 1792 of yacc.c  */
-#line 786 "awkgram.y"
+#line 783 "awkgram.y"
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[(1) - (1)]), 
instruction(Op_exec_count));
@@ -2762,7 +2756,7 @@ regular_loop:
 
   case 52:
 /* Line 1792 of yacc.c  */
-#line 796 "awkgram.y"
+#line 793 "awkgram.y"
     { 
                if (! break_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@ -2775,7 +2769,7 @@ regular_loop:
 
   case 53:
 /* Line 1792 of yacc.c  */
-#line 805 "awkgram.y"
+#line 802 "awkgram.y"
     {
                if (! continue_allowed)
                        error_ln((yyvsp[(1) - (2)])->source_line,
@@ -2788,7 +2782,7 @@ regular_loop:
 
   case 54:
 /* Line 1792 of yacc.c  */
-#line 814 "awkgram.y"
+#line 811 "awkgram.y"
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2801,7 +2795,7 @@ regular_loop:
 
   case 55:
 /* Line 1792 of yacc.c  */
-#line 823 "awkgram.y"
+#line 820 "awkgram.y"
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2816,7 +2810,7 @@ regular_loop:
 
   case 56:
 /* Line 1792 of yacc.c  */
-#line 834 "awkgram.y"
+#line 831 "awkgram.y"
     {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@ -2835,7 +2829,7 @@ regular_loop:
 
   case 57:
 /* Line 1792 of yacc.c  */
-#line 849 "awkgram.y"
+#line 846 "awkgram.y"
     {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
@@ -2844,7 +2838,7 @@ regular_loop:
 
   case 58:
 /* Line 1792 of yacc.c  */
-#line 852 "awkgram.y"
+#line 849 "awkgram.y"
     {
                if ((yyvsp[(3) - (4)]) == NULL) {
                        (yyval) = list_create((yyvsp[(1) - (4)]));
@@ -2869,13 +2863,13 @@ regular_loop:
 
   case 60:
 /* Line 1792 of yacc.c  */
-#line 884 "awkgram.y"
+#line 881 "awkgram.y"
     { in_print = true; in_parens = 0; }
     break;
 
   case 61:
 /* Line 1792 of yacc.c  */
-#line 885 "awkgram.y"
+#line 882 "awkgram.y"
     {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@ -2976,13 +2970,13 @@ regular_print:
 
   case 62:
 /* Line 1792 of yacc.c  */
-#line 982 "awkgram.y"
+#line 979 "awkgram.y"
     { sub_counter = 0; }
     break;
 
   case 63:
 /* Line 1792 of yacc.c  */
-#line 983 "awkgram.y"
+#line 980 "awkgram.y"
     {
                char *arr = (yyvsp[(2) - (4)])->lextok;
 
@@ -3019,7 +3013,7 @@ regular_print:
 
   case 64:
 /* Line 1792 of yacc.c  */
-#line 1020 "awkgram.y"
+#line 1017 "awkgram.y"
     {
                static bool warned = false;
                char *arr = (yyvsp[(3) - (4)])->lextok;
@@ -3049,31 +3043,31 @@ regular_print:
 
   case 65:
 /* Line 1792 of yacc.c  */
-#line 1046 "awkgram.y"
+#line 1043 "awkgram.y"
     {  (yyval) = optimize_assignment((yyvsp[(1) - (1)])); }
     break;
 
   case 66:
 /* Line 1792 of yacc.c  */
-#line 1051 "awkgram.y"
+#line 1048 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 67:
 /* Line 1792 of yacc.c  */
-#line 1053 "awkgram.y"
+#line 1050 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 68:
 /* Line 1792 of yacc.c  */
-#line 1058 "awkgram.y"
+#line 1055 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 69:
 /* Line 1792 of yacc.c  */
-#line 1060 "awkgram.y"
+#line 1057 "awkgram.y"
     {
                if ((yyvsp[(1) - (2)]) == NULL)
                        (yyval) = list_create((yyvsp[(2) - (2)]));
@@ -3084,13 +3078,13 @@ regular_print:
 
   case 70:
 /* Line 1792 of yacc.c  */
-#line 1067 "awkgram.y"
+#line 1064 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 71:
 /* Line 1792 of yacc.c  */
-#line 1072 "awkgram.y"
+#line 1069 "awkgram.y"
     {
                INSTRUCTION *casestmt = (yyvsp[(5) - (5)]);
                if ((yyvsp[(5) - (5)]) == NULL)
@@ -3106,7 +3100,7 @@ regular_print:
 
   case 72:
 /* Line 1792 of yacc.c  */
-#line 1084 "awkgram.y"
+#line 1081 "awkgram.y"
     {
                INSTRUCTION *casestmt = (yyvsp[(4) - (4)]);
                if ((yyvsp[(4) - (4)]) == NULL)
@@ -3121,13 +3115,13 @@ regular_print:
 
   case 73:
 /* Line 1792 of yacc.c  */
-#line 1098 "awkgram.y"
+#line 1095 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 74:
 /* Line 1792 of yacc.c  */
-#line 1100 "awkgram.y"
+#line 1097 "awkgram.y"
     { 
                NODE *n = (yyvsp[(2) - (2)])->memory;
                (void) force_number(n);
@@ -3139,7 +3133,7 @@ regular_print:
 
   case 75:
 /* Line 1792 of yacc.c  */
-#line 1108 "awkgram.y"
+#line 1105 "awkgram.y"
     {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
@@ -3148,13 +3142,13 @@ regular_print:
 
   case 76:
 /* Line 1792 of yacc.c  */
-#line 1113 "awkgram.y"
+#line 1110 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 77:
 /* Line 1792 of yacc.c  */
-#line 1115 "awkgram.y"
+#line 1112 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_push_re;
                (yyval) = (yyvsp[(1) - (1)]);
@@ -3163,19 +3157,19 @@ regular_print:
 
   case 78:
 /* Line 1792 of yacc.c  */
-#line 1123 "awkgram.y"
+#line 1120 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 79:
 /* Line 1792 of yacc.c  */
-#line 1125 "awkgram.y"
+#line 1122 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 81:
 /* Line 1792 of yacc.c  */
-#line 1135 "awkgram.y"
+#line 1132 "awkgram.y"
     {
                (yyval) = (yyvsp[(2) - (3)]);
          }
@@ -3183,7 +3177,7 @@ regular_print:
 
   case 82:
 /* Line 1792 of yacc.c  */
-#line 1142 "awkgram.y"
+#line 1139 "awkgram.y"
     {
                in_print = false;
                in_parens = 0;
@@ -3193,13 +3187,13 @@ regular_print:
 
   case 83:
 /* Line 1792 of yacc.c  */
-#line 1147 "awkgram.y"
+#line 1144 "awkgram.y"
     { in_print = false; in_parens = 0; }
     break;
 
   case 84:
 /* Line 1792 of yacc.c  */
-#line 1148 "awkgram.y"
+#line 1145 "awkgram.y"
     {
                if ((yyvsp[(1) - (3)])->redir_type == redirect_twoway
                        && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_K_getline_redir
@@ -3211,7 +3205,7 @@ regular_print:
 
   case 85:
 /* Line 1792 of yacc.c  */
-#line 1159 "awkgram.y"
+#line 1156 "awkgram.y"
     {
                (yyval) = mk_condition((yyvsp[(3) - (6)]), (yyvsp[(1) - (6)]), 
(yyvsp[(6) - (6)]), NULL, NULL);
          }
@@ -3219,7 +3213,7 @@ regular_print:
 
   case 86:
 /* Line 1792 of yacc.c  */
-#line 1164 "awkgram.y"
+#line 1161 "awkgram.y"
     {
                (yyval) = mk_condition((yyvsp[(3) - (9)]), (yyvsp[(1) - (9)]), 
(yyvsp[(6) - (9)]), (yyvsp[(7) - (9)]), (yyvsp[(9) - (9)]));
          }
@@ -3227,13 +3221,13 @@ regular_print:
 
   case 91:
 /* Line 1792 of yacc.c  */
-#line 1181 "awkgram.y"
+#line 1178 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 92:
 /* Line 1792 of yacc.c  */
-#line 1183 "awkgram.y"
+#line 1180 "awkgram.y"
     {
                bcfree((yyvsp[(1) - (2)]));
                (yyval) = (yyvsp[(2) - (2)]);
@@ -3242,19 +3236,19 @@ regular_print:
 
   case 93:
 /* Line 1792 of yacc.c  */
-#line 1191 "awkgram.y"
+#line 1188 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 94:
 /* Line 1792 of yacc.c  */
-#line 1193 "awkgram.y"
+#line 1190 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]) ; }
     break;
 
   case 95:
 /* Line 1792 of yacc.c  */
-#line 1198 "awkgram.y"
+#line 1195 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->param_count = 0;
                (yyval) = list_create((yyvsp[(1) - (1)]));
@@ -3263,7 +3257,7 @@ regular_print:
 
   case 96:
 /* Line 1792 of yacc.c  */
-#line 1203 "awkgram.y"
+#line 1200 "awkgram.y"
     {
                (yyvsp[(3) - (3)])->param_count =  (yyvsp[(1) - 
(3)])->lasti->param_count + 1;
                (yyval) = list_append((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]));
@@ -3273,55 +3267,55 @@ regular_print:
 
   case 97:
 /* Line 1792 of yacc.c  */
-#line 1209 "awkgram.y"
+#line 1206 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 98:
 /* Line 1792 of yacc.c  */
-#line 1211 "awkgram.y"
+#line 1208 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
   case 99:
 /* Line 1792 of yacc.c  */
-#line 1213 "awkgram.y"
+#line 1210 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (3)]); }
     break;
 
   case 100:
 /* Line 1792 of yacc.c  */
-#line 1219 "awkgram.y"
+#line 1216 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 101:
 /* Line 1792 of yacc.c  */
-#line 1221 "awkgram.y"
+#line 1218 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 102:
 /* Line 1792 of yacc.c  */
-#line 1226 "awkgram.y"
+#line 1223 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 103:
 /* Line 1792 of yacc.c  */
-#line 1228 "awkgram.y"
+#line 1225 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 104:
 /* Line 1792 of yacc.c  */
-#line 1233 "awkgram.y"
+#line 1230 "awkgram.y"
     {  (yyval) = mk_expression_list(NULL, (yyvsp[(1) - (1)])); }
     break;
 
   case 105:
 /* Line 1792 of yacc.c  */
-#line 1235 "awkgram.y"
+#line 1232 "awkgram.y"
     {
                (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
                yyerrok;
@@ -3330,13 +3324,13 @@ regular_print:
 
   case 106:
 /* Line 1792 of yacc.c  */
-#line 1240 "awkgram.y"
+#line 1237 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
   case 107:
 /* Line 1792 of yacc.c  */
-#line 1242 "awkgram.y"
+#line 1239 "awkgram.y"
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3348,7 +3342,7 @@ regular_print:
 
   case 108:
 /* Line 1792 of yacc.c  */
-#line 1250 "awkgram.y"
+#line 1247 "awkgram.y"
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[(1) - (3)]), (yyvsp[(3) - 
(3)]));
@@ -3357,7 +3351,7 @@ regular_print:
 
   case 109:
 /* Line 1792 of yacc.c  */
-#line 1255 "awkgram.y"
+#line 1252 "awkgram.y"
     {
                /* Ditto */
                (yyval) = (yyvsp[(1) - (3)]);
@@ -3366,7 +3360,7 @@ regular_print:
 
   case 110:
 /* Line 1792 of yacc.c  */
-#line 1264 "awkgram.y"
+#line 1261 "awkgram.y"
     {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3377,19 +3371,19 @@ regular_print:
 
   case 111:
 /* Line 1792 of yacc.c  */
-#line 1271 "awkgram.y"
+#line 1268 "awkgram.y"
     {  (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
     break;
 
   case 112:
 /* Line 1792 of yacc.c  */
-#line 1273 "awkgram.y"
+#line 1270 "awkgram.y"
     {  (yyval) = mk_boolean((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) 
- (3)])); }
     break;
 
   case 113:
 /* Line 1792 of yacc.c  */
-#line 1275 "awkgram.y"
+#line 1272 "awkgram.y"
     {
                if ((yyvsp[(1) - (3)])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3409,7 +3403,7 @@ regular_print:
 
   case 114:
 /* Line 1792 of yacc.c  */
-#line 1291 "awkgram.y"
+#line 1288 "awkgram.y"
     {
                if (do_lint_old)
                        warning_ln((yyvsp[(2) - (3)])->source_line,
@@ -3423,7 +3417,7 @@ regular_print:
 
   case 115:
 /* Line 1792 of yacc.c  */
-#line 1301 "awkgram.y"
+#line 1298 "awkgram.y"
     {
                if (do_lint && (yyvsp[(3) - (3)])->lasti->opcode == 
Op_match_rec)
                        lintwarn_ln((yyvsp[(2) - (3)])->source_line,
@@ -3434,76 +3428,82 @@ regular_print:
 
   case 116:
 /* Line 1792 of yacc.c  */
-#line 1308 "awkgram.y"
+#line 1305 "awkgram.y"
     { (yyval) = mk_condition((yyvsp[(1) - (5)]), (yyvsp[(2) - (5)]), 
(yyvsp[(3) - (5)]), (yyvsp[(4) - (5)]), (yyvsp[(5) - (5)])); }
     break;
 
   case 117:
 /* Line 1792 of yacc.c  */
-#line 1310 "awkgram.y"
+#line 1307 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 118:
 /* Line 1792 of yacc.c  */
-#line 1315 "awkgram.y"
+#line 1312 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 119:
 /* Line 1792 of yacc.c  */
-#line 1317 "awkgram.y"
+#line 1314 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 120:
 /* Line 1792 of yacc.c  */
-#line 1319 "awkgram.y"
-    {  
-               (yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
-               (yyval) = (yyvsp[(2) - (2)]);
-         }
+#line 1316 "awkgram.y"
+    { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 121:
 /* Line 1792 of yacc.c  */
-#line 1327 "awkgram.y"
-    { (yyval) = (yyvsp[(1) - (1)]); }
+#line 1318 "awkgram.y"
+    {  
+               (yyvsp[(2) - (2)])->opcode = Op_assign_quotient;
+               (yyval) = (yyvsp[(2) - (2)]);
+         }
     break;
 
   case 122:
 /* Line 1792 of yacc.c  */
-#line 1329 "awkgram.y"
+#line 1326 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 123:
 /* Line 1792 of yacc.c  */
-#line 1334 "awkgram.y"
+#line 1328 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 124:
 /* Line 1792 of yacc.c  */
-#line 1336 "awkgram.y"
+#line 1333 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 125:
 /* Line 1792 of yacc.c  */
-#line 1341 "awkgram.y"
+#line 1335 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 126:
 /* Line 1792 of yacc.c  */
-#line 1343 "awkgram.y"
+#line 1340 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
   case 127:
 /* Line 1792 of yacc.c  */
-#line 1345 "awkgram.y"
+#line 1342 "awkgram.y"
+    { (yyval) = (yyvsp[(1) - (1)]); }
+    break;
+
+  case 128:
+/* Line 1792 of yacc.c  */
+#line 1344 "awkgram.y"
     {
                int count = 2;
                bool is_simple_var = false;
@@ -3552,45 +3552,45 @@ regular_print:
          }
     break;
 
-  case 129:
-/* Line 1792 of yacc.c  */
-#line 1397 "awkgram.y"
-    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
-    break;
-
   case 130:
 /* Line 1792 of yacc.c  */
-#line 1399 "awkgram.y"
+#line 1396 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 131:
 /* Line 1792 of yacc.c  */
-#line 1401 "awkgram.y"
+#line 1398 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 132:
 /* Line 1792 of yacc.c  */
-#line 1403 "awkgram.y"
+#line 1400 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 133:
 /* Line 1792 of yacc.c  */
-#line 1405 "awkgram.y"
+#line 1402 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 134:
 /* Line 1792 of yacc.c  */
-#line 1407 "awkgram.y"
+#line 1404 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 135:
 /* Line 1792 of yacc.c  */
-#line 1409 "awkgram.y"
+#line 1406 "awkgram.y"
+    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
+    break;
+
+  case 136:
+/* Line 1792 of yacc.c  */
+#line 1408 "awkgram.y"
     {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline var < file'
@@ -3615,27 +3615,27 @@ regular_print:
          }
     break;
 
-  case 136:
+  case 137:
 /* Line 1792 of yacc.c  */
-#line 1432 "awkgram.y"
+#line 1431 "awkgram.y"
     {
                (yyvsp[(2) - (2)])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
     break;
 
-  case 137:
+  case 138:
 /* Line 1792 of yacc.c  */
-#line 1437 "awkgram.y"
+#line 1436 "awkgram.y"
     {
                (yyvsp[(2) - (2)])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[(1) - (2)]), NULL, (yyvsp[(2) - 
(2)]));
          }
     break;
 
-  case 138:
+  case 139:
 /* Line 1792 of yacc.c  */
-#line 1442 "awkgram.y"
+#line 1441 "awkgram.y"
     {
                if (do_lint_old) {
                    warning_ln((yyvsp[(4) - (5)])->source_line,
@@ -3657,62 +3657,62 @@ regular_print:
          }
     break;
 
-  case 139:
+  case 140:
 /* Line 1792 of yacc.c  */
-#line 1467 "awkgram.y"
+#line 1466 "awkgram.y"
     {
                  (yyval) = mk_getline((yyvsp[(3) - (4)]), (yyvsp[(4) - (4)]), 
(yyvsp[(1) - (4)]), (yyvsp[(2) - (4)])->redir_type);
                  bcfree((yyvsp[(2) - (4)]));
                }
     break;
 
-  case 140:
-/* Line 1792 of yacc.c  */
-#line 1473 "awkgram.y"
-    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
-    break;
-
   case 141:
 /* Line 1792 of yacc.c  */
-#line 1475 "awkgram.y"
+#line 1472 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 142:
 /* Line 1792 of yacc.c  */
-#line 1477 "awkgram.y"
+#line 1474 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 143:
 /* Line 1792 of yacc.c  */
-#line 1479 "awkgram.y"
+#line 1476 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 144:
 /* Line 1792 of yacc.c  */
-#line 1481 "awkgram.y"
+#line 1478 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 145:
 /* Line 1792 of yacc.c  */
-#line 1483 "awkgram.y"
+#line 1480 "awkgram.y"
     { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
     break;
 
   case 146:
 /* Line 1792 of yacc.c  */
-#line 1488 "awkgram.y"
+#line 1482 "awkgram.y"
+    { (yyval) = mk_binary((yyvsp[(1) - (3)]), (yyvsp[(3) - (3)]), (yyvsp[(2) - 
(3)])); }
+    break;
+
+  case 147:
+/* Line 1792 of yacc.c  */
+#line 1487 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
     break;
 
-  case 147:
+  case 148:
 /* Line 1792 of yacc.c  */
-#line 1492 "awkgram.y"
+#line 1491 "awkgram.y"
     {
                if ((yyvsp[(2) - (2)])->opcode == Op_match_rec) {
                        (yyvsp[(2) - (2)])->opcode = Op_nomatch;
@@ -3746,15 +3746,15 @@ regular_print:
           }
     break;
 
-  case 148:
+  case 149:
 /* Line 1792 of yacc.c  */
-#line 1524 "awkgram.y"
+#line 1523 "awkgram.y"
     { (yyval) = (yyvsp[(2) - (3)]); }
     break;
 
-  case 149:
+  case 150:
 /* Line 1792 of yacc.c  */
-#line 1526 "awkgram.y"
+#line 1525 "awkgram.y"
     {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@ -3762,9 +3762,9 @@ regular_print:
          }
     break;
 
-  case 150:
+  case 151:
 /* Line 1792 of yacc.c  */
-#line 1532 "awkgram.y"
+#line 1531 "awkgram.y"
     {
                (yyval) = snode((yyvsp[(3) - (4)]), (yyvsp[(1) - (4)]));
                if ((yyval) == NULL)
@@ -3772,9 +3772,9 @@ regular_print:
          }
     break;
 
-  case 151:
+  case 152:
 /* Line 1792 of yacc.c  */
-#line 1538 "awkgram.y"
+#line 1537 "awkgram.y"
     {
                static bool warned = false;
 
@@ -3789,43 +3789,43 @@ regular_print:
          }
     break;
 
-  case 154:
+  case 155:
 /* Line 1792 of yacc.c  */
-#line 1553 "awkgram.y"
+#line 1552 "awkgram.y"
     {
                (yyvsp[(1) - (2)])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
     break;
 
-  case 155:
+  case 156:
 /* Line 1792 of yacc.c  */
-#line 1558 "awkgram.y"
+#line 1557 "awkgram.y"
     {
                (yyvsp[(1) - (2)])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[(2) - (2)]), NULL, (yyvsp[(1) - 
(2)]));
          }
     break;
 
-  case 156:
+  case 157:
 /* Line 1792 of yacc.c  */
-#line 1563 "awkgram.y"
+#line 1562 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
     break;
 
-  case 157:
+  case 158:
 /* Line 1792 of yacc.c  */
-#line 1567 "awkgram.y"
+#line 1566 "awkgram.y"
     {
                (yyval) = list_create((yyvsp[(1) - (1)]));
          }
     break;
 
-  case 158:
+  case 159:
 /* Line 1792 of yacc.c  */
-#line 1571 "awkgram.y"
+#line 1570 "awkgram.y"
     {
                if ((yyvsp[(2) - (2)])->lasti->opcode == Op_push_i
                        && ((yyvsp[(2) - (2)])->lasti->memory->flags & 
(STRCUR|STRING)) == 0
@@ -3842,9 +3842,9 @@ regular_print:
          }
     break;
 
-  case 159:
+  case 160:
 /* Line 1792 of yacc.c  */
-#line 1586 "awkgram.y"
+#line 1585 "awkgram.y"
     {
            /*
             * was: $$ = $2
@@ -3856,18 +3856,18 @@ regular_print:
          }
     break;
 
-  case 160:
+  case 161:
 /* Line 1792 of yacc.c  */
-#line 1599 "awkgram.y"
+#line 1598 "awkgram.y"
     {
                func_use((yyvsp[(1) - (1)])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[(1) - (1)]);
          }
     break;
 
-  case 161:
+  case 162:
 /* Line 1792 of yacc.c  */
-#line 1604 "awkgram.y"
+#line 1603 "awkgram.y"
     {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -3902,9 +3902,9 @@ regular_print:
          }
     break;
 
-  case 162:
+  case 163:
 /* Line 1792 of yacc.c  */
-#line 1640 "awkgram.y"
+#line 1639 "awkgram.y"
     {
                param_sanity((yyvsp[(3) - (4)]));
                (yyvsp[(1) - (4)])->opcode = Op_func_call;
@@ -3920,47 +3920,47 @@ regular_print:
          }
     break;
 
-  case 163:
+  case 164:
 /* Line 1792 of yacc.c  */
-#line 1657 "awkgram.y"
+#line 1656 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
-  case 164:
+  case 165:
 /* Line 1792 of yacc.c  */
-#line 1659 "awkgram.y"
+#line 1658 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
-  case 165:
+  case 166:
 /* Line 1792 of yacc.c  */
-#line 1664 "awkgram.y"
+#line 1663 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
-  case 166:
+  case 167:
 /* Line 1792 of yacc.c  */
-#line 1666 "awkgram.y"
+#line 1665 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
-  case 167:
+  case 168:
 /* Line 1792 of yacc.c  */
-#line 1671 "awkgram.y"
+#line 1670 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
-  case 168:
+  case 169:
 /* Line 1792 of yacc.c  */
-#line 1673 "awkgram.y"
+#line 1672 "awkgram.y"
     {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
     break;
 
-  case 169:
+  case 170:
 /* Line 1792 of yacc.c  */
-#line 1680 "awkgram.y"
+#line 1679 "awkgram.y"
     {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -3976,9 +3976,9 @@ regular_print:
          }
     break;
 
-  case 170:
+  case 171:
 /* Line 1792 of yacc.c  */
-#line 1697 "awkgram.y"
+#line 1696 "awkgram.y"
     {
                INSTRUCTION *t = (yyvsp[(2) - (3)]);
                if ((yyvsp[(2) - (3)]) == NULL) {
@@ -3994,29 +3994,29 @@ regular_print:
          }
     break;
 
-  case 171:
+  case 172:
 /* Line 1792 of yacc.c  */
-#line 1714 "awkgram.y"
+#line 1713 "awkgram.y"
     {  (yyval) = (yyvsp[(1) - (1)]); }
     break;
 
-  case 172:
+  case 173:
 /* Line 1792 of yacc.c  */
-#line 1716 "awkgram.y"
+#line 1715 "awkgram.y"
     {
                (yyval) = list_merge((yyvsp[(1) - (2)]), (yyvsp[(2) - (2)]));
          }
     break;
 
-  case 173:
+  case 174:
 /* Line 1792 of yacc.c  */
-#line 1723 "awkgram.y"
+#line 1722 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (2)]); }
     break;
 
-  case 174:
+  case 175:
 /* Line 1792 of yacc.c  */
-#line 1728 "awkgram.y"
+#line 1727 "awkgram.y"
     {
                char *var_name = (yyvsp[(1) - (1)])->lextok;
 
@@ -4026,9 +4026,9 @@ regular_print:
          }
     break;
 
-  case 175:
+  case 176:
 /* Line 1792 of yacc.c  */
-#line 1736 "awkgram.y"
+#line 1735 "awkgram.y"
     {
                char *arr = (yyvsp[(1) - (2)])->lextok;
                (yyvsp[(1) - (2)])->memory = variable((yyvsp[(1) - 
(2)])->source_line, arr, Node_var_new);
@@ -4037,9 +4037,9 @@ regular_print:
          }
     break;
 
-  case 176:
+  case 177:
 /* Line 1792 of yacc.c  */
-#line 1746 "awkgram.y"
+#line 1745 "awkgram.y"
     {
                INSTRUCTION *ip = (yyvsp[(1) - (1)])->nexti;
                if (ip->opcode == Op_push
@@ -4053,9 +4053,9 @@ regular_print:
          }
     break;
 
-  case 177:
+  case 178:
 /* Line 1792 of yacc.c  */
-#line 1758 "awkgram.y"
+#line 1757 "awkgram.y"
     {
                (yyval) = list_append((yyvsp[(2) - (3)]), (yyvsp[(1) - (3)]));
                if ((yyvsp[(3) - (3)]) != NULL)
@@ -4063,55 +4063,55 @@ regular_print:
          }
     break;
 
-  case 178:
+  case 179:
 /* Line 1792 of yacc.c  */
-#line 1767 "awkgram.y"
+#line 1766 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_postincrement;
          }
     break;
 
-  case 179:
+  case 180:
 /* Line 1792 of yacc.c  */
-#line 1771 "awkgram.y"
+#line 1770 "awkgram.y"
     {
                (yyvsp[(1) - (1)])->opcode = Op_postdecrement;
          }
     break;
 
-  case 180:
+  case 181:
 /* Line 1792 of yacc.c  */
-#line 1774 "awkgram.y"
+#line 1773 "awkgram.y"
     { (yyval) = NULL; }
     break;
 
-  case 182:
+  case 183:
 /* Line 1792 of yacc.c  */
-#line 1782 "awkgram.y"
+#line 1781 "awkgram.y"
     { yyerrok; }
     break;
 
-  case 183:
+  case 184:
 /* Line 1792 of yacc.c  */
-#line 1786 "awkgram.y"
+#line 1785 "awkgram.y"
     { yyerrok; }
     break;
 
-  case 186:
+  case 187:
 /* Line 1792 of yacc.c  */
-#line 1795 "awkgram.y"
+#line 1794 "awkgram.y"
     { yyerrok; }
     break;
 
-  case 187:
+  case 188:
 /* Line 1792 of yacc.c  */
-#line 1799 "awkgram.y"
+#line 1798 "awkgram.y"
     { (yyval) = (yyvsp[(1) - (1)]); yyerrok; }
     break;
 
-  case 188:
+  case 189:
 /* Line 1792 of yacc.c  */
-#line 1803 "awkgram.y"
+#line 1802 "awkgram.y"
     { yyerrok; }
     break;
 
@@ -4349,7 +4349,7 @@ yyreturn:
 
 
 /* Line 2055 of yacc.c  */
-#line 1805 "awkgram.y"
+#line 1804 "awkgram.y"
 
 
 struct token {
@@ -5686,6 +5686,14 @@ retry:
                break;
 
        case ':':
+               if (! do_traditional) {
+                       if (nextc() == '=') {
+                               yylval = GET_INSTRUCTION(Op_assign_const);
+                               return lasttok = ASSIGN_CONST;
+                       }
+                       pushback();
+               }
+               /* fall through */
        case '?':
                yylval = GET_INSTRUCTION(Op_cond_exp);
                if (! do_posix)
@@ -5881,7 +5889,7 @@ retry:
                        return lasttok = c;
                }
                did_newline++;
-               --lexptr;       /* pick up } next time */
+               --lexptr;       /* pick up right brace next time */
                return lasttok = NEWLINE;
 
        case '"':
@@ -6602,9 +6610,15 @@ parms_shadow(INSTRUCTION *pc, bool *shadow)
 void
 valinfo(NODE *n, Func_print print_func, FILE *fp)
 {
-       if (n == Nnull_string)
+       if (n == Nnull_string) {
                print_func(fp, "uninitialized scalar\n");
-       else if (n->flags & STRING) {
+               return;
+       }
+
+       if (n->flags & VAR_CONST)
+               print_func(fp, "defined constant ");
+
+       if (n->flags & STRING) {
                pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', false);
                print_func(fp, "\n");
        } else if (n->flags & NUMBER) {
@@ -7576,7 +7590,8 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
                cant_happen();
        }
 
-       tp->do_reference = (op->opcode != Op_assign);   /* check for 
uninitialized reference */
+       tp->do_reference = (op->opcode != Op_assign     /* check for 
uninitialized reference */
+                               && op->opcode != Op_assign_const);
 
        if (rhs != NULL)
                ip = list_merge(rhs, lhs);
diff --git a/awkgram.y b/awkgram.y
index 7d2e11f..bf2ebad 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -161,7 +161,7 @@ extern double fmod(double x, double y);
 %token FUNC_CALL NAME REGEXP FILENAME
 %token YNUMBER YSTRING
 %token RELOP IO_OUT IO_IN
-%token ASSIGNOP ASSIGN MATCHOP CONCAT_OP
+%token ASSIGNOP ASSIGN ASSIGN_CONST MATCHOP CONCAT_OP
 %token SUBSCRIPT
 %token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE
 %token LEX_SWITCH LEX_CASE LEX_DEFAULT LEX_WHILE LEX_DO LEX_FOR LEX_BREAK 
LEX_CONTINUE
@@ -176,7 +176,7 @@ extern double fmod(double x, double y);
 %token NEWLINE
 
 /* Lowest to highest */
-%right ASSIGNOP ASSIGN SLASH_BEFORE_EQUAL
+%right ASSIGNOP ASSIGN ASSIGN_CONST SLASH_BEFORE_EQUAL
 %right '?' ':'
 %left LEX_OR
 %left LEX_AND
@@ -657,9 +657,6 @@ statement
                INSTRUCTION *ip;
                char *var_name = $3->lextok;
 
-               if ($3->memory->type == Node_var_const)
-                       fatal(_("cannot use defined constant as loop variable 
in `for' statement"));
-
                if ($8 != NULL
                                && $8->lasti->opcode == Op_K_delete
                                && $8->lasti->expr_count == 1
@@ -1315,6 +1312,8 @@ assign_operator
          { $$ = $1; }
        | ASSIGNOP
          { $$ = $1; }
+       | ASSIGN_CONST
+         { $$ = $1; }
        | SLASH_BEFORE_EQUAL ASSIGN   /* `/=' */
          {     
                $2->opcode = Op_assign_quotient;
@@ -3138,6 +3137,14 @@ retry:
                break;
 
        case ':':
+               if (! do_traditional) {
+                       if (nextc() == '=') {
+                               yylval = GET_INSTRUCTION(Op_assign_const);
+                               return lasttok = ASSIGN_CONST;
+                       }
+                       pushback();
+               }
+               /* fall through */
        case '?':
                yylval = GET_INSTRUCTION(Op_cond_exp);
                if (! do_posix)
@@ -3333,7 +3340,7 @@ retry:
                        return lasttok = c;
                }
                did_newline++;
-               --lexptr;       /* pick up } next time */
+               --lexptr;       /* pick up right brace next time */
                return lasttok = NEWLINE;
 
        case '"':
@@ -4054,9 +4061,15 @@ parms_shadow(INSTRUCTION *pc, bool *shadow)
 void
 valinfo(NODE *n, Func_print print_func, FILE *fp)
 {
-       if (n == Nnull_string)
+       if (n == Nnull_string) {
                print_func(fp, "uninitialized scalar\n");
-       else if (n->flags & STRING) {
+               return;
+       }
+
+       if (n->flags & VAR_CONST)
+               print_func(fp, "defined constant ");
+
+       if (n->flags & STRING) {
                pp_string_fp(print_func, fp, n->stptr, n->stlen, '"', false);
                print_func(fp, "\n");
        } else if (n->flags & NUMBER) {
@@ -5028,7 +5041,8 @@ mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op)
                cant_happen();
        }
 
-       tp->do_reference = (op->opcode != Op_assign);   /* check for 
uninitialized reference */
+       tp->do_reference = (op->opcode != Op_assign     /* check for 
uninitialized reference */
+                               && op->opcode != Op_assign_const);
 
        if (rhs != NULL)
                ip = list_merge(rhs, lhs);
diff --git a/builtin.c b/builtin.c
index 7327212..f9262ae 100644
--- a/builtin.c
+++ b/builtin.c
@@ -2727,6 +2727,8 @@ set_how_many:
                        t = POP_STRING();
                else {
                        lhs = POP_ADDRESS();
+                       if (((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        t = force_string(*lhs);
                }
        }
diff --git a/debug.c b/debug.c
index ad7a058..72abc9b 100644
--- a/debug.c
+++ b/debug.c
@@ -954,10 +954,6 @@ print_symbol(NODE *r, bool isparam)
                        r->var_update();
                valinfo(r->var_value, fprintf, out_fp);
                break;
-       case Node_var_const:
-               fprintf(out_fp, "defined constant ");
-               valinfo(r->var_value, fprintf, out_fp);
-               break;
        case Node_var_array:
                fprintf(out_fp, "array, %ld elements\n", assoc_length(r));
                break;
@@ -1231,10 +1227,9 @@ do_set_var(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
                        r->var_value = dupnode(Nnull_string);
                        /* fall through */
                case Node_var:
-               case Node_var_const:
-                       if (r->type == Node_var_const)
-                               d_warning(_("`%s' is a constant (changing 
anyway)"), name);
                        lhs = &r->var_value;
+                       if (((*lhs)->flags & VAR_CONST) != 0)
+                               d_warning(_("`%s' is a constant (changing 
anyway)"), name);
                        unref(*lhs);
                        *lhs = dupnode(val);
                        if (pname == NULL && r->var_assign != NULL)
@@ -1711,7 +1706,6 @@ watchpoint_triggered(struct list_item *w)
        } else {
                switch (symbol->type) {
                case Node_var:
-               case Node_var_const:
                        t2 = symbol->var_value;
                        break;
                case Node_var_array:
@@ -1796,7 +1790,7 @@ initialize_watch_item(struct list_item *w)
        } else {
                if (symbol->type == Node_var_new)
                        w->cur_value = (NODE *) 0;
-               else if (symbol->type == Node_var || symbol->type == 
Node_var_const) {
+               else if (symbol->type == Node_var) {
                        r = symbol->var_value;
                        w->cur_value = dupnode(r);
                } else if (symbol->type == Node_var_array) {
@@ -3717,7 +3711,6 @@ print_memory(NODE *m, NODE *func, Func_print print_func, 
FILE *fp)
                        break;
 
                case Node_var:
-               case Node_var_const:
                case Node_var_new:
                case Node_var_array:
                        print_func(fp, "%s", m->vname);
@@ -4967,7 +4960,7 @@ do_print_f(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
                                goto done;
                        if (r->type == Node_var_new)
                                tmp[i] = Nnull_string;
-                       else if (r->type != Node_var && r->type != 
Node_var_const) {
+                       else if (r->type != Node_var) {
                                d_error(_("`%s' is not a scalar variable"), 
name);
                                goto done;
                        } else
diff --git a/eval.c b/eval.c
index 5de4fae..e096462 100644
--- a/eval.c
+++ b/eval.c
@@ -235,7 +235,6 @@ static const char *const nodetypes[] = {
        "Node_regex",
        "Node_dynregex",
        "Node_var",
-       "Node_var_const",
        "Node_var_array",
        "Node_var_new",
        "Node_param_list",
@@ -289,6 +288,7 @@ static struct optypetab {
        { "Op_field_spec", "$" },
        { "Op_not", "! " },
        { "Op_assign", " = " },
+       { "Op_assign_const", " := " },
        { "Op_store_var", " = " },
        { "Op_store_sub", " = " },
        { "Op_store_field", " = " },
@@ -1136,10 +1136,8 @@ r_get_lhs(NODE *n, bool reference)
                break;
 
        case Node_var:
-               break;
-
-       case Node_var_const:
-               fatal(_("cannot assign to defined constant"));
+               if ((n->var_value->flags & VAR_CONST) != 0)
+                       fatal(_("cannot assign to defined constant"));
                break;
 
        default:
@@ -1316,12 +1314,6 @@ setup_frame(INSTRUCTION *pc)
                        r->prev_array = m;
                        break;
 
-               case Node_var_const:
-                       /*
-                        * constant passed by value as parameter
-                        * becomes mutable in the function.
-                        */
-                       /* FALL THROUGH */
                case Node_var:
                        /* Untyped (Node_var_new) variable as param became a
                         * scalar during evaluation of expression for a
@@ -1550,7 +1542,7 @@ op_assign(OPCODE op)
        AWKNUM x = 0.0, x1, x2;
 
        lhs = POP_ADDRESS();
-       if ((*lhs)->type == Node_var_const)
+       if (((*lhs)->flags & VAR_CONST) != 0)
                fatal(_("cannot assign to defined constant"));
 
        t1 = *lhs;
diff --git a/gawkapi.c b/gawkapi.c
index 640db0d..f20d7e9 100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@ -586,7 +586,7 @@ sym_update_real(awk_ext_id_t id,
                                        Node_var);
                        node->var_value = awk_value_to_node(value);
                        if (is_const)
-                               node->type = Node_var_const;
+                               node->var_value->flags |= VAR_CONST;
                }
 
                return true;
@@ -609,8 +609,8 @@ sym_update_real(awk_ext_id_t id,
                if (value->val_type != AWK_UNDEFINED) {
                        if (node->type == Node_var_new)
                                node->type = Node_var;
-                       else if (is_const)
-                               node->type = Node_var_const;
+                       if (is_const)
+                               node->var_value->flags |= VAR_CONST;
                }
 
                return true;
diff --git a/interpret.h b/interpret.h
index dcd61a9..cfac956 100644
--- a/interpret.h
+++ b/interpret.h
@@ -151,7 +151,6 @@ top:
                                
                        switch (m->type) {
                        case Node_var:
-                       case Node_var_const:
                                if (do_lint && var_uninitialized(m))
                                        lintwarn(isparam ?
                                                _("reference to uninitialized 
argument `%s'") :
@@ -193,8 +192,8 @@ uninitialized_scalar:
                        m = pc->memory;
                        if (m->type == Node_param_list)
                                m = GET_PARAM(m->param_cnt);
-                       if (m->type == Node_var || m->type == Node_var_const) {
-                               m = m->var_value;
+                       if (m->type == Node_var) {
+                               m = dupnode(m->var_value);
                                UPREF(m);
                                PUSH(m);
                                break;
@@ -557,7 +556,7 @@ mod:
                case Op_predecrement:
                        x = op == Op_preincrement ? 1.0 : -1.0;
                        lhs = TOP_ADDRESS();
-                       if ((*lhs)->type == Node_var_const)
+                       if (((*lhs)->flags & VAR_CONST) != 0)
                                fatal(_("cannot assign to defined constant"));
                        t1 = *lhs;
                        force_number(t1);
@@ -577,7 +576,7 @@ mod:
                case Op_postdecrement:
                        x = op == Op_postincrement ? 1.0 : -1.0;
                        lhs = TOP_ADDRESS();
-                       if ((*lhs)->type == Node_var_const)
+                       if (((*lhs)->flags & VAR_CONST) != 0)
                                fatal(_("cannot assign to defined constant"));
                        t1 = *lhs;
                        force_number(t1);
@@ -652,6 +651,8 @@ mod:
                         */
        
                        lhs = get_lhs(pc->memory, false);
+                       if (*lhs != NULL && ((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        unref(*lhs);
                        r = pc->initval;        /* constant initializer */
                        if (r == NULL)
@@ -683,6 +684,8 @@ mod:
                case Op_assign_concat:
                        /* x = x ... string concatenation optimization */
                        lhs = get_lhs(pc->memory, false);
+                       if (*lhs != NULL && ((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        t1 = force_string(*lhs);
                        t2 = POP_STRING();
 
@@ -728,6 +731,8 @@ mod:
 
                case Op_assign:
                        lhs = POP_ADDRESS();
+                       if (*lhs != NULL && ((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        r = TOP_SCALAR();
                        unref(*lhs);
                        *lhs = r;
@@ -735,6 +740,18 @@ mod:
                        REPLACE(r);
                        break;
 
+               case Op_assign_const:
+                       lhs = POP_ADDRESS();
+                       if (*lhs != NULL && ((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
+                       r = TOP_SCALAR();
+                       unref(*lhs);
+                       *lhs = r;
+                       (*lhs)->flags |= VAR_CONST;
+                       UPREF(r);
+                       REPLACE(r);
+                       break;
+
                case Op_subscript_assign:
                        /* conditionally execute post-assignment routine for an 
array element */ 
 
@@ -839,6 +856,8 @@ mod:
                case Op_K_delete_loop:
                        t1 = POP_ARRAY();
                        lhs = POP_ADDRESS();    /* item */
+                       if (((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        do_delete_loop(t1, lhs);
                        break;
 
@@ -913,6 +932,8 @@ arrayfor:
 
                        t1 = r->for_list[r->cur_idx];
                        lhs = get_lhs(pc->array_var, false);
+                       if (((*lhs)->flags & VAR_CONST) != 0)
+                               fatal(_("cannot assign to defined constant"));
                        unref(*lhs);
                        *lhs = dupnode(t1);
                        break;
diff --git a/io.c b/io.c
index c4e34c5..2b05e05 100644
--- a/io.c
+++ b/io.c
@@ -2318,8 +2318,11 @@ do_getline_redir(int into_variable, enum redirval 
redirtype)
        NODE **lhs = NULL;
        int redir_error = 0;
 
-       if (into_variable)
+       if (into_variable) {
                lhs = POP_ADDRESS();
+               if (((*lhs)->flags & VAR_CONST) != 0)
+                       fatal(_("cannot assign to defined constant"));
+       }
 
        assert(redirtype != redirect_none);
        redir_exp = TOP();
@@ -2405,6 +2408,8 @@ do_getline(int into_variable, IOBUF *iop)
        else {                  /* assignment to variable */
                NODE **lhs;
                lhs = POP_ADDRESS();
+               if (((*lhs)->flags & VAR_CONST) != 0)
+                       fatal(_("cannot assign to defined constant"));
                unref(*lhs);
                *lhs = make_string(s, cnt);
                (*lhs)->flags |= MAYBE_NUM;
diff --git a/node.c b/node.c
index 02c78ae..642604a 100644
--- a/node.c
+++ b/node.c
@@ -270,15 +270,20 @@ r_dupnode(NODE *n)
        assert(n->type == Node_val);
 
 #ifdef GAWKDEBUG
+       if ((n->flags & VAR_CONST) != 0)
+               goto copynode;
+
        if ((n->flags & MALLOC) != 0) {
                n->valref++;
                return n;
        }
+
+copynode:
 #endif
 
        getnode(r);
        *r = *n;
-       r->flags &= ~FIELD;
+       r->flags &= ~(FIELD|VAR_CONST);
        r->flags |= MALLOC;
        r->valref = 1;
 #if MBS_SUPPORT
diff --git a/profile.c b/profile.c
index 1ea7573..4764fe0 100644
--- a/profile.c
+++ b/profile.c
@@ -259,7 +259,6 @@ pprint(INSTRUCTION *startp, INSTRUCTION *endp, bool 
in_for_header)
                                break;
 
                        case Node_var:
-                       case Node_var_const:
                        case Node_var_new:
                        case Node_var_array:
                                if (m->vname != NULL)
diff --git a/symbol.c b/symbol.c
index d84df62..354bfca 100644
--- a/symbol.c
+++ b/symbol.c
@@ -257,7 +257,6 @@ destroy_symbol(NODE *r)
                break;
 
        case Node_var: 
-       case Node_var_const: 
                unref(r->var_value);
                break;
 
@@ -282,7 +281,7 @@ make_symbol(char *name, NODETYPE type)
        memset(r, '\0', sizeof(NODE));
        if (type == Node_var_array)
                null_array(r);
-       else if (type == Node_var || type == Node_var_const)
+       else if (type == Node_var)
                r->var_value = dupnode(Nnull_string);
        r->vname = name;
        r->type = type;
@@ -460,10 +459,6 @@ print_vars(NODE **table, int (*print_func)(FILE *, const 
char *, ...), FILE *fp)
                        print_func(fp, "untyped variable\n");
                else if (r->type == Node_var)
                        valinfo(r->var_value, print_func, fp);
-               else if (r->type == Node_var_const) {
-                       print_func(fp, "defined constant ");
-                       valinfo(r->var_value, print_func, fp);
-               }
        }
 }
 
diff --git a/test/ChangeLog b/test/ChangeLog
index 675d67f..3e72ec5 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-10         Arnold D. Robbins     <address@hidden>
+
+       * Makefile.am (assignconst): Add more tests. Put data in "15"
+       which uses getline.
+       * assignconst.awk, assignconst.ok: Update with more tests.
+
 2013-03-04         Arnold D. Robbins     <address@hidden>
 
        * assignconst.awk, assignconst.ok: New file.
diff --git a/test/Makefile.am b/test/Makefile.am
index a0dfcf9..9e265ad 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -1755,9 +1755,11 @@ testext::
 
 assignconst:
        @echo $@
-       @for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; \
+       @echo foo > 15
+       @for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17; \
        do AWKPATH=$(srcdir) $(AWK) -f address@hidden $$i ; \
        done 2>&1 | grep -v at_exit > _$@
+       @rm -f 15
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
 readdir:
diff --git a/test/Makefile.in b/test/Makefile.in
index 0c97877..a3eaf92 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -2135,9 +2135,11 @@ testext::
 
 assignconst:
        @echo $@
-       @for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14; \
+       @echo foo > 15
+       @for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17; \
        do AWKPATH=$(srcdir) $(AWK) -f address@hidden $$i ; \
        done 2>&1 | grep -v at_exit > _$@
+       @rm -f 15
        @-$(CMP) $(srcdir)/address@hidden _$@ && rm -f _$@
 
 readdir:
diff --git a/test/assignconst.awk b/test/assignconst.awk
index 907987c..39fc0db 100644
--- a/test/assignconst.awk
+++ b/test/assignconst.awk
@@ -46,6 +46,17 @@ BEGIN {
                        print answer_num, a[answer_num]
                break
        case 14:
+               a[1] = 1
+               for (answer_num in a)
+                       delete a[answer_num]
+               break
+       case 15:
+               getline answer_num
+               break
+       case 16:
+               getline answer_num < "Makefile"
+               break
+       case 17:
                test_func(answer_num)
                break
        }
diff --git a/test/assignconst.ok b/test/assignconst.ok
index 97698b2..ee61078 100644
--- a/test/assignconst.ok
+++ b/test/assignconst.ok
@@ -39,4 +39,13 @@ test: 13
 gawk: assignconst.awk:45: fatal: cannot assign to defined constant
 
 test: 14
+gawk: assignconst.awk:51: fatal: cannot assign to defined constant
+
+test: 15
+gawk: assignconst.awk:54: (FILENAME=15 FNR=1) fatal: cannot assign to defined 
constant
+
+test: 16
+gawk: assignconst.awk:57: fatal: cannot assign to defined constant
+
+test: 17
 in test_func, val now = 43

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog            |   33 ++
 awk.h                |    7 +-
 awkgram.c            | 1541 +++++++++++++++++++++++++-------------------------
 awkgram.y            |   32 +-
 builtin.c            |    2 +
 debug.c              |   15 +-
 eval.c               |   16 +-
 gawkapi.c            |    6 +-
 interpret.h          |   31 +-
 io.c                 |    7 +-
 node.c               |    7 +-
 profile.c            |    1 -
 symbol.c             |    7 +-
 test/ChangeLog       |    6 +
 test/Makefile.am     |    4 +-
 test/Makefile.in     |    4 +-
 test/assignconst.awk |   11 +
 test/assignconst.ok  |    9 +
 18 files changed, 924 insertions(+), 815 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]