gawk-diffs
[Top][All Lists]
Advanced

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

[SCM] gawk branch, master, updated. gawk-4.1.0-5583-gb38c8f97


From: Arnold Robbins
Subject: [SCM] gawk branch, master, updated. gawk-4.1.0-5583-gb38c8f97
Date: Fri, 9 Aug 2024 01:50:24 -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, master has been updated
       via  b38c8f9763b8cd7baa1a13d295d02e4c0c4f2043 (commit)
      from  45d280bb98565805080894e5e932620ff382b45f (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=b38c8f9763b8cd7baa1a13d295d02e4c0c4f2043

commit b38c8f9763b8cd7baa1a13d295d02e4c0c4f2043
Author: Arnold D. Robbins <arnold@skeeve.com>
Date:   Fri Aug 9 08:50:04 2024 +0300

    Squashed commit of the following:
    
    commit 84894dd83057fced64b03b479ba9f47c9b7b8bdd
    Merge: 46c652a2 c54a5d87
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Thu Aug 8 19:49:20 2024 +0300
    
        Merge branch 'master' into feature/ns-include
    
    commit 46c652a20c6bf160f8e61ca98b7561ab5b688337
    Merge: 6f20359b 0aab2854
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Thu Aug 8 07:17:00 2024 +0300
    
        Merge branch 'master' into feature/ns-include
    
    commit 6f20359b5fe70aafc88a5f19adbf5063a584309c
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Wed Aug 7 16:31:52 2024 +0300
    
        Update NEWS.
    
    commit 9ae658ca76892ba27714e1cda5b0af8063eb1ae6
    Merge: 3beb8476 60f7d594
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Tue Aug 6 21:09:36 2024 +0300
    
        Merge branch 'master' into feature/ns-include
    
    commit 3beb847617c0bf4ad8d5c6b993db2aff237e1a6b
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Tue Aug 6 21:07:11 2024 +0300
    
        Add documentation for @nsinclude.
    
    commit 04abbb531e9a5c212d968b2c256990f6f9e402a7
    Merge: dd23a1f5 93573313
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Mon Aug 5 21:17:48 2024 +0300
    
        Merge branch 'master' into feature/ns-include
    
    commit dd23a1f55b5d4b4d8519ae7851c581d8b0452d97
    Merge: bff70f61 7ee62f17
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Thu Aug 1 10:53:45 2024 +0300
    
        Merge branch 'master' into feature/ns-include
    
    commit bff70f61beac1a038f86d216436dce21c25ebb22
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Thu Aug 1 10:50:14 2024 +0300
    
        @ns_include --> @nsinclude.
    
    commit 1b2ab0a10a5e0528e6257136bf559a832d8c8afd
    Author: Arnold D. Robbins <arnold@skeeve.com>
    Date:   Wed Jul 31 18:40:49 2024 +0300
    
        Add @ns_include.

diff --git a/ChangeLog b/ChangeLog
index b3cd0736..865e092b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,11 +9,43 @@
        * printf.c (format_signed_integer): Add some additional
        parentheses.
 
+2024-08-07         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * NEWS: Updated.
+
 2024-08-06         Arnold D. Robbins     <arnold@skeeve.com>
 
        * printf.c (format_unsigned_integer, format_signed_integer):
        Additional fixes. New added tests pass.
 
+2024-08-01         Arnold D. Robbins     <arnold@skeeve.com>
+
+       Per Andy's suggestion, @ns_include --> @nsinclude.
+
+       * awk.h (SRC_NSINC): Renamed from SRC_NS_INC.
+       * command.y, debug.c, io.c, main.c, profile.c, awkgram.y: All
+       uses adjusted.
+       * awkgram.y (LEX_NSINCLUDE): Renamed from LEX_NS_INCLUDE.
+       (tokentab): "nsinclude" token renamed from "ns_include".
+       (yylex): Adjust logic a bit.
+
+2024-07-31         Arnold D. Robbins     <arnold@skeeve.com>
+
+       Add @ns_include to include a file into the current namespace.
+
+       * awk.h (struct srcfile): Add new enum value SRC_NS_INC.
+       * awkgram.y (use_current_namespace): New boolean.
+       (LEX_NS_INCLUDE): New token and new production for it.
+       (tokentab): Add "ns_include" token.
+       (print_included_from, add_srcfile, include_source, yylex): Adjust
+       logic.
+       * command.y (srcfile_generator): Handle SRC_NS_INC.
+       * debug.c (source_find): Ditto.
+       (debug_prog): Ditto.
+       * io.c (srcopen): Ditto.
+       * main.c (main): Ditto.
+       * profile.c (print_include_list): Ditto.
+
 2024-07-28         Arnold D. Robbins     <arnold@skeeve.com>
 
        * TODO: Updated.
diff --git a/NEWS b/NEWS
index 900f06a5..e522db09 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,13 @@
    are permitted in any medium without royalty provided the copyright
    notice and this notice are preserved.
 
+Changes from 5.3.x to 5.4.0
+---------------------------
+
+1. There is now a new directive, @nsinclude, which works like @include
+   but does not reset the namespace for the included file to "awk". See
+   the manual for details.
+
 Changes from 5.3.0 to 5.3.x
 ---------------------------
 
diff --git a/awk.h b/awk.h
index 9997534d..28f80cb4 100644
--- a/awk.h
+++ b/awk.h
@@ -1025,6 +1025,7 @@ typedef struct srcfile {
                SRC_STDIN,
                SRC_FILE,
                SRC_INC,
+               SRC_NSINC,
                SRC_EXTLIB
        } stype;
        char *src;      /* name on command line or include statement */
diff --git a/awkgram.c b/awkgram.c
index 80eae86c..275a422c 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -226,6 +226,8 @@ static INSTRUCTION *ip_beginfile;
 INSTRUCTION *main_beginfile;
 static bool called_from_eval = false;
 
+static bool include_use_current_namespace = false;
+
 static inline INSTRUCTION *list_create(INSTRUCTION *x);
 static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
 static inline INSTRUCTION *list_prepend(INSTRUCTION *l, INSTRUCTION *x);
@@ -235,7 +237,7 @@ extern double fmod(double x, double y);
 
 #define YYSTYPE INSTRUCTION *
 
-#line 239 "awkgram.c"
+#line 241 "awkgram.c"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -326,9 +328,10 @@ extern int yydebug;
     LEX_EVAL = 305,                /* LEX_EVAL  */
     LEX_LOAD = 306,                /* LEX_LOAD  */
     LEX_NAMESPACE = 307,           /* LEX_NAMESPACE  */
-    NEWLINE = 308,                 /* NEWLINE  */
-    SLASH_BEFORE_EQUAL = 309,      /* SLASH_BEFORE_EQUAL  */
-    UNARY = 310                    /* UNARY  */
+    LEX_NSINCLUDE = 308,           /* LEX_NSINCLUDE  */
+    NEWLINE = 309,                 /* NEWLINE  */
+    SLASH_BEFORE_EQUAL = 310,      /* SLASH_BEFORE_EQUAL  */
+    UNARY = 311                    /* UNARY  */
   };
   typedef enum yytokentype yytoken_kind_t;
 #endif
@@ -387,9 +390,10 @@ extern int yydebug;
 #define LEX_EVAL 305
 #define LEX_LOAD 306
 #define LEX_NAMESPACE 307
-#define NEWLINE 308
-#define SLASH_BEFORE_EQUAL 309
-#define UNARY 310
+#define LEX_NSINCLUDE 308
+#define NEWLINE 309
+#define SLASH_BEFORE_EQUAL 310
+#define UNARY 311
 
 /* Value type.  */
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
@@ -463,102 +467,103 @@ enum yysymbol_kind_t
   YYSYMBOL_LEX_EVAL = 50,                  /* LEX_EVAL  */
   YYSYMBOL_LEX_LOAD = 51,                  /* LEX_LOAD  */
   YYSYMBOL_LEX_NAMESPACE = 52,             /* LEX_NAMESPACE  */
-  YYSYMBOL_NEWLINE = 53,                   /* NEWLINE  */
-  YYSYMBOL_SLASH_BEFORE_EQUAL = 54,        /* SLASH_BEFORE_EQUAL  */
-  YYSYMBOL_55_ = 55,                       /* '?'  */
-  YYSYMBOL_56_ = 56,                       /* ':'  */
-  YYSYMBOL_57_ = 57,                       /* ','  */
-  YYSYMBOL_58_ = 58,                       /* '<'  */
-  YYSYMBOL_59_ = 59,                       /* '>'  */
-  YYSYMBOL_60_ = 60,                       /* '+'  */
-  YYSYMBOL_61_ = 61,                       /* '-'  */
-  YYSYMBOL_62_ = 62,                       /* '*'  */
-  YYSYMBOL_63_ = 63,                       /* '/'  */
-  YYSYMBOL_64_ = 64,                       /* '%'  */
-  YYSYMBOL_65_ = 65,                       /* '!'  */
-  YYSYMBOL_UNARY = 66,                     /* UNARY  */
-  YYSYMBOL_67_ = 67,                       /* '^'  */
-  YYSYMBOL_68_ = 68,                       /* '$'  */
-  YYSYMBOL_69_ = 69,                       /* '('  */
-  YYSYMBOL_70_ = 70,                       /* ')'  */
-  YYSYMBOL_71_ = 71,                       /* '@'  */
-  YYSYMBOL_72_ = 72,                       /* '['  */
-  YYSYMBOL_73_ = 73,                       /* ']'  */
-  YYSYMBOL_74_ = 74,                       /* '{'  */
-  YYSYMBOL_75_ = 75,                       /* '}'  */
-  YYSYMBOL_76_ = 76,                       /* ';'  */
-  YYSYMBOL_YYACCEPT = 77,                  /* $accept  */
-  YYSYMBOL_program = 78,                   /* program  */
-  YYSYMBOL_rule = 79,                      /* rule  */
-  YYSYMBOL_source = 80,                    /* source  */
-  YYSYMBOL_library = 81,                   /* library  */
-  YYSYMBOL_namespace = 82,                 /* namespace  */
-  YYSYMBOL_pattern = 83,                   /* pattern  */
-  YYSYMBOL_action = 84,                    /* action  */
-  YYSYMBOL_func_name = 85,                 /* func_name  */
-  YYSYMBOL_lex_builtin = 86,               /* lex_builtin  */
-  YYSYMBOL_function_prologue = 87,         /* function_prologue  */
-  YYSYMBOL_88_1 = 88,                      /* $@1  */
-  YYSYMBOL_regexp = 89,                    /* regexp  */
-  YYSYMBOL_90_2 = 90,                      /* $@2  */
-  YYSYMBOL_typed_regexp = 91,              /* typed_regexp  */
-  YYSYMBOL_a_slash = 92,                   /* a_slash  */
-  YYSYMBOL_statements = 93,                /* statements  */
-  YYSYMBOL_statement_term = 94,            /* statement_term  */
-  YYSYMBOL_statement = 95,                 /* statement  */
-  YYSYMBOL_non_compound_stmt = 96,         /* non_compound_stmt  */
-  YYSYMBOL_97_3 = 97,                      /* $@3  */
-  YYSYMBOL_simple_stmt = 98,               /* simple_stmt  */
-  YYSYMBOL_99_4 = 99,                      /* $@4  */
-  YYSYMBOL_100_5 = 100,                    /* $@5  */
-  YYSYMBOL_opt_simple_stmt = 101,          /* opt_simple_stmt  */
-  YYSYMBOL_case_statements = 102,          /* case_statements  */
-  YYSYMBOL_case_statement = 103,           /* case_statement  */
-  YYSYMBOL_case_value = 104,               /* case_value  */
-  YYSYMBOL_print = 105,                    /* print  */
-  YYSYMBOL_print_expression_list = 106,    /* print_expression_list  */
-  YYSYMBOL_output_redir = 107,             /* output_redir  */
-  YYSYMBOL_108_6 = 108,                    /* $@6  */
-  YYSYMBOL_if_statement = 109,             /* if_statement  */
-  YYSYMBOL_nls = 110,                      /* nls  */
-  YYSYMBOL_opt_nls = 111,                  /* opt_nls  */
-  YYSYMBOL_input_redir = 112,              /* input_redir  */
-  YYSYMBOL_opt_param_list = 113,           /* opt_param_list  */
-  YYSYMBOL_param_list = 114,               /* param_list  */
-  YYSYMBOL_opt_exp = 115,                  /* opt_exp  */
-  YYSYMBOL_opt_expression_list = 116,      /* opt_expression_list  */
-  YYSYMBOL_expression_list = 117,          /* expression_list  */
-  YYSYMBOL_opt_fcall_expression_list = 118, /* opt_fcall_expression_list  */
-  YYSYMBOL_fcall_expression_list = 119,    /* fcall_expression_list  */
-  YYSYMBOL_fcall_exp = 120,                /* fcall_exp  */
-  YYSYMBOL_opt_fcall_exp = 121,            /* opt_fcall_exp  */
-  YYSYMBOL_exp = 122,                      /* exp  */
-  YYSYMBOL_assign_operator = 123,          /* assign_operator  */
-  YYSYMBOL_relop_or_less = 124,            /* relop_or_less  */
-  YYSYMBOL_a_relop = 125,                  /* a_relop  */
-  YYSYMBOL_common_exp = 126,               /* common_exp  */
-  YYSYMBOL_simp_exp = 127,                 /* simp_exp  */
-  YYSYMBOL_simp_exp_nc = 128,              /* simp_exp_nc  */
-  YYSYMBOL_non_post_simp_exp = 129,        /* non_post_simp_exp  */
-  YYSYMBOL_func_call = 130,                /* func_call  */
-  YYSYMBOL_direct_func_call = 131,         /* direct_func_call  */
-  YYSYMBOL_opt_variable = 132,             /* opt_variable  */
-  YYSYMBOL_delete_subscript_list = 133,    /* delete_subscript_list  */
-  YYSYMBOL_delete_subscript = 134,         /* delete_subscript  */
-  YYSYMBOL_delete_exp_list = 135,          /* delete_exp_list  */
-  YYSYMBOL_bracketed_exp_list = 136,       /* bracketed_exp_list  */
-  YYSYMBOL_subscript = 137,                /* subscript  */
-  YYSYMBOL_subscript_list = 138,           /* subscript_list  */
-  YYSYMBOL_simple_variable = 139,          /* simple_variable  */
-  YYSYMBOL_variable = 140,                 /* variable  */
-  YYSYMBOL_opt_incdec = 141,               /* opt_incdec  */
-  YYSYMBOL_l_brace = 142,                  /* l_brace  */
-  YYSYMBOL_r_brace = 143,                  /* r_brace  */
-  YYSYMBOL_r_paren = 144,                  /* r_paren  */
-  YYSYMBOL_opt_semi = 145,                 /* opt_semi  */
-  YYSYMBOL_semi = 146,                     /* semi  */
-  YYSYMBOL_colon = 147,                    /* colon  */
-  YYSYMBOL_comma = 148                     /* comma  */
+  YYSYMBOL_LEX_NSINCLUDE = 53,             /* LEX_NSINCLUDE  */
+  YYSYMBOL_NEWLINE = 54,                   /* NEWLINE  */
+  YYSYMBOL_SLASH_BEFORE_EQUAL = 55,        /* SLASH_BEFORE_EQUAL  */
+  YYSYMBOL_56_ = 56,                       /* '?'  */
+  YYSYMBOL_57_ = 57,                       /* ':'  */
+  YYSYMBOL_58_ = 58,                       /* ','  */
+  YYSYMBOL_59_ = 59,                       /* '<'  */
+  YYSYMBOL_60_ = 60,                       /* '>'  */
+  YYSYMBOL_61_ = 61,                       /* '+'  */
+  YYSYMBOL_62_ = 62,                       /* '-'  */
+  YYSYMBOL_63_ = 63,                       /* '*'  */
+  YYSYMBOL_64_ = 64,                       /* '/'  */
+  YYSYMBOL_65_ = 65,                       /* '%'  */
+  YYSYMBOL_66_ = 66,                       /* '!'  */
+  YYSYMBOL_UNARY = 67,                     /* UNARY  */
+  YYSYMBOL_68_ = 68,                       /* '^'  */
+  YYSYMBOL_69_ = 69,                       /* '$'  */
+  YYSYMBOL_70_ = 70,                       /* '('  */
+  YYSYMBOL_71_ = 71,                       /* ')'  */
+  YYSYMBOL_72_ = 72,                       /* '@'  */
+  YYSYMBOL_73_ = 73,                       /* '['  */
+  YYSYMBOL_74_ = 74,                       /* ']'  */
+  YYSYMBOL_75_ = 75,                       /* '{'  */
+  YYSYMBOL_76_ = 76,                       /* '}'  */
+  YYSYMBOL_77_ = 77,                       /* ';'  */
+  YYSYMBOL_YYACCEPT = 78,                  /* $accept  */
+  YYSYMBOL_program = 79,                   /* program  */
+  YYSYMBOL_rule = 80,                      /* rule  */
+  YYSYMBOL_source = 81,                    /* source  */
+  YYSYMBOL_library = 82,                   /* library  */
+  YYSYMBOL_namespace = 83,                 /* namespace  */
+  YYSYMBOL_pattern = 84,                   /* pattern  */
+  YYSYMBOL_action = 85,                    /* action  */
+  YYSYMBOL_func_name = 86,                 /* func_name  */
+  YYSYMBOL_lex_builtin = 87,               /* lex_builtin  */
+  YYSYMBOL_function_prologue = 88,         /* function_prologue  */
+  YYSYMBOL_89_1 = 89,                      /* $@1  */
+  YYSYMBOL_regexp = 90,                    /* regexp  */
+  YYSYMBOL_91_2 = 91,                      /* $@2  */
+  YYSYMBOL_typed_regexp = 92,              /* typed_regexp  */
+  YYSYMBOL_a_slash = 93,                   /* a_slash  */
+  YYSYMBOL_statements = 94,                /* statements  */
+  YYSYMBOL_statement_term = 95,            /* statement_term  */
+  YYSYMBOL_statement = 96,                 /* statement  */
+  YYSYMBOL_non_compound_stmt = 97,         /* non_compound_stmt  */
+  YYSYMBOL_98_3 = 98,                      /* $@3  */
+  YYSYMBOL_simple_stmt = 99,               /* simple_stmt  */
+  YYSYMBOL_100_4 = 100,                    /* $@4  */
+  YYSYMBOL_101_5 = 101,                    /* $@5  */
+  YYSYMBOL_opt_simple_stmt = 102,          /* opt_simple_stmt  */
+  YYSYMBOL_case_statements = 103,          /* case_statements  */
+  YYSYMBOL_case_statement = 104,           /* case_statement  */
+  YYSYMBOL_case_value = 105,               /* case_value  */
+  YYSYMBOL_print = 106,                    /* print  */
+  YYSYMBOL_print_expression_list = 107,    /* print_expression_list  */
+  YYSYMBOL_output_redir = 108,             /* output_redir  */
+  YYSYMBOL_109_6 = 109,                    /* $@6  */
+  YYSYMBOL_if_statement = 110,             /* if_statement  */
+  YYSYMBOL_nls = 111,                      /* nls  */
+  YYSYMBOL_opt_nls = 112,                  /* opt_nls  */
+  YYSYMBOL_input_redir = 113,              /* input_redir  */
+  YYSYMBOL_opt_param_list = 114,           /* opt_param_list  */
+  YYSYMBOL_param_list = 115,               /* param_list  */
+  YYSYMBOL_opt_exp = 116,                  /* opt_exp  */
+  YYSYMBOL_opt_expression_list = 117,      /* opt_expression_list  */
+  YYSYMBOL_expression_list = 118,          /* expression_list  */
+  YYSYMBOL_opt_fcall_expression_list = 119, /* opt_fcall_expression_list  */
+  YYSYMBOL_fcall_expression_list = 120,    /* fcall_expression_list  */
+  YYSYMBOL_fcall_exp = 121,                /* fcall_exp  */
+  YYSYMBOL_opt_fcall_exp = 122,            /* opt_fcall_exp  */
+  YYSYMBOL_exp = 123,                      /* exp  */
+  YYSYMBOL_assign_operator = 124,          /* assign_operator  */
+  YYSYMBOL_relop_or_less = 125,            /* relop_or_less  */
+  YYSYMBOL_a_relop = 126,                  /* a_relop  */
+  YYSYMBOL_common_exp = 127,               /* common_exp  */
+  YYSYMBOL_simp_exp = 128,                 /* simp_exp  */
+  YYSYMBOL_simp_exp_nc = 129,              /* simp_exp_nc  */
+  YYSYMBOL_non_post_simp_exp = 130,        /* non_post_simp_exp  */
+  YYSYMBOL_func_call = 131,                /* func_call  */
+  YYSYMBOL_direct_func_call = 132,         /* direct_func_call  */
+  YYSYMBOL_opt_variable = 133,             /* opt_variable  */
+  YYSYMBOL_delete_subscript_list = 134,    /* delete_subscript_list  */
+  YYSYMBOL_delete_subscript = 135,         /* delete_subscript  */
+  YYSYMBOL_delete_exp_list = 136,          /* delete_exp_list  */
+  YYSYMBOL_bracketed_exp_list = 137,       /* bracketed_exp_list  */
+  YYSYMBOL_subscript = 138,                /* subscript  */
+  YYSYMBOL_subscript_list = 139,           /* subscript_list  */
+  YYSYMBOL_simple_variable = 140,          /* simple_variable  */
+  YYSYMBOL_variable = 141,                 /* variable  */
+  YYSYMBOL_opt_incdec = 142,               /* opt_incdec  */
+  YYSYMBOL_l_brace = 143,                  /* l_brace  */
+  YYSYMBOL_r_brace = 144,                  /* r_brace  */
+  YYSYMBOL_r_paren = 145,                  /* r_paren  */
+  YYSYMBOL_opt_semi = 146,                 /* opt_semi  */
+  YYSYMBOL_semi = 147,                     /* semi  */
+  YYSYMBOL_colon = 148,                    /* colon  */
+  YYSYMBOL_comma = 149                     /* comma  */
 };
 typedef enum yysymbol_kind_t yysymbol_kind_t;
 
@@ -886,19 +891,19 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  2
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1200
+#define YYLAST   1198
 
 /* YYNTOKENS -- Number of terminals.  */
-#define YYNTOKENS  77
+#define YYNTOKENS  78
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  72
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  209
+#define YYNRULES  210
 /* YYNSTATES -- Number of states.  */
-#define YYNSTATES  356
+#define YYNSTATES  359
 
 /* YYMAXUTOK -- Last valid token kind.  */
-#define YYMAXUTOK   310
+#define YYMAXUTOK   311
 
 
 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
@@ -915,16 +920,16 @@ static const yytype_int8 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,    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,    66,     2,     2,    69,    65,     2,     2,
+      70,    71,    63,    61,    58,    62,     2,    64,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,    57,    77,
+      59,     2,    60,    56,    72,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
-       2,    72,     2,    73,    67,     2,     2,     2,     2,     2,
+       2,    73,     2,    74,    68,     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,    74,     2,    75,     2,     2,     2,     2,
+       2,     2,     2,    75,     2,    76,     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,
@@ -943,34 +948,35 @@ static const yytype_int8 yytranslate[] =
       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,    54,
-      66
+      55,    67
 };
 
 #if YYDEBUG
 /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   235,   235,   236,   241,   251,   255,   267,   275,   289,
-     300,   310,   320,   346,   356,   358,   363,   373,   375,   380,
-     382,   384,   390,   394,   399,   429,   441,   453,   459,   468,
-     486,   487,   498,   504,   512,   513,   517,   517,   551,   550,
-     584,   599,   601,   606,   607,   627,   632,   633,   637,   648,
-     653,   660,   768,   819,   869,   995,  1017,  1038,  1048,  1058,
-    1068,  1079,  1092,  1110,  1109,  1126,  1144,  1144,  1246,  1246,
-    1279,  1309,  1317,  1318,  1324,  1325,  1332,  1337,  1350,  1365,
-    1367,  1375,  1382,  1384,  1392,  1401,  1403,  1412,  1413,  1421,
-    1426,  1426,  1439,  1446,  1459,  1463,  1485,  1486,  1492,  1493,
-    1502,  1503,  1508,  1513,  1530,  1532,  1534,  1541,  1542,  1548,
-    1549,  1554,  1556,  1563,  1565,  1573,  1578,  1589,  1590,  1595,
-    1597,  1604,  1606,  1614,  1619,  1629,  1630,  1635,  1636,  1641,
-    1648,  1652,  1654,  1656,  1669,  1686,  1696,  1703,  1705,  1710,
-    1712,  1714,  1722,  1724,  1729,  1731,  1736,  1738,  1740,  1797,
-    1799,  1801,  1803,  1805,  1807,  1809,  1811,  1825,  1830,  1835,
-    1861,  1867,  1869,  1871,  1873,  1875,  1877,  1882,  1886,  1918,
-    1926,  1932,  1938,  1951,  1952,  1953,  1958,  1963,  1967,  1971,
-    1986,  2007,  2012,  2049,  2086,  2087,  2093,  2094,  2099,  2101,
-    2108,  2125,  2142,  2144,  2151,  2156,  2162,  2174,  2186,  2195,
-    2199,  2204,  2208,  2212,  2216,  2221,  2222,  2226,  2230,  2234
+       0,   237,   237,   238,   243,   253,   257,   269,   277,   291,
+     302,   312,   322,   332,   358,   368,   370,   375,   385,   387,
+     392,   394,   396,   402,   406,   411,   441,   453,   465,   471,
+     480,   498,   499,   510,   516,   524,   525,   529,   529,   563,
+     562,   596,   611,   613,   618,   619,   639,   644,   645,   649,
+     660,   665,   672,   780,   831,   881,  1007,  1029,  1050,  1060,
+    1070,  1080,  1091,  1104,  1122,  1121,  1138,  1156,  1156,  1258,
+    1258,  1291,  1321,  1329,  1330,  1336,  1337,  1344,  1349,  1362,
+    1377,  1379,  1387,  1394,  1396,  1404,  1413,  1415,  1424,  1425,
+    1433,  1438,  1438,  1451,  1458,  1471,  1475,  1497,  1498,  1504,
+    1505,  1514,  1515,  1520,  1525,  1542,  1544,  1546,  1553,  1554,
+    1560,  1561,  1566,  1568,  1575,  1577,  1585,  1590,  1601,  1602,
+    1607,  1609,  1616,  1618,  1626,  1631,  1641,  1642,  1647,  1648,
+    1653,  1660,  1664,  1666,  1668,  1681,  1698,  1708,  1715,  1717,
+    1722,  1724,  1726,  1734,  1736,  1741,  1743,  1748,  1750,  1752,
+    1809,  1811,  1813,  1815,  1817,  1819,  1821,  1823,  1837,  1842,
+    1847,  1873,  1879,  1881,  1883,  1885,  1887,  1889,  1894,  1898,
+    1930,  1938,  1944,  1950,  1963,  1964,  1965,  1970,  1975,  1979,
+    1983,  1998,  2019,  2024,  2061,  2098,  2099,  2105,  2106,  2111,
+    2113,  2120,  2137,  2154,  2156,  2163,  2168,  2174,  2186,  2198,
+    2207,  2211,  2216,  2220,  2224,  2228,  2233,  2234,  2238,  2242,
+    2246
 };
 #endif
 
@@ -996,10 +1002,10 @@ static const char *const yytname[] =
   "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", "LEX_NAMESPACE",
-  "NEWLINE", "SLASH_BEFORE_EQUAL", "'?'", "':'", "','", "'<'", "'>'",
-  "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "UNARY", "'^'", "'$'", "'('",
-  "')'", "'@'", "'['", "']'", "'{'", "'}'", "';'", "$accept", "program",
-  "rule", "source", "library", "namespace", "pattern", "action",
+  "LEX_NSINCLUDE", "NEWLINE", "SLASH_BEFORE_EQUAL", "'?'", "':'", "','",
+  "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'!'", "UNARY", "'^'",
+  "'$'", "'('", "')'", "'@'", "'['", "']'", "'{'", "'}'", "';'", "$accept",
+  "program", "rule", "source", "library", "namespace", "pattern", "action",
   "func_name", "lex_builtin", "function_prologue", "$@1", "regexp", "$@2",
   "typed_regexp", "a_slash", "statements", "statement_term", "statement",
   "non_compound_stmt", "$@3", "simple_stmt", "$@4", "$@5",
@@ -1023,12 +1029,12 @@ yysymbol_name (yysymbol_kind_t yysymbol)
 }
 #endif
 
-#define YYPACT_NINF (-276)
+#define YYPACT_NINF (-287)
 
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-119)
+#define YYTABLE_NINF (-120)
 
 #define yytable_value_is_error(Yyn) \
   ((Yyn) == YYTABLE_NINF)
@@ -1037,42 +1043,42 @@ yysymbol_name (yysymbol_kind_t yysymbol)
    STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-    -276,   315,  -276,  -276,   -45,   -41,  -276,  -276,  -276,  -276,
-     133,  -276,  -276,    13,    13,    13,   -13,    -7,  -276,  -276,
-    -276,  1046,  1046,  -276,  1046,  1074,   817,   172,  -276,   -23,
-     -10,  -276,  -276,    29,  1112,   973,   276,   310,  -276,  -276,
-    -276,  -276,   137,   741,   817,  -276,     1,  -276,  -276,  -276,
-    -276,  -276,    64,    84,  -276,    98,  -276,  -276,  -276,   741,
-     741,   173,   111,   117,   111,   111,  1046,   125,  -276,  -276,
-      15,  1016,    31,    65,   151,  -276,   141,  -276,  -276,  -276,
-      29,  -276,   141,  -276,   198,  -276,  -276,  1001,   203,  1046,
-    1046,  1046,   141,  -276,  -276,  -276,  1046,  1046,   175,   276,
-    1046,  1046,  1046,  1046,  1046,  1046,  1046,  1046,  1046,  1046,
-    1046,  1046,  -276,   209,  -276,  -276,   208,  1046,  -276,  -276,
-    -276,   142,    74,  -276,  1141,    73,  1141,  -276,  -276,  -276,
-    -276,  1046,  -276,   142,   142,  1016,  -276,  -276,  -276,  1046,
-    -276,   186,   845,  -276,  -276,     8,    90,  -276,    34,    90,
-    -276,    59,    90,    29,  -276,   541,  -276,  -276,  -276,    11,
-    -276,   287,   130,  1131,  -276,   139,  1141,    13,   123,   123,
-     111,   111,   111,   111,   123,   123,   111,   111,   111,   111,
-    -276,  -276,  1141,  -276,  1001,   769,  -276,    45,   276,  -276,
-    -276,  1141,   203,  -276,  1141,  -276,  -276,  -276,  -276,  -276,
-    -276,  -276,   174,  -276,    10,   179,   183,   141,   185,    90,
-      90,  -276,  -276,    90,  1046,    90,   141,  -276,  -276,    90,
-    -276,  -276,  1141,  -276,   182,   141,  1046,  -276,  -276,  -276,
-    -276,  -276,  -276,   142,    77,  -276,  1046,  1001,  -276,   251,
-    1046,  1046,   659,   894,  -276,  -276,  -276,    90,  1141,  -276,
-    -276,  -276,   589,   541,   141,  -276,  -276,  1141,   141,  -276,
-      46,  1016,  -276,    90,   -41,   189,  1016,  1016,   243,   -15,
-    -276,   182,  -276,   817,   263,  -276,   162,  -276,  -276,  -276,
-    -276,  -276,   141,  -276,  -276,    60,  -276,  -276,  -276,   141,
-     141,   211,   203,   141,    15,  -276,  -276,   659,  -276,  -276,
-     -10,   659,  1046,   142,   693,   186,  1046,   256,  -276,  -276,
-    1016,   141,  1089,   141,   973,   141,   260,   141,   659,   141,
-     928,   659,  -276,   340,   222,  -276,   212,  -276,  -276,   928,
-     142,  -276,  -276,  -276,   281,   282,  -276,  -276,   222,  -276,
-     141,  -276,   142,   141,  -276,  -276,   141,  -276,   141,   659,
-    -276,   389,   659,  -276,   465,  -276
+    -287,   317,  -287,  -287,   -46,   -39,  -287,  -287,  -287,  -287,
+     280,  -287,  -287,    44,    44,    44,    -7,     9,  -287,  -287,
+    -287,  1065,  1065,  -287,  1065,  1094,   827,   279,  -287,   -24,
+     -18,  -287,  -287,    22,  1035,   991,   305,   380,  -287,  -287,
+    -287,  -287,   346,   749,   827,  -287,    12,  -287,  -287,  -287,
+    -287,  -287,    62,    63,  -287,    84,  -287,  -287,  -287,   749,
+     749,   145,    87,     5,    87,    87,  1065,   114,  -287,  -287,
+      15,   871,    26,    60,    66,    26,  -287,   112,  -287,  -287,
+    -287,    22,  -287,   112,  -287,   164,  -287,  -287,  1020,   169,
+    1065,  1065,  1065,   112,  -287,  -287,  -287,  1065,  1065,   136,
+     305,  1065,  1065,  1065,  1065,  1065,  1065,  1065,  1065,  1065,
+    1065,  1065,  1065,  -287,   167,  -287,  -287,   163,  1065,  -287,
+    -287,  -287,   108,    94,  -287,  1138,     6,  1138,  -287,  -287,
+    -287,  -287,  1065,  -287,   108,   108,   871,  -287,  -287,  -287,
+    1065,  -287,   148,   856,  -287,  -287,    16,   -23,  -287,    61,
+     -23,  -287,    97,   -23,   -23,    22,  -287,   546,  -287,  -287,
+    -287,   190,  -287,   278,   250,  1132,  -287,   253,  1138,    44,
+     312,   312,    87,    87,    87,    87,   312,   312,    87,    87,
+      87,    87,  -287,  -287,  1138,  -287,  1020,   778,  -287,    43,
+     305,  -287,  -287,  1138,   169,  -287,  1138,  -287,  -287,  -287,
+    -287,  -287,  -287,  -287,  -287,   120,  -287,    14,   121,   123,
+     112,   125,   -23,   -23,  -287,  -287,   -23,  1065,   -23,   112,
+    -287,  -287,   -23,  -287,  -287,  1138,  -287,   119,   112,  1065,
+    -287,  -287,  -287,  -287,  -287,  -287,   108,   110,  -287,  1065,
+    1020,  -287,   193,  1065,  1065,   666,   901,  -287,  -287,  -287,
+     -23,  1138,  -287,  -287,  -287,   595,   546,   112,  -287,  -287,
+    1138,   112,  -287,    70,   871,  -287,   -23,   -39,   128,   871,
+     871,   174,   -13,  -287,   119,  -287,   827,   195,  -287,   134,
+    -287,  -287,  -287,  -287,  -287,   112,  -287,  -287,    99,  -287,
+    -287,  -287,   112,   112,   137,   169,   112,    15,  -287,  -287,
+     666,  -287,  -287,   -18,   666,  1065,   108,   700,   148,  1065,
+     189,  -287,  -287,   871,   112,  1109,   112,   991,   112,   201,
+     112,   666,   112,   946,   666,  -287,   342,   157,  -287,   139,
+    -287,  -287,   946,   108,  -287,  -287,  -287,   211,   214,  -287,
+    -287,   157,  -287,   112,  -287,   108,   112,  -287,  -287,   112,
+    -287,   112,   666,  -287,   392,   666,  -287,   469,  -287
 };
 
 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -1080,68 +1086,68 @@ static const yytype_int16 yypact[] =
    means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       2,     0,     1,     6,     0,   195,   177,   178,    25,    26,
-       0,    27,    28,   184,     0,     0,     0,   172,     5,    94,
-      42,     0,     0,    41,     0,     0,     0,     0,     3,     0,
-       0,   167,    38,     4,    23,   138,   146,   147,   149,   173,
-     181,   197,   174,     0,     0,   192,     0,   196,    31,    30,
-      34,    35,     0,     0,    32,    98,   185,   175,   176,     0,
-       0,     0,   180,   174,   179,   168,     0,   201,   174,   113,
-       0,   111,     0,     0,     0,   182,    96,   207,     7,     8,
-      46,    43,    96,     9,     0,    95,   142,     0,     0,     0,
-       0,     0,    96,   143,   145,   144,     0,     0,     0,   148,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   140,   139,   157,   158,     0,     0,   121,    40,
-     126,     0,     0,   119,   125,     0,   111,   194,   193,    33,
-      36,     0,   156,     0,     0,     0,   199,   200,   198,   114,
-     204,     0,     0,   169,    15,     0,     0,    18,     0,     0,
-      21,     0,     0,    97,   202,     0,    47,    39,   133,   134,
-     135,   131,   132,     0,   209,   136,    24,   184,   154,   155,
-     151,   152,   153,   150,   165,   166,   162,   163,   164,   161,
-     130,   141,   129,   183,   122,     0,   191,     0,    99,   170,
-     171,   115,     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,   205,    96,     0,   160,   123,   124,
-     120,   104,   102,     0,     0,   159,     0,   127,    68,     0,
-       0,     0,     0,    72,    58,    59,    60,     0,   108,    61,
-     203,    65,     0,     0,    96,   206,    48,   137,    96,   105,
-       0,     0,   128,     0,   186,     0,     0,     0,     0,   195,
-      73,     0,    62,     0,    89,    87,     0,    49,    29,    37,
-     106,   103,    96,    64,    69,     0,   188,   190,    70,    96,
-      96,     0,     0,    96,     0,    90,    67,     0,   187,   189,
-       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,   208,
-      96,    51,     0,    96,    81,    80,    96,    43,    96,     0,
-      43,     0,     0,    56,     0,    55
+       2,     0,     1,     6,     0,   196,   178,   179,    26,    27,
+       0,    28,    29,   185,     0,     0,     0,   173,     5,    95,
+      43,     0,     0,    42,     0,     0,     0,     0,     3,     0,
+       0,   168,    39,     4,    24,   139,   147,   148,   150,   174,
+     182,   198,   175,     0,     0,   193,     0,   197,    32,    31,
+      35,    36,     0,     0,    33,    99,   186,   176,   177,     0,
+       0,     0,   181,   175,   180,   169,     0,   202,   175,   114,
+       0,   112,     0,     0,     0,     0,   183,    97,   208,     7,
+       8,    47,    44,    97,     9,     0,    96,   143,     0,     0,
+       0,     0,     0,    97,   144,   146,   145,     0,     0,     0,
+     149,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   141,   140,   158,   159,     0,     0,   122,
+      41,   127,     0,     0,   120,   126,     0,   112,   195,   194,
+      34,    37,     0,   157,     0,     0,     0,   200,   201,   199,
+     115,   205,     0,     0,   170,    16,     0,     0,    19,     0,
+       0,    22,     0,     0,     0,    98,   203,     0,    48,    40,
+     134,   135,   136,   132,   133,     0,   210,   137,    25,   185,
+     155,   156,   152,   153,   154,   151,   166,   167,   163,   164,
+     165,   162,   131,   142,   130,   184,   123,     0,   192,     0,
+     100,   171,   172,   116,     0,   117,   113,    15,    10,    18,
+      12,    21,    13,    11,    46,     0,    64,     0,     0,     0,
+      97,     0,     0,     0,    86,    87,     0,   108,     0,    97,
+      45,    58,     0,    67,    51,    72,    44,   206,    97,     0,
+     161,   124,   125,   121,   105,   103,     0,     0,   160,     0,
+     128,    69,     0,     0,     0,     0,    73,    59,    60,    61,
+       0,   109,    62,   204,    66,     0,     0,    97,   207,    49,
+     138,    97,   106,     0,     0,   129,     0,   187,     0,     0,
+       0,     0,   196,    74,     0,    63,     0,    90,    88,     0,
+      50,    30,    38,   107,   104,    97,    65,    70,     0,   189,
+     191,    71,    97,    97,     0,     0,    97,     0,    91,    68,
+       0,   188,   190,     0,     0,     0,     0,     0,    89,     0,
+      93,    75,    53,     0,    97,     0,    97,    92,    97,     0,
+      97,     0,    97,    73,     0,    77,     0,     0,    76,     0,
+      54,    55,    73,     0,    94,    80,    83,     0,     0,    84,
+      85,     0,   209,    97,    52,     0,    97,    82,    81,    97,
+      44,    97,     0,    44,     0,     0,    57,     0,    56
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -276,  -276,  -276,  -276,  -276,  -276,  -276,   253,  -276,  -276,
-    -276,  -276,   -32,  -276,   -77,  -276,  -208,   -55,   -68,  -276,
-    -276,  -237,  -276,  -276,  -275,  -276,  -276,  -276,  -276,  -276,
-    -276,  -276,  -276,    47,   -48,  -276,  -276,  -276,  -276,  -276,
-     -43,   157,  -276,  -157,  -276,    -1,  -276,  -276,  -276,     0,
-      17,  -276,   268,  -276,     2,   138,  -276,  -276,    22,   -38,
-    -276,  -276,   -81,    -2,  -276,   -27,  -213,   -66,  -276,   -22,
-     -30,   -29
+    -287,  -287,  -287,   147,  -287,  -287,  -287,   194,  -287,  -287,
+    -287,  -287,   -92,  -287,   -74,  -287,  -216,   -72,  -168,  -287,
+    -287,  -240,  -287,  -287,  -286,  -287,  -287,  -287,  -287,  -287,
+    -287,  -287,  -287,     7,   -48,  -287,  -287,  -287,  -287,  -287,
+     -43,   104,  -287,    -4,  -287,    -1,  -287,  -287,  -287,   -68,
+      17,  -287,   228,  -287,    -6,    89,  -287,  -287,   -32,   -37,
+    -287,  -287,   -63,    -2,  -287,   -27,  -241,   -66,  -287,   -10,
+     -82,   -29
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int16 yydefgoto[] =
 {
-       0,     1,    28,   146,   149,   152,    29,    78,    53,    54,
-      30,   187,    31,    84,   120,    32,   155,    79,   217,   218,
-     237,   219,   252,   264,   271,   316,   325,   338,   220,   274,
-     296,   306,   221,   153,   154,   132,   233,   234,   247,   275,
-      70,   121,   122,   123,   263,   222,   117,    95,    96,    35,
-      36,    37,    38,    39,    40,    55,   284,   285,   286,    45,
-      46,    47,    41,    42,   138,   223,   224,   143,   254,    82,
-     340,   142
+       0,     1,    28,   147,   150,   153,    29,    79,    53,    54,
+      30,   189,    31,    85,   121,    32,   157,    80,   220,   221,
+     240,   222,   255,   267,   274,   319,   328,   341,   223,   277,
+     299,   309,   224,   155,   156,   133,   236,   237,   250,   278,
+      70,   122,   123,   124,   266,   225,   118,    96,    97,    35,
+      36,    37,    38,    39,    40,    55,   287,   288,   289,    45,
+      46,    47,    41,    42,   139,   226,   227,   144,   257,    83,
+     343,   143
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
@@ -1149,346 +1155,346 @@ static const yytype_int16 yydefgoto[] =
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
 static const yytype_int16 yytable[] =
 {
-      34,   125,    81,    81,   141,    97,   270,   160,   128,   195,
-     158,    56,    57,    58,   238,   253,   139,     5,   127,    63,
-      63,    86,    63,    68,    43,    71,   292,   228,   230,    75,
-      19,    44,   144,    63,   156,   197,   180,   145,    62,    64,
-     277,    65,   124,   126,   164,   330,   231,   280,    33,   232,
-     281,    76,    99,    77,   342,   183,    59,    44,   124,   124,
-     199,   -13,    60,    75,    76,   135,   147,   189,   190,    93,
-      94,   148,    92,    44,   139,   184,    80,   298,   259,   239,
-     262,    25,    85,   270,   -13,   140,   159,   -16,   161,   162,
-     163,   196,   270,   185,   198,   165,   166,   200,    63,    63,
+      34,   126,    82,    82,   142,    98,   273,   140,    33,   129,
+     256,    56,    57,    58,   160,   280,   140,   197,   241,    63,
+      63,    76,    63,    68,    43,    71,   162,   145,   295,   128,
+      19,    19,   146,    63,    44,   158,    81,   333,    62,    64,
+     182,    65,   125,   127,   234,   166,   345,   235,     5,   115,
+     116,    77,   100,    78,    78,    76,   185,    77,   125,   125,
+      44,   148,   199,    59,    93,   136,   149,   151,   191,   192,
+     -14,   283,   152,    93,   284,   198,    86,   271,   200,    60,
+     188,   202,   203,   273,   242,    44,   141,   161,   344,   163,
+     164,   165,   273,   -14,   187,   186,   167,   168,   201,    63,
       63,    63,    63,    63,    63,    63,    63,    63,    63,    63,
-     -16,   235,   -19,   341,   129,  -100,   182,   168,   169,   170,
-     171,   172,   173,   174,   175,   176,   177,   178,   179,    63,
-      92,    92,    44,   225,    92,   -19,    48,    49,   191,   351,
-      86,   194,   354,    19,  -118,    87,   186,  -101,   188,  -119,
-     112,   113,   150,   130,   244,   245,   131,   151,   246,   242,
-     249,   114,   115,   139,   251,    56,    77,   258,   250,   136,
-     137,    88,    89,  -110,   268,     4,     4,   256,   105,    50,
-      51,   114,   115,   124,   124,   102,   103,   104,    93,    94,
-     105,   116,   272,    80,    19,   282,    80,  -119,  -119,    80,
-     289,   290,   255,   157,    52,   260,   278,     5,   283,   276,
-     279,   303,   140,   248,   167,  -110,   133,   134,   119,    92,
-     225,    72,   181,    73,    74,   257,   287,   192,   305,   307,
-     294,   225,  -110,   309,   297,   261,   124,   311,  -110,   266,
-     267,   300,   301,   236,   317,   304,   337,   287,   240,   293,
-     328,   126,   241,   331,   243,   265,    80,    80,    77,   288,
-      80,   322,    80,   318,   343,   320,    80,   321,   326,   327,
-     291,   329,    71,   308,   295,   225,   348,   315,   339,   225,
-     302,   353,   313,    83,   355,   323,   324,   216,   344,   345,
-     319,   336,   347,    67,    80,   349,   225,    86,   350,   225,
-     352,   310,    87,   312,    63,   227,   314,   299,   346,     0,
-      80,     0,    63,    19,     0,     2,     3,     0,     4,     5,
-       0,     0,     6,     7,     0,     0,     0,   225,    88,   225,
-     225,    99,   225,     8,     9,   -96,   100,   101,   102,   103,
-     104,     0,     0,   105,     0,    93,    94,   332,   333,   119,
-       0,    10,    11,    12,    13,     0,     0,     0,     0,    14,
-      15,    16,    17,    18,     0,     0,     0,     0,    19,    20,
-     106,   107,   108,   109,   110,    21,    22,   111,    23,     0,
-      24,     0,     0,    25,    26,     0,    27,     0,     0,   -22,
-     201,   -22,     4,     5,    20,     0,     6,     7,     0,     0,
-     334,   335,     0,    23,     0,     0,     0,     0,     0,   202,
-       0,   203,   204,   205,   -78,   -78,   206,   207,   208,   209,
-     210,   211,   212,   213,   214,     0,     0,     0,    13,   215,
+      63,   262,   130,    25,  -101,   -17,   301,   184,   170,   171,
+     172,   173,   174,   175,   176,   177,   178,   179,   180,   181,
+      63,   238,   310,   131,   354,   140,   312,   357,   -17,   193,
+     247,   248,   196,   132,   249,  -111,   252,   228,     4,   190,
+     254,   -20,    93,   331,    81,   106,   334,    81,   137,   138,
+      81,    81,   245,   134,   135,  -119,    19,    56,    93,   159,
+     261,   253,    44,     5,   -20,   169,   120,   183,   275,   141,
+     259,  -102,   231,   233,   356,   125,   125,   358,  -111,   194,
+     239,   243,    93,   244,   286,   246,    78,   268,   285,   291,
+      87,   294,   325,   292,   293,  -111,   298,   305,   263,   281,
+     318,  -111,   279,   282,   342,   219,   251,   258,   347,    81,
+      81,   348,   154,    81,    84,    81,   326,   327,   260,    81,
+     290,   308,   306,   297,   339,   228,   265,   300,   264,   125,
+     314,   317,   269,   270,   303,   304,   228,   320,   307,    94,
+      95,   290,   340,    67,   127,    19,   302,    81,   230,   349,
+      87,     0,     0,  -120,   296,    88,   321,   346,   323,     0,
+     324,   329,   330,    81,   332,    71,   311,   -97,     0,   351,
+       0,     0,     4,    48,    49,     0,     0,     0,    87,     0,
+     228,    89,    90,    88,   228,   350,     0,   316,   352,     0,
+       0,   353,     0,   355,   313,   322,   315,    63,     0,    94,
+      95,   228,  -120,  -120,   228,    63,     0,     2,     3,    89,
+       4,     5,     0,     0,     6,     7,    50,    51,    72,     0,
+      73,    74,    75,     0,   100,     8,     9,    94,    95,     0,
+       0,     0,   228,     0,   228,   228,     0,   228,     0,   335,
+     336,   120,    52,    10,    11,    12,    13,     0,     0,   113,
+     114,    14,    15,    16,    17,    18,   101,   102,   103,   104,
+     105,    19,    20,   106,     0,   103,   104,   105,    21,    22,
+     106,    23,     0,    24,     0,     0,    25,    26,     0,    27,
+     115,   116,   -23,   204,   -23,     4,     5,    20,     0,     6,
+       7,   117,     0,   337,   338,     0,    23,     0,     0,     0,
+       0,     0,   205,     0,   206,   207,   208,   -79,   -79,   209,
+     210,   211,   212,   213,   214,   215,   216,   217,     0,     0,
+       0,    13,   218,     0,     0,     0,    14,    15,    16,    17,
+       0,   107,   108,   109,   110,   111,   -79,    20,   112,     0,
+       0,     0,     0,    21,    22,     0,    23,     0,    24,     0,
+       0,    25,    26,     0,    61,     0,     0,    77,   -79,    78,
+     204,     0,     4,     5,     0,     0,     6,     7,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,   205,
+       0,   206,   207,   208,   -78,   -78,   209,   210,   211,   212,
+     213,   214,   215,   216,   217,     0,     0,     0,    13,   218,
        0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
-       0,     0,   -78,    20,     0,     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,    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,   -78,    20,     0,     0,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,     0,    25,    26,
+       0,    61,     0,     0,    77,   -78,    78,   204,     0,     4,
+       5,     0,     0,     6,     7,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   205,     0,   206,   207,
+     208,     0,     0,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,     0,     0,     0,    13,   218,     0,     0,     0,
+      14,    15,    16,    17,     0,     0,    69,     0,     4,     5,
+       0,    20,     6,     7,     0,     0,  -110,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,     0,
+       0,    77,   219,    78,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,    13,     0,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,     0,  -110,
+      20,     0,     0,     0,     0,     0,    21,    22,     0,    23,
+       0,    24,     0,     0,    25,   276,  -110,    61,     0,     4,
+       5,     0,  -110,     6,     7,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,   205,     0,   206,   207,
+     208,     0,     0,   209,   210,   211,   212,   213,   214,   215,
+     216,   217,     0,     4,     5,    13,   218,     6,     7,     0,
+      14,    15,    16,    17,     0,     0,     0,     0,     0,     0,
+       0,    20,     0,     0,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,    13,
+       0,    77,     0,    78,    14,    15,    16,    17,     0,     0,
+     119,     0,     4,     5,     0,    20,     6,     7,   120,     0,
+       0,    21,    22,     0,    23,     0,    24,     0,     0,    25,
+      26,     0,    61,     0,     0,     0,     0,    78,     0,   232,
+       0,     4,     5,     0,     0,     6,     7,   120,    13,     0,
        0,     0,     0,    14,    15,    16,    17,     0,     0,     0,
-       0,     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,   118,     0,     4,     5,     0,    20,     6,     7,
-     119,     0,     0,    21,    22,     0,    23,     0,    24,     0,
-       0,    25,    26,     0,    61,     0,     0,     0,     0,    77,
-     229,     0,     4,     5,     0,     0,     6,     7,   119,     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,    13,    25,
-      26,  -117,    61,    14,    15,    16,    17,     0,    69,     0,
+       0,     0,     0,     0,    20,     0,     0,     0,     0,     0,
+      21,    22,     0,    23,     0,    24,     0,    13,    25,    26,
+    -118,    61,    14,    15,    16,    17,     0,     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,
+      61,     0,     0,     0,     0,     0,     0,   195,     0,     4,
+       5,     0,     0,     6,     7,     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,    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,    98,     0,     0,    21,    22,
-       0,    23,     0,    24,     0,     0,    25,    26,     0,    61,
-       0,     0,     0,     0,     4,     5,     0,     0,     6,     7,
-     119,     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,    87,    20,     0,     0,     0,    88,     0,    21,    22,
+       0,    23,     0,    24,     0,    13,    25,    26,     0,    61,
+      14,    15,    16,    17,     4,   272,     0,     0,     6,     7,
+       0,    20,    89,    90,    91,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,   207,    25,    26,    92,    61,     0,
+      94,    95,     0,   214,   215,     0,     0,     0,     0,     0,
+      13,     0,   141,     0,     0,    14,    15,    16,    17,     4,
+       5,     0,     0,     6,     7,     0,    20,     0,     0,     0,
+       0,     0,    21,    22,     0,    23,     0,    24,     0,   207,
+      25,    26,     0,    61,     0,     0,     0,     0,   214,   215,
+       0,     0,     0,     0,     0,    13,     0,     0,     0,     0,
+      14,    15,    16,    17,     4,     5,     0,     0,     6,     7,
+       0,    20,     0,    99,     0,     0,     0,    21,    22,     0,
+      23,     0,    24,     0,     0,    25,    26,     0,    61,     0,
+       0,     0,     0,     4,     5,     0,     0,     6,     7,   120,
+      13,     0,     0,     0,     0,    14,    15,    16,    17,     0,
+       0,     0,     0,     0,     0,    87,    20,     0,     0,     0,
+      88,     0,    21,    22,     0,    23,     0,    24,     0,    13,
+      25,    26,     0,    61,    14,    15,    16,    17,     4,     5,
+       0,     0,     6,     7,     0,    20,    89,    90,    91,     0,
        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,   140,     0,     0,     0,
-      14,    15,    16,    17,     0,     0,     0,     0,     0,    86,
-      20,     0,     0,     0,    87,     0,    21,    22,     0,    23,
+      26,    92,    61,    93,    94,    95,     0,     4,     5,     0,
+       0,     6,     7,     0,    13,     0,     0,     0,     0,    14,
+      15,    16,    17,     0,     0,     0,     0,     0,     0,    87,
+      20,     0,     0,     0,    88,     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,
-      88,    89,    90,     0,    21,    22,     0,    23,     0,    24,
-       0,    86,    25,    66,    91,    61,    87,    93,    94,     0,
-       0,    86,     0,    88,    89,    90,    87,     0,     0,     0,
-       0,     0,     0,     0,     0,    77,     0,    91,     0,    92,
-      93,    94,    88,    89,    90,     0,     0,     0,     0,     0,
-       0,     0,    88,    89,    90,     0,    91,   226,     0,    93,
-      94,     0,     0,     0,     0,     0,    91,     0,     0,    93,
-      94
+      16,    17,    87,     0,     0,     0,     0,    88,    87,    20,
+      89,    90,    91,    88,     0,    21,    22,     0,    23,     0,
+      24,     0,     0,    25,    66,    92,    61,     0,    94,    95,
+       0,     0,     0,    89,    90,    91,     0,     0,     0,    89,
+      90,    91,     0,     0,     0,     0,    78,     0,    92,   229,
+       0,    94,    95,     0,    92,     0,     0,    94,    95
 };
 
 static const yytype_int16 yycheck[] =
 {
-       1,    44,    29,    30,    70,    34,   243,    88,    46,     1,
-      87,    13,    14,    15,     4,   223,     1,     4,    17,    21,
-      22,    10,    24,    25,    69,    26,    41,   184,   185,    27,
-      53,    72,     1,    35,    82,     1,   113,     6,    21,    22,
-     253,    24,    43,    44,    92,   320,     1,     1,     1,     4,
-       4,    74,    35,    76,   329,   121,    69,    72,    59,    60,
-       1,    53,    69,    61,    74,    66,     1,   133,   134,    58,
-      59,     6,    57,    72,     1,     1,    29,    17,     1,    69,
-     237,    68,    53,   320,    76,    70,    87,    53,    89,    90,
-      91,   146,   329,   122,   149,    96,    97,   152,   100,   101,
+       1,    44,    29,    30,    70,    34,   246,     1,     1,    46,
+     226,    13,    14,    15,    88,   256,     1,     1,     4,    21,
+      22,    27,    24,    25,    70,    26,    89,     1,    41,    17,
+      54,    54,     6,    35,    73,    83,    29,   323,    21,    22,
+     114,    24,    43,    44,     1,    93,   332,     4,     4,    44,
+      45,    75,    35,    77,    77,    61,   122,    75,    59,    60,
+      73,     1,     1,    70,    58,    66,     6,     1,   134,   135,
+      54,     1,     6,    58,     4,   147,    54,   245,   150,    70,
+      74,   153,   154,   323,    70,    73,    71,    88,   329,    90,
+      91,    92,   332,    77,   123,     1,    97,    98,     1,   101,
      102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
-      76,   192,    53,   326,    50,    70,   117,   100,   101,   102,
-     103,   104,   105,   106,   107,   108,   109,   110,   111,   131,
-      57,    57,    72,   155,    57,    76,     3,     4,   139,   347,
-      10,   142,   350,    53,    70,    15,    73,    70,   131,    10,
-      13,    14,     1,    69,   209,   210,    58,     6,   213,   207,
-     215,    44,    45,     1,   219,   167,    76,   233,   216,    44,
-      45,    41,    42,    11,   242,     3,     3,   225,    67,    46,
-      47,    44,    45,   184,   185,    62,    63,    64,    58,    59,
-      67,    54,   247,   146,    53,   261,   149,    58,    59,   152,
-     266,   267,   224,     5,    71,   234,   254,     4,   263,   252,
-     258,   292,    70,   214,    39,    53,    59,    60,     9,    57,
-     242,    49,    14,    51,    52,   226,   264,    41,   294,   297,
-     273,   253,    70,   301,   282,   236,   237,   303,    76,   240,
-     241,   289,   290,    69,   310,   293,   323,   285,    69,   271,
-     318,   252,    69,   321,    69,     4,   209,   210,    76,    70,
-     213,     1,   215,   311,   330,   313,   219,   315,   316,   317,
-      27,   319,   273,   300,    11,   297,   342,    21,    56,   301,
-      69,   349,   304,    30,   352,    25,    26,    75,     7,     7,
-     312,   323,   340,    25,   247,   343,   318,    10,   346,   321,
-     348,   302,    15,   304,   306,   167,   306,   285,   338,    -1,
-     263,    -1,   314,    53,    -1,     0,     1,    -1,     3,     4,
-      -1,    -1,     7,     8,    -1,    -1,    -1,   349,    41,   351,
-     352,   314,   354,    18,    19,    75,    60,    61,    62,    63,
-      64,    -1,    -1,    67,    -1,    58,    59,     7,     8,     9,
-      -1,    36,    37,    38,    39,    -1,    -1,    -1,    -1,    44,
-      45,    46,    47,    48,    -1,    -1,    -1,    -1,    53,    54,
-      60,    61,    62,    63,    64,    60,    61,    67,    63,    -1,
-      65,    -1,    -1,    68,    69,    -1,    71,    -1,    -1,    74,
-       1,    76,     3,     4,    54,    -1,     7,     8,    -1,    -1,
-      60,    61,    -1,    63,    -1,    -1,    -1,    -1,    -1,    20,
+     112,     1,    50,    69,    71,    54,    17,   118,   101,   102,
+     103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
+     132,   194,   300,    70,   350,     1,   304,   353,    77,   140,
+     212,   213,   143,    59,   216,    11,   218,   157,     3,   132,
+     222,    54,    58,   321,   147,    68,   324,   150,    44,    45,
+     153,   154,   210,    59,    60,    71,    54,   169,    58,     5,
+     236,   219,    73,     4,    77,    39,     9,    14,   250,    71,
+     228,    71,   186,   187,   352,   186,   187,   355,    54,    41,
+      70,    70,    58,    70,   266,    70,    77,     4,   264,    71,
+      10,    27,     1,   269,   270,    71,    11,    70,   237,   257,
+      21,    77,   255,   261,    57,    76,   217,   227,     7,   212,
+     213,     7,    75,   216,    30,   218,    25,    26,   229,   222,
+     267,   297,   295,   276,   326,   245,   240,   285,   239,   240,
+     306,   309,   243,   244,   292,   293,   256,   313,   296,    59,
+      60,   288,   326,    25,   255,    54,   288,   250,   169,   341,
+      10,    -1,    -1,    10,   274,    15,   314,   333,   316,    -1,
+     318,   319,   320,   266,   322,   276,   303,    76,    -1,   345,
+      -1,    -1,     3,     3,     4,    -1,    -1,    -1,    10,    -1,
+     300,    41,    42,    15,   304,   343,    -1,   307,   346,    -1,
+      -1,   349,    -1,   351,   305,   315,   307,   309,    -1,    59,
+      60,   321,    59,    60,   324,   317,    -1,     0,     1,    41,
+       3,     4,    -1,    -1,     7,     8,    46,    47,    49,    -1,
+      51,    52,    53,    -1,   317,    18,    19,    59,    60,    -1,
+      -1,    -1,   352,    -1,   354,   355,    -1,   357,    -1,     7,
+       8,     9,    72,    36,    37,    38,    39,    -1,    -1,    13,
+      14,    44,    45,    46,    47,    48,    61,    62,    63,    64,
+      65,    54,    55,    68,    -1,    63,    64,    65,    61,    62,
+      68,    64,    -1,    66,    -1,    -1,    69,    70,    -1,    72,
+      44,    45,    75,     1,    77,     3,     4,    55,    -1,     7,
+       8,    55,    -1,    61,    62,    -1,    64,    -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,    61,    62,    63,    64,    65,    54,    55,    68,    -1,
+      -1,    -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,
+      -1,    69,    70,    -1,    72,    -1,    -1,    75,    76,    77,
+       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,
-      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,    -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,    54,    55,    -1,    -1,    -1,    -1,    -1,
+      61,    62,    -1,    64,    -1,    66,    -1,    -1,    69,    70,
+      -1,    72,    -1,    -1,    75,    76,    77,     1,    -1,     3,
+       4,    -1,    -1,     7,     8,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    20,    -1,    22,    23,
+      24,    -1,    -1,    27,    28,    29,    30,    31,    32,    33,
+      34,    35,    -1,    -1,    -1,    39,    40,    -1,    -1,    -1,
+      44,    45,    46,    47,    -1,    -1,     1,    -1,     3,     4,
+      -1,    55,     7,     8,    -1,    -1,    11,    61,    62,    -1,
+      64,    -1,    66,    -1,    -1,    69,    70,    -1,    72,    -1,
+      -1,    75,    76,    77,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    54,
+      55,    -1,    -1,    -1,    -1,    -1,    61,    62,    -1,    64,
+      -1,    66,    -1,    -1,    69,    70,    71,    72,    -1,     3,
+       4,    -1,    77,     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,
+      -1,    55,    -1,    -1,    -1,    -1,    -1,    61,    62,    -1,
+      64,    -1,    66,    -1,    -1,    69,    70,    -1,    72,    39,
+      -1,    75,    -1,    77,    44,    45,    46,    47,    -1,    -1,
+       1,    -1,     3,     4,    -1,    55,     7,     8,     9,    -1,
+      -1,    61,    62,    -1,    64,    -1,    66,    -1,    -1,    69,
+      70,    -1,    72,    -1,    -1,    -1,    -1,    77,    -1,     1,
+      -1,     3,     4,    -1,    -1,     7,     8,     9,    39,    -1,
       -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,    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,    -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,    -1,    -1,    -1,    55,    -1,    -1,    -1,    -1,    -1,
+      61,    62,    -1,    64,    -1,    66,    -1,    39,    69,    70,
+      71,    72,    44,    45,    46,    47,    -1,    -1,     1,    -1,
+       3,     4,    -1,    55,     7,     8,    -1,    -1,    -1,    61,
+      62,    -1,    64,    -1,    66,    -1,    -1,    69,    70,    -1,
+      72,    -1,    -1,    -1,    -1,    -1,    -1,     1,    -1,     3,
+       4,    -1,    -1,     7,     8,    -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,    70,    -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,    -1,    68,    69,    -1,    71,    44,    45,
-      46,    47,    10,    -1,    -1,    -1,    -1,    15,    54,    -1,
-      41,    42,    43,    -1,    60,    61,    -1,    63,    -1,    65,
-      -1,    10,    68,    69,    55,    71,    15,    58,    59,    -1,
-      -1,    10,    -1,    41,    42,    43,    15,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    76,    -1,    55,    -1,    57,
-      58,    59,    41,    42,    43,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    41,    42,    43,    -1,    55,    56,    -1,    58,
-      59,    -1,    -1,    -1,    -1,    -1,    55,    -1,    -1,    58,
-      59
+      -1,    10,    55,    -1,    -1,    -1,    15,    -1,    61,    62,
+      -1,    64,    -1,    66,    -1,    39,    69,    70,    -1,    72,
+      44,    45,    46,    47,     3,     4,    -1,    -1,     7,     8,
+      -1,    55,    41,    42,    43,    -1,    -1,    61,    62,    -1,
+      64,    -1,    66,    -1,    23,    69,    70,    56,    72,    -1,
+      59,    60,    -1,    32,    33,    -1,    -1,    -1,    -1,    -1,
+      39,    -1,    71,    -1,    -1,    44,    45,    46,    47,     3,
+       4,    -1,    -1,     7,     8,    -1,    55,    -1,    -1,    -1,
+      -1,    -1,    61,    62,    -1,    64,    -1,    66,    -1,    23,
+      69,    70,    -1,    72,    -1,    -1,    -1,    -1,    32,    33,
+      -1,    -1,    -1,    -1,    -1,    39,    -1,    -1,    -1,    -1,
+      44,    45,    46,    47,     3,     4,    -1,    -1,     7,     8,
+      -1,    55,    -1,    12,    -1,    -1,    -1,    61,    62,    -1,
+      64,    -1,    66,    -1,    -1,    69,    70,    -1,    72,    -1,
+      -1,    -1,    -1,     3,     4,    -1,    -1,     7,     8,     9,
+      39,    -1,    -1,    -1,    -1,    44,    45,    46,    47,    -1,
+      -1,    -1,    -1,    -1,    -1,    10,    55,    -1,    -1,    -1,
+      15,    -1,    61,    62,    -1,    64,    -1,    66,    -1,    39,
+      69,    70,    -1,    72,    44,    45,    46,    47,     3,     4,
+      -1,    -1,     7,     8,    -1,    55,    41,    42,    43,    -1,
+      -1,    61,    62,    -1,    64,    -1,    66,    -1,    -1,    69,
+      70,    56,    72,    58,    59,    60,    -1,     3,     4,    -1,
+      -1,     7,     8,    -1,    39,    -1,    -1,    -1,    -1,    44,
+      45,    46,    47,    -1,    -1,    -1,    -1,    -1,    -1,    10,
+      55,    -1,    -1,    -1,    15,    -1,    61,    62,    -1,    64,
+      -1,    66,    -1,    -1,    69,    70,    -1,    72,    44,    45,
+      46,    47,    10,    -1,    -1,    -1,    -1,    15,    10,    55,
+      41,    42,    43,    15,    -1,    61,    62,    -1,    64,    -1,
+      66,    -1,    -1,    69,    70,    56,    72,    -1,    59,    60,
+      -1,    -1,    -1,    41,    42,    43,    -1,    -1,    -1,    41,
+      42,    43,    -1,    -1,    -1,    -1,    77,    -1,    56,    57,
+      -1,    59,    60,    -1,    56,    -1,    -1,    59,    60
 };
 
 /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    state STATE-NUM.  */
 static const yytype_uint8 yystos[] =
 {
-       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,   122,   126,   127,   128,   129,   130,
-     131,   139,   140,    69,    72,   136,   137,   138,     3,     4,
-      46,    47,    71,    85,    86,   132,   140,   140,   140,    69,
-      69,    71,   127,   140,   127,   127,    69,   129,   140,     1,
-     117,   122,    49,    51,    52,   131,    74,    76,    84,    94,
-     110,   142,   146,    84,    90,    53,    10,    15,    41,    42,
-      43,    55,    57,    58,    59,   124,   125,   148,    12,   127,
-      60,    61,    62,    63,    64,    67,    60,    61,    62,    63,
-      64,    67,    13,    14,    44,    45,    54,   123,     1,     9,
-      91,   118,   119,   120,   122,   117,   122,    17,   136,    50,
-      69,    58,   112,   118,   118,   122,    44,    45,   141,     1,
-      70,   144,   148,   144,     1,     6,    80,     1,     6,    81,
-       1,     6,    82,   110,   111,    93,   111,     5,    91,   122,
-     139,   122,   122,   122,   111,   122,   122,    39,   127,   127,
-     127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
-      91,    14,   122,   144,     1,   148,    73,    88,   127,   144,
-     144,   122,    41,     1,   122,     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,   122,   142,   143,   146,    56,   132,   120,     1,
-     120,     1,     4,   113,   114,   139,    69,    97,     4,    69,
-      69,    69,   111,    69,    94,    94,    94,   115,   122,    94,
-     111,    94,    99,    93,   145,   146,   111,   122,   144,     1,
-     148,   122,   120,   121,   100,     4,   122,   122,    95,     4,
-      98,   101,    94,    69,   106,   116,   117,   143,   111,   111,
-       1,     4,   144,    94,   133,   134,   135,   136,    70,   144,
-     144,    27,    41,   146,   117,    11,   107,   111,    17,   135,
-     111,   111,    69,   139,   111,   144,   108,    95,   142,    95,
-     122,   144,   122,   146,   126,    21,   102,   144,   111,   146,
-     111,   111,     1,    25,    26,   103,   111,   111,    95,   111,
-     101,    95,     7,     8,    60,    61,    89,    91,   104,    56,
-     147,   143,   101,   144,     7,     7,   147,   111,   144,   111,
-     111,    93,   111,    95,    93,    95
+       0,    79,     0,     1,     3,     4,     7,     8,    18,    19,
+      36,    37,    38,    39,    44,    45,    46,    47,    48,    54,
+      55,    61,    62,    64,    66,    69,    70,    72,    80,    84,
+      88,    90,    93,   111,   123,   127,   128,   129,   130,   131,
+     132,   140,   141,    70,    73,   137,   138,   139,     3,     4,
+      46,    47,    72,    86,    87,   133,   141,   141,   141,    70,
+      70,    72,   128,   141,   128,   128,    70,   130,   141,     1,
+     118,   123,    49,    51,    52,    53,   132,    75,    77,    85,
+      95,   111,   143,   147,    85,    91,    54,    10,    15,    41,
+      42,    43,    56,    58,    59,    60,   125,   126,   149,    12,
+     128,    61,    62,    63,    64,    65,    68,    61,    62,    63,
+      64,    65,    68,    13,    14,    44,    45,    55,   124,     1,
+       9,    92,   119,   120,   121,   123,   118,   123,    17,   137,
+      50,    70,    59,   113,   119,   119,   123,    44,    45,   142,
+       1,    71,   145,   149,   145,     1,     6,    81,     1,     6,
+      82,     1,     6,    83,    81,   111,   112,    94,   112,     5,
+      92,   123,   140,   123,   123,   123,   112,   123,   123,    39,
+     128,   128,   128,   128,   128,   128,   128,   128,   128,   128,
+     128,   128,    92,    14,   123,   145,     1,   149,    74,    89,
+     128,   145,   145,   123,    41,     1,   123,     1,    95,     1,
+      95,     1,    95,    95,     1,    20,    22,    23,    24,    27,
+      28,    29,    30,    31,    32,    33,    34,    35,    40,    76,
+      96,    97,    99,   106,   110,   123,   143,   144,   147,    57,
+     133,   121,     1,   121,     1,     4,   114,   115,   140,    70,
+      98,     4,    70,    70,    70,   112,    70,    95,    95,    95,
+     116,   123,    95,   112,    95,   100,    94,   146,   147,   112,
+     123,   145,     1,   149,   123,   121,   122,   101,     4,   123,
+     123,    96,     4,    99,   102,    95,    70,   107,   117,   118,
+     144,   112,   112,     1,     4,   145,    95,   134,   135,   136,
+     137,    71,   145,   145,    27,    41,   147,   118,    11,   108,
+     112,    17,   136,   112,   112,    70,   140,   112,   145,   109,
+      96,   143,    96,   123,   145,   123,   147,   127,    21,   103,
+     145,   112,   147,   112,   112,     1,    25,    26,   104,   112,
+     112,    96,   112,   102,    96,     7,     8,    61,    62,    90,
+      92,   105,    57,   148,   144,   102,   145,     7,     7,   148,
+     112,   145,   112,   112,    94,   112,    96,    94,    96
 };
 
 /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
 static const yytype_uint8 yyr1[] =
 {
-       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,   122,
-     122,   122,   122,   122,   122,   122,   122,   122,   122,   123,
-     123,   123,   124,   124,   125,   125,   126,   126,   126,   127,
-     127,   127,   127,   127,   127,   127,   127,   127,   127,   127,
-     128,   128,   128,   128,   128,   128,   128,   129,   129,   129,
-     129,   129,   129,   129,   129,   129,   129,   129,   129,   129,
-     129,   130,   130,   131,   132,   132,   133,   133,   134,   134,
-     135,   136,   137,   137,   138,   139,   139,   140,   140,   141,
-     141,   141,   142,   143,   144,   145,   145,   146,   147,   148
+       0,    78,    79,    79,    79,    79,    79,    80,    80,    80,
+      80,    80,    80,    80,    81,    81,    81,    82,    82,    82,
+      83,    83,    83,    84,    84,    84,    84,    84,    84,    84,
+      85,    86,    86,    86,    86,    87,    87,    89,    88,    91,
+      90,    92,    93,    93,    94,    94,    94,    95,    95,    96,
+      96,    96,    96,    96,    96,    96,    96,    96,    96,    97,
+      97,    97,    97,    97,    98,    97,    97,   100,    99,   101,
+      99,    99,    99,   102,   102,   103,   103,   103,   104,   104,
+     105,   105,   105,   105,   105,   105,   106,   106,   107,   107,
+     108,   109,   108,   110,   110,   111,   111,   112,   112,   113,
+     113,   114,   114,   115,   115,   115,   115,   115,   116,   116,
+     117,   117,   118,   118,   118,   118,   118,   118,   119,   119,
+     120,   120,   120,   120,   120,   120,   121,   121,   122,   122,
+     123,   123,   123,   123,   123,   123,   123,   123,   123,   123,
+     124,   124,   124,   125,   125,   126,   126,   127,   127,   127,
+     128,   128,   128,   128,   128,   128,   128,   128,   128,   128,
+     128,   129,   129,   129,   129,   129,   129,   129,   130,   130,
+     130,   130,   130,   130,   130,   130,   130,   130,   130,   130,
+     130,   130,   131,   131,   132,   133,   133,   134,   134,   135,
+     135,   136,   137,   138,   138,   139,   140,   140,   141,   141,
+     142,   142,   142,   143,   144,   145,   146,   146,   147,   148,
+     149
 };
 
 /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule 
RULE-NUM.  */
 static const yytype_int8 yyr2[] =
 {
        0,     2,     0,     2,     2,     2,     2,     2,     2,     2,
-       4,     4,     4,     1,     2,     1,     1,     2,     1,     1,
-       2,     1,     0,     1,     3,     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,     0,     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,     4,     1,     2,     1,     1,     2,     1,
+       1,     2,     1,     0,     1,     3,     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,     0,     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
 };
 
 
@@ -1952,22 +1958,22 @@ yyreduce:
   switch (yyn)
     {
   case 2: /* program: %empty  */
-#line 235 "awkgram.y"
+#line 237 "awkgram.y"
           { yyval = NULL; }
-#line 1958 "awkgram.c"
+#line 1964 "awkgram.c"
     break;
 
   case 3: /* program: program rule  */
-#line 237 "awkgram.y"
+#line 239 "awkgram.y"
           {
                rule = 0;
                yyerrok;
          }
-#line 1967 "awkgram.c"
+#line 1973 "awkgram.c"
     break;
 
   case 4: /* program: program nls  */
-#line 242 "awkgram.y"
+#line 244 "awkgram.y"
           {
                if (yyvsp[0] != NULL) {
                        if (yyvsp[-1] == NULL)
@@ -1977,19 +1983,19 @@ yyreduce:
                }
                yyval = yyvsp[-1];
          }
-#line 1981 "awkgram.c"
+#line 1987 "awkgram.c"
     break;
 
   case 5: /* program: program LEX_EOF  */
-#line 252 "awkgram.y"
+#line 254 "awkgram.y"
           {
                next_sourcefile();
          }
-#line 1989 "awkgram.c"
+#line 1995 "awkgram.c"
     break;
 
   case 6: /* program: program error  */
-#line 256 "awkgram.y"
+#line 258 "awkgram.y"
           {
                rule = 0;
                /*
@@ -1998,11 +2004,11 @@ yyreduce:
                 */
                /* yyerrok; */
          }
-#line 2002 "awkgram.c"
+#line 2008 "awkgram.c"
     break;
 
   case 7: /* rule: pattern action  */
-#line 268 "awkgram.y"
+#line 270 "awkgram.y"
           {
                (void) append_rule(yyvsp[-1], yyvsp[0]);
                if (pending_comment != NULL) {
@@ -2010,11 +2016,11 @@ yyreduce:
                        pending_comment = NULL;
                }
          }
-#line 2014 "awkgram.c"
+#line 2020 "awkgram.c"
     break;
 
   case 8: /* rule: pattern statement_term  */
-#line 276 "awkgram.y"
+#line 278 "awkgram.y"
           {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@ -2028,11 +2034,11 @@ yyreduce:
                        (void) append_rule(yyvsp[-1], NULL);
                }
          }
-#line 2032 "awkgram.c"
+#line 2038 "awkgram.c"
     break;
 
   case 9: /* rule: function_prologue action  */
-#line 290 "awkgram.y"
+#line 292 "awkgram.y"
           {
                in_function = false;
                (void) mk_function(yyvsp[-1], yyvsp[0]);
@@ -2043,11 +2049,11 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2047 "awkgram.c"
+#line 2053 "awkgram.c"
     break;
 
   case 10: /* rule: '@' LEX_INCLUDE source statement_term  */
-#line 301 "awkgram.y"
+#line 303 "awkgram.y"
           {
                want_source = false;
                at_seen--;
@@ -2057,11 +2063,11 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2061 "awkgram.c"
+#line 2067 "awkgram.c"
     break;
 
-  case 11: /* rule: '@' LEX_LOAD library statement_term  */
-#line 311 "awkgram.y"
+  case 11: /* rule: '@' LEX_NSINCLUDE source statement_term  */
+#line 313 "awkgram.y"
           {
                want_source = false;
                at_seen--;
@@ -2071,11 +2077,25 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2075 "awkgram.c"
+#line 2081 "awkgram.c"
     break;
 
-  case 12: /* rule: '@' LEX_NAMESPACE namespace statement_term  */
-#line 321 "awkgram.y"
+  case 12: /* rule: '@' LEX_LOAD library statement_term  */
+#line 323 "awkgram.y"
+          {
+               want_source = false;
+               at_seen--;
+               if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
+                       SRCFILE *s = (SRCFILE *) yyvsp[-1];
+                       s->comment = yyvsp[0];
+               }
+               yyerrok;
+         }
+#line 2095 "awkgram.c"
+    break;
+
+  case 13: /* rule: '@' LEX_NAMESPACE namespace statement_term  */
+#line 333 "awkgram.y"
           {
                /*
                 * 1/2022:
@@ -2098,11 +2118,11 @@ yyreduce:
 
                yyerrok;
          }
-#line 2102 "awkgram.c"
+#line 2122 "awkgram.c"
     break;
 
-  case 13: /* source: FILENAME  */
-#line 347 "awkgram.y"
+  case 14: /* source: FILENAME  */
+#line 359 "awkgram.y"
           {
                void *srcfile = NULL;
 
@@ -2112,23 +2132,23 @@ yyreduce:
                bcfree(yyvsp[0]);
                yyval = (INSTRUCTION *) srcfile;
          }
-#line 2116 "awkgram.c"
+#line 2136 "awkgram.c"
     break;
 
-  case 14: /* source: FILENAME error  */
-#line 357 "awkgram.y"
+  case 15: /* source: FILENAME error  */
+#line 369 "awkgram.y"
           { yyval = NULL; }
-#line 2122 "awkgram.c"
+#line 2142 "awkgram.c"
     break;
 
-  case 15: /* source: error  */
-#line 359 "awkgram.y"
+  case 16: /* source: error  */
+#line 371 "awkgram.y"
           { yyval = NULL; }
-#line 2128 "awkgram.c"
+#line 2148 "awkgram.c"
     break;
 
-  case 16: /* library: FILENAME  */
-#line 364 "awkgram.y"
+  case 17: /* library: FILENAME  */
+#line 376 "awkgram.y"
           {
                void *srcfile;
 
@@ -2138,58 +2158,58 @@ yyreduce:
                bcfree(yyvsp[0]);
                yyval = (INSTRUCTION *) srcfile;
          }
-#line 2142 "awkgram.c"
+#line 2162 "awkgram.c"
     break;
 
-  case 17: /* library: FILENAME error  */
-#line 374 "awkgram.y"
+  case 18: /* library: FILENAME error  */
+#line 386 "awkgram.y"
           { yyval = NULL; }
-#line 2148 "awkgram.c"
+#line 2168 "awkgram.c"
     break;
 
-  case 18: /* library: error  */
-#line 376 "awkgram.y"
+  case 19: /* library: error  */
+#line 388 "awkgram.y"
           { yyval = NULL; }
-#line 2154 "awkgram.c"
+#line 2174 "awkgram.c"
     break;
 
-  case 19: /* namespace: FILENAME  */
-#line 381 "awkgram.y"
+  case 20: /* namespace: FILENAME  */
+#line 393 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 2160 "awkgram.c"
+#line 2180 "awkgram.c"
     break;
 
-  case 20: /* namespace: FILENAME error  */
-#line 383 "awkgram.y"
+  case 21: /* namespace: FILENAME error  */
+#line 395 "awkgram.y"
           { yyval = NULL; }
-#line 2166 "awkgram.c"
+#line 2186 "awkgram.c"
     break;
 
-  case 21: /* namespace: error  */
-#line 385 "awkgram.y"
+  case 22: /* namespace: error  */
+#line 397 "awkgram.y"
           { yyval = NULL; }
-#line 2172 "awkgram.c"
+#line 2192 "awkgram.c"
     break;
 
-  case 22: /* pattern: %empty  */
-#line 390 "awkgram.y"
+  case 23: /* pattern: %empty  */
+#line 402 "awkgram.y"
           {
                rule = Rule;
                yyval = NULL;
          }
-#line 2181 "awkgram.c"
+#line 2201 "awkgram.c"
     break;
 
-  case 23: /* pattern: exp  */
-#line 395 "awkgram.y"
+  case 24: /* pattern: exp  */
+#line 407 "awkgram.y"
           {
                rule = Rule;
          }
-#line 2189 "awkgram.c"
+#line 2209 "awkgram.c"
     break;
 
-  case 24: /* pattern: exp comma exp  */
-#line 400 "awkgram.y"
+  case 25: /* pattern: exp comma exp  */
+#line 412 "awkgram.y"
           {
                INSTRUCTION *tp;
 
@@ -2219,11 +2239,11 @@ yyreduce:
                        yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), 
tp);
                rule = Rule;
          }
-#line 2223 "awkgram.c"
+#line 2243 "awkgram.c"
     break;
 
-  case 25: /* pattern: LEX_BEGIN  */
-#line 430 "awkgram.y"
+  case 26: /* pattern: LEX_BEGIN  */
+#line 442 "awkgram.y"
           {
                static int begin_seen = 0;
 
@@ -2235,11 +2255,11 @@ yyreduce:
                yyvsp[0]->source_file = source;
                yyval = yyvsp[0];
          }
-#line 2239 "awkgram.c"
+#line 2259 "awkgram.c"
     break;
 
-  case 26: /* pattern: LEX_END  */
-#line 442 "awkgram.y"
+  case 27: /* pattern: LEX_END  */
+#line 454 "awkgram.y"
           {
                static int end_seen = 0;
 
@@ -2251,31 +2271,31 @@ yyreduce:
                yyvsp[0]->source_file = source;
                yyval = yyvsp[0];
          }
-#line 2255 "awkgram.c"
+#line 2275 "awkgram.c"
     break;
 
-  case 27: /* pattern: LEX_BEGINFILE  */
-#line 454 "awkgram.y"
+  case 28: /* pattern: LEX_BEGINFILE  */
+#line 466 "awkgram.y"
           {
                yyvsp[0]->in_rule = rule = BEGINFILE;
                yyvsp[0]->source_file = source;
                yyval = yyvsp[0];
          }
-#line 2265 "awkgram.c"
+#line 2285 "awkgram.c"
     break;
 
-  case 28: /* pattern: LEX_ENDFILE  */
-#line 460 "awkgram.y"
+  case 29: /* pattern: LEX_ENDFILE  */
+#line 472 "awkgram.y"
           {
                yyvsp[0]->in_rule = rule = ENDFILE;
                yyvsp[0]->source_file = source;
                yyval = yyvsp[0];
          }
-#line 2275 "awkgram.c"
+#line 2295 "awkgram.c"
     break;
 
-  case 29: /* action: l_brace statements r_brace opt_semi opt_nls  */
-#line 469 "awkgram.y"
+  case 30: /* action: l_brace statements r_brace opt_semi opt_nls  */
+#line 481 "awkgram.y"
           {
                INSTRUCTION *ip = make_braced_statements(yyvsp[-4], yyvsp[-3], 
yyvsp[-2]);
 
@@ -2290,11 +2310,11 @@ yyreduce:
 
                yyval = ip;
          }
-#line 2294 "awkgram.c"
+#line 2314 "awkgram.c"
     break;
 
-  case 31: /* func_name: FUNC_CALL  */
-#line 488 "awkgram.y"
+  case 32: /* func_name: FUNC_CALL  */
+#line 500 "awkgram.y"
           {
                const char *name = yyvsp[0]->lextok;
                char *qname = qualify_name(name, strlen(name));
@@ -2305,36 +2325,36 @@ yyreduce:
                }
                yyval = yyvsp[0];
          }
-#line 2309 "awkgram.c"
+#line 2329 "awkgram.c"
     break;
 
-  case 32: /* func_name: lex_builtin  */
-#line 499 "awkgram.y"
+  case 33: /* func_name: lex_builtin  */
+#line 511 "awkgram.y"
           {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
                YYABORT;
          }
-#line 2319 "awkgram.c"
+#line 2339 "awkgram.c"
     break;
 
-  case 33: /* func_name: '@' LEX_EVAL  */
-#line 505 "awkgram.y"
+  case 34: /* func_name: '@' LEX_EVAL  */
+#line 517 "awkgram.y"
           {
                yyval = yyvsp[0];
                at_seen--;
          }
-#line 2328 "awkgram.c"
+#line 2348 "awkgram.c"
     break;
 
-  case 36: /* $@1: %empty  */
-#line 517 "awkgram.y"
+  case 37: /* $@1: %empty  */
+#line 529 "awkgram.y"
                                      { want_param_names = FUNC_HEADER; }
-#line 2334 "awkgram.c"
+#line 2354 "awkgram.c"
     break;
 
-  case 37: /* function_prologue: LEX_FUNCTION func_name '(' $@1 opt_param_list 
r_paren opt_nls  */
-#line 518 "awkgram.y"
+  case 38: /* function_prologue: LEX_FUNCTION func_name '(' $@1 opt_param_list 
r_paren opt_nls  */
+#line 530 "awkgram.y"
           {
                INSTRUCTION *func_comment = NULL;
                // Merge any comments found in the parameter list with those
@@ -2360,17 +2380,17 @@ yyreduce:
                yyval = yyvsp[-6];
                want_param_names = FUNC_BODY;
          }
-#line 2364 "awkgram.c"
+#line 2384 "awkgram.c"
     break;
 
-  case 38: /* $@2: %empty  */
-#line 551 "awkgram.y"
+  case 39: /* $@2: %empty  */
+#line 563 "awkgram.y"
                 { want_regexp = true; }
-#line 2370 "awkgram.c"
+#line 2390 "awkgram.c"
     break;
 
-  case 39: /* regexp: a_slash $@2 REGEXP  */
-#line 553 "awkgram.y"
+  case 40: /* regexp: a_slash $@2 REGEXP  */
+#line 565 "awkgram.y"
                 {
                  NODE *n, *exp;
                  char *re;
@@ -2399,11 +2419,11 @@ yyreduce:
                  yyval->opcode = Op_match_rec;
                  yyval->memory = n;
                }
-#line 2403 "awkgram.c"
+#line 2423 "awkgram.c"
     break;
 
-  case 40: /* typed_regexp: TYPED_REGEXP  */
-#line 585 "awkgram.y"
+  case 41: /* typed_regexp: TYPED_REGEXP  */
+#line 597 "awkgram.y"
                 {
                  char *re;
                  size_t len;
@@ -2416,23 +2436,23 @@ yyreduce:
                  yyval->opcode = Op_push_re;
                  yyval->memory = make_typed_regex(re, len);
                }
-#line 2420 "awkgram.c"
+#line 2440 "awkgram.c"
     break;
 
-  case 41: /* a_slash: '/'  */
-#line 600 "awkgram.y"
+  case 42: /* a_slash: '/'  */
+#line 612 "awkgram.y"
           { bcfree(yyvsp[0]); }
-#line 2426 "awkgram.c"
+#line 2446 "awkgram.c"
     break;
 
-  case 43: /* statements: %empty  */
-#line 606 "awkgram.y"
+  case 44: /* statements: %empty  */
+#line 618 "awkgram.y"
           { yyval = NULL; }
-#line 2432 "awkgram.c"
+#line 2452 "awkgram.c"
     break;
 
-  case 44: /* statements: statements statement  */
-#line 608 "awkgram.y"
+  case 45: /* statements: statements statement  */
+#line 620 "awkgram.y"
           {
                if (yyvsp[0] == NULL) {
                        yyval = yyvsp[-1];
@@ -2452,29 +2472,29 @@ yyreduce:
 
                yyerrok;
          }
-#line 2456 "awkgram.c"
+#line 2476 "awkgram.c"
     break;
 
-  case 45: /* statements: statements error  */
-#line 628 "awkgram.y"
+  case 46: /* statements: statements error  */
+#line 640 "awkgram.y"
           {    yyval = NULL; }
-#line 2462 "awkgram.c"
+#line 2482 "awkgram.c"
     break;
 
-  case 46: /* statement_term: nls  */
-#line 632 "awkgram.y"
+  case 47: /* statement_term: nls  */
+#line 644 "awkgram.y"
                         { yyval = yyvsp[0]; }
-#line 2468 "awkgram.c"
+#line 2488 "awkgram.c"
     break;
 
-  case 47: /* statement_term: semi opt_nls  */
-#line 633 "awkgram.y"
+  case 48: /* statement_term: semi opt_nls  */
+#line 645 "awkgram.y"
                         { yyval = yyvsp[0]; }
-#line 2474 "awkgram.c"
+#line 2494 "awkgram.c"
     break;
 
-  case 48: /* statement: semi opt_nls  */
-#line 638 "awkgram.y"
+  case 49: /* statement: semi opt_nls  */
+#line 650 "awkgram.y"
           {
                if (yyvsp[0] != NULL) {
                        INSTRUCTION *ip;
@@ -2485,31 +2505,31 @@ yyreduce:
                } else
                        yyval = NULL;
          }
-#line 2489 "awkgram.c"
+#line 2509 "awkgram.c"
     break;
 
-  case 49: /* statement: l_brace statements r_brace  */
-#line 649 "awkgram.y"
+  case 50: /* statement: l_brace statements r_brace  */
+#line 661 "awkgram.y"
           {
                trailing_comment = yyvsp[0];    // NULL or comment
                yyval = make_braced_statements(yyvsp[-2], yyvsp[-1], yyvsp[0]);
          }
-#line 2498 "awkgram.c"
+#line 2518 "awkgram.c"
     break;
 
-  case 50: /* statement: if_statement  */
-#line 654 "awkgram.y"
+  case 51: /* statement: if_statement  */
+#line 666 "awkgram.y"
           {
                if (do_pretty_print)
                        yyval = list_prepend(yyvsp[0], 
instruction(Op_exec_count));
                else
                        yyval = yyvsp[0];
          }
-#line 2509 "awkgram.c"
+#line 2529 "awkgram.c"
     break;
 
-  case 51: /* statement: LEX_SWITCH '(' exp r_paren opt_nls l_brace 
case_statements opt_nls r_brace  */
-#line 661 "awkgram.y"
+  case 52: /* statement: LEX_SWITCH '(' exp r_paren opt_nls l_brace 
case_statements opt_nls r_brace  */
+#line 673 "awkgram.y"
           {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@ -2617,11 +2637,11 @@ yyreduce:
                break_allowed--;
                fix_break_continue(ip, tbreak, NULL);
          }
-#line 2621 "awkgram.c"
+#line 2641 "awkgram.c"
     break;
 
-  case 52: /* statement: LEX_WHILE '(' exp r_paren opt_nls statement  */
-#line 769 "awkgram.y"
+  case 53: /* statement: LEX_WHILE '(' exp r_paren opt_nls statement  */
+#line 781 "awkgram.y"
           {
                /*
                 *    -----------------
@@ -2672,11 +2692,11 @@ yyreduce:
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
          }
-#line 2676 "awkgram.c"
+#line 2696 "awkgram.c"
     break;
 
-  case 53: /* statement: LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren 
opt_nls  */
-#line 820 "awkgram.y"
+  case 54: /* statement: LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren 
opt_nls  */
+#line 832 "awkgram.y"
           {
                /*
                 *    -----------------
@@ -2726,11 +2746,11 @@ yyreduce:
                /* else
                        $1 and $4 are NULLs */
          }
-#line 2730 "awkgram.c"
+#line 2750 "awkgram.c"
     break;
 
-  case 54: /* statement: LEX_FOR '(' NAME LEX_IN simple_variable r_paren 
opt_nls statement  */
-#line 870 "awkgram.y"
+  case 55: /* statement: LEX_FOR '(' NAME LEX_IN simple_variable r_paren 
opt_nls statement  */
+#line 882 "awkgram.y"
           {
                INSTRUCTION *ip;
                char *var_name = yyvsp[-5]->lextok;
@@ -2856,11 +2876,11 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2860 "awkgram.c"
+#line 2880 "awkgram.c"
     break;
 
-  case 55: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls exp semi 
opt_nls opt_simple_stmt r_paren opt_nls statement  */
-#line 996 "awkgram.y"
+  case 56: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls exp semi 
opt_nls opt_simple_stmt r_paren opt_nls statement  */
+#line 1008 "awkgram.y"
           {
                if (yyvsp[-7] != NULL) {
                        merge_comments(yyvsp[-7], NULL);
@@ -2882,11 +2902,11 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2886 "awkgram.c"
+#line 2906 "awkgram.c"
     break;
 
-  case 56: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls semi opt_nls 
opt_simple_stmt r_paren opt_nls statement  */
-#line 1018 "awkgram.y"
+  case 57: /* statement: LEX_FOR '(' opt_simple_stmt semi opt_nls semi opt_nls 
opt_simple_stmt r_paren opt_nls statement  */
+#line 1030 "awkgram.y"
           {
                if (yyvsp[-6] != NULL) {
                        merge_comments(yyvsp[-6], NULL);
@@ -2907,22 +2927,22 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2911 "awkgram.c"
+#line 2931 "awkgram.c"
     break;
 
-  case 57: /* statement: non_compound_stmt  */
-#line 1039 "awkgram.y"
+  case 58: /* statement: non_compound_stmt  */
+#line 1051 "awkgram.y"
           {
                if (do_pretty_print)
                        yyval = list_prepend(yyvsp[0], 
instruction(Op_exec_count));
                else
                        yyval = yyvsp[0];
          }
-#line 2922 "awkgram.c"
+#line 2942 "awkgram.c"
     break;
 
-  case 58: /* non_compound_stmt: LEX_BREAK statement_term  */
-#line 1049 "awkgram.y"
+  case 59: /* non_compound_stmt: LEX_BREAK statement_term  */
+#line 1061 "awkgram.y"
           {
                if (! break_allowed)
                        error_ln(yyvsp[-1]->source_line,
@@ -2932,11 +2952,11 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 2936 "awkgram.c"
+#line 2956 "awkgram.c"
     break;
 
-  case 59: /* non_compound_stmt: LEX_CONTINUE statement_term  */
-#line 1059 "awkgram.y"
+  case 60: /* non_compound_stmt: LEX_CONTINUE statement_term  */
+#line 1071 "awkgram.y"
           {
                if (! continue_allowed)
                        error_ln(yyvsp[-1]->source_line,
@@ -2946,11 +2966,11 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 2950 "awkgram.c"
+#line 2970 "awkgram.c"
     break;
 
-  case 60: /* non_compound_stmt: LEX_NEXT statement_term  */
-#line 1069 "awkgram.y"
+  case 61: /* non_compound_stmt: LEX_NEXT statement_term  */
+#line 1081 "awkgram.y"
           {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2961,11 +2981,11 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 2965 "awkgram.c"
+#line 2985 "awkgram.c"
     break;
 
-  case 61: /* non_compound_stmt: LEX_NEXTFILE statement_term  */
-#line 1080 "awkgram.y"
+  case 62: /* non_compound_stmt: LEX_NEXTFILE statement_term  */
+#line 1092 "awkgram.y"
           {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2978,11 +2998,11 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 2982 "awkgram.c"
+#line 3002 "awkgram.c"
     break;
 
-  case 62: /* non_compound_stmt: LEX_EXIT opt_exp statement_term  */
-#line 1093 "awkgram.y"
+  case 63: /* non_compound_stmt: LEX_EXIT opt_exp statement_term  */
+#line 1105 "awkgram.y"
           {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time.
@@ -2999,20 +3019,20 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 3003 "awkgram.c"
+#line 3023 "awkgram.c"
     break;
 
-  case 63: /* $@3: %empty  */
-#line 1110 "awkgram.y"
+  case 64: /* $@3: %empty  */
+#line 1122 "awkgram.y"
           {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
-#line 3012 "awkgram.c"
+#line 3032 "awkgram.c"
     break;
 
-  case 64: /* non_compound_stmt: LEX_RETURN $@3 opt_fcall_exp statement_term  
*/
-#line 1113 "awkgram.y"
+  case 65: /* non_compound_stmt: LEX_RETURN $@3 opt_fcall_exp statement_term  
*/
+#line 1125 "awkgram.y"
                                          {
                if (called_from_eval)
                        yyvsp[-3]->opcode = Op_K_return_from_eval;
@@ -3026,28 +3046,28 @@ regular_loop:
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyval, yyvsp[0]);
          }
-#line 3030 "awkgram.c"
+#line 3050 "awkgram.c"
     break;
 
-  case 65: /* non_compound_stmt: simple_stmt statement_term  */
-#line 1127 "awkgram.y"
+  case 66: /* non_compound_stmt: simple_stmt statement_term  */
+#line 1139 "awkgram.y"
           {
                if (yyvsp[0] != NULL)
                        yyval = list_append(yyvsp[-1], yyvsp[0]);
                else
                        yyval = yyvsp[-1];
          }
-#line 3041 "awkgram.c"
+#line 3061 "awkgram.c"
     break;
 
-  case 66: /* $@4: %empty  */
-#line 1144 "awkgram.y"
+  case 67: /* $@4: %empty  */
+#line 1156 "awkgram.y"
                 { in_print = true; in_parens = 0; }
-#line 3047 "awkgram.c"
+#line 3067 "awkgram.c"
     break;
 
-  case 67: /* simple_stmt: print $@4 print_expression_list output_redir  */
-#line 1145 "awkgram.y"
+  case 68: /* simple_stmt: print $@4 print_expression_list output_redir  */
+#line 1157 "awkgram.y"
           {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@ -3148,17 +3168,17 @@ regular_print:
                        }
                }
          }
-#line 3152 "awkgram.c"
+#line 3172 "awkgram.c"
     break;
 
-  case 68: /* $@5: %empty  */
-#line 1246 "awkgram.y"
+  case 69: /* $@5: %empty  */
+#line 1258 "awkgram.y"
                           { sub_counter = 0; }
-#line 3158 "awkgram.c"
+#line 3178 "awkgram.c"
     break;
 
-  case 69: /* simple_stmt: LEX_DELETE NAME $@5 delete_subscript_list  */
-#line 1247 "awkgram.y"
+  case 70: /* simple_stmt: LEX_DELETE NAME $@5 delete_subscript_list  */
+#line 1259 "awkgram.y"
           {
                char *arr = yyvsp[-2]->lextok;
 
@@ -3191,11 +3211,11 @@ regular_print:
                        yyval = list_append(list_append(yyvsp[0], yyvsp[-2]), 
yyvsp[-3]);
                }
          }
-#line 3195 "awkgram.c"
+#line 3215 "awkgram.c"
     break;
 
-  case 70: /* simple_stmt: LEX_DELETE '(' NAME ')'  */
-#line 1284 "awkgram.y"
+  case 71: /* simple_stmt: LEX_DELETE '(' NAME ')'  */
+#line 1296 "awkgram.y"
           {
                static bool warned = false;
                char *arr = yyvsp[-1]->lextok;
@@ -3221,54 +3241,54 @@ regular_print:
                                fatal(_("`delete' is not allowed with 
FUNCTAB"));
                }
          }
-#line 3225 "awkgram.c"
+#line 3245 "awkgram.c"
     break;
 
-  case 71: /* simple_stmt: exp  */
-#line 1310 "awkgram.y"
+  case 72: /* simple_stmt: exp  */
+#line 1322 "awkgram.y"
           {
                yyval = optimize_assignment(yyvsp[0]);
          }
-#line 3233 "awkgram.c"
+#line 3253 "awkgram.c"
     break;
 
-  case 72: /* opt_simple_stmt: %empty  */
-#line 1317 "awkgram.y"
+  case 73: /* opt_simple_stmt: %empty  */
+#line 1329 "awkgram.y"
           { yyval = NULL; }
-#line 3239 "awkgram.c"
+#line 3259 "awkgram.c"
     break;
 
-  case 73: /* opt_simple_stmt: simple_stmt  */
-#line 1319 "awkgram.y"
+  case 74: /* opt_simple_stmt: simple_stmt  */
+#line 1331 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3245 "awkgram.c"
+#line 3265 "awkgram.c"
     break;
 
-  case 74: /* case_statements: %empty  */
-#line 1324 "awkgram.y"
+  case 75: /* case_statements: %empty  */
+#line 1336 "awkgram.y"
           { yyval = NULL; }
-#line 3251 "awkgram.c"
+#line 3271 "awkgram.c"
     break;
 
-  case 75: /* case_statements: case_statements case_statement  */
-#line 1326 "awkgram.y"
+  case 76: /* case_statements: case_statements case_statement  */
+#line 1338 "awkgram.y"
           {
                if (yyvsp[-1] == NULL)
                        yyval = list_create(yyvsp[0]);
                else
                        yyval = list_prepend(yyvsp[-1], yyvsp[0]);
          }
-#line 3262 "awkgram.c"
+#line 3282 "awkgram.c"
     break;
 
-  case 76: /* case_statements: case_statements error  */
-#line 1333 "awkgram.y"
+  case 77: /* case_statements: case_statements error  */
+#line 1345 "awkgram.y"
           { yyval = NULL; }
-#line 3268 "awkgram.c"
+#line 3288 "awkgram.c"
     break;
 
-  case 77: /* case_statement: LEX_CASE case_value colon opt_nls statements  */
-#line 1338 "awkgram.y"
+  case 78: /* case_statement: LEX_CASE case_value colon opt_nls statements  */
+#line 1350 "awkgram.y"
           {
                INSTRUCTION *casestmt = yyvsp[0];
                if (yyvsp[0] == NULL)
@@ -3281,11 +3301,11 @@ regular_print:
                bcfree(yyvsp[-2]);
                yyval = yyvsp[-4];
          }
-#line 3285 "awkgram.c"
+#line 3305 "awkgram.c"
     break;
 
-  case 78: /* case_statement: LEX_DEFAULT colon opt_nls statements  */
-#line 1351 "awkgram.y"
+  case 79: /* case_statement: LEX_DEFAULT colon opt_nls statements  */
+#line 1363 "awkgram.y"
           {
                INSTRUCTION *casestmt = yyvsp[0];
                if (yyvsp[0] == NULL)
@@ -3297,17 +3317,17 @@ regular_print:
                yyvsp[-3]->comment = yyvsp[-1];
                yyval = yyvsp[-3];
          }
-#line 3301 "awkgram.c"
+#line 3321 "awkgram.c"
     break;
 
-  case 79: /* case_value: YNUMBER  */
-#line 1366 "awkgram.y"
+  case 80: /* case_value: YNUMBER  */
+#line 1378 "awkgram.y"
           {    yyval = yyvsp[0]; }
-#line 3307 "awkgram.c"
+#line 3327 "awkgram.c"
     break;
 
-  case 80: /* case_value: '-' YNUMBER  */
-#line 1368 "awkgram.y"
+  case 81: /* case_value: '-' YNUMBER  */
+#line 1380 "awkgram.y"
           {
                NODE *n = yyvsp[0]->memory;
                (void) force_number(n);
@@ -3315,28 +3335,28 @@ regular_print:
                bcfree(yyvsp[-1]);
                yyval = yyvsp[0];
          }
-#line 3319 "awkgram.c"
+#line 3339 "awkgram.c"
     break;
 
-  case 81: /* case_value: '+' YNUMBER  */
-#line 1376 "awkgram.y"
+  case 82: /* case_value: '+' YNUMBER  */
+#line 1388 "awkgram.y"
           {
                NODE *n = yyvsp[0]->lasti->memory;
                bcfree(yyvsp[-1]);
                add_sign_to_num(n, '+');
                yyval = yyvsp[0];
          }
-#line 3330 "awkgram.c"
+#line 3350 "awkgram.c"
     break;
 
-  case 82: /* case_value: YSTRING  */
-#line 1383 "awkgram.y"
+  case 83: /* case_value: YSTRING  */
+#line 1395 "awkgram.y"
           {    yyval = yyvsp[0]; }
-#line 3336 "awkgram.c"
+#line 3356 "awkgram.c"
     break;
 
-  case 83: /* case_value: regexp  */
-#line 1385 "awkgram.y"
+  case 84: /* case_value: regexp  */
+#line 1397 "awkgram.y"
           {
                if (yyvsp[0]->memory->type == Node_regex)
                        yyvsp[0]->opcode = Op_push_re;
@@ -3344,57 +3364,57 @@ regular_print:
                        yyvsp[0]->opcode = Op_push;
                yyval = yyvsp[0];
          }
-#line 3348 "awkgram.c"
+#line 3368 "awkgram.c"
     break;
 
-  case 84: /* case_value: typed_regexp  */
-#line 1393 "awkgram.y"
+  case 85: /* case_value: typed_regexp  */
+#line 1405 "awkgram.y"
           {
                assert((yyvsp[0]->memory->flags & REGEX) == REGEX);
                yyvsp[0]->opcode = Op_push_re;
                yyval = yyvsp[0];
          }
-#line 3358 "awkgram.c"
+#line 3378 "awkgram.c"
     break;
 
-  case 85: /* print: LEX_PRINT  */
-#line 1402 "awkgram.y"
+  case 86: /* print: LEX_PRINT  */
+#line 1414 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3364 "awkgram.c"
+#line 3384 "awkgram.c"
     break;
 
-  case 86: /* print: LEX_PRINTF  */
-#line 1404 "awkgram.y"
+  case 87: /* print: LEX_PRINTF  */
+#line 1416 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3370 "awkgram.c"
+#line 3390 "awkgram.c"
     break;
 
-  case 88: /* print_expression_list: '(' expression_list r_paren  */
-#line 1414 "awkgram.y"
+  case 89: /* print_expression_list: '(' expression_list r_paren  */
+#line 1426 "awkgram.y"
           {
                yyval = yyvsp[-1];
          }
-#line 3378 "awkgram.c"
+#line 3398 "awkgram.c"
     break;
 
-  case 89: /* output_redir: %empty  */
-#line 1421 "awkgram.y"
+  case 90: /* output_redir: %empty  */
+#line 1433 "awkgram.y"
           {
                in_print = false;
                in_parens = 0;
                yyval = NULL;
          }
-#line 3388 "awkgram.c"
+#line 3408 "awkgram.c"
     break;
 
-  case 90: /* $@6: %empty  */
-#line 1426 "awkgram.y"
+  case 91: /* $@6: %empty  */
+#line 1438 "awkgram.y"
                  { in_print = false; in_parens = 0; }
-#line 3394 "awkgram.c"
+#line 3414 "awkgram.c"
     break;
 
-  case 91: /* output_redir: IO_OUT $@6 common_exp  */
-#line 1427 "awkgram.y"
+  case 92: /* output_redir: IO_OUT $@6 common_exp  */
+#line 1439 "awkgram.y"
           {
                if (yyvsp[-2]->redir_type == redirect_twoway
                        && yyvsp[0]->lasti->opcode == Op_K_getline_redir
@@ -3404,22 +3424,22 @@ regular_print:
                        lintwarn(_("concatenation as I/O `>' redirection target 
is ambiguous"));
                yyval = list_prepend(yyvsp[0], yyvsp[-2]);
          }
-#line 3408 "awkgram.c"
+#line 3428 "awkgram.c"
     break;
 
-  case 92: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement  */
-#line 1440 "awkgram.y"
+  case 93: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement  */
+#line 1452 "awkgram.y"
           {
                if (yyvsp[-1] != NULL)
                        yyvsp[-5]->comment = yyvsp[-1];
                add_lint(yyvsp[-3], LINT_assign_in_cond);
                yyval = mk_condition(yyvsp[-3], yyvsp[-5], yyvsp[0], NULL, 
NULL);
          }
-#line 3419 "awkgram.c"
+#line 3439 "awkgram.c"
     break;
 
-  case 93: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement LEX_ELSE 
opt_nls statement  */
-#line 1448 "awkgram.y"
+  case 94: /* if_statement: LEX_IF '(' exp r_paren opt_nls statement LEX_ELSE 
opt_nls statement  */
+#line 1460 "awkgram.y"
           {
                if (yyvsp[-4] != NULL)
                        yyvsp[-8]->comment = yyvsp[-4];
@@ -3428,19 +3448,19 @@ regular_print:
                add_lint(yyvsp[-6], LINT_assign_in_cond);
                yyval = mk_condition(yyvsp[-6], yyvsp[-8], yyvsp[-3], 
yyvsp[-2], yyvsp[0]);
          }
-#line 3432 "awkgram.c"
+#line 3452 "awkgram.c"
     break;
 
-  case 94: /* nls: NEWLINE  */
-#line 1460 "awkgram.y"
+  case 95: /* nls: NEWLINE  */
+#line 1472 "awkgram.y"
           {
                yyval = yyvsp[0];
          }
-#line 3440 "awkgram.c"
+#line 3460 "awkgram.c"
     break;
 
-  case 95: /* nls: nls NEWLINE  */
-#line 1464 "awkgram.y"
+  case 96: /* nls: nls NEWLINE  */
+#line 1476 "awkgram.y"
           {
                if (yyvsp[-1] != NULL && yyvsp[0] != NULL) {
                        if (yyvsp[-1]->memory->comment_type == EOL_COMMENT) {
@@ -3458,59 +3478,59 @@ regular_print:
                } else
                        yyval = NULL;
          }
-#line 3462 "awkgram.c"
+#line 3482 "awkgram.c"
     break;
 
-  case 96: /* opt_nls: %empty  */
-#line 1485 "awkgram.y"
+  case 97: /* opt_nls: %empty  */
+#line 1497 "awkgram.y"
           { yyval = NULL; }
-#line 3468 "awkgram.c"
+#line 3488 "awkgram.c"
     break;
 
-  case 97: /* opt_nls: nls  */
-#line 1487 "awkgram.y"
+  case 98: /* opt_nls: nls  */
+#line 1499 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3474 "awkgram.c"
+#line 3494 "awkgram.c"
     break;
 
-  case 98: /* input_redir: %empty  */
-#line 1492 "awkgram.y"
+  case 99: /* input_redir: %empty  */
+#line 1504 "awkgram.y"
           { yyval = NULL; }
-#line 3480 "awkgram.c"
+#line 3500 "awkgram.c"
     break;
 
-  case 99: /* input_redir: '<' simp_exp  */
-#line 1494 "awkgram.y"
+  case 100: /* input_redir: '<' simp_exp  */
+#line 1506 "awkgram.y"
           {
                bcfree(yyvsp[-1]);
                yyval = yyvsp[0];
          }
-#line 3489 "awkgram.c"
+#line 3509 "awkgram.c"
     break;
 
-  case 100: /* opt_param_list: %empty  */
-#line 1502 "awkgram.y"
+  case 101: /* opt_param_list: %empty  */
+#line 1514 "awkgram.y"
           { yyval = NULL; }
-#line 3495 "awkgram.c"
+#line 3515 "awkgram.c"
     break;
 
-  case 101: /* opt_param_list: param_list  */
-#line 1504 "awkgram.y"
+  case 102: /* opt_param_list: param_list  */
+#line 1516 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3501 "awkgram.c"
+#line 3521 "awkgram.c"
     break;
 
-  case 102: /* param_list: NAME  */
-#line 1509 "awkgram.y"
+  case 103: /* param_list: NAME  */
+#line 1521 "awkgram.y"
           {
                yyvsp[0]->param_count = 0;
                yyval = list_create(yyvsp[0]);
          }
-#line 3510 "awkgram.c"
+#line 3530 "awkgram.c"
     break;
 
-  case 103: /* param_list: param_list comma NAME  */
-#line 1514 "awkgram.y"
+  case 104: /* param_list: param_list comma NAME  */
+#line 1526 "awkgram.y"
           {
                if (yyvsp[-2] != NULL && yyvsp[0] != NULL) {
                        yyvsp[0]->param_count = yyvsp[-2]->lasti->param_count + 
1;
@@ -3527,76 +3547,76 @@ regular_print:
                } else
                        yyval = NULL;
          }
-#line 3531 "awkgram.c"
+#line 3551 "awkgram.c"
     break;
 
-  case 104: /* param_list: error  */
-#line 1531 "awkgram.y"
+  case 105: /* param_list: error  */
+#line 1543 "awkgram.y"
           { yyval = NULL; }
-#line 3537 "awkgram.c"
+#line 3557 "awkgram.c"
     break;
 
-  case 105: /* param_list: param_list error  */
-#line 1533 "awkgram.y"
+  case 106: /* param_list: param_list error  */
+#line 1545 "awkgram.y"
           { yyval = yyvsp[-1]; }
-#line 3543 "awkgram.c"
+#line 3563 "awkgram.c"
     break;
 
-  case 106: /* param_list: param_list comma error  */
-#line 1535 "awkgram.y"
+  case 107: /* param_list: param_list comma error  */
+#line 1547 "awkgram.y"
           { yyval = yyvsp[-2]; }
-#line 3549 "awkgram.c"
+#line 3569 "awkgram.c"
     break;
 
-  case 107: /* opt_exp: %empty  */
-#line 1541 "awkgram.y"
+  case 108: /* opt_exp: %empty  */
+#line 1553 "awkgram.y"
           { yyval = NULL; }
-#line 3555 "awkgram.c"
+#line 3575 "awkgram.c"
     break;
 
-  case 108: /* opt_exp: exp  */
-#line 1543 "awkgram.y"
+  case 109: /* opt_exp: exp  */
+#line 1555 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3561 "awkgram.c"
+#line 3581 "awkgram.c"
     break;
 
-  case 109: /* opt_expression_list: %empty  */
-#line 1548 "awkgram.y"
+  case 110: /* opt_expression_list: %empty  */
+#line 1560 "awkgram.y"
           { yyval = NULL; }
-#line 3567 "awkgram.c"
+#line 3587 "awkgram.c"
     break;
 
-  case 110: /* opt_expression_list: expression_list  */
-#line 1550 "awkgram.y"
+  case 111: /* opt_expression_list: expression_list  */
+#line 1562 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3573 "awkgram.c"
+#line 3593 "awkgram.c"
     break;
 
-  case 111: /* expression_list: exp  */
-#line 1555 "awkgram.y"
+  case 112: /* expression_list: exp  */
+#line 1567 "awkgram.y"
           {    yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3579 "awkgram.c"
+#line 3599 "awkgram.c"
     break;
 
-  case 112: /* expression_list: expression_list comma exp  */
-#line 1557 "awkgram.y"
+  case 113: /* expression_list: expression_list comma exp  */
+#line 1569 "awkgram.y"
           {
                if (yyvsp[-1] != NULL)
                        yyvsp[-2]->lasti->comment = yyvsp[-1];
                yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
                yyerrok;
          }
-#line 3590 "awkgram.c"
+#line 3610 "awkgram.c"
     break;
 
-  case 113: /* expression_list: error  */
-#line 1564 "awkgram.y"
+  case 114: /* expression_list: error  */
+#line 1576 "awkgram.y"
           { yyval = NULL; }
-#line 3596 "awkgram.c"
+#line 3616 "awkgram.c"
     break;
 
-  case 114: /* expression_list: expression_list error  */
-#line 1566 "awkgram.y"
+  case 115: /* expression_list: expression_list error  */
+#line 1578 "awkgram.y"
           {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3604,66 +3624,66 @@ regular_print:
                 */
                yyval = yyvsp[-1];
          }
-#line 3608 "awkgram.c"
+#line 3628 "awkgram.c"
     break;
 
-  case 115: /* expression_list: expression_list error exp  */
-#line 1574 "awkgram.y"
+  case 116: /* expression_list: expression_list error exp  */
+#line 1586 "awkgram.y"
           {
                /* Ditto */
                yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
          }
-#line 3617 "awkgram.c"
+#line 3637 "awkgram.c"
     break;
 
-  case 116: /* expression_list: expression_list comma error  */
-#line 1579 "awkgram.y"
+  case 117: /* expression_list: expression_list comma error  */
+#line 1591 "awkgram.y"
           {
                /* Ditto */
                if (yyvsp[-1] != NULL)
                        yyvsp[-2]->lasti->comment = yyvsp[-1];
                yyval = yyvsp[-2];
          }
-#line 3628 "awkgram.c"
+#line 3648 "awkgram.c"
     break;
 
-  case 117: /* opt_fcall_expression_list: %empty  */
-#line 1589 "awkgram.y"
+  case 118: /* opt_fcall_expression_list: %empty  */
+#line 1601 "awkgram.y"
           { yyval = NULL; }
-#line 3634 "awkgram.c"
+#line 3654 "awkgram.c"
     break;
 
-  case 118: /* opt_fcall_expression_list: fcall_expression_list  */
-#line 1591 "awkgram.y"
+  case 119: /* opt_fcall_expression_list: fcall_expression_list  */
+#line 1603 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3640 "awkgram.c"
+#line 3660 "awkgram.c"
     break;
 
-  case 119: /* fcall_expression_list: fcall_exp  */
-#line 1596 "awkgram.y"
+  case 120: /* fcall_expression_list: fcall_exp  */
+#line 1608 "awkgram.y"
           {    yyval = mk_expression_list(NULL, yyvsp[0]); }
-#line 3646 "awkgram.c"
+#line 3666 "awkgram.c"
     break;
 
-  case 120: /* fcall_expression_list: fcall_expression_list comma fcall_exp  */
-#line 1598 "awkgram.y"
+  case 121: /* fcall_expression_list: fcall_expression_list comma fcall_exp  */
+#line 1610 "awkgram.y"
           {
                if (yyvsp[-1] != NULL)
                        yyvsp[-2]->lasti->comment = yyvsp[-1];
                yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
                yyerrok;
          }
-#line 3657 "awkgram.c"
+#line 3677 "awkgram.c"
     break;
 
-  case 121: /* fcall_expression_list: error  */
-#line 1605 "awkgram.y"
+  case 122: /* fcall_expression_list: error  */
+#line 1617 "awkgram.y"
           { yyval = NULL; }
-#line 3663 "awkgram.c"
+#line 3683 "awkgram.c"
     break;
 
-  case 122: /* fcall_expression_list: fcall_expression_list error  */
-#line 1607 "awkgram.y"
+  case 123: /* fcall_expression_list: fcall_expression_list error  */
+#line 1619 "awkgram.y"
           {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3671,86 +3691,86 @@ regular_print:
                 */
                yyval = yyvsp[-1];
          }
-#line 3675 "awkgram.c"
+#line 3695 "awkgram.c"
     break;
 
-  case 123: /* fcall_expression_list: fcall_expression_list error fcall_exp  */
-#line 1615 "awkgram.y"
+  case 124: /* fcall_expression_list: fcall_expression_list error fcall_exp  */
+#line 1627 "awkgram.y"
           {
                /* Ditto */
                yyval = mk_expression_list(yyvsp[-2], yyvsp[0]);
          }
-#line 3684 "awkgram.c"
+#line 3704 "awkgram.c"
     break;
 
-  case 124: /* fcall_expression_list: fcall_expression_list comma error  */
-#line 1620 "awkgram.y"
+  case 125: /* fcall_expression_list: fcall_expression_list comma error  */
+#line 1632 "awkgram.y"
           {
                /* Ditto */
                if (yyvsp[-1] != NULL)
                        yyvsp[-2]->comment = yyvsp[-1];
                yyval = yyvsp[-2];
          }
-#line 3695 "awkgram.c"
+#line 3715 "awkgram.c"
     break;
 
-  case 125: /* fcall_exp: exp  */
-#line 1629 "awkgram.y"
+  case 126: /* fcall_exp: exp  */
+#line 1641 "awkgram.y"
               { yyval = yyvsp[0]; }
-#line 3701 "awkgram.c"
+#line 3721 "awkgram.c"
     break;
 
-  case 126: /* fcall_exp: typed_regexp  */
-#line 1630 "awkgram.y"
+  case 127: /* fcall_exp: typed_regexp  */
+#line 1642 "awkgram.y"
                        { yyval = list_create(yyvsp[0]); }
-#line 3707 "awkgram.c"
+#line 3727 "awkgram.c"
     break;
 
-  case 127: /* opt_fcall_exp: %empty  */
-#line 1635 "awkgram.y"
+  case 128: /* opt_fcall_exp: %empty  */
+#line 1647 "awkgram.y"
           { yyval = NULL; }
-#line 3713 "awkgram.c"
+#line 3733 "awkgram.c"
     break;
 
-  case 128: /* opt_fcall_exp: fcall_exp  */
-#line 1636 "awkgram.y"
+  case 129: /* opt_fcall_exp: fcall_exp  */
+#line 1648 "awkgram.y"
                     { yyval = yyvsp[0]; }
-#line 3719 "awkgram.c"
+#line 3739 "awkgram.c"
     break;
 
-  case 129: /* exp: variable assign_operator exp  */
-#line 1642 "awkgram.y"
+  case 130: /* exp: variable assign_operator exp  */
+#line 1654 "awkgram.y"
           {
                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 3730 "awkgram.c"
+#line 3750 "awkgram.c"
     break;
 
-  case 130: /* exp: variable ASSIGN typed_regexp  */
-#line 1649 "awkgram.y"
+  case 131: /* exp: variable ASSIGN typed_regexp  */
+#line 1661 "awkgram.y"
           {
                yyval = mk_assignment(yyvsp[-2], list_create(yyvsp[0]), 
yyvsp[-1]);
          }
-#line 3738 "awkgram.c"
+#line 3758 "awkgram.c"
     break;
 
-  case 131: /* exp: exp LEX_AND exp  */
-#line 1653 "awkgram.y"
+  case 132: /* exp: exp LEX_AND exp  */
+#line 1665 "awkgram.y"
           {    yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3744 "awkgram.c"
+#line 3764 "awkgram.c"
     break;
 
-  case 132: /* exp: exp LEX_OR exp  */
-#line 1655 "awkgram.y"
+  case 133: /* exp: exp LEX_OR exp  */
+#line 1667 "awkgram.y"
           {    yyval = mk_boolean(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3750 "awkgram.c"
+#line 3770 "awkgram.c"
     break;
 
-  case 133: /* exp: exp MATCHOP typed_regexp  */
-#line 1657 "awkgram.y"
+  case 134: /* exp: exp MATCHOP typed_regexp  */
+#line 1669 "awkgram.y"
           {
                if (yyvsp[-2]->lasti->opcode == Op_match_rec)
                        warning_ln(yyvsp[-1]->source_line,
@@ -3763,11 +3783,11 @@ regular_print:
                bcfree(yyvsp[0]);
                yyval = list_append(yyvsp[-2], yyvsp[-1]);
          }
-#line 3767 "awkgram.c"
+#line 3787 "awkgram.c"
     break;
 
-  case 134: /* exp: exp MATCHOP exp  */
-#line 1670 "awkgram.y"
+  case 135: /* exp: exp MATCHOP exp  */
+#line 1682 "awkgram.y"
           {
                if (yyvsp[-2]->lasti->opcode == Op_match_rec)
                        warning_ln(yyvsp[-1]->source_line,
@@ -3784,11 +3804,11 @@ regular_print:
                        yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), 
yyvsp[-1]);
                }
          }
-#line 3788 "awkgram.c"
+#line 3808 "awkgram.c"
     break;
 
-  case 135: /* exp: exp LEX_IN simple_variable  */
-#line 1687 "awkgram.y"
+  case 136: /* exp: exp LEX_IN simple_variable  */
+#line 1699 "awkgram.y"
           {
                if (do_lint_old)
                        lintwarn_ln(yyvsp[-1]->source_line,
@@ -3798,91 +3818,91 @@ regular_print:
                yyvsp[-1]->expr_count = 1;
                yyval = list_append(list_merge(yyvsp[-2], yyvsp[0]), yyvsp[-1]);
          }
-#line 3802 "awkgram.c"
+#line 3822 "awkgram.c"
     break;
 
-  case 136: /* exp: exp a_relop exp  */
-#line 1697 "awkgram.y"
+  case 137: /* exp: exp a_relop exp  */
+#line 1709 "awkgram.y"
           {
                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 3813 "awkgram.c"
+#line 3833 "awkgram.c"
     break;
 
-  case 137: /* exp: exp '?' exp ':' exp  */
-#line 1704 "awkgram.y"
+  case 138: /* exp: exp '?' exp ':' exp  */
+#line 1716 "awkgram.y"
           { yyval = mk_condition(yyvsp[-4], yyvsp[-3], yyvsp[-2], yyvsp[-1], 
yyvsp[0]); }
-#line 3819 "awkgram.c"
+#line 3839 "awkgram.c"
     break;
 
-  case 138: /* exp: common_exp  */
-#line 1706 "awkgram.y"
+  case 139: /* exp: common_exp  */
+#line 1718 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3825 "awkgram.c"
+#line 3845 "awkgram.c"
     break;
 
-  case 139: /* assign_operator: ASSIGN  */
-#line 1711 "awkgram.y"
+  case 140: /* assign_operator: ASSIGN  */
+#line 1723 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3831 "awkgram.c"
+#line 3851 "awkgram.c"
     break;
 
-  case 140: /* assign_operator: ASSIGNOP  */
-#line 1713 "awkgram.y"
+  case 141: /* assign_operator: ASSIGNOP  */
+#line 1725 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3837 "awkgram.c"
+#line 3857 "awkgram.c"
     break;
 
-  case 141: /* assign_operator: SLASH_BEFORE_EQUAL ASSIGN  */
-#line 1715 "awkgram.y"
+  case 142: /* assign_operator: SLASH_BEFORE_EQUAL ASSIGN  */
+#line 1727 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_assign_quotient;
                yyval = yyvsp[0];
          }
-#line 3846 "awkgram.c"
+#line 3866 "awkgram.c"
     break;
 
-  case 142: /* relop_or_less: RELOP  */
-#line 1723 "awkgram.y"
+  case 143: /* relop_or_less: RELOP  */
+#line 1735 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3852 "awkgram.c"
+#line 3872 "awkgram.c"
     break;
 
-  case 143: /* relop_or_less: '<'  */
-#line 1725 "awkgram.y"
+  case 144: /* relop_or_less: '<'  */
+#line 1737 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3858 "awkgram.c"
+#line 3878 "awkgram.c"
     break;
 
-  case 144: /* a_relop: relop_or_less  */
-#line 1730 "awkgram.y"
+  case 145: /* a_relop: relop_or_less  */
+#line 1742 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3864 "awkgram.c"
+#line 3884 "awkgram.c"
     break;
 
-  case 145: /* a_relop: '>'  */
-#line 1732 "awkgram.y"
+  case 146: /* a_relop: '>'  */
+#line 1744 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3870 "awkgram.c"
+#line 3890 "awkgram.c"
     break;
 
-  case 146: /* common_exp: simp_exp  */
-#line 1737 "awkgram.y"
+  case 147: /* common_exp: simp_exp  */
+#line 1749 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3876 "awkgram.c"
+#line 3896 "awkgram.c"
     break;
 
-  case 147: /* common_exp: simp_exp_nc  */
-#line 1739 "awkgram.y"
+  case 148: /* common_exp: simp_exp_nc  */
+#line 1751 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 3882 "awkgram.c"
+#line 3902 "awkgram.c"
     break;
 
-  case 148: /* common_exp: common_exp simp_exp  */
-#line 1741 "awkgram.y"
+  case 149: /* common_exp: common_exp simp_exp  */
+#line 1753 "awkgram.y"
           {
                int count = 2;
                bool is_simple_var = false;
@@ -3936,47 +3956,47 @@ regular_print:
                                max_args = count;
                }
          }
-#line 3940 "awkgram.c"
+#line 3960 "awkgram.c"
     break;
 
-  case 150: /* simp_exp: simp_exp '^' simp_exp  */
-#line 1800 "awkgram.y"
+  case 151: /* simp_exp: simp_exp '^' simp_exp  */
+#line 1812 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3946 "awkgram.c"
+#line 3966 "awkgram.c"
     break;
 
-  case 151: /* simp_exp: simp_exp '*' simp_exp  */
-#line 1802 "awkgram.y"
+  case 152: /* simp_exp: simp_exp '*' simp_exp  */
+#line 1814 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3952 "awkgram.c"
+#line 3972 "awkgram.c"
     break;
 
-  case 152: /* simp_exp: simp_exp '/' simp_exp  */
-#line 1804 "awkgram.y"
+  case 153: /* simp_exp: simp_exp '/' simp_exp  */
+#line 1816 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3958 "awkgram.c"
+#line 3978 "awkgram.c"
     break;
 
-  case 153: /* simp_exp: simp_exp '%' simp_exp  */
-#line 1806 "awkgram.y"
+  case 154: /* simp_exp: simp_exp '%' simp_exp  */
+#line 1818 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3964 "awkgram.c"
+#line 3984 "awkgram.c"
     break;
 
-  case 154: /* simp_exp: simp_exp '+' simp_exp  */
-#line 1808 "awkgram.y"
+  case 155: /* simp_exp: simp_exp '+' simp_exp  */
+#line 1820 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3970 "awkgram.c"
+#line 3990 "awkgram.c"
     break;
 
-  case 155: /* simp_exp: simp_exp '-' simp_exp  */
-#line 1810 "awkgram.y"
+  case 156: /* simp_exp: simp_exp '-' simp_exp  */
+#line 1822 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 3976 "awkgram.c"
+#line 3996 "awkgram.c"
     break;
 
-  case 156: /* simp_exp: LEX_GETLINE opt_variable input_redir  */
-#line 1812 "awkgram.y"
+  case 157: /* simp_exp: LEX_GETLINE opt_variable input_redir  */
+#line 1824 "awkgram.y"
           {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3990,29 +4010,29 @@ regular_print:
                                _("non-redirected `getline' undefined inside 
END action"));
                yyval = mk_getline(yyvsp[-2], yyvsp[-1], yyvsp[0], 
redirect_input);
          }
-#line 3994 "awkgram.c"
+#line 4014 "awkgram.c"
     break;
 
-  case 157: /* simp_exp: variable INCREMENT  */
-#line 1826 "awkgram.y"
+  case 158: /* simp_exp: variable INCREMENT  */
+#line 1838 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_postincrement;
                yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
          }
-#line 4003 "awkgram.c"
+#line 4023 "awkgram.c"
     break;
 
-  case 158: /* simp_exp: variable DECREMENT  */
-#line 1831 "awkgram.y"
+  case 159: /* simp_exp: variable DECREMENT  */
+#line 1843 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_postdecrement;
                yyval = mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
          }
-#line 4012 "awkgram.c"
+#line 4032 "awkgram.c"
     break;
 
-  case 159: /* simp_exp: '(' expression_list r_paren LEX_IN simple_variable  */
-#line 1836 "awkgram.y"
+  case 160: /* simp_exp: '(' expression_list r_paren LEX_IN simple_variable  */
+#line 1848 "awkgram.y"
           {
                if (do_lint_old) {
                    /* first one is warning so that second one comes out if 
warnings are fatal */
@@ -4033,64 +4053,64 @@ regular_print:
                        yyval = list_append(list_merge(t, yyvsp[0]), yyvsp[-1]);
                }
          }
-#line 4037 "awkgram.c"
+#line 4057 "awkgram.c"
     break;
 
-  case 160: /* simp_exp_nc: common_exp IO_IN LEX_GETLINE opt_variable  */
-#line 1862 "awkgram.y"
+  case 161: /* simp_exp_nc: common_exp IO_IN LEX_GETLINE opt_variable  */
+#line 1874 "awkgram.y"
                 {
                  yyval = mk_getline(yyvsp[-1], yyvsp[0], yyvsp[-3], 
yyvsp[-2]->redir_type);
                  bcfree(yyvsp[-2]);
                }
-#line 4046 "awkgram.c"
+#line 4066 "awkgram.c"
     break;
 
-  case 161: /* simp_exp_nc: simp_exp_nc '^' simp_exp  */
-#line 1868 "awkgram.y"
+  case 162: /* simp_exp_nc: simp_exp_nc '^' simp_exp  */
+#line 1880 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4052 "awkgram.c"
+#line 4072 "awkgram.c"
     break;
 
-  case 162: /* simp_exp_nc: simp_exp_nc '*' simp_exp  */
-#line 1870 "awkgram.y"
+  case 163: /* simp_exp_nc: simp_exp_nc '*' simp_exp  */
+#line 1882 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4058 "awkgram.c"
+#line 4078 "awkgram.c"
     break;
 
-  case 163: /* simp_exp_nc: simp_exp_nc '/' simp_exp  */
-#line 1872 "awkgram.y"
+  case 164: /* simp_exp_nc: simp_exp_nc '/' simp_exp  */
+#line 1884 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4064 "awkgram.c"
+#line 4084 "awkgram.c"
     break;
 
-  case 164: /* simp_exp_nc: simp_exp_nc '%' simp_exp  */
-#line 1874 "awkgram.y"
+  case 165: /* simp_exp_nc: simp_exp_nc '%' simp_exp  */
+#line 1886 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4070 "awkgram.c"
+#line 4090 "awkgram.c"
     break;
 
-  case 165: /* simp_exp_nc: simp_exp_nc '+' simp_exp  */
-#line 1876 "awkgram.y"
+  case 166: /* simp_exp_nc: simp_exp_nc '+' simp_exp  */
+#line 1888 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4076 "awkgram.c"
+#line 4096 "awkgram.c"
     break;
 
-  case 166: /* simp_exp_nc: simp_exp_nc '-' simp_exp  */
-#line 1878 "awkgram.y"
+  case 167: /* simp_exp_nc: simp_exp_nc '-' simp_exp  */
+#line 1890 "awkgram.y"
           { yyval = mk_binary(yyvsp[-2], yyvsp[0], yyvsp[-1]); }
-#line 4082 "awkgram.c"
+#line 4102 "awkgram.c"
     break;
 
-  case 167: /* non_post_simp_exp: regexp  */
-#line 1883 "awkgram.y"
+  case 168: /* non_post_simp_exp: regexp  */
+#line 1895 "awkgram.y"
           {
                yyval = list_create(yyvsp[0]);
          }
-#line 4090 "awkgram.c"
+#line 4110 "awkgram.c"
     break;
 
-  case 168: /* non_post_simp_exp: '!' simp_exp  */
-#line 1887 "awkgram.y"
+  case 169: /* non_post_simp_exp: '!' simp_exp  */
+#line 1899 "awkgram.y"
           {
                if (yyvsp[0]->opcode == Op_match_rec) {
                        yyvsp[0]->opcode = Op_nomatch;
@@ -4122,11 +4142,11 @@ regular_print:
                        }
                }
           }
-#line 4126 "awkgram.c"
+#line 4146 "awkgram.c"
     break;
 
-  case 169: /* non_post_simp_exp: '(' exp r_paren  */
-#line 1919 "awkgram.y"
+  case 170: /* non_post_simp_exp: '(' exp r_paren  */
+#line 1931 "awkgram.y"
           {
                // Always include. Allows us to lint warn on
                // print "foo" > "bar" 1
@@ -4134,31 +4154,31 @@ regular_print:
                // print "foo" > ("bar" 1)
                yyval = list_append(yyvsp[-1], bcalloc(Op_parens, 1, 
sourceline));
          }
-#line 4138 "awkgram.c"
+#line 4158 "awkgram.c"
     break;
 
-  case 170: /* non_post_simp_exp: LEX_BUILTIN '(' opt_fcall_expression_list 
r_paren  */
-#line 1927 "awkgram.y"
+  case 171: /* non_post_simp_exp: LEX_BUILTIN '(' opt_fcall_expression_list 
r_paren  */
+#line 1939 "awkgram.y"
           {
                yyval = snode(yyvsp[-1], yyvsp[-3]);
                if (yyval == NULL)
                        YYABORT;
          }
-#line 4148 "awkgram.c"
+#line 4168 "awkgram.c"
     break;
 
-  case 171: /* non_post_simp_exp: LEX_LENGTH '(' opt_fcall_expression_list 
r_paren  */
-#line 1933 "awkgram.y"
+  case 172: /* non_post_simp_exp: LEX_LENGTH '(' opt_fcall_expression_list 
r_paren  */
+#line 1945 "awkgram.y"
           {
                yyval = snode(yyvsp[-1], yyvsp[-3]);
                if (yyval == NULL)
                        YYABORT;
          }
-#line 4158 "awkgram.c"
+#line 4178 "awkgram.c"
     break;
 
-  case 172: /* non_post_simp_exp: LEX_LENGTH  */
-#line 1939 "awkgram.y"
+  case 173: /* non_post_simp_exp: LEX_LENGTH  */
+#line 1951 "awkgram.y"
           {
                static bool warned = false;
 
@@ -4171,45 +4191,45 @@ regular_print:
                if (yyval == NULL)
                        YYABORT;
          }
-#line 4175 "awkgram.c"
+#line 4195 "awkgram.c"
     break;
 
-  case 175: /* non_post_simp_exp: INCREMENT variable  */
-#line 1954 "awkgram.y"
+  case 176: /* non_post_simp_exp: INCREMENT variable  */
+#line 1966 "awkgram.y"
           {
                yyvsp[-1]->opcode = Op_preincrement;
                yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
          }
-#line 4184 "awkgram.c"
+#line 4204 "awkgram.c"
     break;
 
-  case 176: /* non_post_simp_exp: DECREMENT variable  */
-#line 1959 "awkgram.y"
+  case 177: /* non_post_simp_exp: DECREMENT variable  */
+#line 1971 "awkgram.y"
           {
                yyvsp[-1]->opcode = Op_predecrement;
                yyval = mk_assignment(yyvsp[0], NULL, yyvsp[-1]);
          }
-#line 4193 "awkgram.c"
+#line 4213 "awkgram.c"
     break;
 
-  case 177: /* non_post_simp_exp: YNUMBER  */
-#line 1964 "awkgram.y"
+  case 178: /* non_post_simp_exp: YNUMBER  */
+#line 1976 "awkgram.y"
           {
                yyval = list_create(yyvsp[0]);
          }
-#line 4201 "awkgram.c"
+#line 4221 "awkgram.c"
     break;
 
-  case 178: /* non_post_simp_exp: YSTRING  */
-#line 1968 "awkgram.y"
+  case 179: /* non_post_simp_exp: YSTRING  */
+#line 1980 "awkgram.y"
           {
                yyval = list_create(yyvsp[0]);
          }
-#line 4209 "awkgram.c"
+#line 4229 "awkgram.c"
     break;
 
-  case 179: /* non_post_simp_exp: '-' simp_exp  */
-#line 1972 "awkgram.y"
+  case 180: /* non_post_simp_exp: '-' simp_exp  */
+#line 1984 "awkgram.y"
           {
                if (yyvsp[0]->lasti->opcode == Op_push_i
                        && (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4224,11 +4244,11 @@ regular_print:
                        yyval = list_append(yyvsp[0], yyvsp[-1]);
                }
          }
-#line 4228 "awkgram.c"
+#line 4248 "awkgram.c"
     break;
 
-  case 180: /* non_post_simp_exp: '+' simp_exp  */
-#line 1987 "awkgram.y"
+  case 181: /* non_post_simp_exp: '+' simp_exp  */
+#line 1999 "awkgram.y"
           {
                if (yyvsp[0]->lasti->opcode == Op_push_i
                        && (yyvsp[0]->lasti->memory->flags & STRING) == 0
@@ -4246,20 +4266,20 @@ regular_print:
                        yyval = list_append(yyvsp[0], yyvsp[-1]);
                }
          }
-#line 4250 "awkgram.c"
+#line 4270 "awkgram.c"
     break;
 
-  case 181: /* func_call: direct_func_call  */
-#line 2008 "awkgram.y"
+  case 182: /* func_call: direct_func_call  */
+#line 2020 "awkgram.y"
           {
                func_use(yyvsp[0]->lasti->func_name, FUNC_USE);
                yyval = yyvsp[0];
          }
-#line 4259 "awkgram.c"
+#line 4279 "awkgram.c"
     break;
 
-  case 182: /* func_call: '@' direct_func_call  */
-#line 2013 "awkgram.y"
+  case 183: /* func_call: '@' direct_func_call  */
+#line 2025 "awkgram.y"
           {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -4293,11 +4313,11 @@ regular_print:
                yyval = list_prepend(yyvsp[0], t);
                at_seen--;
          }
-#line 4297 "awkgram.c"
+#line 4317 "awkgram.c"
     break;
 
-  case 183: /* direct_func_call: FUNC_CALL '(' opt_fcall_expression_list 
r_paren  */
-#line 2050 "awkgram.y"
+  case 184: /* direct_func_call: FUNC_CALL '(' opt_fcall_expression_list 
r_paren  */
+#line 2062 "awkgram.y"
           {
                NODE *n;
                char *name = yyvsp[-3]->func_name;
@@ -4330,49 +4350,49 @@ regular_print:
                        yyval = list_append(t, yyvsp[-3]);
                }
          }
-#line 4334 "awkgram.c"
+#line 4354 "awkgram.c"
     break;
 
-  case 184: /* opt_variable: %empty  */
-#line 2086 "awkgram.y"
+  case 185: /* opt_variable: %empty  */
+#line 2098 "awkgram.y"
           { yyval = NULL; }
-#line 4340 "awkgram.c"
+#line 4360 "awkgram.c"
     break;
 
-  case 185: /* opt_variable: variable  */
-#line 2088 "awkgram.y"
+  case 186: /* opt_variable: variable  */
+#line 2100 "awkgram.y"
           { yyval = yyvsp[0]; }
-#line 4346 "awkgram.c"
+#line 4366 "awkgram.c"
     break;
 
-  case 186: /* delete_subscript_list: %empty  */
-#line 2093 "awkgram.y"
+  case 187: /* delete_subscript_list: %empty  */
+#line 2105 "awkgram.y"
           { yyval = NULL; }
-#line 4352 "awkgram.c"
+#line 4372 "awkgram.c"
     break;
 
-  case 187: /* delete_subscript_list: delete_subscript SUBSCRIPT  */
-#line 2095 "awkgram.y"
+  case 188: /* delete_subscript_list: delete_subscript SUBSCRIPT  */
+#line 2107 "awkgram.y"
           { yyval = yyvsp[-1]; }
-#line 4358 "awkgram.c"
+#line 4378 "awkgram.c"
     break;
 
-  case 188: /* delete_subscript: delete_exp_list  */
-#line 2100 "awkgram.y"
+  case 189: /* delete_subscript: delete_exp_list  */
+#line 2112 "awkgram.y"
           {    yyval = yyvsp[0]; }
-#line 4364 "awkgram.c"
+#line 4384 "awkgram.c"
     break;
 
-  case 189: /* delete_subscript: delete_subscript delete_exp_list  */
-#line 2102 "awkgram.y"
+  case 190: /* delete_subscript: delete_subscript delete_exp_list  */
+#line 2114 "awkgram.y"
           {
                yyval = list_merge(yyvsp[-1], yyvsp[0]);
          }
-#line 4372 "awkgram.c"
+#line 4392 "awkgram.c"
     break;
 
-  case 190: /* delete_exp_list: bracketed_exp_list  */
-#line 2109 "awkgram.y"
+  case 191: /* delete_exp_list: bracketed_exp_list  */
+#line 2121 "awkgram.y"
           {
                INSTRUCTION *ip = yyvsp[0]->lasti;
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -4386,11 +4406,11 @@ regular_print:
                sub_counter++;  /* count # of dimensions */
                yyval = yyvsp[0];
          }
-#line 4390 "awkgram.c"
+#line 4410 "awkgram.c"
     break;
 
-  case 191: /* bracketed_exp_list: '[' expression_list ']'  */
-#line 2126 "awkgram.y"
+  case 192: /* bracketed_exp_list: '[' expression_list ']'  */
+#line 2138 "awkgram.y"
           {
                INSTRUCTION *t = yyvsp[-1];
                if (yyvsp[-1] == NULL) {
@@ -4404,41 +4424,41 @@ regular_print:
                        yyvsp[0]->sub_count = count_expressions(&t, false);
                yyval = list_append(t, yyvsp[0]);
          }
-#line 4408 "awkgram.c"
+#line 4428 "awkgram.c"
     break;
 
-  case 192: /* subscript: bracketed_exp_list  */
-#line 2143 "awkgram.y"
+  case 193: /* subscript: bracketed_exp_list  */
+#line 2155 "awkgram.y"
           {    yyval = yyvsp[0]; }
-#line 4414 "awkgram.c"
+#line 4434 "awkgram.c"
     break;
 
-  case 193: /* subscript: subscript bracketed_exp_list  */
-#line 2145 "awkgram.y"
+  case 194: /* subscript: subscript bracketed_exp_list  */
+#line 2157 "awkgram.y"
           {
                yyval = list_merge(yyvsp[-1], yyvsp[0]);
          }
-#line 4422 "awkgram.c"
+#line 4442 "awkgram.c"
     break;
 
-  case 194: /* subscript_list: subscript SUBSCRIPT  */
-#line 2152 "awkgram.y"
+  case 195: /* subscript_list: subscript SUBSCRIPT  */
+#line 2164 "awkgram.y"
           { yyval = yyvsp[-1]; }
-#line 4428 "awkgram.c"
+#line 4448 "awkgram.c"
     break;
 
-  case 195: /* simple_variable: NAME  */
-#line 2157 "awkgram.y"
+  case 196: /* simple_variable: NAME  */
+#line 2169 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_push;
                yyvsp[0]->memory = variable(yyvsp[0]->source_line, 
yyvsp[0]->lextok, Node_var_new);
                yyval = list_create(yyvsp[0]);
          }
-#line 4438 "awkgram.c"
+#line 4458 "awkgram.c"
     break;
 
-  case 196: /* simple_variable: NAME subscript_list  */
-#line 2163 "awkgram.y"
+  case 197: /* simple_variable: NAME subscript_list  */
+#line 2175 "awkgram.y"
           {
                char *arr = yyvsp[-1]->lextok;
 
@@ -4447,11 +4467,11 @@ regular_print:
                yyvsp[-1]->opcode = Op_push_array;
                yyval = list_prepend(yyvsp[0], yyvsp[-1]);
          }
-#line 4451 "awkgram.c"
+#line 4471 "awkgram.c"
     break;
 
-  case 197: /* variable: simple_variable  */
-#line 2175 "awkgram.y"
+  case 198: /* variable: simple_variable  */
+#line 2187 "awkgram.y"
           {
                INSTRUCTION *ip = yyvsp[0]->nexti;
                if (ip->opcode == Op_push
@@ -4463,85 +4483,85 @@ regular_print:
                } else
                        yyval = yyvsp[0];
          }
-#line 4467 "awkgram.c"
+#line 4487 "awkgram.c"
     break;
 
-  case 198: /* variable: '$' non_post_simp_exp opt_incdec  */
-#line 2187 "awkgram.y"
+  case 199: /* variable: '$' non_post_simp_exp opt_incdec  */
+#line 2199 "awkgram.y"
           {
                yyval = list_append(yyvsp[-1], yyvsp[-2]);
                if (yyvsp[0] != NULL)
                        mk_assignment(yyvsp[-1], NULL, yyvsp[0]);
          }
-#line 4477 "awkgram.c"
+#line 4497 "awkgram.c"
     break;
 
-  case 199: /* opt_incdec: INCREMENT  */
-#line 2196 "awkgram.y"
+  case 200: /* opt_incdec: INCREMENT  */
+#line 2208 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_postincrement;
          }
-#line 4485 "awkgram.c"
+#line 4505 "awkgram.c"
     break;
 
-  case 200: /* opt_incdec: DECREMENT  */
-#line 2200 "awkgram.y"
+  case 201: /* opt_incdec: DECREMENT  */
+#line 2212 "awkgram.y"
           {
                yyvsp[0]->opcode = Op_postdecrement;
          }
-#line 4493 "awkgram.c"
+#line 4513 "awkgram.c"
     break;
 
-  case 201: /* opt_incdec: %empty  */
-#line 2204 "awkgram.y"
+  case 202: /* opt_incdec: %empty  */
+#line 2216 "awkgram.y"
           { yyval = NULL; }
-#line 4499 "awkgram.c"
+#line 4519 "awkgram.c"
     break;
 
-  case 202: /* l_brace: '{' opt_nls  */
-#line 2208 "awkgram.y"
+  case 203: /* l_brace: '{' opt_nls  */
+#line 2220 "awkgram.y"
                       { yyval = yyvsp[0]; }
-#line 4505 "awkgram.c"
+#line 4525 "awkgram.c"
     break;
 
-  case 203: /* r_brace: '}' opt_nls  */
-#line 2212 "awkgram.y"
+  case 204: /* r_brace: '}' opt_nls  */
+#line 2224 "awkgram.y"
                         { yyval = yyvsp[0]; yyerrok; }
-#line 4511 "awkgram.c"
+#line 4531 "awkgram.c"
     break;
 
-  case 204: /* r_paren: ')'  */
-#line 2216 "awkgram.y"
+  case 205: /* r_paren: ')'  */
+#line 2228 "awkgram.y"
               { yyerrok; }
-#line 4517 "awkgram.c"
+#line 4537 "awkgram.c"
     break;
 
-  case 205: /* opt_semi: %empty  */
-#line 2221 "awkgram.y"
+  case 206: /* opt_semi: %empty  */
+#line 2233 "awkgram.y"
           { yyval = NULL; }
-#line 4523 "awkgram.c"
+#line 4543 "awkgram.c"
     break;
 
-  case 207: /* semi: ';'  */
-#line 2226 "awkgram.y"
+  case 208: /* semi: ';'  */
+#line 2238 "awkgram.y"
                 { yyerrok; }
-#line 4529 "awkgram.c"
+#line 4549 "awkgram.c"
     break;
 
-  case 208: /* colon: ':'  */
-#line 2230 "awkgram.y"
+  case 209: /* colon: ':'  */
+#line 2242 "awkgram.y"
                 { yyval = yyvsp[0]; yyerrok; }
-#line 4535 "awkgram.c"
+#line 4555 "awkgram.c"
     break;
 
-  case 209: /* comma: ',' opt_nls  */
-#line 2234 "awkgram.y"
+  case 210: /* comma: ',' opt_nls  */
+#line 2246 "awkgram.y"
                         { yyval = yyvsp[0]; yyerrok; }
-#line 4541 "awkgram.c"
+#line 4561 "awkgram.c"
     break;
 
 
-#line 4545 "awkgram.c"
+#line 4565 "awkgram.c"
 
       default: break;
     }
@@ -4734,7 +4754,7 @@ yyreturnlab:
   return yyresult;
 }
 
-#line 2236 "awkgram.y"
+#line 2248 "awkgram.y"
 
 
 struct token {
@@ -4837,6 +4857,7 @@ static const struct token tokentab[] = {
 {"namespace",          Op_symbol,       LEX_NAMESPACE, GAWKX,          0,      
0},
 {"next",       Op_K_next,       LEX_NEXT,      0,              0,      0},
 {"nextfile",   Op_K_nextfile, LEX_NEXTFILE,    0,              0,      0},
+{"nsinclude",  Op_symbol,       LEX_NSINCLUDE, GAWKX,  0,      0},
 {"or",         Op_builtin,    LEX_BUILTIN,     GAWKX,          do_or,  
MPF(or)},
 {"patsplit",   Op_builtin,    LEX_BUILTIN,     GAWKX|A(2)|A(3)|A(4), 
do_patsplit,      0},
 {"print",      Op_K_print,      LEX_PRINT,     0,              0,      0},
@@ -4971,7 +4992,7 @@ print_included_from()
        saveline = sourceline;
        sourceline = 0;
 
-       for (s = sourcefile; s != NULL && s->stype == SRC_INC; ) {
+       for (s = sourcefile; s != NULL && (s->stype == SRC_INC || s->stype == 
SRC_NSINC); ) {
                s = s->next;
                if (s == NULL || s->fd <= INVALID_HANDLE)
                        continue;
@@ -4983,10 +5004,10 @@ print_included_from()
                msg("%s %s:%d%c",
                        s->prev == sourcefile ? "In file included from"
                                          : "                 from",
-                       (s->stype == SRC_INC ||
+                       (s->stype == SRC_INC || s->stype == SRC_NSINC ||
                                 s->stype == SRC_FILE) ? s->src : "cmd. line",
                        line,
-                       s->stype == SRC_INC ? ',' : ':'
+                       s->stype != SRC_FILE ? ',' : ':'
                );
        }
        sourceline = saveline;
@@ -5388,7 +5409,7 @@ add_srcfile(enum srctype stype, char *src, SRCFILE 
*thisfile, bool *already_incl
 
        /* N.B. We do not eliminate duplicate SRC_FILE (-f) programs. */
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_EXTLIB) && files_are_same(path, s)) {
+               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_NSINC || s->stype == SRC_EXTLIB) && files_are_same(path, s)) {
                        if (stype == SRC_INC || stype == SRC_EXTLIB) {
                                /* eliminate duplicates */
                                if ((stype == SRC_INC) && (s->stype == 
SRC_FILE))
@@ -5453,7 +5474,8 @@ include_source(INSTRUCTION *file, void **srcfile_p)
                return true;
        }
 
-       s = add_srcfile(SRC_INC, src, sourcefile, &already_included, &errcode);
+       s = add_srcfile(include_use_current_namespace ? SRC_NSINC : SRC_INC,
+               src, sourcefile, &already_included, &errcode);
        if (s == NULL) {
                if (already_included)
                        return true;
@@ -5480,7 +5502,12 @@ include_source(INSTRUCTION *file, void **srcfile_p)
        lasttok = 0;
        lexeof = false;
        eof_warned = false;
-       current_namespace = awk_namespace;
+       if (! include_use_current_namespace)
+               current_namespace = awk_namespace;
+       else
+               current_namespace = estrdup(current_namespace, 
strlen(current_namespace));
+
+       include_use_current_namespace = false;  // reset it
        *srcfile_p = (void *) s;
        return true;
 }
@@ -6868,6 +6895,7 @@ retry:
                int class = tokentab[mid].class;
 
                switch (class) {
+               case LEX_NSINCLUDE:
                case LEX_EVAL:
                case LEX_INCLUDE:
                case LEX_LOAD:
@@ -6931,11 +6959,15 @@ retry:
                        continue_allowed++;
 
                switch (class) {
+               case LEX_NSINCLUDE:
+                       include_use_current_namespace = true;
+                       goto make_at_token;     // can't fall through
                case LEX_NAMESPACE:
                        want_namespace = true;
                        // fall through
                case LEX_INCLUDE:
                case LEX_LOAD:
+       make_at_token:
                        want_source = true;
                        break;
                case LEX_EVAL:
diff --git a/awkgram.y b/awkgram.y
index 24acc460..0e7e8f58 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -181,6 +181,8 @@ static INSTRUCTION *ip_beginfile;
 INSTRUCTION *main_beginfile;
 static bool called_from_eval = false;
 
+static bool include_use_current_namespace = false;
+
 static inline INSTRUCTION *list_create(INSTRUCTION *x);
 static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
 static inline INSTRUCTION *list_prepend(INSTRUCTION *l, INSTRUCTION *x);
@@ -205,7 +207,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 LEX_NAMESPACE
+%token LEX_INCLUDE LEX_EVAL LEX_LOAD LEX_NAMESPACE LEX_NSINCLUDE
 %token NEWLINE
 
 /* Lowest to highest */
@@ -307,6 +309,16 @@ rule
                }
                yyerrok;
          }
+       | '@' LEX_NSINCLUDE source statement_term
+         {
+               want_source = false;
+               at_seen--;
+               if ($3 != NULL && $4 != NULL) {
+                       SRCFILE *s = (SRCFILE *) $3;
+                       s->comment = $4;
+               }
+               yyerrok;
+         }
        | '@' LEX_LOAD library statement_term
          {
                want_source = false;
@@ -2335,6 +2347,7 @@ static const struct token tokentab[] = {
 {"namespace",          Op_symbol,       LEX_NAMESPACE, GAWKX,          0,      
0},
 {"next",       Op_K_next,       LEX_NEXT,      0,              0,      0},
 {"nextfile",   Op_K_nextfile, LEX_NEXTFILE,    0,              0,      0},
+{"nsinclude",  Op_symbol,       LEX_NSINCLUDE, GAWKX,  0,      0},
 {"or",         Op_builtin,    LEX_BUILTIN,     GAWKX,          do_or,  
MPF(or)},
 {"patsplit",   Op_builtin,    LEX_BUILTIN,     GAWKX|A(2)|A(3)|A(4), 
do_patsplit,      0},
 {"print",      Op_K_print,      LEX_PRINT,     0,              0,      0},
@@ -2469,7 +2482,7 @@ print_included_from()
        saveline = sourceline;
        sourceline = 0;
 
-       for (s = sourcefile; s != NULL && s->stype == SRC_INC; ) {
+       for (s = sourcefile; s != NULL && (s->stype == SRC_INC || s->stype == 
SRC_NSINC); ) {
                s = s->next;
                if (s == NULL || s->fd <= INVALID_HANDLE)
                        continue;
@@ -2481,10 +2494,10 @@ print_included_from()
                msg("%s %s:%d%c",
                        s->prev == sourcefile ? "In file included from"
                                          : "                 from",
-                       (s->stype == SRC_INC ||
+                       (s->stype == SRC_INC || s->stype == SRC_NSINC ||
                                 s->stype == SRC_FILE) ? s->src : "cmd. line",
                        line,
-                       s->stype == SRC_INC ? ',' : ':'
+                       s->stype != SRC_FILE ? ',' : ':'
                );
        }
        sourceline = saveline;
@@ -2886,7 +2899,7 @@ add_srcfile(enum srctype stype, char *src, SRCFILE 
*thisfile, bool *already_incl
 
        /* N.B. We do not eliminate duplicate SRC_FILE (-f) programs. */
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_EXTLIB) && files_are_same(path, s)) {
+               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_NSINC || s->stype == SRC_EXTLIB) && files_are_same(path, s)) {
                        if (stype == SRC_INC || stype == SRC_EXTLIB) {
                                /* eliminate duplicates */
                                if ((stype == SRC_INC) && (s->stype == 
SRC_FILE))
@@ -2951,7 +2964,8 @@ include_source(INSTRUCTION *file, void **srcfile_p)
                return true;
        }
 
-       s = add_srcfile(SRC_INC, src, sourcefile, &already_included, &errcode);
+       s = add_srcfile(include_use_current_namespace ? SRC_NSINC : SRC_INC,
+               src, sourcefile, &already_included, &errcode);
        if (s == NULL) {
                if (already_included)
                        return true;
@@ -2978,7 +2992,12 @@ include_source(INSTRUCTION *file, void **srcfile_p)
        lasttok = 0;
        lexeof = false;
        eof_warned = false;
-       current_namespace = awk_namespace;
+       if (! include_use_current_namespace)
+               current_namespace = awk_namespace;
+       else
+               current_namespace = estrdup(current_namespace, 
strlen(current_namespace));
+
+       include_use_current_namespace = false;  // reset it
        *srcfile_p = (void *) s;
        return true;
 }
@@ -4366,6 +4385,7 @@ retry:
                int class = tokentab[mid].class;
 
                switch (class) {
+               case LEX_NSINCLUDE:
                case LEX_EVAL:
                case LEX_INCLUDE:
                case LEX_LOAD:
@@ -4429,11 +4449,15 @@ retry:
                        continue_allowed++;
 
                switch (class) {
+               case LEX_NSINCLUDE:
+                       include_use_current_namespace = true;
+                       goto make_at_token;     // can't fall through
                case LEX_NAMESPACE:
                        want_namespace = true;
                        // fall through
                case LEX_INCLUDE:
                case LEX_LOAD:
+       make_at_token:
                        want_source = true;
                        break;
                case LEX_EVAL:
diff --git a/command.c b/command.c
index b468b68a..a3993e2d 100644
--- a/command.c
+++ b/command.c
@@ -3350,7 +3350,7 @@ srcfile_generator(const char *text, int state)
                s = srcfiles->next;
        }
        while (s != srcfiles) {
-               if (s->stype != SRC_FILE && s->stype != SRC_INC) {
+               if (s->stype != SRC_FILE && s->stype != SRC_INC && s->stype != 
SRC_NSINC) {
                        s = s->next;
                        continue;
                }
diff --git a/command.y b/command.y
index 45ad889e..fb0f560a 100644
--- a/command.y
+++ b/command.y
@@ -1627,7 +1627,7 @@ srcfile_generator(const char *text, int state)
                s = srcfiles->next;
        }
        while (s != srcfiles) {
-               if (s->stype != SRC_FILE && s->stype != SRC_INC) {
+               if (s->stype != SRC_FILE && s->stype != SRC_INC && s->stype != 
SRC_NSINC) {
                        s = s->next;
                        continue;
                }
diff --git a/debug.c b/debug.c
index 40c785f8..aaf5eef0 100644
--- a/debug.c
+++ b/debug.c
@@ -507,7 +507,7 @@ source_find(char *src)
                return cur_srcfile;
 
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+               if ((s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_NSINC)
                                && strcmp(s->src, src) == 0)
                        return s;
        }
@@ -515,7 +515,7 @@ source_find(char *src)
        path = find_source(src, & sbuf, & errno_val, false);
        if (path != NULL) {
                for (s = srcfiles->next; s != srcfiles; s = s->next) {
-                       if ((s->stype == SRC_FILE || s->stype == SRC_INC)
+                       if ((s->stype == SRC_FILE || s->stype == SRC_INC || 
s->stype == SRC_NSINC)
                                        && files_are_same(path, s)) {
                                efree(path);
                                return s;
@@ -760,7 +760,7 @@ do_info(CMDARG *arg, int cmd ATTRIBUTE_UNUSED)
                SRCFILE *s;
                for (s = srcfiles->next; s != srcfiles; s = s->next) {
                        fprintf(out_fp, _("Source file (lines): %s (%d)\n"),
-                                       (s->stype == SRC_FILE || s->stype == 
SRC_INC) ? s->src
+                                       (s->stype == SRC_FILE || s->stype == 
SRC_INC || s->stype == SRC_NSINC) ? s->src
                                                                              : 
"cmd. line",
                                        s->srclines);
                }
@@ -2851,7 +2851,8 @@ debug_prog(INSTRUCTION *pc)
        for (cur_srcfile = srcfiles->prev; cur_srcfile != srcfiles;
                        cur_srcfile = cur_srcfile->prev) {
                if (cur_srcfile->stype == SRC_FILE
-                       || cur_srcfile->stype == SRC_INC)
+                       || cur_srcfile->stype == SRC_INC
+                       || cur_srcfile->stype == SRC_NSINC)
                        break;
        }
 
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 10c1f48c..abe262ec 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,7 @@
+2024-08-06         Arnold D. Robbins     <arnold@skeeve.com>
+
+       * gawk.texi, gawk.1, awkcard.in: Document @nsinclude.
+
 2024-08-05         Arnold D. Robbins     <arnold@skeeve.com>
 
        * gawk.texi: Small consistency fix.
diff --git a/doc/awkcard.in b/doc/awkcard.in
index 8a22e1c2..11168455 100644
--- a/doc/awkcard.in
+++ b/doc/awkcard.in
@@ -2,7 +2,7 @@
 .\"
 .\" Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 .\" 2005, 2007, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018,
-.\" 2019, 2020, 2021, 2022, 2023
+.\" 2019, 2020, 2021, 2022, 2023, 2024
 .\" Free Software Foundation, Inc.
 .\" 
 .\" Permission is granted to make and distribute verbatim copies of
@@ -100,7 +100,7 @@ Variables  5\*(CX
 \*(CD
 .SL
 .nf
-\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2023
+\*(FRCopyright \(co 1996\(en2005, 2007, 2009\(en2024
 Free Software Foundation, Inc.
 .nf
 .BT
@@ -441,6 +441,8 @@ pattern-action statements
 and optional function definitions.
 .sp .5
        \*(CB\*(FC@include "\*(FIfilename\*(FC"
+.br
+       \*(CB\*(FC@nsinclude "\*(FIfilename\*(FC"
 .br
        \*(FC@load "\*(FIfilename\*(FC"
 .br
@@ -450,20 +452,22 @@ and optional function definitions.
 .br
        \*(FCfunction \*(FIname\*(FC(\*(FIparameter list\*(FC) { 
\*(FIstatements\*(FC }\*(FR
 .sp .5
-\*(AK first reads the program source from the
+\*(AK reads the program source from the
 \*(FIprog-file\*(FR(s), if specified,
 \*(CBfrom arguments to \*(FC\-\^\-source\*(FR,\*(CD
-or from the first non-option argument on the command line.
-The program text is read as if all the \*(FIprog-file\*(FR(s)
+or from the first non-option argument.
+The program text is the concatenation of all the \*(FIprog-file\*(FR(s)
 \*(CBand command line
-source texts\*(CD had been concatenated.
+source texts\*(CD.
 .sp
 \*(CB\*(GK includes files named on \*(FC@include\*(FR lines.
 Nested includes are allowed.
+\*(FC@nsinclude\*(FR includes files but does not reset their
+namespace to \*(FCawk\*(FR.
 \*(GK loads extensions named on \*(FC@load\*(FR lines;
 see \fHDynamic Extensions\*(FR.\*(CD
 .sp .5
-AWK programs execute in the following order.
+AWK programs execute as follows:
 First, all variable assignments specified via the \*(FC\-v\fP
 option are performed.
 Next, \*(AK executes the code in the
@@ -474,7 +478,7 @@ If there are no files named on the command line,
 .sp .5
 A command line argument of the form
 \*(FIvar\*(FC=\*(FIval\*(FR,
-is treated as a variable assignment. The variable
+acts as a variable assignment. The variable
 \*(FIvar\fP is assigned the value \*(FIval\*(FR.
 (This happens after any \*(FCBEGIN\fP rule(s) have been run.)
 .sp .5
@@ -494,11 +498,11 @@ the \*(FIaction\*(FR associated with \*(FCENDFILE\fP 
after processing the file.\
 .sp .5
 For each record in the input, \*(AK tests to see if it matches any
 \*(FIpattern\fP in the AWK program.
-For each pattern that the record matches,
+For each match,
 it executes the associated \*(FIaction\fP.
-The patterns are tested in the order they occur in the program.
+Patterns are tested in the order they occur in the program.
 .sp .5
-Finally, after all the input is exhausted,
+Finally, after readnig all the input,
 \*(AK executes the code in the \*(FCEND\fP rule(s), if any.
 .sp .5
 If a program only has a \*(FCBEGIN\fP rule, no input files are processed.
@@ -2010,7 +2014,7 @@ maintains it.\*(CX
 .ES
 .fi
 \*(CDCopyright \(co 1996\(en2005,
-2007, 2009\(en2023 Free Software Foundation, Inc.
+2007, 2009\(en2024 Free Software Foundation, Inc.
 .sp .5   
 Permission is granted to make and distribute verbatim copies of this
 reference card provided the copyright notice and this permission notice
diff --git a/doc/gawk.1 b/doc/gawk.1
index 97cb4fab..c80e2746 100644
--- a/doc/gawk.1
+++ b/doc/gawk.1
@@ -13,7 +13,7 @@
 .              if \w'\(rq' .ds rq "\(rq
 .      \}
 .\}
-.TH GAWK 1 "Apr 24 2024" "Free Software Foundation" "Utility Commands"
+.TH GAWK 1 "Aug 02 2024" "Free Software Foundation" "Utility Commands"
 .SH NAME
 gawk \- pattern scanning and processing language
 .SH SYNOPSIS
@@ -379,6 +379,8 @@ and optional function definitions.
 .PP
 \fB@include "\fIfilename\^\fB"
 .br
+\fB@nsinclude "\fIfilename\^\fB"
+.br
 \fB@load "\fIfilename\^\fB"
 .br
 \fB@namespace "\fIname\^\fB"
@@ -415,6 +417,15 @@ to using the
 option.
 .PP
 Lines beginning with
+.B @nsinclude
+also include files, but with two differences.
+First, the namespace in the included file is
+.I not
+reset to the default of
+.BR awk ,
+and such files may be included multiple times.
+.PP
+Lines beginning with
 .B @load
 may be used to load extension functions into your program.  This is equivalent
 to using the
@@ -2272,7 +2283,9 @@ and
 .B \-\^\-include
 options, and the
 .B @include
-directive.  If the initial search fails, the path is searched again after
+and
+.B @nsinclude
+directives.  If the initial search fails, the path is searched again after
 appending
 .B \&.awk
 to the filename.
diff --git a/doc/gawk.info b/doc/gawk.info
index 644c33f4..4ddfc3a8 100644
--- a/doc/gawk.info
+++ b/doc/gawk.info
@@ -556,6 +556,8 @@ in (a) below.  A copy of the license is included in the 
section entitled
 * Naming Rules::                        Namespace and Component Naming Rules.
 * Internal Name Management::            How names are stored internally.
 * Namespace Example::                   An example of code using a namespace.
+* Inclusion For Namespaces::            Including a file without changing the
+                                        namespace.
 * Namespace And Features::              Namespaces and other ‘gawk’
                                         features.
 * Namespace Summary::                   Summarizing namespaces.
@@ -3365,7 +3367,8 @@ File: gawk.info,  Node: Include Files,  Next: Loading 
Shared Libraries,  Prev: E
 2.7 Including Other Files into Your Program
 ===========================================
 
-This minor node describes a feature that is specific to ‘gawk’.
+This minor node describes a feature that is specific to ‘gawk’.  It
+discusses how one source file may include another.
 
    The ‘@include’ keyword can be used to read external ‘awk’ source
 files.  This gives you the ability to split large ‘awk’ source files
@@ -3460,7 +3463,9 @@ Variable:: also apply to files loaded with ‘@include’.
 
    Finally, files included with ‘@include’ are treated as if they had
 ‘@namespace "awk"’ at their beginning.  *Note Changing The Namespace::,
-for more information.
+for more information.  However, there is a separate ‘@nsinclude’ command
+which does not change the namespace; see *note Inclusion For
+Namespaces::.
 
 
 File: gawk.info,  Node: Loading Shared Libraries,  Next: Obsolete,  Prev: 
Include Files,  Up: Invoking Gawk
@@ -24695,6 +24700,8 @@ This major node describes a feature that is specific to 
‘gawk’.
 * Naming Rules::                Namespace and Component Naming Rules.
 * Internal Name Management::    How names are stored internally.
 * Namespace Example::           An example of code using a namespace.
+* Inclusion For Namespaces::    Including a file without changing the
+                                namespace.
 * Namespace And Features::      Namespaces and other ‘gawk’ features.
 * Namespace Summary::           Summarizing namespaces.
 
@@ -24894,7 +24901,7 @@ For example:
      }
 
 
-File: gawk.info,  Node: Namespace Example,  Next: Namespace And Features,  
Prev: Internal Name Management,  Up: Namespaces
+File: gawk.info,  Node: Namespace Example,  Next: Inclusion For Namespaces,  
Prev: Internal Name Management,  Up: Namespaces
 
 15.7 Namespace Example
 ======================
@@ -24995,9 +25002,100 @@ unadorned identifiers are sought for in the ‘awk’ 
namespace:
      ...
 
 
-File: gawk.info,  Node: Namespace And Features,  Next: Namespace Summary,  
Prev: Namespace Example,  Up: Namespaces
+File: gawk.info,  Node: Inclusion For Namespaces,  Next: Namespace And 
Features,  Prev: Namespace Example,  Up: Namespaces
+
+15.8 Including A File Without Changing The Namespace
+====================================================
+
+As mentioned at the end of *note Include Files::, files included with
+‘@include’ are treated as if they had ‘@namespace "awk"’ at their
+beginning.  Sometimes, though, this behavior is undesirable.
+
+   Consider, for example, the case where you have some significant
+functions in one namespace:
+
+     @namespace "mylib"
+
+     function major_func1(a, b, c) { ... }
+     function major_func2(a, b, c) { ... }
+     ...
+
+From another namespace, you want to call these functions, frequently:
+
+     @namespace "myproj1"
+     function job1(a, b, c) {
+         ...
+         if (mylib::major_func1(a, b, c))
+             ...
+         else if (mylib::major_func2(a, b, c))
+             ...
+         ...
+     }
+     ... and so on ...
+
+Using the ‘mylib::’ prefix everywhere starts to get painful.
+
+   You might then try to write some “forwarding functions”, which you
+would ‘@include’ in each namespace.  For example, something like this in
+a file named ‘mylib_forward.awk’:
+
+     function major_func1(a, b, c)
+     {
+         return mylib::major_func1(a, b, c)
+     }
+
+     function major_func2(a, b, c)
+     {
+         return mylib::major_func2(a, b, c)
+     }
+
+   You might then try to ‘@include’ this file in each namespace:
+
+     @namespace "myproj1"
+     @include "mylib_forward.awk"
 
-15.8 Namespaces and Other ‘gawk’ Features
+     function job1(a, b, c) {
+         ...
+         if (major_func1(a, b, c))       # calls forwarding function
+             ...
+         else if (major_func2(a, b, c))  # ditto
+             ...
+         ...
+     }
+     ...
+
+     @namespace "myproj2"
+     @include "mylib_forward.awk"
+     ...
+
+But this won't work, since ‘@include’ resets the namespace to ‘awk’.
+
+   For this reason, ‘@nsinclude’ was added.  It works exactly the same
+as ‘@include’, but it does not change the namespace:
+
+     @namespace "myproj1"
+     @nsinclude "mylib_forward.awk"
+
+     function job1(a, b, c) {
+         ...
+         if (major_func1(a, b, c))       # calls forwarding function
+             ...
+         else if (major_func2(a, b, c))  # ditto
+             ...
+         ...
+     }
+     ...
+
+     @namespace "myproj2"
+     @nsinclude "mylib_forward.awk"
+     ...
+
+This will work the way we want it to.
+
+
+File: gawk.info,  Node: Namespace And Features,  Next: Namespace Summary,  
Prev: Inclusion For Namespaces,  Up: Namespaces
+
+15.9 Namespaces and Other ‘gawk’ Features
 =========================================
 
 This minor node looks briefly at how the namespace facility interacts
@@ -25027,8 +25125,8 @@ shared by cooperating ‘awk’ and C code.
 
 File: gawk.info,  Node: Namespace Summary,  Prev: Namespace And Features,  Up: 
Namespaces
 
-15.9 Summary
-============
+15.10 Summary
+=============
 
    • Standard ‘awk’ provides a single namespace for all global
      identifiers (scalars, arrays, and functions).  This is limiting
@@ -36353,13 +36451,15 @@ Index
 * {} (braces), statements, grouping:     Statements.          (line  10)
 * @ (at-sign), @-notation for indirect function calls: Indirect Calls.
                                                               (line  47)
-* @ (at-sign), @include directive:       Include Files.       (line   8)
+* @ (at-sign), @include directive:       Include Files.       (line   9)
 * @ (at-sign), @load directive:          Loading Shared Libraries.
                                                               (line   8)
 * @ (at-sign), @namespace directive:     Changing The Namespace.
                                                               (line   6)
 * @ (at-sign), @namespace directive, BEGIN, BEGINFILE, END, ENDFILE and: 
Changing The Namespace.
                                                               (line  37)
+* @ (at-sign), @nsinclude directive:     Inclusion For Namespaces.
+                                                              (line   6)
 * * (asterisk), * operator, as multiplication operator: Precedence.
                                                               (line  54)
 * * (asterisk), * operator, as regexp operator: Regexp Operator Details.
@@ -36685,13 +36785,15 @@ Index
 * asterisk (*), *= operator <1>:         Precedence.          (line  94)
 * at-sign (@), @-notation for indirect function calls: Indirect Calls.
                                                               (line  47)
-* at-sign (@), @include directive:       Include Files.       (line   8)
+* at-sign (@), @include directive:       Include Files.       (line   9)
 * at-sign (@), @load directive:          Loading Shared Libraries.
                                                               (line   8)
 * at-sign (@), @namespace directive:     Changing The Namespace.
                                                               (line   6)
 * at-sign (@), @namespace directive, BEGIN, BEGINFILE, END, ENDFILE and: 
Changing The Namespace.
                                                               (line  37)
+* at-sign (@), @nsinclude directive:     Inclusion For Namespaces.
+                                                              (line   6)
 * atan2:                                 Numeric Functions.   (line  11)
 * automatic displays, in debugger:       Debugger Info.       (line  24)
 * awf (amazingly workable formatter) program: Glossary.       (line  23)
@@ -36775,7 +36877,7 @@ Index
                                                               (line 186)
 * AWKLIBPATH environment variable <8>:   Shell Startup Files. (line   6)
 * AWKPATH environment variable:          AWKPATH Variable.    (line   6)
-* AWKPATH environment variable <1>:      Include Files.       (line   8)
+* AWKPATH environment variable <1>:      Include Files.       (line   9)
 * AWKPATH environment variable <2>:      Invoking Summary.    (line  49)
 * AWKPATH environment variable <3>:      Igawk Program.       (line  12)
 * AWKPATH environment variable <4>:      Igawk Program.       (line 211)
@@ -37651,7 +37753,7 @@ Index
                                                               (line 186)
 * environment variables, AWKLIBPATH <8>: Shell Startup Files. (line   6)
 * environment variables, AWKPATH:        AWKPATH Variable.    (line   6)
-* environment variables, AWKPATH <1>:    Include Files.       (line   8)
+* environment variables, AWKPATH <1>:    Include Files.       (line   9)
 * environment variables, AWKPATH <2>:    Invoking Summary.    (line  49)
 * environment variables, AWKPATH <3>:    Igawk Program.       (line  12)
 * environment variables, AWKPATH <4>:    Igawk Program.       (line 211)
@@ -37882,7 +37984,9 @@ Index
 * FIELDWIDTHS variable:                  Fixed width data.    (line  17)
 * FIELDWIDTHS variable <1>:              User-modified.       (line  37)
 * file descriptors:                      Special FD.          (line   6)
-* file inclusion, @include directive:    Include Files.       (line   8)
+* file inclusion, @include directive:    Include Files.       (line   9)
+* file inclusion, @nsinclude directive:  Inclusion For Namespaces.
+                                                              (line   6)
 * file names, assignments as:            Ignoring Assigns.    (line   6)
 * file names, distinguishing:            Auto-set.            (line  55)
 * file names, in compatibility mode:     Special Caveats.     (line   9)
@@ -38347,8 +38451,10 @@ Index
 * in operator, testing if array element exists: Reference to Elements.
                                                               (line  38)
 * in operator, use in loops:             Scanning an Array.   (line  17)
-* @include directive:                    Include Files.       (line   8)
-* including files, @include directive:   Include Files.       (line   8)
+* @include directive:                    Include Files.       (line   9)
+* including files, @include directive:   Include Files.       (line   9)
+* including files, @nsinclude directive: Inclusion For Namespaces.
+                                                              (line   6)
 * increment operators:                   Increment Ops.       (line   6)
 * index:                                 String Functions.    (line 174)
 * indexing arrays:                       Array Intro.         (line  51)
@@ -38718,6 +38824,8 @@ Index
 * NR variable:                           Records.             (line   6)
 * NR variable <1>:                       Auto-set.            (line 143)
 * NR variable, changing:                 Auto-set.            (line 415)
+* @nsinclude directive:                  Inclusion For Namespaces.
+                                                              (line   6)
 * null strings:                          awk split records.   (line 108)
 * null strings <1>:                      Regexp Field Splitting.
                                                               (line  42)
@@ -39892,628 +40000,629 @@ Index
 
 Tag Table:
 Node: Top1203
-Node: Foreword347032
-Node: Foreword451606
-Node: Preface53150
-Ref: Preface-Footnote-156136
-Ref: Preface-Footnote-256245
-Ref: Preface-Footnote-356479
-Node: History56625
-Node: Names59239
-Ref: Names-Footnote-160393
-Node: This Manual60556
-Ref: This Manual-Footnote-167486
-Node: Conventions67594
-Node: Manual History70023
-Ref: Manual History-Footnote-173048
-Ref: Manual History-Footnote-273089
-Node: How To Contribute73163
-Node: Acknowledgments74109
-Node: Getting Started79098
-Node: Running gawk81625
-Node: One-shot82843
-Node: Read Terminal84142
-Node: Long86196
-Node: Executable Scripts87846
-Ref: Executable Scripts-Footnote-190616
-Node: Comments90723
-Node: Quoting93253
-Node: DOS Quoting98897
-Node: Sample Data Files100977
-Node: Very Simple103612
-Node: Two Rules109866
-Node: More Complex111818
-Node: Statements/Lines114238
-Ref: Statements/Lines-Footnote-1119750
-Node: Other Features120039
-Node: When121007
-Ref: When-Footnote-1122809
-Node: Intro Summary122874
-Node: Invoking Gawk123828
-Node: Command Line125390
-Node: Options126240
-Ref: Options-Footnote-1145580
-Ref: Options-Footnote-2145815
-Node: Other Arguments145840
-Node: Naming Standard Input150005
-Node: Environment Variables151275
-Node: AWKPATH Variable151849
-Ref: AWKPATH Variable-Footnote-1155433
-Ref: AWKPATH Variable-Footnote-2155467
-Node: AWKLIBPATH Variable155858
-Ref: AWKLIBPATH Variable-Footnote-1157631
-Node: Other Environment Variables158026
-Node: Exit Status162502
-Node: Include Files163215
-Node: Loading Shared Libraries167267
-Node: Obsolete168757
-Node: Undocumented169505
-Node: Invoking Summary169802
-Node: Regexp172827
-Node: Regexp Usage174321
-Node: Escape Sequences176422
-Ref: Escape Sequences-Footnote-1183957
-Node: Regexp Operators184035
-Node: Regexp Operator Details184528
-Ref: Regexp Operator Details-Footnote-1192539
-Node: Interval Expressions192698
-Ref: Interval Expressions-Footnote-1194965
-Node: Bracket Expressions195063
-Ref: table-char-classes197619
-Node: Leftmost Longest201117
-Node: Computed Regexps202473
-Node: GNU Regexp Operators205988
-Node: Case-sensitivity211085
-Ref: Case-sensitivity-Footnote-1214035
-Ref: Case-sensitivity-Footnote-2214278
-Node: Regexp Summary214390
-Node: Reading Files215912
-Node: Records218231
-Node: awk split records219506
-Node: gawk split records224388
-Ref: gawk split records-Footnote-1229676
-Node: Fields229713
-Ref: Fields-Footnote-1232629
-Node: Nonconstant Fields232749
-Ref: Nonconstant Fields-Footnote-1235057
-Node: Changing Fields235273
-Node: Field Separators241571
-Node: Default Field Splitting244440
-Node: Regexp Field Splitting245582
-Node: Single Character Fields249411
-Node: Comma Separated Fields250500
-Ref: table-csv-examples251904
-Node: Command Line Field Separator254203
-Node: Full Line Fields257579
-Ref: Full Line Fields-Footnote-1259157
-Ref: Full Line Fields-Footnote-2259203
-Node: Field Splitting Summary259308
-Node: Constant Size261625
-Node: Fixed width data262369
-Node: Skipping intervening265884
-Node: Allowing trailing data266686
-Node: Fields with fixed data267747
-Node: Splitting By Content269369
-Ref: Splitting By Content-Footnote-1273819
-Node: More CSV273982
-Node: FS versus FPAT275640
-Node: Testing field creation276840
-Node: Multiple Line278614
-Node: Getline285083
-Node: Plain Getline287671
-Node: Getline/Variable290319
-Node: Getline/File291515
-Node: Getline/Variable/File292963
-Ref: Getline/Variable/File-Footnote-1294608
-Node: Getline/Pipe294704
-Node: Getline/Variable/Pipe297512
-Node: Getline/Coprocess298695
-Node: Getline/Variable/Coprocess300018
-Node: Getline Notes300784
-Node: Getline Summary304761
-Ref: table-getline-variants305205
-Node: Read Timeout306109
-Ref: Read Timeout-Footnote-1310071
-Node: Retrying Input310129
-Node: Command-line directories311396
-Node: Input Summary312334
-Node: Input Exercises315714
-Node: Printing316152
-Node: Print318095
-Node: Print Examples319596
-Node: Output Separators322441
-Node: OFMT324548
-Node: Printf326261
-Node: Basic Printf327066
-Node: Control Letters328701
-Node: Format Modifiers334147
-Node: Printf Examples340419
-Node: Redirection342960
-Node: Special FD350732
-Ref: Special FD-Footnote-1354030
-Node: Special Files354108
-Node: Other Inherited Files354737
-Node: Special Network355802
-Node: Special Caveats356690
-Node: Close Files And Pipes357673
-Ref: Close Files And Pipes-Footnote-1363797
-Node: Close Return Value363945
-Ref: table-close-pipe-return-values365216
-Ref: Close Return Value-Footnote-1366047
-Node: Noflush366203
-Node: Nonfatal367711
-Node: Output Summary370126
-Node: Output Exercises371412
-Node: Expressions372103
-Node: Values373303
-Node: Constants373981
-Node: Scalar Constants374676
-Ref: Scalar Constants-Footnote-1377252
-Ref: Scalar Constants-Footnote-2377502
-Node: Nondecimal-numbers377582
-Node: Regexp Constants380695
-Node: Using Constant Regexps381241
-Node: Standard Regexp Constants381887
-Node: Strong Regexp Constants385183
-Node: Variables389026
-Node: Using Variables389691
-Node: Assignment Options391665
-Node: Conversion394216
-Node: Strings And Numbers394748
-Ref: Strings And Numbers-Footnote-1397958
-Node: Locale influences conversions398067
-Ref: table-locale-affects400905
-Node: All Operators401547
-Node: Arithmetic Ops402188
-Node: Concatenation405011
-Ref: Concatenation-Footnote-1407947
-Node: Assignment Ops408066
-Ref: table-assign-ops413193
-Node: Increment Ops414574
-Node: Truth Values and Conditions418165
-Node: Truth Values419259
-Node: Typing and Comparison420339
-Node: Variable Typing421171
-Ref: Variable Typing-Footnote-1427815
-Ref: Variable Typing-Footnote-2427895
-Node: Comparison Operators427976
-Ref: table-relational-ops428403
-Node: POSIX String Comparison432079
-Ref: POSIX String Comparison-Footnote-1433836
-Ref: POSIX String Comparison-Footnote-2433979
-Node: Boolean Ops434063
-Ref: Boolean Ops-Footnote-1438737
-Node: Conditional Exp438833
-Node: Function Calls440613
-Node: Precedence444560
-Node: Locales448423
-Node: Expressions Summary450099
-Node: Patterns and Actions452754
-Node: Pattern Overview453890
-Node: Regexp Patterns455615
-Node: Expression Patterns456161
-Node: Ranges460066
-Node: BEGIN/END463240
-Node: Using BEGIN/END464049
-Ref: Using BEGIN/END-Footnote-1466957
-Node: I/O And BEGIN/END467067
-Node: BEGINFILE/ENDFILE469549
-Node: Empty472979
-Node: Using Shell Variables473296
-Node: Action Overview475632
-Node: Statements478068
-Node: If Statement479964
-Node: While Statement481527
-Node: Do Statement483615
-Node: For Statement484799
-Node: Switch Statement488154
-Node: Break Statement490703
-Node: Continue Statement492895
-Node: Next Statement494826
-Node: Nextfile Statement497305
-Node: Exit Statement500158
-Node: Built-in Variables502685
-Node: User-modified503862
-Node: Auto-set512069
-Ref: Auto-set-Footnote-1530153
-Ref: Auto-set-Footnote-2530371
-Node: ARGC and ARGV530427
-Node: Pattern Action Summary534856
-Node: Arrays537462
-Node: Array Basics538835
-Node: Array Intro539683
-Ref: figure-array-elements541694
-Ref: Array Intro-Footnote-1544547
-Node: Reference to Elements544679
-Node: Assigning Elements547199
-Node: Array Example547694
-Node: Scanning an Array549656
-Node: Controlling Scanning552751
-Ref: Controlling Scanning-Footnote-1559386
-Node: Numeric Array Subscripts559710
-Node: Uninitialized Subscripts561978
-Node: Delete563651
-Ref: Delete-Footnote-1566463
-Node: Multidimensional566520
-Node: Multiscanning569723
-Node: Arrays of Arrays571390
-Node: Arrays Summary575694
-Node: Functions577881
-Node: Built-in579013
-Node: Calling Built-in580202
-Node: Boolean Functions582242
-Node: Numeric Functions582804
-Ref: Numeric Functions-Footnote-1586989
-Ref: Numeric Functions-Footnote-2587672
-Ref: Numeric Functions-Footnote-3587724
-Node: String Functions588000
-Ref: String Functions-Footnote-1614451
-Ref: String Functions-Footnote-2614583
-Ref: String Functions-Footnote-3614839
-Node: Gory Details614926
-Ref: table-sub-escapes616935
-Ref: table-sub-proposed618566
-Ref: table-posix-sub620061
-Ref: table-gensub-escapes621734
-Ref: Gory Details-Footnote-1622653
-Node: I/O Functions622807
-Ref: table-system-return-values629483
-Ref: I/O Functions-Footnote-1631645
-Ref: I/O Functions-Footnote-2631793
-Node: Time Functions631913
-Ref: Time Functions-Footnote-1643625
-Ref: Time Functions-Footnote-2643693
-Ref: Time Functions-Footnote-3643855
-Ref: Time Functions-Footnote-4643966
-Ref: Time Functions-Footnote-5644082
-Ref: Time Functions-Footnote-6644309
-Node: Bitwise Functions644587
-Ref: table-bitwise-ops645185
-Ref: Bitwise Functions-Footnote-1651427
-Ref: Bitwise Functions-Footnote-2651604
-Node: Type Functions651799
-Node: I18N Functions653970
-Node: User-defined655705
-Node: Definition Syntax656451
-Ref: Definition Syntax-Footnote-1662269
-Node: Function Example662344
-Ref: Function Example-Footnote-1665323
-Node: Function Calling665345
-Node: Calling A Function665937
-Node: Variable Scope666907
-Node: Pass By Value/Reference669961
-Node: Function Caveats672689
-Ref: Function Caveats-Footnote-1674780
-Node: Return Statement674900
-Node: Dynamic Typing677932
-Node: Dynamic Typing Awk678510
-Node: Dynamic Typing Gawk680648
-Node: Indirect Calls684018
-Node: Functions Summary695155
-Node: Library Functions698121
-Ref: Library Functions-Footnote-1701669
-Ref: Library Functions-Footnote-2701814
-Node: Library Names701989
-Ref: Library Names-Footnote-1705760
-Ref: Library Names-Footnote-2705987
-Node: General Functions706081
-Node: Strtonum Function707351
-Node: Assert Function710433
-Node: Round Function713883
-Node: Cliff Random Function715455
-Node: Ordinal Functions716479
-Ref: Ordinal Functions-Footnote-1719582
-Ref: Ordinal Functions-Footnote-2719834
-Node: Join Function720048
-Ref: Join Function-Footnote-1721846
-Node: Getlocaltime Function722050
-Node: Readfile Function725824
-Node: Shell Quoting727853
-Node: Isnumeric Function729309
-Node: To CSV Function730745
-Node: Data File Management732837
-Node: Filetrans Function733469
-Node: Rewind Function737745
-Node: File Checking739716
-Ref: File Checking-Footnote-1741082
-Node: Empty Files741287
-Node: Ignoring Assigns743350
-Node: Getopt Function744924
-Ref: Getopt Function-Footnote-1760742
-Node: Passwd Functions760954
-Ref: Passwd Functions-Footnote-1770089
-Node: Group Functions770177
-Ref: Group Functions-Footnote-1778301
-Node: Walking Arrays778512
-Node: Library Functions Summary781558
-Node: Library Exercises782978
-Node: Sample Programs783463
-Node: Running Examples784245
-Node: Clones784997
-Node: Cut Program786265
-Node: Egrep Program796689
-Node: Id Program805994
-Node: Split Program816086
-Ref: Split Program-Footnote-1826299
-Node: Tee Program826484
-Node: Uniq Program829390
-Node: Wc Program837250
-Node: Bytes vs. Characters837645
-Node: Using extensions839245
-Node: wc program840023
-Node: Miscellaneous Programs845016
-Node: Dupword Program846241
-Node: Alarm Program848290
-Node: Translate Program853193
-Ref: Translate Program-Footnote-1857902
-Node: Labels Program858180
-Ref: Labels Program-Footnote-1861615
-Node: Word Sorting861699
-Node: History Sorting865873
-Node: Extract Program868146
-Node: Simple Sed876399
-Node: Igawk Program879609
-Ref: Igawk Program-Footnote-1894819
-Ref: Igawk Program-Footnote-2895025
-Ref: Igawk Program-Footnote-3895155
-Node: Anagram Program895282
-Node: Signature Program898368
-Node: Programs Summary899618
-Node: Programs Exercises900872
-Ref: Programs Exercises-Footnote-1905174
-Node: Advanced Features905260
-Node: Nondecimal Data907741
-Node: Boolean Typed Values909371
-Node: Array Sorting911328
-Node: Controlling Array Traversal912057
-Ref: Controlling Array Traversal-Footnote-1920560
-Node: Array Sorting Functions920682
-Ref: Array Sorting Functions-Footnote-1926779
-Node: Two-way I/O926987
-Ref: Two-way I/O-Footnote-1934958
-Ref: Two-way I/O-Footnote-2935149
-Node: TCP/IP Networking935231
-Node: Profiling938399
-Node: Persistent Memory948069
-Ref: Persistent Memory-Footnote-1957641
-Node: Extension Philosophy957772
-Node: Advanced Features Summary959299
-Node: Internationalization961565
-Node: I18N and L10N963267
-Node: Explaining gettext963962
-Ref: Explaining gettext-Footnote-1970098
-Ref: Explaining gettext-Footnote-2970291
-Node: Programmer i18n970456
-Ref: Programmer i18n-Footnote-1975568
-Node: Translator i18n975617
-Node: String Extraction976447
-Ref: String Extraction-Footnote-1977623
-Node: Printf Ordering977721
-Ref: Printf Ordering-Footnote-1980579
-Node: I18N Portability980647
-Ref: I18N Portability-Footnote-1983207
-Node: I18N Example983274
-Ref: I18N Example-Footnote-1986668
-Ref: I18N Example-Footnote-2986741
-Node: Gawk I18N986858
-Node: I18N Summary987512
-Node: Debugger988909
-Node: Debugging989929
-Node: Debugging Concepts990378
-Node: Debugging Terms992195
-Node: Awk Debugging994798
-Ref: Awk Debugging-Footnote-1995771
-Node: Sample Debugging Session995907
-Node: Debugger Invocation996457
-Node: Finding The Bug998082
-Node: List of Debugger Commands1004714
-Node: Breakpoint Control1006091
-Node: Debugger Execution Control1009913
-Node: Viewing And Changing Data1013387
-Node: Execution Stack1017121
-Node: Debugger Info1018802
-Node: Miscellaneous Debugger Commands1023097
-Node: Readline Support1028338
-Node: Limitations1029282
-Node: Debugging Summary1031906
-Node: Namespaces1033205
-Node: Global Namespace1034332
-Node: Qualified Names1035766
-Node: Default Namespace1036801
-Node: Changing The Namespace1037574
-Node: Naming Rules1039256
-Node: Internal Name Management1041211
-Node: Namespace Example1042281
-Node: Namespace And Features1044858
-Node: Namespace Summary1046313
-Node: Arbitrary Precision Arithmetic1047824
-Node: Computer Arithmetic1049343
-Ref: table-numeric-ranges1053268
-Ref: table-floating-point-ranges1053765
-Ref: Computer Arithmetic-Footnote-11054423
-Node: Math Definitions1054480
-Ref: table-ieee-formats1057512
-Node: MPFR features1058085
-Node: MPFR On Parole1058538
-Ref: MPFR On Parole-Footnote-11059379
-Node: MPFR Intro1059538
-Node: FP Math Caution1061222
-Ref: FP Math Caution-Footnote-11062294
-Node: Inexactness of computations1062667
-Node: Inexact representation1063698
-Node: Comparing FP Values1065079
-Node: Errors accumulate1066337
-Node: Strange values1067802
-Ref: Strange values-Footnote-11070456
-Node: Getting Accuracy1070561
-Node: Try To Round1073298
-Node: Setting precision1074205
-Ref: table-predefined-precision-strings1074910
-Node: Setting the rounding mode1076794
-Ref: table-gawk-rounding-modes1077176
-Ref: Setting the rounding mode-Footnote-11081228
-Node: Arbitrary Precision Integers1081411
-Ref: Arbitrary Precision Integers-Footnote-11084621
-Node: Checking for MPFR1084774
-Node: POSIX Floating Point Problems1086264
-Ref: POSIX Floating Point Problems-Footnote-11091084
-Node: Floating point summary1091122
-Node: Dynamic Extensions1093378
-Node: Extension Intro1094975
-Node: Plugin License1096277
-Node: Extension Mechanism Outline1097090
-Ref: figure-load-extension1097541
-Ref: figure-register-new-function1099119
-Ref: figure-call-new-function1100228
-Node: Extension API Description1102343
-Node: Extension API Functions Introduction1104072
-Ref: table-api-std-headers1105966
-Node: General Data Types1110407
-Ref: General Data Types-Footnote-11119553
-Node: Memory Allocation Functions1119856
-Ref: Memory Allocation Functions-Footnote-11124573
-Node: Constructor Functions1124672
-Node: API Ownership of MPFR and GMP Values1128573
-Node: Registration Functions1130126
-Node: Extension Functions1130830
-Node: Exit Callback Functions1136404
-Node: Extension Version String1137718
-Node: Input Parsers1138413
-Node: Output Wrappers1153032
-Node: Two-way processors1157874
-Node: Printing Messages1160227
-Ref: Printing Messages-Footnote-11161438
-Node: Updating ERRNO1161591
-Node: Requesting Values1162390
-Ref: table-value-types-returned1163143
-Node: Accessing Parameters1165202
-Node: Symbol Table Access1166483
-Node: Symbol table by name1166995
-Ref: Symbol table by name-Footnote-11170196
-Node: Symbol table by cookie1170328
-Ref: Symbol table by cookie-Footnote-11174597
-Node: Cached values1174661
-Ref: Cached values-Footnote-11178293
-Node: Array Manipulation1178450
-Ref: Array Manipulation-Footnote-11179549
-Node: Array Data Types1179586
-Ref: Array Data Types-Footnote-11182404
-Node: Array Functions1182500
-Node: Flattening Arrays1187529
-Node: Creating Arrays1194577
-Node: Redirection API1199419
-Node: Extension API Variables1202436
-Node: Extension Versioning1203159
-Ref: gawk-api-version1203588
-Node: Extension GMP/MPFR Versioning1205375
-Node: Extension API Informational Variables1207079
-Node: Extension API Boilerplate1208332
-Node: Changes from API V11212462
-Node: Finding Extensions1214094
-Node: Extension Example1214669
-Node: Internal File Description1215491
-Node: Internal File Ops1219783
-Ref: Internal File Ops-Footnote-11231333
-Node: Using Internal File Ops1231481
-Ref: Using Internal File Ops-Footnote-11233912
-Node: Extension Samples1234190
-Node: Extension Sample File Functions1235759
-Node: Extension Sample Fnmatch1243884
-Node: Extension Sample Fork1245479
-Node: Extension Sample Inplace1246755
-Node: Extension Sample Ord1250857
-Node: Extension Sample Readdir1251733
-Ref: table-readdir-file-types1252522
-Node: Extension Sample Revout1253878
-Node: Extension Sample Rev2way1254475
-Node: Extension Sample Read write array1255227
-Node: Extension Sample Readfile1258501
-Node: Extension Sample Time1259632
-Node: Extension Sample API Tests1261632
-Node: gawkextlib1262140
-Node: Extension summary1265172
-Node: Extension Exercises1269020
-Node: Language History1270290
-Node: V7/SVR3.11272002
-Node: SVR41274352
-Node: POSIX1275884
-Node: BTL1277309
-Node: POSIX/GNU1278076
-Ref: Gawk Extension Functions1281466
-Node: Feature History1284890
-Node: Common Extensions1304731
-Node: Ranges and Locales1306206
-Ref: Ranges and Locales-Footnote-11310991
-Ref: Ranges and Locales-Footnote-21311018
-Ref: Ranges and Locales-Footnote-31311253
-Node: Contributors1311476
-Node: History summary1317667
-Node: Installation1319109
-Node: Gawk Distribution1320073
-Node: Getting1320565
-Node: Extracting1321564
-Node: Distribution contents1323270
-Node: Unix Installation1331160
-Node: Quick Installation1331980
-Node: Compiling with MPFR1334520
-Node: Shell Startup Files1335226
-Node: Additional Configuration Options1336383
-Node: Configuration Philosophy1338766
-Node: Compiling from Git1341266
-Node: Building the Documentation1341825
-Node: Non-Unix Installation1343237
-Node: PC Installation1343713
-Node: PC Binary Installation1344582
-Node: PC Compiling1345475
-Node: PC Using1346653
-Node: Cygwin1350369
-Node: MSYS1351621
-Node: OpenVMS Installation1352247
-Node: OpenVMS Compilation1352928
-Ref: OpenVMS Compilation-Footnote-11354411
-Node: OpenVMS Dynamic Extensions1354469
-Node: OpenVMS Installation Details1356105
-Node: OpenVMS Running1358536
-Node: OpenVMS GNV1362673
-Node: Bugs1363428
-Node: Bug definition1364348
-Node: Bug address1367949
-Node: Usenet1371518
-Node: Performance bugs1372731
-Node: Asking for help1375735
-Node: Maintainers1377722
-Node: Other Versions1378749
-Node: Installation summary1388353
-Node: Notes1389735
-Node: Compatibility Mode1390545
-Node: Additions1391367
-Node: Accessing The Source1392312
-Node: Adding Code1393843
-Node: New Ports1400954
-Node: Derived Files1405457
-Ref: Derived Files-Footnote-11411268
-Ref: Derived Files-Footnote-21411303
-Ref: Derived Files-Footnote-31411914
-Node: Future Extensions1412028
-Node: Implementation Limitations1412698
-Node: Extension Design1413940
-Node: Old Extension Problems1415100
-Ref: Old Extension Problems-Footnote-11416672
-Node: Extension New Mechanism Goals1416733
-Ref: Extension New Mechanism Goals-Footnote-11420203
-Node: Extension Other Design Decisions1420404
-Node: Extension Future Growth1422601
-Node: Notes summary1423221
-Node: Basic Concepts1424431
-Node: Basic High Level1425116
-Ref: figure-general-flow1425398
-Ref: figure-process-flow1426100
-Ref: Basic High Level-Footnote-11429470
-Node: Basic Data Typing1429659
-Node: Glossary1433067
-Node: Copying1465945
-Node: GNU Free Documentation License1503503
-Node: Index1528626
+Node: Foreword347161
+Node: Foreword451735
+Node: Preface53279
+Ref: Preface-Footnote-156265
+Ref: Preface-Footnote-256374
+Ref: Preface-Footnote-356608
+Node: History56754
+Node: Names59368
+Ref: Names-Footnote-160522
+Node: This Manual60685
+Ref: This Manual-Footnote-167615
+Node: Conventions67723
+Node: Manual History70152
+Ref: Manual History-Footnote-173177
+Ref: Manual History-Footnote-273218
+Node: How To Contribute73292
+Node: Acknowledgments74238
+Node: Getting Started79227
+Node: Running gawk81754
+Node: One-shot82972
+Node: Read Terminal84271
+Node: Long86325
+Node: Executable Scripts87975
+Ref: Executable Scripts-Footnote-190745
+Node: Comments90852
+Node: Quoting93382
+Node: DOS Quoting99026
+Node: Sample Data Files101106
+Node: Very Simple103741
+Node: Two Rules109995
+Node: More Complex111947
+Node: Statements/Lines114367
+Ref: Statements/Lines-Footnote-1119879
+Node: Other Features120168
+Node: When121136
+Ref: When-Footnote-1122938
+Node: Intro Summary123003
+Node: Invoking Gawk123957
+Node: Command Line125519
+Node: Options126369
+Ref: Options-Footnote-1145709
+Ref: Options-Footnote-2145944
+Node: Other Arguments145969
+Node: Naming Standard Input150134
+Node: Environment Variables151404
+Node: AWKPATH Variable151978
+Ref: AWKPATH Variable-Footnote-1155562
+Ref: AWKPATH Variable-Footnote-2155596
+Node: AWKLIBPATH Variable155987
+Ref: AWKLIBPATH Variable-Footnote-1157760
+Node: Other Environment Variables158155
+Node: Exit Status162631
+Node: Include Files163344
+Node: Loading Shared Libraries167581
+Node: Obsolete169071
+Node: Undocumented169819
+Node: Invoking Summary170116
+Node: Regexp173141
+Node: Regexp Usage174635
+Node: Escape Sequences176736
+Ref: Escape Sequences-Footnote-1184271
+Node: Regexp Operators184349
+Node: Regexp Operator Details184842
+Ref: Regexp Operator Details-Footnote-1192853
+Node: Interval Expressions193012
+Ref: Interval Expressions-Footnote-1195279
+Node: Bracket Expressions195377
+Ref: table-char-classes197933
+Node: Leftmost Longest201431
+Node: Computed Regexps202787
+Node: GNU Regexp Operators206302
+Node: Case-sensitivity211399
+Ref: Case-sensitivity-Footnote-1214349
+Ref: Case-sensitivity-Footnote-2214592
+Node: Regexp Summary214704
+Node: Reading Files216226
+Node: Records218545
+Node: awk split records219820
+Node: gawk split records224702
+Ref: gawk split records-Footnote-1229990
+Node: Fields230027
+Ref: Fields-Footnote-1232943
+Node: Nonconstant Fields233063
+Ref: Nonconstant Fields-Footnote-1235371
+Node: Changing Fields235587
+Node: Field Separators241885
+Node: Default Field Splitting244754
+Node: Regexp Field Splitting245896
+Node: Single Character Fields249725
+Node: Comma Separated Fields250814
+Ref: table-csv-examples252218
+Node: Command Line Field Separator254517
+Node: Full Line Fields257893
+Ref: Full Line Fields-Footnote-1259471
+Ref: Full Line Fields-Footnote-2259517
+Node: Field Splitting Summary259622
+Node: Constant Size261939
+Node: Fixed width data262683
+Node: Skipping intervening266198
+Node: Allowing trailing data267000
+Node: Fields with fixed data268061
+Node: Splitting By Content269683
+Ref: Splitting By Content-Footnote-1274133
+Node: More CSV274296
+Node: FS versus FPAT275954
+Node: Testing field creation277154
+Node: Multiple Line278928
+Node: Getline285397
+Node: Plain Getline287985
+Node: Getline/Variable290633
+Node: Getline/File291829
+Node: Getline/Variable/File293277
+Ref: Getline/Variable/File-Footnote-1294922
+Node: Getline/Pipe295018
+Node: Getline/Variable/Pipe297826
+Node: Getline/Coprocess299009
+Node: Getline/Variable/Coprocess300332
+Node: Getline Notes301098
+Node: Getline Summary305075
+Ref: table-getline-variants305519
+Node: Read Timeout306423
+Ref: Read Timeout-Footnote-1310385
+Node: Retrying Input310443
+Node: Command-line directories311710
+Node: Input Summary312648
+Node: Input Exercises316028
+Node: Printing316466
+Node: Print318409
+Node: Print Examples319910
+Node: Output Separators322755
+Node: OFMT324862
+Node: Printf326575
+Node: Basic Printf327380
+Node: Control Letters329015
+Node: Format Modifiers334461
+Node: Printf Examples340733
+Node: Redirection343274
+Node: Special FD351046
+Ref: Special FD-Footnote-1354344
+Node: Special Files354422
+Node: Other Inherited Files355051
+Node: Special Network356116
+Node: Special Caveats357004
+Node: Close Files And Pipes357987
+Ref: Close Files And Pipes-Footnote-1364111
+Node: Close Return Value364259
+Ref: table-close-pipe-return-values365530
+Ref: Close Return Value-Footnote-1366361
+Node: Noflush366517
+Node: Nonfatal368025
+Node: Output Summary370440
+Node: Output Exercises371726
+Node: Expressions372417
+Node: Values373617
+Node: Constants374295
+Node: Scalar Constants374990
+Ref: Scalar Constants-Footnote-1377566
+Ref: Scalar Constants-Footnote-2377816
+Node: Nondecimal-numbers377896
+Node: Regexp Constants381009
+Node: Using Constant Regexps381555
+Node: Standard Regexp Constants382201
+Node: Strong Regexp Constants385497
+Node: Variables389340
+Node: Using Variables390005
+Node: Assignment Options391979
+Node: Conversion394530
+Node: Strings And Numbers395062
+Ref: Strings And Numbers-Footnote-1398272
+Node: Locale influences conversions398381
+Ref: table-locale-affects401219
+Node: All Operators401861
+Node: Arithmetic Ops402502
+Node: Concatenation405325
+Ref: Concatenation-Footnote-1408261
+Node: Assignment Ops408380
+Ref: table-assign-ops413507
+Node: Increment Ops414888
+Node: Truth Values and Conditions418479
+Node: Truth Values419573
+Node: Typing and Comparison420653
+Node: Variable Typing421485
+Ref: Variable Typing-Footnote-1428129
+Ref: Variable Typing-Footnote-2428209
+Node: Comparison Operators428290
+Ref: table-relational-ops428717
+Node: POSIX String Comparison432393
+Ref: POSIX String Comparison-Footnote-1434150
+Ref: POSIX String Comparison-Footnote-2434293
+Node: Boolean Ops434377
+Ref: Boolean Ops-Footnote-1439051
+Node: Conditional Exp439147
+Node: Function Calls440927
+Node: Precedence444874
+Node: Locales448737
+Node: Expressions Summary450413
+Node: Patterns and Actions453068
+Node: Pattern Overview454204
+Node: Regexp Patterns455929
+Node: Expression Patterns456475
+Node: Ranges460380
+Node: BEGIN/END463554
+Node: Using BEGIN/END464363
+Ref: Using BEGIN/END-Footnote-1467271
+Node: I/O And BEGIN/END467381
+Node: BEGINFILE/ENDFILE469863
+Node: Empty473293
+Node: Using Shell Variables473610
+Node: Action Overview475946
+Node: Statements478382
+Node: If Statement480278
+Node: While Statement481841
+Node: Do Statement483929
+Node: For Statement485113
+Node: Switch Statement488468
+Node: Break Statement491017
+Node: Continue Statement493209
+Node: Next Statement495140
+Node: Nextfile Statement497619
+Node: Exit Statement500472
+Node: Built-in Variables502999
+Node: User-modified504176
+Node: Auto-set512383
+Ref: Auto-set-Footnote-1530467
+Ref: Auto-set-Footnote-2530685
+Node: ARGC and ARGV530741
+Node: Pattern Action Summary535170
+Node: Arrays537776
+Node: Array Basics539149
+Node: Array Intro539997
+Ref: figure-array-elements542008
+Ref: Array Intro-Footnote-1544861
+Node: Reference to Elements544993
+Node: Assigning Elements547513
+Node: Array Example548008
+Node: Scanning an Array549970
+Node: Controlling Scanning553065
+Ref: Controlling Scanning-Footnote-1559700
+Node: Numeric Array Subscripts560024
+Node: Uninitialized Subscripts562292
+Node: Delete563965
+Ref: Delete-Footnote-1566777
+Node: Multidimensional566834
+Node: Multiscanning570037
+Node: Arrays of Arrays571704
+Node: Arrays Summary576008
+Node: Functions578195
+Node: Built-in579327
+Node: Calling Built-in580516
+Node: Boolean Functions582556
+Node: Numeric Functions583118
+Ref: Numeric Functions-Footnote-1587303
+Ref: Numeric Functions-Footnote-2587986
+Ref: Numeric Functions-Footnote-3588038
+Node: String Functions588314
+Ref: String Functions-Footnote-1614765
+Ref: String Functions-Footnote-2614897
+Ref: String Functions-Footnote-3615153
+Node: Gory Details615240
+Ref: table-sub-escapes617249
+Ref: table-sub-proposed618880
+Ref: table-posix-sub620375
+Ref: table-gensub-escapes622048
+Ref: Gory Details-Footnote-1622967
+Node: I/O Functions623121
+Ref: table-system-return-values629797
+Ref: I/O Functions-Footnote-1631959
+Ref: I/O Functions-Footnote-2632107
+Node: Time Functions632227
+Ref: Time Functions-Footnote-1643939
+Ref: Time Functions-Footnote-2644007
+Ref: Time Functions-Footnote-3644169
+Ref: Time Functions-Footnote-4644280
+Ref: Time Functions-Footnote-5644396
+Ref: Time Functions-Footnote-6644623
+Node: Bitwise Functions644901
+Ref: table-bitwise-ops645499
+Ref: Bitwise Functions-Footnote-1651741
+Ref: Bitwise Functions-Footnote-2651918
+Node: Type Functions652113
+Node: I18N Functions654284
+Node: User-defined656019
+Node: Definition Syntax656765
+Ref: Definition Syntax-Footnote-1662583
+Node: Function Example662658
+Ref: Function Example-Footnote-1665637
+Node: Function Calling665659
+Node: Calling A Function666251
+Node: Variable Scope667221
+Node: Pass By Value/Reference670275
+Node: Function Caveats673003
+Ref: Function Caveats-Footnote-1675094
+Node: Return Statement675214
+Node: Dynamic Typing678246
+Node: Dynamic Typing Awk678824
+Node: Dynamic Typing Gawk680962
+Node: Indirect Calls684332
+Node: Functions Summary695469
+Node: Library Functions698435
+Ref: Library Functions-Footnote-1701983
+Ref: Library Functions-Footnote-2702128
+Node: Library Names702303
+Ref: Library Names-Footnote-1706074
+Ref: Library Names-Footnote-2706301
+Node: General Functions706395
+Node: Strtonum Function707665
+Node: Assert Function710747
+Node: Round Function714197
+Node: Cliff Random Function715769
+Node: Ordinal Functions716793
+Ref: Ordinal Functions-Footnote-1719896
+Ref: Ordinal Functions-Footnote-2720148
+Node: Join Function720362
+Ref: Join Function-Footnote-1722160
+Node: Getlocaltime Function722364
+Node: Readfile Function726138
+Node: Shell Quoting728167
+Node: Isnumeric Function729623
+Node: To CSV Function731059
+Node: Data File Management733151
+Node: Filetrans Function733783
+Node: Rewind Function738059
+Node: File Checking740030
+Ref: File Checking-Footnote-1741396
+Node: Empty Files741601
+Node: Ignoring Assigns743664
+Node: Getopt Function745238
+Ref: Getopt Function-Footnote-1761056
+Node: Passwd Functions761268
+Ref: Passwd Functions-Footnote-1770403
+Node: Group Functions770491
+Ref: Group Functions-Footnote-1778615
+Node: Walking Arrays778826
+Node: Library Functions Summary781872
+Node: Library Exercises783292
+Node: Sample Programs783777
+Node: Running Examples784559
+Node: Clones785311
+Node: Cut Program786579
+Node: Egrep Program797003
+Node: Id Program806308
+Node: Split Program816400
+Ref: Split Program-Footnote-1826613
+Node: Tee Program826798
+Node: Uniq Program829704
+Node: Wc Program837564
+Node: Bytes vs. Characters837959
+Node: Using extensions839559
+Node: wc program840337
+Node: Miscellaneous Programs845330
+Node: Dupword Program846555
+Node: Alarm Program848604
+Node: Translate Program853507
+Ref: Translate Program-Footnote-1858216
+Node: Labels Program858494
+Ref: Labels Program-Footnote-1861929
+Node: Word Sorting862013
+Node: History Sorting866187
+Node: Extract Program868460
+Node: Simple Sed876713
+Node: Igawk Program879923
+Ref: Igawk Program-Footnote-1895133
+Ref: Igawk Program-Footnote-2895339
+Ref: Igawk Program-Footnote-3895469
+Node: Anagram Program895596
+Node: Signature Program898682
+Node: Programs Summary899932
+Node: Programs Exercises901186
+Ref: Programs Exercises-Footnote-1905488
+Node: Advanced Features905574
+Node: Nondecimal Data908055
+Node: Boolean Typed Values909685
+Node: Array Sorting911642
+Node: Controlling Array Traversal912371
+Ref: Controlling Array Traversal-Footnote-1920874
+Node: Array Sorting Functions920996
+Ref: Array Sorting Functions-Footnote-1927093
+Node: Two-way I/O927301
+Ref: Two-way I/O-Footnote-1935272
+Ref: Two-way I/O-Footnote-2935463
+Node: TCP/IP Networking935545
+Node: Profiling938713
+Node: Persistent Memory948383
+Ref: Persistent Memory-Footnote-1957955
+Node: Extension Philosophy958086
+Node: Advanced Features Summary959613
+Node: Internationalization961879
+Node: I18N and L10N963581
+Node: Explaining gettext964276
+Ref: Explaining gettext-Footnote-1970412
+Ref: Explaining gettext-Footnote-2970605
+Node: Programmer i18n970770
+Ref: Programmer i18n-Footnote-1975882
+Node: Translator i18n975931
+Node: String Extraction976761
+Ref: String Extraction-Footnote-1977937
+Node: Printf Ordering978035
+Ref: Printf Ordering-Footnote-1980893
+Node: I18N Portability980961
+Ref: I18N Portability-Footnote-1983521
+Node: I18N Example983588
+Ref: I18N Example-Footnote-1986982
+Ref: I18N Example-Footnote-2987055
+Node: Gawk I18N987172
+Node: I18N Summary987826
+Node: Debugger989223
+Node: Debugging990243
+Node: Debugging Concepts990692
+Node: Debugging Terms992509
+Node: Awk Debugging995112
+Ref: Awk Debugging-Footnote-1996085
+Node: Sample Debugging Session996221
+Node: Debugger Invocation996771
+Node: Finding The Bug998396
+Node: List of Debugger Commands1005028
+Node: Breakpoint Control1006405
+Node: Debugger Execution Control1010227
+Node: Viewing And Changing Data1013701
+Node: Execution Stack1017435
+Node: Debugger Info1019116
+Node: Miscellaneous Debugger Commands1023411
+Node: Readline Support1028652
+Node: Limitations1029596
+Node: Debugging Summary1032220
+Node: Namespaces1033519
+Node: Global Namespace1034759
+Node: Qualified Names1036193
+Node: Default Namespace1037228
+Node: Changing The Namespace1038001
+Node: Naming Rules1039683
+Node: Internal Name Management1041638
+Node: Namespace Example1042708
+Node: Inclusion For Namespaces1045287
+Node: Namespace And Features1047730
+Node: Namespace Summary1049192
+Node: Arbitrary Precision Arithmetic1050705
+Node: Computer Arithmetic1052224
+Ref: table-numeric-ranges1056149
+Ref: table-floating-point-ranges1056646
+Ref: Computer Arithmetic-Footnote-11057304
+Node: Math Definitions1057361
+Ref: table-ieee-formats1060393
+Node: MPFR features1060966
+Node: MPFR On Parole1061419
+Ref: MPFR On Parole-Footnote-11062260
+Node: MPFR Intro1062419
+Node: FP Math Caution1064103
+Ref: FP Math Caution-Footnote-11065175
+Node: Inexactness of computations1065548
+Node: Inexact representation1066579
+Node: Comparing FP Values1067960
+Node: Errors accumulate1069218
+Node: Strange values1070683
+Ref: Strange values-Footnote-11073337
+Node: Getting Accuracy1073442
+Node: Try To Round1076179
+Node: Setting precision1077086
+Ref: table-predefined-precision-strings1077791
+Node: Setting the rounding mode1079675
+Ref: table-gawk-rounding-modes1080057
+Ref: Setting the rounding mode-Footnote-11084109
+Node: Arbitrary Precision Integers1084292
+Ref: Arbitrary Precision Integers-Footnote-11087502
+Node: Checking for MPFR1087655
+Node: POSIX Floating Point Problems1089145
+Ref: POSIX Floating Point Problems-Footnote-11093965
+Node: Floating point summary1094003
+Node: Dynamic Extensions1096259
+Node: Extension Intro1097856
+Node: Plugin License1099158
+Node: Extension Mechanism Outline1099971
+Ref: figure-load-extension1100422
+Ref: figure-register-new-function1102000
+Ref: figure-call-new-function1103109
+Node: Extension API Description1105224
+Node: Extension API Functions Introduction1106953
+Ref: table-api-std-headers1108847
+Node: General Data Types1113288
+Ref: General Data Types-Footnote-11122434
+Node: Memory Allocation Functions1122737
+Ref: Memory Allocation Functions-Footnote-11127454
+Node: Constructor Functions1127553
+Node: API Ownership of MPFR and GMP Values1131454
+Node: Registration Functions1133007
+Node: Extension Functions1133711
+Node: Exit Callback Functions1139285
+Node: Extension Version String1140599
+Node: Input Parsers1141294
+Node: Output Wrappers1155913
+Node: Two-way processors1160755
+Node: Printing Messages1163108
+Ref: Printing Messages-Footnote-11164319
+Node: Updating ERRNO1164472
+Node: Requesting Values1165271
+Ref: table-value-types-returned1166024
+Node: Accessing Parameters1168083
+Node: Symbol Table Access1169364
+Node: Symbol table by name1169876
+Ref: Symbol table by name-Footnote-11173077
+Node: Symbol table by cookie1173209
+Ref: Symbol table by cookie-Footnote-11177478
+Node: Cached values1177542
+Ref: Cached values-Footnote-11181174
+Node: Array Manipulation1181331
+Ref: Array Manipulation-Footnote-11182430
+Node: Array Data Types1182467
+Ref: Array Data Types-Footnote-11185285
+Node: Array Functions1185381
+Node: Flattening Arrays1190410
+Node: Creating Arrays1197458
+Node: Redirection API1202300
+Node: Extension API Variables1205317
+Node: Extension Versioning1206040
+Ref: gawk-api-version1206469
+Node: Extension GMP/MPFR Versioning1208256
+Node: Extension API Informational Variables1209960
+Node: Extension API Boilerplate1211213
+Node: Changes from API V11215343
+Node: Finding Extensions1216975
+Node: Extension Example1217550
+Node: Internal File Description1218372
+Node: Internal File Ops1222664
+Ref: Internal File Ops-Footnote-11234214
+Node: Using Internal File Ops1234362
+Ref: Using Internal File Ops-Footnote-11236793
+Node: Extension Samples1237071
+Node: Extension Sample File Functions1238640
+Node: Extension Sample Fnmatch1246765
+Node: Extension Sample Fork1248360
+Node: Extension Sample Inplace1249636
+Node: Extension Sample Ord1253738
+Node: Extension Sample Readdir1254614
+Ref: table-readdir-file-types1255403
+Node: Extension Sample Revout1256759
+Node: Extension Sample Rev2way1257356
+Node: Extension Sample Read write array1258108
+Node: Extension Sample Readfile1261382
+Node: Extension Sample Time1262513
+Node: Extension Sample API Tests1264513
+Node: gawkextlib1265021
+Node: Extension summary1268053
+Node: Extension Exercises1271901
+Node: Language History1273171
+Node: V7/SVR3.11274883
+Node: SVR41277233
+Node: POSIX1278765
+Node: BTL1280190
+Node: POSIX/GNU1280957
+Ref: Gawk Extension Functions1284347
+Node: Feature History1287771
+Node: Common Extensions1307612
+Node: Ranges and Locales1309087
+Ref: Ranges and Locales-Footnote-11313872
+Ref: Ranges and Locales-Footnote-21313899
+Ref: Ranges and Locales-Footnote-31314134
+Node: Contributors1314357
+Node: History summary1320548
+Node: Installation1321990
+Node: Gawk Distribution1322954
+Node: Getting1323446
+Node: Extracting1324445
+Node: Distribution contents1326151
+Node: Unix Installation1334041
+Node: Quick Installation1334861
+Node: Compiling with MPFR1337401
+Node: Shell Startup Files1338107
+Node: Additional Configuration Options1339264
+Node: Configuration Philosophy1341647
+Node: Compiling from Git1344147
+Node: Building the Documentation1344706
+Node: Non-Unix Installation1346118
+Node: PC Installation1346594
+Node: PC Binary Installation1347463
+Node: PC Compiling1348356
+Node: PC Using1349534
+Node: Cygwin1353250
+Node: MSYS1354502
+Node: OpenVMS Installation1355128
+Node: OpenVMS Compilation1355809
+Ref: OpenVMS Compilation-Footnote-11357292
+Node: OpenVMS Dynamic Extensions1357350
+Node: OpenVMS Installation Details1358986
+Node: OpenVMS Running1361417
+Node: OpenVMS GNV1365554
+Node: Bugs1366309
+Node: Bug definition1367229
+Node: Bug address1370830
+Node: Usenet1374399
+Node: Performance bugs1375612
+Node: Asking for help1378616
+Node: Maintainers1380603
+Node: Other Versions1381630
+Node: Installation summary1391234
+Node: Notes1392616
+Node: Compatibility Mode1393426
+Node: Additions1394248
+Node: Accessing The Source1395193
+Node: Adding Code1396724
+Node: New Ports1403835
+Node: Derived Files1408338
+Ref: Derived Files-Footnote-11414149
+Ref: Derived Files-Footnote-21414184
+Ref: Derived Files-Footnote-31414795
+Node: Future Extensions1414909
+Node: Implementation Limitations1415579
+Node: Extension Design1416821
+Node: Old Extension Problems1417981
+Ref: Old Extension Problems-Footnote-11419553
+Node: Extension New Mechanism Goals1419614
+Ref: Extension New Mechanism Goals-Footnote-11423084
+Node: Extension Other Design Decisions1423285
+Node: Extension Future Growth1425482
+Node: Notes summary1426102
+Node: Basic Concepts1427312
+Node: Basic High Level1427997
+Ref: figure-general-flow1428279
+Ref: figure-process-flow1428981
+Ref: Basic High Level-Footnote-11432351
+Node: Basic Data Typing1432540
+Node: Glossary1435948
+Node: Copying1468826
+Node: GNU Free Documentation License1506384
+Node: Index1531507
 
 End Tag Table
 
diff --git a/doc/gawk.texi b/doc/gawk.texi
index 00abf0a2..e7b8bb45 100644
--- a/doc/gawk.texi
+++ b/doc/gawk.texi
@@ -947,6 +947,8 @@ particular records in a file and perform operations upon 
them.
 * Naming Rules::                        Namespace and Component Naming Rules.
 * Internal Name Management::            How names are stored internally.
 * Namespace Example::                   An example of code using a namespace.
+* Inclusion For Namespaces::            Including a file without changing the
+                                        namespace.
 * Namespace And Features::              Namespaces and other @command{gawk}
                                         features.
 * Namespace Summary::                   Summarizing namespaces.
@@ -4958,11 +4960,12 @@ to @code{EXIT_FAILURE}.
 @c text for this section.
 
 This @value{SECTION} describes a feature that is specific to @command{gawk}.
+It discusses how one source file may include another.
 
 @cindex @code{@@} (at-sign) @subentry @code{@@include} directive
 @cindex at-sign (@code{@@}) @subentry @code{@@include} directive
-@cindex file inclusion, @code{@@include} directive
-@cindex including files, @code{@@include} directive
+@cindex file inclusion @subentry @code{@@include} directive
+@cindex including files @subentry @code{@@include} directive
 @cindex @code{@@include} directive @sortas{include directive}
 @cindex @env{AWKPATH} environment variable
 @cindex environment variables @subentry @env{AWKPATH}
@@ -5089,6 +5092,8 @@ apply to files loaded with @code{@@include}.
 Finally, files included with @code{@@include}
 are treated as if they had @samp{@@namespace "awk"}
 at their beginning.  @xref{Changing The Namespace}, for more information.
+However, there is a separate @code{@@nsinclude} command which
+does not change the namespace; see @ref{Inclusion For Namespaces}.
 
 @node Loading Shared Libraries
 @section Loading Dynamic Extensions into Your Program
@@ -33328,6 +33333,8 @@ please report them (@xref{Bugs}).
 * Naming Rules::                Namespace and Component Naming Rules.
 * Internal Name Management::    How names are stored internally.
 * Namespace Example::           An example of code using a namespace.
+* Inclusion For Namespaces::    Including a file without changing the
+                                namespace.
 * Namespace And Features::      Namespaces and other @command{gawk} features.
 * Namespace Summary::           Summarizing namespaces.
 @end menu
@@ -33692,6 +33699,116 @@ $ @kbd{gawk -f ns_passwd.awk -f testpasswd.awk}
 @dots{}
 @end example
 
+@node Inclusion For Namespaces
+@section Including A File Without Changing The Namespace
+
+@cindex @code{@@} (at-sign) @subentry @code{@@nsinclude} directive
+@cindex at-sign (@code{@@}) @subentry @code{@@nsinclude} directive
+@cindex file inclusion @subentry @code{@@nsinclude} directive
+@cindex including files @subentry @code{@@nsinclude} directive
+@cindex @code{@@nsinclude} directive @sortas{nsinclude directive}
+
+As mentioned at the end of @ref{Include Files}, files included with
+@code{@@include} are treated as if they had @samp{@@namespace "awk"}
+at their beginning.  Sometimes, though, this behavior is undesirable.
+
+Consider, for example, the case where you have some significant functions
+in one namespace:
+
+@example
+@@namespace "mylib"
+
+function major_func1(a, b, c) @{ @dots{} @}
+function major_func2(a, b, c) @{ @dots{} @}
+@dots{}
+@end example
+
+@noindent
+From another namespace, you want to call these functions,
+frequently:
+
+@example
+@@namespace "myproj1"
+function job1(a, b, c) @{
+    @dots{}
+    if (mylib::major_func1(a, b, c))
+        @dots{}
+    else if (mylib::major_func2(a, b, c))
+        @dots{}
+    @dots{}
+@}
+@dots{} @ii{and so on} @dots{}
+@end example
+
+@noindent
+Using the @samp{mylib::} prefix everywhere starts to get painful.
+
+You might then try to write some @dfn{forwarding functions}, which you
+would @code{@@include} in each namespace. For example, something
+like this in a file named @file{mylib_forward.awk}:
+
+@example
+function major_func1(a, b, c)
+@{
+    return mylib::major_func1(a, b, c)
+@}
+
+function major_func2(a, b, c)
+@{
+    return mylib::major_func2(a, b, c)
+@}
+@end example
+
+You might then try to @code{@@include} this file in each namespace:
+
+@example
+@@namespace "myproj1"
+@@include "mylib_forward.awk"
+
+function job1(a, b, c) @{
+    @dots{}
+    if (major_func1(a, b, c))       # calls forwarding function
+        @dots{}
+    else if (major_func2(a, b, c))  # ditto
+        @dots{}
+    @dots{}
+@}
+@dots{}
+
+@@namespace "myproj2"
+@@include "mylib_forward.awk"
+@dots{}
+@end example
+
+@noindent
+But this won't work, since @code{@@include} resets the namespace
+to @samp{awk}.
+
+For this reason, @code{@@nsinclude} was added. It works exactly
+the same as @code{@@include}, but it does not change the namespace:
+
+@example
+@@namespace "myproj1"
+@@nsinclude "mylib_forward.awk"
+
+function job1(a, b, c) @{
+    @dots{}
+    if (major_func1(a, b, c))       # calls forwarding function
+        @dots{}
+    else if (major_func2(a, b, c))  # ditto
+        @dots{}
+    @dots{}
+@}
+@dots{}
+
+@@namespace "myproj2"
+@@nsinclude "mylib_forward.awk"
+@dots{}
+@end example
+
+@noindent
+This will work the way we want it to.
+
 @node Namespace And Features
 @section Namespaces and Other @command{gawk} Features
 
diff --git a/io.c b/io.c
index acb707b0..3943c5a9 100644
--- a/io.c
+++ b/io.c
@@ -3151,7 +3151,7 @@ srcopen(SRCFILE *s)
 
        if (s->stype == SRC_STDIN)
                fd = fileno(stdin);
-       else if (s->stype == SRC_FILE || s->stype == SRC_INC)
+       else if (s->stype == SRC_FILE || s->stype == SRC_INC || s->stype == 
SRC_NSINC)
                fd = devopen(s->fullpath, "r");
 
        /* set binary mode so that debugger byte offset calculations will be 
right */
diff --git a/main.c b/main.c
index 4ef0208d..f1de9dc4 100644
--- a/main.c
+++ b/main.c
@@ -459,7 +459,7 @@ main(int argc, char **argv)
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
                if (s->stype == SRC_EXTLIB)
                        load_ext(s->fullpath);
-               else if (s->stype != SRC_INC)
+               else if (s->stype != SRC_INC && s->stype != SRC_NSINC)
                        have_srcfile = true;
        }
 
diff --git a/profile.c b/profile.c
index 256c641d..149878ba 100644
--- a/profile.c
+++ b/profile.c
@@ -1354,10 +1354,10 @@ print_include_list(FILE *prof_fp)
                return;
 
        for (s = srcfiles->next; s != srcfiles; s = s->next) {
-               if (s->stype == SRC_INC) {
+               if (s->stype == SRC_INC || s->stype == SRC_NSINC) {
                        if (! printed_header) {
                                printed_header = true;
-                               fprintf(prof_fp, _("\n# Included files (-i 
and/or @include)\n\n"));
+                               fprintf(prof_fp, _("\n# Included files (-i 
and/or @include and/or @nsinclude)\n\n"));
                        }
                        found = true;
                        fprintf(prof_fp, "# @include \"%s\"", s->src);

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

Summary of changes:
 ChangeLog      |   32 +
 NEWS           |    7 +
 awk.h          |    1 +
 awkgram.c      | 2294 ++++++++++++++++++++++++++++----------------------------
 awkgram.y      |   38 +-
 command.c      |    2 +-
 command.y      |    2 +-
 debug.c        |    9 +-
 doc/ChangeLog  |    4 +
 doc/awkcard.in |   28 +-
 doc/gawk.1     |   17 +-
 doc/gawk.info  | 1381 ++++++++++++++++++----------------
 doc/gawk.texi  |  121 ++-
 io.c           |    2 +-
 main.c         |    2 +-
 profile.c      |    4 +-
 16 files changed, 2144 insertions(+), 1800 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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