~vcs-imports/gawk/master

« back to all changes in this revision

Viewing changes to awkgram.c

  • Committer: Arnold D. Robbins
  • Date: 2015-04-05 08:20:41 UTC
  • mfrom: (408.12.66)
  • Revision ID: git-v1:4de12ef40f9ea9a0b715903cfe6da51b97eedb77
Merge branch 'master' into cmake

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* A Bison parser, made by GNU Bison 3.0.2.  */
 
1
/* A Bison parser, made by GNU Bison 3.0.4.  */
2
2
 
3
3
/* Bison implementation for Yacc-like parsers in C
4
4
 
5
 
   Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.
 
5
   Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.
6
6
 
7
7
   This program is free software: you can redistribute it and/or modify
8
8
   it under the terms of the GNU General Public License as published by
44
44
#define YYBISON 1
45
45
 
46
46
/* Bison version.  */
47
 
#define YYBISON_VERSION "3.0.2"
 
47
#define YYBISON_VERSION "3.0.4"
48
48
 
49
49
/* Skeleton name.  */
50
50
#define YYSKELETON_NAME "yacc.c"
97
97
static int load_library(INSTRUCTION *file);
98
98
static void next_sourcefile(void);
99
99
static char *tokexpand(void);
100
 
static bool is_deferred_variable(const char *name);
101
100
 
102
101
#define instruction(t)  bcalloc(t, 1, 0)
103
102
 
114
113
static INSTRUCTION *mk_boolean(INSTRUCTION *left, INSTRUCTION *right, INSTRUCTION *op);
115
114
static INSTRUCTION *mk_assignment(INSTRUCTION *lhs, INSTRUCTION *rhs, INSTRUCTION *op);
116
115
static INSTRUCTION *mk_getline(INSTRUCTION *op, INSTRUCTION *opt_var, INSTRUCTION *redir, int redirtype);
117
 
static NODE *make_regnode(int type, NODE *exp);
118
116
static int count_expressions(INSTRUCTION **list, bool isarg);
119
117
static INSTRUCTION *optimize_assignment(INSTRUCTION *exp);
120
118
static void add_lint(INSTRUCTION *list, LINTTYPE linttype);
121
119
 
122
 
static void process_deferred();
123
 
 
124
120
enum defref { FUNC_DEFINE, FUNC_USE, FUNC_EXT };
125
121
static void func_use(const char *name, enum defref how);
126
122
static void check_funcs(void);
128
124
static ssize_t read_one_line(int fd, void *buffer, size_t count);
129
125
static int one_line_close(int fd);
130
126
static void split_comment(void);
 
127
static void check_comment(void);
131
128
 
 
129
static bool at_seen = false;
132
130
static bool want_source = false;
133
131
static bool want_regexp = false;        /* lexical scanning kludge */
134
132
static char *in_function;               /* parsing kludge */
135
 
static bool symtab_used = false;        /* program used SYMTAB */
136
133
static int rule = 0;
137
134
 
138
135
const char *const ruletab[] = {
186
183
static INSTRUCTION *ip_end;
187
184
static INSTRUCTION *ip_endfile;
188
185
static INSTRUCTION *ip_beginfile;
 
186
INSTRUCTION *main_beginfile;
189
187
 
190
188
static INSTRUCTION *comment = NULL;
191
189
static INSTRUCTION *program_comment = NULL;
192
190
static INSTRUCTION *function_comment = NULL;
 
191
static INSTRUCTION *block_comment = NULL;
193
192
 
194
193
static bool func_first = true;
 
194
static bool first_rule = true;
195
195
 
196
196
static inline INSTRUCTION *list_create(INSTRUCTION *x);
197
197
static inline INSTRUCTION *list_append(INSTRUCTION *l, INSTRUCTION *x);
658
658
  /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
659
659
static const yytype_uint16 yyrline[] =
660
660
{
661
 
       0,   205,   205,   207,   212,   213,   219,   231,   235,   246,
662
 
     252,   257,   265,   273,   275,   280,   288,   290,   296,   304,
663
 
     314,   340,   353,   366,   373,   383,   395,   397,   399,   405,
664
 
     410,   411,   415,   450,   449,   483,   485,   490,   496,   524,
665
 
     529,   530,   534,   536,   538,   545,   635,   677,   719,   832,
666
 
     839,   846,   856,   865,   874,   883,   894,   910,   909,   933,
667
 
     945,   945,  1043,  1043,  1076,  1106,  1112,  1113,  1119,  1120,
668
 
    1127,  1132,  1144,  1158,  1160,  1168,  1173,  1175,  1183,  1185,
669
 
    1194,  1195,  1203,  1208,  1208,  1219,  1223,  1231,  1232,  1235,
670
 
    1237,  1242,  1243,  1252,  1253,  1258,  1263,  1269,  1271,  1273,
671
 
    1280,  1281,  1287,  1288,  1293,  1295,  1300,  1302,  1310,  1315,
672
 
    1324,  1331,  1333,  1335,  1351,  1361,  1368,  1370,  1375,  1377,
673
 
    1379,  1387,  1389,  1394,  1396,  1401,  1403,  1405,  1455,  1457,
674
 
    1459,  1461,  1463,  1465,  1467,  1469,  1483,  1488,  1493,  1518,
675
 
    1524,  1526,  1528,  1530,  1532,  1534,  1539,  1543,  1575,  1577,
676
 
    1583,  1589,  1602,  1603,  1604,  1609,  1614,  1618,  1622,  1637,
677
 
    1650,  1655,  1691,  1709,  1710,  1716,  1717,  1722,  1724,  1731,
678
 
    1748,  1765,  1767,  1774,  1779,  1787,  1797,  1809,  1818,  1822,
679
 
    1826,  1830,  1834,  1838,  1841,  1843,  1847,  1851,  1855
 
661
       0,   205,   205,   207,   212,   213,   217,   229,   234,   245,
 
662
     251,   257,   266,   274,   276,   281,   289,   291,   297,   305,
 
663
     315,   345,   359,   373,   381,   392,   404,   406,   408,   414,
 
664
     422,   423,   427,   462,   461,   495,   497,   502,   508,   536,
 
665
     541,   542,   546,   548,   550,   557,   647,   689,   731,   844,
 
666
     851,   858,   868,   877,   886,   895,   906,   922,   921,   945,
 
667
     957,   957,  1055,  1055,  1088,  1118,  1124,  1125,  1131,  1132,
 
668
    1139,  1144,  1156,  1170,  1172,  1180,  1185,  1187,  1195,  1197,
 
669
    1206,  1207,  1215,  1220,  1220,  1231,  1235,  1243,  1244,  1247,
 
670
    1249,  1254,  1255,  1264,  1265,  1270,  1275,  1281,  1283,  1285,
 
671
    1292,  1293,  1299,  1300,  1305,  1307,  1312,  1314,  1322,  1327,
 
672
    1336,  1343,  1345,  1347,  1363,  1373,  1380,  1382,  1387,  1389,
 
673
    1391,  1399,  1401,  1406,  1408,  1413,  1415,  1417,  1467,  1469,
 
674
    1471,  1473,  1475,  1477,  1479,  1481,  1495,  1500,  1505,  1530,
 
675
    1536,  1538,  1540,  1542,  1544,  1546,  1551,  1555,  1587,  1589,
 
676
    1595,  1601,  1614,  1615,  1616,  1621,  1626,  1630,  1634,  1649,
 
677
    1662,  1667,  1704,  1733,  1734,  1740,  1741,  1746,  1748,  1755,
 
678
    1772,  1789,  1791,  1798,  1803,  1811,  1821,  1833,  1842,  1846,
 
679
    1850,  1854,  1858,  1862,  1865,  1867,  1871,  1875,  1879
680
680
};
681
681
#endif
682
682
 
1861
1861
#line 214 "awkgram.y" /* yacc.c:1646  */
1862
1862
    {
1863
1863
                next_sourcefile();
1864
 
                if (sourcefile == srcfiles)
1865
 
                        process_deferred();
1866
1864
          }
1867
 
#line 1868 "awkgram.c" /* yacc.c:1646  */
 
1865
#line 1866 "awkgram.c" /* yacc.c:1646  */
1868
1866
    break;
1869
1867
 
1870
1868
  case 6:
1871
 
#line 220 "awkgram.y" /* yacc.c:1646  */
 
1869
#line 218 "awkgram.y" /* yacc.c:1646  */
1872
1870
    {
1873
1871
                rule = 0;
1874
1872
                /*
1877
1875
                 */
1878
1876
                /* yyerrok; */
1879
1877
          }
1880
 
#line 1881 "awkgram.c" /* yacc.c:1646  */
 
1878
#line 1879 "awkgram.c" /* yacc.c:1646  */
1881
1879
    break;
1882
1880
 
1883
1881
  case 7:
1884
 
#line 232 "awkgram.y" /* yacc.c:1646  */
 
1882
#line 230 "awkgram.y" /* yacc.c:1646  */
1885
1883
    {
1886
1884
                (void) append_rule((yyvsp[-1]), (yyvsp[0]));
 
1885
                first_rule = false;
1887
1886
          }
1888
 
#line 1889 "awkgram.c" /* yacc.c:1646  */
 
1887
#line 1888 "awkgram.c" /* yacc.c:1646  */
1889
1888
    break;
1890
1889
 
1891
1890
  case 8:
1892
 
#line 236 "awkgram.y" /* yacc.c:1646  */
 
1891
#line 235 "awkgram.y" /* yacc.c:1646  */
1893
1892
    {
1894
1893
                if (rule != Rule) {
1895
1894
                        msg(_("%s blocks must have an action part"), ruletab[rule]);
1900
1899
                } else          /* pattern rule with non-empty pattern */
1901
1900
                        (void) append_rule((yyvsp[-1]), NULL);
1902
1901
          }
1903
 
#line 1904 "awkgram.c" /* yacc.c:1646  */
 
1902
#line 1903 "awkgram.c" /* yacc.c:1646  */
1904
1903
    break;
1905
1904
 
1906
1905
  case 9:
1907
 
#line 247 "awkgram.y" /* yacc.c:1646  */
 
1906
#line 246 "awkgram.y" /* yacc.c:1646  */
1908
1907
    {
1909
1908
                in_function = NULL;
1910
1909
                (void) mk_function((yyvsp[-1]), (yyvsp[0]));
1911
1910
                yyerrok;
1912
1911
          }
1913
 
#line 1914 "awkgram.c" /* yacc.c:1646  */
 
1912
#line 1913 "awkgram.c" /* yacc.c:1646  */
1914
1913
    break;
1915
1914
 
1916
1915
  case 10:
1917
 
#line 253 "awkgram.y" /* yacc.c:1646  */
 
1916
#line 252 "awkgram.y" /* yacc.c:1646  */
1918
1917
    {
1919
1918
                want_source = false;
 
1919
                at_seen = false;
1920
1920
                yyerrok;
1921
1921
          }
1922
1922
#line 1923 "awkgram.c" /* yacc.c:1646  */
1926
1926
#line 258 "awkgram.y" /* yacc.c:1646  */
1927
1927
    {
1928
1928
                want_source = false;
 
1929
                at_seen = false;
1929
1930
                yyerrok;
1930
1931
          }
1931
 
#line 1932 "awkgram.c" /* yacc.c:1646  */
 
1932
#line 1933 "awkgram.c" /* yacc.c:1646  */
1932
1933
    break;
1933
1934
 
1934
1935
  case 12:
1935
 
#line 266 "awkgram.y" /* yacc.c:1646  */
 
1936
#line 267 "awkgram.y" /* yacc.c:1646  */
1936
1937
    {
1937
1938
                if (include_source((yyvsp[0])) < 0)
1938
1939
                        YYABORT;
1940
1941
                bcfree((yyvsp[0]));
1941
1942
                (yyval) = NULL;
1942
1943
          }
1943
 
#line 1944 "awkgram.c" /* yacc.c:1646  */
 
1944
#line 1945 "awkgram.c" /* yacc.c:1646  */
1944
1945
    break;
1945
1946
 
1946
1947
  case 13:
1947
 
#line 274 "awkgram.y" /* yacc.c:1646  */
 
1948
#line 275 "awkgram.y" /* yacc.c:1646  */
1948
1949
    { (yyval) = NULL; }
1949
 
#line 1950 "awkgram.c" /* yacc.c:1646  */
 
1950
#line 1951 "awkgram.c" /* yacc.c:1646  */
1950
1951
    break;
1951
1952
 
1952
1953
  case 14:
1953
 
#line 276 "awkgram.y" /* yacc.c:1646  */
 
1954
#line 277 "awkgram.y" /* yacc.c:1646  */
1954
1955
    { (yyval) = NULL; }
1955
 
#line 1956 "awkgram.c" /* yacc.c:1646  */
 
1956
#line 1957 "awkgram.c" /* yacc.c:1646  */
1956
1957
    break;
1957
1958
 
1958
1959
  case 15:
1959
 
#line 281 "awkgram.y" /* yacc.c:1646  */
 
1960
#line 282 "awkgram.y" /* yacc.c:1646  */
1960
1961
    {
1961
1962
                if (load_library((yyvsp[0])) < 0)
1962
1963
                        YYABORT;
1964
1965
                bcfree((yyvsp[0]));
1965
1966
                (yyval) = NULL;
1966
1967
          }
1967
 
#line 1968 "awkgram.c" /* yacc.c:1646  */
 
1968
#line 1969 "awkgram.c" /* yacc.c:1646  */
1968
1969
    break;
1969
1970
 
1970
1971
  case 16:
1971
 
#line 289 "awkgram.y" /* yacc.c:1646  */
 
1972
#line 290 "awkgram.y" /* yacc.c:1646  */
1972
1973
    { (yyval) = NULL; }
1973
 
#line 1974 "awkgram.c" /* yacc.c:1646  */
 
1974
#line 1975 "awkgram.c" /* yacc.c:1646  */
1974
1975
    break;
1975
1976
 
1976
1977
  case 17:
1977
 
#line 291 "awkgram.y" /* yacc.c:1646  */
 
1978
#line 292 "awkgram.y" /* yacc.c:1646  */
1978
1979
    { (yyval) = NULL; }
1979
 
#line 1980 "awkgram.c" /* yacc.c:1646  */
 
1980
#line 1981 "awkgram.c" /* yacc.c:1646  */
1980
1981
    break;
1981
1982
 
1982
1983
  case 18:
1983
 
#line 296 "awkgram.y" /* yacc.c:1646  */
 
1984
#line 297 "awkgram.y" /* yacc.c:1646  */
1984
1985
    {
1985
1986
                rule = Rule;
1986
1987
                if (comment != NULL) {
1989
1990
                } else
1990
1991
                        (yyval) = NULL;
1991
1992
          }
1992
 
#line 1993 "awkgram.c" /* yacc.c:1646  */
 
1993
#line 1994 "awkgram.c" /* yacc.c:1646  */
1993
1994
    break;
1994
1995
 
1995
1996
  case 19:
1996
 
#line 305 "awkgram.y" /* yacc.c:1646  */
 
1997
#line 306 "awkgram.y" /* yacc.c:1646  */
1997
1998
    {
1998
1999
                rule = Rule;
1999
2000
                if (comment != NULL) {
2002
2003
                } else
2003
2004
                        (yyval) = (yyvsp[0]);
2004
2005
          }
2005
 
#line 2006 "awkgram.c" /* yacc.c:1646  */
 
2006
#line 2007 "awkgram.c" /* yacc.c:1646  */
2006
2007
    break;
2007
2008
 
2008
2009
  case 20:
2009
 
#line 315 "awkgram.y" /* yacc.c:1646  */
 
2010
#line 316 "awkgram.y" /* yacc.c:1646  */
2010
2011
    {
2011
2012
                INSTRUCTION *tp;
2012
2013
 
2029
2030
                        ((yyvsp[-3])->nexti + 1)->condpair_left = (yyvsp[-3])->lasti;
2030
2031
                        ((yyvsp[-3])->nexti + 1)->condpair_right = (yyvsp[0])->lasti;
2031
2032
                }
2032
 
                (yyval) = list_append(list_merge((yyvsp[-3]), (yyvsp[0])), tp);
 
2033
                if (comment != NULL) {
 
2034
                        (yyval) = list_append(list_merge(list_prepend((yyvsp[-3]), comment), (yyvsp[0])), tp);
 
2035
                        comment = NULL;
 
2036
                } else
 
2037
                        (yyval) = list_append(list_merge((yyvsp[-3]), (yyvsp[0])), tp);
2033
2038
                rule = Rule;
2034
2039
          }
2035
 
#line 2036 "awkgram.c" /* yacc.c:1646  */
 
2040
#line 2041 "awkgram.c" /* yacc.c:1646  */
2036
2041
    break;
2037
2042
 
2038
2043
  case 21:
2039
 
#line 341 "awkgram.y" /* yacc.c:1646  */
 
2044
#line 346 "awkgram.y" /* yacc.c:1646  */
2040
2045
    {
2041
2046
                static int begin_seen = 0;
2042
2047
 
2047
2052
 
2048
2053
                (yyvsp[0])->in_rule = rule = BEGIN;
2049
2054
                (yyvsp[0])->source_file = source;
 
2055
                check_comment();
2050
2056
                (yyval) = (yyvsp[0]);
2051
2057
          }
2052
 
#line 2053 "awkgram.c" /* yacc.c:1646  */
 
2058
#line 2059 "awkgram.c" /* yacc.c:1646  */
2053
2059
    break;
2054
2060
 
2055
2061
  case 22:
2056
 
#line 354 "awkgram.y" /* yacc.c:1646  */
 
2062
#line 360 "awkgram.y" /* yacc.c:1646  */
2057
2063
    {
2058
2064
                static int end_seen = 0;
2059
2065
 
2064
2070
 
2065
2071
                (yyvsp[0])->in_rule = rule = END;
2066
2072
                (yyvsp[0])->source_file = source;
 
2073
                check_comment();
2067
2074
                (yyval) = (yyvsp[0]);
2068
2075
          }
2069
 
#line 2070 "awkgram.c" /* yacc.c:1646  */
 
2076
#line 2077 "awkgram.c" /* yacc.c:1646  */
2070
2077
    break;
2071
2078
 
2072
2079
  case 23:
2073
 
#line 367 "awkgram.y" /* yacc.c:1646  */
 
2080
#line 374 "awkgram.y" /* yacc.c:1646  */
2074
2081
    {
2075
2082
                func_first = false;
2076
2083
                (yyvsp[0])->in_rule = rule = BEGINFILE;
2077
2084
                (yyvsp[0])->source_file = source;
 
2085
                check_comment();
2078
2086
                (yyval) = (yyvsp[0]);
2079
2087
          }
2080
 
#line 2081 "awkgram.c" /* yacc.c:1646  */
 
2088
#line 2089 "awkgram.c" /* yacc.c:1646  */
2081
2089
    break;
2082
2090
 
2083
2091
  case 24:
2084
 
#line 374 "awkgram.y" /* yacc.c:1646  */
 
2092
#line 382 "awkgram.y" /* yacc.c:1646  */
2085
2093
    {
2086
2094
                func_first = false;
2087
2095
                (yyvsp[0])->in_rule = rule = ENDFILE;
2088
2096
                (yyvsp[0])->source_file = source;
 
2097
                check_comment();
2089
2098
                (yyval) = (yyvsp[0]);
2090
2099
          }
2091
 
#line 2092 "awkgram.c" /* yacc.c:1646  */
 
2100
#line 2101 "awkgram.c" /* yacc.c:1646  */
2092
2101
    break;
2093
2102
 
2094
2103
  case 25:
2095
 
#line 384 "awkgram.y" /* yacc.c:1646  */
 
2104
#line 393 "awkgram.y" /* yacc.c:1646  */
2096
2105
    {
2097
2106
                INSTRUCTION *ip;
2098
2107
                if ((yyvsp[-3]) == NULL)
2101
2110
                        ip = (yyvsp[-3]);
2102
2111
                (yyval) = ip;
2103
2112
          }
2104
 
#line 2105 "awkgram.c" /* yacc.c:1646  */
 
2113
#line 2114 "awkgram.c" /* yacc.c:1646  */
2105
2114
    break;
2106
2115
 
2107
2116
  case 26:
2108
 
#line 396 "awkgram.y" /* yacc.c:1646  */
 
2117
#line 405 "awkgram.y" /* yacc.c:1646  */
2109
2118
    { (yyval) = (yyvsp[0]); }
2110
 
#line 2111 "awkgram.c" /* yacc.c:1646  */
 
2119
#line 2120 "awkgram.c" /* yacc.c:1646  */
2111
2120
    break;
2112
2121
 
2113
2122
  case 27:
2114
 
#line 398 "awkgram.y" /* yacc.c:1646  */
 
2123
#line 407 "awkgram.y" /* yacc.c:1646  */
2115
2124
    { (yyval) = (yyvsp[0]); }
2116
 
#line 2117 "awkgram.c" /* yacc.c:1646  */
 
2125
#line 2126 "awkgram.c" /* yacc.c:1646  */
2117
2126
    break;
2118
2127
 
2119
2128
  case 28:
2120
 
#line 400 "awkgram.y" /* yacc.c:1646  */
 
2129
#line 409 "awkgram.y" /* yacc.c:1646  */
2121
2130
    {
2122
2131
                yyerror(_("`%s' is a built-in function, it cannot be redefined"),
2123
2132
                                        tokstart);
2124
2133
                YYABORT;
2125
2134
          }
2126
 
#line 2127 "awkgram.c" /* yacc.c:1646  */
 
2135
#line 2136 "awkgram.c" /* yacc.c:1646  */
2127
2136
    break;
2128
2137
 
2129
2138
  case 29:
2130
 
#line 406 "awkgram.y" /* yacc.c:1646  */
2131
 
    { (yyval) = (yyvsp[0]); }
2132
 
#line 2133 "awkgram.c" /* yacc.c:1646  */
 
2139
#line 415 "awkgram.y" /* yacc.c:1646  */
 
2140
    {
 
2141
                (yyval) = (yyvsp[0]);
 
2142
                at_seen = false;
 
2143
          }
 
2144
#line 2145 "awkgram.c" /* yacc.c:1646  */
2133
2145
    break;
2134
2146
 
2135
2147
  case 32:
2136
 
#line 416 "awkgram.y" /* yacc.c:1646  */
 
2148
#line 428 "awkgram.y" /* yacc.c:1646  */
2137
2149
    {
2138
2150
                /*
2139
2151
                 *  treat any comments between BOF and the first function
2160
2172
                /* $4 already free'd in install_function */
2161
2173
                (yyval) = (yyvsp[-5]);
2162
2174
          }
2163
 
#line 2164 "awkgram.c" /* yacc.c:1646  */
 
2175
#line 2176 "awkgram.c" /* yacc.c:1646  */
2164
2176
    break;
2165
2177
 
2166
2178
  case 33:
2167
 
#line 450 "awkgram.y" /* yacc.c:1646  */
 
2179
#line 462 "awkgram.y" /* yacc.c:1646  */
2168
2180
    { want_regexp = true; }
2169
 
#line 2170 "awkgram.c" /* yacc.c:1646  */
 
2181
#line 2182 "awkgram.c" /* yacc.c:1646  */
2170
2182
    break;
2171
2183
 
2172
2184
  case 34:
2173
 
#line 452 "awkgram.y" /* yacc.c:1646  */
 
2185
#line 464 "awkgram.y" /* yacc.c:1646  */
2174
2186
    {
2175
2187
                  NODE *n, *exp;
2176
2188
                  char *re;
2199
2211
                  (yyval)->opcode = Op_match_rec;
2200
2212
                  (yyval)->memory = n;
2201
2213
                }
2202
 
#line 2203 "awkgram.c" /* yacc.c:1646  */
 
2214
#line 2215 "awkgram.c" /* yacc.c:1646  */
2203
2215
    break;
2204
2216
 
2205
2217
  case 35:
2206
 
#line 484 "awkgram.y" /* yacc.c:1646  */
 
2218
#line 496 "awkgram.y" /* yacc.c:1646  */
2207
2219
    { bcfree((yyvsp[0])); }
2208
 
#line 2209 "awkgram.c" /* yacc.c:1646  */
 
2220
#line 2221 "awkgram.c" /* yacc.c:1646  */
2209
2221
    break;
2210
2222
 
2211
2223
  case 37:
2212
 
#line 490 "awkgram.y" /* yacc.c:1646  */
 
2224
#line 502 "awkgram.y" /* yacc.c:1646  */
2213
2225
    {
2214
2226
                if (comment != NULL) {
2215
2227
                        (yyval) = list_create(comment);
2216
2228
                        comment = NULL;
2217
2229
                } else (yyval) = NULL;
2218
2230
          }
2219
 
#line 2220 "awkgram.c" /* yacc.c:1646  */
 
2231
#line 2232 "awkgram.c" /* yacc.c:1646  */
2220
2232
    break;
2221
2233
 
2222
2234
  case 38:
2223
 
#line 497 "awkgram.y" /* yacc.c:1646  */
 
2235
#line 509 "awkgram.y" /* yacc.c:1646  */
2224
2236
    {
2225
2237
                if ((yyvsp[0]) == NULL) {
2226
2238
                        if (comment == NULL)
2248
2260
                }
2249
2261
                yyerrok;
2250
2262
          }
2251
 
#line 2252 "awkgram.c" /* yacc.c:1646  */
 
2263
#line 2264 "awkgram.c" /* yacc.c:1646  */
2252
2264
    break;
2253
2265
 
2254
2266
  case 39:
2255
 
#line 525 "awkgram.y" /* yacc.c:1646  */
 
2267
#line 537 "awkgram.y" /* yacc.c:1646  */
2256
2268
    {   (yyval) = NULL; }
2257
 
#line 2258 "awkgram.c" /* yacc.c:1646  */
 
2269
#line 2270 "awkgram.c" /* yacc.c:1646  */
2258
2270
    break;
2259
2271
 
2260
2272
  case 42:
2261
 
#line 535 "awkgram.y" /* yacc.c:1646  */
 
2273
#line 547 "awkgram.y" /* yacc.c:1646  */
2262
2274
    { (yyval) = NULL; }
2263
 
#line 2264 "awkgram.c" /* yacc.c:1646  */
 
2275
#line 2276 "awkgram.c" /* yacc.c:1646  */
2264
2276
    break;
2265
2277
 
2266
2278
  case 43:
2267
 
#line 537 "awkgram.y" /* yacc.c:1646  */
 
2279
#line 549 "awkgram.y" /* yacc.c:1646  */
2268
2280
    { (yyval) = (yyvsp[-1]); }
2269
 
#line 2270 "awkgram.c" /* yacc.c:1646  */
 
2281
#line 2282 "awkgram.c" /* yacc.c:1646  */
2270
2282
    break;
2271
2283
 
2272
2284
  case 44:
2273
 
#line 539 "awkgram.y" /* yacc.c:1646  */
 
2285
#line 551 "awkgram.y" /* yacc.c:1646  */
2274
2286
    {
2275
2287
                if (do_pretty_print)
2276
2288
                        (yyval) = list_prepend((yyvsp[0]), instruction(Op_exec_count));
2277
2289
                else
2278
2290
                        (yyval) = (yyvsp[0]);
2279
2291
          }
2280
 
#line 2281 "awkgram.c" /* yacc.c:1646  */
 
2292
#line 2293 "awkgram.c" /* yacc.c:1646  */
2281
2293
    break;
2282
2294
 
2283
2295
  case 45:
2284
 
#line 546 "awkgram.y" /* yacc.c:1646  */
 
2296
#line 558 "awkgram.y" /* yacc.c:1646  */
2285
2297
    {
2286
2298
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
2287
2299
                INSTRUCTION *ip, *nextc, *tbreak;
2371
2383
                break_allowed--;                        
2372
2384
                fix_break_continue(ip, tbreak, NULL);
2373
2385
          }
2374
 
#line 2375 "awkgram.c" /* yacc.c:1646  */
 
2386
#line 2387 "awkgram.c" /* yacc.c:1646  */
2375
2387
    break;
2376
2388
 
2377
2389
  case 46:
2378
 
#line 636 "awkgram.y" /* yacc.c:1646  */
 
2390
#line 648 "awkgram.y" /* yacc.c:1646  */
2379
2391
    { 
2380
2392
                /*
2381
2393
                 *    -----------------
2417
2429
                continue_allowed--;
2418
2430
                fix_break_continue(ip, tbreak, tcont);
2419
2431
          }
2420
 
#line 2421 "awkgram.c" /* yacc.c:1646  */
 
2432
#line 2433 "awkgram.c" /* yacc.c:1646  */
2421
2433
    break;
2422
2434
 
2423
2435
  case 47:
2424
 
#line 678 "awkgram.y" /* yacc.c:1646  */
 
2436
#line 690 "awkgram.y" /* yacc.c:1646  */
2425
2437
    {
2426
2438
                /*
2427
2439
                 *    -----------------
2463
2475
                } /* else
2464
2476
                        $1 and $4 are NULLs */
2465
2477
          }
2466
 
#line 2467 "awkgram.c" /* yacc.c:1646  */
 
2478
#line 2479 "awkgram.c" /* yacc.c:1646  */
2467
2479
    break;
2468
2480
 
2469
2481
  case 48:
2470
 
#line 720 "awkgram.y" /* yacc.c:1646  */
 
2482
#line 732 "awkgram.y" /* yacc.c:1646  */
2471
2483
    {
2472
2484
                INSTRUCTION *ip;
2473
2485
                char *var_name = (yyvsp[-5])->lextok;
2580
2592
                break_allowed--;
2581
2593
                continue_allowed--;
2582
2594
          }
2583
 
#line 2584 "awkgram.c" /* yacc.c:1646  */
 
2595
#line 2596 "awkgram.c" /* yacc.c:1646  */
2584
2596
    break;
2585
2597
 
2586
2598
  case 49:
2587
 
#line 833 "awkgram.y" /* yacc.c:1646  */
 
2599
#line 845 "awkgram.y" /* yacc.c:1646  */
2588
2600
    {
2589
2601
                (yyval) = mk_for_loop((yyvsp[-11]), (yyvsp[-9]), (yyvsp[-6]), (yyvsp[-3]), (yyvsp[0]));
2590
2602
 
2591
2603
                break_allowed--;
2592
2604
                continue_allowed--;
2593
2605
          }
2594
 
#line 2595 "awkgram.c" /* yacc.c:1646  */
 
2606
#line 2607 "awkgram.c" /* yacc.c:1646  */
2595
2607
    break;
2596
2608
 
2597
2609
  case 50:
2598
 
#line 840 "awkgram.y" /* yacc.c:1646  */
 
2610
#line 852 "awkgram.y" /* yacc.c:1646  */
2599
2611
    {
2600
2612
                (yyval) = mk_for_loop((yyvsp[-10]), (yyvsp[-8]), (INSTRUCTION *) NULL, (yyvsp[-3]), (yyvsp[0]));
2601
2613
 
2602
2614
                break_allowed--;
2603
2615
                continue_allowed--;
2604
2616
          }
2605
 
#line 2606 "awkgram.c" /* yacc.c:1646  */
 
2617
#line 2618 "awkgram.c" /* yacc.c:1646  */
2606
2618
    break;
2607
2619
 
2608
2620
  case 51:
2609
 
#line 847 "awkgram.y" /* yacc.c:1646  */
 
2621
#line 859 "awkgram.y" /* yacc.c:1646  */
2610
2622
    {
2611
2623
                if (do_pretty_print)
2612
2624
                        (yyval) = list_prepend((yyvsp[0]), instruction(Op_exec_count));
2613
2625
                else
2614
2626
                        (yyval) = (yyvsp[0]);
2615
2627
          }
2616
 
#line 2617 "awkgram.c" /* yacc.c:1646  */
 
2628
#line 2629 "awkgram.c" /* yacc.c:1646  */
2617
2629
    break;
2618
2630
 
2619
2631
  case 52:
2620
 
#line 857 "awkgram.y" /* yacc.c:1646  */
 
2632
#line 869 "awkgram.y" /* yacc.c:1646  */
2621
2633
    { 
2622
2634
                if (! break_allowed)
2623
2635
                        error_ln((yyvsp[-1])->source_line,
2626
2638
                (yyval) = list_create((yyvsp[-1]));
2627
2639
 
2628
2640
          }
2629
 
#line 2630 "awkgram.c" /* yacc.c:1646  */
 
2641
#line 2642 "awkgram.c" /* yacc.c:1646  */
2630
2642
    break;
2631
2643
 
2632
2644
  case 53:
2633
 
#line 866 "awkgram.y" /* yacc.c:1646  */
 
2645
#line 878 "awkgram.y" /* yacc.c:1646  */
2634
2646
    {
2635
2647
                if (! continue_allowed)
2636
2648
                        error_ln((yyvsp[-1])->source_line,
2639
2651
                (yyval) = list_create((yyvsp[-1]));
2640
2652
 
2641
2653
          }
2642
 
#line 2643 "awkgram.c" /* yacc.c:1646  */
 
2654
#line 2655 "awkgram.c" /* yacc.c:1646  */
2643
2655
    break;
2644
2656
 
2645
2657
  case 54:
2646
 
#line 875 "awkgram.y" /* yacc.c:1646  */
 
2658
#line 887 "awkgram.y" /* yacc.c:1646  */
2647
2659
    {
2648
2660
                /* if inside function (rule = 0), resolve context at run-time */
2649
2661
                if (rule && rule != Rule)
2652
2664
                (yyvsp[-1])->target_jmp = ip_rec;
2653
2665
                (yyval) = list_create((yyvsp[-1]));
2654
2666
          }
2655
 
#line 2656 "awkgram.c" /* yacc.c:1646  */
 
2667
#line 2668 "awkgram.c" /* yacc.c:1646  */
2656
2668
    break;
2657
2669
 
2658
2670
  case 55:
2659
 
#line 884 "awkgram.y" /* yacc.c:1646  */
 
2671
#line 896 "awkgram.y" /* yacc.c:1646  */
2660
2672
    {
2661
2673
                /* if inside function (rule = 0), resolve context at run-time */
2662
2674
                if (rule == BEGIN || rule == END || rule == ENDFILE)
2667
2679
                (yyvsp[-1])->target_endfile = ip_endfile;
2668
2680
                (yyval) = list_create((yyvsp[-1]));
2669
2681
          }
2670
 
#line 2671 "awkgram.c" /* yacc.c:1646  */
 
2682
#line 2683 "awkgram.c" /* yacc.c:1646  */
2671
2683
    break;
2672
2684
 
2673
2685
  case 56:
2674
 
#line 895 "awkgram.y" /* yacc.c:1646  */
 
2686
#line 907 "awkgram.y" /* yacc.c:1646  */
2675
2687
    {
2676
2688
                /* Initialize the two possible jump targets, the actual target
2677
2689
                 * is resolved at run-time. 
2686
2698
                } else
2687
2699
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
2688
2700
          }
2689
 
#line 2690 "awkgram.c" /* yacc.c:1646  */
 
2701
#line 2702 "awkgram.c" /* yacc.c:1646  */
2690
2702
    break;
2691
2703
 
2692
2704
  case 57:
2693
 
#line 910 "awkgram.y" /* yacc.c:1646  */
 
2705
#line 922 "awkgram.y" /* yacc.c:1646  */
2694
2706
    {
2695
2707
                if (! in_function)
2696
2708
                        yyerror(_("`return' used outside function context"));
2697
2709
          }
2698
 
#line 2699 "awkgram.c" /* yacc.c:1646  */
 
2710
#line 2711 "awkgram.c" /* yacc.c:1646  */
2699
2711
    break;
2700
2712
 
2701
2713
  case 58:
2702
 
#line 913 "awkgram.y" /* yacc.c:1646  */
 
2714
#line 925 "awkgram.y" /* yacc.c:1646  */
2703
2715
    {
2704
2716
                if ((yyvsp[-1]) == NULL) {
2705
2717
                        (yyval) = list_create((yyvsp[-3]));
2720
2732
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-3]));
2721
2733
                }
2722
2734
          }
2723
 
#line 2724 "awkgram.c" /* yacc.c:1646  */
 
2735
#line 2736 "awkgram.c" /* yacc.c:1646  */
2724
2736
    break;
2725
2737
 
2726
2738
  case 60:
2727
 
#line 945 "awkgram.y" /* yacc.c:1646  */
 
2739
#line 957 "awkgram.y" /* yacc.c:1646  */
2728
2740
    { in_print = true; in_parens = 0; }
2729
 
#line 2730 "awkgram.c" /* yacc.c:1646  */
 
2741
#line 2742 "awkgram.c" /* yacc.c:1646  */
2730
2742
    break;
2731
2743
 
2732
2744
  case 61:
2733
 
#line 946 "awkgram.y" /* yacc.c:1646  */
 
2745
#line 958 "awkgram.y" /* yacc.c:1646  */
2734
2746
    {
2735
2747
                /*
2736
2748
                 * Optimization: plain `print' has no expression list, so $3 is null.
2827
2839
                        }
2828
2840
                }
2829
2841
          }
2830
 
#line 2831 "awkgram.c" /* yacc.c:1646  */
 
2842
#line 2843 "awkgram.c" /* yacc.c:1646  */
2831
2843
    break;
2832
2844
 
2833
2845
  case 62:
2834
 
#line 1043 "awkgram.y" /* yacc.c:1646  */
 
2846
#line 1055 "awkgram.y" /* yacc.c:1646  */
2835
2847
    { sub_counter = 0; }
2836
 
#line 2837 "awkgram.c" /* yacc.c:1646  */
 
2848
#line 2849 "awkgram.c" /* yacc.c:1646  */
2837
2849
    break;
2838
2850
 
2839
2851
  case 63:
2840
 
#line 1044 "awkgram.y" /* yacc.c:1646  */
 
2852
#line 1056 "awkgram.y" /* yacc.c:1646  */
2841
2853
    {
2842
2854
                char *arr = (yyvsp[-2])->lextok;
2843
2855
 
2870
2882
                        (yyval) = list_append(list_append((yyvsp[0]), (yyvsp[-2])), (yyvsp[-3]));
2871
2883
                }
2872
2884
          }
2873
 
#line 2874 "awkgram.c" /* yacc.c:1646  */
 
2885
#line 2886 "awkgram.c" /* yacc.c:1646  */
2874
2886
    break;
2875
2887
 
2876
2888
  case 64:
2877
 
#line 1081 "awkgram.y" /* yacc.c:1646  */
 
2889
#line 1093 "awkgram.y" /* yacc.c:1646  */
2878
2890
    {
2879
2891
                static bool warned = false;
2880
2892
                char *arr = (yyvsp[-1])->lextok;
2900
2912
                                fatal(_("`delete' is not allowed with FUNCTAB"));
2901
2913
                }
2902
2914
          }
2903
 
#line 2904 "awkgram.c" /* yacc.c:1646  */
 
2915
#line 2916 "awkgram.c" /* yacc.c:1646  */
2904
2916
    break;
2905
2917
 
2906
2918
  case 65:
2907
 
#line 1107 "awkgram.y" /* yacc.c:1646  */
 
2919
#line 1119 "awkgram.y" /* yacc.c:1646  */
2908
2920
    {   (yyval) = optimize_assignment((yyvsp[0])); }
2909
 
#line 2910 "awkgram.c" /* yacc.c:1646  */
 
2921
#line 2922 "awkgram.c" /* yacc.c:1646  */
2910
2922
    break;
2911
2923
 
2912
2924
  case 66:
2913
 
#line 1112 "awkgram.y" /* yacc.c:1646  */
 
2925
#line 1124 "awkgram.y" /* yacc.c:1646  */
2914
2926
    { (yyval) = NULL; }
2915
 
#line 2916 "awkgram.c" /* yacc.c:1646  */
 
2927
#line 2928 "awkgram.c" /* yacc.c:1646  */
2916
2928
    break;
2917
2929
 
2918
2930
  case 67:
2919
 
#line 1114 "awkgram.y" /* yacc.c:1646  */
 
2931
#line 1126 "awkgram.y" /* yacc.c:1646  */
2920
2932
    { (yyval) = (yyvsp[0]); }
2921
 
#line 2922 "awkgram.c" /* yacc.c:1646  */
 
2933
#line 2934 "awkgram.c" /* yacc.c:1646  */
2922
2934
    break;
2923
2935
 
2924
2936
  case 68:
2925
 
#line 1119 "awkgram.y" /* yacc.c:1646  */
 
2937
#line 1131 "awkgram.y" /* yacc.c:1646  */
2926
2938
    { (yyval) = NULL; }
2927
 
#line 2928 "awkgram.c" /* yacc.c:1646  */
 
2939
#line 2940 "awkgram.c" /* yacc.c:1646  */
2928
2940
    break;
2929
2941
 
2930
2942
  case 69:
2931
 
#line 1121 "awkgram.y" /* yacc.c:1646  */
 
2943
#line 1133 "awkgram.y" /* yacc.c:1646  */
2932
2944
    {
2933
2945
                if ((yyvsp[-1]) == NULL)
2934
2946
                        (yyval) = list_create((yyvsp[0]));
2935
2947
                else
2936
2948
                        (yyval) = list_prepend((yyvsp[-1]), (yyvsp[0]));
2937
2949
          }
2938
 
#line 2939 "awkgram.c" /* yacc.c:1646  */
 
2950
#line 2951 "awkgram.c" /* yacc.c:1646  */
2939
2951
    break;
2940
2952
 
2941
2953
  case 70:
2942
 
#line 1128 "awkgram.y" /* yacc.c:1646  */
 
2954
#line 1140 "awkgram.y" /* yacc.c:1646  */
2943
2955
    { (yyval) = NULL; }
2944
 
#line 2945 "awkgram.c" /* yacc.c:1646  */
 
2956
#line 2957 "awkgram.c" /* yacc.c:1646  */
2945
2957
    break;
2946
2958
 
2947
2959
  case 71:
2948
 
#line 1133 "awkgram.y" /* yacc.c:1646  */
 
2960
#line 1145 "awkgram.y" /* yacc.c:1646  */
2949
2961
    {
2950
2962
                INSTRUCTION *casestmt = (yyvsp[0]);
2951
2963
                if ((yyvsp[0]) == NULL)
2957
2969
                bcfree((yyvsp[-2]));
2958
2970
                (yyval) = (yyvsp[-4]);
2959
2971
          }
2960
 
#line 2961 "awkgram.c" /* yacc.c:1646  */
 
2972
#line 2973 "awkgram.c" /* yacc.c:1646  */
2961
2973
    break;
2962
2974
 
2963
2975
  case 72:
2964
 
#line 1145 "awkgram.y" /* yacc.c:1646  */
 
2976
#line 1157 "awkgram.y" /* yacc.c:1646  */
2965
2977
    {
2966
2978
                INSTRUCTION *casestmt = (yyvsp[0]);
2967
2979
                if ((yyvsp[0]) == NULL)
2972
2984
                (yyvsp[-3])->case_stmt = casestmt;
2973
2985
                (yyval) = (yyvsp[-3]);
2974
2986
          }
2975
 
#line 2976 "awkgram.c" /* yacc.c:1646  */
 
2987
#line 2988 "awkgram.c" /* yacc.c:1646  */
2976
2988
    break;
2977
2989
 
2978
2990
  case 73:
2979
 
#line 1159 "awkgram.y" /* yacc.c:1646  */
 
2991
#line 1171 "awkgram.y" /* yacc.c:1646  */
2980
2992
    {   (yyval) = (yyvsp[0]); }
2981
 
#line 2982 "awkgram.c" /* yacc.c:1646  */
 
2993
#line 2994 "awkgram.c" /* yacc.c:1646  */
2982
2994
    break;
2983
2995
 
2984
2996
  case 74:
2985
 
#line 1161 "awkgram.y" /* yacc.c:1646  */
 
2997
#line 1173 "awkgram.y" /* yacc.c:1646  */
2986
2998
    { 
2987
2999
                NODE *n = (yyvsp[0])->memory;
2988
3000
                (void) force_number(n);
2990
3002
                bcfree((yyvsp[-1]));
2991
3003
                (yyval) = (yyvsp[0]);
2992
3004
          }
2993
 
#line 2994 "awkgram.c" /* yacc.c:1646  */
 
3005
#line 3006 "awkgram.c" /* yacc.c:1646  */
2994
3006
    break;
2995
3007
 
2996
3008
  case 75:
2997
 
#line 1169 "awkgram.y" /* yacc.c:1646  */
 
3009
#line 1181 "awkgram.y" /* yacc.c:1646  */
2998
3010
    {
2999
3011
                bcfree((yyvsp[-1]));
3000
3012
                (yyval) = (yyvsp[0]);
3001
3013
          }
3002
 
#line 3003 "awkgram.c" /* yacc.c:1646  */
 
3014
#line 3015 "awkgram.c" /* yacc.c:1646  */
3003
3015
    break;
3004
3016
 
3005
3017
  case 76:
3006
 
#line 1174 "awkgram.y" /* yacc.c:1646  */
 
3018
#line 1186 "awkgram.y" /* yacc.c:1646  */
3007
3019
    {   (yyval) = (yyvsp[0]); }
3008
 
#line 3009 "awkgram.c" /* yacc.c:1646  */
 
3020
#line 3021 "awkgram.c" /* yacc.c:1646  */
3009
3021
    break;
3010
3022
 
3011
3023
  case 77:
3012
 
#line 1176 "awkgram.y" /* yacc.c:1646  */
 
3024
#line 1188 "awkgram.y" /* yacc.c:1646  */
3013
3025
    {
3014
3026
                (yyvsp[0])->opcode = Op_push_re;
3015
3027
                (yyval) = (yyvsp[0]);
3016
3028
          }
3017
 
#line 3018 "awkgram.c" /* yacc.c:1646  */
 
3029
#line 3030 "awkgram.c" /* yacc.c:1646  */
3018
3030
    break;
3019
3031
 
3020
3032
  case 78:
3021
 
#line 1184 "awkgram.y" /* yacc.c:1646  */
 
3033
#line 1196 "awkgram.y" /* yacc.c:1646  */
3022
3034
    { (yyval) = (yyvsp[0]); }
3023
 
#line 3024 "awkgram.c" /* yacc.c:1646  */
 
3035
#line 3036 "awkgram.c" /* yacc.c:1646  */
3024
3036
    break;
3025
3037
 
3026
3038
  case 79:
3027
 
#line 1186 "awkgram.y" /* yacc.c:1646  */
 
3039
#line 1198 "awkgram.y" /* yacc.c:1646  */
3028
3040
    { (yyval) = (yyvsp[0]); }
3029
 
#line 3030 "awkgram.c" /* yacc.c:1646  */
 
3041
#line 3042 "awkgram.c" /* yacc.c:1646  */
3030
3042
    break;
3031
3043
 
3032
3044
  case 81:
3033
 
#line 1196 "awkgram.y" /* yacc.c:1646  */
 
3045
#line 1208 "awkgram.y" /* yacc.c:1646  */
3034
3046
    {
3035
3047
                (yyval) = (yyvsp[-1]);
3036
3048
          }
3037
 
#line 3038 "awkgram.c" /* yacc.c:1646  */
 
3049
#line 3050 "awkgram.c" /* yacc.c:1646  */
3038
3050
    break;
3039
3051
 
3040
3052
  case 82:
3041
 
#line 1203 "awkgram.y" /* yacc.c:1646  */
 
3053
#line 1215 "awkgram.y" /* yacc.c:1646  */
3042
3054
    {
3043
3055
                in_print = false;
3044
3056
                in_parens = 0;
3045
3057
                (yyval) = NULL;
3046
3058
          }
3047
 
#line 3048 "awkgram.c" /* yacc.c:1646  */
 
3059
#line 3060 "awkgram.c" /* yacc.c:1646  */
3048
3060
    break;
3049
3061
 
3050
3062
  case 83:
3051
 
#line 1208 "awkgram.y" /* yacc.c:1646  */
 
3063
#line 1220 "awkgram.y" /* yacc.c:1646  */
3052
3064
    { in_print = false; in_parens = 0; }
3053
 
#line 3054 "awkgram.c" /* yacc.c:1646  */
 
3065
#line 3066 "awkgram.c" /* yacc.c:1646  */
3054
3066
    break;
3055
3067
 
3056
3068
  case 84:
3057
 
#line 1209 "awkgram.y" /* yacc.c:1646  */
 
3069
#line 1221 "awkgram.y" /* yacc.c:1646  */
3058
3070
    {
3059
3071
                if ((yyvsp[-2])->redir_type == redirect_twoway
3060
3072
                        && (yyvsp[0])->lasti->opcode == Op_K_getline_redir
3062
3074
                        yyerror(_("multistage two-way pipelines don't work"));
3063
3075
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-2]));
3064
3076
          }
3065
 
#line 3066 "awkgram.c" /* yacc.c:1646  */
 
3077
#line 3078 "awkgram.c" /* yacc.c:1646  */
3066
3078
    break;
3067
3079
 
3068
3080
  case 85:
3069
 
#line 1220 "awkgram.y" /* yacc.c:1646  */
 
3081
#line 1232 "awkgram.y" /* yacc.c:1646  */
3070
3082
    {
3071
3083
                (yyval) = mk_condition((yyvsp[-3]), (yyvsp[-5]), (yyvsp[0]), NULL, NULL);
3072
3084
          }
3073
 
#line 3074 "awkgram.c" /* yacc.c:1646  */
 
3085
#line 3086 "awkgram.c" /* yacc.c:1646  */
3074
3086
    break;
3075
3087
 
3076
3088
  case 86:
3077
 
#line 1225 "awkgram.y" /* yacc.c:1646  */
 
3089
#line 1237 "awkgram.y" /* yacc.c:1646  */
3078
3090
    {
3079
3091
                (yyval) = mk_condition((yyvsp[-6]), (yyvsp[-8]), (yyvsp[-3]), (yyvsp[-2]), (yyvsp[0]));
3080
3092
          }
3081
 
#line 3082 "awkgram.c" /* yacc.c:1646  */
 
3093
#line 3094 "awkgram.c" /* yacc.c:1646  */
3082
3094
    break;
3083
3095
 
3084
3096
  case 91:
3085
 
#line 1242 "awkgram.y" /* yacc.c:1646  */
 
3097
#line 1254 "awkgram.y" /* yacc.c:1646  */
3086
3098
    { (yyval) = NULL; }
3087
 
#line 3088 "awkgram.c" /* yacc.c:1646  */
 
3099
#line 3100 "awkgram.c" /* yacc.c:1646  */
3088
3100
    break;
3089
3101
 
3090
3102
  case 92:
3091
 
#line 1244 "awkgram.y" /* yacc.c:1646  */
 
3103
#line 1256 "awkgram.y" /* yacc.c:1646  */
3092
3104
    {
3093
3105
                bcfree((yyvsp[-1]));
3094
3106
                (yyval) = (yyvsp[0]);
3095
3107
          }
3096
 
#line 3097 "awkgram.c" /* yacc.c:1646  */
 
3108
#line 3109 "awkgram.c" /* yacc.c:1646  */
3097
3109
    break;
3098
3110
 
3099
3111
  case 93:
3100
 
#line 1252 "awkgram.y" /* yacc.c:1646  */
 
3112
#line 1264 "awkgram.y" /* yacc.c:1646  */
3101
3113
    { (yyval) = NULL; }
3102
 
#line 3103 "awkgram.c" /* yacc.c:1646  */
 
3114
#line 3115 "awkgram.c" /* yacc.c:1646  */
3103
3115
    break;
3104
3116
 
3105
3117
  case 94:
3106
 
#line 1254 "awkgram.y" /* yacc.c:1646  */
 
3118
#line 1266 "awkgram.y" /* yacc.c:1646  */
3107
3119
    { (yyval) = (yyvsp[0]); }
3108
 
#line 3109 "awkgram.c" /* yacc.c:1646  */
 
3120
#line 3121 "awkgram.c" /* yacc.c:1646  */
3109
3121
    break;
3110
3122
 
3111
3123
  case 95:
3112
 
#line 1259 "awkgram.y" /* yacc.c:1646  */
 
3124
#line 1271 "awkgram.y" /* yacc.c:1646  */
3113
3125
    {
3114
3126
                (yyvsp[0])->param_count = 0;
3115
3127
                (yyval) = list_create((yyvsp[0]));
3116
3128
          }
3117
 
#line 3118 "awkgram.c" /* yacc.c:1646  */
 
3129
#line 3130 "awkgram.c" /* yacc.c:1646  */
3118
3130
    break;
3119
3131
 
3120
3132
  case 96:
3121
 
#line 1264 "awkgram.y" /* yacc.c:1646  */
 
3133
#line 1276 "awkgram.y" /* yacc.c:1646  */
3122
3134
    {
3123
3135
                (yyvsp[0])->param_count =  (yyvsp[-2])->lasti->param_count + 1;
3124
3136
                (yyval) = list_append((yyvsp[-2]), (yyvsp[0]));
3125
3137
                yyerrok;
3126
3138
          }
3127
 
#line 3128 "awkgram.c" /* yacc.c:1646  */
 
3139
#line 3140 "awkgram.c" /* yacc.c:1646  */
3128
3140
    break;
3129
3141
 
3130
3142
  case 97:
3131
 
#line 1270 "awkgram.y" /* yacc.c:1646  */
 
3143
#line 1282 "awkgram.y" /* yacc.c:1646  */
3132
3144
    { (yyval) = NULL; }
3133
 
#line 3134 "awkgram.c" /* yacc.c:1646  */
 
3145
#line 3146 "awkgram.c" /* yacc.c:1646  */
3134
3146
    break;
3135
3147
 
3136
3148
  case 98:
3137
 
#line 1272 "awkgram.y" /* yacc.c:1646  */
 
3149
#line 1284 "awkgram.y" /* yacc.c:1646  */
3138
3150
    { (yyval) = (yyvsp[-1]); }
3139
 
#line 3140 "awkgram.c" /* yacc.c:1646  */
 
3151
#line 3152 "awkgram.c" /* yacc.c:1646  */
3140
3152
    break;
3141
3153
 
3142
3154
  case 99:
3143
 
#line 1274 "awkgram.y" /* yacc.c:1646  */
 
3155
#line 1286 "awkgram.y" /* yacc.c:1646  */
3144
3156
    { (yyval) = (yyvsp[-2]); }
3145
 
#line 3146 "awkgram.c" /* yacc.c:1646  */
 
3157
#line 3158 "awkgram.c" /* yacc.c:1646  */
3146
3158
    break;
3147
3159
 
3148
3160
  case 100:
3149
 
#line 1280 "awkgram.y" /* yacc.c:1646  */
 
3161
#line 1292 "awkgram.y" /* yacc.c:1646  */
3150
3162
    { (yyval) = NULL; }
3151
 
#line 3152 "awkgram.c" /* yacc.c:1646  */
 
3163
#line 3164 "awkgram.c" /* yacc.c:1646  */
3152
3164
    break;
3153
3165
 
3154
3166
  case 101:
3155
 
#line 1282 "awkgram.y" /* yacc.c:1646  */
 
3167
#line 1294 "awkgram.y" /* yacc.c:1646  */
3156
3168
    { (yyval) = (yyvsp[0]); }
3157
 
#line 3158 "awkgram.c" /* yacc.c:1646  */
 
3169
#line 3170 "awkgram.c" /* yacc.c:1646  */
3158
3170
    break;
3159
3171
 
3160
3172
  case 102:
3161
 
#line 1287 "awkgram.y" /* yacc.c:1646  */
 
3173
#line 1299 "awkgram.y" /* yacc.c:1646  */
3162
3174
    { (yyval) = NULL; }
3163
 
#line 3164 "awkgram.c" /* yacc.c:1646  */
 
3175
#line 3176 "awkgram.c" /* yacc.c:1646  */
3164
3176
    break;
3165
3177
 
3166
3178
  case 103:
3167
 
#line 1289 "awkgram.y" /* yacc.c:1646  */
 
3179
#line 1301 "awkgram.y" /* yacc.c:1646  */
3168
3180
    { (yyval) = (yyvsp[0]); }
3169
 
#line 3170 "awkgram.c" /* yacc.c:1646  */
 
3181
#line 3182 "awkgram.c" /* yacc.c:1646  */
3170
3182
    break;
3171
3183
 
3172
3184
  case 104:
3173
 
#line 1294 "awkgram.y" /* yacc.c:1646  */
 
3185
#line 1306 "awkgram.y" /* yacc.c:1646  */
3174
3186
    {   (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
3175
 
#line 3176 "awkgram.c" /* yacc.c:1646  */
 
3187
#line 3188 "awkgram.c" /* yacc.c:1646  */
3176
3188
    break;
3177
3189
 
3178
3190
  case 105:
3179
 
#line 1296 "awkgram.y" /* yacc.c:1646  */
 
3191
#line 1308 "awkgram.y" /* yacc.c:1646  */
3180
3192
    {
3181
3193
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
3182
3194
                yyerrok;
3183
3195
          }
3184
 
#line 3185 "awkgram.c" /* yacc.c:1646  */
 
3196
#line 3197 "awkgram.c" /* yacc.c:1646  */
3185
3197
    break;
3186
3198
 
3187
3199
  case 106:
3188
 
#line 1301 "awkgram.y" /* yacc.c:1646  */
 
3200
#line 1313 "awkgram.y" /* yacc.c:1646  */
3189
3201
    { (yyval) = NULL; }
3190
 
#line 3191 "awkgram.c" /* yacc.c:1646  */
 
3202
#line 3203 "awkgram.c" /* yacc.c:1646  */
3191
3203
    break;
3192
3204
 
3193
3205
  case 107:
3194
 
#line 1303 "awkgram.y" /* yacc.c:1646  */
 
3206
#line 1315 "awkgram.y" /* yacc.c:1646  */
3195
3207
    {
3196
3208
                /*
3197
3209
                 * Returning the expression list instead of NULL lets
3199
3211
                 */
3200
3212
                (yyval) = (yyvsp[-1]);
3201
3213
          }
3202
 
#line 3203 "awkgram.c" /* yacc.c:1646  */
 
3214
#line 3215 "awkgram.c" /* yacc.c:1646  */
3203
3215
    break;
3204
3216
 
3205
3217
  case 108:
3206
 
#line 1311 "awkgram.y" /* yacc.c:1646  */
 
3218
#line 1323 "awkgram.y" /* yacc.c:1646  */
3207
3219
    {
3208
3220
                /* Ditto */
3209
3221
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
3210
3222
          }
3211
 
#line 3212 "awkgram.c" /* yacc.c:1646  */
 
3223
#line 3224 "awkgram.c" /* yacc.c:1646  */
3212
3224
    break;
3213
3225
 
3214
3226
  case 109:
3215
 
#line 1316 "awkgram.y" /* yacc.c:1646  */
 
3227
#line 1328 "awkgram.y" /* yacc.c:1646  */
3216
3228
    {
3217
3229
                /* Ditto */
3218
3230
                (yyval) = (yyvsp[-2]);
3219
3231
          }
3220
 
#line 3221 "awkgram.c" /* yacc.c:1646  */
 
3232
#line 3233 "awkgram.c" /* yacc.c:1646  */
3221
3233
    break;
3222
3234
 
3223
3235
  case 110:
3224
 
#line 1325 "awkgram.y" /* yacc.c:1646  */
 
3236
#line 1337 "awkgram.y" /* yacc.c:1646  */
3225
3237
    {
3226
3238
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
3227
3239
                        lintwarn_ln((yyvsp[-1])->source_line,
3228
3240
                                _("regular expression on right of assignment"));
3229
3241
                (yyval) = mk_assignment((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1]));
3230
3242
          }
3231
 
#line 3232 "awkgram.c" /* yacc.c:1646  */
 
3243
#line 3244 "awkgram.c" /* yacc.c:1646  */
3232
3244
    break;
3233
3245
 
3234
3246
  case 111:
3235
 
#line 1332 "awkgram.y" /* yacc.c:1646  */
 
3247
#line 1344 "awkgram.y" /* yacc.c:1646  */
3236
3248
    {   (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3237
 
#line 3238 "awkgram.c" /* yacc.c:1646  */
 
3249
#line 3250 "awkgram.c" /* yacc.c:1646  */
3238
3250
    break;
3239
3251
 
3240
3252
  case 112:
3241
 
#line 1334 "awkgram.y" /* yacc.c:1646  */
 
3253
#line 1346 "awkgram.y" /* yacc.c:1646  */
3242
3254
    {   (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3243
 
#line 3244 "awkgram.c" /* yacc.c:1646  */
 
3255
#line 3256 "awkgram.c" /* yacc.c:1646  */
3244
3256
    break;
3245
3257
 
3246
3258
  case 113:
3247
 
#line 1336 "awkgram.y" /* yacc.c:1646  */
 
3259
#line 1348 "awkgram.y" /* yacc.c:1646  */
3248
3260
    {
3249
3261
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
3250
3262
                        warning_ln((yyvsp[-1])->source_line,
3260
3272
                        (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), (yyvsp[-1]));
3261
3273
                }
3262
3274
          }
3263
 
#line 3264 "awkgram.c" /* yacc.c:1646  */
 
3275
#line 3276 "awkgram.c" /* yacc.c:1646  */
3264
3276
    break;
3265
3277
 
3266
3278
  case 114:
3267
 
#line 1352 "awkgram.y" /* yacc.c:1646  */
 
3279
#line 1364 "awkgram.y" /* yacc.c:1646  */
3268
3280
    {
3269
3281
                if (do_lint_old)
3270
3282
                        warning_ln((yyvsp[-1])->source_line,
3274
3286
                (yyvsp[-1])->expr_count = 1;
3275
3287
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), (yyvsp[-1]));
3276
3288
          }
3277
 
#line 3278 "awkgram.c" /* yacc.c:1646  */
 
3289
#line 3290 "awkgram.c" /* yacc.c:1646  */
3278
3290
    break;
3279
3291
 
3280
3292
  case 115:
3281
 
#line 1362 "awkgram.y" /* yacc.c:1646  */
 
3293
#line 1374 "awkgram.y" /* yacc.c:1646  */
3282
3294
    {
3283
3295
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
3284
3296
                        lintwarn_ln((yyvsp[-1])->source_line,
3285
3297
                                _("regular expression on right of comparison"));
3286
3298
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), (yyvsp[-1]));
3287
3299
          }
3288
 
#line 3289 "awkgram.c" /* yacc.c:1646  */
 
3300
#line 3301 "awkgram.c" /* yacc.c:1646  */
3289
3301
    break;
3290
3302
 
3291
3303
  case 116:
3292
 
#line 1369 "awkgram.y" /* yacc.c:1646  */
 
3304
#line 1381 "awkgram.y" /* yacc.c:1646  */
3293
3305
    { (yyval) = mk_condition((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]), (yyvsp[-1]), (yyvsp[0])); }
3294
 
#line 3295 "awkgram.c" /* yacc.c:1646  */
 
3306
#line 3307 "awkgram.c" /* yacc.c:1646  */
3295
3307
    break;
3296
3308
 
3297
3309
  case 117:
3298
 
#line 1371 "awkgram.y" /* yacc.c:1646  */
 
3310
#line 1383 "awkgram.y" /* yacc.c:1646  */
3299
3311
    { (yyval) = (yyvsp[0]); }
3300
 
#line 3301 "awkgram.c" /* yacc.c:1646  */
 
3312
#line 3313 "awkgram.c" /* yacc.c:1646  */
3301
3313
    break;
3302
3314
 
3303
3315
  case 118:
3304
 
#line 1376 "awkgram.y" /* yacc.c:1646  */
 
3316
#line 1388 "awkgram.y" /* yacc.c:1646  */
3305
3317
    { (yyval) = (yyvsp[0]); }
3306
 
#line 3307 "awkgram.c" /* yacc.c:1646  */
 
3318
#line 3319 "awkgram.c" /* yacc.c:1646  */
3307
3319
    break;
3308
3320
 
3309
3321
  case 119:
3310
 
#line 1378 "awkgram.y" /* yacc.c:1646  */
 
3322
#line 1390 "awkgram.y" /* yacc.c:1646  */
3311
3323
    { (yyval) = (yyvsp[0]); }
3312
 
#line 3313 "awkgram.c" /* yacc.c:1646  */
 
3324
#line 3325 "awkgram.c" /* yacc.c:1646  */
3313
3325
    break;
3314
3326
 
3315
3327
  case 120:
3316
 
#line 1380 "awkgram.y" /* yacc.c:1646  */
 
3328
#line 1392 "awkgram.y" /* yacc.c:1646  */
3317
3329
    {   
3318
3330
                (yyvsp[0])->opcode = Op_assign_quotient;
3319
3331
                (yyval) = (yyvsp[0]);
3320
3332
          }
3321
 
#line 3322 "awkgram.c" /* yacc.c:1646  */
 
3333
#line 3334 "awkgram.c" /* yacc.c:1646  */
3322
3334
    break;
3323
3335
 
3324
3336
  case 121:
3325
 
#line 1388 "awkgram.y" /* yacc.c:1646  */
 
3337
#line 1400 "awkgram.y" /* yacc.c:1646  */
3326
3338
    { (yyval) = (yyvsp[0]); }
3327
 
#line 3328 "awkgram.c" /* yacc.c:1646  */
 
3339
#line 3340 "awkgram.c" /* yacc.c:1646  */
3328
3340
    break;
3329
3341
 
3330
3342
  case 122:
3331
 
#line 1390 "awkgram.y" /* yacc.c:1646  */
 
3343
#line 1402 "awkgram.y" /* yacc.c:1646  */
3332
3344
    { (yyval) = (yyvsp[0]); }
3333
 
#line 3334 "awkgram.c" /* yacc.c:1646  */
 
3345
#line 3346 "awkgram.c" /* yacc.c:1646  */
3334
3346
    break;
3335
3347
 
3336
3348
  case 123:
3337
 
#line 1395 "awkgram.y" /* yacc.c:1646  */
 
3349
#line 1407 "awkgram.y" /* yacc.c:1646  */
3338
3350
    { (yyval) = (yyvsp[0]); }
3339
 
#line 3340 "awkgram.c" /* yacc.c:1646  */
 
3351
#line 3352 "awkgram.c" /* yacc.c:1646  */
3340
3352
    break;
3341
3353
 
3342
3354
  case 124:
3343
 
#line 1397 "awkgram.y" /* yacc.c:1646  */
 
3355
#line 1409 "awkgram.y" /* yacc.c:1646  */
3344
3356
    { (yyval) = (yyvsp[0]); }
3345
 
#line 3346 "awkgram.c" /* yacc.c:1646  */
 
3357
#line 3358 "awkgram.c" /* yacc.c:1646  */
3346
3358
    break;
3347
3359
 
3348
3360
  case 125:
3349
 
#line 1402 "awkgram.y" /* yacc.c:1646  */
 
3361
#line 1414 "awkgram.y" /* yacc.c:1646  */
3350
3362
    { (yyval) = (yyvsp[0]); }
3351
 
#line 3352 "awkgram.c" /* yacc.c:1646  */
 
3363
#line 3364 "awkgram.c" /* yacc.c:1646  */
3352
3364
    break;
3353
3365
 
3354
3366
  case 126:
3355
 
#line 1404 "awkgram.y" /* yacc.c:1646  */
 
3367
#line 1416 "awkgram.y" /* yacc.c:1646  */
3356
3368
    { (yyval) = (yyvsp[0]); }
3357
 
#line 3358 "awkgram.c" /* yacc.c:1646  */
 
3369
#line 3370 "awkgram.c" /* yacc.c:1646  */
3358
3370
    break;
3359
3371
 
3360
3372
  case 127:
3361
 
#line 1406 "awkgram.y" /* yacc.c:1646  */
 
3373
#line 1418 "awkgram.y" /* yacc.c:1646  */
3362
3374
    {
3363
3375
                int count = 2;
3364
3376
                bool is_simple_var = false;
3405
3417
                                max_args = count;
3406
3418
                }
3407
3419
          }
3408
 
#line 3409 "awkgram.c" /* yacc.c:1646  */
 
3420
#line 3421 "awkgram.c" /* yacc.c:1646  */
3409
3421
    break;
3410
3422
 
3411
3423
  case 129:
3412
 
#line 1458 "awkgram.y" /* yacc.c:1646  */
 
3424
#line 1470 "awkgram.y" /* yacc.c:1646  */
3413
3425
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3414
 
#line 3415 "awkgram.c" /* yacc.c:1646  */
 
3426
#line 3427 "awkgram.c" /* yacc.c:1646  */
3415
3427
    break;
3416
3428
 
3417
3429
  case 130:
3418
 
#line 1460 "awkgram.y" /* yacc.c:1646  */
 
3430
#line 1472 "awkgram.y" /* yacc.c:1646  */
3419
3431
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3420
 
#line 3421 "awkgram.c" /* yacc.c:1646  */
 
3432
#line 3433 "awkgram.c" /* yacc.c:1646  */
3421
3433
    break;
3422
3434
 
3423
3435
  case 131:
3424
 
#line 1462 "awkgram.y" /* yacc.c:1646  */
 
3436
#line 1474 "awkgram.y" /* yacc.c:1646  */
3425
3437
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3426
 
#line 3427 "awkgram.c" /* yacc.c:1646  */
 
3438
#line 3439 "awkgram.c" /* yacc.c:1646  */
3427
3439
    break;
3428
3440
 
3429
3441
  case 132:
3430
 
#line 1464 "awkgram.y" /* yacc.c:1646  */
 
3442
#line 1476 "awkgram.y" /* yacc.c:1646  */
3431
3443
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3432
 
#line 3433 "awkgram.c" /* yacc.c:1646  */
 
3444
#line 3445 "awkgram.c" /* yacc.c:1646  */
3433
3445
    break;
3434
3446
 
3435
3447
  case 133:
3436
 
#line 1466 "awkgram.y" /* yacc.c:1646  */
 
3448
#line 1478 "awkgram.y" /* yacc.c:1646  */
3437
3449
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3438
 
#line 3439 "awkgram.c" /* yacc.c:1646  */
 
3450
#line 3451 "awkgram.c" /* yacc.c:1646  */
3439
3451
    break;
3440
3452
 
3441
3453
  case 134:
3442
 
#line 1468 "awkgram.y" /* yacc.c:1646  */
 
3454
#line 1480 "awkgram.y" /* yacc.c:1646  */
3443
3455
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3444
 
#line 3445 "awkgram.c" /* yacc.c:1646  */
 
3456
#line 3457 "awkgram.c" /* yacc.c:1646  */
3445
3457
    break;
3446
3458
 
3447
3459
  case 135:
3448
 
#line 1470 "awkgram.y" /* yacc.c:1646  */
 
3460
#line 1482 "awkgram.y" /* yacc.c:1646  */
3449
3461
    {
3450
3462
                /*
3451
3463
                 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
3459
3471
                                _("non-redirected `getline' undefined inside END action"));
3460
3472
                (yyval) = mk_getline((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]), redirect_input);
3461
3473
          }
3462
 
#line 3463 "awkgram.c" /* yacc.c:1646  */
 
3474
#line 3475 "awkgram.c" /* yacc.c:1646  */
3463
3475
    break;
3464
3476
 
3465
3477
  case 136:
3466
 
#line 1484 "awkgram.y" /* yacc.c:1646  */
 
3478
#line 1496 "awkgram.y" /* yacc.c:1646  */
3467
3479
    {
3468
3480
                (yyvsp[0])->opcode = Op_postincrement;
3469
3481
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
3470
3482
          }
3471
 
#line 3472 "awkgram.c" /* yacc.c:1646  */
 
3483
#line 3484 "awkgram.c" /* yacc.c:1646  */
3472
3484
    break;
3473
3485
 
3474
3486
  case 137:
3475
 
#line 1489 "awkgram.y" /* yacc.c:1646  */
 
3487
#line 1501 "awkgram.y" /* yacc.c:1646  */
3476
3488
    {
3477
3489
                (yyvsp[0])->opcode = Op_postdecrement;
3478
3490
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
3479
3491
          }
3480
 
#line 3481 "awkgram.c" /* yacc.c:1646  */
 
3492
#line 3493 "awkgram.c" /* yacc.c:1646  */
3481
3493
    break;
3482
3494
 
3483
3495
  case 138:
3484
 
#line 1494 "awkgram.y" /* yacc.c:1646  */
 
3496
#line 1506 "awkgram.y" /* yacc.c:1646  */
3485
3497
    {
3486
3498
                if (do_lint_old) {
3487
3499
                    warning_ln((yyvsp[-1])->source_line,
3501
3513
                        (yyval) = list_append(list_merge(t, (yyvsp[0])), (yyvsp[-1]));
3502
3514
                }
3503
3515
          }
3504
 
#line 3505 "awkgram.c" /* yacc.c:1646  */
 
3516
#line 3517 "awkgram.c" /* yacc.c:1646  */
3505
3517
    break;
3506
3518
 
3507
3519
  case 139:
3508
 
#line 1519 "awkgram.y" /* yacc.c:1646  */
 
3520
#line 1531 "awkgram.y" /* yacc.c:1646  */
3509
3521
    {
3510
3522
                  (yyval) = mk_getline((yyvsp[-1]), (yyvsp[0]), (yyvsp[-3]), (yyvsp[-2])->redir_type);
3511
3523
                  bcfree((yyvsp[-2]));
3512
3524
                }
3513
 
#line 3514 "awkgram.c" /* yacc.c:1646  */
 
3525
#line 3526 "awkgram.c" /* yacc.c:1646  */
3514
3526
    break;
3515
3527
 
3516
3528
  case 140:
3517
 
#line 1525 "awkgram.y" /* yacc.c:1646  */
 
3529
#line 1537 "awkgram.y" /* yacc.c:1646  */
3518
3530
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3519
 
#line 3520 "awkgram.c" /* yacc.c:1646  */
 
3531
#line 3532 "awkgram.c" /* yacc.c:1646  */
3520
3532
    break;
3521
3533
 
3522
3534
  case 141:
3523
 
#line 1527 "awkgram.y" /* yacc.c:1646  */
 
3535
#line 1539 "awkgram.y" /* yacc.c:1646  */
3524
3536
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3525
 
#line 3526 "awkgram.c" /* yacc.c:1646  */
 
3537
#line 3538 "awkgram.c" /* yacc.c:1646  */
3526
3538
    break;
3527
3539
 
3528
3540
  case 142:
3529
 
#line 1529 "awkgram.y" /* yacc.c:1646  */
 
3541
#line 1541 "awkgram.y" /* yacc.c:1646  */
3530
3542
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3531
 
#line 3532 "awkgram.c" /* yacc.c:1646  */
 
3543
#line 3544 "awkgram.c" /* yacc.c:1646  */
3532
3544
    break;
3533
3545
 
3534
3546
  case 143:
3535
 
#line 1531 "awkgram.y" /* yacc.c:1646  */
 
3547
#line 1543 "awkgram.y" /* yacc.c:1646  */
3536
3548
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3537
 
#line 3538 "awkgram.c" /* yacc.c:1646  */
 
3549
#line 3550 "awkgram.c" /* yacc.c:1646  */
3538
3550
    break;
3539
3551
 
3540
3552
  case 144:
3541
 
#line 1533 "awkgram.y" /* yacc.c:1646  */
 
3553
#line 1545 "awkgram.y" /* yacc.c:1646  */
3542
3554
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3543
 
#line 3544 "awkgram.c" /* yacc.c:1646  */
 
3555
#line 3556 "awkgram.c" /* yacc.c:1646  */
3544
3556
    break;
3545
3557
 
3546
3558
  case 145:
3547
 
#line 1535 "awkgram.y" /* yacc.c:1646  */
 
3559
#line 1547 "awkgram.y" /* yacc.c:1646  */
3548
3560
    { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
3549
 
#line 3550 "awkgram.c" /* yacc.c:1646  */
 
3561
#line 3562 "awkgram.c" /* yacc.c:1646  */
3550
3562
    break;
3551
3563
 
3552
3564
  case 146:
3553
 
#line 1540 "awkgram.y" /* yacc.c:1646  */
 
3565
#line 1552 "awkgram.y" /* yacc.c:1646  */
3554
3566
    {
3555
3567
                (yyval) = list_create((yyvsp[0]));
3556
3568
          }
3557
 
#line 3558 "awkgram.c" /* yacc.c:1646  */
 
3569
#line 3570 "awkgram.c" /* yacc.c:1646  */
3558
3570
    break;
3559
3571
 
3560
3572
  case 147:
3561
 
#line 1544 "awkgram.y" /* yacc.c:1646  */
 
3573
#line 1556 "awkgram.y" /* yacc.c:1646  */
3562
3574
    {
3563
3575
                if ((yyvsp[0])->opcode == Op_match_rec) {
3564
3576
                        (yyvsp[0])->opcode = Op_nomatch;
3590
3602
                        }
3591
3603
                }
3592
3604
           }
3593
 
#line 3594 "awkgram.c" /* yacc.c:1646  */
 
3605
#line 3606 "awkgram.c" /* yacc.c:1646  */
3594
3606
    break;
3595
3607
 
3596
3608
  case 148:
3597
 
#line 1576 "awkgram.y" /* yacc.c:1646  */
 
3609
#line 1588 "awkgram.y" /* yacc.c:1646  */
3598
3610
    { (yyval) = (yyvsp[-1]); }
3599
 
#line 3600 "awkgram.c" /* yacc.c:1646  */
 
3611
#line 3612 "awkgram.c" /* yacc.c:1646  */
3600
3612
    break;
3601
3613
 
3602
3614
  case 149:
3603
 
#line 1578 "awkgram.y" /* yacc.c:1646  */
 
3615
#line 1590 "awkgram.y" /* yacc.c:1646  */
3604
3616
    {
3605
3617
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
3606
3618
                if ((yyval) == NULL)
3607
3619
                        YYABORT;
3608
3620
          }
3609
 
#line 3610 "awkgram.c" /* yacc.c:1646  */
 
3621
#line 3622 "awkgram.c" /* yacc.c:1646  */
3610
3622
    break;
3611
3623
 
3612
3624
  case 150:
3613
 
#line 1584 "awkgram.y" /* yacc.c:1646  */
 
3625
#line 1596 "awkgram.y" /* yacc.c:1646  */
3614
3626
    {
3615
3627
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
3616
3628
                if ((yyval) == NULL)
3617
3629
                        YYABORT;
3618
3630
          }
3619
 
#line 3620 "awkgram.c" /* yacc.c:1646  */
 
3631
#line 3632 "awkgram.c" /* yacc.c:1646  */
3620
3632
    break;
3621
3633
 
3622
3634
  case 151:
3623
 
#line 1590 "awkgram.y" /* yacc.c:1646  */
 
3635
#line 1602 "awkgram.y" /* yacc.c:1646  */
3624
3636
    {
3625
3637
                static bool warned = false;
3626
3638
 
3633
3645
                if ((yyval) == NULL)
3634
3646
                        YYABORT;
3635
3647
          }
3636
 
#line 3637 "awkgram.c" /* yacc.c:1646  */
 
3648
#line 3649 "awkgram.c" /* yacc.c:1646  */
3637
3649
    break;
3638
3650
 
3639
3651
  case 154:
3640
 
#line 1605 "awkgram.y" /* yacc.c:1646  */
 
3652
#line 1617 "awkgram.y" /* yacc.c:1646  */
3641
3653
    {
3642
3654
                (yyvsp[-1])->opcode = Op_preincrement;
3643
3655
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
3644
3656
          }
3645
 
#line 3646 "awkgram.c" /* yacc.c:1646  */
 
3657
#line 3658 "awkgram.c" /* yacc.c:1646  */
3646
3658
    break;
3647
3659
 
3648
3660
  case 155:
3649
 
#line 1610 "awkgram.y" /* yacc.c:1646  */
 
3661
#line 1622 "awkgram.y" /* yacc.c:1646  */
3650
3662
    {
3651
3663
                (yyvsp[-1])->opcode = Op_predecrement;
3652
3664
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
3653
3665
          }
3654
 
#line 3655 "awkgram.c" /* yacc.c:1646  */
 
3666
#line 3667 "awkgram.c" /* yacc.c:1646  */
3655
3667
    break;
3656
3668
 
3657
3669
  case 156:
3658
 
#line 1615 "awkgram.y" /* yacc.c:1646  */
 
3670
#line 1627 "awkgram.y" /* yacc.c:1646  */
3659
3671
    {
3660
3672
                (yyval) = list_create((yyvsp[0]));
3661
3673
          }
3662
 
#line 3663 "awkgram.c" /* yacc.c:1646  */
 
3674
#line 3675 "awkgram.c" /* yacc.c:1646  */
3663
3675
    break;
3664
3676
 
3665
3677
  case 157:
3666
 
#line 1619 "awkgram.y" /* yacc.c:1646  */
 
3678
#line 1631 "awkgram.y" /* yacc.c:1646  */
3667
3679
    {
3668
3680
                (yyval) = list_create((yyvsp[0]));
3669
3681
          }
3670
 
#line 3671 "awkgram.c" /* yacc.c:1646  */
 
3682
#line 3683 "awkgram.c" /* yacc.c:1646  */
3671
3683
    break;
3672
3684
 
3673
3685
  case 158:
3674
 
#line 1623 "awkgram.y" /* yacc.c:1646  */
 
3686
#line 1635 "awkgram.y" /* yacc.c:1646  */
3675
3687
    {
3676
3688
                if ((yyvsp[0])->lasti->opcode == Op_push_i
3677
3689
                        && ((yyvsp[0])->lasti->memory->flags & (STRCUR|STRING)) == 0
3686
3698
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
3687
3699
                }
3688
3700
          }
3689
 
#line 3690 "awkgram.c" /* yacc.c:1646  */
 
3701
#line 3702 "awkgram.c" /* yacc.c:1646  */
3690
3702
    break;
3691
3703
 
3692
3704
  case 159:
3693
 
#line 1638 "awkgram.y" /* yacc.c:1646  */
 
3705
#line 1650 "awkgram.y" /* yacc.c:1646  */
3694
3706
    {
3695
3707
            /*
3696
3708
             * was: $$ = $2
3700
3712
                (yyvsp[-1])->memory = make_number(0.0);
3701
3713
                (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
3702
3714
          }
3703
 
#line 3704 "awkgram.c" /* yacc.c:1646  */
 
3715
#line 3716 "awkgram.c" /* yacc.c:1646  */
3704
3716
    break;
3705
3717
 
3706
3718
  case 160:
3707
 
#line 1651 "awkgram.y" /* yacc.c:1646  */
 
3719
#line 1663 "awkgram.y" /* yacc.c:1646  */
3708
3720
    {
3709
3721
                func_use((yyvsp[0])->lasti->func_name, FUNC_USE);
3710
3722
                (yyval) = (yyvsp[0]);
3711
3723
          }
3712
 
#line 3713 "awkgram.c" /* yacc.c:1646  */
 
3724
#line 3725 "awkgram.c" /* yacc.c:1646  */
3713
3725
    break;
3714
3726
 
3715
3727
  case 161:
3716
 
#line 1656 "awkgram.y" /* yacc.c:1646  */
 
3728
#line 1668 "awkgram.y" /* yacc.c:1646  */
3717
3729
    {
3718
3730
                /* indirect function call */
3719
3731
                INSTRUCTION *f, *t;
3745
3757
                 */
3746
3758
 
3747
3759
                (yyval) = list_prepend((yyvsp[0]), t);
 
3760
                at_seen = false;
3748
3761
          }
3749
 
#line 3750 "awkgram.c" /* yacc.c:1646  */
 
3762
#line 3763 "awkgram.c" /* yacc.c:1646  */
3750
3763
    break;
3751
3764
 
3752
3765
  case 162:
3753
 
#line 1692 "awkgram.y" /* yacc.c:1646  */
 
3766
#line 1705 "awkgram.y" /* yacc.c:1646  */
3754
3767
    {
 
3768
                NODE *n;
 
3769
 
 
3770
                if (! at_seen) {
 
3771
                        n = lookup((yyvsp[-3])->func_name);
 
3772
                        if (n != NULL && n->type != Node_func
 
3773
                            && n->type != Node_ext_func && n->type != Node_old_ext_func) {
 
3774
                                error_ln((yyvsp[-3])->source_line,
 
3775
                                        _("attempt to use non-function `%s' in function call"),
 
3776
                                                (yyvsp[-3])->func_name);
 
3777
                        }
 
3778
                }
3755
3779
                param_sanity((yyvsp[-1]));
3756
3780
                (yyvsp[-3])->opcode = Op_func_call;
3757
3781
                (yyvsp[-3])->func_body = NULL;
3764
3788
                        (yyval) = list_append(t, (yyvsp[-3]));
3765
3789
                }
3766
3790
          }
3767
 
#line 3768 "awkgram.c" /* yacc.c:1646  */
 
3791
#line 3792 "awkgram.c" /* yacc.c:1646  */
3768
3792
    break;
3769
3793
 
3770
3794
  case 163:
3771
 
#line 1709 "awkgram.y" /* yacc.c:1646  */
 
3795
#line 1733 "awkgram.y" /* yacc.c:1646  */
3772
3796
    { (yyval) = NULL; }
3773
 
#line 3774 "awkgram.c" /* yacc.c:1646  */
 
3797
#line 3798 "awkgram.c" /* yacc.c:1646  */
3774
3798
    break;
3775
3799
 
3776
3800
  case 164:
3777
 
#line 1711 "awkgram.y" /* yacc.c:1646  */
 
3801
#line 1735 "awkgram.y" /* yacc.c:1646  */
3778
3802
    { (yyval) = (yyvsp[0]); }
3779
 
#line 3780 "awkgram.c" /* yacc.c:1646  */
 
3803
#line 3804 "awkgram.c" /* yacc.c:1646  */
3780
3804
    break;
3781
3805
 
3782
3806
  case 165:
3783
 
#line 1716 "awkgram.y" /* yacc.c:1646  */
 
3807
#line 1740 "awkgram.y" /* yacc.c:1646  */
3784
3808
    { (yyval) = NULL; }
3785
 
#line 3786 "awkgram.c" /* yacc.c:1646  */
 
3809
#line 3810 "awkgram.c" /* yacc.c:1646  */
3786
3810
    break;
3787
3811
 
3788
3812
  case 166:
3789
 
#line 1718 "awkgram.y" /* yacc.c:1646  */
 
3813
#line 1742 "awkgram.y" /* yacc.c:1646  */
3790
3814
    { (yyval) = (yyvsp[-1]); }
3791
 
#line 3792 "awkgram.c" /* yacc.c:1646  */
 
3815
#line 3816 "awkgram.c" /* yacc.c:1646  */
3792
3816
    break;
3793
3817
 
3794
3818
  case 167:
3795
 
#line 1723 "awkgram.y" /* yacc.c:1646  */
 
3819
#line 1747 "awkgram.y" /* yacc.c:1646  */
3796
3820
    {   (yyval) = (yyvsp[0]); }
3797
 
#line 3798 "awkgram.c" /* yacc.c:1646  */
 
3821
#line 3822 "awkgram.c" /* yacc.c:1646  */
3798
3822
    break;
3799
3823
 
3800
3824
  case 168:
3801
 
#line 1725 "awkgram.y" /* yacc.c:1646  */
 
3825
#line 1749 "awkgram.y" /* yacc.c:1646  */
3802
3826
    {
3803
3827
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
3804
3828
          }
3805
 
#line 3806 "awkgram.c" /* yacc.c:1646  */
 
3829
#line 3830 "awkgram.c" /* yacc.c:1646  */
3806
3830
    break;
3807
3831
 
3808
3832
  case 169:
3809
 
#line 1732 "awkgram.y" /* yacc.c:1646  */
 
3833
#line 1756 "awkgram.y" /* yacc.c:1646  */
3810
3834
    {
3811
3835
                INSTRUCTION *ip = (yyvsp[0])->lasti; 
3812
3836
                int count = ip->sub_count;      /* # of SUBSEP-seperated expressions */
3820
3844
                sub_counter++;  /* count # of dimensions */
3821
3845
                (yyval) = (yyvsp[0]);
3822
3846
          }
3823
 
#line 3824 "awkgram.c" /* yacc.c:1646  */
 
3847
#line 3848 "awkgram.c" /* yacc.c:1646  */
3824
3848
    break;
3825
3849
 
3826
3850
  case 170:
3827
 
#line 1749 "awkgram.y" /* yacc.c:1646  */
 
3851
#line 1773 "awkgram.y" /* yacc.c:1646  */
3828
3852
    {
3829
3853
                INSTRUCTION *t = (yyvsp[-1]);
3830
3854
                if ((yyvsp[-1]) == NULL) {
3838
3862
                        (yyvsp[0])->sub_count = count_expressions(&t, false);
3839
3863
                (yyval) = list_append(t, (yyvsp[0]));
3840
3864
          }
3841
 
#line 3842 "awkgram.c" /* yacc.c:1646  */
 
3865
#line 3866 "awkgram.c" /* yacc.c:1646  */
3842
3866
    break;
3843
3867
 
3844
3868
  case 171:
3845
 
#line 1766 "awkgram.y" /* yacc.c:1646  */
 
3869
#line 1790 "awkgram.y" /* yacc.c:1646  */
3846
3870
    {   (yyval) = (yyvsp[0]); }
3847
 
#line 3848 "awkgram.c" /* yacc.c:1646  */
 
3871
#line 3872 "awkgram.c" /* yacc.c:1646  */
3848
3872
    break;
3849
3873
 
3850
3874
  case 172:
3851
 
#line 1768 "awkgram.y" /* yacc.c:1646  */
 
3875
#line 1792 "awkgram.y" /* yacc.c:1646  */
3852
3876
    {
3853
3877
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
3854
3878
          }
3855
 
#line 3856 "awkgram.c" /* yacc.c:1646  */
 
3879
#line 3880 "awkgram.c" /* yacc.c:1646  */
3856
3880
    break;
3857
3881
 
3858
3882
  case 173:
3859
 
#line 1775 "awkgram.y" /* yacc.c:1646  */
 
3883
#line 1799 "awkgram.y" /* yacc.c:1646  */
3860
3884
    { (yyval) = (yyvsp[-1]); }
3861
 
#line 3862 "awkgram.c" /* yacc.c:1646  */
 
3885
#line 3886 "awkgram.c" /* yacc.c:1646  */
3862
3886
    break;
3863
3887
 
3864
3888
  case 174:
3865
 
#line 1780 "awkgram.y" /* yacc.c:1646  */
 
3889
#line 1804 "awkgram.y" /* yacc.c:1646  */
3866
3890
    {
3867
3891
                char *var_name = (yyvsp[0])->lextok;
3868
3892
 
3870
3894
                (yyvsp[0])->memory = variable((yyvsp[0])->source_line, var_name, Node_var_new);
3871
3895
                (yyval) = list_create((yyvsp[0]));
3872
3896
          }
3873
 
#line 3874 "awkgram.c" /* yacc.c:1646  */
 
3897
#line 3898 "awkgram.c" /* yacc.c:1646  */
3874
3898
    break;
3875
3899
 
3876
3900
  case 175:
3877
 
#line 1788 "awkgram.y" /* yacc.c:1646  */
 
3901
#line 1812 "awkgram.y" /* yacc.c:1646  */
3878
3902
    {
3879
3903
                char *arr = (yyvsp[-1])->lextok;
3880
3904
                (yyvsp[-1])->memory = variable((yyvsp[-1])->source_line, arr, Node_var_new);
3881
3905
                (yyvsp[-1])->opcode = Op_push_array;
3882
3906
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-1]));
3883
3907
          }
3884
 
#line 3885 "awkgram.c" /* yacc.c:1646  */
 
3908
#line 3909 "awkgram.c" /* yacc.c:1646  */
3885
3909
    break;
3886
3910
 
3887
3911
  case 176:
3888
 
#line 1798 "awkgram.y" /* yacc.c:1646  */
 
3912
#line 1822 "awkgram.y" /* yacc.c:1646  */
3889
3913
    {
3890
3914
                INSTRUCTION *ip = (yyvsp[0])->nexti;
3891
3915
                if (ip->opcode == Op_push
3897
3921
                } else
3898
3922
                        (yyval) = (yyvsp[0]);
3899
3923
          }
3900
 
#line 3901 "awkgram.c" /* yacc.c:1646  */
 
3924
#line 3925 "awkgram.c" /* yacc.c:1646  */
3901
3925
    break;
3902
3926
 
3903
3927
  case 177:
3904
 
#line 1810 "awkgram.y" /* yacc.c:1646  */
 
3928
#line 1834 "awkgram.y" /* yacc.c:1646  */
3905
3929
    {
3906
3930
                (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
3907
3931
                if ((yyvsp[0]) != NULL)
3908
3932
                        mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
3909
3933
          }
3910
 
#line 3911 "awkgram.c" /* yacc.c:1646  */
 
3934
#line 3935 "awkgram.c" /* yacc.c:1646  */
3911
3935
    break;
3912
3936
 
3913
3937
  case 178:
3914
 
#line 1819 "awkgram.y" /* yacc.c:1646  */
 
3938
#line 1843 "awkgram.y" /* yacc.c:1646  */
3915
3939
    {
3916
3940
                (yyvsp[0])->opcode = Op_postincrement;
3917
3941
          }
3918
 
#line 3919 "awkgram.c" /* yacc.c:1646  */
 
3942
#line 3943 "awkgram.c" /* yacc.c:1646  */
3919
3943
    break;
3920
3944
 
3921
3945
  case 179:
3922
 
#line 1823 "awkgram.y" /* yacc.c:1646  */
 
3946
#line 1847 "awkgram.y" /* yacc.c:1646  */
3923
3947
    {
3924
3948
                (yyvsp[0])->opcode = Op_postdecrement;
3925
3949
          }
3926
 
#line 3927 "awkgram.c" /* yacc.c:1646  */
 
3950
#line 3951 "awkgram.c" /* yacc.c:1646  */
3927
3951
    break;
3928
3952
 
3929
3953
  case 180:
3930
 
#line 1826 "awkgram.y" /* yacc.c:1646  */
 
3954
#line 1850 "awkgram.y" /* yacc.c:1646  */
3931
3955
    { (yyval) = NULL; }
3932
 
#line 3933 "awkgram.c" /* yacc.c:1646  */
 
3956
#line 3957 "awkgram.c" /* yacc.c:1646  */
3933
3957
    break;
3934
3958
 
3935
3959
  case 182:
3936
 
#line 1834 "awkgram.y" /* yacc.c:1646  */
 
3960
#line 1858 "awkgram.y" /* yacc.c:1646  */
3937
3961
    { yyerrok; }
3938
 
#line 3939 "awkgram.c" /* yacc.c:1646  */
 
3962
#line 3963 "awkgram.c" /* yacc.c:1646  */
3939
3963
    break;
3940
3964
 
3941
3965
  case 183:
3942
 
#line 1838 "awkgram.y" /* yacc.c:1646  */
 
3966
#line 1862 "awkgram.y" /* yacc.c:1646  */
3943
3967
    { yyerrok; }
3944
 
#line 3945 "awkgram.c" /* yacc.c:1646  */
 
3968
#line 3969 "awkgram.c" /* yacc.c:1646  */
3945
3969
    break;
3946
3970
 
3947
3971
  case 186:
3948
 
#line 1847 "awkgram.y" /* yacc.c:1646  */
 
3972
#line 1871 "awkgram.y" /* yacc.c:1646  */
3949
3973
    { yyerrok; }
3950
 
#line 3951 "awkgram.c" /* yacc.c:1646  */
 
3974
#line 3975 "awkgram.c" /* yacc.c:1646  */
3951
3975
    break;
3952
3976
 
3953
3977
  case 187:
3954
 
#line 1851 "awkgram.y" /* yacc.c:1646  */
 
3978
#line 1875 "awkgram.y" /* yacc.c:1646  */
3955
3979
    { (yyval) = (yyvsp[0]); yyerrok; }
3956
 
#line 3957 "awkgram.c" /* yacc.c:1646  */
 
3980
#line 3981 "awkgram.c" /* yacc.c:1646  */
3957
3981
    break;
3958
3982
 
3959
3983
  case 188:
3960
 
#line 1855 "awkgram.y" /* yacc.c:1646  */
 
3984
#line 1879 "awkgram.y" /* yacc.c:1646  */
3961
3985
    { yyerrok; }
3962
 
#line 3963 "awkgram.c" /* yacc.c:1646  */
 
3986
#line 3987 "awkgram.c" /* yacc.c:1646  */
3963
3987
    break;
3964
3988
 
3965
3989
 
3966
 
#line 3967 "awkgram.c" /* yacc.c:1646  */
 
3990
#line 3991 "awkgram.c" /* yacc.c:1646  */
3967
3991
      default: break;
3968
3992
    }
3969
3993
  /* User semantic actions sometimes alter yychar, and that requires
4191
4215
#endif
4192
4216
  return yyresult;
4193
4217
}
4194
 
#line 1857 "awkgram.y" /* yacc.c:1906  */
 
4218
#line 1881 "awkgram.y" /* yacc.c:1906  */
4195
4219
 
4196
4220
 
4197
4221
struct token {
4263
4287
{"dcngettext",  Op_builtin,      LEX_BUILTIN,   GAWKX|A(1)|A(2)|A(3)|A(4)|A(5), do_dcngettext,  0},
4264
4288
{"default",     Op_K_default,    LEX_DEFAULT,   GAWKX,          0,      0},
4265
4289
{"delete",      Op_K_delete,     LEX_DELETE,    NOT_OLD,        0,      0},
4266
 
{"div",         Op_builtin,      LEX_BUILTIN,   GAWKX|A(3),     do_div, MPF(div)},
4267
4290
{"do",          Op_K_do,         LEX_DO,        NOT_OLD|BREAK|CONTINUE, 0,      0},
4268
4291
{"else",        Op_K_else,       LEX_ELSE,      0,              0,      0},
4269
4292
{"eval",        Op_symbol,       LEX_EVAL,      0,              0,      0},
4284
4307
{"include",     Op_symbol,       LEX_INCLUDE,   GAWKX,  0,      0},
4285
4308
{"index",       Op_builtin,      LEX_BUILTIN,   A(2),           do_index,       0},
4286
4309
{"int",         Op_builtin,      LEX_BUILTIN,   A(1),           do_int, MPF(int)},
 
4310
{"intdiv",      Op_builtin,      LEX_BUILTIN,   GAWKX|A(3),     do_intdiv,      MPF(intdiv)},
4287
4311
{"isarray",     Op_builtin,      LEX_BUILTIN,   GAWKX|A(1),     do_isarray,     0},
4288
4312
{"length",      Op_builtin,      LEX_LENGTH,    A(0)|A(1),      do_length,      0},
4289
4313
{"load",        Op_symbol,       LEX_LOAD,      GAWKX,          0,      0},
4321
4345
{"xor",         Op_builtin,    LEX_BUILTIN,     GAWKX,          do_xor, MPF(xor)},
4322
4346
};
4323
4347
 
4324
 
#if MBS_SUPPORT
4325
4348
/* Variable containing the current shift state.  */
4326
4349
static mbstate_t cur_mbstate;
4327
4350
/* Ring buffer containing current characters.  */
4333
4356
/* This macro means that last nextc() return a singlebyte character
4334
4357
   or 1st byte of a multibyte character.  */
4335
4358
#define nextc_is_1stbyte (cur_char_ring[cur_ring_idx] == 1)
4336
 
#else /* MBS_SUPPORT */
4337
 
/* a dummy */
4338
 
#define nextc_is_1stbyte 1
4339
 
#endif /* MBS_SUPPORT */
4340
4359
 
4341
4360
/* getfname --- return name of a builtin function (for pretty printing) */
4342
4361
 
4625
4644
                                cp = end_block;
4626
4645
                        else
4627
4646
                                cp = list_merge(begin_block, end_block);
4628
 
                        /*
4629
 
                         * We don't need to clear the comment variables
4630
 
                         * since they're not used anymore after this
4631
 
                         * function is called.
4632
 
                         */
 
4647
                        if (program_comment != NULL) {
 
4648
                                (void) list_prepend(cp, program_comment);
 
4649
                        }  
4633
4650
                        if (comment != NULL)
4634
4651
                                (void) list_append(cp, comment);
4635
4652
                        (void) list_append(cp, ip_atexit);
4677
4694
        /* delete the Op_list, not needed */
4678
4695
        tmp = cp->nexti;
4679
4696
        bcfree(cp);
 
4697
        /* these variables are not used again but zap them anyway.  */
 
4698
        comment = NULL;
 
4699
        function_comment = NULL;
 
4700
        program_comment = NULL;
4680
4701
        return tmp;
4681
4702
 
4682
4703
#undef begin_block
4703
4724
                ip_newfile = ip_rec = ip_atexit = ip_beginfile = ip_endfile = NULL;
4704
4725
        else {
4705
4726
                ip_endfile = instruction(Op_no_op);
4706
 
                ip_beginfile = instruction(Op_no_op);
 
4727
                main_beginfile = ip_beginfile = instruction(Op_no_op);
4707
4728
                ip_rec = instruction(Op_get_record); /* target for `next', also ip_newfile */
4708
4729
                ip_newfile = bcalloc(Op_newfile, 2, 0); /* target for `nextfile' */
4709
4730
                ip_newfile->target_jmp = ip_end;
4733
4754
        if (ret == 0)   /* avoid spurious warning if parser aborted with YYABORT */
4734
4755
                check_funcs();
4735
4756
 
 
4757
        if (do_posix && ! check_param_names())
 
4758
                errcount++;
 
4759
 
4736
4760
        if (args_array == NULL)
4737
4761
                emalloc(args_array, NODE **, (max_args + 2) * sizeof(NODE *), "parse_program");
4738
4762
        else
5238
5262
 
5239
5263
/* nextc --- get the next input character */
5240
5264
 
5241
 
#if MBS_SUPPORT
5242
 
 
5243
5265
static int
5244
5266
nextc(bool check_for_bad)
5245
5267
{
5310
5332
        }
5311
5333
}
5312
5334
 
5313
 
#else /* MBS_SUPPORT */
5314
 
 
5315
 
int
5316
 
nextc(bool check_for_bad)
5317
 
{
5318
 
        do {
5319
 
                if (lexeof)
5320
 
                        return END_FILE;
5321
 
                if (lexptr && lexptr < lexend) {
5322
 
                        if (check_for_bad)
5323
 
                                check_bad_char(*lexptr);
5324
 
                        return ((int) (unsigned char) *lexptr++);
5325
 
                }
5326
 
        } while (get_src_buf());
5327
 
        return END_SRC;
5328
 
}
5329
 
 
5330
 
#endif /* MBS_SUPPORT */
5331
 
 
5332
5335
/* pushback --- push a character back on the input */
5333
5336
 
5334
5337
static inline void
5335
5338
pushback(void)
5336
5339
{
5337
 
#if MBS_SUPPORT
5338
5340
        if (gawk_mb_cur_max > 1)
5339
5341
                cur_ring_idx = (cur_ring_idx == 0)? RING_BUFFER_SIZE - 1 :
5340
5342
                        cur_ring_idx - 1;
5341
 
#endif
5342
5343
        (! lexeof && lexptr && lexptr > lexptr_begin ? lexptr-- : lexptr);
5343
5344
}
5344
5345
 
5345
 
 
5346
 
/* get_comment --- collect comment text */
 
5346
/* check_comment --- check for block comment */
 
5347
 
 
5348
void
 
5349
check_comment(void)
 
5350
{
 
5351
        if (comment != NULL) {
 
5352
                if (first_rule) {
 
5353
                        program_comment = comment;
 
5354
                } else 
 
5355
                        block_comment = comment;
 
5356
                comment = NULL;
 
5357
        }
 
5358
        first_rule = false;
 
5359
}
 
5360
 
 
5361
/*
 
5362
 * get_comment --- collect comment text.
 
5363
 *      Flag = EOL_COMMENT for end-of-line comments.
 
5364
 *      Flag = FULL_COMMENT for self-contained comments.
 
5365
 */
5347
5366
 
5348
5367
int
5349
 
get_comment(void)
 
5368
get_comment(int flag)
5350
5369
{
5351
5370
        int c;
5352
5371
        int sl;
5358
5377
                while ((c = nextc(false)) != '\n' && c != END_FILE) {
5359
5378
                        tokadd(c);
5360
5379
                }
 
5380
                if (flag == EOL_COMMENT) {
 
5381
                        /* comment at end of line.  */
 
5382
                        if (c == '\n')
 
5383
                                tokadd(c);
 
5384
                        break;
 
5385
                }
5361
5386
                if (c == '\n') {
5362
5387
                        tokadd(c);
5363
5388
                        sourceline++;
5372
5397
                                break;
5373
5398
                        else if (c != '#') {
5374
5399
                                pushback();
 
5400
                                sourceline--;
5375
5401
                                break;
5376
5402
                        } else
5377
5403
                                tokadd(c);
5381
5407
        comment = bcalloc(Op_comment, 1, sl);
5382
5408
        comment->source_file = source;
5383
5409
        comment->memory = make_str_node(tokstart, tok - tokstart, 0);
 
5410
        comment->memory->comment_type = flag;
5384
5411
 
5385
5412
        return c;
5386
5413
}
5432
5459
                if (c == '#') {
5433
5460
                        if (do_pretty_print && ! do_profile) {
5434
5461
                        /* collect comment byte code iff doing pretty print but not profiling.  */
5435
 
                                c = get_comment();
 
5462
                                c = get_comment(EOL_COMMENT);
5436
5463
                        } else {
5437
5464
                                while ((c = nextc(false)) != '\n' && c != END_FILE)
5438
5465
                                        continue;
5508
5535
        if (lasttok == LEX_EOF)         /* error earlier in current source, must give up !! */
5509
5536
                return 0;
5510
5537
 
5511
 
        c = nextc(true);
 
5538
        c = nextc(! want_regexp);
5512
5539
        if (c == END_SRC)
5513
5540
                return 0;
5514
5541
        if (c == END_FILE)
5550
5577
                want_regexp = false;
5551
5578
                tok = tokstart;
5552
5579
                for (;;) {
5553
 
                        c = nextc(true);
 
5580
                        c = nextc(false);
5554
5581
 
5555
5582
                        if (gawk_mb_cur_max == 1 || nextc_is_1stbyte) switch (c) {
5556
5583
                        case '[':
5557
5584
                                /* one day check for `.' and `=' too */
5558
 
                                if (nextc(true) == ':' || in_brack == 0)
 
5585
                                if (nextc(false) == ':' || in_brack == 0)
5559
5586
                                        in_brack++;
5560
5587
                                pushback();
5561
5588
                                break;
5562
5589
                        case ']':
5563
 
                                if (tokstart[0] == '['
5564
 
                                    && (tok == tokstart + 1
5565
 
                                        || (tok == tokstart + 2
5566
 
                                            && tokstart[1] == '^')))
 
5590
                                if (tok[-1] == '['
 
5591
                                    || (tok[-2] == '[' && tok[-1] == '^'))
5567
5592
                                        /* do nothing */;
5568
5593
                                else
5569
5594
                                        in_brack--;
5570
5595
                                break;
5571
5596
                        case '\\':
5572
 
                                if ((c = nextc(true)) == END_FILE) {
 
5597
                                if ((c = nextc(false)) == END_FILE) {
5573
5598
                                        pushback();
5574
5599
                                        yyerror(_("unterminated regexp ends with `\\' at end of file"));
5575
5600
                                        goto end_regexp; /* kludge */
5576
 
                                } else if (c == '\n') {
 
5601
                                }
 
5602
                                if (c == '\r')  /* allow MS-DOS files. bleah */
 
5603
                                        c = nextc(true);
 
5604
                                if (c == '\n') {
5577
5605
                                        sourceline++;
5578
5606
                                        continue;
5579
5607
                                } else {
5626
5654
        thisline = NULL;
5627
5655
        tok = tokstart;
5628
5656
 
5629
 
#if MBS_SUPPORT
5630
5657
        if (gawk_mb_cur_max == 1 || nextc_is_1stbyte)
5631
 
#endif
5632
5658
        switch (c) {
5633
5659
        case END_SRC:
5634
5660
                return 0;
5646
5672
                         * Collect comment byte code iff doing pretty print
5647
5673
                         * but not profiling.
5648
5674
                         */
5649
 
                        c = get_comment();
 
5675
                        if (lasttok == NEWLINE || lasttok == 0)
 
5676
                                c = get_comment(FULL_COMMENT);
 
5677
                        else
 
5678
                                c = get_comment(EOL_COMMENT);
5650
5679
 
5651
5680
                        if (c == END_FILE)
5652
5681
                                return lasttok = NEWLINE_EOF;
5660
5689
                return lasttok = NEWLINE;
5661
5690
 
5662
5691
        case '@':
 
5692
                at_seen = true;
5663
5693
                return lasttok = '@';
5664
5694
 
5665
5695
        case '\\':
5683
5713
                _("use of `\\ #...' line continuation is not portable"));
5684
5714
                                }
5685
5715
                                if (do_pretty_print && ! do_profile)
5686
 
                                        c = get_comment();
 
5716
                                        c = get_comment(EOL_COMMENT);
5687
5717
                                else {
5688
5718
                                        while ((c = nextc(false)) != '\n')
5689
5719
                                                if (c == END_FILE)
5785
5815
                return lasttok = '*';
5786
5816
 
5787
5817
        case '/':
5788
 
                if (nextc(true) == '=') {
 
5818
                if (nextc(false) == '=') {
5789
5819
                        pushback();
5790
5820
                        return lasttok = SLASH_BEFORE_EQUAL;
5791
5821
                }
5920
5950
                        if ((gawk_mb_cur_max == 1 || nextc_is_1stbyte) &&
5921
5951
                            c == '\\') {
5922
5952
                                c = nextc(true);
 
5953
                                if (c == '\r')  /* allow MS-DOS files. bleah */
 
5954
                                        c = nextc(true);
5923
5955
                                if (c == '\n') {
5924
5956
                                        sourceline++;
5925
5957
                                        continue;
6449
6481
                arg = subn->nexti;
6450
6482
                if (arg->nexti == arg->lasti && arg->nexti->opcode == Op_push)
6451
6483
                        arg->nexti->opcode = Op_push_arg;       /* argument may be array */
6452
 
        } else if (r->builtin == do_div
 
6484
        } else if (r->builtin == do_intdiv
6453
6485
#ifdef HAVE_MPFR
6454
 
                   || r->builtin == MPF(div)
 
6486
                   || r->builtin == MPF(intdiv)
6455
6487
#endif
6456
6488
                        ) {
6457
6489
                arg = subn->nexti->lasti->nexti->lasti->nexti;  /* 3rd arg list */
6803
6835
        int pcount = 0;
6804
6836
 
6805
6837
        r = lookup(fname);
6806
 
        if (r != NULL || is_deferred_variable(fname)) {
 
6838
        if (r != NULL) {
6807
6839
                error_ln(fi->source_line, _("function name `%s' previously defined"), fname);
6808
6840
                return -1;
6809
6841
        }
6996
7028
        }
6997
7029
}
6998
7030
 
6999
 
/* deferred variables --- those that are only defined if needed. */
7000
 
 
7001
 
/*
7002
 
 * Is there any reason to use a hash table for deferred variables?  At the
7003
 
 * moment, there are only 1 to 3 such variables, so it may not be worth
7004
 
 * the overhead.  If more modules start using this facility, it should
7005
 
 * probably be converted into a hash table.
7006
 
 */
7007
 
 
7008
 
static struct deferred_variable {
7009
 
        NODE *(*load_func)(void);
7010
 
        struct deferred_variable *next;
7011
 
        char name[1];   /* variable-length array */
7012
 
} *deferred_variables;
7013
 
 
7014
 
/* register_deferred_variable --- add a var name and loading function to the list */
7015
 
 
7016
 
void
7017
 
register_deferred_variable(const char *name, NODE *(*load_func)(void))
7018
 
{
7019
 
        struct deferred_variable *dv;
7020
 
        size_t sl = strlen(name);
7021
 
 
7022
 
        emalloc(dv, struct deferred_variable *, sizeof(*dv)+sl,
7023
 
                "register_deferred_variable");
7024
 
        dv->load_func = load_func;
7025
 
        dv->next = deferred_variables;
7026
 
        memcpy(dv->name, name, sl+1);
7027
 
        deferred_variables = dv;
7028
 
}
7029
 
 
7030
 
/* is_deferred_variable --- check if NAME is a deferred variable */
7031
 
 
7032
 
static bool
7033
 
is_deferred_variable(const char *name)
7034
 
{
7035
 
        struct deferred_variable *dv;
7036
 
        for (dv = deferred_variables; dv != NULL; dv = dv->next)
7037
 
                if (strcmp(name, dv->name) == 0)
7038
 
                        return true;
7039
 
        return false;
7040
 
}
7041
 
 
7042
 
 
7043
7031
/* variable --- make sure NAME is in the symbol table */
7044
7032
 
7045
7033
NODE *
7051
7039
                if (r->type == Node_func || r->type == Node_ext_func )
7052
7040
                        error_ln(location, _("function `%s' called with space between name and `(',\nor used as a variable or an array"),
7053
7041
                                r->vname);
7054
 
                if (r == symbol_table)
7055
 
                        symtab_used = true;
7056
7042
        } else {
7057
7043
                /* not found */
7058
 
                struct deferred_variable *dv;
7059
 
 
7060
 
                for (dv = deferred_variables; true; dv = dv->next) {
7061
 
                        if (dv == NULL) {
7062
 
                                /*
7063
 
                                 * This is the only case in which we may not free the string.
7064
 
                                 */
7065
 
                                return install_symbol(name, type);
7066
 
                        }
7067
 
                        if (strcmp(name, dv->name) == 0) {
7068
 
                                r = (*dv->load_func)();
7069
 
                                break;
7070
 
                        }
7071
 
                }
 
7044
                return install_symbol(name, type);
7072
7045
        }
7073
7046
        efree(name);
7074
7047
        return r;
7075
7048
}
7076
7049
 
7077
 
/* process_deferred --- if the program uses SYMTAB, load deferred variables */
7078
 
 
7079
 
static void
7080
 
process_deferred()
7081
 
{
7082
 
        struct deferred_variable *dv;
7083
 
 
7084
 
        if (! symtab_used)
7085
 
                return;
7086
 
 
7087
 
        for (dv = deferred_variables; dv != NULL; dv = dv->next) {
7088
 
                (void) dv->load_func();
7089
 
        }
7090
 
}
7091
 
 
7092
7050
/* make_regnode --- make a regular expression node */
7093
7051
 
7094
 
static NODE *
 
7052
NODE *
7095
7053
make_regnode(int type, NODE *exp)
7096
7054
{
7097
7055
        NODE *n;
7538
7496
                (rp + 1)->lasti = action->lasti;
7539
7497
                (rp + 2)->first_line = pattern->source_line;
7540
7498
                (rp + 2)->last_line = lastline;
7541
 
                ip = list_prepend(action, rp);
 
7499
                if (block_comment != NULL) {
 
7500
                        ip = list_prepend(list_prepend(action, block_comment), rp);
 
7501
                        block_comment = NULL;
 
7502
                } else
 
7503
                        ip = list_prepend(action, rp);
7542
7504
 
7543
7505
        } else {
7544
7506
                rp = bcalloc(Op_rule, 3, 0);
8243
8205
{
8244
8206
        int mid = check_special(name);
8245
8207
 
8246
 
        if (mid == -1 || tokentab[mid].class != LEX_BUILTIN)
8247
 
                return NULL;
 
8208
        if (mid == -1)
 
8209
                return NULL;
 
8210
 
 
8211
        switch (tokentab[mid].class) {
 
8212
        case LEX_BUILTIN:
 
8213
        case LEX_LENGTH:
 
8214
                break;
 
8215
        default:
 
8216
                return NULL;
 
8217
        }
 
8218
 
8248
8219
#ifdef HAVE_MPFR
8249
8220
        if (do_mpfr)
8250
8221
                return tokentab[mid].ptr2;
8251
8222
#endif
8252
8223
 
 
8224
        /* And another special case... */
 
8225
        if (tokentab[mid].value == Op_sub_builtin)
 
8226
                return (builtin_func_t) do_sub;
 
8227
 
8253
8228
        return tokentab[mid].ptr;
8254
8229
}
8255
8230
 
8259
8234
install_builtins(void)
8260
8235
{
8261
8236
        int i, j;
 
8237
        int flags_that_must_be_clear = DEBUG_USE;
 
8238
 
 
8239
        if (do_traditional)
 
8240
                flags_that_must_be_clear |= GAWKX;
 
8241
 
 
8242
        if (do_posix)
 
8243
                flags_that_must_be_clear |= NOT_POSIX;
 
8244
 
8262
8245
 
8263
8246
        j = sizeof(tokentab) / sizeof(tokentab[0]);
8264
8247
        for (i = 0; i < j; i++) {
8265
 
                if (    tokentab[i].class == LEX_BUILTIN
8266
 
                    && (tokentab[i].flags & DEBUG_USE) == 0) {
 
8248
                if (   (tokentab[i].class == LEX_BUILTIN
 
8249
                        || tokentab[i].class == LEX_LENGTH)
 
8250
                    && (tokentab[i].flags & flags_that_must_be_clear) == 0) {
8267
8251
                        (void) install_symbol(tokentab[i].operator, Node_builtin_func);
8268
8252
                }
8269
8253
        }