Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 777bfcf2024415a11a10ed22ce6eebd012ce80ca)
+++ src/Parser/parser.yy	(revision 7527e6365628dd566e55f6dbeaca1521c6718837)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 14 11:03:22 2016
-// Update Count     : 1879
+// Last Modified On : Mon Aug 15 15:18:19 2016
+// Update Count     : 1891
 //
 
@@ -664,5 +664,5 @@
 			Token fn;
 			fn.str = new std::string( "^?{}" ); // location undefined
-			$$ = new StatementNode2( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) ) ) );
+			$$ = new StatementNode( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( $2 )->set_last( $4 ) ) ) ) );
 		}
 	;
@@ -678,5 +678,5 @@
 compound_statement:
 	'{' '}'
-		{ $$ = new CompoundStmtNode( (StatementNode *)0 ); }
+		{ $$ = new StatementNode( build_compound( (StatementNode *)0 ) ); }
 	| '{'
 		// Two scopes are necessary because the block itself has a scope, but every declaration within the block also
@@ -685,5 +685,5 @@
 	  local_label_declaration_opt						// GCC, local labels
 	  block_item_list pop '}'							// C99, intermix declarations and statements
-		{ $$ = new CompoundStmtNode( $5 ); }
+		{ $$ = new StatementNode( build_compound( $5 ) ); }
 	;
 
@@ -696,13 +696,13 @@
 block_item:
 	declaration											// CFA, new & old style declarations
-		{ $$ = new StatementNode2( $1 ); }
+		{ $$ = new StatementNode( $1 ); }
 	| EXTENSION declaration								// GCC
 		{	// mark all fields in list
 			for ( DeclarationNode *iter = $2; iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
-			$$ = new StatementNode2( $2 );
+			$$ = new StatementNode( $2 );
 		}
 	| function_definition
-		{ $$ = new StatementNode2( $1 ); }
+		{ $$ = new StatementNode( $1 ); }
 	| statement pop
 	;
@@ -716,5 +716,5 @@
 expression_statement:
 	comma_expression_opt ';'
-		{ $$ = new StatementNode2( build_expr( $1 ) ); }
+		{ $$ = new StatementNode( build_expr( $1 ) ); }
 	;
 
@@ -722,12 +722,12 @@
 	IF '(' comma_expression ')' statement				%prec THEN
 		// explicitly deal with the shift/reduce conflict on if/else
-		{ $$ = new StatementNode2( build_if( $3, $5, nullptr ) ); }
+		{ $$ = new StatementNode( build_if( $3, $5, nullptr ) ); }
 	| IF '(' comma_expression ')' statement ELSE statement
-		{ $$ = new StatementNode2( build_if( $3, $5, $7 ) ); }
+		{ $$ = new StatementNode( build_if( $3, $5, $7 ) ); }
 	| SWITCH '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode2( build_switch( $3, $5 ) ); }
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
 	| SWITCH '(' comma_expression ')' '{' push declaration_list_opt switch_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode2( build_switch( $3, $8 ) );
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
 			// The semantics of the declaration list is changed to include associated initialization, which is performed
 			// *before* the transfer to the appropriate case clause by hoisting the declarations into a compound
@@ -735,12 +735,12 @@
 			// therefore, are removed from the grammar even though C allows it. The change also applies to choose
 			// statement.
-			$$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( $7 ))->set_last( sw )) ) : sw;
+			$$ = $7 != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
 	| CHOOSE '(' comma_expression ')' case_clause		// CFA
-		{ $$ = new StatementNode2( build_switch( $3, $5 ) ); }
+		{ $$ = new StatementNode( build_switch( $3, $5 ) ); }
 	| CHOOSE '(' comma_expression ')' '{' push declaration_list_opt choose_clause_list_opt '}' // CFA
 		{
-			StatementNode *sw = new StatementNode2( build_switch( $3, $8 ) );
-			$$ = $7 != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( $7 ))->set_last( sw )) ) : sw;
+			StatementNode *sw = new StatementNode( build_switch( $3, $8 ) );
+			$$ = $7 != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( $7 ))->set_last( sw )) ) ) : sw;
 		}
 	;
@@ -757,12 +757,12 @@
 
 case_value_list:										// CFA
-	case_value									{ $$ = new StatementNode2( build_case( $1 ) ); }
+	case_value									{ $$ = new StatementNode( build_case( $1 ) ); }
 		// convert case list, e.g., "case 1, 3, 5:" into "case 1: case 3: case 5"
-	| case_value_list ',' case_value			{ $$ = (StatementNode *)($1->set_last( new StatementNode2( build_case( $3 ) ) ) ); }
+	| case_value_list ',' case_value			{ $$ = (StatementNode *)($1->set_last( new StatementNode( build_case( $3 ) ) ) ); }
 	;
 
 case_label:												// CFA
 	CASE case_value_list ':'					{ $$ = $2; }
-	| DEFAULT ':'								{ $$ = new StatementNode2( build_default() ); }
+	| DEFAULT ':'								{ $$ = new StatementNode( build_default() ); }
 		// A semantic check is required to ensure only one default clause per switch/choose statement.
 	;
@@ -774,5 +774,5 @@
 
 case_clause:											// CFA
-	case_label_list statement					{ $$ = $1->append_last_case( new CompoundStmtNode( $2 ) ); }
+	case_label_list statement					{ $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
 	;
 
@@ -785,7 +785,7 @@
 switch_clause_list:										// CFA
 	case_label_list statement_list
-		{ $$ = $1->append_last_case( new CompoundStmtNode( $2 ) ); }
+		{ $$ = $1->append_last_case( new StatementNode( build_compound( $2 ) ) ); }
 	| switch_clause_list case_label_list statement_list
-		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new CompoundStmtNode( $3 ) ) ) ); }
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( $3 ) ) ) ) ); }
 	;
 
@@ -800,14 +800,14 @@
 		{ $$ = $1->append_last_case( $2 ); }
 	| case_label_list statement_list fall_through_opt
-		{ $$ = $1->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$2, *$3 ) ) ) ); }
+		{ $$ = $1->append_last_case( new StatementNode( build_compound( (StatementNode *)$2->set_last( $3 ) ) ) ); }
 	| choose_clause_list case_label_list fall_through
 		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( $3 ))); }
 	| choose_clause_list case_label_list statement_list fall_through_opt
-		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*$3, *$4 ) ) ) ) ) ); }
+		{ $$ = (StatementNode *)( $1->set_last( $2->append_last_case( new StatementNode( build_compound( (StatementNode *)$3->set_last( $4 ) ) ) ) ) ); }
 	;
 
 fall_through_opt:										// CFA
 	// empty
-		{ $$ = new StatementNode2( build_branch( "", BranchStmt::Break ) ); } // insert implicit break
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Break ) ); } // insert implicit break
 	| fall_through
 	;
@@ -822,9 +822,9 @@
 iteration_statement:
 	WHILE '(' comma_expression ')' statement
-		{ $$ = new StatementNode2( build_while( $3, $5 ) ); }
+		{ $$ = new StatementNode( build_while( $3, $5 ) ); }
 	| DO statement WHILE '(' comma_expression ')' ';'
-		{ $$ = new StatementNode2( build_while( $5, $2 ) ); }
+		{ $$ = new StatementNode( build_while( $5, $2 ) ); }
 	| FOR '(' push for_control_expression ')' statement
-		{ $$ = new StatementNode2( build_for( $4, $6 ) ); }
+		{ $$ = new StatementNode( build_for( $4, $6 ) ); }
 	;
 
@@ -838,40 +838,40 @@
 jump_statement:
 	GOTO IDENTIFIER ';'
-		{ $$ = new StatementNode2( build_branch( *$2, BranchStmt::Goto ) ); }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Goto ) ); }
 	| GOTO '*' comma_expression ';'						// GCC, computed goto
 		// The syntax for the GCC computed goto violates normal expression precedence, e.g., goto *i+3; => goto *(i+3);
 		// whereas normal operator precedence yields goto (*i)+3;
-		{ $$ = new StatementNode2( build_computedgoto( $3 ) ); }
+		{ $$ = new StatementNode( build_computedgoto( $3 ) ); }
 	| CONTINUE ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
-		{ $$ = new StatementNode2( build_branch( "", BranchStmt::Continue ) ); }
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Continue ) ); }
 	| CONTINUE IDENTIFIER ';'							// CFA, multi-level continue
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
 		// the target of the transfer appears only at the start of an iteration statement.
-		{ $$ = new StatementNode2( build_branch( *$2, BranchStmt::Continue ) ); delete $2; }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Continue ) ); delete $2; }
 	| BREAK ';'
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement.
-		{ $$ = new StatementNode2( build_branch( "", BranchStmt::Break ) ); }
+		{ $$ = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
 	| BREAK IDENTIFIER ';'								// CFA, multi-level exit
 		// A semantic check is required to ensure this statement appears only in the body of an iteration statement, and
 		// the target of the transfer appears only at the start of an iteration statement.
-		{ $$ = new StatementNode2( build_branch( *$2, BranchStmt::Break ) ); delete $2; }
+		{ $$ = new StatementNode( build_branch( *$2, BranchStmt::Break ) ); delete $2; }
 	| RETURN comma_expression_opt ';'
-		{ $$ = new StatementNode2( build_return( $2 ) ); }
+		{ $$ = new StatementNode( build_return( $2 ) ); }
 	| THROW assignment_expression_opt ';'				// handles rethrow
-		{ $$ = new StatementNode2( build_throw( $2 ) ); }
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
 	| THROWRESUME assignment_expression_opt ';'			// handles reresume
-		{ $$ = new StatementNode2( build_throw( $2 ) ); }
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
 	| THROWRESUME assignment_expression_opt AT assignment_expression ';' // handles reresume
-		{ $$ = new StatementNode2( build_throw( $2 ) ); }
+		{ $$ = new StatementNode( build_throw( $2 ) ); }
 	;
 
 exception_statement:
 	TRY compound_statement handler_list
-		{ $$ = new StatementNode2( build_try( $2, $3, 0 ) ); }
+		{ $$ = new StatementNode( build_try( $2, $3, 0 ) ); }
 	| TRY compound_statement finally_clause
-		{ $$ = new StatementNode2( build_try( $2, 0, $3 ) ); }
+		{ $$ = new StatementNode( build_try( $2, 0, $3 ) ); }
 	| TRY compound_statement handler_list finally_clause
-		{ $$ = new StatementNode2( build_try( $2, $3, $4 ) ); }
+		{ $$ = new StatementNode( build_try( $2, $3, $4 ) ); }
 	;
 
@@ -880,22 +880,22 @@
 		// ISO/IEC 9899:1999 Section 15.3(6 ) If present, a "..." handler shall be the last handler for its try block.
 	| CATCH '(' ELLIPSIS ')' compound_statement
-		{ $$ = new StatementNode2( build_catch( 0, $5, true ) ); }
+		{ $$ = new StatementNode( build_catch( 0, $5, true ) ); }
 	| handler_clause CATCH '(' ELLIPSIS ')' compound_statement
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( 0, $6, true ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
 	| CATCHRESUME '(' ELLIPSIS ')' compound_statement
-		{ $$ = new StatementNode2( build_catch( 0, $5, true ) ); }
+		{ $$ = new StatementNode( build_catch( 0, $5, true ) ); }
 	| handler_clause CATCHRESUME '(' ELLIPSIS ')' compound_statement
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( 0, $6, true ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( 0, $6, true ) ) ); }
 	;
 
 handler_clause:
 	CATCH '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = new StatementNode2( build_catch( $5, $8 ) ); }
+		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
 	| handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
-	{ $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( $6, $9 ) ) ); }
+	{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
 	| CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = new StatementNode2( build_catch( $5, $8 ) ); }
+		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
 	| handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode2( build_catch( $6, $9 ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
 	;
 
@@ -903,5 +903,5 @@
 	FINALLY compound_statement
 		{
-			$$ = new StatementNode2( build_finally( $2 ) );
+			$$ = new StatementNode( build_finally( $2 ) );
 		}
 	;
@@ -931,13 +931,13 @@
 asm_statement:
 	ASM asm_volatile_opt '(' string_literal_list ')' ';'
-		{ $$ = new AsmStmtNode( $2, $4, 0 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, 0 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ')' ';' // remaining GCC
-		{ $$ = new AsmStmtNode( $2, $4, $6 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ')' ';'
-		{ $$ = new AsmStmtNode( $2, $4, $6, $8 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8 ) ); }
 	| ASM asm_volatile_opt '(' string_literal_list ':' asm_operands_opt ':' asm_operands_opt ':' asm_clobbers_list_opt ')' ';'
-		{ $$ = new AsmStmtNode( $2, $4, $6, $8, $10 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $4, $6, $8, $10 ) ); }
 	| ASM asm_volatile_opt GOTO '(' string_literal_list ':' ':' asm_operands_opt ':' asm_clobbers_list_opt ':' label_list ')' ';'
-		{ $$ = new AsmStmtNode( $2, $5, 0, $8, $10, $12 ); }
+		{ $$ = new StatementNode( build_asmstmt( $2, $5, 0, $8, $10, $12 ) ); }
 	;
 
@@ -963,7 +963,7 @@
 asm_operand:											// GCC
 	string_literal_list '(' constant_expression ')'
-		{ $$ = new ExpressionNode( build_asm( 0, $1, $3 ) ); }
+		{ $$ = new ExpressionNode( build_asmexpr( 0, $1, $3 ) ); }
 	| '[' constant_expression ']' string_literal_list '(' constant_expression ')'
-	{ $$ = new ExpressionNode( build_asm( $2, $4, $6 ) ); }
+	{ $$ = new ExpressionNode( build_asmexpr( $2, $4, $6 ) ); }
 	;
 
@@ -974,12 +974,12 @@
 		{ $$ = new ExpressionNode( $1 ); }
 	| asm_clobbers_list_opt ',' string_literal_list
-	{ $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
+		{ $$ = (ExpressionNode *)$1->set_last( new ExpressionNode( $3 ) ); }
 	;
 
 label_list:
 	no_attr_identifier
-		{ $$ = new LabelNode(); $$->append_label( $1 ); }
+		{ $$ = new LabelNode(); $$->labels.push_back( *$1 ); }
 	| label_list ',' no_attr_identifier
-		{ $$ = $1; $1->append_label( $3 ); }
+		{ $$ = $1; $1->labels.push_back( *$3 ); }
 	;
 
