Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision b87e2b60f7d370125cd6b8c9e2d2eb9bb8445891)
+++ src/Parser/ExpressionNode.cc	(revision 51e076eafc08b318b66f0daf4086126420c95efe)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  4 16:11:23 2016
-// Update Count     : 338
+// Last Modified On : Fri Aug  5 07:56:23 2016
+// Update Count     : 375
 //
 
@@ -365,4 +365,28 @@
 }
 
+Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) {
+	return new LogicalExpr( notZeroExpr( maybeBuild<Expression>(expr_node1) ), notZeroExpr( maybeBuild<Expression>(expr_node2) ), kind );
+}
+
+Expression *build_opr1( OperatorNode::Type op, ExpressionNode *expr_node ) {
+	std::list<Expression *> args;
+	args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node) ) );
+	return new UntypedExpr( new NameExpr( opName[ op ] ), args );
+}
+Expression *build_opr2( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
+	std::list<Expression *> args;
+	args.push_back( maybeBuild<Expression>(expr_node1) );
+	args.push_back( maybeBuild<Expression>(expr_node2) );
+	return new UntypedExpr( new NameExpr( opName[ op ] ), args );
+}
+
+Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {
+	return new ConditionalExpr( notZeroExpr( maybeBuild<Expression>(expr_node1) ), maybeBuild<Expression>(expr_node2), maybeBuild<Expression>(expr_node3) );
+}
+
+Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
+	return new CommaExpr( maybeBuild<Expression>(expr_node1), maybeBuild<Expression>(expr_node2) );
+}
+
 CompositeExprNode2::CompositeExprNode2( Expression *expr ) : expr( expr ) {}
 CompositeExprNode2::CompositeExprNode2( const CompositeExprNode2 &other ) : expr( other.expr->clone() ) {}
@@ -382,9 +406,5 @@
 	} // if
 
-	switch ( op->get_type()) {
-	  case OperatorNode::Incr:
-	  case OperatorNode::Decr:
-	  case OperatorNode::IncrPost:
-	  case OperatorNode::DecrPost:
+	switch ( op->get_type() ) {
 	  case OperatorNode::Assign:
 	  case OperatorNode::MulAssn:
@@ -398,46 +418,6 @@
 	  case OperatorNode::ERAssn:
 	  case OperatorNode::OrAssn:
-		// the rewrite rules for these expressions specify that the first argument has its address taken
 		assert( ! args.empty() );
 		args.front() = new AddressExpr( args.front() );
-		break;
-	  default:		// do nothing
-		;
-	} // switch
-
-	switch ( op->get_type() ) {
-	  case OperatorNode::Incr:
-	  case OperatorNode::Decr:
-	  case OperatorNode::IncrPost:
-	  case OperatorNode::DecrPost:
-	  case OperatorNode::Assign:
-	  case OperatorNode::MulAssn:
-	  case OperatorNode::DivAssn:
-	  case OperatorNode::ModAssn:
-	  case OperatorNode::PlusAssn:
-	  case OperatorNode::MinusAssn:
-	  case OperatorNode::LSAssn:
-	  case OperatorNode::RSAssn:
-	  case OperatorNode::AndAssn:
-	  case OperatorNode::ERAssn:
-	  case OperatorNode::OrAssn:
-	  case OperatorNode::Plus:
-	  case OperatorNode::Minus:
-	  case OperatorNode::Mul:
-	  case OperatorNode::Div:
-	  case OperatorNode::Mod:
-	  case OperatorNode::BitOr:
-	  case OperatorNode::BitAnd:
-	  case OperatorNode::Xor:
-	  case OperatorNode::LShift:
-	  case OperatorNode::RShift:
-	  case OperatorNode::LThan:
-	  case OperatorNode::GThan:
-	  case OperatorNode::LEThan:
-	  case OperatorNode::GEThan:
-	  case OperatorNode::Eq:
-	  case OperatorNode::Neq:
-	  case OperatorNode::Index:
-	  case OperatorNode::Range:
 	  case OperatorNode::UnPlus:
 	  case OperatorNode::UnMinus:
@@ -447,20 +427,17 @@
 	  case OperatorNode::LabelAddress:
 		return new UntypedExpr( new NameExpr( opName[ op->get_type() ] ), args );
+
 	  case OperatorNode::Attr:
 		{
-			VarRefNode *var = dynamic_cast<VarRefNode *>( get_args());
+			VarRefNode *var = dynamic_cast<VarRefNode *>( get_args() );
 			assert( var );
 			if ( ! get_args()->get_link() ) {
 				return new AttrExpr( maybeBuild<Expression>(var), ( Expression*)0);
-			} else if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()->get_link()) ) {
-				return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType());
+			} else if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()->get_link() ) ) {
+				return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType() );
 			} else {
-				return new AttrExpr( maybeBuild<Expression>(var), args.back());
+				return new AttrExpr( maybeBuild<Expression>(var), args.back() );
 			} // if
 		}
-	  case OperatorNode::Or:
-	  case OperatorNode::And:
-		assert( args.size() == 2);
-		return new LogicalExpr( notZeroExpr( args.front() ), notZeroExpr( args.back() ), ( op->get_type() == OperatorNode::And ) );
 	  case OperatorNode::Cond:
 		{
@@ -474,14 +451,4 @@
 	  case OperatorNode::NCond:
 		throw UnimplementedError( "GNU 2-argument conditional expression" );
-	  case OperatorNode::Comma:
-		{
-			assert( args.size() == 2);
-			std::list< Expression * >::const_iterator i = args.begin();
-			Expression *ret = *i++;
-			while ( i != args.end() ) {
-				ret = new CommaExpr( ret, *i++ );
-			}
-			return ret;
-		}
 		// Tuples
 	  case OperatorNode::TupleC:
@@ -492,6 +459,5 @@
 		}
 	  default:
-		// shouldn't happen
-		assert( false );
+		assert( ((void)"CompositeExprNode::build", false) );
 		return 0;
 	} // switch
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision b87e2b60f7d370125cd6b8c9e2d2eb9bb8445891)
+++ src/Parser/ParseNode.h	(revision 51e076eafc08b318b66f0daf4086126420c95efe)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  4 16:34:16 2016
-// Update Count     : 277
+// Last Modified On : Fri Aug  5 07:49:32 2016
+// Update Count     : 288
 //
 
@@ -232,4 +232,25 @@
 Expression *build_alignOf( ExpressionNode *expr_node );
 Expression *build_offsetOf( TypeValueNode * arg, VarRefNode *member );
+Expression *build_and( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind );
+Expression *build_opr1( OperatorNode::Type op, ExpressionNode *expr_node );
+Expression *build_opr2( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 );
+Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );
+
+class CompositeExprNode2 : public ExpressionNode {
+  public:
+	CompositeExprNode2( Expression *expr );
+	CompositeExprNode2( const CompositeExprNode2 &other );
+	virtual ~CompositeExprNode2();
+
+	virtual CompositeExprNode2 *clone() const { return new CompositeExprNode2( *this ); }
+	virtual Expression *build() const { return expr->clone(); }
+
+	virtual void print( std::ostream &, int indent = 0) const;
+	virtual void printOneLine( std::ostream &, int indent = 0) const;
+  private:
+	Expression *expr;
+};
 
 class CompositeExprNode : public ExpressionNode {
@@ -258,19 +279,4 @@
 	ExpressionNode *function;
 	ExpressionNode *arguments;
-};
-
-class CompositeExprNode2 : public ExpressionNode {
-  public:
-	CompositeExprNode2( Expression *expr );
-	CompositeExprNode2( const CompositeExprNode2 &other );
-	virtual ~CompositeExprNode2();
-
-	virtual CompositeExprNode2 *clone() const { return new CompositeExprNode2( *this ); }
-	virtual Expression *build() const { return expr->clone(); }
-
-	virtual void print( std::ostream &, int indent = 0) const;
-	virtual void printOneLine( std::ostream &, int indent = 0) const;
-  private:
-	Expression *expr;
 };
 
Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision b87e2b60f7d370125cd6b8c9e2d2eb9bb8445891)
+++ src/Parser/parser.cc	(revision 51e076eafc08b318b66f0daf4086126420c95efe)
@@ -1022,75 +1022,75 @@
      371,   373,   375,   383,   384,   390,   391,   392,   397,   399,
      404,   405,   409,   413,   415,   417,   419,   424,   427,   429,
-     431,   433,   438,   440,   442,   444,   446,   448,   450,   452,
-     454,   456,   458,   465,   466,   468,   472,   473,   474,   475,
-     479,   480,   482,   487,   488,   490,   492,   497,   498,   500,
-     505,   506,   508,   513,   514,   516,   518,   520,   525,   526,
-     528,   533,   534,   539,   540,   545,   546,   551,   552,   557,
-     558,   563,   564,   566,   568,   573,   578,   579,   581,   583,
-     589,   590,   596,   598,   600,   602,   607,   608,   613,   614,
-     615,   616,   617,   618,   619,   620,   621,   622,   626,   627,
-     633,   634,   640,   641,   642,   643,   644,   645,   646,   647,
-     648,   658,   665,   667,   677,   678,   683,   685,   691,   693,
-     697,   698,   703,   708,   711,   713,   715,   725,   727,   738,
-     739,   741,   745,   747,   751,   752,   757,   758,   762,   767,
-     768,   772,   774,   780,   781,   785,   787,   789,   791,   797,
-     798,   802,   804,   809,   811,   813,   818,   820,   825,   827,
-     831,   834,   838,   841,   845,   847,   851,   853,   860,   862,
-     864,   873,   875,   877,   879,   881,   886,   888,   890,   892,
-     897,   910,   911,   916,   918,   923,   927,   929,   931,   933,
-     935,   941,   942,   948,   949,   953,   954,   959,   961,   967,
-     968,   970,   975,   977,   984,   986,   990,   991,   996,   998,
-    1002,  1003,  1007,  1009,  1013,  1014,  1018,  1019,  1023,  1024,
-    1039,  1040,  1041,  1042,  1043,  1047,  1052,  1059,  1069,  1074,
-    1079,  1087,  1092,  1097,  1102,  1107,  1115,  1137,  1142,  1149,
-    1151,  1158,  1163,  1168,  1179,  1184,  1189,  1194,  1199,  1208,
-    1213,  1221,  1222,  1223,  1224,  1230,  1235,  1243,  1244,  1245,
-    1246,  1250,  1251,  1252,  1253,  1258,  1259,  1268,  1269,  1274,
-    1275,  1280,  1282,  1284,  1286,  1288,  1291,  1290,  1302,  1303,
-    1305,  1315,  1316,  1321,  1325,  1327,  1329,  1331,  1333,  1335,
-    1337,  1339,  1344,  1346,  1348,  1350,  1352,  1354,  1356,  1358,
-    1360,  1362,  1364,  1366,  1368,  1374,  1375,  1377,  1379,  1381,
-    1386,  1387,  1393,  1394,  1396,  1398,  1403,  1405,  1407,  1409,
-    1414,  1415,  1417,  1419,  1424,  1425,  1427,  1432,  1433,  1435,
-    1437,  1442,  1444,  1446,  1451,  1452,  1456,  1458,  1464,  1463,
-    1467,  1469,  1474,  1476,  1482,  1483,  1488,  1489,  1491,  1492,
-    1501,  1502,  1504,  1506,  1511,  1513,  1519,  1520,  1522,  1525,
-    1528,  1533,  1534,  1539,  1544,  1548,  1550,  1556,  1555,  1562,
-    1564,  1570,  1571,  1579,  1580,  1584,  1585,  1586,  1588,  1590,
-    1597,  1598,  1600,  1602,  1607,  1608,  1614,  1615,  1619,  1620,
-    1625,  1626,  1627,  1629,  1637,  1638,  1640,  1643,  1645,  1649,
-    1650,  1651,  1653,  1655,  1659,  1664,  1672,  1673,  1682,  1684,
-    1689,  1690,  1691,  1695,  1696,  1697,  1701,  1702,  1703,  1707,
-    1708,  1709,  1714,  1715,  1716,  1717,  1723,  1724,  1726,  1731,
-    1732,  1737,  1738,  1739,  1740,  1741,  1756,  1757,  1762,  1763,
-    1771,  1773,  1775,  1778,  1780,  1782,  1805,  1806,  1808,  1810,
-    1815,  1816,  1818,  1823,  1828,  1829,  1835,  1834,  1838,  1842,
-    1844,  1846,  1852,  1853,  1858,  1863,  1865,  1870,  1872,  1873,
-    1875,  1880,  1882,  1884,  1889,  1891,  1896,  1901,  1909,  1915,
-    1914,  1928,  1929,  1934,  1935,  1939,  1944,  1949,  1957,  1962,
-    1973,  1974,  1985,  1986,  1992,  1993,  1997,  1998,  1999,  2002,
-    2001,  2012,  2021,  2027,  2033,  2042,  2048,  2054,  2060,  2066,
-    2074,  2080,  2088,  2094,  2103,  2104,  2105,  2109,  2113,  2115,
-    2120,  2121,  2125,  2126,  2131,  2137,  2138,  2141,  2143,  2144,
-    2148,  2149,  2150,  2151,  2185,  2187,  2188,  2190,  2195,  2200,
-    2205,  2207,  2209,  2214,  2216,  2218,  2220,  2225,  2227,  2236,
-    2238,  2239,  2244,  2246,  2248,  2253,  2255,  2257,  2262,  2264,
-    2266,  2275,  2276,  2277,  2281,  2283,  2285,  2290,  2292,  2294,
-    2299,  2301,  2303,  2318,  2320,  2321,  2323,  2328,  2329,  2334,
-    2336,  2338,  2343,  2345,  2347,  2349,  2354,  2356,  2358,  2368,
-    2370,  2371,  2373,  2378,  2380,  2382,  2387,  2389,  2391,  2393,
-    2398,  2400,  2402,  2433,  2435,  2436,  2438,  2443,  2448,  2456,
-    2458,  2460,  2465,  2467,  2472,  2474,  2488,  2489,  2491,  2496,
-    2498,  2500,  2502,  2504,  2509,  2510,  2512,  2514,  2519,  2521,
-    2523,  2529,  2531,  2533,  2537,  2539,  2541,  2543,  2557,  2558,
-    2560,  2565,  2567,  2569,  2571,  2573,  2578,  2579,  2581,  2583,
-    2588,  2590,  2592,  2598,  2599,  2601,  2610,  2613,  2615,  2618,
-    2620,  2622,  2635,  2636,  2638,  2643,  2645,  2647,  2649,  2651,
-    2656,  2657,  2659,  2661,  2666,  2668,  2676,  2677,  2678,  2683,
-    2684,  2688,  2690,  2692,  2694,  2696,  2698,  2705,  2707,  2709,
-    2711,  2713,  2715,  2717,  2719,  2721,  2723,  2728,  2730,  2732,
-    2737,  2763,  2764,  2766,  2770,  2771,  2775,  2777,  2779,  2781,
-    2783,  2785,  2792,  2794,  2796,  2798,  2800,  2802,  2807,  2812,
-    2814,  2816,  2834,  2836,  2841,  2842
+     431,   436,   439,   441,   443,   445,   447,   449,   451,   453,
+     455,   457,   459,   466,   467,   469,   473,   474,   475,   476,
+     480,   481,   483,   488,   489,   491,   493,   498,   499,   501,
+     506,   507,   509,   514,   515,   517,   519,   521,   526,   527,
+     529,   534,   535,   540,   541,   546,   547,   552,   553,   558,
+     559,   564,   565,   568,   570,   575,   580,   581,   583,   585,
+     591,   592,   598,   600,   602,   604,   609,   610,   615,   616,
+     617,   618,   619,   620,   621,   622,   623,   624,   628,   629,
+     636,   637,   643,   644,   645,   646,   647,   648,   649,   650,
+     651,   661,   668,   670,   680,   681,   686,   688,   694,   696,
+     700,   701,   706,   711,   714,   716,   718,   728,   730,   741,
+     742,   744,   748,   750,   754,   755,   760,   761,   765,   770,
+     771,   775,   777,   783,   784,   788,   790,   792,   794,   800,
+     801,   805,   807,   812,   814,   816,   821,   823,   828,   830,
+     834,   837,   841,   844,   848,   850,   854,   856,   863,   865,
+     867,   876,   878,   880,   882,   884,   889,   891,   893,   895,
+     900,   913,   914,   919,   921,   926,   930,   932,   934,   936,
+     938,   944,   945,   951,   952,   956,   957,   962,   964,   970,
+     971,   973,   978,   980,   987,   989,   993,   994,   999,  1001,
+    1005,  1006,  1010,  1012,  1016,  1017,  1021,  1022,  1026,  1027,
+    1042,  1043,  1044,  1045,  1046,  1050,  1055,  1062,  1072,  1077,
+    1082,  1090,  1095,  1100,  1105,  1110,  1118,  1140,  1145,  1152,
+    1154,  1161,  1166,  1171,  1182,  1187,  1192,  1197,  1202,  1211,
+    1216,  1224,  1225,  1226,  1227,  1233,  1238,  1246,  1247,  1248,
+    1249,  1253,  1254,  1255,  1256,  1261,  1262,  1271,  1272,  1277,
+    1278,  1283,  1285,  1287,  1289,  1291,  1294,  1293,  1305,  1306,
+    1308,  1318,  1319,  1324,  1328,  1330,  1332,  1334,  1336,  1338,
+    1340,  1342,  1347,  1349,  1351,  1353,  1355,  1357,  1359,  1361,
+    1363,  1365,  1367,  1369,  1371,  1377,  1378,  1380,  1382,  1384,
+    1389,  1390,  1396,  1397,  1399,  1401,  1406,  1408,  1410,  1412,
+    1417,  1418,  1420,  1422,  1427,  1428,  1430,  1435,  1436,  1438,
+    1440,  1445,  1447,  1449,  1454,  1455,  1459,  1461,  1467,  1466,
+    1470,  1472,  1477,  1479,  1485,  1486,  1491,  1492,  1494,  1495,
+    1504,  1505,  1507,  1509,  1514,  1516,  1522,  1523,  1525,  1528,
+    1531,  1536,  1537,  1542,  1547,  1551,  1553,  1559,  1558,  1565,
+    1567,  1573,  1574,  1582,  1583,  1587,  1588,  1589,  1591,  1593,
+    1600,  1601,  1603,  1605,  1610,  1611,  1617,  1618,  1622,  1623,
+    1628,  1629,  1630,  1632,  1640,  1641,  1643,  1646,  1648,  1652,
+    1653,  1654,  1656,  1658,  1662,  1667,  1675,  1676,  1685,  1687,
+    1692,  1693,  1694,  1698,  1699,  1700,  1704,  1705,  1706,  1710,
+    1711,  1712,  1717,  1718,  1719,  1720,  1726,  1727,  1729,  1734,
+    1735,  1740,  1741,  1742,  1743,  1744,  1759,  1760,  1765,  1766,
+    1774,  1776,  1778,  1781,  1783,  1785,  1808,  1809,  1811,  1813,
+    1818,  1819,  1821,  1826,  1831,  1832,  1838,  1837,  1841,  1845,
+    1847,  1849,  1855,  1856,  1861,  1866,  1868,  1873,  1875,  1876,
+    1878,  1883,  1885,  1887,  1892,  1894,  1899,  1904,  1912,  1918,
+    1917,  1931,  1932,  1937,  1938,  1942,  1947,  1952,  1960,  1965,
+    1976,  1977,  1988,  1989,  1995,  1996,  2000,  2001,  2002,  2005,
+    2004,  2015,  2024,  2030,  2036,  2045,  2051,  2057,  2063,  2069,
+    2077,  2083,  2091,  2097,  2106,  2107,  2108,  2112,  2116,  2118,
+    2123,  2124,  2128,  2129,  2134,  2140,  2141,  2144,  2146,  2147,
+    2151,  2152,  2153,  2154,  2188,  2190,  2191,  2193,  2198,  2203,
+    2208,  2210,  2212,  2217,  2219,  2221,  2223,  2228,  2230,  2239,
+    2241,  2242,  2247,  2249,  2251,  2256,  2258,  2260,  2265,  2267,
+    2269,  2278,  2279,  2280,  2284,  2286,  2288,  2293,  2295,  2297,
+    2302,  2304,  2306,  2321,  2323,  2324,  2326,  2331,  2332,  2337,
+    2339,  2341,  2346,  2348,  2350,  2352,  2357,  2359,  2361,  2371,
+    2373,  2374,  2376,  2381,  2383,  2385,  2390,  2392,  2394,  2396,
+    2401,  2403,  2405,  2436,  2438,  2439,  2441,  2446,  2451,  2459,
+    2461,  2463,  2468,  2470,  2475,  2477,  2491,  2492,  2494,  2499,
+    2501,  2503,  2505,  2507,  2512,  2513,  2515,  2517,  2522,  2524,
+    2526,  2532,  2534,  2536,  2540,  2542,  2544,  2546,  2560,  2561,
+    2563,  2568,  2570,  2572,  2574,  2576,  2581,  2582,  2584,  2586,
+    2591,  2593,  2595,  2601,  2602,  2604,  2613,  2616,  2618,  2621,
+    2623,  2625,  2638,  2639,  2641,  2646,  2648,  2650,  2652,  2654,
+    2659,  2660,  2662,  2664,  2669,  2671,  2679,  2680,  2681,  2686,
+    2687,  2691,  2693,  2695,  2697,  2699,  2701,  2708,  2710,  2712,
+    2714,  2716,  2718,  2720,  2722,  2724,  2726,  2731,  2733,  2735,
+    2740,  2766,  2767,  2769,  2773,  2774,  2778,  2780,  2782,  2784,
+    2786,  2788,  2795,  2797,  2799,  2801,  2803,  2805,  2810,  2815,
+    2817,  2819,  2837,  2839,  2844,  2845
 };
 #endif
@@ -5299,5 +5299,5 @@
 /* Line 1806 of yacc.c  */
 #line 358 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ); }
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Index, (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en) ) ); }
     break;
 
@@ -5327,5 +5327,5 @@
 /* Line 1806 of yacc.c  */
 #line 370 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), (yyvsp[(1) - (2)].en) ); }
+    { (yyval.en) = new CompositeExprNode2( build_opr1( OperatorNode::IncrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
 
@@ -5334,5 +5334,5 @@
 /* Line 1806 of yacc.c  */
 #line 372 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), (yyvsp[(1) - (2)].en) ); }
+    { (yyval.en) = new CompositeExprNode2( build_opr1( OperatorNode::DecrPost, (yyvsp[(1) - (2)].en) ) ); }
     break;
 
@@ -5455,6 +5455,7 @@
 
 /* Line 1806 of yacc.c  */
-#line 434 "parser.yy"
-    { (yyval.en) = (yyvsp[(1) - (2)].op) == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( (yyvsp[(2) - (2)].en) ) ) : (ExpressionNode*)new CompositeExprNode( new OperatorNode ( (yyvsp[(1) - (2)].op) ), (yyvsp[(2) - (2)].en) ); }
+#line 437 "parser.yy"
+    { (yyval.en) = (yyvsp[(1) - (2)].op) == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( (yyvsp[(2) - (2)].en) ) )
+											: (ExpressionNode*)new CompositeExprNode( new OperatorNode ( (yyvsp[(1) - (2)].op) ), (yyvsp[(2) - (2)].en) ); }
     break;
 
@@ -5462,5 +5463,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 439 "parser.yy"
+#line 440 "parser.yy"
     { (yyval.en) = new CompositeExprNode( (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5469,6 +5470,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 441 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), (yyvsp[(2) - (2)].en) ); }
+#line 442 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr1( OperatorNode::Incr, (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5476,6 +5477,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 443 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), (yyvsp[(2) - (2)].en) ); }
+#line 444 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr1( OperatorNode::Decr, (yyvsp[(2) - (2)].en) ) ); }
     break;
 
@@ -5483,5 +5484,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 445 "parser.yy"
+#line 446 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_sizeOf( (yyvsp[(2) - (2)].en) ) ); }
     break;
@@ -5490,5 +5491,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 447 "parser.yy"
+#line 448 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_sizeOf( new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ) ); }
     break;
@@ -5497,5 +5498,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 449 "parser.yy"
+#line 450 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_offsetOf( new TypeValueNode( (yyvsp[(3) - (6)].decl) ), new VarRefNode( (yyvsp[(5) - (6)].tok) ) ) ); }
     break;
@@ -5504,6 +5505,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 451 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) )); }
+#line 452 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
     break;
 
@@ -5511,6 +5512,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 453 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) )); }
+#line 454 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ); }
     break;
 
@@ -5518,5 +5519,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 455 "parser.yy"
+#line 456 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( (yyvsp[(1) - (4)].tok) ), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -5525,5 +5526,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 457 "parser.yy"
+#line 458 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_alignOf( (yyvsp[(2) - (2)].en) ) ); }
     break;
@@ -5532,5 +5533,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 459 "parser.yy"
+#line 460 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_alignOf( new TypeValueNode( (yyvsp[(3) - (4)].decl) ) ) ); }
     break;
@@ -5539,5 +5540,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 465 "parser.yy"
+#line 466 "parser.yy"
     { (yyval.op) = OperatorNode::PointTo; }
     break;
@@ -5546,5 +5547,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 466 "parser.yy"
+#line 467 "parser.yy"
     { (yyval.op) = OperatorNode::AddressOf; }
     break;
@@ -5553,5 +5554,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 468 "parser.yy"
+#line 469 "parser.yy"
     { (yyval.op) = OperatorNode::And; }
     break;
@@ -5560,5 +5561,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 472 "parser.yy"
+#line 473 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::UnPlus ); }
     break;
@@ -5567,5 +5568,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 473 "parser.yy"
+#line 474 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::UnMinus ); }
     break;
@@ -5574,5 +5575,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 474 "parser.yy"
+#line 475 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::Neg ); }
     break;
@@ -5581,5 +5582,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 475 "parser.yy"
+#line 476 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::BitNeg ); }
     break;
@@ -5588,5 +5589,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 481 "parser.yy"
+#line 482 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_cast( new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ) ); }
     break;
@@ -5595,5 +5596,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 483 "parser.yy"
+#line 484 "parser.yy"
     { (yyval.en) = new CompositeExprNode2( build_cast( new TypeValueNode( (yyvsp[(2) - (4)].decl) ), (yyvsp[(4) - (4)].en) ) ); }
     break;
@@ -5602,6 +5603,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 489 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 490 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Mul, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5609,6 +5610,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 491 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 492 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Div, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5616,6 +5617,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 493 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 494 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Mod, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5623,6 +5624,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 499 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 500 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Plus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5630,6 +5631,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 501 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 502 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Minus, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5637,6 +5638,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 507 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 508 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::LShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5644,6 +5645,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 509 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 510 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::RShift, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5651,6 +5652,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 515 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 516 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::LThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5658,6 +5659,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 517 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 518 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::GThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5665,6 +5666,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 519 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 520 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::LEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5672,6 +5673,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 521 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 522 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::GEThan, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5679,6 +5680,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 527 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 528 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Eq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5686,6 +5687,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 529 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 530 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Neq, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5693,6 +5694,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 535 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 536 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::BitAnd, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5700,6 +5701,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 541 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 542 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Xor, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5707,6 +5708,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 547 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 548 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::BitOr, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5714,6 +5715,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 553 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::And ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 554 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), true ) ); }
     break;
 
@@ -5721,6 +5722,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 559 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 560 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_and_or( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en), false ) ); }
     break;
 
@@ -5728,6 +5729,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 565 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
+#line 567 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
     break;
 
@@ -5735,6 +5736,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 567 "parser.yy"
-    { (yyval.en)=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
+#line 569 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), (yyvsp[(1) - (4)].en), (yyvsp[(4) - (4)].en) ); }
     break;
 
@@ -5742,6 +5743,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 569 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*(yyvsp[(1) - (5)].en), *(yyvsp[(3) - (5)].en), *(yyvsp[(5) - (5)].en) ) ) ); }
+#line 571 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_cond( (yyvsp[(1) - (5)].en), (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].en) ) ); }
     break;
 
@@ -5749,6 +5750,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 580 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 582 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
 
@@ -5756,6 +5757,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 582 "parser.yy"
-    { (yyval.en) =new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 584 "parser.yy"
+    { (yyval.en) = new CompositeExprNode( (yyvsp[(2) - (3)].en), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
     break;
 
@@ -5763,5 +5764,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 584 "parser.yy"
+#line 586 "parser.yy"
     { (yyval.en) = ( (yyvsp[(2) - (2)].en) == 0 ) ? (yyvsp[(1) - (2)].en) : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), (yyvsp[(1) - (2)].en), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -5770,5 +5771,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 589 "parser.yy"
+#line 591 "parser.yy"
     { (yyval.en) = new NullExprNode; }
     break;
@@ -5777,5 +5778,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 597 "parser.yy"
+#line 599 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ) ); }
     break;
@@ -5784,5 +5785,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 599 "parser.yy"
+#line 601 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (yyvsp[(3) - (5)].en) ); }
     break;
@@ -5791,5 +5792,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 601 "parser.yy"
+#line 603 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(new NullExprNode)->set_link( (yyvsp[(4) - (6)].en) ) ); }
     break;
@@ -5798,5 +5799,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 603 "parser.yy"
+#line 605 "parser.yy"
     { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::TupleC ), (ExpressionNode *)(yyvsp[(3) - (7)].en)->set_link( flattenCommas( (yyvsp[(5) - (7)].en) ) ) ); }
     break;
@@ -5805,5 +5806,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 609 "parser.yy"
+#line 611 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -5812,5 +5813,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 613 "parser.yy"
+#line 615 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::MulAssn ); }
     break;
@@ -5819,5 +5820,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 614 "parser.yy"
+#line 616 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::DivAssn ); }
     break;
@@ -5826,5 +5827,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 615 "parser.yy"
+#line 617 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::ModAssn ); }
     break;
@@ -5833,5 +5834,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 616 "parser.yy"
+#line 618 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::PlusAssn ); }
     break;
@@ -5840,5 +5841,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 617 "parser.yy"
+#line 619 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::MinusAssn ); }
     break;
@@ -5847,5 +5848,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 618 "parser.yy"
+#line 620 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::LSAssn ); }
     break;
@@ -5854,5 +5855,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 619 "parser.yy"
+#line 621 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::RSAssn ); }
     break;
@@ -5861,5 +5862,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 620 "parser.yy"
+#line 622 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::AndAssn ); }
     break;
@@ -5868,5 +5869,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 621 "parser.yy"
+#line 623 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::ERAssn ); }
     break;
@@ -5875,5 +5876,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 622 "parser.yy"
+#line 624 "parser.yy"
     { (yyval.en) = new OperatorNode( OperatorNode::OrAssn ); }
     break;
@@ -5882,6 +5883,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 628 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 631 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_comma( (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -5889,5 +5890,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 633 "parser.yy"
+#line 636 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -5896,5 +5897,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 642 "parser.yy"
+#line 645 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (1)].sn); }
     break;
@@ -5903,5 +5904,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 649 "parser.yy"
+#line 652 "parser.yy"
     {
 			Token fn; fn.str = new std::string( "^?{}" ); // location undefined
@@ -5914,5 +5915,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 659 "parser.yy"
+#line 662 "parser.yy"
     {
 			(yyval.sn) = (yyvsp[(4) - (4)].sn)->add_label( (yyvsp[(1) - (4)].tok) );
@@ -5923,5 +5924,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 666 "parser.yy"
+#line 669 "parser.yy"
     { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
     break;
@@ -5930,5 +5931,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 673 "parser.yy"
+#line 676 "parser.yy"
     { (yyval.sn) = new CompoundStmtNode( (yyvsp[(5) - (7)].sn) ); }
     break;
@@ -5937,5 +5938,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 679 "parser.yy"
+#line 682 "parser.yy"
     { if ( (yyvsp[(1) - (3)].sn) != 0 ) { (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(3) - (3)].sn) ); (yyval.sn) = (yyvsp[(1) - (3)].sn); } }
     break;
@@ -5944,5 +5945,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 684 "parser.yy"
+#line 687 "parser.yy"
     { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
@@ -5951,5 +5952,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 686 "parser.yy"
+#line 689 "parser.yy"
     {	// mark all fields in list
 			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
@@ -5962,5 +5963,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 692 "parser.yy"
+#line 695 "parser.yy"
     { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
@@ -5969,5 +5970,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 699 "parser.yy"
+#line 702 "parser.yy"
     { if ( (yyvsp[(1) - (2)].sn) != 0 ) { (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) ); (yyval.sn) = (yyvsp[(1) - (2)].sn); } }
     break;
@@ -5976,5 +5977,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 704 "parser.yy"
+#line 707 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Exp, (yyvsp[(1) - (2)].en), 0 ); }
     break;
@@ -5983,5 +5984,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 710 "parser.yy"
+#line 713 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -5990,5 +5991,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 712 "parser.yy"
+#line 715 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::If, (yyvsp[(3) - (7)].en), (StatementNode *)mkList((*(yyvsp[(5) - (7)].sn), *(yyvsp[(7) - (7)].sn) )) ); }
     break;
@@ -5997,5 +5998,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 714 "parser.yy"
+#line 717 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -6004,5 +6005,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 716 "parser.yy"
+#line 719 "parser.yy"
     {
 			StatementNode *sw = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) );
@@ -6019,5 +6020,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 726 "parser.yy"
+#line 729 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -6026,5 +6027,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 728 "parser.yy"
+#line 731 "parser.yy"
     {
 			StatementNode *sw = new StatementNode( StatementNode::Switch, (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) );
@@ -6036,5 +6037,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 738 "parser.yy"
+#line 741 "parser.yy"
     { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
@@ -6043,6 +6044,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 740 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 743 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Range, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -6050,5 +6051,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 745 "parser.yy"
+#line 748 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Case, (yyvsp[(1) - (1)].en), 0 ); }
     break;
@@ -6057,5 +6058,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 747 "parser.yy"
+#line 750 "parser.yy"
     { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_link( new StatementNode( StatementNode::Case, (yyvsp[(3) - (3)].en), 0 ) ) ); }
     break;
@@ -6064,5 +6065,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 751 "parser.yy"
+#line 754 "parser.yy"
     { (yyval.sn) = (yyvsp[(2) - (3)].sn); }
     break;
@@ -6071,5 +6072,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 752 "parser.yy"
+#line 755 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Default ); }
     break;
@@ -6078,5 +6079,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 758 "parser.yy"
+#line 761 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (2)].sn)->set_link( (yyvsp[(2) - (2)].sn) )); }
     break;
@@ -6085,5 +6086,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 762 "parser.yy"
+#line 765 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
     break;
@@ -6092,5 +6093,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 767 "parser.yy"
+#line 770 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -6099,5 +6100,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 773 "parser.yy"
+#line 776 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
     break;
@@ -6106,5 +6107,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 775 "parser.yy"
+#line 778 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(3) - (3)].sn) ) ) ) ); }
     break;
@@ -6113,5 +6114,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 780 "parser.yy"
+#line 783 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -6120,5 +6121,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 786 "parser.yy"
+#line 789 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( (yyvsp[(2) - (2)].sn) ); }
     break;
@@ -6127,5 +6128,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 788 "parser.yy"
+#line 791 "parser.yy"
     { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(2) - (3)].sn), *(yyvsp[(3) - (3)].sn) ) ) ) ); }
     break;
@@ -6134,5 +6135,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 790 "parser.yy"
+#line 793 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_link( (yyvsp[(2) - (3)].sn)->append_last_case( (yyvsp[(3) - (3)].sn) ))); }
     break;
@@ -6141,5 +6142,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 792 "parser.yy"
+#line 795 "parser.yy"
     { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_link( (yyvsp[(2) - (4)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(3) - (4)].sn), *(yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
     break;
@@ -6148,5 +6149,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 797 "parser.yy"
+#line 800 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Break ); }
     break;
@@ -6155,5 +6156,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 803 "parser.yy"
+#line 806 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -6162,5 +6163,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 805 "parser.yy"
+#line 808 "parser.yy"
     { (yyval.sn) = 0; }
     break;
@@ -6169,5 +6170,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 810 "parser.yy"
+#line 813 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::While, (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ); }
     break;
@@ -6176,5 +6177,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 812 "parser.yy"
+#line 815 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Do, (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ); }
     break;
@@ -6183,5 +6184,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 814 "parser.yy"
+#line 817 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::For, (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].sn) ); }
     break;
@@ -6190,5 +6191,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 819 "parser.yy"
+#line 822 "parser.yy"
     { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (6)].en), (yyvsp[(4) - (6)].en), (yyvsp[(6) - (6)].en) ); }
     break;
@@ -6197,5 +6198,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 821 "parser.yy"
+#line 824 "parser.yy"
     { (yyval.en) = new ForCtlExprNode( (yyvsp[(1) - (4)].decl), (yyvsp[(2) - (4)].en), (yyvsp[(4) - (4)].en) ); }
     break;
@@ -6204,5 +6205,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 826 "parser.yy"
+#line 829 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -6211,5 +6212,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 830 "parser.yy"
+#line 833 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Goto, (yyvsp[(3) - (4)].en) ); }
     break;
@@ -6218,5 +6219,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 833 "parser.yy"
+#line 836 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Continue ); }
     break;
@@ -6225,5 +6226,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 837 "parser.yy"
+#line 840 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Continue, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -6232,5 +6233,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 840 "parser.yy"
+#line 843 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Break ); }
     break;
@@ -6239,5 +6240,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 844 "parser.yy"
+#line 847 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Break, (yyvsp[(2) - (3)].tok) ); }
     break;
@@ -6246,5 +6247,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 846 "parser.yy"
+#line 849 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Return, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6253,5 +6254,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 848 "parser.yy"
+#line 851 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6260,5 +6261,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 852 "parser.yy"
+#line 855 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (3)].en), 0 ); }
     break;
@@ -6267,5 +6268,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 854 "parser.yy"
+#line 857 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Throw, (yyvsp[(2) - (5)].en), 0 ); }
     break;
@@ -6274,5 +6275,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 861 "parser.yy"
+#line 864 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
     break;
@@ -6281,5 +6282,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 863 "parser.yy"
+#line 866 "parser.yy"
     { (yyval.sn) = new StatementNode( StatementNode::Try, 0,(StatementNode *)(mkList((*(yyvsp[(2) - (3)].sn),*(yyvsp[(3) - (3)].pn) )))); }
     break;
@@ -6288,5 +6289,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 865 "parser.yy"
+#line 868 "parser.yy"
     {
 			(yyvsp[(3) - (4)].pn)->set_link( (yyvsp[(4) - (4)].pn) );
@@ -6298,5 +6299,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 876 "parser.yy"
+#line 879 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
     break;
@@ -6305,5 +6306,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 878 "parser.yy"
+#line 881 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
     break;
@@ -6312,5 +6313,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 880 "parser.yy"
+#line 883 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( 0, (yyvsp[(5) - (5)].sn), true ); }
     break;
@@ -6319,5 +6320,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 882 "parser.yy"
+#line 885 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (6)].pn)->set_link( StatementNode::newCatchStmt( 0, (yyvsp[(6) - (6)].sn), true ) ); }
     break;
@@ -6326,5 +6327,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 887 "parser.yy"
+#line 890 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
     break;
@@ -6333,5 +6334,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 889 "parser.yy"
+#line 892 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
     break;
@@ -6340,5 +6341,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 891 "parser.yy"
+#line 894 "parser.yy"
     { (yyval.pn) = StatementNode::newCatchStmt( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ); }
     break;
@@ -6347,5 +6348,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 893 "parser.yy"
+#line 896 "parser.yy"
     { (yyval.pn) = (yyvsp[(1) - (10)].pn)->set_link( StatementNode::newCatchStmt( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ); }
     break;
@@ -6354,5 +6355,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 898 "parser.yy"
+#line 901 "parser.yy"
     {
 			(yyval.pn) = new StatementNode( StatementNode::Finally, 0, (yyvsp[(2) - (2)].sn) );
@@ -6364,5 +6365,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 912 "parser.yy"
+#line 915 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6374,5 +6375,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 917 "parser.yy"
+#line 920 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -6381,5 +6382,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 919 "parser.yy"
+#line 922 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6391,5 +6392,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 928 "parser.yy"
+#line 931 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
     break;
@@ -6398,5 +6399,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 930 "parser.yy"
+#line 933 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
     break;
@@ -6405,5 +6406,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 932 "parser.yy"
+#line 935 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
     break;
@@ -6412,5 +6413,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 934 "parser.yy"
+#line 937 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].constant) ); }
     break;
@@ -6419,5 +6420,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 936 "parser.yy"
+#line 939 "parser.yy"
     { (yyval.sn) = new AsmStmtNode( StatementNode::Asm, (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].constant), (yyvsp[(12) - (14)].label) ); }
     break;
@@ -6426,5 +6427,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 941 "parser.yy"
+#line 944 "parser.yy"
     { (yyval.flag) = false; }
     break;
@@ -6433,5 +6434,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 943 "parser.yy"
+#line 946 "parser.yy"
     { (yyval.flag) = true; }
     break;
@@ -6440,5 +6441,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 948 "parser.yy"
+#line 951 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -6447,5 +6448,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 955 "parser.yy"
+#line 958 "parser.yy"
     { (yyval.en) = (ExpressionNode *)(yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) ); }
     break;
@@ -6454,5 +6455,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 960 "parser.yy"
+#line 963 "parser.yy"
     { (yyval.en) = new AsmExprNode( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -6461,5 +6462,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 962 "parser.yy"
+#line 965 "parser.yy"
     { (yyval.en) = new AsmExprNode( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ); }
     break;
@@ -6468,5 +6469,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 967 "parser.yy"
+#line 970 "parser.yy"
     { (yyval.constant) = 0; }
     break;
@@ -6475,5 +6476,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 969 "parser.yy"
+#line 972 "parser.yy"
     { (yyval.constant) = (yyvsp[(1) - (1)].constant); }
     break;
@@ -6482,5 +6483,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 971 "parser.yy"
+#line 974 "parser.yy"
     { (yyval.constant) = (ConstantNode *)(yyvsp[(1) - (3)].constant)->set_link( (yyvsp[(3) - (3)].constant) ); }
     break;
@@ -6489,5 +6490,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 976 "parser.yy"
+#line 979 "parser.yy"
     { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -6496,5 +6497,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 978 "parser.yy"
+#line 981 "parser.yy"
     { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
     break;
@@ -6503,5 +6504,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 985 "parser.yy"
+#line 988 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6510,5 +6511,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 992 "parser.yy"
+#line 995 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6517,5 +6518,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 997 "parser.yy"
+#line 1000 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6524,5 +6525,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1004 "parser.yy"
+#line 1007 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6531,5 +6532,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1018 "parser.yy"
+#line 1021 "parser.yy"
     {}
     break;
@@ -6538,5 +6539,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1019 "parser.yy"
+#line 1022 "parser.yy"
     {}
     break;
@@ -6545,5 +6546,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1048 "parser.yy"
+#line 1051 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6555,5 +6556,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1055 "parser.yy"
+#line 1058 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6565,5 +6566,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1060 "parser.yy"
+#line 1063 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (6)].tok), TypedefTable::ID );
@@ -6575,5 +6576,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1070 "parser.yy"
+#line 1073 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6585,5 +6586,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1075 "parser.yy"
+#line 1078 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(2) - (3)].tok) );
@@ -6595,5 +6596,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1080 "parser.yy"
+#line 1083 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(3) - (4)].tok) );
@@ -6605,5 +6606,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1088 "parser.yy"
+#line 1091 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6615,5 +6616,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1093 "parser.yy"
+#line 1096 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6625,5 +6626,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1098 "parser.yy"
+#line 1101 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6635,5 +6636,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1103 "parser.yy"
+#line 1106 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6645,5 +6646,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1108 "parser.yy"
+#line 1111 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -6655,5 +6656,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1116 "parser.yy"
+#line 1119 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(3) - (8)].tok), DeclarationNode::newTuple( 0 ), (yyvsp[(6) - (8)].decl), 0, true );
@@ -6664,5 +6665,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1139 "parser.yy"
+#line 1142 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6673,5 +6674,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1143 "parser.yy"
+#line 1146 "parser.yy"
     {
 			(yyval.decl) = DeclarationNode::newFunction( (yyvsp[(2) - (7)].tok), (yyvsp[(1) - (7)].decl), (yyvsp[(5) - (7)].decl), 0, true );
@@ -6682,5 +6683,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1150 "parser.yy"
+#line 1153 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
@@ -6689,5 +6690,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1154 "parser.yy"
+#line 1157 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (9)].decl)->appendList( (yyvsp[(7) - (9)].decl) ) ); }
     break;
@@ -6696,5 +6697,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1159 "parser.yy"
+#line 1162 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6706,5 +6707,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1164 "parser.yy"
+#line 1167 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6716,5 +6717,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1169 "parser.yy"
+#line 1172 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (5)].tok), TypedefTable::TD );
@@ -6726,5 +6727,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1180 "parser.yy"
+#line 1183 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6736,5 +6737,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1185 "parser.yy"
+#line 1188 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6746,5 +6747,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1190 "parser.yy"
+#line 1193 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6756,5 +6757,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1195 "parser.yy"
+#line 1198 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6766,5 +6767,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1200 "parser.yy"
+#line 1203 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::TD );
@@ -6776,5 +6777,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1209 "parser.yy"
+#line 1212 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (4)].tok), TypedefTable::TD );
@@ -6786,5 +6787,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1214 "parser.yy"
+#line 1217 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(5) - (7)].tok), TypedefTable::TD );
@@ -6796,5 +6797,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1231 "parser.yy"
+#line 1234 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6806,5 +6807,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1236 "parser.yy"
+#line 1239 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -6816,5 +6817,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1258 "parser.yy"
+#line 1261 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -6823,5 +6824,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1270 "parser.yy"
+#line 1273 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6830,5 +6831,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1281 "parser.yy"
+#line 1284 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Const ); }
     break;
@@ -6837,5 +6838,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1283 "parser.yy"
+#line 1286 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Restrict ); }
     break;
@@ -6844,5 +6845,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1285 "parser.yy"
+#line 1288 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Volatile ); }
     break;
@@ -6851,5 +6852,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1287 "parser.yy"
+#line 1290 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Lvalue ); }
     break;
@@ -6858,5 +6859,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1289 "parser.yy"
+#line 1292 "parser.yy"
     { (yyval.decl) = DeclarationNode::newQualifier( DeclarationNode::Atomic ); }
     break;
@@ -6865,5 +6866,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1291 "parser.yy"
+#line 1294 "parser.yy"
     {
 			typedefTable.enterScope();
@@ -6874,5 +6875,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1295 "parser.yy"
+#line 1298 "parser.yy"
     {
 			typedefTable.leaveScope();
@@ -6884,5 +6885,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1304 "parser.yy"
+#line 1307 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6891,5 +6892,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1306 "parser.yy"
+#line 1309 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -6898,5 +6899,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1317 "parser.yy"
+#line 1320 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -6905,5 +6906,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1326 "parser.yy"
+#line 1329 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Extern ); }
     break;
@@ -6912,5 +6913,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1328 "parser.yy"
+#line 1331 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Static ); }
     break;
@@ -6919,5 +6920,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1330 "parser.yy"
+#line 1333 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Auto ); }
     break;
@@ -6926,5 +6927,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1332 "parser.yy"
+#line 1335 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Register ); }
     break;
@@ -6933,5 +6934,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1334 "parser.yy"
+#line 1337 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Inline ); }
     break;
@@ -6940,5 +6941,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1336 "parser.yy"
+#line 1339 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Fortran ); }
     break;
@@ -6947,5 +6948,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1338 "parser.yy"
+#line 1341 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Noreturn ); }
     break;
@@ -6954,5 +6955,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1340 "parser.yy"
+#line 1343 "parser.yy"
     { (yyval.decl) = DeclarationNode::newStorageClass( DeclarationNode::Threadlocal ); }
     break;
@@ -6961,5 +6962,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1345 "parser.yy"
+#line 1348 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Char ); }
     break;
@@ -6968,5 +6969,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1347 "parser.yy"
+#line 1350 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Double ); }
     break;
@@ -6975,5 +6976,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1349 "parser.yy"
+#line 1352 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Float ); }
     break;
@@ -6982,5 +6983,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1351 "parser.yy"
+#line 1354 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Int ); }
     break;
@@ -6989,5 +6990,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1353 "parser.yy"
+#line 1356 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Long ); }
     break;
@@ -6996,5 +6997,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1355 "parser.yy"
+#line 1358 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Short ); }
     break;
@@ -7003,5 +7004,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1357 "parser.yy"
+#line 1360 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Signed ); }
     break;
@@ -7010,5 +7011,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1359 "parser.yy"
+#line 1362 "parser.yy"
     { (yyval.decl) = DeclarationNode::newModifier( DeclarationNode::Unsigned ); }
     break;
@@ -7017,5 +7018,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1361 "parser.yy"
+#line 1364 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Void ); }
     break;
@@ -7024,5 +7025,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1363 "parser.yy"
+#line 1366 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Bool ); }
     break;
@@ -7031,5 +7032,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1365 "parser.yy"
+#line 1368 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Complex ); }
     break;
@@ -7038,5 +7039,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1367 "parser.yy"
+#line 1370 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBasicType( DeclarationNode::Imaginary ); }
     break;
@@ -7045,5 +7046,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1369 "parser.yy"
+#line 1372 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBuiltinType( DeclarationNode::Valist ); }
     break;
@@ -7052,5 +7053,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1376 "parser.yy"
+#line 1379 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7059,5 +7060,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1378 "parser.yy"
+#line 1381 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7066,5 +7067,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1380 "parser.yy"
+#line 1383 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7073,5 +7074,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1382 "parser.yy"
+#line 1385 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addType( (yyvsp[(1) - (3)].decl) ); }
     break;
@@ -7080,5 +7081,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1388 "parser.yy"
+#line 1391 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7087,5 +7088,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1395 "parser.yy"
+#line 1398 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7094,5 +7095,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1397 "parser.yy"
+#line 1400 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7101,5 +7102,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1399 "parser.yy"
+#line 1402 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addType( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7108,5 +7109,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1404 "parser.yy"
+#line 1407 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (4)].decl); }
     break;
@@ -7115,5 +7116,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1406 "parser.yy"
+#line 1409 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTypeof( (yyvsp[(3) - (4)].en) ); }
     break;
@@ -7122,5 +7123,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1408 "parser.yy"
+#line 1411 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].decl) ); }
     break;
@@ -7129,5 +7130,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1410 "parser.yy"
+#line 1413 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAttr( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -7136,5 +7137,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1416 "parser.yy"
+#line 1419 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7143,5 +7144,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1418 "parser.yy"
+#line 1421 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7150,5 +7151,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1420 "parser.yy"
+#line 1423 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7157,5 +7158,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1426 "parser.yy"
+#line 1429 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7164,5 +7165,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1428 "parser.yy"
+#line 1431 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7171,5 +7172,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1434 "parser.yy"
+#line 1437 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7178,5 +7179,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1436 "parser.yy"
+#line 1439 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7185,5 +7186,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1438 "parser.yy"
+#line 1441 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7192,5 +7193,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1443 "parser.yy"
+#line 1446 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -7199,5 +7200,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1445 "parser.yy"
+#line 1448 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypedef( (yyvsp[(2) - (2)].tok) )->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7206,5 +7207,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1447 "parser.yy"
+#line 1450 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7213,5 +7214,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1457 "parser.yy"
+#line 1460 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (4)].aggKey), 0, 0, (yyvsp[(3) - (4)].decl), true ); }
     break;
@@ -7220,5 +7221,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1459 "parser.yy"
+#line 1462 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7230,5 +7231,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1464 "parser.yy"
+#line 1467 "parser.yy"
     { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
     break;
@@ -7237,5 +7238,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1466 "parser.yy"
+#line 1469 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (6)].aggKey), (yyvsp[(2) - (6)].tok), 0, (yyvsp[(5) - (6)].decl), true ); }
     break;
@@ -7244,5 +7245,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1468 "parser.yy"
+#line 1471 "parser.yy"
     { (yyval.decl) = DeclarationNode::newAggregate( (yyvsp[(1) - (7)].aggKey), 0, (yyvsp[(3) - (7)].en), (yyvsp[(6) - (7)].decl), false ); }
     break;
@@ -7251,5 +7252,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1470 "parser.yy"
+#line 1473 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
@@ -7258,5 +7259,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1475 "parser.yy"
+#line 1478 "parser.yy"
     { (yyval.aggKey) = DeclarationNode::Struct; }
     break;
@@ -7265,5 +7266,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1477 "parser.yy"
+#line 1480 "parser.yy"
     { (yyval.aggKey) = DeclarationNode::Union; }
     break;
@@ -7272,5 +7273,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1482 "parser.yy"
+#line 1485 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -7279,5 +7280,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1484 "parser.yy"
+#line 1487 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
     break;
@@ -7286,5 +7287,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1490 "parser.yy"
+#line 1493 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl)->set_extension( true ); }
     break;
@@ -7293,5 +7294,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1493 "parser.yy"
+#line 1496 "parser.yy"
     {	// mark all fields in list
 			for ( DeclarationNode *iter = (yyvsp[(2) - (3)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
@@ -7304,5 +7305,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1503 "parser.yy"
+#line 1506 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addName( (yyvsp[(2) - (2)].tok) ); }
     break;
@@ -7311,5 +7312,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1505 "parser.yy"
+#line 1508 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(1) - (3)].decl)->cloneType( (yyvsp[(3) - (3)].tok) ) ); }
     break;
@@ -7318,5 +7319,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1507 "parser.yy"
+#line 1510 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(1) - (2)].decl)->cloneType( 0 ) ); }
     break;
@@ -7325,5 +7326,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1512 "parser.yy"
+#line 1515 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7332,5 +7333,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1514 "parser.yy"
+#line 1517 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(1) - (4)].decl)->cloneBaseType( (yyvsp[(4) - (4)].decl) ) ); }
     break;
@@ -7339,5 +7340,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1519 "parser.yy"
+#line 1522 "parser.yy"
     { (yyval.decl) = DeclarationNode::newName( 0 ); /* XXX */ }
     break;
@@ -7346,16 +7347,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 1521 "parser.yy"
+#line 1524 "parser.yy"
     { (yyval.decl) = DeclarationNode::newBitfield( (yyvsp[(1) - (1)].en) ); }
     break;
 
   case 388:
-
-/* Line 1806 of yacc.c  */
-#line 1524 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
-    break;
-
-  case 389:
 
 /* Line 1806 of yacc.c  */
@@ -7364,8 +7358,15 @@
     break;
 
+  case 389:
+
+/* Line 1806 of yacc.c  */
+#line 1530 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addBitfield( (yyvsp[(2) - (2)].en) ); }
+    break;
+
   case 391:
 
 /* Line 1806 of yacc.c  */
-#line 1533 "parser.yy"
+#line 1536 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -7374,5 +7375,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1535 "parser.yy"
+#line 1538 "parser.yy"
     { (yyval.en) = (yyvsp[(1) - (1)].en); }
     break;
@@ -7381,5 +7382,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1540 "parser.yy"
+#line 1543 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -7388,5 +7389,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1549 "parser.yy"
+#line 1552 "parser.yy"
     { (yyval.decl) = DeclarationNode::newEnum( 0, (yyvsp[(3) - (5)].decl) ); }
     break;
@@ -7395,5 +7396,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1551 "parser.yy"
+#line 1554 "parser.yy"
     {
 			typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) );
@@ -7405,5 +7406,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1556 "parser.yy"
+#line 1559 "parser.yy"
     { typedefTable.makeTypedef( *(yyvsp[(2) - (2)].tok) ); }
     break;
@@ -7412,5 +7413,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1558 "parser.yy"
+#line 1561 "parser.yy"
     { (yyval.decl) = DeclarationNode::newEnum( (yyvsp[(2) - (7)].tok), (yyvsp[(5) - (7)].decl) ); }
     break;
@@ -7419,5 +7420,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1563 "parser.yy"
+#line 1566 "parser.yy"
     { (yyval.decl) = DeclarationNode::newEnumConstant( (yyvsp[(1) - (2)].tok), (yyvsp[(2) - (2)].en) ); }
     break;
@@ -7426,5 +7427,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1565 "parser.yy"
+#line 1568 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( DeclarationNode::newEnumConstant( (yyvsp[(3) - (4)].tok), (yyvsp[(4) - (4)].en) ) ); }
     break;
@@ -7433,5 +7434,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1570 "parser.yy"
+#line 1573 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -7440,5 +7441,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1572 "parser.yy"
+#line 1575 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -7447,5 +7448,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1579 "parser.yy"
+#line 1582 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -7454,5 +7455,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1587 "parser.yy"
+#line 1590 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
@@ -7461,5 +7462,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1589 "parser.yy"
+#line 1592 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
@@ -7468,5 +7469,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1591 "parser.yy"
+#line 1594 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
@@ -7475,5 +7476,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1599 "parser.yy"
+#line 1602 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
@@ -7482,5 +7483,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1601 "parser.yy"
+#line 1604 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
@@ -7489,5 +7490,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1603 "parser.yy"
+#line 1606 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (9)].decl)->appendList( (yyvsp[(5) - (9)].decl) )->appendList( (yyvsp[(9) - (9)].decl) ); }
     break;
@@ -7496,5 +7497,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1609 "parser.yy"
+#line 1612 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
@@ -7503,5 +7504,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1614 "parser.yy"
+#line 1617 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -7510,5 +7511,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1621 "parser.yy"
+#line 1624 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->addVarArgs(); }
     break;
@@ -7517,5 +7518,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1628 "parser.yy"
+#line 1631 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
@@ -7524,16 +7525,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 1630 "parser.yy"
+#line 1633 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (5)].decl)->appendList( (yyvsp[(5) - (5)].decl) ); }
     break;
 
   case 425:
-
-/* Line 1806 of yacc.c  */
-#line 1639 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
-    break;
-
-  case 426:
 
 /* Line 1806 of yacc.c  */
@@ -7542,8 +7536,15 @@
     break;
 
+  case 426:
+
+/* Line 1806 of yacc.c  */
+#line 1645 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addName( (yyvsp[(2) - (3)].tok) ); }
+    break;
+
   case 427:
 
 /* Line 1806 of yacc.c  */
-#line 1644 "parser.yy"
+#line 1647 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addName( (yyvsp[(3) - (4)].tok) )->addQualifiers( (yyvsp[(1) - (4)].decl) ); }
     break;
@@ -7552,5 +7553,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1654 "parser.yy"
+#line 1657 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7559,5 +7560,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1660 "parser.yy"
+#line 1663 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7569,5 +7570,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1665 "parser.yy"
+#line 1668 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -7579,5 +7580,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1674 "parser.yy"
+#line 1677 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7586,5 +7587,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1683 "parser.yy"
+#line 1686 "parser.yy"
     { (yyval.decl) = DeclarationNode::newName( (yyvsp[(1) - (1)].tok) ); }
     break;
@@ -7593,5 +7594,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1685 "parser.yy"
+#line 1688 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( DeclarationNode::newName( (yyvsp[(3) - (3)].tok) ) ); }
     break;
@@ -7600,5 +7601,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1710 "parser.yy"
+#line 1713 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7607,5 +7608,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1718 "parser.yy"
+#line 1721 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addType( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7614,5 +7615,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1723 "parser.yy"
+#line 1726 "parser.yy"
     { (yyval.in) = 0; }
     break;
@@ -7621,5 +7622,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1725 "parser.yy"
+#line 1728 "parser.yy"
     { (yyval.in) = (yyvsp[(2) - (2)].in); }
     break;
@@ -7628,5 +7629,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1727 "parser.yy"
+#line 1730 "parser.yy"
     { (yyval.in) = (yyvsp[(2) - (2)].in)->set_maybeConstructed( false ); }
     break;
@@ -7635,5 +7636,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1731 "parser.yy"
+#line 1734 "parser.yy"
     { (yyval.in) = new InitializerNode( (yyvsp[(1) - (1)].en) ); }
     break;
@@ -7642,5 +7643,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1732 "parser.yy"
+#line 1735 "parser.yy"
     { (yyval.in) = new InitializerNode( (yyvsp[(2) - (4)].in), true ); }
     break;
@@ -7649,5 +7650,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1737 "parser.yy"
+#line 1740 "parser.yy"
     { (yyval.in) = 0; }
     break;
@@ -7656,5 +7657,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1739 "parser.yy"
+#line 1742 "parser.yy"
     { (yyval.in) = (yyvsp[(2) - (2)].in)->set_designators( (yyvsp[(1) - (2)].en) ); }
     break;
@@ -7663,5 +7664,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1740 "parser.yy"
+#line 1743 "parser.yy"
     { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (3)].in)->set_link( (yyvsp[(3) - (3)].in) ) ); }
     break;
@@ -7670,5 +7671,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1742 "parser.yy"
+#line 1745 "parser.yy"
     { (yyval.in) = (InitializerNode *)( (yyvsp[(1) - (4)].in)->set_link( (yyvsp[(4) - (4)].in)->set_designators( (yyvsp[(3) - (4)].en) ) ) ); }
     break;
@@ -7677,5 +7678,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1758 "parser.yy"
+#line 1761 "parser.yy"
     { (yyval.en) = new VarRefNode( (yyvsp[(1) - (2)].tok) ); }
     break;
@@ -7684,5 +7685,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1764 "parser.yy"
+#line 1767 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (2)].en)->set_link( (yyvsp[(2) - (2)].en) )); }
     break;
@@ -7691,5 +7692,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1772 "parser.yy"
+#line 1775 "parser.yy"
     { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(1) - (1)].tok) ) ); }
     break;
@@ -7698,5 +7699,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1774 "parser.yy"
+#line 1777 "parser.yy"
     { (yyval.en) = new DesignatorNode( new VarRefNode( (yyvsp[(2) - (2)].tok) ) ); }
     break;
@@ -7705,5 +7706,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1777 "parser.yy"
+#line 1780 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
     break;
@@ -7712,5 +7713,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1779 "parser.yy"
+#line 1782 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(3) - (5)].en), true ); }
     break;
@@ -7719,6 +7720,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 1781 "parser.yy"
-    { (yyval.en) = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ), true ); }
+#line 1784 "parser.yy"
+    { (yyval.en) = new DesignatorNode( new CompositeExprNode2( build_opr2( OperatorNode::Range, (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].en) ) ), true ); }
     break;
 
@@ -7726,5 +7727,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1783 "parser.yy"
+#line 1786 "parser.yy"
     { (yyval.en) = new DesignatorNode( (yyvsp[(4) - (6)].en) ); }
     break;
@@ -7733,5 +7734,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1807 "parser.yy"
+#line 1810 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7740,5 +7741,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1809 "parser.yy"
+#line 1812 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7747,5 +7748,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1811 "parser.yy"
+#line 1814 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->addQualifiers( (yyvsp[(2) - (3)].decl) )->addQualifiers( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7754,5 +7755,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1817 "parser.yy"
+#line 1820 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -7761,5 +7762,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1819 "parser.yy"
+#line 1822 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7768,5 +7769,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1824 "parser.yy"
+#line 1827 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFromTypeGen( (yyvsp[(1) - (4)].tok), (yyvsp[(3) - (4)].en) ); }
     break;
@@ -7775,5 +7776,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1830 "parser.yy"
+#line 1833 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->appendList( (yyvsp[(3) - (4)].decl) ); }
     break;
@@ -7782,5 +7783,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1835 "parser.yy"
+#line 1838 "parser.yy"
     { typedefTable.addToEnclosingScope( *(yyvsp[(2) - (2)].tok), TypedefTable::TD ); }
     break;
@@ -7789,5 +7790,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1837 "parser.yy"
+#line 1840 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTypeParam( (yyvsp[(1) - (4)].tclass), (yyvsp[(2) - (4)].tok) )->addAssertions( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -7796,5 +7797,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1843 "parser.yy"
+#line 1846 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Type; }
     break;
@@ -7803,5 +7804,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1845 "parser.yy"
+#line 1848 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Ftype; }
     break;
@@ -7810,5 +7811,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1847 "parser.yy"
+#line 1850 "parser.yy"
     { (yyval.tclass) = DeclarationNode::Dtype; }
     break;
@@ -7817,5 +7818,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1852 "parser.yy"
+#line 1855 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -7824,5 +7825,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1854 "parser.yy"
+#line 1857 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl) != 0 ? (yyvsp[(1) - (2)].decl)->appendList( (yyvsp[(2) - (2)].decl) ) : (yyvsp[(2) - (2)].decl); }
     break;
@@ -7831,5 +7832,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1859 "parser.yy"
+#line 1862 "parser.yy"
     {
 			typedefTable.openTrait( *(yyvsp[(2) - (5)].tok) );
@@ -7841,5 +7842,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1864 "parser.yy"
+#line 1867 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (5)].decl); }
     break;
@@ -7848,5 +7849,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1866 "parser.yy"
+#line 1869 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -7855,5 +7856,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1871 "parser.yy"
+#line 1874 "parser.yy"
     { (yyval.en) = new TypeValueNode( (yyvsp[(1) - (1)].decl) ); }
     break;
@@ -7862,5 +7863,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1874 "parser.yy"
+#line 1877 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( new TypeValueNode( (yyvsp[(3) - (3)].decl) ))); }
     break;
@@ -7869,5 +7870,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1876 "parser.yy"
+#line 1879 "parser.yy"
     { (yyval.en) = (ExpressionNode *)( (yyvsp[(1) - (3)].en)->set_link( (yyvsp[(3) - (3)].en) )); }
     break;
@@ -7876,5 +7877,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1881 "parser.yy"
+#line 1884 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl); }
     break;
@@ -7883,5 +7884,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1883 "parser.yy"
+#line 1886 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addQualifiers( (yyvsp[(1) - (3)].decl) ); }
     break;
@@ -7890,5 +7891,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1885 "parser.yy"
+#line 1888 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl)->copyStorageClasses( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -7897,5 +7898,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1890 "parser.yy"
+#line 1893 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addAssertions( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -7904,5 +7905,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1892 "parser.yy"
+#line 1895 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addAssertions( (yyvsp[(2) - (4)].decl) )->addType( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -7911,5 +7912,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1897 "parser.yy"
+#line 1900 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (1)].tok), TypedefTable::TD );
@@ -7921,5 +7922,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1902 "parser.yy"
+#line 1905 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(1) - (6)].tok), TypedefTable::TG );
@@ -7931,5 +7932,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1910 "parser.yy"
+#line 1913 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( *(yyvsp[(2) - (9)].tok), TypedefTable::ID );
@@ -7941,5 +7942,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1915 "parser.yy"
+#line 1918 "parser.yy"
     {
 			typedefTable.enterTrait( *(yyvsp[(2) - (8)].tok) );
@@ -7951,5 +7952,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1920 "parser.yy"
+#line 1923 "parser.yy"
     {
 			typedefTable.leaveTrait();
@@ -7962,5 +7963,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1930 "parser.yy"
+#line 1933 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -7969,5 +7970,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1940 "parser.yy"
+#line 1943 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7979,5 +7980,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1945 "parser.yy"
+#line 1948 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -7989,5 +7990,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1950 "parser.yy"
+#line 1953 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( *(yyvsp[(5) - (5)].tok), TypedefTable::ID );
@@ -7999,5 +8000,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1958 "parser.yy"
+#line 1961 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -8009,5 +8010,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1963 "parser.yy"
+#line 1966 "parser.yy"
     {
 			typedefTable.addToEnclosingScope2( TypedefTable::ID );
@@ -8019,5 +8020,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1973 "parser.yy"
+#line 1976 "parser.yy"
     {}
     break;
@@ -8026,5 +8027,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1975 "parser.yy"
+#line 1978 "parser.yy"
     {
 			if ( theTree ) {
@@ -8039,5 +8040,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1987 "parser.yy"
+#line 1990 "parser.yy"
     { (yyval.decl) = ( (yyvsp[(1) - (3)].decl) != NULL ) ? (yyvsp[(1) - (3)].decl)->appendList( (yyvsp[(3) - (3)].decl) ) : (yyvsp[(3) - (3)].decl); }
     break;
@@ -8046,5 +8047,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 1992 "parser.yy"
+#line 1995 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -8053,5 +8054,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2000 "parser.yy"
+#line 2003 "parser.yy"
     {}
     break;
@@ -8060,5 +8061,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2002 "parser.yy"
+#line 2005 "parser.yy"
     {
 			linkageStack.push( linkage );
@@ -8070,5 +8071,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2007 "parser.yy"
+#line 2010 "parser.yy"
     {
 			linkage = linkageStack.top();
@@ -8081,5 +8082,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2013 "parser.yy"
+#line 2016 "parser.yy"
     {	// mark all fields in list
 			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_link() )
@@ -8092,5 +8093,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2028 "parser.yy"
+#line 2031 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8103,5 +8104,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2034 "parser.yy"
+#line 2037 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8114,5 +8115,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2043 "parser.yy"
+#line 2046 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8125,5 +8126,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2049 "parser.yy"
+#line 2052 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8136,5 +8137,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2055 "parser.yy"
+#line 2058 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8147,5 +8148,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2061 "parser.yy"
+#line 2064 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8158,5 +8159,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2067 "parser.yy"
+#line 2070 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8169,5 +8170,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2075 "parser.yy"
+#line 2078 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8180,5 +8181,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2081 "parser.yy"
+#line 2084 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8191,5 +8192,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2089 "parser.yy"
+#line 2092 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8202,5 +8203,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2095 "parser.yy"
+#line 2098 "parser.yy"
     {
 			typedefTable.addToEnclosingScope( TypedefTable::ID );
@@ -8213,6 +8214,6 @@
 
 /* Line 1806 of yacc.c  */
-#line 2110 "parser.yy"
-    { (yyval.en) = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ); }
+#line 2113 "parser.yy"
+    { (yyval.en) = new CompositeExprNode2( build_opr2( OperatorNode::Range, (yyvsp[(1) - (3)].en), (yyvsp[(3) - (3)].en) ) ); }
     break;
 
@@ -8220,5 +8221,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2120 "parser.yy"
+#line 2123 "parser.yy"
     { (yyval.decl) = 0; }
     break;
@@ -8227,5 +8228,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2127 "parser.yy"
+#line 2130 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -8234,30 +8235,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2133 "parser.yy"
+#line 2136 "parser.yy"
     { (yyval.decl) = 0; }
     break;
 
   case 560:
-
-/* Line 1806 of yacc.c  */
-#line 2148 "parser.yy"
-    {}
-    break;
-
-  case 561:
-
-/* Line 1806 of yacc.c  */
-#line 2149 "parser.yy"
-    {}
-    break;
-
-  case 562:
-
-/* Line 1806 of yacc.c  */
-#line 2150 "parser.yy"
-    {}
-    break;
-
-  case 563:
 
 /* Line 1806 of yacc.c  */
@@ -8266,12 +8246,26 @@
     break;
 
+  case 561:
+
+/* Line 1806 of yacc.c  */
+#line 2152 "parser.yy"
+    {}
+    break;
+
+  case 562:
+
+/* Line 1806 of yacc.c  */
+#line 2153 "parser.yy"
+    {}
+    break;
+
+  case 563:
+
+/* Line 1806 of yacc.c  */
+#line 2154 "parser.yy"
+    {}
+    break;
+
   case 564:
-
-/* Line 1806 of yacc.c  */
-#line 2186 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 566:
 
 /* Line 1806 of yacc.c  */
@@ -8280,8 +8274,15 @@
     break;
 
+  case 566:
+
+/* Line 1806 of yacc.c  */
+#line 2192 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 567:
 
 /* Line 1806 of yacc.c  */
-#line 2191 "parser.yy"
+#line 2194 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8290,5 +8291,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2196 "parser.yy"
+#line 2199 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8300,5 +8301,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2201 "parser.yy"
+#line 2204 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8307,5 +8308,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2206 "parser.yy"
+#line 2209 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8314,5 +8315,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2208 "parser.yy"
+#line 2211 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8321,5 +8322,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2210 "parser.yy"
+#line 2213 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8328,5 +8329,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2215 "parser.yy"
+#line 2218 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8335,5 +8336,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2217 "parser.yy"
+#line 2220 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8342,5 +8343,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2219 "parser.yy"
+#line 2222 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8349,5 +8350,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2221 "parser.yy"
+#line 2224 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8356,5 +8357,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2226 "parser.yy"
+#line 2229 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8363,16 +8364,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2228 "parser.yy"
+#line 2231 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
   case 579:
-
-/* Line 1806 of yacc.c  */
-#line 2237 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 581:
 
 /* Line 1806 of yacc.c  */
@@ -8381,8 +8375,15 @@
     break;
 
+  case 581:
+
+/* Line 1806 of yacc.c  */
+#line 2243 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 582:
 
 /* Line 1806 of yacc.c  */
-#line 2245 "parser.yy"
+#line 2248 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
@@ -8391,5 +8392,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2247 "parser.yy"
+#line 2250 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8398,5 +8399,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2249 "parser.yy"
+#line 2252 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8405,5 +8406,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2254 "parser.yy"
+#line 2257 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8412,5 +8413,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2256 "parser.yy"
+#line 2259 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8419,5 +8420,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2258 "parser.yy"
+#line 2261 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8426,5 +8427,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2263 "parser.yy"
+#line 2266 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8433,5 +8434,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2265 "parser.yy"
+#line 2268 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8440,5 +8441,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2267 "parser.yy"
+#line 2270 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8447,5 +8448,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2282 "parser.yy"
+#line 2285 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (4)].decl)->addIdList( (yyvsp[(3) - (4)].decl) ); }
     break;
@@ -8454,5 +8455,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2284 "parser.yy"
+#line 2287 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (6)].decl)->addIdList( (yyvsp[(5) - (6)].decl) ); }
     break;
@@ -8461,5 +8462,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2286 "parser.yy"
+#line 2289 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8468,5 +8469,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2291 "parser.yy"
+#line 2294 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8475,5 +8476,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2293 "parser.yy"
+#line 2296 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8482,5 +8483,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2295 "parser.yy"
+#line 2298 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8489,5 +8490,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2300 "parser.yy"
+#line 2303 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8496,5 +8497,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2302 "parser.yy"
+#line 2305 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8503,16 +8504,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2304 "parser.yy"
+#line 2307 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
   case 603:
-
-/* Line 1806 of yacc.c  */
-#line 2319 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 605:
 
 /* Line 1806 of yacc.c  */
@@ -8521,8 +8515,15 @@
     break;
 
+  case 605:
+
+/* Line 1806 of yacc.c  */
+#line 2325 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 606:
 
 /* Line 1806 of yacc.c  */
-#line 2324 "parser.yy"
+#line 2327 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8531,5 +8532,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2330 "parser.yy"
+#line 2333 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8538,5 +8539,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2335 "parser.yy"
+#line 2338 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8545,5 +8546,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2337 "parser.yy"
+#line 2340 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8552,5 +8553,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2339 "parser.yy"
+#line 2342 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8559,5 +8560,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2344 "parser.yy"
+#line 2347 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8566,5 +8567,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2346 "parser.yy"
+#line 2349 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8573,5 +8574,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2348 "parser.yy"
+#line 2351 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8580,5 +8581,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2350 "parser.yy"
+#line 2353 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8587,5 +8588,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2355 "parser.yy"
+#line 2358 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
@@ -8594,5 +8595,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2357 "parser.yy"
+#line 2360 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8601,16 +8602,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2359 "parser.yy"
+#line 2362 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
   case 619:
-
-/* Line 1806 of yacc.c  */
-#line 2369 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 621:
 
 /* Line 1806 of yacc.c  */
@@ -8619,8 +8613,15 @@
     break;
 
+  case 621:
+
+/* Line 1806 of yacc.c  */
+#line 2375 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 622:
 
 /* Line 1806 of yacc.c  */
-#line 2374 "parser.yy"
+#line 2377 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8629,5 +8630,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2379 "parser.yy"
+#line 2382 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8636,5 +8637,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2381 "parser.yy"
+#line 2384 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8643,5 +8644,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2383 "parser.yy"
+#line 2386 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8650,5 +8651,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2388 "parser.yy"
+#line 2391 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8657,5 +8658,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2390 "parser.yy"
+#line 2393 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8664,5 +8665,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2392 "parser.yy"
+#line 2395 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8671,5 +8672,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2394 "parser.yy"
+#line 2397 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8678,5 +8679,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2399 "parser.yy"
+#line 2402 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
@@ -8685,5 +8686,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2401 "parser.yy"
+#line 2404 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8692,16 +8693,9 @@
 
 /* Line 1806 of yacc.c  */
-#line 2403 "parser.yy"
+#line 2406 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
 
   case 633:
-
-/* Line 1806 of yacc.c  */
-#line 2434 "parser.yy"
-    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
-    break;
-
-  case 635:
 
 /* Line 1806 of yacc.c  */
@@ -8710,8 +8704,15 @@
     break;
 
+  case 635:
+
+/* Line 1806 of yacc.c  */
+#line 2440 "parser.yy"
+    { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
+    break;
+
   case 636:
 
 /* Line 1806 of yacc.c  */
-#line 2439 "parser.yy"
+#line 2442 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8720,5 +8721,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2444 "parser.yy"
+#line 2447 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8730,5 +8731,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2449 "parser.yy"
+#line 2452 "parser.yy"
     {
 			typedefTable.setNextIdentifier( *(yyvsp[(1) - (1)].tok) );
@@ -8740,5 +8741,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2457 "parser.yy"
+#line 2460 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8747,5 +8748,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2459 "parser.yy"
+#line 2462 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8754,5 +8755,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2461 "parser.yy"
+#line 2464 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8761,5 +8762,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2466 "parser.yy"
+#line 2469 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8768,5 +8769,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2468 "parser.yy"
+#line 2471 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8775,5 +8776,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2473 "parser.yy"
+#line 2476 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addParamList( (yyvsp[(4) - (6)].decl) ); }
     break;
@@ -8782,5 +8783,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2475 "parser.yy"
+#line 2478 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8789,5 +8790,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2490 "parser.yy"
+#line 2493 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8796,5 +8797,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2492 "parser.yy"
+#line 2495 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8803,5 +8804,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2497 "parser.yy"
+#line 2500 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
@@ -8810,5 +8811,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2499 "parser.yy"
+#line 2502 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8817,5 +8818,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2501 "parser.yy"
+#line 2504 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8824,5 +8825,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2503 "parser.yy"
+#line 2506 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8831,5 +8832,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2505 "parser.yy"
+#line 2508 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8838,5 +8839,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2511 "parser.yy"
+#line 2514 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8845,5 +8846,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2513 "parser.yy"
+#line 2516 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8852,5 +8853,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2515 "parser.yy"
+#line 2518 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8859,5 +8860,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2520 "parser.yy"
+#line 2523 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
     break;
@@ -8866,5 +8867,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2522 "parser.yy"
+#line 2525 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -8873,5 +8874,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2524 "parser.yy"
+#line 2527 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8880,5 +8881,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2530 "parser.yy"
+#line 2533 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
     break;
@@ -8887,5 +8888,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2532 "parser.yy"
+#line 2535 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false )->addArray( (yyvsp[(3) - (3)].decl) ); }
     break;
@@ -8894,5 +8895,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2538 "parser.yy"
+#line 2541 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(3) - (5)].en), 0, false ); }
     break;
@@ -8901,5 +8902,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2540 "parser.yy"
+#line 2543 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( 0 ); }
     break;
@@ -8908,5 +8909,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2542 "parser.yy"
+#line 2545 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newArray( (yyvsp[(4) - (6)].en), 0, false ) ); }
     break;
@@ -8915,5 +8916,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2544 "parser.yy"
+#line 2547 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (6)].decl)->addArray( DeclarationNode::newVarArray( 0 ) ); }
     break;
@@ -8922,5 +8923,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2559 "parser.yy"
+#line 2562 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8929,5 +8930,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2561 "parser.yy"
+#line 2564 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8936,5 +8937,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2566 "parser.yy"
+#line 2569 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
@@ -8943,5 +8944,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2568 "parser.yy"
+#line 2571 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -8950,5 +8951,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2570 "parser.yy"
+#line 2573 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -8957,5 +8958,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2572 "parser.yy"
+#line 2575 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -8964,5 +8965,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2574 "parser.yy"
+#line 2577 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8971,5 +8972,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2580 "parser.yy"
+#line 2583 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8978,5 +8979,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2582 "parser.yy"
+#line 2585 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -8985,5 +8986,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2584 "parser.yy"
+#line 2587 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -8992,5 +8993,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2589 "parser.yy"
+#line 2592 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, 0, (yyvsp[(3) - (5)].decl), 0 ); }
     break;
@@ -8999,5 +9000,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2591 "parser.yy"
+#line 2594 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -9006,5 +9007,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2593 "parser.yy"
+#line 2596 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -9013,5 +9014,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2600 "parser.yy"
+#line 2603 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addArray( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -9020,5 +9021,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2611 "parser.yy"
+#line 2614 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, 0, false ); }
     break;
@@ -9027,5 +9028,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2614 "parser.yy"
+#line 2617 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
     break;
@@ -9034,5 +9035,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2616 "parser.yy"
+#line 2619 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( 0, (yyvsp[(3) - (5)].decl), false ); }
     break;
@@ -9041,5 +9042,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2619 "parser.yy"
+#line 2622 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
     break;
@@ -9048,5 +9049,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2621 "parser.yy"
+#line 2624 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl), true ); }
     break;
@@ -9055,5 +9056,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2623 "parser.yy"
+#line 2626 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(3) - (7)].decl), true ); }
     break;
@@ -9062,5 +9063,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2637 "parser.yy"
+#line 2640 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -9069,5 +9070,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2639 "parser.yy"
+#line 2642 "parser.yy"
     { (yyval.decl) = (yyvsp[(1) - (2)].decl)->addQualifiers( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -9076,5 +9077,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2644 "parser.yy"
+#line 2647 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( 0 ); }
     break;
@@ -9083,5 +9084,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2646 "parser.yy"
+#line 2649 "parser.yy"
     { (yyval.decl) = DeclarationNode::newPointer( (yyvsp[(2) - (2)].decl) ); }
     break;
@@ -9090,5 +9091,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2648 "parser.yy"
+#line 2651 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9097,5 +9098,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2650 "parser.yy"
+#line 2653 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addPointer( DeclarationNode::newPointer( (yyvsp[(2) - (3)].decl) ) ); }
     break;
@@ -9104,5 +9105,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2652 "parser.yy"
+#line 2655 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -9111,5 +9112,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2658 "parser.yy"
+#line 2661 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -9118,5 +9119,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2660 "parser.yy"
+#line 2663 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (4)].decl)->addArray( (yyvsp[(4) - (4)].decl) ); }
     break;
@@ -9125,5 +9126,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2662 "parser.yy"
+#line 2665 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -9132,5 +9133,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2667 "parser.yy"
+#line 2670 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (8)].decl)->addParamList( (yyvsp[(6) - (8)].decl) ); }
     break;
@@ -9139,5 +9140,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2669 "parser.yy"
+#line 2672 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (3)].decl); }
     break;
@@ -9146,5 +9147,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2679 "parser.yy"
+#line 2682 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9153,5 +9154,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2689 "parser.yy"
+#line 2692 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9160,5 +9161,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2691 "parser.yy"
+#line 2694 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9167,5 +9168,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2693 "parser.yy"
+#line 2696 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9174,5 +9175,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2695 "parser.yy"
+#line 2698 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9181,5 +9182,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2697 "parser.yy"
+#line 2700 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9188,5 +9189,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2699 "parser.yy"
+#line 2702 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9195,5 +9196,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2706 "parser.yy"
+#line 2709 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9202,5 +9203,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2708 "parser.yy"
+#line 2711 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9209,5 +9210,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2710 "parser.yy"
+#line 2713 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9216,5 +9217,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2712 "parser.yy"
+#line 2715 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
     break;
@@ -9223,5 +9224,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2714 "parser.yy"
+#line 2717 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9230,5 +9231,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2716 "parser.yy"
+#line 2719 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9237,5 +9238,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2718 "parser.yy"
+#line 2721 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9244,5 +9245,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2720 "parser.yy"
+#line 2723 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9251,5 +9252,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2722 "parser.yy"
+#line 2725 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( (yyvsp[(2) - (3)].decl) )->addNewArray( (yyvsp[(1) - (3)].decl) ); }
     break;
@@ -9258,5 +9259,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2724 "parser.yy"
+#line 2727 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9265,5 +9266,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2729 "parser.yy"
+#line 2732 "parser.yy"
     { (yyval.decl) = DeclarationNode::newVarArray( (yyvsp[(3) - (6)].decl) ); }
     break;
@@ -9272,5 +9273,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2731 "parser.yy"
+#line 2734 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), false ); }
     break;
@@ -9279,5 +9280,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2736 "parser.yy"
+#line 2739 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(4) - (6)].en), (yyvsp[(3) - (6)].decl), true ); }
     break;
@@ -9286,5 +9287,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2738 "parser.yy"
+#line 2741 "parser.yy"
     { (yyval.decl) = DeclarationNode::newArray( (yyvsp[(5) - (7)].en), (yyvsp[(4) - (7)].decl)->addQualifiers( (yyvsp[(3) - (7)].decl) ), true ); }
     break;
@@ -9293,5 +9294,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2765 "parser.yy"
+#line 2768 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addQualifiers( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9300,5 +9301,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2776 "parser.yy"
+#line 2779 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9307,5 +9308,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2778 "parser.yy"
+#line 2781 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9314,5 +9315,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2780 "parser.yy"
+#line 2783 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9321,5 +9322,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2782 "parser.yy"
+#line 2785 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9328,5 +9329,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2784 "parser.yy"
+#line 2787 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewPointer( DeclarationNode::newPointer( 0 ) ); }
     break;
@@ -9335,5 +9336,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2786 "parser.yy"
+#line 2789 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewPointer( DeclarationNode::newPointer( (yyvsp[(1) - (3)].decl) ) ); }
     break;
@@ -9342,5 +9343,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2793 "parser.yy"
+#line 2796 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9349,5 +9350,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2795 "parser.yy"
+#line 2798 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9356,5 +9357,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2797 "parser.yy"
+#line 2800 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9363,5 +9364,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2799 "parser.yy"
+#line 2802 "parser.yy"
     { (yyval.decl) = (yyvsp[(3) - (3)].decl)->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9370,5 +9371,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2801 "parser.yy"
+#line 2804 "parser.yy"
     { (yyval.decl) = (yyvsp[(4) - (4)].decl)->addNewArray( (yyvsp[(3) - (4)].decl) )->addNewArray( DeclarationNode::newArray( 0, 0, false ) ); }
     break;
@@ -9377,5 +9378,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2803 "parser.yy"
+#line 2806 "parser.yy"
     { (yyval.decl) = (yyvsp[(2) - (2)].decl)->addNewArray( (yyvsp[(1) - (2)].decl) ); }
     break;
@@ -9384,5 +9385,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2808 "parser.yy"
+#line 2811 "parser.yy"
     { (yyval.decl) = DeclarationNode::newTuple( (yyvsp[(3) - (5)].decl) ); }
     break;
@@ -9391,5 +9392,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2813 "parser.yy"
+#line 2816 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, DeclarationNode::newTuple( 0 ), (yyvsp[(4) - (5)].decl), 0 ); }
     break;
@@ -9398,5 +9399,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2815 "parser.yy"
+#line 2818 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
@@ -9405,5 +9406,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2817 "parser.yy"
+#line 2820 "parser.yy"
     { (yyval.decl) = DeclarationNode::newFunction( 0, (yyvsp[(1) - (6)].decl), (yyvsp[(4) - (6)].decl), 0 ); }
     break;
@@ -9412,5 +9413,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2841 "parser.yy"
+#line 2844 "parser.yy"
     { (yyval.en) = 0; }
     break;
@@ -9419,5 +9420,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 2843 "parser.yy"
+#line 2846 "parser.yy"
     { (yyval.en) = (yyvsp[(2) - (2)].en); }
     break;
@@ -9426,5 +9427,5 @@
 
 /* Line 1806 of yacc.c  */
-#line 9429 "Parser/parser.cc"
+#line 9430 "Parser/parser.cc"
       default: break;
     }
@@ -9657,5 +9658,5 @@
 
 /* Line 2067 of yacc.c  */
-#line 2846 "parser.yy"
+#line 2849 "parser.yy"
 
 // ----end of grammar----
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision b87e2b60f7d370125cd6b8c9e2d2eb9bb8445891)
+++ src/Parser/parser.yy	(revision 51e076eafc08b318b66f0daf4086126420c95efe)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug  4 16:56:28 2016
-// Update Count     : 1694
+// Last Modified On : Fri Aug  5 08:15:57 2016
+// Update Count     : 1721
 //
 
@@ -356,5 +356,5 @@
 		// little advantage to this feature and many disadvantages. It is possible to write x[(i,j)] in CFA, which is
 		// equivalent to the old x[i,j].
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Index ), $1, $4 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Index, $1, $4 ) ); }
 	| postfix_expression '(' argument_expression_list ')'
 		{ $$ = new CompositeExprNode( $1, $3 ); }
@@ -368,7 +368,7 @@
 	| postfix_expression ARROW '[' push field_list pop ']' // CFA, tuple field selector
 	| postfix_expression ICR
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::IncrPost ), $1 ); }
+	  	{ $$ = new CompositeExprNode2( build_opr1( OperatorNode::IncrPost, $1 ) ); }
 	| postfix_expression DECR
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::DecrPost ), $1 ); }
+	  	{ $$ = new CompositeExprNode2( build_opr1( OperatorNode::DecrPost, $1 ) ); }
 	| '(' type_name_no_function ')' '{' initializer_list comma_opt '}' // C99
 		{ $$ = new CompoundLiteralNode( $2, new InitializerNode( $5, true ) ); }
@@ -431,15 +431,16 @@
 	| EXTENSION cast_expression							// GCC
 		{ $$ = $2->set_extension( true ); }
-	| ptrref_operator cast_expression					// CFA
-	{ $$ = $1 == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( $2 ) ) : (ExpressionNode*)new CompositeExprNode( new OperatorNode ( $1 ), $2 ); }
 		// '*' ('&') is separated from unary_operator because of shift/reduce conflict in:
 		//		{ * X; }	 // dereference X
 		//		{ * int X; } // CFA declaration of pointer to int
+	| ptrref_operator cast_expression					// CFA
+		{ $$ = $1 == OperatorNode::AddressOf ? (ExpressionNode*) new CompositeExprNode2( build_addressOf( $2 ) )
+											: (ExpressionNode*)new CompositeExprNode( new OperatorNode ( $1 ), $2 ); }
 	| unary_operator cast_expression
 		{ $$ = new CompositeExprNode( $1, $2 ); }
 	| ICR unary_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Incr ), $2 ); }
+	  	{ $$ = new CompositeExprNode2( build_opr1( OperatorNode::Incr, $2 ) ); }
 	| DECR unary_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Decr ), $2 ); }
+	  	{ $$ = new CompositeExprNode2( build_opr1( OperatorNode::Decr, $2 ) ); }
 	| SIZEOF unary_expression
 		{ $$ = new CompositeExprNode2( build_sizeOf( $2 ) ); }
@@ -449,7 +450,7 @@
 		{ $$ = new CompositeExprNode2( build_offsetOf( new TypeValueNode( $3 ), new VarRefNode( $5 ) ) ); }
 	| ATTR_IDENTIFIER
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 )); }
+		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ) ); }
 	| ATTR_IDENTIFIER '(' type_name ')'
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), new TypeValueNode( $3 )); }
+		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), new TypeValueNode( $3 ) ); }
 	| ATTR_IDENTIFIER '(' argument_expression ')'
 		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Attr ), new VarRefNode( $1 ), $3 ); }
@@ -487,9 +488,9 @@
 	cast_expression
 	| multiplicative_expression '*' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Mul ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mul, $1, $3 ) ); }
 	| multiplicative_expression '/' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Div ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Div, $1, $3 ) ); }
 	| multiplicative_expression '%' cast_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Mod ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Mod, $1, $3 ) ); }
 	;
 
@@ -497,7 +498,7 @@
 	multiplicative_expression
 	| additive_expression '+' multiplicative_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Plus ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Plus, $1, $3 ) ); }
 	| additive_expression '-' multiplicative_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Minus ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Minus, $1, $3 ) ); }
 	;
 
@@ -505,7 +506,7 @@
 	additive_expression
 	| shift_expression LS additive_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LShift ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::LShift, $1, $3 ) ); }
 	| shift_expression RS additive_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::RShift ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::RShift, $1, $3 ) ); }
 	;
 
@@ -513,11 +514,11 @@
 	shift_expression
 	| relational_expression '<' shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LThan ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::LThan, $1, $3 ) ); }
 	| relational_expression '>' shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::GThan ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::GThan, $1, $3 ) ); }
 	| relational_expression LE shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::LEThan ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::LEThan, $1, $3 ) ); }
 	| relational_expression GE shift_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::GEThan ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::GEThan, $1, $3 ) ); }
 	;
 
@@ -525,7 +526,7 @@
 	relational_expression
 	| equality_expression EQ relational_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Eq ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Eq, $1, $3 ) ); }
 	| equality_expression NE relational_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Neq ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Neq, $1, $3 ) ); }
 	;
 
@@ -533,5 +534,5 @@
 	equality_expression
 	| AND_expression '&' equality_expression
-		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::BitAnd ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitAnd, $1, $3 ) ); }
 	;
 
@@ -539,5 +540,5 @@
 	AND_expression
 	| exclusive_OR_expression '^' AND_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Xor ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Xor, $1, $3 ) ); }
 	;
 
@@ -545,5 +546,5 @@
 	exclusive_OR_expression
 	| inclusive_OR_expression '|' exclusive_OR_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::BitOr ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::BitOr, $1, $3 ) ); }
 	;
 
@@ -551,5 +552,5 @@
 	inclusive_OR_expression
 	| logical_AND_expression ANDAND inclusive_OR_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::And ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_and_or( $1, $3, true ) ); }
 	;
 
@@ -557,5 +558,5 @@
 	logical_AND_expression
 	| logical_OR_expression OROR logical_AND_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Or ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_and_or( $1, $3, false ) ); }
 	;
 
@@ -563,9 +564,9 @@
 	logical_OR_expression
 	| logical_OR_expression '?' comma_expression ':' conditional_expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*$1, *$3, *$5 ) ) ); }
+		{ $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); }
 	| logical_OR_expression '?' /* empty */ ':' conditional_expression // GCC, omitted first operand
-		{ $$=new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), $1, $4 ); }
+		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::NCond ), $1, $4 ); }
 	| logical_OR_expression '?' comma_expression ':' tuple // CFA, tuple expression
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Cond ), (ExpressionNode *)mkList( (*$1, *$3, *$5 ) ) ); }
+		{ $$ = new CompositeExprNode2( build_cond( $1, $3, $5 ) ); }
 	;
 
@@ -578,7 +579,7 @@
 	conditional_expression
 	| unary_expression '=' assignment_expression
-		{ $$ =new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }
+		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $3 ); }
 	| unary_expression assignment_operator assignment_expression
-		{ $$ =new CompositeExprNode( $2, $1, $3 ); }
+		{ $$ = new CompositeExprNode( $2, $1, $3 ); }
 	| tuple assignment_opt								// CFA, tuple expression
 		{ $$ = ( $2 == 0 ) ? $1 : new CompositeExprNode( new OperatorNode( OperatorNode::Assign ), $1, $2 ); }
@@ -626,5 +627,6 @@
 	assignment_expression
 	| comma_expression ',' assignment_expression	// { $$ = (ExpressionNode *)$1->add_to_list( $3 ); }
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), $1, $3 ); }
+	//{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Comma ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_comma( $1, $3 ) ); }
 	;
 
@@ -738,5 +740,5 @@
 	constant_expression							{ $$ = $1; }
 	| constant_expression ELLIPSIS constant_expression	// GCC, subrange
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range, $1, $3 ) ); }
 	| subrange											// CFA, subrange
 	;
@@ -1779,5 +1781,5 @@
 		{ $$ = new DesignatorNode( $3, true ); }
 	| '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements
-		{ $$ = new DesignatorNode( new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $3, $5 ), true ); }
+		{ $$ = new DesignatorNode( new CompositeExprNode2( build_opr2( OperatorNode::Range, $3, $5 ) ), true ); }
 	| '.' '[' push field_list pop ']'					// CFA, tuple field selector
 		{ $$ = new DesignatorNode( $4 ); }
@@ -2108,5 +2110,5 @@
 subrange:
 	constant_expression '~' constant_expression			// CFA, integer subrange
-		{ $$ = new CompositeExprNode( new OperatorNode( OperatorNode::Range ), $1, $3 ); }
+		{ $$ = new CompositeExprNode2( build_opr2( OperatorNode::Range, $1, $3 ) ); }
 	;
 
