gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, feature/namespaces, updated. gawk-4.1.0-


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, feature/namespaces, updated. gawk-4.1.0-2577-gf26af58
Date: Sun, 11 Jun 2017 14:08:45 -0400 (EDT)

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, feature/namespaces has been updated
       via  f26af582f048d8b95122dbe695aeb3d1c250c9fd (commit)
      from  6e7a37483b47d388f3792a24c4b09817cb873cd4 (commit)

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

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

commit f26af582f048d8b95122dbe695aeb3d1c250c9fd
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Jun 11 21:08:23 2017 +0300

    Add @namespace directive, more checking, more doc.

diff --git a/ChangeLog b/ChangeLog
index b977cee..f23bed4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2017-06-11         Arnold D. Robbins     <address@hidden>
+
+       * awk.h (awk_namespace, current_namespace): Declare.
+       (opcodeval): Add Op_K_namespace.
+       * awkgram.y (awk_namespace, current_namespace): Define.
+       (LEX_NAMESPACE): Add lexing and parsing of address@hidden directive'.
+       (tokentab): Add "namespace" entry.
+       (yylex): Check if first part of qualified identifier is
+       a reserved word or function.
+       * eval.c (optypetab): Add Op_K_namespace.
+
 2017-06-06         Arnold D. Robbins     <address@hidden>
 
        * awkgram.y (yylex): Allow :: in identifiers (the "NAME" token).
diff --git a/awk.h b/awk.h
index ab84c58..2f95bc6 100644
--- a/awk.h
+++ b/awk.h
@@ -735,6 +735,7 @@ typedef enum opcodeval {
        Op_K_if,
        Op_K_else,
        Op_K_function,
+       Op_K_namespace,
        Op_cond_exp,
        Op_final                        /* sentry value, not legal */
 } OPCODE;
@@ -1204,6 +1205,9 @@ extern char envsep;
 
 extern char casetable[];       /* for case-independent regexp matching */
 
+extern const char awk_namespace[];     /* "awk::" */
+extern const char *current_namespace;
+
 /* ------------------------- Runtime stack -------------------------------- */
 
 typedef union stack_item {
diff --git a/awkgram.c b/awkgram.c
index bf44ba8..795175d 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -183,6 +183,9 @@ extern INSTRUCTION *rule_list;
 extern int max_args;
 extern NODE **args_array;
 
+const char awk_namespace[] = "awk::";
+const char *current_namespace = NULL;
+
 static INSTRUCTION *rule_block[sizeof(ruletab)];
 
 static INSTRUCTION *ip_rec;
@@ -213,7 +216,7 @@ extern double fmod(double x, double y);
 
 #define YYSTYPE INSTRUCTION *
 
-#line 217 "awkgram.c" /* yacc.c:339  */
+#line 220 "awkgram.c" /* yacc.c:339  */
 
 # ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
@@ -294,9 +297,10 @@ extern int yydebug;
     LEX_INCLUDE = 304,
     LEX_EVAL = 305,
     LEX_LOAD = 306,
-    NEWLINE = 307,
-    SLASH_BEFORE_EQUAL = 308,
-    UNARY = 309
+    LEX_NAMESPACE = 307,
+    NEWLINE = 308,
+    SLASH_BEFORE_EQUAL = 309,
+    UNARY = 310
   };
 #endif
 /* Tokens.  */
@@ -349,9 +353,10 @@ extern int yydebug;
 #define LEX_INCLUDE 304
 #define LEX_EVAL 305
 #define LEX_LOAD 306
-#define NEWLINE 307
-#define SLASH_BEFORE_EQUAL 308
-#define UNARY 309
+#define LEX_NAMESPACE 307
+#define NEWLINE 308
+#define SLASH_BEFORE_EQUAL 309
+#define UNARY 310
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -369,7 +374,7 @@ int yyparse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 373 "awkgram.c" /* yacc.c:358  */
+#line 378 "awkgram.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -611,21 +616,21 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1236
+#define YYLAST   1199
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  76
+#define YYNTOKENS  77
 /* YYNNTS -- Number of nonterminals.  */
-#define YYNNTS  70
+#define YYNNTS  71
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  203
+#define YYNRULES  207
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  350
+#define YYNSTATES  356
 
 /* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
    by yylex, with out-of-bounds checking.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   309
+#define YYMAXUTOK   310
 
 #define YYTRANSLATE(YYX)                                                \
   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -637,16 +642,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,    64,     2,     2,    67,    63,     2,     2,
-      68,    69,    61,    59,    56,    60,     2,    62,     2,     2,
-       2,     2,     2,     2,     2,     2,     2,     2,    55,    75,
-      57,     2,    58,    54,    70,     2,     2,     2,     2,     2,
+       2,     2,     2,    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,    71,     2,    72,    66,     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,    73,     2,    74,     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,
@@ -664,34 +669,35 @@ 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,    53,    65
+      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,   216,   216,   218,   223,   224,   228,   240,   245,   256,
-     263,   269,   278,   286,   288,   293,   301,   303,   309,   317,
-     327,   357,   371,   385,   393,   404,   416,   418,   420,   426,
-     434,   435,   439,   439,   485,   484,   518,   533,   535,   540,
-     550,   597,   602,   603,   607,   609,   611,   618,   708,   750,
-     792,   905,   912,   919,   930,   940,   950,   960,   972,   989,
-     988,  1013,  1025,  1025,  1124,  1124,  1158,  1189,  1198,  1199,
-    1205,  1206,  1213,  1218,  1230,  1244,  1246,  1254,  1261,  1263,
-    1271,  1280,  1282,  1291,  1292,  1300,  1305,  1305,  1316,  1320,
-    1328,  1329,  1332,  1334,  1339,  1340,  1349,  1350,  1355,  1360,
-    1369,  1371,  1373,  1380,  1381,  1387,  1388,  1393,  1395,  1400,
-    1402,  1410,  1415,  1424,  1425,  1430,  1432,  1437,  1439,  1447,
-    1452,  1460,  1461,  1466,  1473,  1477,  1479,  1481,  1494,  1511,
-    1521,  1528,  1530,  1535,  1537,  1539,  1547,  1549,  1554,  1556,
-    1561,  1563,  1565,  1621,  1623,  1625,  1627,  1629,  1631,  1633,
-    1635,  1649,  1654,  1659,  1684,  1690,  1692,  1694,  1696,  1698,
-    1700,  1705,  1709,  1741,  1743,  1749,  1755,  1768,  1769,  1770,
-    1775,  1780,  1784,  1788,  1803,  1824,  1829,  1866,  1895,  1896,
-    1902,  1903,  1908,  1910,  1917,  1934,  1951,  1953,  1960,  1965,
-    1973,  1983,  1995,  2004,  2008,  2012,  2016,  2020,  2024,  2027,
-    2029,  2033,  2037,  2041
+       0,   219,   219,   221,   226,   227,   231,   243,   248,   259,
+     266,   272,   278,   296,   304,   306,   311,   319,   321,   326,
+     328,   330,   336,   344,   354,   384,   398,   412,   420,   431,
+     443,   445,   447,   453,   461,   462,   466,   466,   512,   511,
+     545,   560,   562,   567,   577,   624,   629,   630,   634,   636,
+     638,   645,   735,   777,   819,   932,   939,   946,   957,   967,
+     977,   987,   999,  1016,  1015,  1040,  1052,  1052,  1151,  1151,
+    1185,  1216,  1225,  1226,  1232,  1233,  1240,  1245,  1257,  1271,
+    1273,  1281,  1288,  1290,  1298,  1307,  1309,  1318,  1319,  1327,
+    1332,  1332,  1343,  1347,  1355,  1356,  1359,  1361,  1366,  1367,
+    1376,  1377,  1382,  1387,  1396,  1398,  1400,  1407,  1408,  1414,
+    1415,  1420,  1422,  1427,  1429,  1437,  1442,  1451,  1452,  1457,
+    1459,  1464,  1466,  1474,  1479,  1487,  1488,  1493,  1500,  1504,
+    1506,  1508,  1521,  1538,  1548,  1555,  1557,  1562,  1564,  1566,
+    1574,  1576,  1581,  1583,  1588,  1590,  1592,  1648,  1650,  1652,
+    1654,  1656,  1658,  1660,  1662,  1676,  1681,  1686,  1711,  1717,
+    1719,  1721,  1723,  1725,  1727,  1732,  1736,  1768,  1770,  1776,
+    1782,  1795,  1796,  1797,  1802,  1807,  1811,  1815,  1830,  1851,
+    1856,  1893,  1922,  1923,  1929,  1930,  1935,  1937,  1944,  1961,
+    1978,  1980,  1987,  1992,  2000,  2010,  2022,  2031,  2035,  2039,
+    2043,  2047,  2051,  2054,  2056,  2060,  2064,  2068
 };
 #endif
 
@@ -709,17 +715,18 @@ static const char *const yytname[] =
   "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",
-  "address@hidden", "regexp", "address@hidden", "typed_regexp", "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",
+  "LEX_INCLUDE", "LEX_EVAL", "LEX_LOAD", "LEX_NAMESPACE", "NEWLINE",
+  "SLASH_BEFORE_EQUAL", "'?'", "':'", "','", "'<'", "'>'", "'+'", "'-'",
+  "'*'", "'/'", "'%'", "'!'", "UNARY", "'^'", "'$'", "'('", "')'", "'@'",
+  "'['", "']'", "'{'", "'}'", "';'", "$accept", "program", "rule",
+  "source", "library", "namespace", "pattern", "action", "func_name",
+  "lex_builtin", "function_prologue", "address@hidden", "regexp", 
"address@hidden",
+  "typed_regexp", "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",
   "opt_fcall_expression_list", "fcall_expression_list", "fcall_exp", "exp",
   "assign_operator", "relop_or_less", "a_relop", "common_exp", "simp_exp",
   "simp_exp_nc", "non_post_simp_exp", "func_call", "direct_func_call",
@@ -740,61 +747,62 @@ 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,   308,    63,    58,    44,    60,    62,    43,
-      45,    42,    47,    37,    33,   309,    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 -275
+#define YYPACT_NINF -294
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-275)))
+  (!!((Yystate) == (-294)))
 
-#define YYTABLE_NINF -115
+#define YYTABLE_NINF -119
 
 #define yytable_value_is_error(Yytable_value) \
-  (!!((Yytable_value) == (-115)))
+  (!!((Yytable_value) == (-119)))
 
   /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -275,   376,  -275,  -275,   -12,    -9,  -275,  -275,  -275,  -275,
-     171,  -275,  -275,    44,    44,    44,     5,    40,  -275,  -275,
-    -275,  1139,  1139,  -275,  1139,  1166,   869,    27,  -275,   -18,
-       2,  -275,  -275,    89,   884,  1065,   192,   214,  -275,  -275,
-    -275,  -275,   248,   795,   869,  -275,    10,  -275,  -275,  -275,
-    -275,  -275,   116,    82,  -275,   115,  -275,  -275,  -275,   795,
-     795,   166,   107,   104,   107,   107,  1139,   117,  -275,  -275,
-      15,   349,    23,    45,  -275,   125,  -275,  -275,  -275,    89,
-    -275,   125,  -275,   178,  -275,  -275,  1092,   172,  1139,  1139,
-    1139,   125,  -275,  -275,  -275,  1139,   146,   192,  1139,  1139,
-    1139,  1139,  1139,  1139,  1139,  1139,  1139,  1139,  1139,  1139,
-    -275,   181,  -275,  -275,   173,  1139,  -275,  -275,  -275,   128,
-      73,  -275,  1107,    14,  1107,  -275,  -275,  -275,  -275,  1139,
-    -275,   128,   128,   349,  -275,  -275,  -275,  1139,   125,  -275,
-     152,   916,  -275,  -275,    16,    92,  -275,    20,    92,    89,
-    -275,   599,  -275,  -275,  -275,   148,  -275,   124,    22,  1048,
-    1139,   199,    44,   265,   265,   107,   107,   107,   107,   265,
-     265,   107,   107,   107,   107,  -275,  -275,  1107,  -275,  1092,
-     842,  -275,    43,   192,  -275,  -275,  1107,  -275,   172,  -275,
-    1107,  -275,  -275,  -275,  -275,  -275,   133,  -275,    41,   144,
-     145,   125,   147,    92,    92,  -275,  -275,    92,  1139,    92,
-     125,  -275,  -275,    92,  -275,  -275,  1107,  -275,   151,   125,
-    1139,  1107,  -275,  -275,  -275,  -275,  -275,  -275,   128,    76,
-    -275,  1139,  1139,  -275,   224,  1139,  1139,   715,   949,  -275,
-    -275,  -275,    92,  1107,  -275,  -275,  -275,   646,   599,   125,
-    -275,  -275,  1107,   125,  -275,    49,   349,    92,    -9,   160,
-     349,   349,   206,   113,  -275,   151,  -275,   869,   225,  -275,
-     169,  -275,  -275,  -275,  -275,  -275,   125,  -275,  -275,    11,
-    -275,  -275,  -275,   125,   125,   179,   172,   125,    15,  -275,
-    -275,   715,  -275,  -275,     2,   715,  1139,   128,   762,   152,
-    1139,   219,  -275,  -275,   349,   125,   275,   125,  1065,   125,
-     112,   125,   715,   125,   997,   715,  -275,   261,   205,  -275,
-     191,  -275,  -275,   997,   128,  -275,  -275,  -275,   271,   272,
-    -275,  -275,   205,  -275,   125,  -275,   128,   125,  -275,  -275,
-     125,  -275,   125,   715,  -275,   449,   715,  -275,   524,  -275
+    -294,   343,  -294,  -294,   -20,   -16,  -294,  -294,  -294,  -294,
+      14,  -294,  -294,    26,    26,    26,    -7,    13,  -294,  -294,
+    -294,  1074,  1074,  -294,  1074,  1102,   845,   248,  -294,   194,
+     -10,  -294,  -294,    25,   312,  1001,   366,   405,  -294,  -294,
+    -294,  -294,   320,   769,   845,  -294,     9,  -294,  -294,  -294,
+    -294,  -294,    59,    76,  -294,   101,  -294,  -294,  -294,   769,
+     769,   159,    98,   129,    98,    98,  1074,   140,  -294,  -294,
+       0,   265,    28,    39,    45,  -294,   115,  -294,  -294,  -294,
+      25,  -294,   115,  -294,   165,  -294,  -294,  1029,   176,  1074,
+    1074,  1074,   115,  -294,  -294,  -294,  1074,   149,   366,  1074,
+    1074,  1074,  1074,  1074,  1074,  1074,  1074,  1074,  1074,  1074,
+    1074,  -294,   186,  -294,  -294,   189,  1074,  -294,  -294,  -294,
+     130,    23,  -294,  1044,    83,  1044,  -294,  -294,  -294,  -294,
+    1074,  -294,   130,   130,   265,  -294,  -294,  -294,  1074,   115,
+    -294,   167,   873,  -294,  -294,    20,    -5,  -294,    82,    -5,
+    -294,    90,    -5,    25,  -294,   569,  -294,  -294,  -294,    18,
+    -294,   342,   157,  1140,  1074,   199,    26,    88,    88,    98,
+      98,    98,    98,    88,    88,    98,    98,    98,    98,  -294,
+    -294,  1044,  -294,  1029,   797,  -294,    43,   366,  -294,  -294,
+    1044,  -294,   176,  -294,  1044,  -294,  -294,  -294,  -294,  -294,
+    -294,  -294,   145,  -294,    10,   151,   155,   115,   163,    -5,
+      -5,  -294,  -294,    -5,  1074,    -5,   115,  -294,  -294,    -5,
+    -294,  -294,  1044,  -294,   168,   115,  1074,  1044,  -294,  -294,
+    -294,  -294,  -294,  -294,   130,    91,  -294,  1074,  1074,  -294,
+     245,  1074,  1074,   687,   922,  -294,  -294,  -294,    -5,  1044,
+    -294,  -294,  -294,   617,   569,   115,  -294,  -294,  1044,   115,
+    -294,   110,   265,    -5,   -16,   184,   265,   265,   239,    -6,
+    -294,   168,  -294,   845,   263,  -294,   193,  -294,  -294,  -294,
+    -294,  -294,   115,  -294,  -294,    15,  -294,  -294,  -294,   115,
+     115,   207,   176,   115,     0,  -294,  -294,   687,  -294,  -294,
+     -10,   687,  1074,   130,   721,   167,  1074,   258,  -294,  -294,
+     265,   115,   134,   115,  1001,   115,   180,   115,   687,   115,
+     956,   687,  -294,   332,   225,  -294,   208,  -294,  -294,   956,
+     130,  -294,  -294,  -294,   278,   282,  -294,  -294,   225,  -294,
+     115,  -294,   130,   115,  -294,  -294,   115,  -294,   115,   687,
+    -294,   417,   687,  -294,   493,  -294
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -802,65 +810,68 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,     6,     0,   189,   171,   172,    21,    22,
-       0,    23,    24,   178,     0,     0,     0,   166,     5,    90,
-      38,     0,     0,    37,     0,     0,     0,     0,     3,     0,
-       0,   161,    34,     4,    19,   132,   140,   141,   143,   167,
-     175,   191,   168,     0,     0,   186,     0,   190,    27,    26,
-      30,    31,     0,     0,    28,    94,   179,   169,   170,     0,
-       0,     0,   174,   168,   173,   162,     0,   195,   168,   109,
-       0,   107,     0,     0,   176,    92,   201,     7,     8,    42,
-      39,    92,     9,     0,    91,   136,     0,     0,     0,     0,
-       0,    92,   137,   139,   138,     0,     0,   142,     0,     0,
+       2,     0,     1,     6,     0,   193,   175,   176,    25,    26,
+       0,    27,    28,   182,     0,     0,     0,   170,     5,    94,
+      42,     0,     0,    41,     0,     0,     0,     0,     3,     0,
+       0,   165,    38,     4,    23,   136,   144,   145,   147,   171,
+     179,   195,   172,     0,     0,   190,     0,   194,    31,    30,
+      34,    35,     0,     0,    32,    98,   183,   173,   174,     0,
+       0,     0,   178,   172,   177,   166,     0,   199,   172,   113,
+       0,   111,     0,     0,     0,   180,    96,   205,     7,     8,
+      46,    43,    96,     9,     0,    95,   140,     0,     0,     0,
+       0,     0,    96,   141,   143,   142,     0,     0,   146,     0,
        0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-     134,   133,   151,   152,     0,     0,   117,    36,   122,     0,
-       0,   115,   121,     0,   107,   188,   187,    29,    32,     0,
-     150,     0,     0,     0,   193,   194,   192,   110,    92,   198,
-       0,     0,   163,    14,     0,     0,    17,     0,     0,    93,
-     196,     0,    43,    35,   127,   128,   129,   125,   126,     0,
-       0,   130,   178,   148,   149,   145,   146,   147,   144,   159,
-     160,   156,   157,   158,   155,   124,   135,   123,   177,   118,
-       0,   185,     0,    95,   164,   165,   111,   203,     0,   112,
-     108,    13,    10,    16,    11,    41,     0,    59,     0,     0,
-       0,    92,     0,     0,     0,    81,    82,     0,   103,     0,
-      92,    40,    53,     0,    62,    46,    67,    39,   199,    92,
-       0,    20,   154,   119,   120,   116,   100,    98,     0,     0,
-     153,     0,   103,    64,     0,     0,     0,     0,    68,    54,
-      55,    56,     0,   104,    57,   197,    61,     0,     0,    92,
-     200,    44,   131,    92,   101,     0,     0,     0,   180,     0,
-       0,     0,     0,   189,    69,     0,    58,     0,    85,    83,
-       0,    45,    25,    33,   102,    99,    92,    60,    65,     0,
-     182,   184,    66,    92,    92,     0,     0,    92,     0,    86,
-      63,     0,   181,   183,     0,     0,     0,     0,     0,    84,
-       0,    88,    70,    48,     0,    92,     0,    92,    87,    92,
-       0,    92,     0,    92,    68,     0,    72,     0,     0,    71,
-       0,    49,    50,    68,     0,    89,    75,    78,     0,     0,
-      79,    80,     0,   202,    92,    47,     0,    92,    77,    76,
-      92,    39,    92,     0,    39,     0,     0,    52,     0,    51
+       0,   138,   137,   155,   156,     0,     0,   121,    40,   126,
+       0,     0,   119,   125,     0,   111,   192,   191,    33,    36,
+       0,   154,     0,     0,     0,   197,   198,   196,   114,    96,
+     202,     0,     0,   167,    15,     0,     0,    18,     0,     0,
+      21,     0,     0,    97,   200,     0,    47,    39,   131,   132,
+     133,   129,   130,     0,     0,   134,   182,   152,   153,   149,
+     150,   151,   148,   163,   164,   160,   161,   162,   159,   128,
+     139,   127,   181,   122,     0,   189,     0,    99,   168,   169,
+     115,   207,     0,   116,   112,    14,    10,    17,    11,    20,
+      12,    45,     0,    63,     0,     0,     0,    96,     0,     0,
+       0,    85,    86,     0,   107,     0,    96,    44,    57,     0,
+      66,    50,    71,    43,   203,    96,     0,    24,   158,   123,
+     124,   120,   104,   102,     0,     0,   157,     0,   107,    68,
+       0,     0,     0,     0,    72,    58,    59,    60,     0,   108,
+      61,   201,    65,     0,     0,    96,   204,    48,   135,    96,
+     105,     0,     0,     0,   184,     0,     0,     0,     0,   193,
+      73,     0,    62,     0,    89,    87,     0,    49,    29,    37,
+     106,   103,    96,    64,    69,     0,   186,   188,    70,    96,
+      96,     0,     0,    96,     0,    90,    67,     0,   185,   187,
+       0,     0,     0,     0,     0,    88,     0,    92,    74,    52,
+       0,    96,     0,    96,    91,    96,     0,    96,     0,    96,
+      72,     0,    76,     0,     0,    75,     0,    53,    54,    72,
+       0,    93,    79,    82,     0,     0,    83,    84,     0,   206,
+      96,    51,     0,    96,    81,    80,    96,    43,    96,     0,
+      43,     0,     0,    56,     0,    55
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -275,  -275,  -275,  -275,  -275,  -275,   252,  -275,  -275,  -275,
-    -275,   -33,  -275,   -80,  -275,  -213,   100,  -144,  -275,  -275,
-    -231,  -275,  -275,  -274,  -275,  -275,  -275,  -275,  -275,  -275,
-    -275,  -275,     7,    62,  -275,  -275,  -275,    54,  -275,   -43,
-       1,  -275,   -23,    -1,  -275,  -275,  -275,   -13,    17,  -275,
-     263,  -275,     8,   127,  -275,  -275,    21,   -36,  -275,  -275,
-     -78,    -2,  -275,   -27,  -230,   -65,  -275,   -15,   -38,   -94
+    -294,  -294,  -294,  -294,  -294,  -294,  -294,   261,  -294,  -294,
+    -294,  -294,   -31,  -294,   -81,  -294,  -216,   -77,   -90,  -294,
+    -294,  -190,  -294,  -294,  -293,  -294,  -294,  -294,  -294,  -294,
+    -294,  -294,  -294,     8,   -29,  -294,  -294,  -294,    55,  -294,
+     -34,   131,  -294,    51,    -1,  -294,  -294,  -294,   -12,    17,
+    -294,   271,  -294,   -11,   132,  -294,  -294,    30,   -42,  -294,
+    -294,   -80,    -2,  -294,   -27,  -180,   -65,  -294,    24,   -36,
+    -106
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-      -1,     1,    28,   145,   148,    29,    77,    53,    54,    30,
-     182,    31,    83,   118,    32,   151,    78,   211,   212,   232,
-     213,   247,   258,   265,   310,   319,   332,   214,   268,   290,
-     300,   215,   149,   150,   130,   228,   229,   242,   269,    70,
-     119,   120,   121,   216,   115,    94,    95,    35,    36,    37,
-      38,    39,    40,    55,   278,   279,   280,    45,    46,    47,
-      41,    42,   136,   217,   218,   142,   249,   219,   334,   141
+      -1,     1,    28,   146,   149,   152,    29,    78,    53,    54,
+      30,   186,    31,    84,   119,    32,   155,    79,   217,   218,
+     238,   219,   253,   264,   271,   316,   325,   338,   220,   274,
+     296,   306,   221,   153,   154,   131,   234,   235,   248,   275,
+      70,   120,   121,   122,   222,   116,    95,    96,    35,    36,
+      37,    38,    39,    40,    55,   284,   285,   286,    45,    46,
+      47,    41,    42,   137,   223,   224,   143,   255,    82,   340,
+     142
 };
 
   /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -868,351 +879,344 @@ static const yytype_int16 yydefgoto[] =
      number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      34,   123,    80,    80,   248,   140,   154,   264,    33,   156,
-     126,    56,    57,    58,    81,   137,   137,   191,   271,    63,
-      63,   193,    63,    68,   143,    71,   180,   125,   292,   144,
-       4,   175,    85,    63,    19,    74,    79,    86,    62,    64,
-     324,    65,   122,   124,   226,   233,   146,   227,     5,   336,
-     274,   147,    97,   275,   178,    75,    43,    76,   122,   122,
-     131,   132,    44,    87,    88,   133,   184,   185,   -12,    74,
-     138,   138,   -15,    59,   179,    75,    72,   254,    73,    92,
-      93,    44,    44,   264,   139,   155,   181,   157,   158,   159,
-     335,   -12,   264,   262,   161,   -15,    63,    63,    63,    63,
-      63,    63,    63,    63,    63,    63,    63,    63,    60,   234,
-     230,    25,   -96,   316,   177,   163,   164,   165,   166,   167,
-     168,   169,   170,   171,   172,   173,   174,    63,   345,   138,
-      81,   348,   138,    81,    85,   255,   186,   317,   318,    86,
-     190,    84,  -114,   152,    19,   -97,   183,   301,   112,   113,
-     128,   303,    79,   160,   286,    79,   223,   225,    85,   221,
-      56,   134,   135,   253,    19,    87,   127,    76,   322,     4,
-     137,   325,   129,   103,    48,    49,     5,    19,   122,   122,
-    -106,    92,    93,   153,    44,   162,   -92,   176,    81,    81,
-     117,   276,    81,   188,    81,   283,   284,   139,    81,   347,
-     187,   231,   349,   250,   270,    92,    93,   243,   297,  -115,
-      79,    79,   235,   236,    79,   238,    79,    50,    51,   252,
-      79,  -106,   281,   299,   288,   138,    76,    81,   259,   282,
-     256,   243,   305,   285,   260,   261,   289,   331,  -106,   311,
-     309,    52,    81,   281,  -106,   192,   124,   296,   194,    79,
-     287,    98,    99,   100,   101,   102,  -115,  -115,   103,   337,
-     333,   110,   111,   237,    79,   210,    71,   302,   326,   327,
-     117,   342,   245,   104,   105,   106,   107,   108,   338,   339,
-     109,   251,    82,   307,   330,    85,   257,   308,    67,   222,
-      86,   313,   112,   113,   340,   304,     0,   306,    63,     0,
-     293,   114,     0,   239,   240,     0,    63,   241,     0,   244,
-       0,   272,     0,   246,    20,   273,    87,    88,    89,     0,
-     328,   329,     0,    23,     0,    97,   100,   101,   102,    90,
-       0,   103,    92,    93,     0,     0,     0,     0,   291,     0,
-       0,     0,   266,     0,     0,   294,   295,     0,     0,   298,
-      76,     0,     0,     0,     0,     0,     0,   277,     0,    85,
-       0,     0,     0,     0,    86,     0,     0,   312,     0,   314,
-       0,   315,   320,   321,     0,   323,     2,     3,     0,     4,
-       5,     0,     0,     6,     7,     0,     0,     0,     0,     0,
-      87,    88,    89,     0,     8,     9,   341,     0,     0,   343,
-       0,     0,   344,    90,   346,     0,    92,    93,     0,     0,
-       0,     0,    10,    11,    12,    13,     0,     0,   139,     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,
-     195,   -18,     4,     5,     0,     0,     6,     7,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   196,
-       0,   197,   198,   199,   -74,   -74,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,     0,     0,     0,    13,   209,
-       0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
-       0,   -74,    20,     0,     0,     0,     0,     0,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,     0,    61,
-       0,     0,    75,   -74,    76,   195,     0,     4,     5,     0,
-       0,     6,     7,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,   196,     0,   197,   198,   199,   -73,
-     -73,   200,   201,   202,   203,   204,   205,   206,   207,   208,
-       0,     0,     0,    13,   209,     0,     0,     0,    14,    15,
-      16,    17,     0,     0,     0,     0,   -73,    20,     0,     0,
+      34,   138,    81,    81,   127,   141,   158,   254,   160,    33,
+     124,    56,    57,    58,   239,   184,    75,    48,    49,    63,
+      63,   195,    63,    68,   183,    71,   126,   330,    86,   144,
+       5,   179,   298,    63,   145,   292,   342,    80,    62,    64,
+     147,    65,   123,   125,   232,   148,   150,   233,    19,    43,
+      75,   151,    98,   156,   270,   182,    44,   139,   123,   123,
+      50,    51,    59,   164,    76,   134,    44,   188,   189,   196,
+     140,    77,   198,   -13,   277,   200,    93,    94,    85,   240,
+     139,    44,    60,   197,   138,    52,   159,    44,   161,   162,
+     163,   199,   260,  -118,    25,   165,   -13,    63,    63,    63,
+      63,    63,    63,    63,    63,    63,    63,    63,    63,   128,
+     191,   280,   236,  -100,   281,   181,   167,   168,   169,   170,
+     171,   172,   173,   174,   175,   176,   177,   178,    63,   261,
+     270,   351,   245,   246,   354,   -16,   247,   190,   250,   270,
+     139,   194,   252,   -19,    86,   129,   341,   187,   139,    87,
+     101,   102,   103,   268,    80,   104,   185,    80,   -16,   130,
+      80,  -101,     4,   227,    56,   104,   -19,    86,    19,   259,
+     157,   272,    87,   113,   114,    88,    89,    90,   243,   225,
+       5,   322,   123,   123,   135,   136,   283,   251,   166,    91,
+     132,   133,    93,    94,   138,   118,   257,   282,    88,    89,
+     140,   289,   290,   180,  -110,   323,   324,   307,   192,  -119,
+      77,   309,   303,   249,   237,    93,    94,    80,    80,   276,
+     241,    80,   287,    80,   242,   258,   278,    80,   328,   305,
+     279,   331,   244,    19,   229,   231,   262,   249,   311,   294,
+     266,   267,   337,   287,    77,   317,  -110,    19,   256,   265,
+     139,     4,   125,   297,   288,   -96,    80,  -119,  -119,   353,
+     300,   301,   355,  -110,   304,   343,   291,   225,    76,  -110,
+      77,    80,    71,   308,   295,    86,   302,   348,   225,   315,
+      87,   339,   318,   216,   320,   344,   321,   326,   327,   345,
+     329,    83,   336,   263,   314,   293,    67,    72,   228,    73,
+      74,   310,   346,   312,    63,     0,    88,    89,    90,     0,
+       0,   347,    63,     0,   349,   299,     0,   350,     0,   352,
+      91,   225,    86,    93,    94,   225,     0,    87,   313,     0,
+       0,    98,     0,   111,   112,   140,   319,     0,     0,   332,
+     333,   118,   225,     2,     3,   225,     4,     5,     0,     0,
+       6,     7,    86,    88,    89,    90,     0,    87,     0,     0,
+       0,     8,     9,     0,   113,   114,     0,    91,     0,    92,
+      93,    94,     0,   225,   115,   225,   225,     0,   225,    10,
+      11,    12,    13,    88,     0,     0,    20,    14,    15,    16,
+      17,    18,   334,   335,     0,    23,    19,    20,     0,     0,
+      93,    94,     0,    21,    22,     0,    23,     0,    24,     0,
+       0,    25,    26,     0,    27,     0,     0,   -22,   201,   -22,
+       4,     5,     0,     0,     6,     7,    99,   100,   101,   102,
+     103,     0,     0,   104,     0,     0,     0,   202,     0,   203,
+     204,   205,   -78,   -78,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,     0,     0,     0,    13,   215,     0,     0,
+       0,    14,    15,    16,    17,   105,   106,   107,   108,   109,
+     -78,    20,   110,     0,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,     0,
+       0,    76,   -78,    77,   201,     0,     4,     5,     0,     0,
+       6,     7,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   202,     0,   203,   204,   205,   -77,   -77,
+     206,   207,   208,   209,   210,   211,   212,   213,   214,     0,
+       0,     0,    13,   215,     0,     0,     0,    14,    15,    16,
+      17,     0,     0,     0,     0,     0,   -77,    20,     0,     0,
        0,     0,     0,    21,    22,     0,    23,     0,    24,     0,
-       0,    25,    26,     0,    61,     0,     0,    75,   -73,    76,
-     195,     0,     4,     5,     0,     0,     6,     7,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,   196,
-       0,   197,   198,   199,     0,     0,   200,   201,   202,   203,
-     204,   205,   206,   207,   208,     0,     0,     0,    13,   209,
-       0,     0,     0,    14,    15,    16,    17,    69,     0,     4,
-       5,     0,    20,     6,     7,     0,     0,  -105,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,     0,    61,
-       0,     0,    75,   210,    76,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,    13,     0,     0,     0,     0,
-      14,    15,    16,    17,     0,     0,     0,     0,  -105,    20,
-       0,     0,     0,     0,     0,    21,    22,     0,    23,     0,
-      24,     0,     0,    25,   267,  -105,    61,     0,     4,     5,
-       0,  -105,     6,     7,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,   196,     0,   197,   198,   199,
-       0,     0,   200,   201,   202,   203,   204,   205,   206,   207,
-     208,     0,     0,     0,    13,   209,     0,     0,     0,    14,
-      15,    16,    17,     0,     0,     4,     5,     0,    20,     6,
-       7,     0,     0,     0,    21,    22,     0,    23,     0,    24,
-       0,     0,    25,    26,     0,    61,     0,     0,    75,     0,
-      76,     0,     0,     0,     0,     0,   116,     0,     4,     5,
-       0,    13,     6,     7,   117,     0,    14,    15,    16,    17,
-       0,     0,     0,     0,     0,    20,     0,     0,     0,     0,
-       0,    21,    22,     0,    23,     0,    24,     0,     0,    25,
-      26,     0,    61,     0,    13,     0,     0,    76,     0,    14,
-      15,    16,    17,   224,     0,     4,     5,     0,    20,     6,
-       7,   117,     0,     0,    21,    22,     0,    23,     0,    24,
-       0,     0,    25,    26,  -113,    61,     0,     0,     0,     0,
-      69,     0,     4,     5,     0,     0,     6,     7,     0,     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,   189,     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,     0,     0,     0,     0,     0,     0,
-       0,     0,     4,   263,     0,    13,     6,     7,     0,     0,
-      14,    15,    16,    17,     0,     0,     0,     0,     0,    20,
-       0,     0,   198,     0,     0,    21,    22,     0,    23,     0,
-      24,   205,   206,    25,    26,     0,    61,     0,    13,     0,
-       0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
-       4,     5,    20,     0,     6,     7,     0,     0,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,     0,    61,
-     198,     0,     0,     0,     0,     0,     0,     0,     0,   205,
-     206,     0,     0,     0,     0,     0,    13,     0,     0,     0,
+       0,    25,    26,     0,    61,     0,     0,    76,   -77,    77,
+     201,     0,     4,     5,     0,     0,     6,     7,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   202,
+       0,   203,   204,   205,     0,     0,   206,   207,   208,   209,
+     210,   211,   212,   213,   214,     0,     0,     0,    13,   215,
+       0,     0,     0,    14,    15,    16,    17,     0,    69,     0,
+       4,     5,     0,    20,     6,     7,     0,     0,  -109,    21,
+      22,     0,    23,     0,    24,     0,     0,    25,    26,     0,
+      61,     0,     0,    76,   216,    77,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    13,     0,     0,     0,
        0,    14,    15,    16,    17,     0,     0,     0,     0,     0,
-      20,     0,     0,     0,     0,     0,    21,    22,    85,    23,
-       0,    24,     0,    86,    25,    26,     0,    61,     4,     5,
-       0,     0,     6,     7,     0,     0,     0,    96,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,    87,
-      88,    89,     0,     0,     0,     4,     5,     0,     0,     6,
-       7,   117,    90,   220,    13,    92,    93,     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,     4,
-       5,     0,     0,     6,     7,     0,     0,     0,    13,     0,
+    -109,    20,     0,     0,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,   273,  -109,    61,     0,
+       4,     5,     0,  -109,     6,     7,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,   202,     0,   203,
+     204,   205,     0,     0,   206,   207,   208,   209,   210,   211,
+     212,   213,   214,     0,     4,     5,    13,   215,     6,     7,
+       0,    14,    15,    16,    17,     0,     0,     0,     0,     0,
+       0,    20,     0,     0,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,     0,
+      13,    76,     0,    77,     0,    14,    15,    16,    17,     0,
+     117,     0,     4,     5,     0,    20,     6,     7,   118,     0,
+       0,    21,    22,     0,    23,     0,    24,     0,     0,    25,
+      26,     0,    61,     0,     0,     0,     0,    77,   230,     0,
+       4,     5,     0,     0,     6,     7,   118,     0,    13,     0,
        0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
-       0,     0,    20,     0,     0,     0,     0,     0,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,     0,    61,
-      14,    15,    16,    17,     0,     0,     0,     0,     0,    20,
+       0,     0,     0,    20,     0,     0,     0,     0,     0,    21,
+      22,     0,    23,     0,    24,     0,    13,    25,    26,  -117,
+      61,    14,    15,    16,    17,     0,    69,     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,   193,     0,     4,     5,     0,     0,
+       6,     7,     0,     0,    13,     0,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,     0,    20,
        0,     0,     0,     0,     0,    21,    22,     0,    23,     0,
-      24,     0,     0,    25,    66,     0,    61
+      24,     0,    13,    25,    26,     0,    61,    14,    15,    16,
+      17,     0,     0,     0,     0,     4,   269,    20,     0,     6,
+       7,     0,     0,    21,    22,     0,    23,     0,    24,     0,
+       0,    25,    26,     0,    61,   204,     0,     0,     0,     0,
+       0,     0,     0,     0,   211,   212,     0,     0,     0,     4,
+       5,    13,     0,     6,     7,     0,    14,    15,    16,    17,
+       0,     0,     0,     0,     0,     0,    20,     0,     0,   204,
+       0,     0,    21,    22,     0,    23,     0,    24,   211,   212,
+      25,    26,     0,    61,     0,    13,     0,     0,     0,     0,
+      14,    15,    16,    17,     4,     5,     0,     0,     6,     7,
+      20,     0,     0,    97,     0,     0,    21,    22,     0,    23,
+       0,    24,     0,     0,    25,    26,     0,    61,     0,     0,
+       0,     0,     4,     5,     0,     0,     6,     7,   118,     0,
+      13,     0,     0,     0,     0,    14,    15,    16,    17,     0,
+       0,     0,     0,     0,    86,    20,     0,     0,     0,    87,
+       0,    21,    22,     0,    23,     0,    24,     0,    13,    25,
+      26,     0,    61,    14,    15,    16,    17,     4,     5,     0,
+       0,     6,     7,    20,     0,    88,    89,    90,     0,    21,
+      22,     0,    23,     0,    24,     0,     0,    25,    26,    91,
+      61,     0,    93,    94,     0,     4,     5,     0,     0,     6,
+       7,     0,     0,    13,     0,     0,     0,     0,    14,    15,
+      16,    17,     0,     0,     0,     0,     0,     0,    20,     0,
+       0,     0,     0,     0,    21,    22,     0,    23,     0,    24,
+       0,     0,    25,    26,     0,    61,    14,    15,    16,    17,
+      86,     0,     0,     0,     0,    87,    20,     0,     0,     0,
+       0,     0,    21,    22,     0,    23,     0,    24,     0,     0,
+      25,    66,     0,    61,     0,     0,     0,     0,     0,     0,
+       0,    88,    89,    90,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,    91,   226,     0,    93,    94
 };
 
 static const yytype_int16 yycheck[] =
 {
-       1,    44,    29,    30,   217,    70,    86,   238,     1,    87,
-      46,    13,    14,    15,    29,     1,     1,     1,   248,    21,
-      22,     1,    24,    25,     1,    26,   120,    17,    17,     6,
-       3,   111,    10,    35,    52,    27,    29,    15,    21,    22,
-     314,    24,    43,    44,     1,     4,     1,     4,     4,   323,
-       1,     6,    35,     4,   119,    73,    68,    75,    59,    60,
-      59,    60,    71,    41,    42,    66,   131,   132,    52,    61,
-      56,    56,    52,    68,     1,    73,    49,     1,    51,    57,
-      58,    71,    71,   314,    69,    86,    72,    88,    89,    90,
-     320,    75,   323,   237,    95,    75,    98,    99,   100,   101,
-     102,   103,   104,   105,   106,   107,   108,   109,    68,    68,
-     188,    67,    69,     1,   115,    98,    99,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   129,   341,    56,
-     145,   344,    56,   148,    10,   229,   137,    25,    26,    15,
-     141,    52,    69,    81,    52,    69,   129,   291,    44,    45,
-      68,   295,   145,    91,    41,   148,   179,   180,    10,   160,
-     162,    44,    45,   228,    52,    41,    50,    75,   312,     3,
-       1,   315,    57,    66,     3,     4,     4,    52,   179,   180,
-      11,    57,    58,     5,    71,    39,    74,    14,   203,   204,
-       9,   256,   207,    41,   209,   260,   261,    69,   213,   343,
-     138,    68,   346,   218,   247,    57,    58,   208,   286,    10,
-     203,   204,    68,    68,   207,    68,   209,    46,    47,   220,
-     213,    52,   258,   288,   267,    56,    75,   242,     4,    69,
-     231,   232,   297,    27,   235,   236,    11,   317,    69,   304,
-      21,    70,   257,   279,    75,   145,   247,    68,   148,   242,
-     265,    59,    60,    61,    62,    63,    57,    58,    66,   324,
-      55,    13,    14,   201,   257,    74,   267,   294,     7,     8,
-       9,   336,   210,    59,    60,    61,    62,    63,     7,     7,
-      66,   219,    30,   298,   317,    10,   232,   300,    25,   162,
-      15,   306,    44,    45,   332,   296,    -1,   298,   300,    -1,
-     279,    53,    -1,   203,   204,    -1,   308,   207,    -1,   209,
-      -1,   249,    -1,   213,    53,   253,    41,    42,    43,    -1,
-      59,    60,    -1,    62,    -1,   308,    61,    62,    63,    54,
-      -1,    66,    57,    58,    -1,    -1,    -1,    -1,   276,    -1,
-      -1,    -1,   242,    -1,    -1,   283,   284,    -1,    -1,   287,
-      75,    -1,    -1,    -1,    -1,    -1,    -1,   257,    -1,    10,
-      -1,    -1,    -1,    -1,    15,    -1,    -1,   305,    -1,   307,
-      -1,   309,   310,   311,    -1,   313,     0,     1,    -1,     3,
-       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
-      41,    42,    43,    -1,    18,    19,   334,    -1,    -1,   337,
-      -1,    -1,   340,    54,   342,    -1,    57,    58,    -1,    -1,
-      -1,    -1,    36,    37,    38,    39,    -1,    -1,    69,    -1,
-      44,    45,    46,    47,    48,    -1,    -1,    -1,    52,    53,
-      -1,    -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,
-      64,    -1,    -1,    67,    68,    -1,    70,    -1,    -1,    73,
-       1,    75,     3,     4,    -1,    -1,     7,     8,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,
-      -1,    22,    23,    24,    25,    26,    27,    28,    29,    30,
-      31,    32,    33,    34,    35,    -1,    -1,    -1,    39,    40,
-      -1,    -1,    -1,    44,    45,    46,    47,    -1,    -1,    -1,
-      -1,    52,    53,    -1,    -1,    -1,    -1,    -1,    59,    60,
-      -1,    62,    -1,    64,    -1,    -1,    67,    68,    -1,    70,
-      -1,    -1,    73,    74,    75,     1,    -1,     3,     4,    -1,
-      -1,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    20,    -1,    22,    23,    24,    25,
-      26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
-      -1,    -1,    -1,    39,    40,    -1,    -1,    -1,    44,    45,
-      46,    47,    -1,    -1,    -1,    -1,    52,    53,    -1,    -1,
-      -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,    -1,
-      -1,    67,    68,    -1,    70,    -1,    -1,    73,    74,    75,
+       1,     1,    29,    30,    46,    70,    87,   223,    88,     1,
+      44,    13,    14,    15,     4,   121,    27,     3,     4,    21,
+      22,     1,    24,    25,     1,    26,    17,   320,    10,     1,
+       4,   112,    17,    35,     6,    41,   329,    29,    21,    22,
+       1,    24,    43,    44,     1,     6,     1,     4,    53,    69,
+      61,     6,    35,    82,   244,   120,    72,    57,    59,    60,
+      46,    47,    69,    92,    74,    66,    72,   132,   133,   146,
+      70,    76,   149,    53,   254,   152,    58,    59,    53,    69,
+      57,    72,    69,     1,     1,    71,    87,    72,    89,    90,
+      91,     1,     1,    70,    68,    96,    76,    99,   100,   101,
+     102,   103,   104,   105,   106,   107,   108,   109,   110,    50,
+     139,     1,   192,    70,     4,   116,    99,   100,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   130,   235,
+     320,   347,   209,   210,   350,    53,   213,   138,   215,   329,
+      57,   142,   219,    53,    10,    69,   326,   130,    57,    15,
+      62,    63,    64,   243,   146,    67,    73,   149,    76,    58,
+     152,    70,     3,   164,   166,    67,    76,    10,    53,   234,
+       5,   248,    15,    44,    45,    41,    42,    43,   207,   155,
+       4,     1,   183,   184,    44,    45,   263,   216,    39,    55,
+      59,    60,    58,    59,     1,     9,   225,   262,    41,    42,
+      70,   266,   267,    14,    11,    25,    26,   297,    41,    10,
+      76,   301,   292,   214,    69,    58,    59,   209,   210,   253,
+      69,   213,   264,   215,    69,   226,   255,   219,   318,   294,
+     259,   321,    69,    53,   183,   184,   237,   238,   303,   273,
+     241,   242,   323,   285,    76,   310,    53,    53,   224,     4,
+      57,     3,   253,   282,    70,    75,   248,    58,    59,   349,
+     289,   290,   352,    70,   293,   330,    27,   243,    74,    76,
+      76,   263,   273,   300,    11,    10,    69,   342,   254,    21,
+      15,    56,   311,    75,   313,     7,   315,   316,   317,     7,
+     319,    30,   323,   238,   306,   271,    25,    49,   166,    51,
+      52,   302,   338,   304,   306,    -1,    41,    42,    43,    -1,
+      -1,   340,   314,    -1,   343,   285,    -1,   346,    -1,   348,
+      55,   297,    10,    58,    59,   301,    -1,    15,   304,    -1,
+      -1,   314,    -1,    13,    14,    70,   312,    -1,    -1,     7,
+       8,     9,   318,     0,     1,   321,     3,     4,    -1,    -1,
+       7,     8,    10,    41,    42,    43,    -1,    15,    -1,    -1,
+      -1,    18,    19,    -1,    44,    45,    -1,    55,    -1,    57,
+      58,    59,    -1,   349,    54,   351,   352,    -1,   354,    36,
+      37,    38,    39,    41,    -1,    -1,    54,    44,    45,    46,
+      47,    48,    60,    61,    -1,    63,    53,    54,    -1,    -1,
+      58,    59,    -1,    60,    61,    -1,    63,    -1,    65,    -1,
+      -1,    68,    69,    -1,    71,    -1,    -1,    74,     1,    76,
+       3,     4,    -1,    -1,     7,     8,    60,    61,    62,    63,
+      64,    -1,    -1,    67,    -1,    -1,    -1,    20,    -1,    22,
+      23,    24,    25,    26,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    -1,    -1,    -1,    39,    40,    -1,    -1,
+      -1,    44,    45,    46,    47,    60,    61,    62,    63,    64,
+      53,    54,    67,    -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,    -1,    20,    -1,    22,    23,    24,    25,    26,
+      27,    28,    29,    30,    31,    32,    33,    34,    35,    -1,
+      -1,    -1,    39,    40,    -1,    -1,    -1,    44,    45,    46,
+      47,    -1,    -1,    -1,    -1,    -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,    -1,    20,
       -1,    22,    23,    24,    -1,    -1,    27,    28,    29,    30,
       31,    32,    33,    34,    35,    -1,    -1,    -1,    39,    40,
-      -1,    -1,    -1,    44,    45,    46,    47,     1,    -1,     3,
-       4,    -1,    53,     7,     8,    -1,    -1,    11,    59,    60,
-      -1,    62,    -1,    64,    -1,    -1,    67,    68,    -1,    70,
-      -1,    -1,    73,    74,    75,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,
-      44,    45,    46,    47,    -1,    -1,    -1,    -1,    52,    53,
-      -1,    -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,
-      64,    -1,    -1,    67,    68,    69,    70,    -1,     3,     4,
-      -1,    75,     7,     8,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    23,    24,
-      -1,    -1,    27,    28,    29,    30,    31,    32,    33,    34,
-      35,    -1,    -1,    -1,    39,    40,    -1,    -1,    -1,    44,
-      45,    46,    47,    -1,    -1,     3,     4,    -1,    53,     7,
-       8,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
-      -1,    -1,    67,    68,    -1,    70,    -1,    -1,    73,    -1,
-      75,    -1,    -1,    -1,    -1,    -1,     1,    -1,     3,     4,
-      -1,    39,     7,     8,     9,    -1,    44,    45,    46,    47,
-      -1,    -1,    -1,    -1,    -1,    53,    -1,    -1,    -1,    -1,
-      -1,    59,    60,    -1,    62,    -1,    64,    -1,    -1,    67,
-      68,    -1,    70,    -1,    39,    -1,    -1,    75,    -1,    44,
-      45,    46,    47,     1,    -1,     3,     4,    -1,    53,     7,
-       8,     9,    -1,    -1,    59,    60,    -1,    62,    -1,    64,
-      -1,    -1,    67,    68,    69,    70,    -1,    -1,    -1,    -1,
-       1,    -1,     3,     4,    -1,    -1,     7,     8,    -1,    -1,
-      -1,    39,    -1,    -1,    -1,    -1,    44,    45,    46,    47,
-      -1,    -1,    -1,    -1,    10,    53,    -1,    -1,    -1,    15,
-      -1,    59,    60,    -1,    62,    -1,    64,    -1,    39,    67,
-      68,    -1,    70,    44,    45,    46,    47,     1,    -1,     3,
-       4,    -1,    53,     7,     8,    41,    42,    43,    59,    60,
-      -1,    62,    -1,    64,    -1,    -1,    67,    68,    54,    70,
-      56,    57,    58,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,     3,     4,    -1,    39,     7,     8,    -1,    -1,
-      44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,
-      -1,    -1,    23,    -1,    -1,    59,    60,    -1,    62,    -1,
-      64,    32,    33,    67,    68,    -1,    70,    -1,    39,    -1,
-      -1,    -1,    -1,    44,    45,    46,    47,    -1,    -1,    -1,
-       3,     4,    53,    -1,     7,     8,    -1,    -1,    59,    60,
-      -1,    62,    -1,    64,    -1,    -1,    67,    68,    -1,    70,
-      23,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    32,
-      33,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,
+      -1,    -1,    -1,    44,    45,    46,    47,    -1,     1,    -1,
+       3,     4,    -1,    54,     7,     8,    -1,    -1,    11,    60,
+      61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,    -1,
+      71,    -1,    -1,    74,    75,    76,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,
       -1,    44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,
-      53,    -1,    -1,    -1,    -1,    -1,    59,    60,    10,    62,
-      -1,    64,    -1,    15,    67,    68,    -1,    70,     3,     4,
-      -1,    -1,     7,     8,    -1,    -1,    -1,    12,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    41,
-      42,    43,    -1,    -1,    -1,     3,     4,    -1,    -1,     7,
-       8,     9,    54,    55,    39,    57,    58,    -1,    -1,    44,
-      45,    46,    47,    -1,    -1,    -1,    -1,    10,    53,    -1,
-      -1,    -1,    15,    -1,    59,    60,    -1,    62,    -1,    64,
-      -1,    39,    67,    68,    -1,    70,    44,    45,    46,    47,
-      -1,    -1,     3,     4,    -1,    53,     7,     8,    41,    42,
-      43,    59,    60,    -1,    62,    -1,    64,    -1,    -1,    67,
-      68,    54,    70,    -1,    57,    58,    -1,    -1,    -1,     3,
-       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    39,    -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,    -1,    20,    -1,    22,
+      23,    24,    -1,    -1,    27,    28,    29,    30,    31,    32,
+      33,    34,    35,    -1,     3,     4,    39,    40,     7,     8,
+      -1,    44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,
+      -1,    54,    -1,    -1,    -1,    -1,    -1,    60,    61,    -1,
+      63,    -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,
+      39,    74,    -1,    76,    -1,    44,    45,    46,    47,    -1,
+       1,    -1,     3,     4,    -1,    54,     7,     8,     9,    -1,
+      -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,    68,
+      69,    -1,    71,    -1,    -1,    -1,    -1,    76,     1,    -1,
+       3,     4,    -1,    -1,     7,     8,     9,    -1,    39,    -1,
       -1,    -1,    -1,    44,    45,    46,    47,    -1,    -1,    -1,
-      -1,    -1,    53,    -1,    -1,    -1,    -1,    -1,    59,    60,
-      -1,    62,    -1,    64,    -1,    -1,    67,    68,    -1,    70,
-      44,    45,    46,    47,    -1,    -1,    -1,    -1,    -1,    53,
-      -1,    -1,    -1,    -1,    -1,    59,    60,    -1,    62,    -1,
-      64,    -1,    -1,    67,    68,    -1,    70
+      -1,    -1,    -1,    54,    -1,    -1,    -1,    -1,    -1,    60,
+      61,    -1,    63,    -1,    65,    -1,    39,    68,    69,    70,
+      71,    44,    45,    46,    47,    -1,     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,     3,     4,    -1,    -1,
+       7,     8,    -1,    -1,    39,    -1,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    54,
+      -1,    -1,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,
+      65,    -1,    39,    68,    69,    -1,    71,    44,    45,    46,
+      47,    -1,    -1,    -1,    -1,     3,     4,    54,    -1,     7,
+       8,    -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,
+      -1,    68,    69,    -1,    71,    23,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    32,    33,    -1,    -1,    -1,     3,
+       4,    39,    -1,     7,     8,    -1,    44,    45,    46,    47,
+      -1,    -1,    -1,    -1,    -1,    -1,    54,    -1,    -1,    23,
+      -1,    -1,    60,    61,    -1,    63,    -1,    65,    32,    33,
+      68,    69,    -1,    71,    -1,    39,    -1,    -1,    -1,    -1,
+      44,    45,    46,    47,     3,     4,    -1,    -1,     7,     8,
+      54,    -1,    -1,    12,    -1,    -1,    60,    61,    -1,    63,
+      -1,    65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,
+      -1,    -1,     3,     4,    -1,    -1,     7,     8,     9,    -1,
+      39,    -1,    -1,    -1,    -1,    44,    45,    46,    47,    -1,
+      -1,    -1,    -1,    -1,    10,    54,    -1,    -1,    -1,    15,
+      -1,    60,    61,    -1,    63,    -1,    65,    -1,    39,    68,
+      69,    -1,    71,    44,    45,    46,    47,     3,     4,    -1,
+      -1,     7,     8,    54,    -1,    41,    42,    43,    -1,    60,
+      61,    -1,    63,    -1,    65,    -1,    -1,    68,    69,    55,
+      71,    -1,    58,    59,    -1,     3,     4,    -1,    -1,     7,
+       8,    -1,    -1,    39,    -1,    -1,    -1,    -1,    44,    45,
+      46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    54,    -1,
+      -1,    -1,    -1,    -1,    60,    61,    -1,    63,    -1,    65,
+      -1,    -1,    68,    69,    -1,    71,    44,    45,    46,    47,
+      10,    -1,    -1,    -1,    -1,    15,    54,    -1,    -1,    -1,
+      -1,    -1,    60,    61,    -1,    63,    -1,    65,    -1,    -1,
+      68,    69,    -1,    71,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    41,    42,    43,    -1,    -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,    77,     0,     1,     3,     4,     7,     8,    18,    19,
-      36,    37,    38,    39,    44,    45,    46,    47,    48,    52,
-      53,    59,    60,    62,    64,    67,    68,    70,    78,    81,
-      85,    87,    90,   108,   119,   123,   124,   125,   126,   127,
-     128,   136,   137,    68,    71,   133,   134,   135,     3,     4,
-      46,    47,    70,    83,    84,   129,   137,   137,   137,    68,
-      68,    70,   124,   137,   124,   124,    68,   126,   137,     1,
-     115,   119,    49,    51,   128,    73,    75,    82,    92,   108,
-     139,   143,    82,    88,    52,    10,    15,    41,    42,    43,
-      54,    56,    57,    58,   121,   122,    12,   124,    59,    60,
-      61,    62,    63,    66,    59,    60,    61,    62,    63,    66,
-      13,    14,    44,    45,    53,   120,     1,     9,    89,   116,
-     117,   118,   119,   115,   119,    17,   133,    50,    68,    57,
-     110,   116,   116,   119,    44,    45,   138,     1,    56,    69,
-     141,   145,   141,     1,     6,    79,     1,     6,    80,   108,
-     109,    91,   109,     5,    89,   119,   136,   119,   119,   119,
-     109,   119,    39,   124,   124,   124,   124,   124,   124,   124,
-     124,   124,   124,   124,   124,    89,    14,   119,   141,     1,
-     145,    72,    86,   124,   141,   141,   119,   109,    41,     1,
-     119,     1,    92,     1,    92,     1,    20,    22,    23,    24,
-      27,    28,    29,    30,    31,    32,    33,    34,    35,    40,
-      74,    93,    94,    96,   103,   107,   119,   139,   140,   143,
-      55,   119,   129,   118,     1,   118,     1,     4,   111,   112,
-     136,    68,    95,     4,    68,    68,    68,   109,    68,    92,
-      92,    92,   113,   119,    92,   109,    92,    97,    91,   142,
-     143,   109,   119,   141,     1,   145,   119,   113,    98,     4,
-     119,   119,    93,     4,    96,    99,    92,    68,   104,   114,
-     115,   140,   109,   109,     1,     4,   141,    92,   130,   131,
-     132,   133,    69,   141,   141,    27,    41,   143,   115,    11,
-     105,   109,    17,   132,   109,   109,    68,   136,   109,   141,
-     106,    93,   139,    93,   119,   141,   119,   143,   123,    21,
-     100,   141,   109,   143,   109,   109,     1,    25,    26,   101,
-     109,   109,    93,   109,    99,    93,     7,     8,    59,    60,
-      87,    89,   102,    55,   144,   140,    99,   141,     7,     7,
-     144,   109,   141,   109,   109,    91,   109,    93,    91,    93
+       0,    78,     0,     1,     3,     4,     7,     8,    18,    19,
+      36,    37,    38,    39,    44,    45,    46,    47,    48,    53,
+      54,    60,    61,    63,    65,    68,    69,    71,    79,    83,
+      87,    89,    92,   110,   121,   125,   126,   127,   128,   129,
+     130,   138,   139,    69,    72,   135,   136,   137,     3,     4,
+      46,    47,    71,    85,    86,   131,   139,   139,   139,    69,
+      69,    71,   126,   139,   126,   126,    69,   128,   139,     1,
+     117,   121,    49,    51,    52,   130,    74,    76,    84,    94,
+     110,   141,   145,    84,    90,    53,    10,    15,    41,    42,
+      43,    55,    57,    58,    59,   123,   124,    12,   126,    60,
+      61,    62,    63,    64,    67,    60,    61,    62,    63,    64,
+      67,    13,    14,    44,    45,    54,   122,     1,     9,    91,
+     118,   119,   120,   121,   117,   121,    17,   135,    50,    69,
+      58,   112,   118,   118,   121,    44,    45,   140,     1,    57,
+      70,   143,   147,   143,     1,     6,    80,     1,     6,    81,
+       1,     6,    82,   110,   111,    93,   111,     5,    91,   121,
+     138,   121,   121,   121,   111,   121,    39,   126,   126,   126,
+     126,   126,   126,   126,   126,   126,   126,   126,   126,    91,
+      14,   121,   143,     1,   147,    73,    88,   126,   143,   143,
+     121,   111,    41,     1,   121,     1,    94,     1,    94,     1,
+      94,     1,    20,    22,    23,    24,    27,    28,    29,    30,
+      31,    32,    33,    34,    35,    40,    75,    95,    96,    98,
+     105,   109,   121,   141,   142,   145,    56,   121,   131,   120,
+       1,   120,     1,     4,   113,   114,   138,    69,    97,     4,
+      69,    69,    69,   111,    69,    94,    94,    94,   115,   121,
+      94,   111,    94,    99,    93,   144,   145,   111,   121,   143,
+       1,   147,   121,   115,   100,     4,   121,   121,    95,     4,
+      98,   101,    94,    69,   106,   116,   117,   142,   111,   111,
+       1,     4,   143,    94,   132,   133,   134,   135,    70,   143,
+     143,    27,    41,   145,   117,    11,   107,   111,    17,   134,
+     111,   111,    69,   138,   111,   143,   108,    95,   141,    95,
+     121,   143,   121,   145,   125,    21,   102,   143,   111,   145,
+     111,   111,     1,    25,    26,   103,   111,   111,    95,   111,
+     101,    95,     7,     8,    60,    61,    89,    91,   104,    56,
+     146,   142,   101,   143,     7,     7,   146,   111,   143,   111,
+     111,    93,   111,    95,    93,    95
 };
 
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,    76,    77,    77,    77,    77,    77,    78,    78,    78,
-      78,    78,    79,    79,    79,    80,    80,    80,    81,    81,
-      81,    81,    81,    81,    81,    82,    83,    83,    83,    83,
-      84,    84,    86,    85,    88,    87,    89,    90,    90,    91,
-      91,    91,    92,    92,    93,    93,    93,    93,    93,    93,
-      93,    93,    93,    93,    94,    94,    94,    94,    94,    95,
-      94,    94,    97,    96,    98,    96,    96,    96,    99,    99,
-     100,   100,   100,   101,   101,   102,   102,   102,   102,   102,
-     102,   103,   103,   104,   104,   105,   106,   105,   107,   107,
-     108,   108,   109,   109,   110,   110,   111,   111,   112,   112,
-     112,   112,   112,   113,   113,   114,   114,   115,   115,   115,
-     115,   115,   115,   116,   116,   117,   117,   117,   117,   117,
-     117,   118,   118,   119,   119,   119,   119,   119,   119,   119,
-     119,   119,   119,   120,   120,   120,   121,   121,   122,   122,
-     123,   123,   123,   124,   124,   124,   124,   124,   124,   124,
-     124,   124,   124,   124,   125,   125,   125,   125,   125,   125,
-     125,   126,   126,   126,   126,   126,   126,   126,   126,   126,
-     126,   126,   126,   126,   126,   127,   127,   128,   129,   129,
-     130,   130,   131,   131,   132,   133,   134,   134,   135,   136,
-     136,   137,   137,   138,   138,   138,   139,   140,   141,   142,
-     142,   143,   144,   145
+       0,    77,    78,    78,    78,    78,    78,    79,    79,    79,
+      79,    79,    79,    80,    80,    80,    81,    81,    81,    82,
+      82,    82,    83,    83,    83,    83,    83,    83,    83,    84,
+      85,    85,    85,    85,    86,    86,    88,    87,    90,    89,
+      91,    92,    92,    93,    93,    93,    94,    94,    95,    95,
+      95,    95,    95,    95,    95,    95,    95,    95,    96,    96,
+      96,    96,    96,    97,    96,    96,    99,    98,   100,    98,
+      98,    98,   101,   101,   102,   102,   102,   103,   103,   104,
+     104,   104,   104,   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,   119,
+     119,   119,   119,   119,   119,   120,   120,   121,   121,   121,
+     121,   121,   121,   121,   121,   121,   121,   122,   122,   122,
+     123,   123,   124,   124,   125,   125,   125,   126,   126,   126,
+     126,   126,   126,   126,   126,   126,   126,   126,   127,   127,
+     127,   127,   127,   127,   127,   128,   128,   128,   128,   128,
+     128,   128,   128,   128,   128,   128,   128,   128,   128,   129,
+     129,   130,   131,   131,   132,   132,   133,   133,   134,   135,
+     136,   136,   137,   138,   138,   139,   139,   140,   140,   140,
+     141,   142,   143,   144,   144,   145,   146,   147
 };
 
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_uint8 yyr2[] =
 {
        0,     2,     0,     2,     2,     2,     2,     2,     2,     2,
-       4,     4,     1,     2,     1,     1,     2,     1,     0,     1,
-       4,     1,     1,     1,     1,     5,     1,     1,     1,     2,
-       1,     1,     0,     7,     0,     3,     1,     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,     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,     0,     1,     1,     3,     1,     2,     3,
-       3,     1,     1,     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
+       4,     4,     4,     1,     2,     1,     1,     2,     1,     1,
+       2,     1,     0,     1,     4,     1,     1,     1,     1,     5,
+       1,     1,     1,     2,     1,     1,     0,     7,     0,     3,
+       1,     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,     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,     0,     1,     1,
+       3,     1,     2,     3,     3,     1,     1,     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
 };
 
 
@@ -1889,24 +1893,24 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-#line 219 "awkgram.y" /* yacc.c:1646  */
+#line 222 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                yyerrok;
          }
-#line 1898 "awkgram.c" /* yacc.c:1646  */
+#line 1902 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 5:
-#line 225 "awkgram.y" /* yacc.c:1646  */
+#line 228 "awkgram.y" /* yacc.c:1646  */
     {
                next_sourcefile();
          }
-#line 1906 "awkgram.c" /* yacc.c:1646  */
+#line 1910 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 6:
-#line 229 "awkgram.y" /* yacc.c:1646  */
+#line 232 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                /*
@@ -1915,20 +1919,20 @@ yyreduce:
                 */
                /* yyerrok; */
          }
-#line 1919 "awkgram.c" /* yacc.c:1646  */
+#line 1923 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 7:
-#line 241 "awkgram.y" /* yacc.c:1646  */
+#line 244 "awkgram.y" /* yacc.c:1646  */
     {
                (void) append_rule((yyvsp[-1]), (yyvsp[0]));
                first_rule = false;
          }
-#line 1928 "awkgram.c" /* yacc.c:1646  */
+#line 1932 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 8:
-#line 246 "awkgram.y" /* yacc.c:1646  */
+#line 249 "awkgram.y" /* yacc.c:1646  */
     {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@ -1939,66 +1943,85 @@ yyreduce:
                } else          /* pattern rule with non-empty pattern */
                        (void) append_rule((yyvsp[-1]), NULL);
          }
-#line 1943 "awkgram.c" /* yacc.c:1646  */
+#line 1947 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 9:
-#line 257 "awkgram.y" /* yacc.c:1646  */
+#line 260 "awkgram.y" /* yacc.c:1646  */
     {
                in_function = NULL;
                (void) mk_function((yyvsp[-1]), (yyvsp[0]));
                want_param_names = DONT_CHECK;
                yyerrok;
          }
-#line 1954 "awkgram.c" /* yacc.c:1646  */
+#line 1958 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 10:
-#line 264 "awkgram.y" /* yacc.c:1646  */
+#line 267 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                at_seen = false;
                yyerrok;
          }
-#line 1964 "awkgram.c" /* yacc.c:1646  */
+#line 1968 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 11:
-#line 270 "awkgram.y" /* yacc.c:1646  */
+#line 273 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                at_seen = false;
                yyerrok;
          }
-#line 1974 "awkgram.c" /* yacc.c:1646  */
+#line 1978 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 12:
 #line 279 "awkgram.y" /* yacc.c:1646  */
     {
+               want_source = false;
+               at_seen = false;
+fprintf(stderr, "setting namespace to %s\n", (yyvsp[-1])->lextok);
+/*
+               if (set_namespace($3->lextok) < 0)
+                       YYABORT;
+*/
+               efree((yyvsp[-1])->lextok);
+               bcfree((yyvsp[-1]));
+               // for now:
+               bcfree((yyvsp[-2]));
+               yyerrok;
+         }
+#line 1997 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 13:
+#line 297 "awkgram.y" /* yacc.c:1646  */
+    {
                if (include_source((yyvsp[0])) < 0)
                        YYABORT;
                efree((yyvsp[0])->lextok);
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 1986 "awkgram.c" /* yacc.c:1646  */
+#line 2009 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 13:
-#line 287 "awkgram.y" /* yacc.c:1646  */
+  case 14:
+#line 305 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1992 "awkgram.c" /* yacc.c:1646  */
+#line 2015 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 14:
-#line 289 "awkgram.y" /* yacc.c:1646  */
+  case 15:
+#line 307 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1998 "awkgram.c" /* yacc.c:1646  */
+#line 2021 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 15:
-#line 294 "awkgram.y" /* yacc.c:1646  */
+  case 16:
+#line 312 "awkgram.y" /* yacc.c:1646  */
     {
                if (load_library((yyvsp[0])) < 0)
                        YYABORT;
@@ -2006,23 +2029,41 @@ yyreduce:
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 2010 "awkgram.c" /* yacc.c:1646  */
+#line 2033 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 16:
-#line 302 "awkgram.y" /* yacc.c:1646  */
+  case 17:
+#line 320 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2016 "awkgram.c" /* yacc.c:1646  */
+#line 2039 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 17:
-#line 304 "awkgram.y" /* yacc.c:1646  */
+  case 18:
+#line 322 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2022 "awkgram.c" /* yacc.c:1646  */
+#line 2045 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 18:
-#line 309 "awkgram.y" /* yacc.c:1646  */
+  case 19:
+#line 327 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = (yyvsp[0]); }
+#line 2051 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 20:
+#line 329 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = NULL; }
+#line 2057 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 21:
+#line 331 "awkgram.y" /* yacc.c:1646  */
+    { (yyval) = NULL; }
+#line 2063 "awkgram.c" /* yacc.c:1646  */
+    break;
+
+  case 22:
+#line 336 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -2031,11 +2072,11 @@ yyreduce:
                } else
                        (yyval) = NULL;
          }
-#line 2035 "awkgram.c" /* yacc.c:1646  */
+#line 2076 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 19:
-#line 318 "awkgram.y" /* yacc.c:1646  */
+  case 23:
+#line 345 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -2044,11 +2085,11 @@ yyreduce:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 2048 "awkgram.c" /* yacc.c:1646  */
+#line 2089 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 20:
-#line 328 "awkgram.y" /* yacc.c:1646  */
+  case 24:
+#line 355 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *tp;
 
@@ -2078,11 +2119,11 @@ yyreduce:
                        (yyval) = list_append(list_merge((yyvsp[-3]), 
(yyvsp[0])), tp);
                rule = Rule;
          }
-#line 2082 "awkgram.c" /* yacc.c:1646  */
+#line 2123 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 21:
-#line 358 "awkgram.y" /* yacc.c:1646  */
+  case 25:
+#line 385 "awkgram.y" /* yacc.c:1646  */
     {
                static int begin_seen = 0;
 
@@ -2096,11 +2137,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2100 "awkgram.c" /* yacc.c:1646  */
+#line 2141 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 22:
-#line 372 "awkgram.y" /* yacc.c:1646  */
+  case 26:
+#line 399 "awkgram.y" /* yacc.c:1646  */
     {
                static int end_seen = 0;
 
@@ -2114,11 +2155,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2118 "awkgram.c" /* yacc.c:1646  */
+#line 2159 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 23:
-#line 386 "awkgram.y" /* yacc.c:1646  */
+  case 27:
+#line 413 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = BEGINFILE;
@@ -2126,11 +2167,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2130 "awkgram.c" /* yacc.c:1646  */
+#line 2171 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 24:
-#line 394 "awkgram.y" /* yacc.c:1646  */
+  case 28:
+#line 421 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = ENDFILE;
@@ -2138,11 +2179,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2142 "awkgram.c" /* yacc.c:1646  */
+#line 2183 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 25:
-#line 405 "awkgram.y" /* yacc.c:1646  */
+  case 29:
+#line 432 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                if ((yyvsp[-3]) == NULL)
@@ -2151,48 +2192,48 @@ yyreduce:
                        ip = (yyvsp[-3]);
                (yyval) = ip;
          }
-#line 2155 "awkgram.c" /* yacc.c:1646  */
+#line 2196 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 26:
-#line 417 "awkgram.y" /* yacc.c:1646  */
+  case 30:
+#line 444 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2161 "awkgram.c" /* yacc.c:1646  */
+#line 2202 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 27:
-#line 419 "awkgram.y" /* yacc.c:1646  */
+  case 31:
+#line 446 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2167 "awkgram.c" /* yacc.c:1646  */
+#line 2208 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 28:
-#line 421 "awkgram.y" /* yacc.c:1646  */
+  case 32:
+#line 448 "awkgram.y" /* yacc.c:1646  */
     {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
                YYABORT;
          }
-#line 2177 "awkgram.c" /* yacc.c:1646  */
+#line 2218 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 29:
-#line 427 "awkgram.y" /* yacc.c:1646  */
+  case 33:
+#line 454 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = (yyvsp[0]);
                at_seen = false;
          }
-#line 2186 "awkgram.c" /* yacc.c:1646  */
+#line 2227 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 32:
-#line 439 "awkgram.y" /* yacc.c:1646  */
+  case 36:
+#line 466 "awkgram.y" /* yacc.c:1646  */
     { want_param_names = FUNC_HEADER; }
-#line 2192 "awkgram.c" /* yacc.c:1646  */
+#line 2233 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 33:
-#line 440 "awkgram.y" /* yacc.c:1646  */
+  case 37:
+#line 467 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *  treat any comments between BOF and the first function
@@ -2230,17 +2271,17 @@ yyreduce:
                (yyval) = (yyvsp[-6]);
                want_param_names = FUNC_BODY;
          }
-#line 2234 "awkgram.c" /* yacc.c:1646  */
+#line 2275 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 34:
-#line 485 "awkgram.y" /* yacc.c:1646  */
+  case 38:
+#line 512 "awkgram.y" /* yacc.c:1646  */
     { want_regexp = true; }
-#line 2240 "awkgram.c" /* yacc.c:1646  */
+#line 2281 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 35:
-#line 487 "awkgram.y" /* yacc.c:1646  */
+  case 39:
+#line 514 "awkgram.y" /* yacc.c:1646  */
     {
                  NODE *n, *exp;
                  char *re;
@@ -2269,11 +2310,11 @@ yyreduce:
                  (yyval)->opcode = Op_match_rec;
                  (yyval)->memory = n;
                }
-#line 2273 "awkgram.c" /* yacc.c:1646  */
+#line 2314 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 36:
-#line 519 "awkgram.y" /* yacc.c:1646  */
+  case 40:
+#line 546 "awkgram.y" /* yacc.c:1646  */
     {
                  char *re;
                  size_t len;
@@ -2286,17 +2327,17 @@ yyreduce:
                  (yyval)->opcode = Op_push_re;
                  (yyval)->memory = make_typed_regex(re, len);
                }
-#line 2290 "awkgram.c" /* yacc.c:1646  */
+#line 2331 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 37:
-#line 534 "awkgram.y" /* yacc.c:1646  */
+  case 41:
+#line 561 "awkgram.y" /* yacc.c:1646  */
     { bcfree((yyvsp[0])); }
-#line 2296 "awkgram.c" /* yacc.c:1646  */
+#line 2337 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 39:
-#line 540 "awkgram.y" /* yacc.c:1646  */
+  case 43:
+#line 567 "awkgram.y" /* yacc.c:1646  */
     {
                if (prior_comment != NULL) {
                        (yyval) = list_create(prior_comment);
@@ -2307,11 +2348,11 @@ yyreduce:
                } else
                        (yyval) = NULL;
          }
-#line 2311 "awkgram.c" /* yacc.c:1646  */
+#line 2352 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 40:
-#line 551 "awkgram.y" /* yacc.c:1646  */
+  case 44:
+#line 578 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0]) == NULL) {
                        if (prior_comment != NULL) {
@@ -2358,40 +2399,40 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2362 "awkgram.c" /* yacc.c:1646  */
+#line 2403 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 41:
-#line 598 "awkgram.y" /* yacc.c:1646  */
+  case 45:
+#line 625 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = NULL; }
-#line 2368 "awkgram.c" /* yacc.c:1646  */
+#line 2409 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 44:
-#line 608 "awkgram.y" /* yacc.c:1646  */
+  case 48:
+#line 635 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2374 "awkgram.c" /* yacc.c:1646  */
+#line 2415 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 45:
-#line 610 "awkgram.y" /* yacc.c:1646  */
+  case 49:
+#line 637 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 2380 "awkgram.c" /* yacc.c:1646  */
+#line 2421 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 46:
-#line 612 "awkgram.y" /* yacc.c:1646  */
+  case 50:
+#line 639 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
-#line 2391 "awkgram.c" /* yacc.c:1646  */
+#line 2432 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 47:
-#line 619 "awkgram.y" /* yacc.c:1646  */
+  case 51:
+#line 646 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@ -2481,11 +2522,11 @@ yyreduce:
                break_allowed--;
                fix_break_continue(ip, tbreak, NULL);
          }
-#line 2485 "awkgram.c" /* yacc.c:1646  */
+#line 2526 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 48:
-#line 709 "awkgram.y" /* yacc.c:1646  */
+  case 52:
+#line 736 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *    -----------------
@@ -2527,11 +2568,11 @@ yyreduce:
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
          }
-#line 2531 "awkgram.c" /* yacc.c:1646  */
+#line 2572 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 49:
-#line 751 "awkgram.y" /* yacc.c:1646  */
+  case 53:
+#line 778 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *    -----------------
@@ -2573,11 +2614,11 @@ yyreduce:
                } /* else
                        $1 and $4 are NULLs */
          }
-#line 2577 "awkgram.c" /* yacc.c:1646  */
+#line 2618 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 50:
-#line 793 "awkgram.y" /* yacc.c:1646  */
+  case 54:
+#line 820 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[-5])->lextok;
@@ -2690,33 +2731,33 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2694 "awkgram.c" /* yacc.c:1646  */
+#line 2735 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 51:
-#line 906 "awkgram.y" /* yacc.c:1646  */
+  case 55:
+#line 933 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-11]), (yyvsp[-9]), (yyvsp[-6]), 
(yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2705 "awkgram.c" /* yacc.c:1646  */
+#line 2746 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 52:
-#line 913 "awkgram.y" /* yacc.c:1646  */
+  case 56:
+#line 940 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-10]), (yyvsp[-8]), (INSTRUCTION 
*) NULL, (yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2716 "awkgram.c" /* yacc.c:1646  */
+#line 2757 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 53:
-#line 920 "awkgram.y" /* yacc.c:1646  */
+  case 57:
+#line 947 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
@@ -2724,11 +2765,11 @@ regular_loop:
                        (yyval) = (yyvsp[0]);
                (yyval) = add_pending_comment((yyval));
          }
-#line 2728 "awkgram.c" /* yacc.c:1646  */
+#line 2769 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 54:
-#line 931 "awkgram.y" /* yacc.c:1646  */
+  case 58:
+#line 958 "awkgram.y" /* yacc.c:1646  */
     {
                if (! break_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2738,11 +2779,11 @@ regular_loop:
                (yyval) = add_pending_comment((yyval));
 
          }
-#line 2742 "awkgram.c" /* yacc.c:1646  */
+#line 2783 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 55:
-#line 941 "awkgram.y" /* yacc.c:1646  */
+  case 59:
+#line 968 "awkgram.y" /* yacc.c:1646  */
     {
                if (! continue_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2752,11 +2793,11 @@ regular_loop:
                (yyval) = add_pending_comment((yyval));
 
          }
-#line 2756 "awkgram.c" /* yacc.c:1646  */
+#line 2797 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 56:
-#line 951 "awkgram.y" /* yacc.c:1646  */
+  case 60:
+#line 978 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2766,11 +2807,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2770 "awkgram.c" /* yacc.c:1646  */
+#line 2811 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 57:
-#line 961 "awkgram.y" /* yacc.c:1646  */
+  case 61:
+#line 988 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2782,11 +2823,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2786 "awkgram.c" /* yacc.c:1646  */
+#line 2827 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 58:
-#line 973 "awkgram.y" /* yacc.c:1646  */
+  case 62:
+#line 1000 "awkgram.y" /* yacc.c:1646  */
     {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time.
@@ -2802,20 +2843,20 @@ regular_loop:
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2806 "awkgram.c" /* yacc.c:1646  */
+#line 2847 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 59:
-#line 989 "awkgram.y" /* yacc.c:1646  */
+  case 63:
+#line 1016 "awkgram.y" /* yacc.c:1646  */
     {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
-#line 2815 "awkgram.c" /* yacc.c:1646  */
+#line 2856 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 60:
-#line 992 "awkgram.y" /* yacc.c:1646  */
+  case 64:
+#line 1019 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL) {
                        (yyval) = list_create((yyvsp[-3]));
@@ -2837,17 +2878,17 @@ regular_loop:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2841 "awkgram.c" /* yacc.c:1646  */
+#line 2882 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 62:
-#line 1025 "awkgram.y" /* yacc.c:1646  */
+  case 66:
+#line 1052 "awkgram.y" /* yacc.c:1646  */
     { in_print = true; in_parens = 0; }
-#line 2847 "awkgram.c" /* yacc.c:1646  */
+#line 2888 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 63:
-#line 1026 "awkgram.y" /* yacc.c:1646  */
+  case 67:
+#line 1053 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@ -2945,17 +2986,17 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2949 "awkgram.c" /* yacc.c:1646  */
+#line 2990 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 64:
-#line 1124 "awkgram.y" /* yacc.c:1646  */
+  case 68:
+#line 1151 "awkgram.y" /* yacc.c:1646  */
     { sub_counter = 0; }
-#line 2955 "awkgram.c" /* yacc.c:1646  */
+#line 2996 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 65:
-#line 1125 "awkgram.y" /* yacc.c:1646  */
+  case 69:
+#line 1152 "awkgram.y" /* yacc.c:1646  */
     {
                char *arr = (yyvsp[-2])->lextok;
 
@@ -2989,11 +3030,11 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2993 "awkgram.c" /* yacc.c:1646  */
+#line 3034 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 66:
-#line 1163 "awkgram.y" /* yacc.c:1646  */
+  case 70:
+#line 1190 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
                char *arr = (yyvsp[-1])->lextok;
@@ -3020,55 +3061,55 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 3024 "awkgram.c" /* yacc.c:1646  */
+#line 3065 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 67:
-#line 1190 "awkgram.y" /* yacc.c:1646  */
+  case 71:
+#line 1217 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = optimize_assignment((yyvsp[0]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 3033 "awkgram.c" /* yacc.c:1646  */
+#line 3074 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 68:
-#line 1198 "awkgram.y" /* yacc.c:1646  */
+  case 72:
+#line 1225 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3039 "awkgram.c" /* yacc.c:1646  */
+#line 3080 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 69:
-#line 1200 "awkgram.y" /* yacc.c:1646  */
+  case 73:
+#line 1227 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3045 "awkgram.c" /* yacc.c:1646  */
+#line 3086 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 70:
-#line 1205 "awkgram.y" /* yacc.c:1646  */
+  case 74:
+#line 1232 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3051 "awkgram.c" /* yacc.c:1646  */
+#line 3092 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 71:
-#line 1207 "awkgram.y" /* yacc.c:1646  */
+  case 75:
+#line 1234 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL)
                        (yyval) = list_create((yyvsp[0]));
                else
                        (yyval) = list_prepend((yyvsp[-1]), (yyvsp[0]));
          }
-#line 3062 "awkgram.c" /* yacc.c:1646  */
+#line 3103 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 72:
-#line 1214 "awkgram.y" /* yacc.c:1646  */
+  case 76:
+#line 1241 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3068 "awkgram.c" /* yacc.c:1646  */
+#line 3109 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 73:
-#line 1219 "awkgram.y" /* yacc.c:1646  */
+  case 77:
+#line 1246 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -3080,11 +3121,11 @@ regular_print:
                bcfree((yyvsp[-2]));
                (yyval) = (yyvsp[-4]);
          }
-#line 3084 "awkgram.c" /* yacc.c:1646  */
+#line 3125 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 74:
-#line 1231 "awkgram.y" /* yacc.c:1646  */
+  case 78:
+#line 1258 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -3095,17 +3136,17 @@ regular_print:
                (yyvsp[-3])->case_stmt = casestmt;
                (yyval) = (yyvsp[-3]);
          }
-#line 3099 "awkgram.c" /* yacc.c:1646  */
+#line 3140 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 75:
-#line 1245 "awkgram.y" /* yacc.c:1646  */
+  case 79:
+#line 1272 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3105 "awkgram.c" /* yacc.c:1646  */
+#line 3146 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 76:
-#line 1247 "awkgram.y" /* yacc.c:1646  */
+  case 80:
+#line 1274 "awkgram.y" /* yacc.c:1646  */
     {
                NODE *n = (yyvsp[0])->memory;
                (void) force_number(n);
@@ -3113,28 +3154,28 @@ regular_print:
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3117 "awkgram.c" /* yacc.c:1646  */
+#line 3158 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 77:
-#line 1255 "awkgram.y" /* yacc.c:1646  */
+  case 81:
+#line 1282 "awkgram.y" /* yacc.c:1646  */
     {
                NODE *n = (yyvsp[0])->lasti->memory;
                bcfree((yyvsp[-1]));
                add_sign_to_num(n, '+');
                (yyval) = (yyvsp[0]);
          }
-#line 3128 "awkgram.c" /* yacc.c:1646  */
+#line 3169 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 78:
-#line 1262 "awkgram.y" /* yacc.c:1646  */
+  case 82:
+#line 1289 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3134 "awkgram.c" /* yacc.c:1646  */
+#line 3175 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 79:
-#line 1264 "awkgram.y" /* yacc.c:1646  */
+  case 83:
+#line 1291 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->memory->type == Node_regex)
                        (yyvsp[0])->opcode = Op_push_re;
@@ -3142,57 +3183,57 @@ regular_print:
                        (yyvsp[0])->opcode = Op_push;
                (yyval) = (yyvsp[0]);
          }
-#line 3146 "awkgram.c" /* yacc.c:1646  */
+#line 3187 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 80:
-#line 1272 "awkgram.y" /* yacc.c:1646  */
+  case 84:
+#line 1299 "awkgram.y" /* yacc.c:1646  */
     {
                assert(((yyvsp[0])->memory->flags & REGEX) == REGEX);
                (yyvsp[0])->opcode = Op_push_re;
                (yyval) = (yyvsp[0]);
          }
-#line 3156 "awkgram.c" /* yacc.c:1646  */
+#line 3197 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 81:
-#line 1281 "awkgram.y" /* yacc.c:1646  */
+  case 85:
+#line 1308 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3162 "awkgram.c" /* yacc.c:1646  */
+#line 3203 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 82:
-#line 1283 "awkgram.y" /* yacc.c:1646  */
+  case 86:
+#line 1310 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3168 "awkgram.c" /* yacc.c:1646  */
+#line 3209 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 84:
-#line 1293 "awkgram.y" /* yacc.c:1646  */
+  case 88:
+#line 1320 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = (yyvsp[-1]);
          }
-#line 3176 "awkgram.c" /* yacc.c:1646  */
+#line 3217 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 85:
-#line 1300 "awkgram.y" /* yacc.c:1646  */
+  case 89:
+#line 1327 "awkgram.y" /* yacc.c:1646  */
     {
                in_print = false;
                in_parens = 0;
                (yyval) = NULL;
          }
-#line 3186 "awkgram.c" /* yacc.c:1646  */
+#line 3227 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 86:
-#line 1305 "awkgram.y" /* yacc.c:1646  */
+  case 90:
+#line 1332 "awkgram.y" /* yacc.c:1646  */
     { in_print = false; in_parens = 0; }
-#line 3192 "awkgram.c" /* yacc.c:1646  */
+#line 3233 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 87:
-#line 1306 "awkgram.y" /* yacc.c:1646  */
+  case 91:
+#line 1333 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->redir_type == redirect_twoway
                        && (yyvsp[0])->lasti->opcode == Op_K_getline_redir
@@ -3200,63 +3241,63 @@ regular_print:
                        yyerror(_("multistage two-way pipelines don't work"));
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-2]));
          }
-#line 3204 "awkgram.c" /* yacc.c:1646  */
+#line 3245 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 88:
-#line 1317 "awkgram.y" /* yacc.c:1646  */
+  case 92:
+#line 1344 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-3]), (yyvsp[-5]), (yyvsp[0]), 
NULL, NULL);
          }
-#line 3212 "awkgram.c" /* yacc.c:1646  */
+#line 3253 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 89:
-#line 1322 "awkgram.y" /* yacc.c:1646  */
+  case 93:
+#line 1349 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-6]), (yyvsp[-8]), (yyvsp[-3]), 
(yyvsp[-2]), (yyvsp[0]));
          }
-#line 3220 "awkgram.c" /* yacc.c:1646  */
+#line 3261 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 94:
-#line 1339 "awkgram.y" /* yacc.c:1646  */
+  case 98:
+#line 1366 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3226 "awkgram.c" /* yacc.c:1646  */
+#line 3267 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 95:
-#line 1341 "awkgram.y" /* yacc.c:1646  */
+  case 99:
+#line 1368 "awkgram.y" /* yacc.c:1646  */
     {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3235 "awkgram.c" /* yacc.c:1646  */
+#line 3276 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 96:
-#line 1349 "awkgram.y" /* yacc.c:1646  */
+  case 100:
+#line 1376 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3241 "awkgram.c" /* yacc.c:1646  */
+#line 3282 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 97:
-#line 1351 "awkgram.y" /* yacc.c:1646  */
+  case 101:
+#line 1378 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3247 "awkgram.c" /* yacc.c:1646  */
+#line 3288 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 98:
-#line 1356 "awkgram.y" /* yacc.c:1646  */
+  case 102:
+#line 1383 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->param_count = 0;
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3256 "awkgram.c" /* yacc.c:1646  */
+#line 3297 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 99:
-#line 1361 "awkgram.y" /* yacc.c:1646  */
+  case 103:
+#line 1388 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2]) != NULL && (yyvsp[0]) != NULL) {
                        (yyvsp[0])->param_count =  
(yyvsp[-2])->lasti->param_count + 1;
@@ -3265,74 +3306,74 @@ regular_print:
                } else
                        (yyval) = NULL;
          }
-#line 3269 "awkgram.c" /* yacc.c:1646  */
+#line 3310 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 100:
-#line 1370 "awkgram.y" /* yacc.c:1646  */
+  case 104:
+#line 1397 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3275 "awkgram.c" /* yacc.c:1646  */
+#line 3316 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 101:
-#line 1372 "awkgram.y" /* yacc.c:1646  */
+  case 105:
+#line 1399 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3281 "awkgram.c" /* yacc.c:1646  */
+#line 3322 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 102:
-#line 1374 "awkgram.y" /* yacc.c:1646  */
+  case 106:
+#line 1401 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-2]); }
-#line 3287 "awkgram.c" /* yacc.c:1646  */
+#line 3328 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 103:
-#line 1380 "awkgram.y" /* yacc.c:1646  */
+  case 107:
+#line 1407 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3293 "awkgram.c" /* yacc.c:1646  */
+#line 3334 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 104:
-#line 1382 "awkgram.y" /* yacc.c:1646  */
+  case 108:
+#line 1409 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3299 "awkgram.c" /* yacc.c:1646  */
+#line 3340 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 105:
-#line 1387 "awkgram.y" /* yacc.c:1646  */
+  case 109:
+#line 1414 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3305 "awkgram.c" /* yacc.c:1646  */
+#line 3346 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 106:
-#line 1389 "awkgram.y" /* yacc.c:1646  */
+  case 110:
+#line 1416 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3311 "awkgram.c" /* yacc.c:1646  */
+#line 3352 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 107:
-#line 1394 "awkgram.y" /* yacc.c:1646  */
+  case 111:
+#line 1421 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
-#line 3317 "awkgram.c" /* yacc.c:1646  */
+#line 3358 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 108:
-#line 1396 "awkgram.y" /* yacc.c:1646  */
+  case 112:
+#line 1423 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3326 "awkgram.c" /* yacc.c:1646  */
+#line 3367 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 109:
-#line 1401 "awkgram.y" /* yacc.c:1646  */
+  case 113:
+#line 1428 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3332 "awkgram.c" /* yacc.c:1646  */
+#line 3373 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 110:
-#line 1403 "awkgram.y" /* yacc.c:1646  */
+  case 114:
+#line 1430 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3340,62 +3381,62 @@ regular_print:
                 */
                (yyval) = (yyvsp[-1]);
          }
-#line 3344 "awkgram.c" /* yacc.c:1646  */
+#line 3385 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 111:
-#line 1411 "awkgram.y" /* yacc.c:1646  */
+  case 115:
+#line 1438 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
-#line 3353 "awkgram.c" /* yacc.c:1646  */
+#line 3394 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 112:
-#line 1416 "awkgram.y" /* yacc.c:1646  */
+  case 116:
+#line 1443 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
-#line 3362 "awkgram.c" /* yacc.c:1646  */
+#line 3403 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 113:
-#line 1424 "awkgram.y" /* yacc.c:1646  */
+  case 117:
+#line 1451 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3368 "awkgram.c" /* yacc.c:1646  */
+#line 3409 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 114:
-#line 1426 "awkgram.y" /* yacc.c:1646  */
+  case 118:
+#line 1453 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3374 "awkgram.c" /* yacc.c:1646  */
+#line 3415 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 115:
-#line 1431 "awkgram.y" /* yacc.c:1646  */
+  case 119:
+#line 1458 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
-#line 3380 "awkgram.c" /* yacc.c:1646  */
+#line 3421 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 116:
-#line 1433 "awkgram.y" /* yacc.c:1646  */
+  case 120:
+#line 1460 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3389 "awkgram.c" /* yacc.c:1646  */
+#line 3430 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 117:
-#line 1438 "awkgram.y" /* yacc.c:1646  */
+  case 121:
+#line 1465 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3395 "awkgram.c" /* yacc.c:1646  */
+#line 3436 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 118:
-#line 1440 "awkgram.y" /* yacc.c:1646  */
+  case 122:
+#line 1467 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3403,72 +3444,72 @@ regular_print:
                 */
                (yyval) = (yyvsp[-1]);
          }
-#line 3407 "awkgram.c" /* yacc.c:1646  */
+#line 3448 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 119:
-#line 1448 "awkgram.y" /* yacc.c:1646  */
+  case 123:
+#line 1475 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
-#line 3416 "awkgram.c" /* yacc.c:1646  */
+#line 3457 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 120:
-#line 1453 "awkgram.y" /* yacc.c:1646  */
+  case 124:
+#line 1480 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
-#line 3425 "awkgram.c" /* yacc.c:1646  */
+#line 3466 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 121:
-#line 1460 "awkgram.y" /* yacc.c:1646  */
+  case 125:
+#line 1487 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3431 "awkgram.c" /* yacc.c:1646  */
+#line 3472 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 122:
-#line 1461 "awkgram.y" /* yacc.c:1646  */
+  case 126:
+#line 1488 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = list_create((yyvsp[0])); }
-#line 3437 "awkgram.c" /* yacc.c:1646  */
+#line 3478 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 123:
-#line 1467 "awkgram.y" /* yacc.c:1646  */
+  case 127:
+#line 1494 "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 3448 "awkgram.c" /* yacc.c:1646  */
+#line 3489 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 124:
-#line 1474 "awkgram.y" /* yacc.c:1646  */
+  case 128:
+#line 1501 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_assignment((yyvsp[-2]), list_create((yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3456 "awkgram.c" /* yacc.c:1646  */
+#line 3497 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 125:
-#line 1478 "awkgram.y" /* yacc.c:1646  */
+  case 129:
+#line 1505 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3462 "awkgram.c" /* yacc.c:1646  */
+#line 3503 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 126:
-#line 1480 "awkgram.y" /* yacc.c:1646  */
+  case 130:
+#line 1507 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3468 "awkgram.c" /* yacc.c:1646  */
+#line 3509 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 127:
-#line 1482 "awkgram.y" /* yacc.c:1646  */
+  case 131:
+#line 1509 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3481,11 +3522,11 @@ regular_print:
                bcfree((yyvsp[0]));
                (yyval) = list_append((yyvsp[-2]), (yyvsp[-1]));
          }
-#line 3485 "awkgram.c" /* yacc.c:1646  */
+#line 3526 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 128:
-#line 1495 "awkgram.y" /* yacc.c:1646  */
+  case 132:
+#line 1522 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3502,11 +3543,11 @@ regular_print:
                        (yyval) = list_append(list_merge((yyvsp[-2]), 
(yyvsp[0])), (yyvsp[-1]));
                }
          }
-#line 3506 "awkgram.c" /* yacc.c:1646  */
+#line 3547 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 129:
-#line 1512 "awkgram.y" /* yacc.c:1646  */
+  case 133:
+#line 1539 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3516,91 +3557,91 @@ regular_print:
                (yyvsp[-1])->expr_count = 1;
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3520 "awkgram.c" /* yacc.c:1646  */
+#line 3561 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 130:
-#line 1522 "awkgram.y" /* yacc.c:1646  */
+  case 134:
+#line 1549 "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 3531 "awkgram.c" /* yacc.c:1646  */
+#line 3572 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 131:
-#line 1529 "awkgram.y" /* yacc.c:1646  */
+  case 135:
+#line 1556 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_condition((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]), 
(yyvsp[-1]), (yyvsp[0])); }
-#line 3537 "awkgram.c" /* yacc.c:1646  */
+#line 3578 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 132:
-#line 1531 "awkgram.y" /* yacc.c:1646  */
+  case 136:
+#line 1558 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3543 "awkgram.c" /* yacc.c:1646  */
+#line 3584 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 133:
-#line 1536 "awkgram.y" /* yacc.c:1646  */
+  case 137:
+#line 1563 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3549 "awkgram.c" /* yacc.c:1646  */
+#line 3590 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 134:
-#line 1538 "awkgram.y" /* yacc.c:1646  */
+  case 138:
+#line 1565 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3555 "awkgram.c" /* yacc.c:1646  */
+#line 3596 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 135:
-#line 1540 "awkgram.y" /* yacc.c:1646  */
+  case 139:
+#line 1567 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[0]);
          }
-#line 3564 "awkgram.c" /* yacc.c:1646  */
+#line 3605 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 136:
-#line 1548 "awkgram.y" /* yacc.c:1646  */
+  case 140:
+#line 1575 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3570 "awkgram.c" /* yacc.c:1646  */
+#line 3611 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 137:
-#line 1550 "awkgram.y" /* yacc.c:1646  */
+  case 141:
+#line 1577 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3576 "awkgram.c" /* yacc.c:1646  */
+#line 3617 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 138:
-#line 1555 "awkgram.y" /* yacc.c:1646  */
+  case 142:
+#line 1582 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3582 "awkgram.c" /* yacc.c:1646  */
+#line 3623 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 139:
-#line 1557 "awkgram.y" /* yacc.c:1646  */
+  case 143:
+#line 1584 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3588 "awkgram.c" /* yacc.c:1646  */
+#line 3629 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 140:
-#line 1562 "awkgram.y" /* yacc.c:1646  */
+  case 144:
+#line 1589 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3594 "awkgram.c" /* yacc.c:1646  */
+#line 3635 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 141:
-#line 1564 "awkgram.y" /* yacc.c:1646  */
+  case 145:
+#line 1591 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3600 "awkgram.c" /* yacc.c:1646  */
+#line 3641 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 142:
-#line 1566 "awkgram.y" /* yacc.c:1646  */
+  case 146:
+#line 1593 "awkgram.y" /* yacc.c:1646  */
     {
                int count = 2;
                bool is_simple_var = false;
@@ -3653,47 +3694,47 @@ regular_print:
                                max_args = count;
                }
          }
-#line 3657 "awkgram.c" /* yacc.c:1646  */
+#line 3698 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 144:
-#line 1624 "awkgram.y" /* yacc.c:1646  */
+  case 148:
+#line 1651 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3663 "awkgram.c" /* yacc.c:1646  */
+#line 3704 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 145:
-#line 1626 "awkgram.y" /* yacc.c:1646  */
+  case 149:
+#line 1653 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3669 "awkgram.c" /* yacc.c:1646  */
+#line 3710 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 146:
-#line 1628 "awkgram.y" /* yacc.c:1646  */
+  case 150:
+#line 1655 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3675 "awkgram.c" /* yacc.c:1646  */
+#line 3716 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 147:
-#line 1630 "awkgram.y" /* yacc.c:1646  */
+  case 151:
+#line 1657 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3681 "awkgram.c" /* yacc.c:1646  */
+#line 3722 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 148:
-#line 1632 "awkgram.y" /* yacc.c:1646  */
+  case 152:
+#line 1659 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3687 "awkgram.c" /* yacc.c:1646  */
+#line 3728 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 149:
-#line 1634 "awkgram.y" /* yacc.c:1646  */
+  case 153:
+#line 1661 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3693 "awkgram.c" /* yacc.c:1646  */
+#line 3734 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 150:
-#line 1636 "awkgram.y" /* yacc.c:1646  */
+  case 154:
+#line 1663 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3707,29 +3748,29 @@ regular_print:
                                _("non-redirected `getline' undefined inside 
END action"));
                (yyval) = mk_getline((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]), 
redirect_input);
          }
-#line 3711 "awkgram.c" /* yacc.c:1646  */
+#line 3752 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 151:
-#line 1650 "awkgram.y" /* yacc.c:1646  */
+  case 155:
+#line 1677 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3720 "awkgram.c" /* yacc.c:1646  */
+#line 3761 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 152:
-#line 1655 "awkgram.y" /* yacc.c:1646  */
+  case 156:
+#line 1682 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3729 "awkgram.c" /* yacc.c:1646  */
+#line 3770 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 153:
-#line 1660 "awkgram.y" /* yacc.c:1646  */
+  case 157:
+#line 1687 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old) {
                    warning_ln((yyvsp[-1])->source_line,
@@ -3749,64 +3790,64 @@ regular_print:
                        (yyval) = list_append(list_merge(t, (yyvsp[0])), 
(yyvsp[-1]));
                }
          }
-#line 3753 "awkgram.c" /* yacc.c:1646  */
+#line 3794 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 154:
-#line 1685 "awkgram.y" /* yacc.c:1646  */
+  case 158:
+#line 1712 "awkgram.y" /* yacc.c:1646  */
     {
                  (yyval) = mk_getline((yyvsp[-1]), (yyvsp[0]), (yyvsp[-3]), 
(yyvsp[-2])->redir_type);
                  bcfree((yyvsp[-2]));
                }
-#line 3762 "awkgram.c" /* yacc.c:1646  */
+#line 3803 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 155:
-#line 1691 "awkgram.y" /* yacc.c:1646  */
+  case 159:
+#line 1718 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3768 "awkgram.c" /* yacc.c:1646  */
+#line 3809 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 156:
-#line 1693 "awkgram.y" /* yacc.c:1646  */
+  case 160:
+#line 1720 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3774 "awkgram.c" /* yacc.c:1646  */
+#line 3815 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 157:
-#line 1695 "awkgram.y" /* yacc.c:1646  */
+  case 161:
+#line 1722 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3780 "awkgram.c" /* yacc.c:1646  */
+#line 3821 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 158:
-#line 1697 "awkgram.y" /* yacc.c:1646  */
+  case 162:
+#line 1724 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3786 "awkgram.c" /* yacc.c:1646  */
+#line 3827 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 159:
-#line 1699 "awkgram.y" /* yacc.c:1646  */
+  case 163:
+#line 1726 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3792 "awkgram.c" /* yacc.c:1646  */
+#line 3833 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 160:
-#line 1701 "awkgram.y" /* yacc.c:1646  */
+  case 164:
+#line 1728 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3798 "awkgram.c" /* yacc.c:1646  */
+#line 3839 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 161:
-#line 1706 "awkgram.y" /* yacc.c:1646  */
+  case 165:
+#line 1733 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3806 "awkgram.c" /* yacc.c:1646  */
+#line 3847 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 162:
-#line 1710 "awkgram.y" /* yacc.c:1646  */
+  case 166:
+#line 1737 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->opcode == Op_match_rec) {
                        (yyvsp[0])->opcode = Op_nomatch;
@@ -3838,37 +3879,37 @@ regular_print:
                        }
                }
           }
-#line 3842 "awkgram.c" /* yacc.c:1646  */
+#line 3883 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 163:
-#line 1742 "awkgram.y" /* yacc.c:1646  */
+  case 167:
+#line 1769 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3848 "awkgram.c" /* yacc.c:1646  */
+#line 3889 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 164:
-#line 1744 "awkgram.y" /* yacc.c:1646  */
+  case 168:
+#line 1771 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3858 "awkgram.c" /* yacc.c:1646  */
+#line 3899 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 165:
-#line 1750 "awkgram.y" /* yacc.c:1646  */
+  case 169:
+#line 1777 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3868 "awkgram.c" /* yacc.c:1646  */
+#line 3909 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 166:
-#line 1756 "awkgram.y" /* yacc.c:1646  */
+  case 170:
+#line 1783 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
 
@@ -3881,45 +3922,45 @@ regular_print:
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3885 "awkgram.c" /* yacc.c:1646  */
+#line 3926 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 169:
-#line 1771 "awkgram.y" /* yacc.c:1646  */
+  case 173:
+#line 1798 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3894 "awkgram.c" /* yacc.c:1646  */
+#line 3935 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 170:
-#line 1776 "awkgram.y" /* yacc.c:1646  */
+  case 174:
+#line 1803 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3903 "awkgram.c" /* yacc.c:1646  */
+#line 3944 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 171:
-#line 1781 "awkgram.y" /* yacc.c:1646  */
+  case 175:
+#line 1808 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3911 "awkgram.c" /* yacc.c:1646  */
+#line 3952 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 172:
-#line 1785 "awkgram.y" /* yacc.c:1646  */
+  case 176:
+#line 1812 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3919 "awkgram.c" /* yacc.c:1646  */
+#line 3960 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 173:
-#line 1789 "awkgram.y" /* yacc.c:1646  */
+  case 177:
+#line 1816 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->lasti->opcode == Op_push_i
                        && ((yyvsp[0])->lasti->memory->flags & STRING) == 0
@@ -3934,11 +3975,11 @@ regular_print:
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
          }
-#line 3938 "awkgram.c" /* yacc.c:1646  */
+#line 3979 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 174:
-#line 1804 "awkgram.y" /* yacc.c:1646  */
+  case 178:
+#line 1831 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->lasti->opcode == Op_push_i
                        && ((yyvsp[0])->lasti->memory->flags & STRING) == 0
@@ -3956,20 +3997,20 @@ regular_print:
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
          }
-#line 3960 "awkgram.c" /* yacc.c:1646  */
+#line 4001 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 175:
-#line 1825 "awkgram.y" /* yacc.c:1646  */
+  case 179:
+#line 1852 "awkgram.y" /* yacc.c:1646  */
     {
                func_use((yyvsp[0])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[0]);
          }
-#line 3969 "awkgram.c" /* yacc.c:1646  */
+#line 4010 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 176:
-#line 1830 "awkgram.y" /* yacc.c:1646  */
+  case 180:
+#line 1857 "awkgram.y" /* yacc.c:1646  */
     {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -4003,11 +4044,11 @@ regular_print:
                (yyval) = list_prepend((yyvsp[0]), t);
                at_seen = false;
          }
-#line 4007 "awkgram.c" /* yacc.c:1646  */
+#line 4048 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 177:
-#line 1867 "awkgram.y" /* yacc.c:1646  */
+  case 181:
+#line 1894 "awkgram.y" /* yacc.c:1646  */
     {
                NODE *n;
 
@@ -4032,49 +4073,49 @@ regular_print:
                        (yyval) = list_append(t, (yyvsp[-3]));
                }
          }
-#line 4036 "awkgram.c" /* yacc.c:1646  */
+#line 4077 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 178:
-#line 1895 "awkgram.y" /* yacc.c:1646  */
+  case 182:
+#line 1922 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 4042 "awkgram.c" /* yacc.c:1646  */
+#line 4083 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 179:
-#line 1897 "awkgram.y" /* yacc.c:1646  */
+  case 183:
+#line 1924 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 4048 "awkgram.c" /* yacc.c:1646  */
+#line 4089 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 180:
-#line 1902 "awkgram.y" /* yacc.c:1646  */
+  case 184:
+#line 1929 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 4054 "awkgram.c" /* yacc.c:1646  */
+#line 4095 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 181:
-#line 1904 "awkgram.y" /* yacc.c:1646  */
+  case 185:
+#line 1931 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 4060 "awkgram.c" /* yacc.c:1646  */
+#line 4101 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 182:
-#line 1909 "awkgram.y" /* yacc.c:1646  */
+  case 186:
+#line 1936 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 4066 "awkgram.c" /* yacc.c:1646  */
+#line 4107 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 183:
-#line 1911 "awkgram.y" /* yacc.c:1646  */
+  case 187:
+#line 1938 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 4074 "awkgram.c" /* yacc.c:1646  */
+#line 4115 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 184:
-#line 1918 "awkgram.y" /* yacc.c:1646  */
+  case 188:
+#line 1945 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->lasti;
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -4088,11 +4129,11 @@ regular_print:
                sub_counter++;  /* count # of dimensions */
                (yyval) = (yyvsp[0]);
          }
-#line 4092 "awkgram.c" /* yacc.c:1646  */
+#line 4133 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 185:
-#line 1935 "awkgram.y" /* yacc.c:1646  */
+  case 189:
+#line 1962 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *t = (yyvsp[-1]);
                if ((yyvsp[-1]) == NULL) {
@@ -4106,31 +4147,31 @@ regular_print:
                        (yyvsp[0])->sub_count = count_expressions(&t, false);
                (yyval) = list_append(t, (yyvsp[0]));
          }
-#line 4110 "awkgram.c" /* yacc.c:1646  */
+#line 4151 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 186:
-#line 1952 "awkgram.y" /* yacc.c:1646  */
+  case 190:
+#line 1979 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 4116 "awkgram.c" /* yacc.c:1646  */
+#line 4157 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 187:
-#line 1954 "awkgram.y" /* yacc.c:1646  */
+  case 191:
+#line 1981 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 4124 "awkgram.c" /* yacc.c:1646  */
+#line 4165 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 188:
-#line 1961 "awkgram.y" /* yacc.c:1646  */
+  case 192:
+#line 1988 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 4130 "awkgram.c" /* yacc.c:1646  */
+#line 4171 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 189:
-#line 1966 "awkgram.y" /* yacc.c:1646  */
+  case 193:
+#line 1993 "awkgram.y" /* yacc.c:1646  */
     {
                char *var_name = (yyvsp[0])->lextok;
 
@@ -4138,22 +4179,22 @@ regular_print:
                (yyvsp[0])->memory = variable((yyvsp[0])->source_line, 
var_name, Node_var_new);
                (yyval) = list_create((yyvsp[0]));
          }
-#line 4142 "awkgram.c" /* yacc.c:1646  */
+#line 4183 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 190:
-#line 1974 "awkgram.y" /* yacc.c:1646  */
+  case 194:
+#line 2001 "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 4153 "awkgram.c" /* yacc.c:1646  */
+#line 4194 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 191:
-#line 1984 "awkgram.y" /* yacc.c:1646  */
+  case 195:
+#line 2011 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->nexti;
                if (ip->opcode == Op_push
@@ -4165,73 +4206,73 @@ regular_print:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 4169 "awkgram.c" /* yacc.c:1646  */
+#line 4210 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 192:
-#line 1996 "awkgram.y" /* yacc.c:1646  */
+  case 196:
+#line 2023 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                if ((yyvsp[0]) != NULL)
                        mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 4179 "awkgram.c" /* yacc.c:1646  */
+#line 4220 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 193:
-#line 2005 "awkgram.y" /* yacc.c:1646  */
+  case 197:
+#line 2032 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
          }
-#line 4187 "awkgram.c" /* yacc.c:1646  */
+#line 4228 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 194:
-#line 2009 "awkgram.y" /* yacc.c:1646  */
+  case 198:
+#line 2036 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
          }
-#line 4195 "awkgram.c" /* yacc.c:1646  */
+#line 4236 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 195:
-#line 2012 "awkgram.y" /* yacc.c:1646  */
+  case 199:
+#line 2039 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 4201 "awkgram.c" /* yacc.c:1646  */
+#line 4242 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 197:
-#line 2020 "awkgram.y" /* yacc.c:1646  */
+  case 201:
+#line 2047 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4207 "awkgram.c" /* yacc.c:1646  */
+#line 4248 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 198:
-#line 2024 "awkgram.y" /* yacc.c:1646  */
+  case 202:
+#line 2051 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4213 "awkgram.c" /* yacc.c:1646  */
+#line 4254 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 201:
-#line 2033 "awkgram.y" /* yacc.c:1646  */
+  case 205:
+#line 2060 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4219 "awkgram.c" /* yacc.c:1646  */
+#line 4260 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 202:
-#line 2037 "awkgram.y" /* yacc.c:1646  */
+  case 206:
+#line 2064 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); yyerrok; }
-#line 4225 "awkgram.c" /* yacc.c:1646  */
+#line 4266 "awkgram.c" /* yacc.c:1646  */
     break;
 
-  case 203:
-#line 2041 "awkgram.y" /* yacc.c:1646  */
+  case 207:
+#line 2068 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4231 "awkgram.c" /* yacc.c:1646  */
+#line 4272 "awkgram.c" /* yacc.c:1646  */
     break;
 
 
-#line 4235 "awkgram.c" /* yacc.c:1646  */
+#line 4276 "awkgram.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -4459,7 +4500,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 2043 "awkgram.y" /* yacc.c:1906  */
+#line 2070 "awkgram.y" /* yacc.c:1906  */
 
 
 struct token {
@@ -4556,6 +4597,7 @@ static const struct token tokentab[] = {
 {"lshift",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(2),     do_lshift,      
MPF(lshift)},
 {"match",      Op_builtin,      LEX_BUILTIN,   NOT_OLD|A(2)|A(3), do_match,    
0},
 {"mktime",     Op_builtin,      LEX_BUILTIN,   GAWKX|A(1)|A(2), do_mktime, 0},
+{"namespace",          Op_K_namespace,  LEX_NAMESPACE, GAWKX,          0,      
0},
 {"next",       Op_K_next,       LEX_NEXT,      0,              0,      0},
 {"nextfile",   Op_K_nextfile, LEX_NEXTFILE,    0,              0,      0},
 {"or",         Op_builtin,    LEX_BUILTIN,     GAWKX,          do_or,  
MPF(or)},
@@ -6541,7 +6583,15 @@ retry:
        while (c != END_FILE && is_identchar(c)) {
                tokadd(c);
                c = nextc(true);
+
                if (! do_traditional && c == ':') {
+                       // check for keyword, etc.
+                       tokadd('\0');
+                       if ((mid = check_special(tokstart)) >= 0) {
+                               tok--;
+                               break;
+                       }
+
                        int peek = nextc(true);
 
                        if (peek == ':') {
@@ -6563,9 +6613,16 @@ retry:
                static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
                int class = tokentab[mid].class;
 
-               if ((class == LEX_INCLUDE || class == LEX_LOAD || class == 
LEX_EVAL)
-                               && lasttok != '@')
-                       goto out;
+               switch (class) {
+               case LEX_EVAL:
+               case LEX_INCLUDE:
+               case LEX_LOAD:
+               case LEX_NAMESPACE:
+                       if (lasttok != '@')
+                               goto out;
+               default:
+                       break;
+               }
 
                /* allow parameter names to shadow the names of gawk extension 
built-ins */
                if ((tokentab[mid].flags & GAWKX) != 0) {
@@ -6620,6 +6677,9 @@ retry:
                        continue_allowed++;
 
                switch (class) {
+               case LEX_NAMESPACE:
+                       yylval = bcalloc(tokentab[mid].value, 1, sourceline);
+                       // fall through
                case LEX_INCLUDE:
                case LEX_LOAD:
                        want_source = true;
diff --git a/awkgram.y b/awkgram.y
index 9b81250..7030d3f 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -143,6 +143,9 @@ extern INSTRUCTION *rule_list;
 extern int max_args;
 extern NODE **args_array;
 
+const char awk_namespace[] = "awk::";
+const char *current_namespace = NULL;
+
 static INSTRUCTION *rule_block[sizeof(ruletab)];
 
 static INSTRUCTION *ip_rec;
@@ -188,7 +191,7 @@ extern double fmod(double x, double y);
 %token LEX_AND LEX_OR INCREMENT DECREMENT
 %token LEX_BUILTIN LEX_LENGTH
 %token LEX_EOF
-%token LEX_INCLUDE LEX_EVAL LEX_LOAD
+%token LEX_INCLUDE LEX_EVAL LEX_LOAD LEX_NAMESPACE
 %token NEWLINE
 
 /* Lowest to highest */
@@ -272,6 +275,21 @@ rule
                at_seen = false;
                yyerrok;
          }
+       | '@' LEX_NAMESPACE namespace statement_term
+         {
+               want_source = false;
+               at_seen = false;
+fprintf(stderr, "setting namespace to %s\n", $3->lextok);
+/*
+               if (set_namespace($3->lextok) < 0)
+                       YYABORT;
+*/
+               efree($3->lextok);
+               bcfree($3);
+               // for now:
+               bcfree($2);
+               yyerrok;
+         }
        ;
 
 source
@@ -304,6 +322,15 @@ library
          { $$ = NULL; }
        ;
 
+namespace
+       : FILENAME
+         { $$ = $1; }
+       | FILENAME error
+         { $$ = NULL; }
+       | error
+         { $$ = NULL; }
+       ;
+
 pattern
        : /* empty */
          {
@@ -2136,6 +2163,7 @@ static const struct token tokentab[] = {
 {"lshift",     Op_builtin,    LEX_BUILTIN,     GAWKX|A(2),     do_lshift,      
MPF(lshift)},
 {"match",      Op_builtin,      LEX_BUILTIN,   NOT_OLD|A(2)|A(3), do_match,    
0},
 {"mktime",     Op_builtin,      LEX_BUILTIN,   GAWKX|A(1)|A(2), do_mktime, 0},
+{"namespace",          Op_K_namespace,  LEX_NAMESPACE, GAWKX,          0,      
0},
 {"next",       Op_K_next,       LEX_NEXT,      0,              0,      0},
 {"nextfile",   Op_K_nextfile, LEX_NEXTFILE,    0,              0,      0},
 {"or",         Op_builtin,    LEX_BUILTIN,     GAWKX,          do_or,  
MPF(or)},
@@ -4121,7 +4149,15 @@ retry:
        while (c != END_FILE && is_identchar(c)) {
                tokadd(c);
                c = nextc(true);
+
                if (! do_traditional && c == ':') {
+                       // check for keyword, etc.
+                       tokadd('\0');
+                       if ((mid = check_special(tokstart)) >= 0) {
+                               tok--;
+                               break;
+                       }
+
                        int peek = nextc(true);
 
                        if (peek == ':') {
@@ -4143,9 +4179,16 @@ retry:
                static int warntab[sizeof(tokentab) / sizeof(tokentab[0])];
                int class = tokentab[mid].class;
 
-               if ((class == LEX_INCLUDE || class == LEX_LOAD || class == 
LEX_EVAL)
-                               && lasttok != '@')
-                       goto out;
+               switch (class) {
+               case LEX_EVAL:
+               case LEX_INCLUDE:
+               case LEX_LOAD:
+               case LEX_NAMESPACE:
+                       if (lasttok != '@')
+                               goto out;
+               default:
+                       break;
+               }
 
                /* allow parameter names to shadow the names of gawk extension 
built-ins */
                if ((tokentab[mid].flags & GAWKX) != 0) {
@@ -4200,6 +4243,9 @@ retry:
                        continue_allowed++;
 
                switch (class) {
+               case LEX_NAMESPACE:
+                       yylval = bcalloc(tokentab[mid].value, 1, sourceline);
+                       // fall through
                case LEX_INCLUDE:
                case LEX_LOAD:
                        want_source = true;
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 92afd91..0f17a4e 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,9 @@
+2017-06-11         Arnold D. Robbins     <address@hidden>
+
+       * gawktexi.in (Namespaces): Document that reserved words and
+       predefined functions can't be namespace names. Reformat the
+       input a little bit.
+
 2017-06-06         Arnold D. Robbins     <address@hidden>
 
        * gawktexi.in (Namespaces): Further clarifications. Move to
diff --git a/doc/gawk.info b/doc/gawk.info
index e9d686b..6f85343 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -19806,6 +19806,17 @@ variables and functions in another.  This is 
especially important when
 using variable names to index the special 'SYMTAB' array, and when
 making indirect function calls.  *FIXME:* and xref.
 
+   It is a syntax error to use any 'gawk' reserved word (such as 'if' or
+'for'), or the name of any built-in function (such as 'sin()' or
+'gsub()' as the namespace part of a fully qualified name.
+
+   On the other hand, 'gawk' pre-defined variable names may be used:
+'NF::NR' is valid, if possibly not all that useful.(1)
+
+   ---------- Footnotes ----------
+
+   (1) This could change, based on reviewer feedback.
+
 
 File: gawk.info,  Node: Default Namespace,  Next: Changing The Namespace,  
Prev: Qualified Names,  Up: Namespaces
 
@@ -36397,234 +36408,235 @@ Ref: Programs Exercises-Footnote-1804700
 Node: Namespaces804791
 Node: Global Namespace805471
 Node: Qualified Names806714
-Node: Default Namespace807671
-Node: Changing The Namespace808448
-Node: Internal Name Management809573
-Node: Namespace Example810567
-Node: Namespace Misc812636
-Node: Advanced Features814278
-Node: Nondecimal Data816263
-Node: Array Sorting817854
-Node: Controlling Array Traversal818554
-Ref: Controlling Array Traversal-Footnote-1826921
-Node: Array Sorting Functions827039
-Ref: Array Sorting Functions-Footnote-1832130
-Node: Two-way I/O832326
-Ref: Two-way I/O-Footnote-1838877
-Ref: Two-way I/O-Footnote-2839064
-Node: TCP/IP Networking839146
-Node: Profiling842264
-Ref: Profiling-Footnote-1850936
-Node: Advanced Features Summary851259
-Node: Internationalization853103
-Node: I18N and L10N854583
-Node: Explaining gettext855270
-Ref: Explaining gettext-Footnote-1861162
-Ref: Explaining gettext-Footnote-2861347
-Node: Programmer i18n861512
-Ref: Programmer i18n-Footnote-1866461
-Node: Translator i18n866510
-Node: String Extraction867304
-Ref: String Extraction-Footnote-1868436
-Node: Printf Ordering868522
-Ref: Printf Ordering-Footnote-1871308
-Node: I18N Portability871372
-Ref: I18N Portability-Footnote-1873828
-Node: I18N Example873891
-Ref: I18N Example-Footnote-1876697
-Node: Gawk I18N876770
-Node: I18N Summary877415
-Node: Debugger878756
-Node: Debugging879778
-Node: Debugging Concepts880219
-Node: Debugging Terms882028
-Node: Awk Debugging884603
-Node: Sample Debugging Session885509
-Node: Debugger Invocation886043
-Node: Finding The Bug887429
-Node: List of Debugger Commands893907
-Node: Breakpoint Control895240
-Node: Debugger Execution Control898934
-Node: Viewing And Changing Data902296
-Node: Execution Stack905670
-Node: Debugger Info907307
-Node: Miscellaneous Debugger Commands911378
-Node: Readline Support916466
-Node: Limitations917362
-Node: Debugging Summary919471
-Node: Arbitrary Precision Arithmetic920750
-Node: Computer Arithmetic922235
-Ref: table-numeric-ranges925826
-Ref: Computer Arithmetic-Footnote-1926548
-Node: Math Definitions926605
-Ref: table-ieee-formats929919
-Ref: Math Definitions-Footnote-1930522
-Node: MPFR features930627
-Node: FP Math Caution932344
-Ref: FP Math Caution-Footnote-1933416
-Node: Inexactness of computations933785
-Node: Inexact representation934745
-Node: Comparing FP Values936105
-Node: Errors accumulate937187
-Node: Getting Accuracy938620
-Node: Try To Round941330
-Node: Setting precision942229
-Ref: table-predefined-precision-strings942926
-Node: Setting the rounding mode944756
-Ref: table-gawk-rounding-modes945130
-Ref: Setting the rounding mode-Footnote-1948538
-Node: Arbitrary Precision Integers948717
-Ref: Arbitrary Precision Integers-Footnote-1953622
-Node: Checking for MPFR953771
-Node: POSIX Floating Point Problems955068
-Ref: POSIX Floating Point Problems-Footnote-1958939
-Node: Floating point summary958977
-Node: Dynamic Extensions961167
-Node: Extension Intro962720
-Node: Plugin License963986
-Node: Extension Mechanism Outline964783
-Ref: figure-load-extension965222
-Ref: figure-register-new-function966787
-Ref: figure-call-new-function967879
-Node: Extension API Description969941
-Node: Extension API Functions Introduction971583
-Node: General Data Types976917
-Ref: General Data Types-Footnote-1984122
-Node: Memory Allocation Functions984421
-Ref: Memory Allocation Functions-Footnote-1987266
-Node: Constructor Functions987365
-Node: Registration Functions990364
-Node: Extension Functions991049
-Node: Exit Callback Functions996262
-Node: Extension Version String997512
-Node: Input Parsers998175
-Node: Output Wrappers1010882
-Node: Two-way processors1015394
-Node: Printing Messages1017659
-Ref: Printing Messages-Footnote-11018830
-Node: Updating ERRNO1018983
-Node: Requesting Values1019722
-Ref: table-value-types-returned1020459
-Node: Accessing Parameters1021395
-Node: Symbol Table Access1022630
-Node: Symbol table by name1023142
-Node: Symbol table by cookie1024931
-Ref: Symbol table by cookie-Footnote-11029116
-Node: Cached values1029180
-Ref: Cached values-Footnote-11032716
-Node: Array Manipulation1032807
-Ref: Array Manipulation-Footnote-11033898
-Node: Array Data Types1033935
-Ref: Array Data Types-Footnote-11036593
-Node: Array Functions1036685
-Node: Flattening Arrays1041084
-Node: Creating Arrays1048025
-Node: Redirection API1052794
-Node: Extension API Variables1055636
-Node: Extension Versioning1056269
-Ref: gawk-api-version1056706
-Node: Extension API Informational Variables1058434
-Node: Extension API Boilerplate1059498
-Node: Changes from API V11063360
-Node: Finding Extensions1064020
-Node: Extension Example1064579
-Node: Internal File Description1065377
-Node: Internal File Ops1069457
-Ref: Internal File Ops-Footnote-11080857
-Node: Using Internal File Ops1080997
-Ref: Using Internal File Ops-Footnote-11083380
-Node: Extension Samples1083654
-Node: Extension Sample File Functions1085183
-Node: Extension Sample Fnmatch1092832
-Node: Extension Sample Fork1094319
-Node: Extension Sample Inplace1095537
-Node: Extension Sample Ord1098747
-Node: Extension Sample Readdir1099583
-Ref: table-readdir-file-types1100472
-Node: Extension Sample Revout1101277
-Node: Extension Sample Rev2way1101866
-Node: Extension Sample Read write array1102606
-Node: Extension Sample Readfile1104548
-Node: Extension Sample Time1105643
-Node: Extension Sample API Tests1106991
-Node: gawkextlib1107483
-Node: Extension summary1109930
-Node: Extension Exercises1113632
-Node: Language History1115130
-Node: V7/SVR3.11116786
-Node: SVR41118938
-Node: POSIX1120372
-Node: BTL1121751
-Node: POSIX/GNU1122480
-Node: Feature History1128372
-Node: Common Extensions1142796
-Node: Ranges and Locales1144079
-Ref: Ranges and Locales-Footnote-11148695
-Ref: Ranges and Locales-Footnote-21148722
-Ref: Ranges and Locales-Footnote-31148957
-Node: Contributors1149178
-Node: History summary1154738
-Node: Installation1156118
-Node: Gawk Distribution1157062
-Node: Getting1157546
-Node: Extracting1158507
-Node: Distribution contents1160145
-Node: Unix Installation1166487
-Node: Quick Installation1167169
-Node: Shell Startup Files1169583
-Node: Additional Configuration Options1170672
-Node: Configuration Philosophy1172661
-Node: Non-Unix Installation1175030
-Node: PC Installation1175490
-Node: PC Binary Installation1176328
-Node: PC Compiling1176763
-Node: PC Using1177880
-Node: Cygwin1180925
-Node: MSYS1181695
-Node: VMS Installation1182196
-Node: VMS Compilation1182987
-Ref: VMS Compilation-Footnote-11184216
-Node: VMS Dynamic Extensions1184274
-Node: VMS Installation Details1185959
-Node: VMS Running1188212
-Node: VMS GNV1192491
-Node: VMS Old Gawk1193226
-Node: Bugs1193697
-Node: Bug address1194360
-Node: Usenet1196757
-Node: Maintainers1197534
-Node: Other Versions1198910
-Node: Installation summary1205494
-Node: Notes1206529
-Node: Compatibility Mode1207394
-Node: Additions1208176
-Node: Accessing The Source1209101
-Node: Adding Code1210536
-Node: New Ports1216754
-Node: Derived Files1221242
-Ref: Derived Files-Footnote-11226727
-Ref: Derived Files-Footnote-21226762
-Ref: Derived Files-Footnote-31227360
-Node: Future Extensions1227474
-Node: Implementation Limitations1228132
-Node: Extension Design1229315
-Node: Old Extension Problems1230469
-Ref: Old Extension Problems-Footnote-11231987
-Node: Extension New Mechanism Goals1232044
-Ref: Extension New Mechanism Goals-Footnote-11235408
-Node: Extension Other Design Decisions1235597
-Node: Extension Future Growth1237710
-Node: Old Extension Mechanism1238546
-Node: Notes summary1240309
-Node: Basic Concepts1241491
-Node: Basic High Level1242172
-Ref: figure-general-flow1242454
-Ref: figure-process-flow1243139
-Ref: Basic High Level-Footnote-11246440
-Node: Basic Data Typing1246625
-Node: Glossary1249953
-Node: Copying1281900
-Node: GNU Free Documentation License1319439
-Node: Index1344557
+Ref: Qualified Names-Footnote-1808029
+Node: Default Namespace808084
+Node: Changing The Namespace808861
+Node: Internal Name Management809986
+Node: Namespace Example810980
+Node: Namespace Misc813049
+Node: Advanced Features814691
+Node: Nondecimal Data816676
+Node: Array Sorting818267
+Node: Controlling Array Traversal818967
+Ref: Controlling Array Traversal-Footnote-1827334
+Node: Array Sorting Functions827452
+Ref: Array Sorting Functions-Footnote-1832543
+Node: Two-way I/O832739
+Ref: Two-way I/O-Footnote-1839290
+Ref: Two-way I/O-Footnote-2839477
+Node: TCP/IP Networking839559
+Node: Profiling842677
+Ref: Profiling-Footnote-1851349
+Node: Advanced Features Summary851672
+Node: Internationalization853516
+Node: I18N and L10N854996
+Node: Explaining gettext855683
+Ref: Explaining gettext-Footnote-1861575
+Ref: Explaining gettext-Footnote-2861760
+Node: Programmer i18n861925
+Ref: Programmer i18n-Footnote-1866874
+Node: Translator i18n866923
+Node: String Extraction867717
+Ref: String Extraction-Footnote-1868849
+Node: Printf Ordering868935
+Ref: Printf Ordering-Footnote-1871721
+Node: I18N Portability871785
+Ref: I18N Portability-Footnote-1874241
+Node: I18N Example874304
+Ref: I18N Example-Footnote-1877110
+Node: Gawk I18N877183
+Node: I18N Summary877828
+Node: Debugger879169
+Node: Debugging880191
+Node: Debugging Concepts880632
+Node: Debugging Terms882441
+Node: Awk Debugging885016
+Node: Sample Debugging Session885922
+Node: Debugger Invocation886456
+Node: Finding The Bug887842
+Node: List of Debugger Commands894320
+Node: Breakpoint Control895653
+Node: Debugger Execution Control899347
+Node: Viewing And Changing Data902709
+Node: Execution Stack906083
+Node: Debugger Info907720
+Node: Miscellaneous Debugger Commands911791
+Node: Readline Support916879
+Node: Limitations917775
+Node: Debugging Summary919884
+Node: Arbitrary Precision Arithmetic921163
+Node: Computer Arithmetic922648
+Ref: table-numeric-ranges926239
+Ref: Computer Arithmetic-Footnote-1926961
+Node: Math Definitions927018
+Ref: table-ieee-formats930332
+Ref: Math Definitions-Footnote-1930935
+Node: MPFR features931040
+Node: FP Math Caution932757
+Ref: FP Math Caution-Footnote-1933829
+Node: Inexactness of computations934198
+Node: Inexact representation935158
+Node: Comparing FP Values936518
+Node: Errors accumulate937600
+Node: Getting Accuracy939033
+Node: Try To Round941743
+Node: Setting precision942642
+Ref: table-predefined-precision-strings943339
+Node: Setting the rounding mode945169
+Ref: table-gawk-rounding-modes945543
+Ref: Setting the rounding mode-Footnote-1948951
+Node: Arbitrary Precision Integers949130
+Ref: Arbitrary Precision Integers-Footnote-1954035
+Node: Checking for MPFR954184
+Node: POSIX Floating Point Problems955481
+Ref: POSIX Floating Point Problems-Footnote-1959352
+Node: Floating point summary959390
+Node: Dynamic Extensions961580
+Node: Extension Intro963133
+Node: Plugin License964399
+Node: Extension Mechanism Outline965196
+Ref: figure-load-extension965635
+Ref: figure-register-new-function967200
+Ref: figure-call-new-function968292
+Node: Extension API Description970354
+Node: Extension API Functions Introduction971996
+Node: General Data Types977330
+Ref: General Data Types-Footnote-1984535
+Node: Memory Allocation Functions984834
+Ref: Memory Allocation Functions-Footnote-1987679
+Node: Constructor Functions987778
+Node: Registration Functions990777
+Node: Extension Functions991462
+Node: Exit Callback Functions996675
+Node: Extension Version String997925
+Node: Input Parsers998588
+Node: Output Wrappers1011295
+Node: Two-way processors1015807
+Node: Printing Messages1018072
+Ref: Printing Messages-Footnote-11019243
+Node: Updating ERRNO1019396
+Node: Requesting Values1020135
+Ref: table-value-types-returned1020872
+Node: Accessing Parameters1021808
+Node: Symbol Table Access1023043
+Node: Symbol table by name1023555
+Node: Symbol table by cookie1025344
+Ref: Symbol table by cookie-Footnote-11029529
+Node: Cached values1029593
+Ref: Cached values-Footnote-11033129
+Node: Array Manipulation1033220
+Ref: Array Manipulation-Footnote-11034311
+Node: Array Data Types1034348
+Ref: Array Data Types-Footnote-11037006
+Node: Array Functions1037098
+Node: Flattening Arrays1041497
+Node: Creating Arrays1048438
+Node: Redirection API1053207
+Node: Extension API Variables1056049
+Node: Extension Versioning1056682
+Ref: gawk-api-version1057119
+Node: Extension API Informational Variables1058847
+Node: Extension API Boilerplate1059911
+Node: Changes from API V11063773
+Node: Finding Extensions1064433
+Node: Extension Example1064992
+Node: Internal File Description1065790
+Node: Internal File Ops1069870
+Ref: Internal File Ops-Footnote-11081270
+Node: Using Internal File Ops1081410
+Ref: Using Internal File Ops-Footnote-11083793
+Node: Extension Samples1084067
+Node: Extension Sample File Functions1085596
+Node: Extension Sample Fnmatch1093245
+Node: Extension Sample Fork1094732
+Node: Extension Sample Inplace1095950
+Node: Extension Sample Ord1099160
+Node: Extension Sample Readdir1099996
+Ref: table-readdir-file-types1100885
+Node: Extension Sample Revout1101690
+Node: Extension Sample Rev2way1102279
+Node: Extension Sample Read write array1103019
+Node: Extension Sample Readfile1104961
+Node: Extension Sample Time1106056
+Node: Extension Sample API Tests1107404
+Node: gawkextlib1107896
+Node: Extension summary1110343
+Node: Extension Exercises1114045
+Node: Language History1115543
+Node: V7/SVR3.11117199
+Node: SVR41119351
+Node: POSIX1120785
+Node: BTL1122164
+Node: POSIX/GNU1122893
+Node: Feature History1128785
+Node: Common Extensions1143209
+Node: Ranges and Locales1144492
+Ref: Ranges and Locales-Footnote-11149108
+Ref: Ranges and Locales-Footnote-21149135
+Ref: Ranges and Locales-Footnote-31149370
+Node: Contributors1149591
+Node: History summary1155151
+Node: Installation1156531
+Node: Gawk Distribution1157475
+Node: Getting1157959
+Node: Extracting1158920
+Node: Distribution contents1160558
+Node: Unix Installation1166900
+Node: Quick Installation1167582
+Node: Shell Startup Files1169996
+Node: Additional Configuration Options1171085
+Node: Configuration Philosophy1173074
+Node: Non-Unix Installation1175443
+Node: PC Installation1175903
+Node: PC Binary Installation1176741
+Node: PC Compiling1177176
+Node: PC Using1178293
+Node: Cygwin1181338
+Node: MSYS1182108
+Node: VMS Installation1182609
+Node: VMS Compilation1183400
+Ref: VMS Compilation-Footnote-11184629
+Node: VMS Dynamic Extensions1184687
+Node: VMS Installation Details1186372
+Node: VMS Running1188625
+Node: VMS GNV1192904
+Node: VMS Old Gawk1193639
+Node: Bugs1194110
+Node: Bug address1194773
+Node: Usenet1197170
+Node: Maintainers1197947
+Node: Other Versions1199323
+Node: Installation summary1205907
+Node: Notes1206942
+Node: Compatibility Mode1207807
+Node: Additions1208589
+Node: Accessing The Source1209514
+Node: Adding Code1210949
+Node: New Ports1217167
+Node: Derived Files1221655
+Ref: Derived Files-Footnote-11227140
+Ref: Derived Files-Footnote-21227175
+Ref: Derived Files-Footnote-31227773
+Node: Future Extensions1227887
+Node: Implementation Limitations1228545
+Node: Extension Design1229728
+Node: Old Extension Problems1230882
+Ref: Old Extension Problems-Footnote-11232400
+Node: Extension New Mechanism Goals1232457
+Ref: Extension New Mechanism Goals-Footnote-11235821
+Node: Extension Other Design Decisions1236010
+Node: Extension Future Growth1238123
+Node: Old Extension Mechanism1238959
+Node: Notes summary1240722
+Node: Basic Concepts1241904
+Node: Basic High Level1242585
+Ref: figure-general-flow1242867
+Ref: figure-process-flow1243552
+Ref: Basic High Level-Footnote-11246853
+Node: Basic Data Typing1247038
+Node: Glossary1250366
+Node: Copying1282313
+Node: GNU Free Documentation License1319852
+Node: Index1344970
 
 End Tag Table
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 5364895..6a14f7e 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -27627,14 +27627,14 @@ This @value{CHAPTER} describes a feature that is 
specific to @command{gawk}.
 
 In standard @command{awk}, there is a single, global, @dfn{namespace}.
 This means that @emph{all} function names and global variable names must
-be unique. For example, two different @command{awk} source files cannot both 
define
-a function named @code{min()}.
-
-This situation is okay when programs are small, say a few hundred lines,
-or even a few thousand, but it prevents the development of reusable
-libraries of @command{awk} functions, and can inadvertently cause
-independently-developed library files to accidentally step on each other's
-``private'' global variables
+be unique. For example, two different @command{awk} source files cannot
+both define a function named @code{min()}.
+
+This situation is okay when programs are small, say a few hundred
+lines, or even a few thousand, but it prevents the development of
+reusable libraries of @command{awk} functions, and can inadvertently
+cause independently-developed library files to accidentally step on each
+other's ``private'' global variables
 (@pxref{Library Names}).
 
 Most other programming languages solve this issue by providing some kind
@@ -27645,29 +27645,40 @@ are much fewer namespaces in use by any given 
program, and thus much
 less chance for collisions.)
 
 Starting with @value{PVERSION} @strong{FIXME} 5.0, @command{gawk} provides a
-mechanism to put functions and global variables into different
-namespaces.
+mechanism to put functions and global variables into different namespaces.
 
 @node Qualified Names
 @section Qualified Names
 
 A @dfn{qualified name} is an identifier that includes a namespace
-name and the namespace separator, @code{::}.  For example, one might have a 
function named @code{posix::getpid()}.
-Here, the namespace is @code{posix} and the function name within the
-namespace is @code{getpid()}.  The namespace and variable or function
-name are separated by a double-colon.  Only one such separator is allowed in
-a qualified name.
-
address@hidden  NOTE
-Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are allowed 
between
-the namespace name, the @code{::}, and the rest of the name.
+name and the namespace separator, @code{::}.  For example, one
+might have a function named @code{posix::getpid()}.  Here, the
+namespace is @code{posix} and the function name within the namespace
+is @code{getpid()}.  The namespace and variable or function name are
+separated by a double-colon.  Only one such separator is allowed in a
+qualified name.
+
address@hidden NOTE
+Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are
+allowed between the namespace name, the @code{::}, and the rest of
+the name.
 @end quotation
 
 You must use fully qualified names from one namespace to access variables
-and functions in another.  This is especially important when using variable
-names to index the special @code{SYMTAB} array, and when making indirect 
function calls.
+and functions in another.  This is especially important when using
+variable names to index the special @code{SYMTAB} array, and when making
+indirect function calls.
 @strong{FIXME:} and xref.
 
+It is a syntax error to use any @command{gawk} reserved word (such
+as @code{if} or @code{for}), or the name of any built-in function
+(such as @code{sin()} or @code{gsub()} as the namespace part of a
+fully qualified name.
+
+On the other hand, @command{gawk} pre-defined variable names may be used:
address@hidden::NR} is valid, if possibly not all that address@hidden
+could change, based on reviewer feedback.}
+
 @node Default Namespace
 @section The Default Namespace
 
@@ -27705,10 +27716,9 @@ source file, although this is likely to become 
confusing if you
 do it too much.
 
 @quotation NOTE
-The namespace concept is one handled while your program is
-being parsed by @command{gawk}. There is no concept of a
-``current'' namespace during runtime.  Be sure you understand
-the distinction.
+The namespace concept is one handled while your program is being parsed
+by @command{gawk}. There is no concept of a ``current'' namespace
+during runtime.  Be sure you understand the distinction.
 @end quotation
 
 Each source file for @option{-i} and @option{-f}
@@ -27732,8 +27742,9 @@ is mainly relevant when using such identifiers as 
indices for
 and for use in indirect function calls
 (FIXME: xref).
 
-In program code, to refer to variables and functions in the @samp{awk} 
namespace from
-another namespace, you must still use the @samp{awk::} prefix. For example:
+In program code, to refer to variables and functions in the @samp{awk}
+namespace from another namespace, you must still use the @samp{awk::}
+prefix. For example:
 
 @example
 @@namespace "awk"          # the default
@@ -27861,13 +27872,12 @@ Other notes for reviewers:
 
 @table @asis
 @item Profiler:
-When profiling, we can add an @code{Op_Namespace} to the start of
-each rule and function definition.  If this is different than the previous
-one, output an
address@hidden@@namespace} statement.  For each identifier, if it starts
-with the current namespace, output only the simple part.
-For all @samp{awk::XXX} if @samp{XXX} is all uppercase, strip
-off the @samp{awk::} part.
+When profiling, we can add an @code{Op_Namespace} to the start of each
+rule and function definition.  If this is different than the previous
+one, output an @samp{@@namespace} statement.  For each identifier,
+if it starts with the current namespace, output only the simple part.
+For all @samp{awk::XXX} if @samp{XXX} is all uppercase, strip off the
address@hidden::} part.
 
 @item Debugger:
 Simply print fully qualified names all the time. Maybe allow a
@@ -27876,9 +27886,9 @@ namespace and it will use that to create fully 
qualified names?
 Have to be careful about all uppercase names though.
 
 @item How does this affect @code{@@include}?
-Basically @code{@@include} should push and pop the namespace. Each 
@code{@@include}
-saves the current namespace and starts over with namespace @samp{awk} until
-an @code{@@namespace} is seen.
+Basically @code{@@include} should push and pop the namespace. Each
address@hidden@@include} saves the current namespace and starts over with
+namespace @samp{awk} until an @code{@@namespace} is seen.
 
 @item Extension functions
 Revise the current macros to pass @code{"awk"} as the namespace
diff --git a/doc/gawktexi.in b/doc/gawktexi.in
index 192fc0e..b32b79d 100644
--- a/doc/gawktexi.in
+++ b/doc/gawktexi.in
@@ -26641,14 +26641,14 @@ This @value{CHAPTER} describes a feature that is 
specific to @command{gawk}.
 
 In standard @command{awk}, there is a single, global, @dfn{namespace}.
 This means that @emph{all} function names and global variable names must
-be unique. For example, two different @command{awk} source files cannot both 
define
-a function named @code{min()}.
-
-This situation is okay when programs are small, say a few hundred lines,
-or even a few thousand, but it prevents the development of reusable
-libraries of @command{awk} functions, and can inadvertently cause
-independently-developed library files to accidentally step on each other's
-``private'' global variables
+be unique. For example, two different @command{awk} source files cannot
+both define a function named @code{min()}.
+
+This situation is okay when programs are small, say a few hundred
+lines, or even a few thousand, but it prevents the development of
+reusable libraries of @command{awk} functions, and can inadvertently
+cause independently-developed library files to accidentally step on each
+other's ``private'' global variables
 (@pxref{Library Names}).
 
 Most other programming languages solve this issue by providing some kind
@@ -26659,29 +26659,40 @@ are much fewer namespaces in use by any given 
program, and thus much
 less chance for collisions.)
 
 Starting with @value{PVERSION} @strong{FIXME} 5.0, @command{gawk} provides a
-mechanism to put functions and global variables into different
-namespaces.
+mechanism to put functions and global variables into different namespaces.
 
 @node Qualified Names
 @section Qualified Names
 
 A @dfn{qualified name} is an identifier that includes a namespace
-name and the namespace separator, @code{::}.  For example, one might have a 
function named @code{posix::getpid()}.
-Here, the namespace is @code{posix} and the function name within the
-namespace is @code{getpid()}.  The namespace and variable or function
-name are separated by a double-colon.  Only one such separator is allowed in
-a qualified name.
-
address@hidden  NOTE
-Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are allowed 
between
-the namespace name, the @code{::}, and the rest of the name.
+name and the namespace separator, @code{::}.  For example, one
+might have a function named @code{posix::getpid()}.  Here, the
+namespace is @code{posix} and the function name within the namespace
+is @code{getpid()}.  The namespace and variable or function name are
+separated by a double-colon.  Only one such separator is allowed in a
+qualified name.
+
address@hidden NOTE
+Unlike C++, the @code{::} is @emph{not} an operator.  No spaces are
+allowed between the namespace name, the @code{::}, and the rest of
+the name.
 @end quotation
 
 You must use fully qualified names from one namespace to access variables
-and functions in another.  This is especially important when using variable
-names to index the special @code{SYMTAB} array, and when making indirect 
function calls.
+and functions in another.  This is especially important when using
+variable names to index the special @code{SYMTAB} array, and when making
+indirect function calls.
 @strong{FIXME:} and xref.
 
+It is a syntax error to use any @command{gawk} reserved word (such
+as @code{if} or @code{for}), or the name of any built-in function
+(such as @code{sin()} or @code{gsub()} as the namespace part of a
+fully qualified name.
+
+On the other hand, @command{gawk} pre-defined variable names may be used:
address@hidden::NR} is valid, if possibly not all that address@hidden
+could change, based on reviewer feedback.}
+
 @node Default Namespace
 @section The Default Namespace
 
@@ -26719,10 +26730,9 @@ source file, although this is likely to become 
confusing if you
 do it too much.
 
 @quotation NOTE
-The namespace concept is one handled while your program is
-being parsed by @command{gawk}. There is no concept of a
-``current'' namespace during runtime.  Be sure you understand
-the distinction.
+The namespace concept is one handled while your program is being parsed
+by @command{gawk}. There is no concept of a ``current'' namespace
+during runtime.  Be sure you understand the distinction.
 @end quotation
 
 Each source file for @option{-i} and @option{-f}
@@ -26746,8 +26756,9 @@ is mainly relevant when using such identifiers as 
indices for
 and for use in indirect function calls
 (FIXME: xref).
 
-In program code, to refer to variables and functions in the @samp{awk} 
namespace from
-another namespace, you must still use the @samp{awk::} prefix. For example:
+In program code, to refer to variables and functions in the @samp{awk}
+namespace from another namespace, you must still use the @samp{awk::}
+prefix. For example:
 
 @example
 @@namespace "awk"          # the default
@@ -26875,13 +26886,12 @@ Other notes for reviewers:
 
 @table @asis
 @item Profiler:
-When profiling, we can add an @code{Op_Namespace} to the start of
-each rule and function definition.  If this is different than the previous
-one, output an
address@hidden@@namespace} statement.  For each identifier, if it starts
-with the current namespace, output only the simple part.
-For all @samp{awk::XXX} if @samp{XXX} is all uppercase, strip
-off the @samp{awk::} part.
+When profiling, we can add an @code{Op_Namespace} to the start of each
+rule and function definition.  If this is different than the previous
+one, output an @samp{@@namespace} statement.  For each identifier,
+if it starts with the current namespace, output only the simple part.
+For all @samp{awk::XXX} if @samp{XXX} is all uppercase, strip off the
address@hidden::} part.
 
 @item Debugger:
 Simply print fully qualified names all the time. Maybe allow a
@@ -26890,9 +26900,9 @@ namespace and it will use that to create fully 
qualified names?
 Have to be careful about all uppercase names though.
 
 @item How does this affect @code{@@include}?
-Basically @code{@@include} should push and pop the namespace. Each 
@code{@@include}
-saves the current namespace and starts over with namespace @samp{awk} until
-an @code{@@namespace} is seen.
+Basically @code{@@include} should push and pop the namespace. Each
address@hidden@@include} saves the current namespace and starts over with
+namespace @samp{awk} until an @code{@@namespace} is seen.
 
 @item Extension functions
 Revise the current macros to pass @code{"awk"} as the namespace
diff --git a/eval.c b/eval.c
index 73bd7fc..5392704 100644
--- a/eval.c
+++ b/eval.c
@@ -380,6 +380,7 @@ static struct optypetab {
        { "Op_K_if", "if" },
        { "Op_K_else", "else" },
        { "Op_K_function", "function" },
+       { "Op_K_namespace", "@namespace" },
        { "Op_cond_exp", NULL },
        { "Op_final --- this should never appear", NULL },
        { NULL, NULL },

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

Summary of changes:
 ChangeLog       |   11 +
 awk.h           |    4 +
 awkgram.c       | 2062 ++++++++++++++++++++++++++++---------------------------
 awkgram.y       |   54 +-
 doc/ChangeLog   |    6 +
 doc/gawk.info   |  470 +++++++------
 doc/gawk.texi   |   84 ++-
 doc/gawktexi.in |   84 ++-
 eval.c          |    1 +
 9 files changed, 1468 insertions(+), 1308 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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