ListExp can manage explicit/implicit step 05/15005/1
Bruno JOFRET [Thu, 7 Aug 2014 14:31:46 +0000 (16:31 +0200)]
Change-Id: I11ee53690f4d2a77fbb31f0c126404345ed62d63

scilab/modules/ast/includes/exps/listexp.hxx
scilab/modules/ast/src/cpp/ast/printvisitor.cpp
scilab/modules/ast/src/cpp/parse/bison/parsescilab.yy
scilab/modules/ast/src/cpp/parse/parsescilab.cpp

index c2368ac..141e672 100644 (file)
@@ -39,11 +39,12 @@ public:
     ** \li "stop" is the end of the list (the max value)
     */
     ListExp (const Location& location,
-             Exp& start, Exp& step, Exp& end)
+             Exp& start, Exp& step, Exp& end, bool explicitStep=false)
         : Exp (location),
           _start (&start),
           _step (&step),
-          _end (&end)
+          _end (&end),
+          _explicitStep(explicitStep)
     {
     }
 
@@ -117,6 +118,12 @@ public:
         return *_end;
     }
 
+    /** \brief Return if expression has explicit step defined */
+    bool hasExplicitStep () const
+    {
+        return _explicitStep;
+    }
+
     /** \} */
 
 protected:
@@ -126,6 +133,8 @@ protected:
     Exp* _step;
     /** \brief end expression of the list. */
     Exp* _end;
+    /** \brief has list explicit step. */
+    bool _explicitStep;
 };
 
 } // namespace ast
index adbebac..5703a4b 100644 (file)
@@ -656,8 +656,11 @@ void PrintVisitor::visit(const ListExp &e)
 {
     *ostr << SCI_LPAREN;
     e.start_get().accept(*this);
-    *ostr << SCI_IMPLICIT_LIST;
-    e.step_get().accept(*this);
+    if (e.hasExplicitStep())
+    {
+        *ostr << SCI_IMPLICIT_LIST;
+        e.step_get().accept(*this);
+    }
     *ostr << SCI_IMPLICIT_LIST;
     e.end_get().accept(*this);
     *ostr << SCI_RPAREN;
index 3af9a77..40497b0 100644 (file)
@@ -1080,8 +1080,8 @@ COLON variable                            { $$ = $2; }
 */
 /* Stride parameter or not. */
 listableEnd :
-listableBegin COLON variable           { $$ = new ast::ListExp(@$, *new ast::CommentExp(@$, new std::wstring(L"Should not stay in that state")), *$1, *$3); }
-| listableBegin COLON functionCall     { $$ = new ast::ListExp(@$, *new ast::CommentExp(@$, new std::wstring(L"Should not stay in that state")), *$1, *$3); }
+listableBegin COLON variable           { $$ = new ast::ListExp(@$, *new ast::CommentExp(@$, new std::wstring(L"Should not stay in that state")), *$1, *$3, true); }
+| listableBegin COLON functionCall     { $$ = new ast::ListExp(@$, *new ast::CommentExp(@$, new std::wstring(L"Should not stay in that state")), *$1, *$3, true); }
 | listableBegin %prec LISTABLE         { $$ = new ast::ListExp(@$, *new ast::CommentExp(@$, new std::wstring(L"Should not stay in that state")), *new ast::DoubleExp(@$, 1.0), *$1); }
 ;
 
@@ -1106,8 +1106,14 @@ NOT variable                             %prec NOT       { $$ = new ast::NotExp(@$, *$2); }
                                                          $3->location_set(@$);
                                                          $$ = $3;
 }
-| variable listableEnd                                 { $$ = new ast::ListExp(@$, *$1, $2->step_get(), $2->end_get()); }
-| functionCall listableEnd             %prec UPLEVEL   { $$ = new ast::ListExp(@$, *$1, $2->step_get(), $2->end_get()); }
+| variable listableEnd                                 {
+    $$ = new ast::ListExp(@$, *$1, *($2->step_get().clone()), *($2->end_get().clone()), $2->hasExplicitStep());
+    delete($2);
+}
+| functionCall listableEnd             %prec UPLEVEL   {
+    $$ = new ast::ListExp(@$, *$1, *($2->step_get().clone()), *($2->end_get().clone()), $2->hasExplicitStep());
+    delete($2);
+}
 | matrix                                               { $$ = $1; }
 | cell                                                 { $$ = $1; }
 | operation                            %prec UPLEVEL           { $$ = $1; }
index d2fbffc..d2f307d 100644 (file)
@@ -729,28 +729,28 @@ static const yytype_uint16 yyrline[] =
     1042,  1043,  1044,  1045,  1046,  1047,  1048,  1050,  1051,  1052,
     1053,  1054,  1055,  1056,  1057,  1059,  1060,  1061,  1062,  1063,
     1064,  1065,  1066,  1074,  1075,  1083,  1084,  1085,  1093,  1094,
-    1095,  1096,  1097,  1102,  1103,  1104,  1109,  1110,  1111,  1112,
-    1113,  1114,  1115,  1116,  1117,  1118,  1119,  1120,  1121,  1122,
-    1123,  1124,  1125,  1126,  1134,  1138,  1142,  1148,  1154,  1160,
-    1172,  1173,  1174,  1178,  1182,  1187,  1192,  1193,  1202,  1203,
-    1204,  1208,  1212,  1217,  1222,  1223,  1231,  1235,  1248,  1249,
-    1250,  1251,  1259,  1260,  1268,  1272,  1276,  1280,  1284,  1288,
-    1292,  1296,  1307,  1308,  1316,  1317,  1318,  1319,  1321,  1322,
-    1324,  1325,  1334,  1335,  1336,  1341,  1342,  1343,  1348,  1349,
-    1350,  1351,  1358,  1367,  1368,  1378,  1386,  1387,  1401,  1402,
-    1418,  1419,  1420,  1421,  1422,  1430,  1431,  1432,  1433,  1434,
-    1435,  1443,  1444,  1445,  1446,  1447,  1448,  1456,  1461,  1474,
-    1489,  1490,  1491,  1492,  1500,  1501,  1509,  1510,  1511,  1512,
-    1513,  1514,  1515,  1523,  1524,  1532,  1533,  1534,  1535,  1536,
-    1544,  1548,  1552,  1556,  1560,  1564,  1571,  1572,  1586,  1587,
-    1588,  1589,  1590,  1591,  1592,  1593,  1594,  1595,  1596,  1597,
-    1605,  1606,  1614,  1615,  1624,  1625,  1626,  1627,  1628,  1629,
-    1630,  1631,  1635,  1636,  1650,  1658,  1659,  1673,  1674,  1675,
-    1676,  1677,  1678,  1679,  1680,  1681,  1682,  1683,  1684,  1685,
-    1686,  1687,  1688,  1689,  1690,  1698,  1699,  1713,  1714,  1715,
-    1716,  1723,  1737,  1738,  1739,  1746,  1747,  1755,  1756,  1764,
-    1765,  1766,  1767,  1768,  1769,  1770,  1771,  1772,  1773,  1774,
-    1775,  1776,  1777,  1778,  1779,  1780,  1781,  1782,  1783
+    1095,  1096,  1097,  1102,  1103,  1104,  1109,  1113,  1117,  1118,
+    1119,  1120,  1121,  1122,  1123,  1124,  1125,  1126,  1127,  1128,
+    1129,  1130,  1131,  1132,  1140,  1144,  1148,  1154,  1160,  1166,
+    1178,  1179,  1180,  1184,  1188,  1193,  1198,  1199,  1208,  1209,
+    1210,  1214,  1218,  1223,  1228,  1229,  1237,  1241,  1254,  1255,
+    1256,  1257,  1265,  1266,  1274,  1278,  1282,  1286,  1290,  1294,
+    1298,  1302,  1313,  1314,  1322,  1323,  1324,  1325,  1327,  1328,
+    1330,  1331,  1340,  1341,  1342,  1347,  1348,  1349,  1354,  1355,
+    1356,  1357,  1364,  1373,  1374,  1384,  1392,  1393,  1407,  1408,
+    1424,  1425,  1426,  1427,  1428,  1436,  1437,  1438,  1439,  1440,
+    1441,  1449,  1450,  1451,  1452,  1453,  1454,  1462,  1467,  1480,
+    1495,  1496,  1497,  1498,  1506,  1507,  1515,  1516,  1517,  1518,
+    1519,  1520,  1521,  1529,  1530,  1538,  1539,  1540,  1541,  1542,
+    1550,  1554,  1558,  1562,  1566,  1570,  1577,  1578,  1592,  1593,
+    1594,  1595,  1596,  1597,  1598,  1599,  1600,  1601,  1602,  1603,
+    1611,  1612,  1620,  1621,  1630,  1631,  1632,  1633,  1634,  1635,
+    1636,  1637,  1641,  1642,  1656,  1664,  1665,  1679,  1680,  1681,
+    1682,  1683,  1684,  1685,  1686,  1687,  1688,  1689,  1690,  1691,
+    1692,  1693,  1694,  1695,  1696,  1704,  1705,  1719,  1720,  1721,
+    1722,  1729,  1743,  1744,  1745,  1752,  1753,  1761,  1762,  1770,
+    1771,  1772,  1773,  1774,  1775,  1776,  1777,  1778,  1779,  1780,
+    1781,  1782,  1783,  1784,  1785,  1786,  1787,  1788,  1789
 };
 #endif
 
@@ -4232,13 +4232,13 @@ yyreduce:
 
   case 195:
 
-    { (yyval.t_implicit_list) = new ast::ListExp((yyloc), *new ast::CommentExp((yyloc), new std::wstring(L"Should not stay in that state")), *(yyvsp[-2].t_exp), *(yyvsp[0].t_exp)); }
+    { (yyval.t_implicit_list) = new ast::ListExp((yyloc), *new ast::CommentExp((yyloc), new std::wstring(L"Should not stay in that state")), *(yyvsp[-2].t_exp), *(yyvsp[0].t_exp), true); }
 
     break;
 
   case 196:
 
-    { (yyval.t_implicit_list) = new ast::ListExp((yyloc), *new ast::CommentExp((yyloc), new std::wstring(L"Should not stay in that state")), *(yyvsp[-2].t_exp), *(yyvsp[0].t_call_exp)); }
+    { (yyval.t_implicit_list) = new ast::ListExp((yyloc), *new ast::CommentExp((yyloc), new std::wstring(L"Should not stay in that state")), *(yyvsp[-2].t_exp), *(yyvsp[0].t_call_exp), true); }
 
     break;
 
@@ -4306,13 +4306,19 @@ yyreduce:
 
   case 206:
 
-    { (yyval.t_exp) = new ast::ListExp((yyloc), *(yyvsp[-1].t_exp), (yyvsp[0].t_implicit_list)->step_get(), (yyvsp[0].t_implicit_list)->end_get()); }
+    {
+    (yyval.t_exp) = new ast::ListExp((yyloc), *(yyvsp[-1].t_exp), *((yyvsp[0].t_implicit_list)->step_get().clone()), *((yyvsp[0].t_implicit_list)->end_get().clone()), (yyvsp[0].t_implicit_list)->hasExplicitStep());
+    delete((yyvsp[0].t_implicit_list));
+}
 
     break;
 
   case 207:
 
-    { (yyval.t_exp) = new ast::ListExp((yyloc), *(yyvsp[-1].t_call_exp), (yyvsp[0].t_implicit_list)->step_get(), (yyvsp[0].t_implicit_list)->end_get()); }
+    {
+    (yyval.t_exp) = new ast::ListExp((yyloc), *(yyvsp[-1].t_call_exp), *((yyvsp[0].t_implicit_list)->step_get().clone()), *((yyvsp[0].t_implicit_list)->end_get().clone()), (yyvsp[0].t_implicit_list)->hasExplicitStep());
+    delete((yyvsp[0].t_implicit_list));
+}
 
     break;