Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 064e3ff2b3dfcd555b84c4fe38cfd9dc42a8728a)
+++ src/Parser/parser.yy	(revision dae881f61dcc6f8cfd54c3e290f737e7bbd9212f)
@@ -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 ) ); }
 	;
 
