gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, print-exp, created. gawk-4.1.0-1002-g24e


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, print-exp, created. gawk-4.1.0-1002-g24eaa2a
Date: Sun, 07 Dec 2014 19:22:50 +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, print-exp has been created
        at  24eaa2af13b4dc19ee4a71fdd13dcbe7ed5033b2 (commit)

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

commit 24eaa2af13b4dc19ee4a71fdd13dcbe7ed5033b2
Author: Arnold D. Robbins <address@hidden>
Date:   Sat Dec 6 21:49:25 2014 +0200

    Start on changes to let print/printf return a value.

diff --git a/ChangeLog b/ChangeLog
index 5119ac5..dc87e53 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2014-12-06         Arnold D. Robbins     <address@hidden>
+
+       Start on changes to allow print/printf to return a value.
+
+       * awkgram.y (LEX_PRINT_EXP, LEX_PRINTF_EXP): New tokens.
+       (print_expression, print_exp): New non-terminals.
+       (mk_print): New function.
+       (exp -> print_expression): Add new production.
+       (yylex): Ugly hack on the scanner to return the expression version
+       of the tokens if not in a statement sort of context.
+
 2014-11-26         Arnold D. Robbins     <address@hidden>
 
        * builtin.c (do_sub): Improve wording of gensub warnings.
diff --git a/awkgram.c b/awkgram.c
index ddd41d5..00b2b0b 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -114,6 +114,7 @@ static INSTRUCTION *mk_binary(INSTRUCTION *s1, INSTRUCTION 
*s2, INSTRUCTION *op)
 static INSTRUCTION *mk_boolean(INSTRUCTION *left, INSTRUCTION *right, 
INSTRUCTION *op);
 static INSTRUCTION *mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op);
 static INSTRUCTION *mk_getline(INSTRUCTION *op, INSTRUCTION *opt_var, 
INSTRUCTION *redir, int redirtype);
+static INSTRUCTION *mk_print(INSTRUCTION *op, INSTRUCTION *exp_list, 
INSTRUCTION *redir);
 static NODE *make_regnode(int type, NODE *exp);
 static int count_expressions(INSTRUCTION **list, bool isarg);
 static INSTRUCTION *optimize_assignment(INSTRUCTION *exp);
@@ -202,7 +203,7 @@ extern double fmod(double x, double y);
 
 #define YYSTYPE INSTRUCTION *
 
-#line 206 "awkgram.c" /* yacc.c:339  */
+#line 207 "awkgram.c" /* yacc.c:339  */
 
 # ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
@@ -267,24 +268,26 @@ extern int yydebug;
     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
+    LEX_PRINT_EXP = 291,
+    LEX_PRINTF_EXP = 292,
+    LEX_BEGINFILE = 293,
+    LEX_ENDFILE = 294,
+    LEX_GETLINE = 295,
+    LEX_NEXTFILE = 296,
+    LEX_IN = 297,
+    LEX_AND = 298,
+    LEX_OR = 299,
+    INCREMENT = 300,
+    DECREMENT = 301,
+    LEX_BUILTIN = 302,
+    LEX_LENGTH = 303,
+    LEX_EOF = 304,
+    LEX_INCLUDE = 305,
+    LEX_EVAL = 306,
+    LEX_LOAD = 307,
+    NEWLINE = 308,
+    SLASH_BEFORE_EQUAL = 309,
+    UNARY = 310
   };
 #endif
 /* Tokens.  */
@@ -321,24 +324,26 @@ extern int yydebug;
 #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 LEX_PRINT_EXP 291
+#define LEX_PRINTF_EXP 292
+#define LEX_BEGINFILE 293
+#define LEX_ENDFILE 294
+#define LEX_GETLINE 295
+#define LEX_NEXTFILE 296
+#define LEX_IN 297
+#define LEX_AND 298
+#define LEX_OR 299
+#define INCREMENT 300
+#define DECREMENT 301
+#define LEX_BUILTIN 302
+#define LEX_LENGTH 303
+#define LEX_EOF 304
+#define LEX_INCLUDE 305
+#define LEX_EVAL 306
+#define LEX_LOAD 307
+#define NEWLINE 308
+#define SLASH_BEFORE_EQUAL 309
+#define UNARY 310
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -356,7 +361,7 @@ int yyparse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 360 "awkgram.c" /* yacc.c:358  */
+#line 365 "awkgram.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -598,21 +603,21 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1155
+#define YYLAST   1356
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  75
+#define YYNTOKENS  77
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  65
+#define YYNNTS  68
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  188
+#define YYNRULES  193
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  335
+#define YYNSTATES  342
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   308
+#define YYMAXUTOK   310
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -624,16 +629,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,    65,     2,     2,    68,    64,     2,     2,
+      69,    70,    62,    60,    57,    61,     2,    63,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    56,    76,
+      58,     2,    59,    55,    71,     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,    72,     2,    73,    67,     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,    74,     2,    75,     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,
@@ -651,32 +656,34 @@ 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,    54,
+      66
 };
 
 #if YYDEBUG
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   205,   205,   207,   212,   213,   219,   231,   235,   246,
-     252,   257,   265,   273,   275,   280,   288,   290,   296,   304,
-     314,   340,   353,   366,   373,   383,   395,   397,   399,   405,
-     410,   411,   415,   450,   449,   483,   485,   490,   496,   524,
-     529,   530,   534,   536,   538,   545,   635,   677,   719,   832,
-     839,   846,   856,   865,   874,   883,   894,   910,   909,   933,
-     945,   945,  1043,  1043,  1076,  1106,  1112,  1113,  1119,  1120,
-    1127,  1132,  1144,  1158,  1160,  1168,  1173,  1175,  1183,  1185,
-    1194,  1195,  1203,  1208,  1208,  1219,  1223,  1231,  1232,  1235,
-    1237,  1242,  1243,  1252,  1253,  1258,  1263,  1269,  1271,  1273,
-    1280,  1281,  1287,  1288,  1293,  1295,  1300,  1302,  1310,  1315,
-    1324,  1331,  1333,  1335,  1351,  1361,  1368,  1370,  1375,  1377,
-    1379,  1387,  1389,  1394,  1396,  1401,  1403,  1405,  1455,  1457,
-    1459,  1461,  1463,  1465,  1467,  1469,  1483,  1488,  1493,  1518,
-    1524,  1526,  1528,  1530,  1532,  1534,  1539,  1543,  1575,  1577,
-    1583,  1589,  1602,  1603,  1604,  1609,  1614,  1618,  1622,  1637,
-    1650,  1655,  1691,  1709,  1710,  1716,  1717,  1722,  1724,  1731,
-    1748,  1765,  1767,  1774,  1779,  1787,  1797,  1809,  1818,  1822,
-    1826,  1830,  1834,  1838,  1841,  1843,  1847,  1851,  1855
+       0,   207,   207,   209,   214,   215,   221,   233,   237,   248,
+     254,   259,   267,   275,   277,   282,   290,   292,   298,   306,
+     316,   342,   355,   368,   375,   385,   397,   399,   401,   407,
+     412,   413,   417,   452,   451,   485,   487,   492,   498,   526,
+     531,   532,   536,   538,   540,   547,   637,   679,   721,   834,
+     841,   848,   858,   867,   876,   885,   896,   912,   911,   935,
+     939,   939,   954,   954,   959,   959,   992,  1022,  1028,  1029,
+    1035,  1036,  1043,  1048,  1060,  1074,  1076,  1084,  1089,  1091,
+    1099,  1101,  1106,  1108,  1117,  1118,  1126,  1131,  1131,  1142,
+    1146,  1154,  1155,  1158,  1160,  1165,  1166,  1175,  1176,  1181,
+    1186,  1192,  1194,  1196,  1203,  1204,  1210,  1211,  1216,  1218,
+    1223,  1225,  1233,  1238,  1247,  1254,  1256,  1258,  1274,  1284,
+    1291,  1293,  1295,  1300,  1302,  1304,  1312,  1314,  1319,  1321,
+    1326,  1328,  1330,  1380,  1382,  1384,  1386,  1388,  1390,  1392,
+    1394,  1408,  1413,  1418,  1443,  1449,  1451,  1453,  1455,  1457,
+    1459,  1464,  1468,  1500,  1502,  1508,  1514,  1527,  1528,  1529,
+    1534,  1539,  1543,  1547,  1562,  1575,  1580,  1616,  1634,  1635,
+    1641,  1642,  1647,  1649,  1656,  1673,  1690,  1692,  1699,  1704,
+    1712,  1722,  1734,  1743,  1747,  1751,  1755,  1759,  1763,  1766,
+    1768,  1772,  1776,  1780
 };
 #endif
 
@@ -691,25 +698,27 @@ static const char *const yytname[] =
   "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_NULLPTR
+  "LEX_FUNCTION", "LEX_PRINT_EXP", "LEX_PRINTF_EXP", "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",
+  "print_expression", "address@hidden", "simple_stmt", "address@hidden", 
"address@hidden",
+  "opt_simple_stmt", "case_statements", "case_statement", "case_value",
+  "print", "print_exp", "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_NULLPTR
 };
 #endif
 
@@ -723,60 +732,61 @@ 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,   309,    63,    58,    44,    60,    62,
+      43,    45,    42,    47,    37,    33,   310,    94,    36,    40,
+      41,    64,    91,    93,   123,   125,    59
 };
 # endif
 
-#define YYPACT_NINF -273
+#define YYPACT_NINF -278
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-273)))
+  (!!((Yystate) == (-278)))
 
-#define YYTABLE_NINF -104
+#define YYTABLE_NINF -108
 
 #define yytable_value_is_error(Yytable_value) \
-  (!!((Yytable_value) == (-104)))
+  (!!((Yytable_value) == (-108)))
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 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
+    -278,   400,  -278,  -278,   -46,     5,  -278,  -278,  -278,  -278,
+     151,  -278,  -278,  -278,  -278,    29,    29,    29,   -17,    22,
+    -278,  -278,  -278,  1229,  1229,  -278,  1229,  1256,   962,   193,
+    -278,    69,   -14,  -278,  -278,  -278,  -278,    18,   732,  1181,
+     362,   395,  -278,  -278,  -278,  -278,   304,   914,   962,  -278,
+       2,  -278,  -278,  -278,  -278,  -278,    37,    45,  -278,    65,
+    -278,  -278,  -278,   914,   914,    67,    61,    -3,    61,    61,
+    1154,    13,  -278,  -278,     9,   312,    44,    50,  -278,    77,
+    -278,  -278,  -278,    18,  -278,    77,  -278,   127,   674,  -278,
+    -278,  1154,   129,  1154,  1154,  1154,    77,  -278,  -278,  -278,
+    1154,    97,   362,  1229,  1229,  1229,  1229,  1229,  1229,  1229,
+    1229,  1229,  1229,  1229,  1229,  -278,  -278,  -278,  -278,   126,
+    1154,    71,   322,   881,    10,  -278,  -278,  -278,    30,  1229,
+    -278,    71,    71,   312,  -278,  -278,  -278,  1154,    77,  -278,
+     102,  1010,  -278,  -278,     8,     4,  -278,    19,     4,    18,
+    -278,   626,  -278,  -278,   962,   141,  -278,    17,  -278,   160,
+     245,  1297,  1154,   107,    29,   186,   186,    61,    61,    61,
+      61,   186,   186,    61,    61,    61,    61,  -278,   881,  -278,
+    -278,  -278,  -278,    71,    28,   362,  -278,  -278,   881,  -278,
+     129,  -278,   881,  -278,  -278,  -278,  -278,  -278,    81,  -278,
+      12,    83,    88,    77,    89,     4,     4,  -278,  -278,     4,
+    1154,     4,    77,  -278,  -278,     4,  -278,  -278,   881,  -278,
+      84,    77,     9,  -278,  -278,  1154,   881,  -278,    77,  -278,
+      40,  -278,  1154,  1154,  -278,   164,  1154,  1154,   818,  1058,
+    -278,  -278,  -278,     4,   881,  -278,  -278,  -278,   748,   626,
+      77,  -278,  -278,  -278,  1229,   881,  -278,  -278,  -278,   312,
+       4,     5,    94,   312,   312,   144,     6,  -278,    84,  -278,
+     141,  -278,  -278,  1181,    77,  -278,  -278,    24,  -278,  -278,
+    -278,    77,    77,   104,   129,    77,  -278,   818,  -278,  -278,
+     -14,   818,  1154,    71,   866,   162,  -278,  -278,   312,    77,
+     242,    77,    77,    11,    77,   818,    77,  1106,   818,  -278,
+     140,   115,  -278,   109,  -278,  -278,  1106,    71,  -278,  -278,
+    -278,   180,   181,  -278,   115,  -278,    77,  -278,    71,    77,
+    -278,  -278,    77,  -278,    77,   818,  -278,   474,   818,  -278,
+     550,  -278
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -784,64 +794,65 @@ static const yytype_int16 yypact[] =
      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,
-      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,     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
+       2,     0,     1,     6,     0,   179,   161,   162,    21,    22,
+       0,    82,    83,    23,    24,   168,     0,     0,     0,   156,
+       5,    91,    36,     0,     0,    35,     0,     0,     0,     0,
+       3,     0,     0,   151,    33,   122,    60,     4,    19,   121,
+     130,   131,   133,   157,   165,   181,   158,     0,     0,   176,
+       0,   180,    27,    26,    30,    31,     0,     0,    28,    95,
+     169,   159,   160,     0,     0,     0,   164,   158,   163,   152,
+       0,   185,   158,   110,     0,   108,     0,     0,   166,    93,
+     191,     7,     8,    40,    37,    93,     9,     0,     0,    92,
+     126,     0,     0,     0,     0,     0,    93,   127,   129,   128,
+       0,     0,   132,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   124,   123,   141,   142,     0,
+       0,     0,     0,   108,     0,   178,   177,    29,     0,     0,
+     140,     0,     0,     0,   183,   184,   182,   111,    93,   188,
+       0,     0,   153,    14,     0,     0,    17,     0,     0,    94,
+     186,     0,    41,    34,     0,    86,    84,   117,   118,   115,
+     116,     0,     0,   119,   168,   138,   139,   135,   136,   137,
+     134,   149,   150,   146,   147,   148,   145,   125,   114,   167,
+     175,   101,    99,     0,     0,    96,   154,   155,   112,   193,
+       0,   113,   109,    13,    10,    16,    11,    39,     0,    57,
+       0,     0,     0,    93,     0,     0,     0,    80,    81,     0,
+     104,     0,    93,    38,    51,     0,    62,    44,    67,    37,
+     189,    93,     0,    87,    61,     0,    20,   144,    93,   102,
+       0,   143,     0,   104,    64,     0,     0,     0,     0,    68,
+      52,    53,    54,     0,   105,    55,   187,    59,     0,     0,
+      93,   190,    42,    85,     0,   120,    32,   103,   100,     0,
+       0,   170,     0,     0,     0,     0,   179,    69,     0,    56,
+      86,    43,    25,    88,    93,    58,    65,     0,   172,   174,
+      66,    93,    93,     0,     0,    93,    63,     0,   171,   173,
+       0,     0,     0,     0,     0,    89,    70,    46,     0,    93,
+       0,    93,    93,     0,    93,     0,    93,    68,     0,    72,
+       0,     0,    71,     0,    47,    48,    68,     0,    90,    75,
+      78,     0,     0,    79,     0,   192,    93,    45,     0,    93,
+      77,    76,    93,    37,    93,     0,    37,     0,     0,    50,
+       0,    49
 };
 
   /* 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
+    -278,  -278,  -278,  -278,  -278,  -278,   159,  -278,  -278,  -278,
+    -113,  -278,  -278,  -212,   -80,  -149,  -278,  -278,  -278,  -278,
+    -234,  -278,  -278,  -277,  -278,  -278,  -278,  -278,  -278,   -43,
+     -66,  -278,  -278,     1,    87,  -278,  -278,  -278,   -19,    -9,
+     -20,    -1,  -278,  -278,  -278,   -39,   169,  -278,   194,  -278,
+     -12,    56,  -278,  -278,   -54,   -44,  -278,  -278,   -73,    -2,
+    -278,   -28,  -200,    46,  -278,   -30,   -98,    43
 };
 
   /* 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,    30,   145,   148,    31,    81,    57,    58,    32,
+      33,    87,    34,   151,    82,   213,   214,   233,    35,    88,
+     215,   248,   261,   268,   303,   312,   324,   216,    36,   155,
+     224,   254,   217,   149,   150,   130,   183,   184,   243,   156,
+     122,   218,   120,    99,   100,    39,    40,    41,    42,    43,
+      44,    59,   276,   277,   278,    49,    50,    51,    45,    46,
+     136,   219,   220,   142,   250,   221,   326,   141
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -849,306 +860,348 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 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,
-       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,
+      38,    85,    37,    84,    84,   267,   126,   249,    74,   193,
+     137,   137,   309,    60,    61,    62,   234,    78,   125,   158,
+     195,    67,    67,    47,    67,    72,    90,    75,   124,   229,
+     317,   181,    83,     5,   182,   310,   311,    67,   121,   328,
+     288,   257,   117,   118,   258,   143,   123,   123,   284,   271,
+     144,   146,    63,    78,   131,   132,   147,    21,   134,   135,
+      79,   -12,   123,   123,    21,   194,   138,   138,   196,   133,
+       4,    89,   -15,   267,    48,    97,    98,    48,    48,   139,
+      80,   235,   267,   180,   -12,   138,   -93,   123,   127,   265,
+     157,    64,   159,   160,   161,   -15,    48,    27,   -98,   163,
+     -97,    67,    67,    67,    67,    67,    67,    67,    67,    67,
+      67,    67,    67,   327,   128,    85,  -108,   231,    85,   178,
+     140,   337,    21,   129,   340,   240,   241,    67,   108,   242,
+      21,   245,   153,     5,   222,   247,   188,   164,   295,   177,
+     192,   139,   297,    79,   190,    80,    83,   319,   320,    83,
+     232,   223,   236,    75,    52,    53,   315,   237,   239,   318,
+      80,   226,    60,   269,   280,  -108,  -108,   179,   262,    90,
+     283,   325,   152,   292,    91,    85,    85,   186,   187,    85,
+     275,    85,   302,   162,   212,    85,   339,   330,   331,   341,
+     251,    86,    66,    68,    22,    69,     4,   323,    54,    55,
+     321,   322,    92,    25,   286,   270,    83,    83,   102,   244,
+      83,   293,    83,    85,   260,   273,    83,   279,    97,    98,
+     227,    71,    56,   289,   255,   189,   332,   230,     0,   228,
+      85,   259,   244,   279,     0,   263,   264,     0,   285,     0,
+       0,     0,     0,    76,    83,    77,     0,   123,   105,   106,
+     107,    90,    67,   108,    90,     0,    91,     0,     0,    91,
+       0,    83,   296,     0,   301,     0,     0,     0,   253,     0,
+     306,    67,   165,   166,   167,   168,   169,   170,   171,   172,
+     173,   174,   175,   176,    92,    93,    94,    92,    93,     0,
+     238,   298,     0,   300,     0,     0,     0,    95,   185,   246,
+      97,    98,     0,    97,    98,   274,     0,     0,   252,   281,
+     282,     0,     0,     0,     0,   256,   115,   116,    80,     0,
+       0,    90,     0,   137,     0,     0,    91,     0,     0,     0,
+       0,  -107,  -107,     0,     0,     0,  -107,   272,     0,   299,
+       0,     0,     0,     0,   304,     0,     0,     0,     0,   117,
+     118,     0,     0,     0,    92,    93,    94,     0,   119,     0,
+       0,   287,     0,   329,  -107,  -107,  -107,    95,   290,   291,
+      97,    98,   294,     0,   334,  -107,     0,  -107,  -107,   138,
+    -107,  -107,   139,     0,     0,     0,   305,     0,   307,   308,
+     313,   314,  -107,   316,     0,  -107,  -107,     0,  -107,     0,
+       2,     3,     0,     4,     5,     0,     0,     6,     7,     0,
+       0,     0,     0,   333,     0,     0,   335,     8,     9,   336,
+       0,   338,   103,   104,   105,   106,   107,     0,     0,   108,
+       0,     0,     0,     0,     0,    10,    11,    12,    13,    14,
+      15,     0,   102,     0,     0,    16,    17,    18,    19,    20,
+       0,     0,     0,    21,    22,   109,   110,   111,   112,   113,
+      23,    24,   114,    25,     0,    26,     0,     0,    27,    28,
+       0,    29,     0,     0,   -18,   197,   -18,     4,     5,     0,
+       0,     6,     7,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   198,     0,   199,   200,   201,   -74,   -74,
+     202,   203,   204,   205,   206,   207,   208,   209,   210,     0,
+      11,    12,     0,     0,    15,   211,     0,     0,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,   -74,    22,     0,
+       0,     0,     0,     0,    23,    24,     0,    25,     0,    26,
+       0,     0,    27,    28,     0,    65,     0,     0,    79,   -74,
+      80,   197,     0,     4,     5,     0,     0,     6,     7,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   198,
+       0,   199,   200,   201,   -73,   -73,   202,   203,   204,   205,
+     206,   207,   208,   209,   210,     0,    11,    12,     0,     0,
+      15,   211,     0,     0,     0,    16,    17,    18,    19,     0,
+       0,     0,     0,   -73,    22,     0,     0,     0,     0,     0,
+      23,    24,     0,    25,     0,    26,     0,     0,    27,    28,
+       0,    65,     0,     0,    79,   -73,    80,   197,     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,
-      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
+       0,     0,     0,     0,     0,   198,     0,   199,   200,   201,
+       0,     0,   202,   203,   204,   205,   206,   207,   208,   209,
+     210,     0,    11,    12,     0,     0,    15,   211,     0,     0,
+       0,    16,    17,    18,    19,    73,     0,     4,     5,     0,
+      22,     6,     7,  -106,  -106,     0,    23,    24,  -106,    25,
+       0,    26,     0,     0,    27,    28,     0,    65,     0,     0,
+      79,   212,    80,     0,     0,     0,     0,     0,     0,     0,
+      11,    12,     0,     0,    15,     0,  -106,  -106,  -106,    16,
+      17,    18,    19,     0,     0,     0,     0,  -106,    22,  -106,
+    -106,  -106,  -106,  -106,    23,    24,     0,    25,     0,    26,
+       0,    90,    27,   154,  -106,    65,    91,  -106,  -106,    73,
+    -106,     4,     5,     0,     0,     6,     7,     0,  -106,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    92,    93,    94,     0,     0,     0,
+       0,     0,     0,     0,    11,    12,     0,    95,    15,    96,
+      97,    98,     0,    16,    17,    18,    19,     0,     0,     0,
+       0,  -106,    22,     0,     0,     0,     0,     0,    23,    24,
+       0,    25,     0,    26,     0,     0,    27,   154,  -106,    65,
+       0,     4,     5,     0,  -106,     6,     7,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   198,     0,   199,
+     200,   201,     0,     0,   202,   203,   204,   205,   206,   207,
+     208,   209,   210,     0,    11,    12,     0,     0,    15,   211,
+       0,     0,     0,    16,    17,    18,    19,     0,     0,     4,
+       5,     0,    22,     6,     7,     0,     0,     0,    23,    24,
+       0,    25,     0,    26,     0,     0,    27,    28,     0,    65,
+      90,     0,    79,     0,    80,    91,     0,     0,     0,     0,
+       0,     0,    11,    12,     0,     0,    15,     0,     0,     0,
+       0,    16,    17,    18,    19,    73,     0,     4,     5,     0,
+      22,     6,     7,    92,    93,    94,    23,    24,     0,    25,
+       0,    26,     0,     0,    27,    28,    95,    65,     0,    97,
+      98,     0,    80,     0,     0,     0,     0,     0,     0,     0,
+      11,    12,     0,     0,    15,     0,     0,     0,     0,    16,
+      17,    18,    19,    73,     0,     4,     5,     0,    22,     6,
+       7,     0,     0,     0,    23,    24,     0,    25,     0,    26,
+       0,     0,    27,    28,  -106,    65,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    11,    12,
+       0,     0,    15,     0,     0,     0,     0,    16,    17,    18,
+      19,   191,     0,     4,     5,     0,    22,     6,     7,     0,
+       0,     0,    23,    24,     0,    25,     0,    26,     0,     0,
+      27,    28,     0,    65,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    11,    12,     0,     0,
+      15,     0,     0,     0,     0,    16,    17,    18,    19,     0,
+       0,     4,   266,     0,    22,     6,     7,     0,     0,     0,
+      23,    24,     0,    25,     0,    26,     0,     0,    27,    28,
+     200,    65,     0,     0,     0,     0,     0,     0,     0,   207,
+     208,     0,     0,     0,    11,    12,     0,     0,    15,     0,
+       0,     0,     0,    16,    17,    18,    19,     0,     0,     4,
+       5,     0,    22,     6,     7,     0,     0,     0,    23,    24,
+       0,    25,     0,    26,     0,     0,    27,    28,   200,    65,
+       0,     0,     0,     0,     0,     0,     0,   207,   208,     0,
+       0,     0,    11,    12,     0,     0,    15,     0,     0,     0,
+       0,    16,    17,    18,    19,     0,     0,     4,     5,     0,
+      22,     6,     7,     0,     0,     0,    23,    24,     0,    25,
+       0,    26,     0,     0,    27,    28,     0,    65,     0,     0,
+       0,     0,     0,     0,     4,     5,     0,     0,     6,     7,
+      11,    12,   101,     0,    15,     0,     0,     0,     0,    16,
+      17,    18,    19,     0,     0,     0,     0,     0,    22,     0,
+       0,     0,     0,     0,    23,    24,     0,    25,     0,    26,
+       0,    15,    27,    28,     0,    65,    16,    17,    18,    19,
+       0,     0,     4,     5,     0,    22,     6,     7,     0,     0,
+       0,    23,    24,     0,    25,     0,    26,     0,     0,    27,
+      28,     0,    65,     0,     0,     0,     0,     0,     0,     4,
+       5,     0,     0,     6,     7,     0,     0,     0,     0,    15,
+       0,     0,     0,     0,    16,    17,    18,    19,     0,     0,
+       0,     0,     0,    22,     0,     0,     0,     0,     0,    23,
+      24,     0,    25,     0,    26,     0,     0,    27,    28,     0,
+      65,    16,    17,    18,    19,     0,    90,     0,     0,     0,
+      22,    91,     0,     0,     0,     0,    23,    24,     0,    25,
+       0,    26,     0,     0,    27,    70,     0,    65,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    92,
+      93,    94,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    95,   225,     0,    97,    98
 };
 
 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,
+       1,    31,     1,    31,    32,   239,    50,   219,    28,     1,
+       1,     1,     1,    15,    16,    17,     4,    29,    16,    92,
+       1,    23,    24,    69,    26,    27,     9,    28,    48,     1,
+     307,     1,    31,     4,     4,    24,    25,    39,    47,   316,
+      16,     1,    45,    46,     4,     1,    47,    48,    42,   249,
+       6,     1,    69,    65,    63,    64,     6,    53,    45,    46,
+      74,    53,    63,    64,    53,   145,    57,    57,   148,    70,
+       3,    53,    53,   307,    72,    58,    59,    72,    72,    70,
+      76,    69,   316,    73,    76,    57,    75,    88,    51,   238,
+      91,    69,    93,    94,    95,    76,    72,    68,    70,   100,
+      70,   103,   104,   105,   106,   107,   108,   109,   110,   111,
+     112,   113,   114,   313,    69,   145,     9,   190,   148,   120,
+      74,   333,    53,    58,   336,   205,   206,   129,    67,   209,
+      53,   211,     5,     4,   154,   215,   137,    40,   287,    13,
+     141,    70,   291,    74,    42,    76,   145,     7,     8,   148,
+      69,    10,    69,   154,     3,     4,   305,    69,    69,   308,
+      76,   162,   164,   243,    70,    58,    59,   121,     4,     9,
+      26,    56,    85,    69,    14,   205,   206,   131,   132,   209,
+     260,   211,    20,    96,    75,   215,   335,     7,     7,   338,
+     220,    32,    23,    24,    54,    26,     3,   310,    47,    48,
+      60,    61,    42,    63,   270,   248,   205,   206,    39,   210,
+     209,   284,   211,   243,   233,   254,   215,   261,    58,    59,
+     164,    27,    71,   277,   225,   138,   324,   184,    -1,   183,
+     260,   232,   233,   277,    -1,   236,   237,    -1,   268,    -1,
+      -1,    -1,    -1,    50,   243,    52,    -1,   248,    62,    63,
+      64,     9,   254,    67,     9,    -1,    14,    -1,    -1,    14,
+      -1,   260,   290,    -1,   294,    -1,    -1,    -1,   222,    -1,
+     300,   273,   103,   104,   105,   106,   107,   108,   109,   110,
+     111,   112,   113,   114,    42,    43,    44,    42,    43,    -1,
+     203,   292,    -1,   294,    -1,    -1,    -1,    55,   129,   212,
+      58,    59,    -1,    58,    59,   259,    -1,    -1,   221,   263,
+     264,    -1,    -1,    -1,    -1,   228,    12,    13,    76,    -1,
+      -1,     9,    -1,     1,    -1,    -1,    14,    -1,    -1,    -1,
+      -1,     9,    10,    -1,    -1,    -1,    14,   250,    -1,   293,
+      -1,    -1,    -1,    -1,   298,    -1,    -1,    -1,    -1,    45,
+      46,    -1,    -1,    -1,    42,    43,    44,    -1,    54,    -1,
+      -1,   274,    -1,   317,    42,    43,    44,    55,   281,   282,
+      58,    59,   285,    -1,   328,    53,    -1,    55,    56,    57,
+      58,    59,    70,    -1,    -1,    -1,   299,    -1,   301,   302,
+     303,   304,    70,   306,    -1,    73,    74,    -1,    76,    -1,
+       0,     1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,
+      -1,    -1,    -1,   326,    -1,    -1,   329,    17,    18,   332,
+      -1,   334,    60,    61,    62,    63,    64,    -1,    -1,    67,
+      -1,    -1,    -1,    -1,    -1,    35,    36,    37,    38,    39,
+      40,    -1,   273,    -1,    -1,    45,    46,    47,    48,    49,
+      -1,    -1,    -1,    53,    54,    60,    61,    62,    63,    64,
+      60,    61,    67,    63,    -1,    65,    -1,    -1,    68,    69,
+      -1,    71,    -1,    -1,    74,     1,    76,     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,
+      36,    37,    -1,    -1,    40,    41,    -1,    -1,    -1,    45,
+      46,    47,    48,    -1,    -1,    -1,    -1,    53,    54,    -1,
+      -1,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    -1,    68,    69,    -1,    71,    -1,    -1,    74,    75,
+      76,     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,    36,    37,    -1,    -1,
+      40,    41,    -1,    -1,    -1,    45,    46,    47,    48,    -1,
+      -1,    -1,    -1,    53,    54,    -1,    -1,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      -1,    71,    -1,    -1,    74,    75,    76,     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,
+      34,    -1,    36,    37,    -1,    -1,    40,    41,    -1,    -1,
+      -1,    45,    46,    47,    48,     1,    -1,     3,     4,    -1,
+      54,     7,     8,     9,    10,    -1,    60,    61,    14,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,
+      74,    75,    76,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      36,    37,    -1,    -1,    40,    -1,    42,    43,    44,    45,
+      46,    47,    48,    -1,    -1,    -1,    -1,    53,    54,    55,
+      56,    57,    58,    59,    60,    61,    -1,    63,    -1,    65,
+      -1,     9,    68,    69,    70,    71,    14,    73,    74,     1,
+      76,     3,     4,    -1,    -1,     7,     8,    -1,    10,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    42,    43,    44,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    36,    37,    -1,    55,    40,    57,
+      58,    59,    -1,    45,    46,    47,    48,    -1,    -1,    -1,
+      -1,    53,    54,    -1,    -1,    -1,    -1,    -1,    60,    61,
+      -1,    63,    -1,    65,    -1,    -1,    68,    69,    70,    71,
+      -1,     3,     4,    -1,    76,     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,    36,    37,    -1,    -1,    40,    41,
+      -1,    -1,    -1,    45,    46,    47,    48,    -1,    -1,     3,
+       4,    -1,    54,     7,     8,    -1,    -1,    -1,    60,    61,
+      -1,    63,    -1,    65,    -1,    -1,    68,    69,    -1,    71,
+       9,    -1,    74,    -1,    76,    14,    -1,    -1,    -1,    -1,
+      -1,    -1,    36,    37,    -1,    -1,    40,    -1,    -1,    -1,
+      -1,    45,    46,    47,    48,     1,    -1,     3,     4,    -1,
+      54,     7,     8,    42,    43,    44,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    55,    71,    -1,    58,
+      59,    -1,    76,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      36,    37,    -1,    -1,    40,    -1,    -1,    -1,    -1,    45,
+      46,    47,    48,     1,    -1,     3,     4,    -1,    54,     7,
+       8,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    -1,    68,    69,    70,    71,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    36,    37,
+      -1,    -1,    40,    -1,    -1,    -1,    -1,    45,    46,    47,
+      48,     1,    -1,     3,     4,    -1,    54,     7,     8,    -1,
+      -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,
+      68,    69,    -1,    71,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    36,    37,    -1,    -1,
+      40,    -1,    -1,    -1,    -1,    45,    46,    47,    48,    -1,
+      -1,     3,     4,    -1,    54,     7,     8,    -1,    -1,    -1,
+      60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,
+      22,    71,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    31,
+      32,    -1,    -1,    -1,    36,    37,    -1,    -1,    40,    -1,
+      -1,    -1,    -1,    45,    46,    47,    48,    -1,    -1,     3,
+       4,    -1,    54,     7,     8,    -1,    -1,    -1,    60,    61,
+      -1,    63,    -1,    65,    -1,    -1,    68,    69,    22,    71,
       -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,    -1,    36,    37,    -1,    -1,    40,    -1,    -1,    -1,
+      -1,    45,    46,    47,    48,    -1,    -1,     3,     4,    -1,
+      54,     7,     8,    -1,    -1,    -1,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,
+      -1,    -1,    -1,    -1,     3,     4,    -1,    -1,     7,     8,
+      36,    37,    11,    -1,    40,    -1,    -1,    -1,    -1,    45,
+      46,    47,    48,    -1,    -1,    -1,    -1,    -1,    54,    -1,
+      -1,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    40,    68,    69,    -1,    71,    45,    46,    47,    48,
+      -1,    -1,     3,     4,    -1,    54,     7,     8,    -1,    -1,
+      -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,
+      69,    -1,    71,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    40,
+      -1,    -1,    -1,    -1,    45,    46,    47,    48,    -1,    -1,
+      -1,    -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,    60,
+      61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,    -1,
+      71,    45,    46,    47,    48,    -1,     9,    -1,    -1,    -1,
+      54,    14,    -1,    -1,    -1,    -1,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    42,
+      43,    44,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    55,    56,    -1,    58,    59
 };
 
   /* 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,    78,     0,     1,     3,     4,     7,     8,    17,    18,
+      35,    36,    37,    38,    39,    40,    45,    46,    47,    48,
+      49,    53,    54,    60,    61,    63,    65,    68,    69,    71,
+      79,    82,    86,    87,    89,    95,   105,   110,   118,   122,
+     123,   124,   125,   126,   127,   135,   136,    69,    72,   132,
+     133,   134,     3,     4,    47,    48,    71,    84,    85,   128,
+     136,   136,   136,    69,    69,    71,   123,   136,   123,   123,
+      69,   125,   136,     1,   117,   118,    50,    52,   127,    74,
+      76,    83,    91,   110,   138,   142,    83,    88,    96,    53,
+       9,    14,    42,    43,    44,    55,    57,    58,    59,   120,
+     121,    11,   123,    60,    61,    62,    63,    64,    67,    60,
+      61,    62,    63,    64,    67,    12,    13,    45,    46,    54,
+     119,   116,   117,   118,   117,    16,   132,    51,    69,    58,
+     112,   116,   116,   118,    45,    46,   137,     1,    57,    70,
+     140,   144,   140,     1,     6,    80,     1,     6,    81,   110,
+     111,    90,   111,     5,    69,   106,   116,   118,   135,   118,
+     118,   118,   111,   118,    40,   123,   123,   123,   123,   123,
+     123,   123,   123,   123,   123,   123,   123,    13,   118,   140,
+      73,     1,     4,   113,   114,   123,   140,   140,   118,   111,
+      42,     1,   118,     1,    91,     1,    91,     1,    19,    21,
+      22,    23,    26,    27,    28,    29,    30,    31,    32,    33,
+      34,    41,    75,    92,    93,    97,   104,   109,   118,   138,
+     139,   142,   117,    10,   107,    56,   118,   128,   140,     1,
+     144,   135,    69,    94,     4,    69,    69,    69,   111,    69,
+      91,    91,    91,   115,   118,    91,   111,    91,    98,    90,
+     141,   142,   111,   140,   108,   118,   111,     1,     4,   118,
+     115,    99,     4,   118,   118,    92,     4,    97,   100,    91,
+     106,   139,   111,   122,   140,    91,   129,   130,   131,   132,
+      70,   140,   140,    26,    42,   142,   107,   111,    16,   131,
+     111,   111,    69,   135,   111,    92,   138,    92,   118,   140,
+     118,   142,    20,   101,   140,   111,   142,   111,   111,     1,
+      24,    25,   102,   111,   111,    92,   111,   100,    92,     7,
+       8,    60,    61,    87,   103,    56,   143,   139,   100,   140,
+       7,     7,   143,   111,   140,   111,   111,    90,   111,    92,
+      90,    92
 };
 
   /* 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,    77,    78,    78,    78,    78,    78,    79,    79,    79,
+      79,    79,    80,    80,    80,    81,    81,    81,    82,    82,
+      82,    82,    82,    82,    82,    83,    84,    84,    84,    84,
+      85,    85,    86,    88,    87,    89,    89,    90,    90,    90,
+      91,    91,    92,    92,    92,    92,    92,    92,    92,    92,
+      92,    92,    93,    93,    93,    93,    93,    94,    93,    93,
+      96,    95,    98,    97,    99,    97,    97,    97,   100,   100,
+     101,   101,   101,   102,   102,   103,   103,   103,   103,   103,
+     104,   104,   105,   105,   106,   106,   107,   108,   107,   109,
+     109,   110,   110,   111,   111,   112,   112,   113,   113,   114,
+     114,   114,   114,   114,   115,   115,   116,   116,   117,   117,
+     117,   117,   117,   117,   118,   118,   118,   118,   118,   118,
+     118,   118,   118,   119,   119,   119,   120,   120,   121,   121,
+     122,   122,   122,   123,   123,   123,   123,   123,   123,   123,
+     123,   123,   123,   123,   124,   124,   124,   124,   124,   124,
+     124,   125,   125,   125,   125,   125,   125,   125,   125,   125,
+     125,   125,   125,   125,   125,   126,   126,   127,   128,   128,
+     129,   129,   130,   130,   131,   132,   133,   133,   134,   135,
+     135,   136,   136,   137,   137,   137,   138,   139,   140,   141,
+     141,   142,   143,   144
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
@@ -1160,19 +1213,20 @@ static const yytype_uint8 yyr2[] =
        1,     1,     6,     0,     3,     1,     1,     0,     2,     2,
        1,     2,     2,     3,     1,     9,     6,     8,     8,    12,
       11,     1,     2,     2,     2,     2,     3,     0,     4,     2,
-       0,     4,     0,     4,     4,     1,     0,     1,     0,     2,
-       2,     5,     4,     1,     2,     2,     1,     1,     1,     1,
-       1,     3,     0,     0,     3,     6,     9,     1,     2,     0,
-       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
+       0,     4,     0,     4,     0,     4,     4,     1,     0,     1,
+       0,     2,     2,     5,     4,     1,     2,     2,     1,     1,
+       1,     1,     1,     1,     1,     3,     0,     0,     3,     6,
+       9,     1,     2,     0,     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,     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
 };
 
 
@@ -1849,26 +1903,26 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-#line 208 "awkgram.y" /* yacc.c:1646  */
+#line 210 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                yyerrok;
          }
-#line 1858 "awkgram.c" /* yacc.c:1646  */
+#line 1912 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 5:
-#line 214 "awkgram.y" /* yacc.c:1646  */
+#line 216 "awkgram.y" /* yacc.c:1646  */
     {
                next_sourcefile();
                if (sourcefile == srcfiles)
                        process_deferred();
          }
-#line 1868 "awkgram.c" /* yacc.c:1646  */
+#line 1922 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 6:
-#line 220 "awkgram.y" /* yacc.c:1646  */
+#line 222 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                /*
@@ -1877,19 +1931,19 @@ yyreduce:
                 */
                /* yyerrok; */
          }
-#line 1881 "awkgram.c" /* yacc.c:1646  */
+#line 1935 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 7:
-#line 232 "awkgram.y" /* yacc.c:1646  */
+#line 234 "awkgram.y" /* yacc.c:1646  */
     {
                (void) append_rule((yyvsp[-1]), (yyvsp[0]));
          }
-#line 1889 "awkgram.c" /* yacc.c:1646  */
+#line 1943 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 8:
-#line 236 "awkgram.y" /* yacc.c:1646  */
+#line 238 "awkgram.y" /* yacc.c:1646  */
     {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@ -1900,39 +1954,39 @@ yyreduce:
                } else          /* pattern rule with non-empty pattern */
                        (void) append_rule((yyvsp[-1]), NULL);
          }
-#line 1904 "awkgram.c" /* yacc.c:1646  */
+#line 1958 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 9:
-#line 247 "awkgram.y" /* yacc.c:1646  */
+#line 249 "awkgram.y" /* yacc.c:1646  */
     {
                in_function = NULL;
                (void) mk_function((yyvsp[-1]), (yyvsp[0]));
                yyerrok;
          }
-#line 1914 "awkgram.c" /* yacc.c:1646  */
+#line 1968 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 10:
-#line 253 "awkgram.y" /* yacc.c:1646  */
+#line 255 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                yyerrok;
          }
-#line 1923 "awkgram.c" /* yacc.c:1646  */
+#line 1977 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 11:
-#line 258 "awkgram.y" /* yacc.c:1646  */
+#line 260 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                yyerrok;
          }
-#line 1932 "awkgram.c" /* yacc.c:1646  */
+#line 1986 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 12:
-#line 266 "awkgram.y" /* yacc.c:1646  */
+#line 268 "awkgram.y" /* yacc.c:1646  */
     {
                if (include_source((yyvsp[0])) < 0)
                        YYABORT;
@@ -1940,23 +1994,23 @@ yyreduce:
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 1944 "awkgram.c" /* yacc.c:1646  */
+#line 1998 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 13:
-#line 274 "awkgram.y" /* yacc.c:1646  */
+#line 276 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1950 "awkgram.c" /* yacc.c:1646  */
+#line 2004 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 14:
-#line 276 "awkgram.y" /* yacc.c:1646  */
+#line 278 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1956 "awkgram.c" /* yacc.c:1646  */
+#line 2010 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 15:
-#line 281 "awkgram.y" /* yacc.c:1646  */
+#line 283 "awkgram.y" /* yacc.c:1646  */
     {
                if (load_library((yyvsp[0])) < 0)
                        YYABORT;
@@ -1964,23 +2018,23 @@ yyreduce:
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 1968 "awkgram.c" /* yacc.c:1646  */
+#line 2022 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 16:
-#line 289 "awkgram.y" /* yacc.c:1646  */
+#line 291 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1974 "awkgram.c" /* yacc.c:1646  */
+#line 2028 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 17:
-#line 291 "awkgram.y" /* yacc.c:1646  */
+#line 293 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1980 "awkgram.c" /* yacc.c:1646  */
+#line 2034 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 18:
-#line 296 "awkgram.y" /* yacc.c:1646  */
+#line 298 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -1989,11 +2043,11 @@ yyreduce:
                } else
                        (yyval) = NULL;
          }
-#line 1993 "awkgram.c" /* yacc.c:1646  */
+#line 2047 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 19:
-#line 305 "awkgram.y" /* yacc.c:1646  */
+#line 307 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -2002,11 +2056,11 @@ yyreduce:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 2006 "awkgram.c" /* yacc.c:1646  */
+#line 2060 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 20:
-#line 315 "awkgram.y" /* yacc.c:1646  */
+#line 317 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *tp;
 
@@ -2032,11 +2086,11 @@ yyreduce:
                (yyval) = list_append(list_merge((yyvsp[-3]), (yyvsp[0])), tp);
                rule = Rule;
          }
-#line 2036 "awkgram.c" /* yacc.c:1646  */
+#line 2090 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 21:
-#line 341 "awkgram.y" /* yacc.c:1646  */
+#line 343 "awkgram.y" /* yacc.c:1646  */
     {
                static int begin_seen = 0;
 
@@ -2049,11 +2103,11 @@ yyreduce:
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
-#line 2053 "awkgram.c" /* yacc.c:1646  */
+#line 2107 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 22:
-#line 354 "awkgram.y" /* yacc.c:1646  */
+#line 356 "awkgram.y" /* yacc.c:1646  */
     {
                static int end_seen = 0;
 
@@ -2066,33 +2120,33 @@ yyreduce:
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
-#line 2070 "awkgram.c" /* yacc.c:1646  */
+#line 2124 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 23:
-#line 367 "awkgram.y" /* yacc.c:1646  */
+#line 369 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = BEGINFILE;
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
-#line 2081 "awkgram.c" /* yacc.c:1646  */
+#line 2135 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 24:
-#line 374 "awkgram.y" /* yacc.c:1646  */
+#line 376 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = ENDFILE;
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
-#line 2092 "awkgram.c" /* yacc.c:1646  */
+#line 2146 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 25:
-#line 384 "awkgram.y" /* yacc.c:1646  */
+#line 386 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                if ((yyvsp[-3]) == NULL)
@@ -2101,39 +2155,39 @@ yyreduce:
                        ip = (yyvsp[-3]);
                (yyval) = ip;
          }
-#line 2105 "awkgram.c" /* yacc.c:1646  */
+#line 2159 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 26:
-#line 396 "awkgram.y" /* yacc.c:1646  */
+#line 398 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2111 "awkgram.c" /* yacc.c:1646  */
+#line 2165 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 27:
-#line 398 "awkgram.y" /* yacc.c:1646  */
+#line 400 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2117 "awkgram.c" /* yacc.c:1646  */
+#line 2171 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 28:
-#line 400 "awkgram.y" /* yacc.c:1646  */
+#line 402 "awkgram.y" /* yacc.c:1646  */
     {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
                YYABORT;
          }
-#line 2127 "awkgram.c" /* yacc.c:1646  */
+#line 2181 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 29:
-#line 406 "awkgram.y" /* yacc.c:1646  */
+#line 408 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2133 "awkgram.c" /* yacc.c:1646  */
+#line 2187 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 32:
-#line 416 "awkgram.y" /* yacc.c:1646  */
+#line 418 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *  treat any comments between BOF and the first function
@@ -2160,17 +2214,17 @@ yyreduce:
                /* $4 already free'd in install_function */
                (yyval) = (yyvsp[-5]);
          }
-#line 2164 "awkgram.c" /* yacc.c:1646  */
+#line 2218 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 33:
-#line 450 "awkgram.y" /* yacc.c:1646  */
+#line 452 "awkgram.y" /* yacc.c:1646  */
     { want_regexp = true; }
-#line 2170 "awkgram.c" /* yacc.c:1646  */
+#line 2224 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 34:
-#line 452 "awkgram.y" /* yacc.c:1646  */
+#line 454 "awkgram.y" /* yacc.c:1646  */
     {
                  NODE *n, *exp;
                  char *re;
@@ -2199,28 +2253,28 @@ yyreduce:
                  (yyval)->opcode = Op_match_rec;
                  (yyval)->memory = n;
                }
-#line 2203 "awkgram.c" /* yacc.c:1646  */
+#line 2257 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 35:
-#line 484 "awkgram.y" /* yacc.c:1646  */
+#line 486 "awkgram.y" /* yacc.c:1646  */
     { bcfree((yyvsp[0])); }
-#line 2209 "awkgram.c" /* yacc.c:1646  */
+#line 2263 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 37:
-#line 490 "awkgram.y" /* yacc.c:1646  */
+#line 492 "awkgram.y" /* yacc.c:1646  */
     {
                if (comment != NULL) {
                        (yyval) = list_create(comment);
                        comment = NULL;
                } else (yyval) = NULL;
          }
-#line 2220 "awkgram.c" /* yacc.c:1646  */
+#line 2274 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 38:
-#line 497 "awkgram.y" /* yacc.c:1646  */
+#line 499 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0]) == NULL) {
                        if (comment == NULL)
@@ -2248,40 +2302,40 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2252 "awkgram.c" /* yacc.c:1646  */
+#line 2306 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 39:
-#line 525 "awkgram.y" /* yacc.c:1646  */
+#line 527 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = NULL; }
-#line 2258 "awkgram.c" /* yacc.c:1646  */
+#line 2312 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 42:
-#line 535 "awkgram.y" /* yacc.c:1646  */
+#line 537 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2264 "awkgram.c" /* yacc.c:1646  */
+#line 2318 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 43:
-#line 537 "awkgram.y" /* yacc.c:1646  */
+#line 539 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 2270 "awkgram.c" /* yacc.c:1646  */
+#line 2324 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 44:
-#line 539 "awkgram.y" /* yacc.c:1646  */
+#line 541 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
-#line 2281 "awkgram.c" /* yacc.c:1646  */
+#line 2335 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 45:
-#line 546 "awkgram.y" /* yacc.c:1646  */
+#line 548 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@ -2371,11 +2425,11 @@ yyreduce:
                break_allowed--;                        
                fix_break_continue(ip, tbreak, NULL);
          }
-#line 2375 "awkgram.c" /* yacc.c:1646  */
+#line 2429 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 46:
-#line 636 "awkgram.y" /* yacc.c:1646  */
+#line 638 "awkgram.y" /* yacc.c:1646  */
     { 
                /*
                 *    -----------------
@@ -2417,11 +2471,11 @@ yyreduce:
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
          }
-#line 2421 "awkgram.c" /* yacc.c:1646  */
+#line 2475 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 47:
-#line 678 "awkgram.y" /* yacc.c:1646  */
+#line 680 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *    -----------------
@@ -2463,11 +2517,11 @@ yyreduce:
                } /* else
                        $1 and $4 are NULLs */
          }
-#line 2467 "awkgram.c" /* yacc.c:1646  */
+#line 2521 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 48:
-#line 720 "awkgram.y" /* yacc.c:1646  */
+#line 722 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[-5])->lextok;
@@ -2580,44 +2634,44 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2584 "awkgram.c" /* yacc.c:1646  */
+#line 2638 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 49:
-#line 833 "awkgram.y" /* yacc.c:1646  */
+#line 835 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-11]), (yyvsp[-9]), (yyvsp[-6]), 
(yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2595 "awkgram.c" /* yacc.c:1646  */
+#line 2649 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 50:
-#line 840 "awkgram.y" /* yacc.c:1646  */
+#line 842 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-10]), (yyvsp[-8]), (INSTRUCTION 
*) NULL, (yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2606 "awkgram.c" /* yacc.c:1646  */
+#line 2660 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 51:
-#line 847 "awkgram.y" /* yacc.c:1646  */
+#line 849 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
-#line 2617 "awkgram.c" /* yacc.c:1646  */
+#line 2671 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 52:
-#line 857 "awkgram.y" /* yacc.c:1646  */
+#line 859 "awkgram.y" /* yacc.c:1646  */
     { 
                if (! break_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2626,11 +2680,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
 
          }
-#line 2630 "awkgram.c" /* yacc.c:1646  */
+#line 2684 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 53:
-#line 866 "awkgram.y" /* yacc.c:1646  */
+#line 868 "awkgram.y" /* yacc.c:1646  */
     {
                if (! continue_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2639,11 +2693,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
 
          }
-#line 2643 "awkgram.c" /* yacc.c:1646  */
+#line 2697 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 54:
-#line 875 "awkgram.y" /* yacc.c:1646  */
+#line 877 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2652,11 +2706,11 @@ regular_loop:
                (yyvsp[-1])->target_jmp = ip_rec;
                (yyval) = list_create((yyvsp[-1]));
          }
-#line 2656 "awkgram.c" /* yacc.c:1646  */
+#line 2710 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 55:
-#line 884 "awkgram.y" /* yacc.c:1646  */
+#line 886 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2667,11 +2721,11 @@ regular_loop:
                (yyvsp[-1])->target_endfile = ip_endfile;
                (yyval) = list_create((yyvsp[-1]));
          }
-#line 2671 "awkgram.c" /* yacc.c:1646  */
+#line 2725 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 56:
-#line 895 "awkgram.y" /* yacc.c:1646  */
+#line 897 "awkgram.y" /* yacc.c:1646  */
     {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@ -2686,20 +2740,20 @@ regular_loop:
                } else
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
          }
-#line 2690 "awkgram.c" /* yacc.c:1646  */
+#line 2744 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 57:
-#line 910 "awkgram.y" /* yacc.c:1646  */
+#line 912 "awkgram.y" /* yacc.c:1646  */
     {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
-#line 2699 "awkgram.c" /* yacc.c:1646  */
+#line 2753 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 58:
-#line 913 "awkgram.y" /* yacc.c:1646  */
+#line 915 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL) {
                        (yyval) = list_create((yyvsp[-3]));
@@ -2720,124 +2774,45 @@ regular_loop:
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-3]));
                }
          }
-#line 2724 "awkgram.c" /* yacc.c:1646  */
+#line 2778 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 60:
-#line 945 "awkgram.y" /* yacc.c:1646  */
+#line 939 "awkgram.y" /* yacc.c:1646  */
     { in_print = true; in_parens = 0; }
-#line 2730 "awkgram.c" /* yacc.c:1646  */
+#line 2784 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 61:
-#line 946 "awkgram.y" /* yacc.c:1646  */
+#line 940 "awkgram.y" /* yacc.c:1646  */
     {
-               /*
-                * Optimization: plain `print' has no expression list, so $3 is 
null.
-                * If $3 is NULL or is a bytecode list for $0 use 
Op_K_print_rec,
-                * which is faster for these two cases.
-                */
-
-               if ((yyvsp[-3])->opcode == Op_K_print &&
-                       ((yyvsp[-1]) == NULL
-                               || ((yyvsp[-1])->lasti->opcode == Op_field_spec
-                                       && (yyvsp[-1])->nexti->nexti->nexti == 
(yyvsp[-1])->lasti
-                                       && (yyvsp[-1])->nexti->nexti->opcode == 
Op_push_i
-                                       && 
(yyvsp[-1])->nexti->nexti->memory->type == Node_val)
-                       )
-               ) {
-                       static bool warned = false;
-                       /*   -----------------
-                        *      output_redir
-                        *    [ redirect exp ]
-                        *   -----------------
-                        *     expression_list
-                        *   ------------------
-                        *    [Op_K_print_rec | NULL | redir_type | expr_count]
-                        */
-
-                       if ((yyvsp[-1]) != NULL) {
-                               NODE *n = (yyvsp[-1])->nexti->nexti->memory;
-
-                               if (! iszero(n))
-                                       goto regular_print;
+               (yyval) = mk_print((yyvsp[-3]), (yyvsp[-1]), (yyvsp[0]));
+         }
+#line 2792 "awkgram.c" /* yacc.c:1646  */
+    break;
 
-                               bcfree((yyvsp[-1])->lasti);                     
/* Op_field_spec */
-                               unref(n);                               /* 
Node_val */
-                               bcfree((yyvsp[-1])->nexti->nexti);              
/* Op_push_i */
-                               bcfree((yyvsp[-1])->nexti);                     
/* Op_list */
-                               bcfree((yyvsp[-1]));                            
/* Op_list */
-                       } else {
-                               if (do_lint && (rule == BEGIN || rule == END) 
&& ! warned) {
-                                       warned = true;
-                                       lintwarn_ln((yyvsp[-3])->source_line,
-               _("plain `print' in BEGIN or END rule should probably be `print 
\"\"'"));
-                               }
-                       }
+  case 62:
+#line 954 "awkgram.y" /* yacc.c:1646  */
+    { in_print = true; in_parens = 0; }
+#line 2798 "awkgram.c" /* yacc.c:1646  */
+    break;
 
-                       (yyvsp[-3])->expr_count = 0;
-                       (yyvsp[-3])->opcode = Op_K_print_rec;
-                       if ((yyvsp[0]) == NULL) {    /* no redircetion */
-                               (yyvsp[-3])->redir_type = redirect_none;
-                               (yyval) = list_create((yyvsp[-3]));
-                       } else {
-                               INSTRUCTION *ip;
-                               ip = (yyvsp[0])->nexti;
-                               (yyvsp[-3])->redir_type = ip->redir_type;
-                               (yyvsp[0])->nexti = ip->nexti;
-                               bcfree(ip);
-                               (yyval) = list_append((yyvsp[0]), (yyvsp[-3]));
-                       }
-               } else {
-                       /*   -----------------
-                        *    [ output_redir    ]
-                        *    [ redirect exp    ]
-                        *   -----------------
-                        *    [ expression_list ]
-                        *   ------------------
-                        *    [$1 | NULL | redir_type | expr_count]
-                        *
-                        */
-regular_print:  
-                       if ((yyvsp[0]) == NULL) {               /* no 
redirection */
-                               if ((yyvsp[-1]) == NULL)        {       /* 
printf without arg */
-                                       (yyvsp[-3])->expr_count = 0;
-                                       (yyvsp[-3])->redir_type = redirect_none;
-                                       (yyval) = list_create((yyvsp[-3]));
-                               } else {
-                                       INSTRUCTION *t = (yyvsp[-1]);
-                                       (yyvsp[-3])->expr_count = 
count_expressions(&t, false);
-                                       (yyvsp[-3])->redir_type = redirect_none;
-                                       (yyval) = list_append(t, (yyvsp[-3]));
-                               }
-                       } else {
-                               INSTRUCTION *ip;
-                               ip = (yyvsp[0])->nexti;
-                               (yyvsp[-3])->redir_type = ip->redir_type;
-                               (yyvsp[0])->nexti = ip->nexti;
-                               bcfree(ip);
-                               if ((yyvsp[-1]) == NULL) {
-                                       (yyvsp[-3])->expr_count = 0;
-                                       (yyval) = list_append((yyvsp[0]), 
(yyvsp[-3]));
-                               } else {
-                                       INSTRUCTION *t = (yyvsp[-1]);
-                                       (yyvsp[-3])->expr_count = 
count_expressions(&t, false);
-                                       (yyval) = 
list_append(list_merge((yyvsp[0]), t), (yyvsp[-3]));
-                               }
-                       }
-               }
+  case 63:
+#line 955 "awkgram.y" /* yacc.c:1646  */
+    {
+               (yyval) = mk_print((yyvsp[-3]), (yyvsp[-1]), (yyvsp[0]));
          }
-#line 2831 "awkgram.c" /* yacc.c:1646  */
+#line 2806 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 62:
-#line 1043 "awkgram.y" /* yacc.c:1646  */
+  case 64:
+#line 959 "awkgram.y" /* yacc.c:1646  */
     { sub_counter = 0; }
-#line 2837 "awkgram.c" /* yacc.c:1646  */
+#line 2812 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 63:
-#line 1044 "awkgram.y" /* yacc.c:1646  */
+  case 65:
+#line 960 "awkgram.y" /* yacc.c:1646  */
     {
                char *arr = (yyvsp[-2])->lextok;
 
@@ -2870,11 +2845,11 @@ regular_print:
                        (yyval) = list_append(list_append((yyvsp[0]), 
(yyvsp[-2])), (yyvsp[-3]));
                }
          }
-#line 2874 "awkgram.c" /* yacc.c:1646  */
+#line 2849 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 64:
-#line 1081 "awkgram.y" /* yacc.c:1646  */
+  case 66:
+#line 997 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
                char *arr = (yyvsp[-1])->lextok;
@@ -2900,52 +2875,52 @@ regular_print:
                                fatal(_("`delete' is not allowed with 
FUNCTAB"));
                }
          }
-#line 2904 "awkgram.c" /* yacc.c:1646  */
+#line 2879 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 65:
-#line 1107 "awkgram.y" /* yacc.c:1646  */
+  case 67:
+#line 1023 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = optimize_assignment((yyvsp[0])); }
-#line 2910 "awkgram.c" /* yacc.c:1646  */
+#line 2885 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 66:
-#line 1112 "awkgram.y" /* yacc.c:1646  */
+  case 68:
+#line 1028 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2916 "awkgram.c" /* yacc.c:1646  */
+#line 2891 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 67:
-#line 1114 "awkgram.y" /* yacc.c:1646  */
+  case 69:
+#line 1030 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2922 "awkgram.c" /* yacc.c:1646  */
+#line 2897 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 68:
-#line 1119 "awkgram.y" /* yacc.c:1646  */
+  case 70:
+#line 1035 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2928 "awkgram.c" /* yacc.c:1646  */
+#line 2903 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 69:
-#line 1121 "awkgram.y" /* yacc.c:1646  */
+  case 71:
+#line 1037 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL)
                        (yyval) = list_create((yyvsp[0]));
                else
                        (yyval) = list_prepend((yyvsp[-1]), (yyvsp[0]));
          }
-#line 2939 "awkgram.c" /* yacc.c:1646  */
+#line 2914 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 70:
-#line 1128 "awkgram.y" /* yacc.c:1646  */
+  case 72:
+#line 1044 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2945 "awkgram.c" /* yacc.c:1646  */
+#line 2920 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 71:
-#line 1133 "awkgram.y" /* yacc.c:1646  */
+  case 73:
+#line 1049 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -2957,11 +2932,11 @@ regular_print:
                bcfree((yyvsp[-2]));
                (yyval) = (yyvsp[-4]);
          }
-#line 2961 "awkgram.c" /* yacc.c:1646  */
+#line 2936 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 72:
-#line 1145 "awkgram.y" /* yacc.c:1646  */
+  case 74:
+#line 1061 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -2972,17 +2947,17 @@ regular_print:
                (yyvsp[-3])->case_stmt = casestmt;
                (yyval) = (yyvsp[-3]);
          }
-#line 2976 "awkgram.c" /* yacc.c:1646  */
+#line 2951 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 73:
-#line 1159 "awkgram.y" /* yacc.c:1646  */
+  case 75:
+#line 1075 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 2982 "awkgram.c" /* yacc.c:1646  */
+#line 2957 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 74:
-#line 1161 "awkgram.y" /* yacc.c:1646  */
+  case 76:
+#line 1077 "awkgram.y" /* yacc.c:1646  */
     { 
                NODE *n = (yyvsp[0])->memory;
                (void) force_number(n);
@@ -2990,71 +2965,83 @@ regular_print:
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 2994 "awkgram.c" /* yacc.c:1646  */
+#line 2969 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 75:
-#line 1169 "awkgram.y" /* yacc.c:1646  */
+  case 77:
+#line 1085 "awkgram.y" /* yacc.c:1646  */
     {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3003 "awkgram.c" /* yacc.c:1646  */
+#line 2978 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 76:
-#line 1174 "awkgram.y" /* yacc.c:1646  */
+  case 78:
+#line 1090 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3009 "awkgram.c" /* yacc.c:1646  */
+#line 2984 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 77:
-#line 1176 "awkgram.y" /* yacc.c:1646  */
+  case 79:
+#line 1092 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_push_re;
                (yyval) = (yyvsp[0]);
          }
-#line 3018 "awkgram.c" /* yacc.c:1646  */
+#line 2993 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 78:
-#line 1184 "awkgram.y" /* yacc.c:1646  */
+  case 80:
+#line 1100 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3024 "awkgram.c" /* yacc.c:1646  */
+#line 2999 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 79:
-#line 1186 "awkgram.y" /* yacc.c:1646  */
+  case 81:
+#line 1102 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3030 "awkgram.c" /* yacc.c:1646  */
+#line 3005 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 81:
-#line 1196 "awkgram.y" /* yacc.c:1646  */
+  case 82:
+#line 1107 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = (yyvsp[0]); }
+#line 3011 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 83:
+#line 1109 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = (yyvsp[0]); }
+#line 3017 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 85:
+#line 1119 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = (yyvsp[-1]);
          }
-#line 3038 "awkgram.c" /* yacc.c:1646  */
+#line 3025 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 82:
-#line 1203 "awkgram.y" /* yacc.c:1646  */
+  case 86:
+#line 1126 "awkgram.y" /* yacc.c:1646  */
     {
                in_print = false;
                in_parens = 0;
                (yyval) = NULL;
          }
-#line 3048 "awkgram.c" /* yacc.c:1646  */
+#line 3035 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 83:
-#line 1208 "awkgram.y" /* yacc.c:1646  */
+  case 87:
+#line 1131 "awkgram.y" /* yacc.c:1646  */
     { in_print = false; in_parens = 0; }
-#line 3054 "awkgram.c" /* yacc.c:1646  */
+#line 3041 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 84:
-#line 1209 "awkgram.y" /* yacc.c:1646  */
+  case 88:
+#line 1132 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->redir_type == redirect_twoway
                        && (yyvsp[0])->lasti->opcode == Op_K_getline_redir
@@ -3062,136 +3049,136 @@ regular_print:
                        yyerror(_("multistage two-way pipelines don't work"));
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-2]));
          }
-#line 3066 "awkgram.c" /* yacc.c:1646  */
+#line 3053 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 85:
-#line 1220 "awkgram.y" /* yacc.c:1646  */
+  case 89:
+#line 1143 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-3]), (yyvsp[-5]), (yyvsp[0]), 
NULL, NULL);
          }
-#line 3074 "awkgram.c" /* yacc.c:1646  */
+#line 3061 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 86:
-#line 1225 "awkgram.y" /* yacc.c:1646  */
+  case 90:
+#line 1148 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-6]), (yyvsp[-8]), (yyvsp[-3]), 
(yyvsp[-2]), (yyvsp[0]));
          }
-#line 3082 "awkgram.c" /* yacc.c:1646  */
+#line 3069 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 91:
-#line 1242 "awkgram.y" /* yacc.c:1646  */
+  case 95:
+#line 1165 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3088 "awkgram.c" /* yacc.c:1646  */
+#line 3075 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 92:
-#line 1244 "awkgram.y" /* yacc.c:1646  */
+  case 96:
+#line 1167 "awkgram.y" /* yacc.c:1646  */
     {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3097 "awkgram.c" /* yacc.c:1646  */
+#line 3084 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 93:
-#line 1252 "awkgram.y" /* yacc.c:1646  */
+  case 97:
+#line 1175 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3103 "awkgram.c" /* yacc.c:1646  */
+#line 3090 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 94:
-#line 1254 "awkgram.y" /* yacc.c:1646  */
+  case 98:
+#line 1177 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3109 "awkgram.c" /* yacc.c:1646  */
+#line 3096 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 95:
-#line 1259 "awkgram.y" /* yacc.c:1646  */
+  case 99:
+#line 1182 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->param_count = 0;
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3118 "awkgram.c" /* yacc.c:1646  */
+#line 3105 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 96:
-#line 1264 "awkgram.y" /* yacc.c:1646  */
+  case 100:
+#line 1187 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->param_count =  (yyvsp[-2])->lasti->param_count + 1;
                (yyval) = list_append((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3128 "awkgram.c" /* yacc.c:1646  */
+#line 3115 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 97:
-#line 1270 "awkgram.y" /* yacc.c:1646  */
+  case 101:
+#line 1193 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3134 "awkgram.c" /* yacc.c:1646  */
+#line 3121 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 98:
-#line 1272 "awkgram.y" /* yacc.c:1646  */
+  case 102:
+#line 1195 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3140 "awkgram.c" /* yacc.c:1646  */
+#line 3127 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 99:
-#line 1274 "awkgram.y" /* yacc.c:1646  */
+  case 103:
+#line 1197 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-2]); }
-#line 3146 "awkgram.c" /* yacc.c:1646  */
+#line 3133 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 100:
-#line 1280 "awkgram.y" /* yacc.c:1646  */
+  case 104:
+#line 1203 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3152 "awkgram.c" /* yacc.c:1646  */
+#line 3139 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 101:
-#line 1282 "awkgram.y" /* yacc.c:1646  */
+  case 105:
+#line 1205 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3158 "awkgram.c" /* yacc.c:1646  */
+#line 3145 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 102:
-#line 1287 "awkgram.y" /* yacc.c:1646  */
+  case 106:
+#line 1210 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3164 "awkgram.c" /* yacc.c:1646  */
+#line 3151 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 103:
-#line 1289 "awkgram.y" /* yacc.c:1646  */
+  case 107:
+#line 1212 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3170 "awkgram.c" /* yacc.c:1646  */
+#line 3157 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 104:
-#line 1294 "awkgram.y" /* yacc.c:1646  */
+  case 108:
+#line 1217 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
-#line 3176 "awkgram.c" /* yacc.c:1646  */
+#line 3163 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 105:
-#line 1296 "awkgram.y" /* yacc.c:1646  */
+  case 109:
+#line 1219 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3185 "awkgram.c" /* yacc.c:1646  */
+#line 3172 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 106:
-#line 1301 "awkgram.y" /* yacc.c:1646  */
+  case 110:
+#line 1224 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3191 "awkgram.c" /* yacc.c:1646  */
+#line 3178 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 107:
-#line 1303 "awkgram.y" /* yacc.c:1646  */
+  case 111:
+#line 1226 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3199,52 +3186,52 @@ regular_print:
                 */
                (yyval) = (yyvsp[-1]);
          }
-#line 3203 "awkgram.c" /* yacc.c:1646  */
+#line 3190 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 108:
-#line 1311 "awkgram.y" /* yacc.c:1646  */
+  case 112:
+#line 1234 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
-#line 3212 "awkgram.c" /* yacc.c:1646  */
+#line 3199 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 109:
-#line 1316 "awkgram.y" /* yacc.c:1646  */
+  case 113:
+#line 1239 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
-#line 3221 "awkgram.c" /* yacc.c:1646  */
+#line 3208 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 110:
-#line 1325 "awkgram.y" /* yacc.c:1646  */
+  case 114:
+#line 1248 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of assignment"));
                (yyval) = mk_assignment((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1]));
          }
-#line 3232 "awkgram.c" /* yacc.c:1646  */
+#line 3219 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 111:
-#line 1332 "awkgram.y" /* yacc.c:1646  */
+  case 115:
+#line 1255 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3238 "awkgram.c" /* yacc.c:1646  */
+#line 3225 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 112:
-#line 1334 "awkgram.y" /* yacc.c:1646  */
+  case 116:
+#line 1257 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3244 "awkgram.c" /* yacc.c:1646  */
+#line 3231 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 113:
-#line 1336 "awkgram.y" /* yacc.c:1646  */
+  case 117:
+#line 1259 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3260,11 +3247,11 @@ regular_print:
                        (yyval) = list_append(list_merge((yyvsp[-2]), 
(yyvsp[0])), (yyvsp[-1]));
                }
          }
-#line 3264 "awkgram.c" /* yacc.c:1646  */
+#line 3251 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 114:
-#line 1352 "awkgram.y" /* yacc.c:1646  */
+  case 118:
+#line 1275 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3274,91 +3261,97 @@ regular_print:
                (yyvsp[-1])->expr_count = 1;
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3278 "awkgram.c" /* yacc.c:1646  */
+#line 3265 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 115:
-#line 1362 "awkgram.y" /* yacc.c:1646  */
+  case 119:
+#line 1285 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of comparison"));
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3289 "awkgram.c" /* yacc.c:1646  */
+#line 3276 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 116:
-#line 1369 "awkgram.y" /* yacc.c:1646  */
+  case 120:
+#line 1292 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_condition((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]), 
(yyvsp[-1]), (yyvsp[0])); }
-#line 3295 "awkgram.c" /* yacc.c:1646  */
+#line 3282 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 117:
-#line 1371 "awkgram.y" /* yacc.c:1646  */
+  case 121:
+#line 1294 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3301 "awkgram.c" /* yacc.c:1646  */
+#line 3288 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 118:
-#line 1376 "awkgram.y" /* yacc.c:1646  */
+  case 122:
+#line 1296 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3307 "awkgram.c" /* yacc.c:1646  */
+#line 3294 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 119:
-#line 1378 "awkgram.y" /* yacc.c:1646  */
+  case 123:
+#line 1301 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3313 "awkgram.c" /* yacc.c:1646  */
+#line 3300 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 120:
-#line 1380 "awkgram.y" /* yacc.c:1646  */
+  case 124:
+#line 1303 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = (yyvsp[0]); }
+#line 3306 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 125:
+#line 1305 "awkgram.y" /* yacc.c:1646  */
     {  
                (yyvsp[0])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[0]);
          }
-#line 3322 "awkgram.c" /* yacc.c:1646  */
+#line 3315 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 121:
-#line 1388 "awkgram.y" /* yacc.c:1646  */
+  case 126:
+#line 1313 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3328 "awkgram.c" /* yacc.c:1646  */
+#line 3321 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 122:
-#line 1390 "awkgram.y" /* yacc.c:1646  */
+  case 127:
+#line 1315 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3334 "awkgram.c" /* yacc.c:1646  */
+#line 3327 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 123:
-#line 1395 "awkgram.y" /* yacc.c:1646  */
+  case 128:
+#line 1320 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3340 "awkgram.c" /* yacc.c:1646  */
+#line 3333 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 124:
-#line 1397 "awkgram.y" /* yacc.c:1646  */
+  case 129:
+#line 1322 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3346 "awkgram.c" /* yacc.c:1646  */
+#line 3339 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 125:
-#line 1402 "awkgram.y" /* yacc.c:1646  */
+  case 130:
+#line 1327 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3352 "awkgram.c" /* yacc.c:1646  */
+#line 3345 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 126:
-#line 1404 "awkgram.y" /* yacc.c:1646  */
+  case 131:
+#line 1329 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3358 "awkgram.c" /* yacc.c:1646  */
+#line 3351 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 127:
-#line 1406 "awkgram.y" /* yacc.c:1646  */
+  case 132:
+#line 1331 "awkgram.y" /* yacc.c:1646  */
     {
                int count = 2;
                bool is_simple_var = false;
@@ -3405,47 +3398,47 @@ regular_print:
                                max_args = count;
                }
          }
-#line 3409 "awkgram.c" /* yacc.c:1646  */
+#line 3402 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 129:
-#line 1458 "awkgram.y" /* yacc.c:1646  */
+  case 134:
+#line 1383 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3415 "awkgram.c" /* yacc.c:1646  */
+#line 3408 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 130:
-#line 1460 "awkgram.y" /* yacc.c:1646  */
+  case 135:
+#line 1385 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3421 "awkgram.c" /* yacc.c:1646  */
+#line 3414 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 131:
-#line 1462 "awkgram.y" /* yacc.c:1646  */
+  case 136:
+#line 1387 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3427 "awkgram.c" /* yacc.c:1646  */
+#line 3420 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 132:
-#line 1464 "awkgram.y" /* yacc.c:1646  */
+  case 137:
+#line 1389 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3433 "awkgram.c" /* yacc.c:1646  */
+#line 3426 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 133:
-#line 1466 "awkgram.y" /* yacc.c:1646  */
+  case 138:
+#line 1391 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3439 "awkgram.c" /* yacc.c:1646  */
+#line 3432 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 134:
-#line 1468 "awkgram.y" /* yacc.c:1646  */
+  case 139:
+#line 1393 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3445 "awkgram.c" /* yacc.c:1646  */
+#line 3438 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 135:
-#line 1470 "awkgram.y" /* yacc.c:1646  */
+  case 140:
+#line 1395 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3459,29 +3452,29 @@ regular_print:
                                _("non-redirected `getline' undefined inside 
END action"));
                (yyval) = mk_getline((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]), 
redirect_input);
          }
-#line 3463 "awkgram.c" /* yacc.c:1646  */
+#line 3456 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 136:
-#line 1484 "awkgram.y" /* yacc.c:1646  */
+  case 141:
+#line 1409 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3472 "awkgram.c" /* yacc.c:1646  */
+#line 3465 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 137:
-#line 1489 "awkgram.y" /* yacc.c:1646  */
+  case 142:
+#line 1414 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3481 "awkgram.c" /* yacc.c:1646  */
+#line 3474 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 138:
-#line 1494 "awkgram.y" /* yacc.c:1646  */
+  case 143:
+#line 1419 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old) {
                    warning_ln((yyvsp[-1])->source_line,
@@ -3501,64 +3494,64 @@ regular_print:
                        (yyval) = list_append(list_merge(t, (yyvsp[0])), 
(yyvsp[-1]));
                }
          }
-#line 3505 "awkgram.c" /* yacc.c:1646  */
+#line 3498 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 139:
-#line 1519 "awkgram.y" /* yacc.c:1646  */
+  case 144:
+#line 1444 "awkgram.y" /* yacc.c:1646  */
     {
                  (yyval) = mk_getline((yyvsp[-1]), (yyvsp[0]), (yyvsp[-3]), 
(yyvsp[-2])->redir_type);
                  bcfree((yyvsp[-2]));
                }
-#line 3514 "awkgram.c" /* yacc.c:1646  */
+#line 3507 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 140:
-#line 1525 "awkgram.y" /* yacc.c:1646  */
+  case 145:
+#line 1450 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3520 "awkgram.c" /* yacc.c:1646  */
+#line 3513 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 141:
-#line 1527 "awkgram.y" /* yacc.c:1646  */
+  case 146:
+#line 1452 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3526 "awkgram.c" /* yacc.c:1646  */
+#line 3519 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 142:
-#line 1529 "awkgram.y" /* yacc.c:1646  */
+  case 147:
+#line 1454 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3532 "awkgram.c" /* yacc.c:1646  */
+#line 3525 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 143:
-#line 1531 "awkgram.y" /* yacc.c:1646  */
+  case 148:
+#line 1456 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3538 "awkgram.c" /* yacc.c:1646  */
+#line 3531 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 144:
-#line 1533 "awkgram.y" /* yacc.c:1646  */
+  case 149:
+#line 1458 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3544 "awkgram.c" /* yacc.c:1646  */
+#line 3537 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 145:
-#line 1535 "awkgram.y" /* yacc.c:1646  */
+  case 150:
+#line 1460 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3550 "awkgram.c" /* yacc.c:1646  */
+#line 3543 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 146:
-#line 1540 "awkgram.y" /* yacc.c:1646  */
+  case 151:
+#line 1465 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3558 "awkgram.c" /* yacc.c:1646  */
+#line 3551 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 147:
-#line 1544 "awkgram.y" /* yacc.c:1646  */
+  case 152:
+#line 1469 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->opcode == Op_match_rec) {
                        (yyvsp[0])->opcode = Op_nomatch;
@@ -3590,37 +3583,37 @@ regular_print:
                        }
                }
           }
-#line 3594 "awkgram.c" /* yacc.c:1646  */
+#line 3587 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 148:
-#line 1576 "awkgram.y" /* yacc.c:1646  */
+  case 153:
+#line 1501 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3600 "awkgram.c" /* yacc.c:1646  */
+#line 3593 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 149:
-#line 1578 "awkgram.y" /* yacc.c:1646  */
+  case 154:
+#line 1503 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3610 "awkgram.c" /* yacc.c:1646  */
+#line 3603 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 150:
-#line 1584 "awkgram.y" /* yacc.c:1646  */
+  case 155:
+#line 1509 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3620 "awkgram.c" /* yacc.c:1646  */
+#line 3613 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 151:
-#line 1590 "awkgram.y" /* yacc.c:1646  */
+  case 156:
+#line 1515 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
 
@@ -3633,45 +3626,45 @@ regular_print:
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3637 "awkgram.c" /* yacc.c:1646  */
+#line 3630 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 154:
-#line 1605 "awkgram.y" /* yacc.c:1646  */
+  case 159:
+#line 1530 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3646 "awkgram.c" /* yacc.c:1646  */
+#line 3639 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 155:
-#line 1610 "awkgram.y" /* yacc.c:1646  */
+  case 160:
+#line 1535 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3655 "awkgram.c" /* yacc.c:1646  */
+#line 3648 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 156:
-#line 1615 "awkgram.y" /* yacc.c:1646  */
+  case 161:
+#line 1540 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3663 "awkgram.c" /* yacc.c:1646  */
+#line 3656 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 157:
-#line 1619 "awkgram.y" /* yacc.c:1646  */
+  case 162:
+#line 1544 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3671 "awkgram.c" /* yacc.c:1646  */
+#line 3664 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 158:
-#line 1623 "awkgram.y" /* yacc.c:1646  */
+  case 163:
+#line 1548 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->lasti->opcode == Op_push_i
                        && ((yyvsp[0])->lasti->memory->flags & (STRCUR|STRING)) 
== 0
@@ -3686,11 +3679,11 @@ regular_print:
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
          }
-#line 3690 "awkgram.c" /* yacc.c:1646  */
+#line 3683 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 159:
-#line 1638 "awkgram.y" /* yacc.c:1646  */
+  case 164:
+#line 1563 "awkgram.y" /* yacc.c:1646  */
     {
            /*
             * was: $$ = $2
@@ -3700,20 +3693,20 @@ regular_print:
                (yyvsp[-1])->memory = make_number(0.0);
                (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
          }
-#line 3704 "awkgram.c" /* yacc.c:1646  */
+#line 3697 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 160:
-#line 1651 "awkgram.y" /* yacc.c:1646  */
+  case 165:
+#line 1576 "awkgram.y" /* yacc.c:1646  */
     {
                func_use((yyvsp[0])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[0]);
          }
-#line 3713 "awkgram.c" /* yacc.c:1646  */
+#line 3706 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 161:
-#line 1656 "awkgram.y" /* yacc.c:1646  */
+  case 166:
+#line 1581 "awkgram.y" /* yacc.c:1646  */
     {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -3746,11 +3739,11 @@ regular_print:
 
                (yyval) = list_prepend((yyvsp[0]), t);
          }
-#line 3750 "awkgram.c" /* yacc.c:1646  */
+#line 3743 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 162:
-#line 1692 "awkgram.y" /* yacc.c:1646  */
+  case 167:
+#line 1617 "awkgram.y" /* yacc.c:1646  */
     {
                param_sanity((yyvsp[-1]));
                (yyvsp[-3])->opcode = Op_func_call;
@@ -3764,49 +3757,49 @@ regular_print:
                        (yyval) = list_append(t, (yyvsp[-3]));
                }
          }
-#line 3768 "awkgram.c" /* yacc.c:1646  */
+#line 3761 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 163:
-#line 1709 "awkgram.y" /* yacc.c:1646  */
+  case 168:
+#line 1634 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3774 "awkgram.c" /* yacc.c:1646  */
+#line 3767 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 164:
-#line 1711 "awkgram.y" /* yacc.c:1646  */
+  case 169:
+#line 1636 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3780 "awkgram.c" /* yacc.c:1646  */
+#line 3773 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 165:
-#line 1716 "awkgram.y" /* yacc.c:1646  */
+  case 170:
+#line 1641 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3786 "awkgram.c" /* yacc.c:1646  */
+#line 3779 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 166:
-#line 1718 "awkgram.y" /* yacc.c:1646  */
+  case 171:
+#line 1643 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3792 "awkgram.c" /* yacc.c:1646  */
+#line 3785 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 167:
-#line 1723 "awkgram.y" /* yacc.c:1646  */
+  case 172:
+#line 1648 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3798 "awkgram.c" /* yacc.c:1646  */
+#line 3791 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 168:
-#line 1725 "awkgram.y" /* yacc.c:1646  */
+  case 173:
+#line 1650 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 3806 "awkgram.c" /* yacc.c:1646  */
+#line 3799 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 169:
-#line 1732 "awkgram.y" /* yacc.c:1646  */
+  case 174:
+#line 1657 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -3820,11 +3813,11 @@ regular_print:
                sub_counter++;  /* count # of dimensions */
                (yyval) = (yyvsp[0]);
          }
-#line 3824 "awkgram.c" /* yacc.c:1646  */
+#line 3817 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 170:
-#line 1749 "awkgram.y" /* yacc.c:1646  */
+  case 175:
+#line 1674 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *t = (yyvsp[-1]);
                if ((yyvsp[-1]) == NULL) {
@@ -3838,31 +3831,31 @@ regular_print:
                        (yyvsp[0])->sub_count = count_expressions(&t, false);
                (yyval) = list_append(t, (yyvsp[0]));
          }
-#line 3842 "awkgram.c" /* yacc.c:1646  */
+#line 3835 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 171:
-#line 1766 "awkgram.y" /* yacc.c:1646  */
+  case 176:
+#line 1691 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3848 "awkgram.c" /* yacc.c:1646  */
+#line 3841 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 172:
-#line 1768 "awkgram.y" /* yacc.c:1646  */
+  case 177:
+#line 1693 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 3856 "awkgram.c" /* yacc.c:1646  */
+#line 3849 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 173:
-#line 1775 "awkgram.y" /* yacc.c:1646  */
+  case 178:
+#line 1700 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3862 "awkgram.c" /* yacc.c:1646  */
+#line 3855 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 174:
-#line 1780 "awkgram.y" /* yacc.c:1646  */
+  case 179:
+#line 1705 "awkgram.y" /* yacc.c:1646  */
     {
                char *var_name = (yyvsp[0])->lextok;
 
@@ -3870,22 +3863,22 @@ regular_print:
                (yyvsp[0])->memory = variable((yyvsp[0])->source_line, 
var_name, Node_var_new);
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3874 "awkgram.c" /* yacc.c:1646  */
+#line 3867 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 175:
-#line 1788 "awkgram.y" /* yacc.c:1646  */
+  case 180:
+#line 1713 "awkgram.y" /* yacc.c:1646  */
     {
                char *arr = (yyvsp[-1])->lextok;
                (yyvsp[-1])->memory = variable((yyvsp[-1])->source_line, arr, 
Node_var_new);
                (yyvsp[-1])->opcode = Op_push_array;
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-1]));
          }
-#line 3885 "awkgram.c" /* yacc.c:1646  */
+#line 3878 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 176:
-#line 1798 "awkgram.y" /* yacc.c:1646  */
+  case 181:
+#line 1723 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->nexti;
                if (ip->opcode == Op_push
@@ -3897,73 +3890,73 @@ regular_print:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 3901 "awkgram.c" /* yacc.c:1646  */
+#line 3894 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 177:
-#line 1810 "awkgram.y" /* yacc.c:1646  */
+  case 182:
+#line 1735 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                if ((yyvsp[0]) != NULL)
                        mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3911 "awkgram.c" /* yacc.c:1646  */
+#line 3904 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 178:
-#line 1819 "awkgram.y" /* yacc.c:1646  */
+  case 183:
+#line 1744 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
          }
-#line 3919 "awkgram.c" /* yacc.c:1646  */
+#line 3912 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 179:
-#line 1823 "awkgram.y" /* yacc.c:1646  */
+  case 184:
+#line 1748 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
          }
-#line 3927 "awkgram.c" /* yacc.c:1646  */
+#line 3920 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 180:
-#line 1826 "awkgram.y" /* yacc.c:1646  */
+  case 185:
+#line 1751 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3933 "awkgram.c" /* yacc.c:1646  */
+#line 3926 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 182:
-#line 1834 "awkgram.y" /* yacc.c:1646  */
+  case 187:
+#line 1759 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 3939 "awkgram.c" /* yacc.c:1646  */
+#line 3932 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 183:
-#line 1838 "awkgram.y" /* yacc.c:1646  */
+  case 188:
+#line 1763 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 3945 "awkgram.c" /* yacc.c:1646  */
+#line 3938 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 186:
-#line 1847 "awkgram.y" /* yacc.c:1646  */
+  case 191:
+#line 1772 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 3951 "awkgram.c" /* yacc.c:1646  */
+#line 3944 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 187:
-#line 1851 "awkgram.y" /* yacc.c:1646  */
+  case 192:
+#line 1776 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); yyerrok; }
-#line 3957 "awkgram.c" /* yacc.c:1646  */
+#line 3950 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 188:
-#line 1855 "awkgram.y" /* yacc.c:1646  */
+  case 193:
+#line 1780 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 3963 "awkgram.c" /* yacc.c:1646  */
+#line 3956 "awkgram.c" /* yacc.c:1646  */
     break;
 
 
-#line 3967 "awkgram.c" /* yacc.c:1646  */
+#line 3960 "awkgram.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -4191,7 +4184,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 1857 "awkgram.y" /* yacc.c:1906  */
+#line 1782 "awkgram.y" /* yacc.c:1906  */
 
 
 struct token {
@@ -5466,6 +5459,7 @@ yylex(void)
        bool inhex = false;
        bool intlstr = false;
        AWKNUM d;
+       int prev_lasttok;
 
 #define GET_INSTRUCTION(op) bcalloc(op, 1, sourceline)
 
@@ -5498,6 +5492,7 @@ yylex(void)
        }
 #endif
 
+       prev_lasttok = lasttok;
        lexeme = lexptr;
        thisline = NULL;
        if (want_regexp) {
@@ -6251,6 +6246,25 @@ make_instruction:
                        yylval = GET_INSTRUCTION(tokentab[mid].value);
                        if (class == LEX_BUILTIN || class == LEX_LENGTH)
                                yylval->builtin_idx = mid;
+                       if (! do_traditional
+                           && (class == LEX_PRINT || class == LEX_PRINTF)) {
+                               switch (prev_lasttok) {
+                               case NEWLINE:
+                               case LEX_ELSE:
+                               case ':':       /* from case */
+                               case ';':
+                               case '{':
+                               case '(':
+                               case ')':
+                                       break;
+                               default:
+                                       if (class == LEX_PRINT)
+                                               class = LEX_PRINT_EXP;
+                                       if (class == LEX_PRINTF)
+                                               class = LEX_PRINTF_EXP;
+                                       break;
+                               }
+                       }
                        break;
                }
                return lasttok = class;
@@ -8005,6 +8019,112 @@ mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1)
        return list;
 }
 
+/* mk_print --- print or printf */
+
+static INSTRUCTION *
+mk_print(INSTRUCTION *op, INSTRUCTION *exp_list, INSTRUCTION *redir)
+{
+       INSTRUCTION *ret = NULL;
+
+       /*
+        * Optimization: plain `print' has no expression list, so exp_list is 
null.
+        * If exp_list is NULL or is a bytecode list for $0 use Op_K_print_rec,
+        * which is faster for these two cases.
+        */
+
+       if (op->opcode == Op_K_print &&
+               (exp_list == NULL
+                       || (exp_list->lasti->opcode == Op_field_spec
+                               && exp_list->nexti->nexti->nexti == 
exp_list->lasti
+                               && exp_list->nexti->nexti->opcode == Op_push_i
+                               && exp_list->nexti->nexti->memory->type == 
Node_val)
+               )
+       ) {
+               static bool warned = false;
+               /*   -----------------
+                *      output_redir
+                *    [ redirect exp ]
+                *   -----------------
+                *     expression_list
+                *   ------------------
+                *    [Op_K_print_rec | NULL | redir_type | expr_count]
+                */
+
+               if (exp_list != NULL) {
+                       NODE *n = exp_list->nexti->nexti->memory;
+
+                       if (! iszero(n))
+                               goto regular_print;
+
+                       bcfree(exp_list->lasti);                        /* 
Op_field_spec */
+                       unref(n);                               /* Node_val */
+                       bcfree(exp_list->nexti->nexti);         /* Op_push_i */
+                       bcfree(exp_list->nexti);                        /* 
Op_list */
+                       bcfree(exp_list);                               /* 
Op_list */
+               } else {
+                       if (do_lint && (rule == BEGIN || rule == END) && ! 
warned) {
+                               warned = true;
+                               lintwarn_ln(op->source_line,
+       _("plain `print' in BEGIN or END rule should probably be `print 
\"\"'"));
+                       }
+               }
+
+               op->expr_count = 0;
+               op->opcode = Op_K_print_rec;
+               if (redir == NULL) {    /* no redircetion */
+                       op->redir_type = redirect_none;
+                       ret = list_create(op);
+               } else {
+                       INSTRUCTION *ip;
+                       ip = redir->nexti;
+                       op->redir_type = ip->redir_type;
+                       redir->nexti = ip->nexti;
+                       bcfree(ip);
+                       ret = list_append(redir, op);
+               }
+       } else {
+               /*   -----------------
+                *    [ output_redir    ]
+                *    [ redirect exp    ]
+                *   -----------------
+                *    [ expression_list ]
+                *   ------------------
+                *    [op | NULL | redir_type | expr_count]
+                *
+                */
+regular_print:  
+               if (redir == NULL) {            /* no redirection */
+                       if (exp_list == NULL)   {       /* printf without arg */
+                               op->expr_count = 0;
+                               op->redir_type = redirect_none;
+                               ret = list_create(op);
+                       } else {
+                               INSTRUCTION *t = exp_list;
+                               op->expr_count = count_expressions(&t, false);
+                               op->redir_type = redirect_none;
+                               ret = list_append(t, op);
+                       }
+               } else {
+                       INSTRUCTION *ip;
+                       ip = redir->nexti;
+                       op->redir_type = ip->redir_type;
+                       redir->nexti = ip->nexti;
+                       bcfree(ip);
+                       if (exp_list == NULL) {
+                               op->expr_count = 0;
+                               ret = list_append(redir, op);
+                       } else {
+                               INSTRUCTION *t = exp_list;
+                               op->expr_count = count_expressions(&t, false);
+                               ret = list_append(list_merge(redir, t), op);
+                       }
+               }
+       }
+
+       assert(ret != NULL);
+       return ret;
+}
+
 /* count_expressions --- fixup expression_list from mk_expression_list.
  *                       returns no of expressions in list. isarg is true
  *                       for function arguments.
diff --git a/awkgram.y b/awkgram.y
index 85825cb..bc529bb 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -74,6 +74,7 @@ static INSTRUCTION *mk_binary(INSTRUCTION *s1, INSTRUCTION 
*s2, INSTRUCTION *op)
 static INSTRUCTION *mk_boolean(INSTRUCTION *left, INSTRUCTION *right, 
INSTRUCTION *op);
 static INSTRUCTION *mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, 
INSTRUCTION *op);
 static INSTRUCTION *mk_getline(INSTRUCTION *op, INSTRUCTION *opt_var, 
INSTRUCTION *redir, int redirtype);
+static INSTRUCTION *mk_print(INSTRUCTION *op, INSTRUCTION *exp_list, 
INSTRUCTION *redir);
 static NODE *make_regnode(int type, NODE *exp);
 static int count_expressions(INSTRUCTION **list, bool isarg);
 static INSTRUCTION *optimize_assignment(INSTRUCTION *exp);
@@ -171,6 +172,7 @@ extern double fmod(double x, double y);
 %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
 %token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION
+%token LEX_PRINT_EXP LEX_PRINTF_EXP
 %token LEX_BEGINFILE LEX_ENDFILE 
 %token LEX_GETLINE LEX_NEXTFILE
 %token LEX_IN
@@ -933,6 +935,13 @@ non_compound_stmt
        | simple_stmt statement_term
        ;
 
+print_expression
+       : print_exp { in_print = true; in_parens = 0; } print_expression_list 
output_redir
+         {
+               $$ = mk_print($1, $3, $4);
+         }
+       ;
+
        /*
         * A simple_stmt exists to satisfy a constraint in the POSIX
         * grammar allowing them to occur as the 1st and 3rd parts
@@ -944,100 +953,7 @@ non_compound_stmt
 simple_stmt
        : print { in_print = true; in_parens = 0; } print_expression_list 
output_redir
          {
-               /*
-                * Optimization: plain `print' has no expression list, so $3 is 
null.
-                * If $3 is NULL or is a bytecode list for $0 use 
Op_K_print_rec,
-                * which is faster for these two cases.
-                */
-
-               if ($1->opcode == Op_K_print &&
-                       ($3 == NULL
-                               || ($3->lasti->opcode == Op_field_spec
-                                       && $3->nexti->nexti->nexti == $3->lasti
-                                       && $3->nexti->nexti->opcode == Op_push_i
-                                       && $3->nexti->nexti->memory->type == 
Node_val)
-                       )
-               ) {
-                       static bool warned = false;
-                       /*   -----------------
-                        *      output_redir
-                        *    [ redirect exp ]
-                        *   -----------------
-                        *     expression_list
-                        *   ------------------
-                        *    [Op_K_print_rec | NULL | redir_type | expr_count]
-                        */
-
-                       if ($3 != NULL) {
-                               NODE *n = $3->nexti->nexti->memory;
-
-                               if (! iszero(n))
-                                       goto regular_print;
-
-                               bcfree($3->lasti);                      /* 
Op_field_spec */
-                               unref(n);                               /* 
Node_val */
-                               bcfree($3->nexti->nexti);               /* 
Op_push_i */
-                               bcfree($3->nexti);                      /* 
Op_list */
-                               bcfree($3);                             /* 
Op_list */
-                       } else {
-                               if (do_lint && (rule == BEGIN || rule == END) 
&& ! warned) {
-                                       warned = true;
-                                       lintwarn_ln($1->source_line,
-               _("plain `print' in BEGIN or END rule should probably be `print 
\"\"'"));
-                               }
-                       }
-
-                       $1->expr_count = 0;
-                       $1->opcode = Op_K_print_rec;
-                       if ($4 == NULL) {    /* no redircetion */
-                               $1->redir_type = redirect_none;
-                               $$ = list_create($1);
-                       } else {
-                               INSTRUCTION *ip;
-                               ip = $4->nexti;
-                               $1->redir_type = ip->redir_type;
-                               $4->nexti = ip->nexti;
-                               bcfree(ip);
-                               $$ = list_append($4, $1);
-                       }
-               } else {
-                       /*   -----------------
-                        *    [ output_redir    ]
-                        *    [ redirect exp    ]
-                        *   -----------------
-                        *    [ expression_list ]
-                        *   ------------------
-                        *    [$1 | NULL | redir_type | expr_count]
-                        *
-                        */
-regular_print:  
-                       if ($4 == NULL) {               /* no redirection */
-                               if ($3 == NULL) {       /* printf without arg */
-                                       $1->expr_count = 0;
-                                       $1->redir_type = redirect_none;
-                                       $$ = list_create($1);
-                               } else {
-                                       INSTRUCTION *t = $3;
-                                       $1->expr_count = count_expressions(&t, 
false);
-                                       $1->redir_type = redirect_none;
-                                       $$ = list_append(t, $1);
-                               }
-                       } else {
-                               INSTRUCTION *ip;
-                               ip = $4->nexti;
-                               $1->redir_type = ip->redir_type;
-                               $4->nexti = ip->nexti;
-                               bcfree(ip);
-                               if ($3 == NULL) {
-                                       $1->expr_count = 0;
-                                       $$ = list_append($4, $1);
-                               } else {
-                                       INSTRUCTION *t = $3;
-                                       $1->expr_count = count_expressions(&t, 
false);
-                                       $$ = list_append(list_merge($4, t), $1);
-                               }
-                       }
-               }
+               $$ = mk_print($1, $3, $4);
          }
 
        | LEX_DELETE NAME { sub_counter = 0; } delete_subscript_list
@@ -1186,6 +1102,13 @@ print
          { $$ = $1; }
        ;
 
+print_exp
+       : LEX_PRINT_EXP
+         { $$ = $1; }
+       | LEX_PRINTF_EXP
+         { $$ = $1; }
+       ;
+
        /*
         * Note: ``print(x)'' is already parsed by the first rule,
         * so there is no good in covering it by the second one too.
@@ -1369,6 +1292,8 @@ exp
          { $$ = mk_condition($1, $2, $3, $4, $5); }
        | common_exp
          { $$ = $1; }
+       | print_expression
+         { $$ = $1; }
        ;
 
 assign_operator
@@ -3128,6 +3053,7 @@ yylex(void)
        bool inhex = false;
        bool intlstr = false;
        AWKNUM d;
+       int prev_lasttok;
 
 #define GET_INSTRUCTION(op) bcalloc(op, 1, sourceline)
 
@@ -3160,6 +3086,7 @@ yylex(void)
        }
 #endif
 
+       prev_lasttok = lasttok;
        lexeme = lexptr;
        thisline = NULL;
        if (want_regexp) {
@@ -3913,6 +3840,25 @@ make_instruction:
                        yylval = GET_INSTRUCTION(tokentab[mid].value);
                        if (class == LEX_BUILTIN || class == LEX_LENGTH)
                                yylval->builtin_idx = mid;
+                       if (! do_traditional
+                           && (class == LEX_PRINT || class == LEX_PRINTF)) {
+                               switch (prev_lasttok) {
+                               case NEWLINE:
+                               case LEX_ELSE:
+                               case ':':       /* from case */
+                               case ';':
+                               case '{':
+                               case '(':
+                               case ')':
+                                       break;
+                               default:
+                                       if (class == LEX_PRINT)
+                                               class = LEX_PRINT_EXP;
+                                       if (class == LEX_PRINTF)
+                                               class = LEX_PRINTF_EXP;
+                                       break;
+                               }
+                       }
                        break;
                }
                return lasttok = class;
@@ -5667,6 +5613,112 @@ mk_expression_list(INSTRUCTION *list, INSTRUCTION *s1)
        return list;
 }
 
+/* mk_print --- print or printf */
+
+static INSTRUCTION *
+mk_print(INSTRUCTION *op, INSTRUCTION *exp_list, INSTRUCTION *redir)
+{
+       INSTRUCTION *ret = NULL;
+
+       /*
+        * Optimization: plain `print' has no expression list, so exp_list is 
null.
+        * If exp_list is NULL or is a bytecode list for $0 use Op_K_print_rec,
+        * which is faster for these two cases.
+        */
+
+       if (op->opcode == Op_K_print &&
+               (exp_list == NULL
+                       || (exp_list->lasti->opcode == Op_field_spec
+                               && exp_list->nexti->nexti->nexti == 
exp_list->lasti
+                               && exp_list->nexti->nexti->opcode == Op_push_i
+                               && exp_list->nexti->nexti->memory->type == 
Node_val)
+               )
+       ) {
+               static bool warned = false;
+               /*   -----------------
+                *      output_redir
+                *    [ redirect exp ]
+                *   -----------------
+                *     expression_list
+                *   ------------------
+                *    [Op_K_print_rec | NULL | redir_type | expr_count]
+                */
+
+               if (exp_list != NULL) {
+                       NODE *n = exp_list->nexti->nexti->memory;
+
+                       if (! iszero(n))
+                               goto regular_print;
+
+                       bcfree(exp_list->lasti);                        /* 
Op_field_spec */
+                       unref(n);                               /* Node_val */
+                       bcfree(exp_list->nexti->nexti);         /* Op_push_i */
+                       bcfree(exp_list->nexti);                        /* 
Op_list */
+                       bcfree(exp_list);                               /* 
Op_list */
+               } else {
+                       if (do_lint && (rule == BEGIN || rule == END) && ! 
warned) {
+                               warned = true;
+                               lintwarn_ln(op->source_line,
+       _("plain `print' in BEGIN or END rule should probably be `print 
\"\"'"));
+                       }
+               }
+
+               op->expr_count = 0;
+               op->opcode = Op_K_print_rec;
+               if (redir == NULL) {    /* no redircetion */
+                       op->redir_type = redirect_none;
+                       ret = list_create(op);
+               } else {
+                       INSTRUCTION *ip;
+                       ip = redir->nexti;
+                       op->redir_type = ip->redir_type;
+                       redir->nexti = ip->nexti;
+                       bcfree(ip);
+                       ret = list_append(redir, op);
+               }
+       } else {
+               /*   -----------------
+                *    [ output_redir    ]
+                *    [ redirect exp    ]
+                *   -----------------
+                *    [ expression_list ]
+                *   ------------------
+                *    [op | NULL | redir_type | expr_count]
+                *
+                */
+regular_print:  
+               if (redir == NULL) {            /* no redirection */
+                       if (exp_list == NULL)   {       /* printf without arg */
+                               op->expr_count = 0;
+                               op->redir_type = redirect_none;
+                               ret = list_create(op);
+                       } else {
+                               INSTRUCTION *t = exp_list;
+                               op->expr_count = count_expressions(&t, false);
+                               op->redir_type = redirect_none;
+                               ret = list_append(t, op);
+                       }
+               } else {
+                       INSTRUCTION *ip;
+                       ip = redir->nexti;
+                       op->redir_type = ip->redir_type;
+                       redir->nexti = ip->nexti;
+                       bcfree(ip);
+                       if (exp_list == NULL) {
+                               op->expr_count = 0;
+                               ret = list_append(redir, op);
+                       } else {
+                               INSTRUCTION *t = exp_list;
+                               op->expr_count = count_expressions(&t, false);
+                               ret = list_append(list_merge(redir, t), op);
+                       }
+               }
+       }
+
+       assert(ret != NULL);
+       return ret;
+}
+
 /* count_expressions --- fixup expression_list from mk_expression_list.
  *                       returns no of expressions in list. isarg is true
  *                       for function arguments.

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


hooks/post-receive
-- 
gawk



reply via email to

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