gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, master, updated. gawk-4.1.0-1992-g2d63bc


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, master, updated. gawk-4.1.0-1992-g2d63bc3
Date: Sun, 16 Oct 2016 07:25:25 +0000 (UTC)

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

The branch, master has been updated
       via  2d63bc3ee2a686560d29e1eb7b433deb45fd7619 (commit)
      from  8b0d41a9bfe9e97c8580e40eb34c0a1889663b38 (commit)

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

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

commit 2d63bc3ee2a686560d29e1eb7b433deb45fd7619
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Oct 16 10:25:02 2016 +0300

    Implement unary plus for real, including for pretty printing.

diff --git a/ChangeLog b/ChangeLog
index 8f632e5..218cf24 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2016-10-16         Arnold D. Robbins     <address@hidden>
+
+       * awk.h (enum opcodeval): Add Op_unary_plus.
+       * awkgram.y (add_sign_to_num): New routine to put in a sign on
+       profiling constants.  Call it as necessary.
+       In unary plus production, use new opcode, or set up a
+       constant as for unary minus.
+       (negate_num): Call add_sign_to_num instead of doing it directly.
+       * eval.c (optypetab): Add entry for Op_unary_plus.
+       * interpret.h (r_interpret): Add case for Op_unary_plus.
+       * profile.c (pprint, prec_level, is_scalar): Ditto.
+
 2016-10-13         Arnold D. Robbins     <address@hidden>
 
        * dfa.c: Sync with GNULIB.
diff --git a/awk.h b/awk.h
index 827d550..ad7b33a 100644
--- a/awk.h
+++ b/awk.h
@@ -626,6 +626,7 @@ typedef enum opcodeval {
        Op_postincrement,
        Op_postdecrement,
        Op_unary_minus,
+       Op_unary_plus,
        Op_field_spec,
 
        /* unary relationals */
diff --git a/awkgram.c b/awkgram.c
index 2b88d3f..2832bab 100644
--- a/awkgram.c
+++ b/awkgram.c
@@ -126,6 +126,7 @@ static ssize_t read_one_line(int fd, void *buffer, size_t 
count);
 static int one_line_close(int fd);
 static void split_comment(void);
 static void check_comment(void);
+static void add_sign_to_num(NODE *n, char sign);
 
 static bool at_seen = false;
 static bool want_source = false;
@@ -211,7 +212,7 @@ extern double fmod(double x, double y);
 
 #define YYSTYPE INSTRUCTION *
 
-#line 215 "awkgram.c" /* yacc.c:339  */
+#line 216 "awkgram.c" /* yacc.c:339  */
 
 # ifndef YY_NULLPTR
 #  if defined __cplusplus && 201103L <= __cplusplus
@@ -365,7 +366,7 @@ int yyparse (void);
 
 /* Copy the second part of user declarations.  */
 
-#line 369 "awkgram.c" /* yacc.c:358  */
+#line 370 "awkgram.c" /* yacc.c:358  */
 
 #ifdef short
 # undef short
@@ -667,26 +668,26 @@ static const yytype_uint8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_uint16 yyrline[] =
 {
-       0,   214,   214,   216,   221,   222,   226,   238,   243,   254,
-     261,   267,   276,   284,   286,   291,   299,   301,   307,   315,
-     325,   355,   369,   383,   391,   402,   414,   416,   418,   424,
-     432,   433,   437,   437,   483,   482,   516,   518,   523,   533,
-     580,   585,   586,   590,   592,   594,   601,   691,   733,   775,
-     888,   895,   902,   913,   923,   933,   943,   955,   972,   971,
-     996,  1008,  1008,  1107,  1107,  1141,  1172,  1181,  1182,  1188,
-    1189,  1196,  1201,  1213,  1227,  1229,  1237,  1242,  1244,  1255,
-    1257,  1266,  1267,  1275,  1280,  1280,  1291,  1295,  1303,  1304,
-    1307,  1309,  1314,  1315,  1324,  1325,  1330,  1335,  1344,  1346,
-    1348,  1355,  1356,  1362,  1363,  1368,  1370,  1375,  1377,  1385,
-    1390,  1399,  1400,  1405,  1407,  1412,  1414,  1422,  1427,  1435,
-    1440,  1447,  1449,  1451,  1468,  1478,  1485,  1487,  1492,  1494,
-    1496,  1504,  1506,  1511,  1513,  1518,  1520,  1522,  1578,  1580,
-    1582,  1584,  1586,  1588,  1590,  1592,  1606,  1611,  1616,  1641,
-    1647,  1649,  1651,  1653,  1655,  1657,  1662,  1666,  1698,  1700,
-    1706,  1712,  1725,  1726,  1727,  1732,  1737,  1741,  1745,  1760,
-    1773,  1778,  1815,  1844,  1845,  1851,  1852,  1857,  1859,  1866,
-    1883,  1900,  1902,  1909,  1914,  1922,  1932,  1944,  1953,  1957,
-    1961,  1965,  1969,  1973,  1976,  1978,  1982,  1986,  1990
+       0,   215,   215,   217,   222,   223,   227,   239,   244,   255,
+     262,   268,   277,   285,   287,   292,   300,   302,   308,   316,
+     326,   356,   370,   384,   392,   403,   415,   417,   419,   425,
+     433,   434,   438,   438,   484,   483,   517,   519,   524,   534,
+     581,   586,   587,   591,   593,   595,   602,   692,   734,   776,
+     889,   896,   903,   914,   924,   934,   944,   956,   973,   972,
+     997,  1009,  1009,  1108,  1108,  1142,  1173,  1182,  1183,  1189,
+    1190,  1197,  1202,  1214,  1228,  1230,  1238,  1245,  1247,  1258,
+    1260,  1269,  1270,  1278,  1283,  1283,  1294,  1298,  1306,  1307,
+    1310,  1312,  1317,  1318,  1327,  1328,  1333,  1338,  1347,  1349,
+    1351,  1358,  1359,  1365,  1366,  1371,  1373,  1378,  1380,  1388,
+    1393,  1402,  1403,  1408,  1410,  1415,  1417,  1425,  1430,  1438,
+    1443,  1450,  1452,  1454,  1471,  1481,  1488,  1490,  1495,  1497,
+    1499,  1507,  1509,  1514,  1516,  1521,  1523,  1525,  1581,  1583,
+    1585,  1587,  1589,  1591,  1593,  1595,  1609,  1614,  1619,  1644,
+    1650,  1652,  1654,  1656,  1658,  1660,  1665,  1669,  1701,  1703,
+    1709,  1715,  1728,  1729,  1730,  1735,  1740,  1744,  1748,  1763,
+    1784,  1789,  1826,  1855,  1856,  1862,  1863,  1868,  1870,  1877,
+    1894,  1911,  1913,  1920,  1925,  1933,  1943,  1955,  1964,  1968,
+    1972,  1976,  1980,  1984,  1987,  1989,  1993,  1997,  2001
 };
 #endif
 
@@ -1863,24 +1864,24 @@ yyreduce:
   switch (yyn)
     {
         case 3:
-#line 217 "awkgram.y" /* yacc.c:1646  */
+#line 218 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                yyerrok;
          }
-#line 1872 "awkgram.c" /* yacc.c:1646  */
+#line 1873 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 5:
-#line 223 "awkgram.y" /* yacc.c:1646  */
+#line 224 "awkgram.y" /* yacc.c:1646  */
     {
                next_sourcefile();
          }
-#line 1880 "awkgram.c" /* yacc.c:1646  */
+#line 1881 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 6:
-#line 227 "awkgram.y" /* yacc.c:1646  */
+#line 228 "awkgram.y" /* yacc.c:1646  */
     {
                rule = 0;
                /*
@@ -1889,20 +1890,20 @@ yyreduce:
                 */
                /* yyerrok; */
          }
-#line 1893 "awkgram.c" /* yacc.c:1646  */
+#line 1894 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 7:
-#line 239 "awkgram.y" /* yacc.c:1646  */
+#line 240 "awkgram.y" /* yacc.c:1646  */
     {
                (void) append_rule((yyvsp[-1]), (yyvsp[0]));
                first_rule = false;
          }
-#line 1902 "awkgram.c" /* yacc.c:1646  */
+#line 1903 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 8:
-#line 244 "awkgram.y" /* yacc.c:1646  */
+#line 245 "awkgram.y" /* yacc.c:1646  */
     {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@ -1913,42 +1914,42 @@ yyreduce:
                } else          /* pattern rule with non-empty pattern */
                        (void) append_rule((yyvsp[-1]), NULL);
          }
-#line 1917 "awkgram.c" /* yacc.c:1646  */
+#line 1918 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 9:
-#line 255 "awkgram.y" /* yacc.c:1646  */
+#line 256 "awkgram.y" /* yacc.c:1646  */
     {
                in_function = NULL;
                (void) mk_function((yyvsp[-1]), (yyvsp[0]));
                want_param_names = DONT_CHECK;
                yyerrok;
          }
-#line 1928 "awkgram.c" /* yacc.c:1646  */
+#line 1929 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 10:
-#line 262 "awkgram.y" /* yacc.c:1646  */
+#line 263 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                at_seen = false;
                yyerrok;
          }
-#line 1938 "awkgram.c" /* yacc.c:1646  */
+#line 1939 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 11:
-#line 268 "awkgram.y" /* yacc.c:1646  */
+#line 269 "awkgram.y" /* yacc.c:1646  */
     {
                want_source = false;
                at_seen = false;
                yyerrok;
          }
-#line 1948 "awkgram.c" /* yacc.c:1646  */
+#line 1949 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 12:
-#line 277 "awkgram.y" /* yacc.c:1646  */
+#line 278 "awkgram.y" /* yacc.c:1646  */
     {
                if (include_source((yyvsp[0])) < 0)
                        YYABORT;
@@ -1956,23 +1957,23 @@ yyreduce:
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 1960 "awkgram.c" /* yacc.c:1646  */
+#line 1961 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 13:
-#line 285 "awkgram.y" /* yacc.c:1646  */
+#line 286 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1966 "awkgram.c" /* yacc.c:1646  */
+#line 1967 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 14:
-#line 287 "awkgram.y" /* yacc.c:1646  */
+#line 288 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1972 "awkgram.c" /* yacc.c:1646  */
+#line 1973 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 15:
-#line 292 "awkgram.y" /* yacc.c:1646  */
+#line 293 "awkgram.y" /* yacc.c:1646  */
     {
                if (load_library((yyvsp[0])) < 0)
                        YYABORT;
@@ -1980,23 +1981,23 @@ yyreduce:
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
-#line 1984 "awkgram.c" /* yacc.c:1646  */
+#line 1985 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 16:
-#line 300 "awkgram.y" /* yacc.c:1646  */
+#line 301 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1990 "awkgram.c" /* yacc.c:1646  */
+#line 1991 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 17:
-#line 302 "awkgram.y" /* yacc.c:1646  */
+#line 303 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 1996 "awkgram.c" /* yacc.c:1646  */
+#line 1997 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 18:
-#line 307 "awkgram.y" /* yacc.c:1646  */
+#line 308 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -2005,11 +2006,11 @@ yyreduce:
                } else
                        (yyval) = NULL;
          }
-#line 2009 "awkgram.c" /* yacc.c:1646  */
+#line 2010 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 19:
-#line 316 "awkgram.y" /* yacc.c:1646  */
+#line 317 "awkgram.y" /* yacc.c:1646  */
     {
                rule = Rule;
                if (comment != NULL) {
@@ -2018,11 +2019,11 @@ yyreduce:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 2022 "awkgram.c" /* yacc.c:1646  */
+#line 2023 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 20:
-#line 326 "awkgram.y" /* yacc.c:1646  */
+#line 327 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *tp;
 
@@ -2052,11 +2053,11 @@ yyreduce:
                        (yyval) = list_append(list_merge((yyvsp[-3]), 
(yyvsp[0])), tp);
                rule = Rule;
          }
-#line 2056 "awkgram.c" /* yacc.c:1646  */
+#line 2057 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 21:
-#line 356 "awkgram.y" /* yacc.c:1646  */
+#line 357 "awkgram.y" /* yacc.c:1646  */
     {
                static int begin_seen = 0;
 
@@ -2070,11 +2071,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2074 "awkgram.c" /* yacc.c:1646  */
+#line 2075 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 22:
-#line 370 "awkgram.y" /* yacc.c:1646  */
+#line 371 "awkgram.y" /* yacc.c:1646  */
     {
                static int end_seen = 0;
 
@@ -2088,11 +2089,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2092 "awkgram.c" /* yacc.c:1646  */
+#line 2093 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 23:
-#line 384 "awkgram.y" /* yacc.c:1646  */
+#line 385 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = BEGINFILE;
@@ -2100,11 +2101,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2104 "awkgram.c" /* yacc.c:1646  */
+#line 2105 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 24:
-#line 392 "awkgram.y" /* yacc.c:1646  */
+#line 393 "awkgram.y" /* yacc.c:1646  */
     {
                func_first = false;
                (yyvsp[0])->in_rule = rule = ENDFILE;
@@ -2112,11 +2113,11 @@ yyreduce:
                check_comment();
                (yyval) = (yyvsp[0]);
          }
-#line 2116 "awkgram.c" /* yacc.c:1646  */
+#line 2117 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 25:
-#line 403 "awkgram.y" /* yacc.c:1646  */
+#line 404 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                if ((yyvsp[-3]) == NULL)
@@ -2125,48 +2126,48 @@ yyreduce:
                        ip = (yyvsp[-3]);
                (yyval) = ip;
          }
-#line 2129 "awkgram.c" /* yacc.c:1646  */
+#line 2130 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 26:
-#line 415 "awkgram.y" /* yacc.c:1646  */
+#line 416 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2135 "awkgram.c" /* yacc.c:1646  */
+#line 2136 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 27:
-#line 417 "awkgram.y" /* yacc.c:1646  */
+#line 418 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 2141 "awkgram.c" /* yacc.c:1646  */
+#line 2142 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 28:
-#line 419 "awkgram.y" /* yacc.c:1646  */
+#line 420 "awkgram.y" /* yacc.c:1646  */
     {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
                YYABORT;
          }
-#line 2151 "awkgram.c" /* yacc.c:1646  */
+#line 2152 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 29:
-#line 425 "awkgram.y" /* yacc.c:1646  */
+#line 426 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = (yyvsp[0]);
                at_seen = false;
          }
-#line 2160 "awkgram.c" /* yacc.c:1646  */
+#line 2161 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 32:
-#line 437 "awkgram.y" /* yacc.c:1646  */
+#line 438 "awkgram.y" /* yacc.c:1646  */
     { want_param_names = FUNC_HEADER; }
-#line 2166 "awkgram.c" /* yacc.c:1646  */
+#line 2167 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 33:
-#line 438 "awkgram.y" /* yacc.c:1646  */
+#line 439 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *  treat any comments between BOF and the first function
@@ -2204,17 +2205,17 @@ yyreduce:
                (yyval) = (yyvsp[-6]);
                want_param_names = FUNC_BODY;
          }
-#line 2208 "awkgram.c" /* yacc.c:1646  */
+#line 2209 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 34:
-#line 483 "awkgram.y" /* yacc.c:1646  */
+#line 484 "awkgram.y" /* yacc.c:1646  */
     { want_regexp = true; }
-#line 2214 "awkgram.c" /* yacc.c:1646  */
+#line 2215 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 35:
-#line 485 "awkgram.y" /* yacc.c:1646  */
+#line 486 "awkgram.y" /* yacc.c:1646  */
     {
                  NODE *n, *exp;
                  char *re;
@@ -2243,17 +2244,17 @@ yyreduce:
                  (yyval)->opcode = Op_match_rec;
                  (yyval)->memory = n;
                }
-#line 2247 "awkgram.c" /* yacc.c:1646  */
+#line 2248 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 36:
-#line 517 "awkgram.y" /* yacc.c:1646  */
+#line 518 "awkgram.y" /* yacc.c:1646  */
     { bcfree((yyvsp[0])); }
-#line 2253 "awkgram.c" /* yacc.c:1646  */
+#line 2254 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 38:
-#line 523 "awkgram.y" /* yacc.c:1646  */
+#line 524 "awkgram.y" /* yacc.c:1646  */
     {
                if (prior_comment != NULL) {
                        (yyval) = list_create(prior_comment);
@@ -2264,11 +2265,11 @@ yyreduce:
                } else
                        (yyval) = NULL;
          }
-#line 2268 "awkgram.c" /* yacc.c:1646  */
+#line 2269 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 39:
-#line 534 "awkgram.y" /* yacc.c:1646  */
+#line 535 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0]) == NULL) {
                        if (prior_comment != NULL) {
@@ -2315,40 +2316,40 @@ yyreduce:
                }
                yyerrok;
          }
-#line 2319 "awkgram.c" /* yacc.c:1646  */
+#line 2320 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 40:
-#line 581 "awkgram.y" /* yacc.c:1646  */
+#line 582 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = NULL; }
-#line 2325 "awkgram.c" /* yacc.c:1646  */
+#line 2326 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 43:
-#line 591 "awkgram.y" /* yacc.c:1646  */
+#line 592 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2331 "awkgram.c" /* yacc.c:1646  */
+#line 2332 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 44:
-#line 593 "awkgram.y" /* yacc.c:1646  */
+#line 594 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 2337 "awkgram.c" /* yacc.c:1646  */
+#line 2338 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 45:
-#line 595 "awkgram.y" /* yacc.c:1646  */
+#line 596 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
-#line 2348 "awkgram.c" /* yacc.c:1646  */
+#line 2349 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 46:
-#line 602 "awkgram.y" /* yacc.c:1646  */
+#line 603 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@ -2438,11 +2439,11 @@ yyreduce:
                break_allowed--;                        
                fix_break_continue(ip, tbreak, NULL);
          }
-#line 2442 "awkgram.c" /* yacc.c:1646  */
+#line 2443 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 47:
-#line 692 "awkgram.y" /* yacc.c:1646  */
+#line 693 "awkgram.y" /* yacc.c:1646  */
     { 
                /*
                 *    -----------------
@@ -2484,11 +2485,11 @@ yyreduce:
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
          }
-#line 2488 "awkgram.c" /* yacc.c:1646  */
+#line 2489 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 48:
-#line 734 "awkgram.y" /* yacc.c:1646  */
+#line 735 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 *    -----------------
@@ -2530,11 +2531,11 @@ yyreduce:
                } /* else
                        $1 and $4 are NULLs */
          }
-#line 2534 "awkgram.c" /* yacc.c:1646  */
+#line 2535 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 49:
-#line 776 "awkgram.y" /* yacc.c:1646  */
+#line 777 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[-5])->lextok;
@@ -2647,33 +2648,33 @@ regular_loop:
                break_allowed--;
                continue_allowed--;
          }
-#line 2651 "awkgram.c" /* yacc.c:1646  */
+#line 2652 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 50:
-#line 889 "awkgram.y" /* yacc.c:1646  */
+#line 890 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-11]), (yyvsp[-9]), (yyvsp[-6]), 
(yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2662 "awkgram.c" /* yacc.c:1646  */
+#line 2663 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 51:
-#line 896 "awkgram.y" /* yacc.c:1646  */
+#line 897 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_for_loop((yyvsp[-10]), (yyvsp[-8]), (INSTRUCTION 
*) NULL, (yyvsp[-3]), (yyvsp[0]));
 
                break_allowed--;
                continue_allowed--;
          }
-#line 2673 "awkgram.c" /* yacc.c:1646  */
+#line 2674 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 52:
-#line 903 "awkgram.y" /* yacc.c:1646  */
+#line 904 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
@@ -2681,11 +2682,11 @@ regular_loop:
                        (yyval) = (yyvsp[0]);
                (yyval) = add_pending_comment((yyval));
          }
-#line 2685 "awkgram.c" /* yacc.c:1646  */
+#line 2686 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 53:
-#line 914 "awkgram.y" /* yacc.c:1646  */
+#line 915 "awkgram.y" /* yacc.c:1646  */
     { 
                if (! break_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2695,11 +2696,11 @@ regular_loop:
                (yyval) = add_pending_comment((yyval));
 
          }
-#line 2699 "awkgram.c" /* yacc.c:1646  */
+#line 2700 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 54:
-#line 924 "awkgram.y" /* yacc.c:1646  */
+#line 925 "awkgram.y" /* yacc.c:1646  */
     {
                if (! continue_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@ -2709,11 +2710,11 @@ regular_loop:
                (yyval) = add_pending_comment((yyval));
 
          }
-#line 2713 "awkgram.c" /* yacc.c:1646  */
+#line 2714 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 55:
-#line 934 "awkgram.y" /* yacc.c:1646  */
+#line 935 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@ -2723,11 +2724,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2727 "awkgram.c" /* yacc.c:1646  */
+#line 2728 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 56:
-#line 944 "awkgram.y" /* yacc.c:1646  */
+#line 945 "awkgram.y" /* yacc.c:1646  */
     {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@ -2739,11 +2740,11 @@ regular_loop:
                (yyval) = list_create((yyvsp[-1]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2743 "awkgram.c" /* yacc.c:1646  */
+#line 2744 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 57:
-#line 956 "awkgram.y" /* yacc.c:1646  */
+#line 957 "awkgram.y" /* yacc.c:1646  */
     {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@ -2759,20 +2760,20 @@ regular_loop:
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2763 "awkgram.c" /* yacc.c:1646  */
+#line 2764 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 58:
-#line 972 "awkgram.y" /* yacc.c:1646  */
+#line 973 "awkgram.y" /* yacc.c:1646  */
     {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
-#line 2772 "awkgram.c" /* yacc.c:1646  */
+#line 2773 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 59:
-#line 975 "awkgram.y" /* yacc.c:1646  */
+#line 976 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL) {
                        (yyval) = list_create((yyvsp[-3]));
@@ -2794,17 +2795,17 @@ regular_loop:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2798 "awkgram.c" /* yacc.c:1646  */
+#line 2799 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 61:
-#line 1008 "awkgram.y" /* yacc.c:1646  */
+#line 1009 "awkgram.y" /* yacc.c:1646  */
     { in_print = true; in_parens = 0; }
-#line 2804 "awkgram.c" /* yacc.c:1646  */
+#line 2805 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 62:
-#line 1009 "awkgram.y" /* yacc.c:1646  */
+#line 1010 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@ -2902,17 +2903,17 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2906 "awkgram.c" /* yacc.c:1646  */
+#line 2907 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 63:
-#line 1107 "awkgram.y" /* yacc.c:1646  */
+#line 1108 "awkgram.y" /* yacc.c:1646  */
     { sub_counter = 0; }
-#line 2912 "awkgram.c" /* yacc.c:1646  */
+#line 2913 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 64:
-#line 1108 "awkgram.y" /* yacc.c:1646  */
+#line 1109 "awkgram.y" /* yacc.c:1646  */
     {
                char *arr = (yyvsp[-2])->lextok;
 
@@ -2946,11 +2947,11 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2950 "awkgram.c" /* yacc.c:1646  */
+#line 2951 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 65:
-#line 1146 "awkgram.y" /* yacc.c:1646  */
+#line 1147 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
                char *arr = (yyvsp[-1])->lextok;
@@ -2977,55 +2978,55 @@ regular_print:
                }
                (yyval) = add_pending_comment((yyval));
          }
-#line 2981 "awkgram.c" /* yacc.c:1646  */
+#line 2982 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 66:
-#line 1173 "awkgram.y" /* yacc.c:1646  */
+#line 1174 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = optimize_assignment((yyvsp[0]));
                (yyval) = add_pending_comment((yyval));
          }
-#line 2990 "awkgram.c" /* yacc.c:1646  */
+#line 2991 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 67:
-#line 1181 "awkgram.y" /* yacc.c:1646  */
+#line 1182 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 2996 "awkgram.c" /* yacc.c:1646  */
+#line 2997 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 68:
-#line 1183 "awkgram.y" /* yacc.c:1646  */
+#line 1184 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3002 "awkgram.c" /* yacc.c:1646  */
+#line 3003 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 69:
-#line 1188 "awkgram.y" /* yacc.c:1646  */
+#line 1189 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3008 "awkgram.c" /* yacc.c:1646  */
+#line 3009 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 70:
-#line 1190 "awkgram.y" /* yacc.c:1646  */
+#line 1191 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-1]) == NULL)
                        (yyval) = list_create((yyvsp[0]));
                else
                        (yyval) = list_prepend((yyvsp[-1]), (yyvsp[0]));
          }
-#line 3019 "awkgram.c" /* yacc.c:1646  */
+#line 3020 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 71:
-#line 1197 "awkgram.y" /* yacc.c:1646  */
+#line 1198 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3025 "awkgram.c" /* yacc.c:1646  */
+#line 3026 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 72:
-#line 1202 "awkgram.y" /* yacc.c:1646  */
+#line 1203 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -3037,11 +3038,11 @@ regular_print:
                bcfree((yyvsp[-2]));
                (yyval) = (yyvsp[-4]);
          }
-#line 3041 "awkgram.c" /* yacc.c:1646  */
+#line 3042 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 73:
-#line 1214 "awkgram.y" /* yacc.c:1646  */
+#line 1215 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@ -3052,17 +3053,17 @@ regular_print:
                (yyvsp[-3])->case_stmt = casestmt;
                (yyval) = (yyvsp[-3]);
          }
-#line 3056 "awkgram.c" /* yacc.c:1646  */
+#line 3057 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 74:
-#line 1228 "awkgram.y" /* yacc.c:1646  */
+#line 1229 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3062 "awkgram.c" /* yacc.c:1646  */
+#line 3063 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 75:
-#line 1230 "awkgram.y" /* yacc.c:1646  */
+#line 1231 "awkgram.y" /* yacc.c:1646  */
     { 
                NODE *n = (yyvsp[0])->memory;
                (void) force_number(n);
@@ -3070,26 +3071,28 @@ regular_print:
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3074 "awkgram.c" /* yacc.c:1646  */
+#line 3075 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 76:
-#line 1238 "awkgram.y" /* yacc.c:1646  */
+#line 1239 "awkgram.y" /* yacc.c:1646  */
     {
+               NODE *n = (yyvsp[0])->lasti->memory;
                bcfree((yyvsp[-1]));
+               add_sign_to_num(n, "+");
                (yyval) = (yyvsp[0]);
          }
-#line 3083 "awkgram.c" /* yacc.c:1646  */
+#line 3086 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 77:
-#line 1243 "awkgram.y" /* yacc.c:1646  */
+#line 1246 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3089 "awkgram.c" /* yacc.c:1646  */
+#line 3092 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 78:
-#line 1245 "awkgram.y" /* yacc.c:1646  */
+#line 1248 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->memory->type == Node_regex)
                        (yyvsp[0])->opcode = Op_push_re;
@@ -3097,47 +3100,47 @@ regular_print:
                        (yyvsp[0])->opcode = Op_push;
                (yyval) = (yyvsp[0]);
          }
-#line 3101 "awkgram.c" /* yacc.c:1646  */
+#line 3104 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 79:
-#line 1256 "awkgram.y" /* yacc.c:1646  */
+#line 1259 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3107 "awkgram.c" /* yacc.c:1646  */
+#line 3110 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 80:
-#line 1258 "awkgram.y" /* yacc.c:1646  */
+#line 1261 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3113 "awkgram.c" /* yacc.c:1646  */
+#line 3116 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 82:
-#line 1268 "awkgram.y" /* yacc.c:1646  */
+#line 1271 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = (yyvsp[-1]);
          }
-#line 3121 "awkgram.c" /* yacc.c:1646  */
+#line 3124 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 83:
-#line 1275 "awkgram.y" /* yacc.c:1646  */
+#line 1278 "awkgram.y" /* yacc.c:1646  */
     {
                in_print = false;
                in_parens = 0;
                (yyval) = NULL;
          }
-#line 3131 "awkgram.c" /* yacc.c:1646  */
+#line 3134 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 84:
-#line 1280 "awkgram.y" /* yacc.c:1646  */
+#line 1283 "awkgram.y" /* yacc.c:1646  */
     { in_print = false; in_parens = 0; }
-#line 3137 "awkgram.c" /* yacc.c:1646  */
+#line 3140 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 85:
-#line 1281 "awkgram.y" /* yacc.c:1646  */
+#line 1284 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->redir_type == redirect_twoway
                        && (yyvsp[0])->lasti->opcode == Op_K_getline_redir
@@ -3145,63 +3148,63 @@ regular_print:
                        yyerror(_("multistage two-way pipelines don't work"));
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-2]));
          }
-#line 3149 "awkgram.c" /* yacc.c:1646  */
+#line 3152 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 86:
-#line 1292 "awkgram.y" /* yacc.c:1646  */
+#line 1295 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-3]), (yyvsp[-5]), (yyvsp[0]), 
NULL, NULL);
          }
-#line 3157 "awkgram.c" /* yacc.c:1646  */
+#line 3160 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 87:
-#line 1297 "awkgram.y" /* yacc.c:1646  */
+#line 1300 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_condition((yyvsp[-6]), (yyvsp[-8]), (yyvsp[-3]), 
(yyvsp[-2]), (yyvsp[0]));
          }
-#line 3165 "awkgram.c" /* yacc.c:1646  */
+#line 3168 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 92:
-#line 1314 "awkgram.y" /* yacc.c:1646  */
+#line 1317 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3171 "awkgram.c" /* yacc.c:1646  */
+#line 3174 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 93:
-#line 1316 "awkgram.y" /* yacc.c:1646  */
+#line 1319 "awkgram.y" /* yacc.c:1646  */
     {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
-#line 3180 "awkgram.c" /* yacc.c:1646  */
+#line 3183 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 94:
-#line 1324 "awkgram.y" /* yacc.c:1646  */
+#line 1327 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3186 "awkgram.c" /* yacc.c:1646  */
+#line 3189 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 95:
-#line 1326 "awkgram.y" /* yacc.c:1646  */
+#line 1329 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3192 "awkgram.c" /* yacc.c:1646  */
+#line 3195 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 96:
-#line 1331 "awkgram.y" /* yacc.c:1646  */
+#line 1334 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->param_count = 0;
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3201 "awkgram.c" /* yacc.c:1646  */
+#line 3204 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 97:
-#line 1336 "awkgram.y" /* yacc.c:1646  */
+#line 1339 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2]) != NULL && (yyvsp[0]) != NULL) {
                        (yyvsp[0])->param_count =  
(yyvsp[-2])->lasti->param_count + 1;
@@ -3210,74 +3213,74 @@ regular_print:
                } else
                        (yyval) = NULL;
          }
-#line 3214 "awkgram.c" /* yacc.c:1646  */
+#line 3217 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 98:
-#line 1345 "awkgram.y" /* yacc.c:1646  */
+#line 1348 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3220 "awkgram.c" /* yacc.c:1646  */
+#line 3223 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 99:
-#line 1347 "awkgram.y" /* yacc.c:1646  */
+#line 1350 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3226 "awkgram.c" /* yacc.c:1646  */
+#line 3229 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 100:
-#line 1349 "awkgram.y" /* yacc.c:1646  */
+#line 1352 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-2]); }
-#line 3232 "awkgram.c" /* yacc.c:1646  */
+#line 3235 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 101:
-#line 1355 "awkgram.y" /* yacc.c:1646  */
+#line 1358 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3238 "awkgram.c" /* yacc.c:1646  */
+#line 3241 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 102:
-#line 1357 "awkgram.y" /* yacc.c:1646  */
+#line 1360 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3244 "awkgram.c" /* yacc.c:1646  */
+#line 3247 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 103:
-#line 1362 "awkgram.y" /* yacc.c:1646  */
+#line 1365 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3250 "awkgram.c" /* yacc.c:1646  */
+#line 3253 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 104:
-#line 1364 "awkgram.y" /* yacc.c:1646  */
+#line 1367 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3256 "awkgram.c" /* yacc.c:1646  */
+#line 3259 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 105:
-#line 1369 "awkgram.y" /* yacc.c:1646  */
+#line 1372 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
-#line 3262 "awkgram.c" /* yacc.c:1646  */
+#line 3265 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 106:
-#line 1371 "awkgram.y" /* yacc.c:1646  */
+#line 1374 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3271 "awkgram.c" /* yacc.c:1646  */
+#line 3274 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 107:
-#line 1376 "awkgram.y" /* yacc.c:1646  */
+#line 1379 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3277 "awkgram.c" /* yacc.c:1646  */
+#line 3280 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 108:
-#line 1378 "awkgram.y" /* yacc.c:1646  */
+#line 1381 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3285,62 +3288,62 @@ regular_print:
                 */
                (yyval) = (yyvsp[-1]);
          }
-#line 3289 "awkgram.c" /* yacc.c:1646  */
+#line 3292 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 109:
-#line 1386 "awkgram.y" /* yacc.c:1646  */
+#line 1389 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
-#line 3298 "awkgram.c" /* yacc.c:1646  */
+#line 3301 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 110:
-#line 1391 "awkgram.y" /* yacc.c:1646  */
+#line 1394 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
-#line 3307 "awkgram.c" /* yacc.c:1646  */
+#line 3310 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 111:
-#line 1399 "awkgram.y" /* yacc.c:1646  */
+#line 1402 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3313 "awkgram.c" /* yacc.c:1646  */
+#line 3316 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 112:
-#line 1401 "awkgram.y" /* yacc.c:1646  */
+#line 1404 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3319 "awkgram.c" /* yacc.c:1646  */
+#line 3322 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 113:
-#line 1406 "awkgram.y" /* yacc.c:1646  */
+#line 1409 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
-#line 3325 "awkgram.c" /* yacc.c:1646  */
+#line 3328 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 114:
-#line 1408 "awkgram.y" /* yacc.c:1646  */
+#line 1411 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
-#line 3334 "awkgram.c" /* yacc.c:1646  */
+#line 3337 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 115:
-#line 1413 "awkgram.y" /* yacc.c:1646  */
+#line 1416 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3340 "awkgram.c" /* yacc.c:1646  */
+#line 3343 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 116:
-#line 1415 "awkgram.y" /* yacc.c:1646  */
+#line 1418 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * Returning the expression list instead of NULL lets
@@ -3348,58 +3351,58 @@ regular_print:
                 */
                (yyval) = (yyvsp[-1]);
          }
-#line 3352 "awkgram.c" /* yacc.c:1646  */
+#line 3355 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 117:
-#line 1423 "awkgram.y" /* yacc.c:1646  */
+#line 1426 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
-#line 3361 "awkgram.c" /* yacc.c:1646  */
+#line 3364 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 118:
-#line 1428 "awkgram.y" /* yacc.c:1646  */
+#line 1431 "awkgram.y" /* yacc.c:1646  */
     {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
-#line 3370 "awkgram.c" /* yacc.c:1646  */
+#line 3373 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 119:
-#line 1435 "awkgram.y" /* yacc.c:1646  */
+#line 1438 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3376 "awkgram.c" /* yacc.c:1646  */
+#line 3379 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 120:
-#line 1441 "awkgram.y" /* yacc.c:1646  */
+#line 1444 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of assignment"));
                (yyval) = mk_assignment((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1]));
          }
-#line 3387 "awkgram.c" /* yacc.c:1646  */
+#line 3390 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 121:
-#line 1448 "awkgram.y" /* yacc.c:1646  */
+#line 1451 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3393 "awkgram.c" /* yacc.c:1646  */
+#line 3396 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 122:
-#line 1450 "awkgram.y" /* yacc.c:1646  */
+#line 1453 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3399 "awkgram.c" /* yacc.c:1646  */
+#line 3402 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 123:
-#line 1452 "awkgram.y" /* yacc.c:1646  */
+#line 1455 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3416,11 +3419,11 @@ regular_print:
                        (yyval) = list_append(list_merge((yyvsp[-2]), 
(yyvsp[0])), (yyvsp[-1]));
                }
          }
-#line 3420 "awkgram.c" /* yacc.c:1646  */
+#line 3423 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 124:
-#line 1469 "awkgram.y" /* yacc.c:1646  */
+#line 1472 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old)
                        warning_ln((yyvsp[-1])->source_line,
@@ -3430,91 +3433,91 @@ regular_print:
                (yyvsp[-1])->expr_count = 1;
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3434 "awkgram.c" /* yacc.c:1646  */
+#line 3437 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 125:
-#line 1479 "awkgram.y" /* yacc.c:1646  */
+#line 1482 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of comparison"));
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
-#line 3445 "awkgram.c" /* yacc.c:1646  */
+#line 3448 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 126:
-#line 1486 "awkgram.y" /* yacc.c:1646  */
+#line 1489 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_condition((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]), 
(yyvsp[-1]), (yyvsp[0])); }
-#line 3451 "awkgram.c" /* yacc.c:1646  */
+#line 3454 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 127:
-#line 1488 "awkgram.y" /* yacc.c:1646  */
+#line 1491 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3457 "awkgram.c" /* yacc.c:1646  */
+#line 3460 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 128:
-#line 1493 "awkgram.y" /* yacc.c:1646  */
+#line 1496 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3463 "awkgram.c" /* yacc.c:1646  */
+#line 3466 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 129:
-#line 1495 "awkgram.y" /* yacc.c:1646  */
+#line 1498 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3469 "awkgram.c" /* yacc.c:1646  */
+#line 3472 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 130:
-#line 1497 "awkgram.y" /* yacc.c:1646  */
+#line 1500 "awkgram.y" /* yacc.c:1646  */
     {  
                (yyvsp[0])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[0]);
          }
-#line 3478 "awkgram.c" /* yacc.c:1646  */
+#line 3481 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 131:
-#line 1505 "awkgram.y" /* yacc.c:1646  */
+#line 1508 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3484 "awkgram.c" /* yacc.c:1646  */
+#line 3487 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 132:
-#line 1507 "awkgram.y" /* yacc.c:1646  */
+#line 1510 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3490 "awkgram.c" /* yacc.c:1646  */
+#line 3493 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 133:
-#line 1512 "awkgram.y" /* yacc.c:1646  */
+#line 1515 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3496 "awkgram.c" /* yacc.c:1646  */
+#line 3499 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 134:
-#line 1514 "awkgram.y" /* yacc.c:1646  */
+#line 1517 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3502 "awkgram.c" /* yacc.c:1646  */
+#line 3505 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 135:
-#line 1519 "awkgram.y" /* yacc.c:1646  */
+#line 1522 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3508 "awkgram.c" /* yacc.c:1646  */
+#line 3511 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 136:
-#line 1521 "awkgram.y" /* yacc.c:1646  */
+#line 1524 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3514 "awkgram.c" /* yacc.c:1646  */
+#line 3517 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 137:
-#line 1523 "awkgram.y" /* yacc.c:1646  */
+#line 1526 "awkgram.y" /* yacc.c:1646  */
     {
                int count = 2;
                bool is_simple_var = false;
@@ -3567,47 +3570,47 @@ regular_print:
                                max_args = count;
                }
          }
-#line 3571 "awkgram.c" /* yacc.c:1646  */
+#line 3574 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 139:
-#line 1581 "awkgram.y" /* yacc.c:1646  */
+#line 1584 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3577 "awkgram.c" /* yacc.c:1646  */
+#line 3580 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 140:
-#line 1583 "awkgram.y" /* yacc.c:1646  */
+#line 1586 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3583 "awkgram.c" /* yacc.c:1646  */
+#line 3586 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 141:
-#line 1585 "awkgram.y" /* yacc.c:1646  */
+#line 1588 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3589 "awkgram.c" /* yacc.c:1646  */
+#line 3592 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 142:
-#line 1587 "awkgram.y" /* yacc.c:1646  */
+#line 1590 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3595 "awkgram.c" /* yacc.c:1646  */
+#line 3598 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 143:
-#line 1589 "awkgram.y" /* yacc.c:1646  */
+#line 1592 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3601 "awkgram.c" /* yacc.c:1646  */
+#line 3604 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 144:
-#line 1591 "awkgram.y" /* yacc.c:1646  */
+#line 1594 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3607 "awkgram.c" /* yacc.c:1646  */
+#line 3610 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 145:
-#line 1593 "awkgram.y" /* yacc.c:1646  */
+#line 1596 "awkgram.y" /* yacc.c:1646  */
     {
                /*
                 * In BEGINFILE/ENDFILE, allow `getline [var] < file'
@@ -3621,29 +3624,29 @@ regular_print:
                                _("non-redirected `getline' undefined inside 
END action"));
                (yyval) = mk_getline((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]), 
redirect_input);
          }
-#line 3625 "awkgram.c" /* yacc.c:1646  */
+#line 3628 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 146:
-#line 1607 "awkgram.y" /* yacc.c:1646  */
+#line 1610 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3634 "awkgram.c" /* yacc.c:1646  */
+#line 3637 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 147:
-#line 1612 "awkgram.y" /* yacc.c:1646  */
+#line 1615 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 3643 "awkgram.c" /* yacc.c:1646  */
+#line 3646 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 148:
-#line 1617 "awkgram.y" /* yacc.c:1646  */
+#line 1620 "awkgram.y" /* yacc.c:1646  */
     {
                if (do_lint_old) {
                    warning_ln((yyvsp[-1])->source_line,
@@ -3663,64 +3666,64 @@ regular_print:
                        (yyval) = list_append(list_merge(t, (yyvsp[0])), 
(yyvsp[-1]));
                }
          }
-#line 3667 "awkgram.c" /* yacc.c:1646  */
+#line 3670 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 149:
-#line 1642 "awkgram.y" /* yacc.c:1646  */
+#line 1645 "awkgram.y" /* yacc.c:1646  */
     {
                  (yyval) = mk_getline((yyvsp[-1]), (yyvsp[0]), (yyvsp[-3]), 
(yyvsp[-2])->redir_type);
                  bcfree((yyvsp[-2]));
                }
-#line 3676 "awkgram.c" /* yacc.c:1646  */
+#line 3679 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 150:
-#line 1648 "awkgram.y" /* yacc.c:1646  */
+#line 1651 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3682 "awkgram.c" /* yacc.c:1646  */
+#line 3685 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 151:
-#line 1650 "awkgram.y" /* yacc.c:1646  */
+#line 1653 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3688 "awkgram.c" /* yacc.c:1646  */
+#line 3691 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 152:
-#line 1652 "awkgram.y" /* yacc.c:1646  */
+#line 1655 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3694 "awkgram.c" /* yacc.c:1646  */
+#line 3697 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 153:
-#line 1654 "awkgram.y" /* yacc.c:1646  */
+#line 1657 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3700 "awkgram.c" /* yacc.c:1646  */
+#line 3703 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 154:
-#line 1656 "awkgram.y" /* yacc.c:1646  */
+#line 1659 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3706 "awkgram.c" /* yacc.c:1646  */
+#line 3709 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 155:
-#line 1658 "awkgram.y" /* yacc.c:1646  */
+#line 1661 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = mk_binary((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
-#line 3712 "awkgram.c" /* yacc.c:1646  */
+#line 3715 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 156:
-#line 1663 "awkgram.y" /* yacc.c:1646  */
+#line 1666 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3720 "awkgram.c" /* yacc.c:1646  */
+#line 3723 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 157:
-#line 1667 "awkgram.y" /* yacc.c:1646  */
+#line 1670 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->opcode == Op_match_rec) {
                        (yyvsp[0])->opcode = Op_nomatch;
@@ -3752,37 +3755,37 @@ regular_print:
                        }
                }
           }
-#line 3756 "awkgram.c" /* yacc.c:1646  */
+#line 3759 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 158:
-#line 1699 "awkgram.y" /* yacc.c:1646  */
+#line 1702 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3762 "awkgram.c" /* yacc.c:1646  */
+#line 3765 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 159:
-#line 1701 "awkgram.y" /* yacc.c:1646  */
+#line 1704 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3772 "awkgram.c" /* yacc.c:1646  */
+#line 3775 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 160:
-#line 1707 "awkgram.y" /* yacc.c:1646  */
+#line 1710 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3782 "awkgram.c" /* yacc.c:1646  */
+#line 3785 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 161:
-#line 1713 "awkgram.y" /* yacc.c:1646  */
+#line 1716 "awkgram.y" /* yacc.c:1646  */
     {
                static bool warned = false;
 
@@ -3795,45 +3798,45 @@ regular_print:
                if ((yyval) == NULL)
                        YYABORT;
          }
-#line 3799 "awkgram.c" /* yacc.c:1646  */
+#line 3802 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 164:
-#line 1728 "awkgram.y" /* yacc.c:1646  */
+#line 1731 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3808 "awkgram.c" /* yacc.c:1646  */
+#line 3811 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 165:
-#line 1733 "awkgram.y" /* yacc.c:1646  */
+#line 1736 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[-1])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
-#line 3817 "awkgram.c" /* yacc.c:1646  */
+#line 3820 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 166:
-#line 1738 "awkgram.y" /* yacc.c:1646  */
+#line 1741 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3825 "awkgram.c" /* yacc.c:1646  */
+#line 3828 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 167:
-#line 1742 "awkgram.y" /* yacc.c:1646  */
+#line 1745 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_create((yyvsp[0]));
          }
-#line 3833 "awkgram.c" /* yacc.c:1646  */
+#line 3836 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 168:
-#line 1746 "awkgram.y" /* yacc.c:1646  */
+#line 1749 "awkgram.y" /* yacc.c:1646  */
     {
                if ((yyvsp[0])->lasti->opcode == Op_push_i
                        && ((yyvsp[0])->lasti->memory->flags & STRING) == 0
@@ -3848,34 +3851,42 @@ regular_print:
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
          }
-#line 3852 "awkgram.c" /* yacc.c:1646  */
+#line 3855 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 169:
-#line 1761 "awkgram.y" /* yacc.c:1646  */
+#line 1764 "awkgram.y" /* yacc.c:1646  */
     {
-           /*
-            * was: $$ = $2
-            * POSIX semantics: force a conversion to numeric type
-            */
-               (yyvsp[-1])->opcode = Op_plus_i;
-               (yyvsp[-1])->memory = make_profile_number(0.0, "0", 1);
-               (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
+               if ((yyvsp[0])->lasti->opcode == Op_push_i
+                       && ((yyvsp[0])->lasti->memory->flags & STRING) == 0
+                       && ((yyvsp[0])->lasti->memory->flags & NUMCONSTSTR) != 
0) {
+                       NODE *n = (yyvsp[0])->lasti->memory;
+                       add_sign_to_num(n, '+');
+                       (yyval) = (yyvsp[0]);
+                       bcfree((yyvsp[-1]));
+               } else {
+                       /*
+                        * was: $$ = $2
+                        * POSIX semantics: force a conversion to numeric type
+                        */
+                       (yyvsp[-1])->opcode = Op_unary_plus;
+                       (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
+               }
          }
-#line 3866 "awkgram.c" /* yacc.c:1646  */
+#line 3877 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 170:
-#line 1774 "awkgram.y" /* yacc.c:1646  */
+#line 1785 "awkgram.y" /* yacc.c:1646  */
     {
                func_use((yyvsp[0])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[0]);
          }
-#line 3875 "awkgram.c" /* yacc.c:1646  */
+#line 3886 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 171:
-#line 1779 "awkgram.y" /* yacc.c:1646  */
+#line 1790 "awkgram.y" /* yacc.c:1646  */
     {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@ -3909,11 +3920,11 @@ regular_print:
                (yyval) = list_prepend((yyvsp[0]), t);
                at_seen = false;
          }
-#line 3913 "awkgram.c" /* yacc.c:1646  */
+#line 3924 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 172:
-#line 1816 "awkgram.y" /* yacc.c:1646  */
+#line 1827 "awkgram.y" /* yacc.c:1646  */
     {
                NODE *n;
 
@@ -3938,49 +3949,49 @@ regular_print:
                        (yyval) = list_append(t, (yyvsp[-3]));
                }
          }
-#line 3942 "awkgram.c" /* yacc.c:1646  */
+#line 3953 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 173:
-#line 1844 "awkgram.y" /* yacc.c:1646  */
+#line 1855 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3948 "awkgram.c" /* yacc.c:1646  */
+#line 3959 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 174:
-#line 1846 "awkgram.y" /* yacc.c:1646  */
+#line 1857 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); }
-#line 3954 "awkgram.c" /* yacc.c:1646  */
+#line 3965 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 175:
-#line 1851 "awkgram.y" /* yacc.c:1646  */
+#line 1862 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 3960 "awkgram.c" /* yacc.c:1646  */
+#line 3971 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 176:
-#line 1853 "awkgram.y" /* yacc.c:1646  */
+#line 1864 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 3966 "awkgram.c" /* yacc.c:1646  */
+#line 3977 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 177:
-#line 1858 "awkgram.y" /* yacc.c:1646  */
+#line 1869 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 3972 "awkgram.c" /* yacc.c:1646  */
+#line 3983 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 178:
-#line 1860 "awkgram.y" /* yacc.c:1646  */
+#line 1871 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 3980 "awkgram.c" /* yacc.c:1646  */
+#line 3991 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 179:
-#line 1867 "awkgram.y" /* yacc.c:1646  */
+#line 1878 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@ -3994,11 +4005,11 @@ regular_print:
                sub_counter++;  /* count # of dimensions */
                (yyval) = (yyvsp[0]);
          }
-#line 3998 "awkgram.c" /* yacc.c:1646  */
+#line 4009 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 180:
-#line 1884 "awkgram.y" /* yacc.c:1646  */
+#line 1895 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *t = (yyvsp[-1]);
                if ((yyvsp[-1]) == NULL) {
@@ -4012,31 +4023,31 @@ regular_print:
                        (yyvsp[0])->sub_count = count_expressions(&t, false);
                (yyval) = list_append(t, (yyvsp[0]));
          }
-#line 4016 "awkgram.c" /* yacc.c:1646  */
+#line 4027 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 181:
-#line 1901 "awkgram.y" /* yacc.c:1646  */
+#line 1912 "awkgram.y" /* yacc.c:1646  */
     {  (yyval) = (yyvsp[0]); }
-#line 4022 "awkgram.c" /* yacc.c:1646  */
+#line 4033 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 182:
-#line 1903 "awkgram.y" /* yacc.c:1646  */
+#line 1914 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
-#line 4030 "awkgram.c" /* yacc.c:1646  */
+#line 4041 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 183:
-#line 1910 "awkgram.y" /* yacc.c:1646  */
+#line 1921 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[-1]); }
-#line 4036 "awkgram.c" /* yacc.c:1646  */
+#line 4047 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 184:
-#line 1915 "awkgram.y" /* yacc.c:1646  */
+#line 1926 "awkgram.y" /* yacc.c:1646  */
     {
                char *var_name = (yyvsp[0])->lextok;
 
@@ -4044,22 +4055,22 @@ regular_print:
                (yyvsp[0])->memory = variable((yyvsp[0])->source_line, 
var_name, Node_var_new);
                (yyval) = list_create((yyvsp[0]));
          }
-#line 4048 "awkgram.c" /* yacc.c:1646  */
+#line 4059 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 185:
-#line 1923 "awkgram.y" /* yacc.c:1646  */
+#line 1934 "awkgram.y" /* yacc.c:1646  */
     {
                char *arr = (yyvsp[-1])->lextok;
                (yyvsp[-1])->memory = variable((yyvsp[-1])->source_line, arr, 
Node_var_new);
                (yyvsp[-1])->opcode = Op_push_array;
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-1]));
          }
-#line 4059 "awkgram.c" /* yacc.c:1646  */
+#line 4070 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 186:
-#line 1933 "awkgram.y" /* yacc.c:1646  */
+#line 1944 "awkgram.y" /* yacc.c:1646  */
     {
                INSTRUCTION *ip = (yyvsp[0])->nexti;
                if (ip->opcode == Op_push
@@ -4071,73 +4082,73 @@ regular_print:
                } else
                        (yyval) = (yyvsp[0]);
          }
-#line 4075 "awkgram.c" /* yacc.c:1646  */
+#line 4086 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 187:
-#line 1945 "awkgram.y" /* yacc.c:1646  */
+#line 1956 "awkgram.y" /* yacc.c:1646  */
     {
                (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                if ((yyvsp[0]) != NULL)
                        mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
-#line 4085 "awkgram.c" /* yacc.c:1646  */
+#line 4096 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 188:
-#line 1954 "awkgram.y" /* yacc.c:1646  */
+#line 1965 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postincrement;
          }
-#line 4093 "awkgram.c" /* yacc.c:1646  */
+#line 4104 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 189:
-#line 1958 "awkgram.y" /* yacc.c:1646  */
+#line 1969 "awkgram.y" /* yacc.c:1646  */
     {
                (yyvsp[0])->opcode = Op_postdecrement;
          }
-#line 4101 "awkgram.c" /* yacc.c:1646  */
+#line 4112 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 190:
-#line 1961 "awkgram.y" /* yacc.c:1646  */
+#line 1972 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = NULL; }
-#line 4107 "awkgram.c" /* yacc.c:1646  */
+#line 4118 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 192:
-#line 1969 "awkgram.y" /* yacc.c:1646  */
+#line 1980 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4113 "awkgram.c" /* yacc.c:1646  */
+#line 4124 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 193:
-#line 1973 "awkgram.y" /* yacc.c:1646  */
+#line 1984 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4119 "awkgram.c" /* yacc.c:1646  */
+#line 4130 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 196:
-#line 1982 "awkgram.y" /* yacc.c:1646  */
+#line 1993 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4125 "awkgram.c" /* yacc.c:1646  */
+#line 4136 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 197:
-#line 1986 "awkgram.y" /* yacc.c:1646  */
+#line 1997 "awkgram.y" /* yacc.c:1646  */
     { (yyval) = (yyvsp[0]); yyerrok; }
-#line 4131 "awkgram.c" /* yacc.c:1646  */
+#line 4142 "awkgram.c" /* yacc.c:1646  */
     break;
 
   case 198:
-#line 1990 "awkgram.y" /* yacc.c:1646  */
+#line 2001 "awkgram.y" /* yacc.c:1646  */
     { yyerrok; }
-#line 4137 "awkgram.c" /* yacc.c:1646  */
+#line 4148 "awkgram.c" /* yacc.c:1646  */
     break;
 
 
-#line 4141 "awkgram.c" /* yacc.c:1646  */
+#line 4152 "awkgram.c" /* yacc.c:1646  */
       default: break;
     }
   /* User semantic actions sometimes alter yychar, and that requires
@@ -4365,7 +4376,7 @@ yyreturn:
 #endif
   return yyresult;
 }
-#line 1992 "awkgram.y" /* yacc.c:1906  */
+#line 2003 "awkgram.y" /* yacc.c:1906  */
 
 
 struct token {
@@ -4530,14 +4541,7 @@ negate_num(NODE *n)
        int tval = 0;
 #endif
 
-       if ((n->flags & NUMCONSTSTR) != 0) {
-               char *s;
-
-               s = n->stptr;
-               memmove(& s[1], & s[0], n->stlen + 1);
-               s[0] = '-';
-               n->stlen++;
-       }
+       add_sign_to_num(n, '-');
 
        if (! is_mpg_number(n)) {
                n->numbr = -n->numbr;
@@ -4571,6 +4575,21 @@ negate_num(NODE *n)
 #endif
 }
 
+/* add_sign_to_num --- make a constant unary plus or minus for profiling */
+
+static void
+add_sign_to_num(NODE *n, char sign)
+{
+       if ((n->flags & NUMCONSTSTR) != 0) {
+               char *s;
+
+               s = n->stptr;
+               memmove(& s[1], & s[0], n->stlen + 1);
+               s[0] = sign;
+               n->stlen++;
+       }
+}
+
 /* print_included_from --- print `Included from ..' file names and locations */
 
 static void
diff --git a/awkgram.y b/awkgram.y
index 11fbd9d..23325c7 100644
--- a/awkgram.y
+++ b/awkgram.y
@@ -86,6 +86,7 @@ static ssize_t read_one_line(int fd, void *buffer, size_t 
count);
 static int one_line_close(int fd);
 static void split_comment(void);
 static void check_comment(void);
+static void add_sign_to_num(NODE *n, char sign);
 
 static bool at_seen = false;
 static bool want_source = false;
@@ -1236,7 +1237,9 @@ case_value
          }
        | '+' YNUMBER    %prec UNARY
          {
+               NODE *n = $2->lasti->memory;
                bcfree($1);
+               add_sign_to_num(n, "+");
                $$ = $2;
          }
        | YSTRING 
@@ -1759,13 +1762,21 @@ non_post_simp_exp
          }
        | '+' simp_exp    %prec UNARY
          {
-           /*
-            * was: $$ = $2
-            * POSIX semantics: force a conversion to numeric type
-            */
-               $1->opcode = Op_plus_i;
-               $1->memory = make_profile_number(0.0, "0", 1);
-               $$ = list_append($2, $1);
+               if ($2->lasti->opcode == Op_push_i
+                       && ($2->lasti->memory->flags & STRING) == 0
+                       && ($2->lasti->memory->flags & NUMCONSTSTR) != 0) {
+                       NODE *n = $2->lasti->memory;
+                       add_sign_to_num(n, '+');
+                       $$ = $2;
+                       bcfree($1);
+               } else {
+                       /*
+                        * was: $$ = $2
+                        * POSIX semantics: force a conversion to numeric type
+                        */
+                       $1->opcode = Op_unary_plus;
+                       $$ = list_append($2, $1);
+               }
          }
        ;
 
@@ -2153,14 +2164,7 @@ negate_num(NODE *n)
        int tval = 0;
 #endif
 
-       if ((n->flags & NUMCONSTSTR) != 0) {
-               char *s;
-
-               s = n->stptr;
-               memmove(& s[1], & s[0], n->stlen + 1);
-               s[0] = '-';
-               n->stlen++;
-       }
+       add_sign_to_num(n, '-');
 
        if (! is_mpg_number(n)) {
                n->numbr = -n->numbr;
@@ -2194,6 +2198,21 @@ negate_num(NODE *n)
 #endif
 }
 
+/* add_sign_to_num --- make a constant unary plus or minus for profiling */
+
+static void
+add_sign_to_num(NODE *n, char sign)
+{
+       if ((n->flags & NUMCONSTSTR) != 0) {
+               char *s;
+
+               s = n->stptr;
+               memmove(& s[1], & s[0], n->stlen + 1);
+               s[0] = sign;
+               n->stlen++;
+       }
+}
+
 /* print_included_from --- print `Included from ..' file names and locations */
 
 static void
diff --git a/eval.c b/eval.c
index 1851756..491d0af 100644
--- a/eval.c
+++ b/eval.c
@@ -287,6 +287,7 @@ static struct optypetab {
        { "Op_postincrement", "++" },
        { "Op_postdecrement", "--" },
        { "Op_unary_minus", "-" },
+       { "Op_unary_plus", "+" },
        { "Op_field_spec", "$" },
        { "Op_not", "! " },
        { "Op_assign", " = " },
diff --git a/interpret.h b/interpret.h
index 5aa62a8..50eea9f 100644
--- a/interpret.h
+++ b/interpret.h
@@ -616,6 +616,11 @@ mod:
                        REPLACE(r);
                        break;
 
+               case Op_unary_plus:
+                       // Force argument to be numeric
+                       t1 = TOP_NUMBER();
+                       break;
+
                case Op_store_sub:
                        /*
                         * array[sub] assignment optimization,
diff --git a/profile.c b/profile.c
index 623da3f..f9c7c80 100644
--- a/profile.c
+++ b/profile.c
@@ -463,10 +463,13 @@ cleanup:
                case Op_field_spec:
                case Op_field_spec_lhs:
                case Op_unary_minus:
+               case Op_unary_plus:
                case Op_not:
                        t1 = pp_pop();
                        if (is_binary(t1->type)
-                           || (((OPCODE) t1->type) == pc->opcode && pc->opcode 
== Op_unary_minus))
+                           || (((OPCODE) t1->type) == pc->opcode
+                                   && (pc->opcode == Op_unary_minus
+                                           || pc->opcode == Op_unary_plus)))
                                pp_parenthesize(t1);
 
                        /* optypes table (eval.c) includes space after ! */
@@ -1198,6 +1201,7 @@ prec_level(int type)
                return 13;
 
        case Op_unary_minus:
+       case Op_unary_plus:
        case Op_not:
                return 12;
 
@@ -1284,6 +1288,7 @@ is_scalar(int type)
        case Op_postincrement:
        case Op_postdecrement:
        case Op_unary_minus:
+       case Op_unary_plus:
        case Op_not:
                return true;
 

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

Summary of changes:
 ChangeLog   |   12 +
 awk.h       |    1 +
 awkgram.c   |  809 ++++++++++++++++++++++++++++++-----------------------------
 awkgram.y   |   49 ++--
 eval.c      |    1 +
 interpret.h |    5 +
 profile.c   |    7 +-
 7 files changed, 473 insertions(+), 411 deletions(-)


hooks/post-receive
-- 
gawk



reply via email to

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