Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/DeclarationNode.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 13 18:56:58 2016
-// Update Count     : 171
+// Last Modified On : Mon Aug 15 14:30:25 2016
+// Update Count     : 172
 //
 
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/ExpressionNode.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Aug 11 20:24:36 2016
-// Update Count     : 487
+// Last Modified On : Mon Aug 15 14:30:42 2016
+// Update Count     : 490
 //
 
@@ -292,5 +292,5 @@
 //##############################################################################
 
-Expression *build_asm( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
+Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
 	return new AsmExpr( maybeBuild< Expression >( inout ), constraint, maybeBuild<Expression>(operand) );
 }
@@ -298,7 +298,7 @@
 //##############################################################################
 
-void LabelNode::print( std::ostream &os, int indent ) const {}
-
-void LabelNode::printOneLine( std::ostream &os, int indent ) const {}
+//void LabelNode::print( std::ostream &os, int indent ) const {}
+
+//void LabelNode::printOneLine( std::ostream &os, int indent ) const {}
 
 //##############################################################################
Index: src/Parser/ParseNode.cc
===================================================================
--- src/Parser/ParseNode.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/ParseNode.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:26:29 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Aug 13 18:55:35 2016
-// Update Count     : 98
+// Last Modified On : Mon Aug 15 14:49:06 2016
+// Update Count     : 99
 // 
 
@@ -52,16 +52,4 @@
 }
 
-ParseNode &ParseNode::operator,( ParseNode &p ) {
-	set_last( &p );
-	return *this;
-}
-
-ParseNode *mkList( ParseNode &pn ) {
-	// it just relies on `operator,' to take care of the "arguments" and provides a nice interface to an awful-looking
-	// address-of, rendering, for example (StatementNode *)(&(*$5 + *$7)) into (StatementNode *)mkList(($5, $7))
-	// (although "nice" is probably not the word)
-	return &pn;
-}
-
 // Local Variables: //
 // tab-width: 4 //
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/ParseNode.h	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 14 16:29:20 2016
-// Update Count     : 483
+// Last Modified On : Mon Aug 15 14:52:12 2016
+// Update Count     : 512
 //
 
@@ -64,6 +64,4 @@
 	ParseNode *next;
 };
-
-ParseNode *mkList( ParseNode & );
 
 //##############################################################################
@@ -133,21 +131,4 @@
 };
 
-//##############################################################################
-
-Expression *build_constantInteger( std::string &str );
-Expression *build_constantFloat( std::string &str );
-Expression *build_constantChar( std::string &str );
-ConstantExpr *build_constantStr( std::string &str );
-
-//##############################################################################
-
-NameExpr *build_varref( const std::string *name, bool labelp = false );
-
-//##############################################################################
-
-Expression *build_typevalue( DeclarationNode *decl );
-
-//##############################################################################
-
 enum class OperKinds {
 	// diadic
@@ -160,4 +141,16 @@
 	Ctor, Dtor,
 };
+
+struct LabelNode {
+	std::list< Label > labels;
+};
+
+Expression *build_constantInteger( std::string &str );
+Expression *build_constantFloat( std::string &str );
+Expression *build_constantChar( std::string &str );
+ConstantExpr *build_constantStr( std::string &str );
+
+NameExpr *build_varref( const std::string *name, bool labelp = false );
+Expression *build_typevalue( DeclarationNode *decl );
 
 Expression *build_cast( DeclarationNode * decl_node, ExpressionNode *expr_node );
@@ -183,31 +176,6 @@
 Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node );
 Expression *build_range( ExpressionNode * low, ExpressionNode *high );
-
-//##############################################################################
-
-Expression *build_asm( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand );
-
-//##############################################################################
-
-class LabelNode : public ExpressionNode {
-  public:
-	virtual Expression *build() const { return NULL; }
-	virtual LabelNode *clone() const { assert( false ); return new LabelNode( *this ); }
-
-	virtual void print( std::ostream &os, int indent = 0) const;
-	virtual void printOneLine( std::ostream &os, int indent = 0) const;
-
-	const std::list< Label > &get_labels() const { return labels; };
-	void append_label( std::string * label ) { labels.push_back( *label ); delete label; }
-  private:
-	std::list< Label > labels;
-};
-
-//##############################################################################
-
+Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand );
 Expression *build_valexpr( StatementNode *s );
-
-//##############################################################################
-
 Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids );
 
@@ -275,5 +243,5 @@
 	DeclarationNode *addNewArray( DeclarationNode *array );
 	DeclarationNode *addParamList( DeclarationNode *list );
-	DeclarationNode *addIdList( DeclarationNode *list );       // old-style functions
+	DeclarationNode *addIdList( DeclarationNode *list ); // old-style functions
 	DeclarationNode *addInitializer( InitializerNode *init );
 
@@ -328,49 +296,16 @@
 class StatementNode : public ParseNode {
   public:
-	enum Type { Exp,   If,        Switch,  Case,    Default,  Choose,   Fallthru,
-				While, Do,        For,
-				Goto,  Continue,  Break,   Return,  Throw,
-				Try,   Catch,     Finally, Asm,
-				Decl
-	};
-
-	StatementNode();
+	StatementNode() { stmt = nullptr; }
+	StatementNode( Statement *stmt ) : stmt( stmt ) {}
 	StatementNode( DeclarationNode *decl );
-	~StatementNode();
-
-	StatementNode::Type get_type() const { return type; }
-
-	virtual StatementNode *add_label( const std::string * );
-	virtual std::list<std::string> get_labels() const { return labels; }
-
-	void addDeclaration( DeclarationNode *newDecl ) { decl = newDecl; }
-
-	virtual StatementNode *append_last_case( StatementNode * );
-
-	virtual void print( std::ostream &os, int indent = 0) const {}
-	virtual StatementNode *clone() const;
-	virtual Statement *build() const;
-  public:
-	static const char *StType[];
-	Type type;
-	std::list<std::string> labels;
-	DeclarationNode *decl;
-}; // StatementNode
-
-class StatementNode2 : public StatementNode {
-  public:
-	StatementNode2() { stmt = nullptr; }
-	StatementNode2( Statement *stmt ) : stmt( stmt ) {}
-	StatementNode2( DeclarationNode *decl );
-	virtual ~StatementNode2() {}
-
-	virtual StatementNode2 *clone() const { assert( false ); return nullptr; }
+	virtual ~StatementNode() {}
+
+	virtual StatementNode *clone() const { assert( false ); return nullptr; }
 	virtual Statement *build() const { return stmt; }
 
-	virtual StatementNode2 *add_label( const std::string * name ) {
+	virtual StatementNode *add_label( const std::string * name ) {
 		stmt->get_labels().emplace_back( *name );
 		return this;
 	}
-	virtual std::list<std::string> get_labels() const { assert( false ); return StatementNode::get_labels(); }
 
 	virtual StatementNode *append_last_case( StatementNode * );
@@ -386,7 +321,7 @@
 struct ForCtl {
 	ForCtl( ExpressionNode *expr, ExpressionNode *condition, ExpressionNode *change ) :
-		init( new StatementNode2( build_expr( expr ) ) ), condition( condition ), change( change ) {}
+		init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {}
 	ForCtl( DeclarationNode *decl, ExpressionNode *condition, ExpressionNode *change ) :
-		init( new StatementNode2( decl ) ), condition( condition ), change( change ) {}
+		init( new StatementNode( decl ) ), condition( condition ), change( change ) {}
 
 	StatementNode *init;
@@ -408,37 +343,6 @@
 Statement *build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny = false );
 Statement *build_finally( StatementNode *stmt );
-
-//##############################################################################
-
-class CompoundStmtNode : public StatementNode {
-  public:
-	CompoundStmtNode();
-	CompoundStmtNode( StatementNode * );
-	~CompoundStmtNode();
-
-	void add_statement( StatementNode * );
-
-	void print( std::ostream &os, int indent = 0 ) const;
-	virtual Statement *build() const;
-  private:
-	StatementNode *first, *last;
-};
-
-//##############################################################################
-
-class AsmStmtNode : public StatementNode {
-  public:
-	AsmStmtNode( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 );
-	~AsmStmtNode();
-
-	void print( std::ostream &os, int indent = 0 ) const {}
-	Statement *build() const;
-  private:
-	bool voltile;
-	ConstantExpr *instruction;
-	ExpressionNode *output, *input;
-	ExpressionNode *clobber;
-	std::list< Label > gotolabels;
-};
+Statement *build_compound( StatementNode *first );
+Statement *build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 );
 
 //##############################################################################
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/StatementNode.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 14 13:10:54 2016
-// Update Count     : 288
+// Last Modified On : Mon Aug 15 14:40:05 2016
+// Update Count     : 317
 //
 
@@ -26,25 +26,13 @@
 using namespace std;
 
-const char *StatementNode::StType[] = {
-	"Exp",   "If",       "Switch", "Case",    "Default",  "Choose",   "Fallthru",
-	"While", "Do",       "For",
-	"Goto",  "Continue", "Break",  "Return",  "Throw",
-	"Try",   "Catch",    "Finally", "Asm",
-	"Decl"
-};
 
-StatementNode::StatementNode() : ParseNode(), labels( 0 ), decl( 0 ) {}
-
-StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), labels( 0 ) {
-	assert( false );
+StatementNode::StatementNode( DeclarationNode *decl ) {
 	if ( decl ) {
-		if ( DeclarationNode *agg = decl->extractAggregate() ) {
-			this->decl = agg;
-			StatementNode *nextStmt = new StatementNode;
-			nextStmt->type = Decl;
-			nextStmt->decl = decl;
+		DeclarationNode *agg = decl->extractAggregate();
+		if ( agg ) {
+			StatementNode *nextStmt = new StatementNode( new DeclStmt( noLabels, maybeBuild< Declaration >( decl ) ) );
 			next = nextStmt;
 			if ( decl->get_next() ) {
-				next->set_next( new StatementNode( dynamic_cast<DeclarationNode *>( decl->get_next() ) ) );
+				next->set_next( new StatementNode( dynamic_cast<DeclarationNode *>(decl->get_next()) ) );
 				decl->set_next( 0 );
 			} // if
@@ -52,26 +40,4 @@
 			if ( decl->get_next() ) {
 				next = new StatementNode( dynamic_cast<DeclarationNode *>( decl->get_next() ) );
-				decl->set_next( 0 );
-			} // if
-			this->decl = decl;
-		} // if
-	} // if
-}
-
-StatementNode2::StatementNode2( DeclarationNode *decl ) {
-	if ( decl ) {
-		DeclarationNode *agg = decl->extractAggregate();
-		if ( agg ) {
-			StatementNode *nextStmt = new StatementNode;
-			nextStmt->type = Decl;
-			nextStmt->decl = decl;
-			next = nextStmt;
-			if ( decl->get_next() ) {
-				next->set_next( new StatementNode2( dynamic_cast<DeclarationNode *>(decl->get_next()) ) );
-				decl->set_next( 0 );
-			} // if
-		} else {
-			if ( decl->get_next() ) {
-				next = new StatementNode2( dynamic_cast<DeclarationNode *>( decl->get_next() ) );
 				decl->set_next( 0 );
 			} // if
@@ -84,71 +50,21 @@
 }
 
-StatementNode::~StatementNode() {
-	delete decl;
-}
-
-StatementNode * StatementNode::clone() const {
-	assert( false );
-	return 0;
-}
-
-StatementNode *StatementNode::add_label( const std::string *l ) {
-	if ( l != 0 ) {
-		labels.push_front( *l );
-		delete l;
-	} // if
-	return this;
-}
-
 StatementNode *StatementNode::append_last_case( StatementNode *stmt ) {
-	assert( false );
-	return this;
-}
-
-StatementNode *StatementNode2::append_last_case( StatementNode *stmt ) {
 	StatementNode *prev = this;
 	// find end of list and maintain previous pointer
 	for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) {
-		StatementNode2 *node = dynamic_cast<StatementNode2 *>(curr);
+		StatementNode *node = dynamic_cast<StatementNode *>(curr);
 		assert( node );
 		assert( dynamic_cast<CaseStmt *>(node->stmt) );
 		prev = curr;
 	} // for
-	// conver from StatementNode list to Statement list
-	StatementNode2 *node = dynamic_cast<StatementNode2 *>(prev);
+	// convert from StatementNode list to Statement list
+	StatementNode *node = dynamic_cast<StatementNode *>(prev);
 	std::list<Statement *> stmts;
 	buildList( stmt, stmts );
-	// splice any new Statements to end of currents Statements
+	// splice any new Statements to end of current Statements
 	CaseStmt * caseStmt = dynamic_cast<CaseStmt *>(node->stmt);
 	caseStmt->get_statements().splice( caseStmt->get_statements().end(), stmts );
 	return this;
-}
-
-Statement *StatementNode::build() const {
-	switch ( type ) {
-	  case Decl:
-		return new DeclStmt( noLabels, maybeBuild< Declaration >( decl ) );
-		assert( false );
-	  case Exp:
-	  case If:
-	  case Switch:
-	  case Case:
-	  case Default:
-	  case While:
-	  case Do:
-	  case For:
-	  case Goto:
-	  case Break:
-	  case Continue:
-	  case Return:
-	  case Throw :
-	  case Try:
-	  case Catch:
-	  case Finally:
-	  case Asm:
-	  default:
-		assert( false );
-		return 0;
-	} // switch
 }
 
@@ -261,93 +177,19 @@
 }
 
-
-CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
-
-CompoundStmtNode::CompoundStmtNode( StatementNode *stmt ) : first( stmt ) {
-	if ( first ) {
-		last = ( StatementNode *)( stmt->get_last());
-	} else {
-		last = 0;
-	} // if
-}
-
-CompoundStmtNode::~CompoundStmtNode() {
-	delete first;
-}
-
-void CompoundStmtNode::add_statement( StatementNode *stmt ) {
-	if ( stmt != 0 ) {
-		last->set_last( stmt );
-		last = ( StatementNode *)( stmt->get_next());
-	} // if
-}
-
-void CompoundStmtNode::print( ostream &os, int indent ) const {
-	if ( first ) {
-		first->printList( os, indent+2 );
-	} // if
-}
-
-Statement *CompoundStmtNode::build() const {
-	std::list<Label> labs;
-	const std::list<std::string> &labels = get_labels();
-
-	if ( ! labels.empty() ) {
-		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-		copy( labels.begin(), labels.end(), lab_it );
-	} // if
-
-	CompoundStmt *cs = new CompoundStmt( labs );
+Statement *build_compound( StatementNode *first ) {
+	CompoundStmt *cs = new CompoundStmt( noLabels );
 	buildList( first, cs->get_kids() );
 	return cs;
 }
 
-
-AsmStmtNode::AsmStmtNode( bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) :
-	voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) {
-	type = Asm;
-	if ( gotolabels ) {
-		this->gotolabels = gotolabels->get_labels();
-		delete gotolabels;
-	} // if
-}
-
-AsmStmtNode::~AsmStmtNode() {
-	delete output; delete input; delete clobber;
-}
-
-Statement *AsmStmtNode::build() const {
-	std::list<Label> labs;
-
-	if ( ! get_labels().empty() ) {
-		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-		copy( get_labels().begin(), get_labels().end(), lab_it );
-	} // if
-
+Statement *build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) {
 	std::list< Expression * > out, in;
 	std::list< ConstantExpr * > clob;
+
 	buildList( output, out );
 	buildList( input, in );
 	buildList( clobber, clob );
-	std::list< Label > gotolabs = gotolabels;
-	return new AsmStmt( labs, voltile, instruction, out, in, clob, gotolabs );
+	return new AsmStmt( noLabels, voltile, instruction, out, in, clob, gotolabels ? gotolabels->labels : noLabels );
 }
-
-// Statement *build_asm( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 ) {
-// 	std::list<Label> labs;
-
-// 	if ( ! get_labels().empty() ) {
-// 		std::back_insert_iterator< std::list<Label> > lab_it( labs );
-// 		copy( get_labels().begin(), get_labels().end(), lab_it );
-// 	} // if
-
-// 	std::list< Expression * > out, in;
-// 	std::list< ConstantExpr * > clob;
-// 	buildList( output, out );
-// 	buildList( input, in );
-// 	buildList( clobber, clob );
-// 	std::list< Label > gotolabs = gotolabels;
-// 	return new AsmStmt( labs, voltile, instruction, out, in, clob, gotolabs );
-// }
 
 // Local Variables: //
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/TypeData.h	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jul 12 20:52:02 2016
-// Update Count     : 20
+// Last Modified On : Mon Aug 15 14:28:32 2016
+// Update Count     : 21
 //
 
Index: src/Parser/parser.cc
===================================================================
--- src/Parser/parser.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/parser.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -5638,5 +5638,5 @@
 			Token fn;
 			fn.str = new std::string( "^?{}" ); // location undefined
-			(yyval.sn) = new StatementNode2( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(2) - (6)].en) )->set_last( (yyvsp[(4) - (6)].en) ) ) ) ) );
+			(yyval.sn) = new StatementNode( build_expr( new ExpressionNode( build_func( new ExpressionNode( build_varref( fn ) ), (ExpressionNode *)( (yyvsp[(2) - (6)].en) )->set_last( (yyvsp[(4) - (6)].en) ) ) ) ) );
 		}
     break;
@@ -5655,5 +5655,5 @@
 /* Line 1806 of yacc.c  */
 #line 680 "parser.yy"
-    { (yyval.sn) = new CompoundStmtNode( (StatementNode *)0 ); }
+    { (yyval.sn) = new StatementNode( build_compound( (StatementNode *)0 ) ); }
     break;
 
@@ -5662,5 +5662,5 @@
 /* Line 1806 of yacc.c  */
 #line 687 "parser.yy"
-    { (yyval.sn) = new CompoundStmtNode( (yyvsp[(5) - (7)].sn) ); }
+    { (yyval.sn) = new StatementNode( build_compound( (yyvsp[(5) - (7)].sn) ) ); }
     break;
 
@@ -5676,5 +5676,5 @@
 /* Line 1806 of yacc.c  */
 #line 698 "parser.yy"
-    { (yyval.sn) = new StatementNode2( (yyvsp[(1) - (1)].decl) ); }
+    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
@@ -5686,5 +5686,5 @@
 			for ( DeclarationNode *iter = (yyvsp[(2) - (2)].decl); iter != NULL; iter = (DeclarationNode *)iter->get_next() )
 				iter->set_extension( true );
-			(yyval.sn) = new StatementNode2( (yyvsp[(2) - (2)].decl) );
+			(yyval.sn) = new StatementNode( (yyvsp[(2) - (2)].decl) );
 		}
     break;
@@ -5694,5 +5694,5 @@
 /* Line 1806 of yacc.c  */
 #line 706 "parser.yy"
-    { (yyval.sn) = new StatementNode2( (yyvsp[(1) - (1)].decl) ); }
+    { (yyval.sn) = new StatementNode( (yyvsp[(1) - (1)].decl) ); }
     break;
 
@@ -5708,5 +5708,5 @@
 /* Line 1806 of yacc.c  */
 #line 718 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_expr( (yyvsp[(1) - (2)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_expr( (yyvsp[(1) - (2)].en) ) ); }
     break;
 
@@ -5715,5 +5715,5 @@
 /* Line 1806 of yacc.c  */
 #line 724 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); }
+    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn), nullptr ) ); }
     break;
 
@@ -5722,5 +5722,5 @@
 /* Line 1806 of yacc.c  */
 #line 726 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_if( (yyvsp[(3) - (7)].en), (yyvsp[(5) - (7)].sn), (yyvsp[(7) - (7)].sn) ) ); }
     break;
 
@@ -5729,5 +5729,5 @@
 /* Line 1806 of yacc.c  */
 #line 728 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
     break;
 
@@ -5737,5 +5737,5 @@
 #line 730 "parser.yy"
     {
-			StatementNode *sw = new StatementNode2( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
+			StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
 			// 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
@@ -5743,5 +5743,5 @@
 			// therefore, are removed from the grammar even though C allows it. The change also applies to choose
 			// statement.
-			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) : sw;
+			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) ) : sw;
 		}
     break;
@@ -5751,5 +5751,5 @@
 /* Line 1806 of yacc.c  */
 #line 740 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_switch( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
     break;
 
@@ -5759,6 +5759,6 @@
 #line 742 "parser.yy"
     {
-			StatementNode *sw = new StatementNode2( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
-			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new CompoundStmtNode( (StatementNode *)((new StatementNode2( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) : sw;
+			StatementNode *sw = new StatementNode( build_switch( (yyvsp[(3) - (9)].en), (yyvsp[(8) - (9)].sn) ) );
+			(yyval.sn) = (yyvsp[(7) - (9)].decl) != 0 ? new StatementNode( build_compound( (StatementNode *)((new StatementNode( (yyvsp[(7) - (9)].decl) ))->set_last( sw )) ) ) : sw;
 		}
     break;
@@ -5782,5 +5782,5 @@
 /* Line 1806 of yacc.c  */
 #line 759 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_case( (yyvsp[(1) - (1)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_case( (yyvsp[(1) - (1)].en) ) ); }
     break;
 
@@ -5789,5 +5789,5 @@
 /* Line 1806 of yacc.c  */
 #line 761 "parser.yy"
-    { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode2( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); }
+    { (yyval.sn) = (StatementNode *)((yyvsp[(1) - (3)].sn)->set_last( new StatementNode( build_case( (yyvsp[(3) - (3)].en) ) ) ) ); }
     break;
 
@@ -5803,5 +5803,5 @@
 /* Line 1806 of yacc.c  */
 #line 766 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_default() ); }
+    { (yyval.sn) = new StatementNode( build_default() ); }
     break;
 
@@ -5817,5 +5817,5 @@
 /* Line 1806 of yacc.c  */
 #line 776 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
     break;
 
@@ -5831,5 +5831,5 @@
 /* Line 1806 of yacc.c  */
 #line 787 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(2) - (2)].sn) ) ); }
+    { (yyval.sn) = (yyvsp[(1) - (2)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(2) - (2)].sn) ) ) ); }
     break;
 
@@ -5838,5 +5838,5 @@
 /* Line 1806 of yacc.c  */
 #line 789 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new CompoundStmtNode( (yyvsp[(3) - (3)].sn) ) ) ) ); }
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (3)].sn)->set_last( (yyvsp[(2) - (3)].sn)->append_last_case( new StatementNode( build_compound( (yyvsp[(3) - (3)].sn) ) ) ) ) ); }
     break;
 
@@ -5859,5 +5859,5 @@
 /* Line 1806 of yacc.c  */
 #line 802 "parser.yy"
-    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(2) - (3)].sn), *(yyvsp[(3) - (3)].sn) ) ) ) ); }
+    { (yyval.sn) = (yyvsp[(1) - (3)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(2) - (3)].sn)->set_last( (yyvsp[(3) - (3)].sn) ) ) ) ); }
     break;
 
@@ -5873,5 +5873,5 @@
 /* Line 1806 of yacc.c  */
 #line 806 "parser.yy"
-    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_last( (yyvsp[(2) - (4)].sn)->append_last_case( new CompoundStmtNode( (StatementNode *)mkList( (*(yyvsp[(3) - (4)].sn), *(yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
+    { (yyval.sn) = (StatementNode *)( (yyvsp[(1) - (4)].sn)->set_last( (yyvsp[(2) - (4)].sn)->append_last_case( new StatementNode( build_compound( (StatementNode *)(yyvsp[(3) - (4)].sn)->set_last( (yyvsp[(4) - (4)].sn) ) ) ) ) ) ); }
     break;
 
@@ -5880,5 +5880,5 @@
 /* Line 1806 of yacc.c  */
 #line 811 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( "", BranchStmt::Break ) ); }
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
     break;
 
@@ -5901,5 +5901,5 @@
 /* Line 1806 of yacc.c  */
 #line 824 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(3) - (5)].en), (yyvsp[(5) - (5)].sn) ) ); }
     break;
 
@@ -5908,5 +5908,5 @@
 /* Line 1806 of yacc.c  */
 #line 826 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ) ); }
     break;
 
@@ -5915,5 +5915,5 @@
 /* Line 1806 of yacc.c  */
 #line 828 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_for( (yyvsp[(4) - (6)].fctl), (yyvsp[(6) - (6)].sn) ) ); }
     break;
 
@@ -5936,5 +5936,5 @@
 /* Line 1806 of yacc.c  */
 #line 840 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); }
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Goto ) ); }
     break;
 
@@ -5943,5 +5943,5 @@
 /* Line 1806 of yacc.c  */
 #line 844 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_computedgoto( (yyvsp[(3) - (4)].en) ) ); }
     break;
 
@@ -5950,5 +5950,5 @@
 /* Line 1806 of yacc.c  */
 #line 847 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( "", BranchStmt::Continue ) ); }
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Continue ) ); }
     break;
 
@@ -5957,5 +5957,5 @@
 /* Line 1806 of yacc.c  */
 #line 851 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); delete (yyvsp[(2) - (3)].tok); }
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Continue ) ); delete (yyvsp[(2) - (3)].tok); }
     break;
 
@@ -5964,5 +5964,5 @@
 /* Line 1806 of yacc.c  */
 #line 854 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( "", BranchStmt::Break ) ); }
+    { (yyval.sn) = new StatementNode( build_branch( "", BranchStmt::Break ) ); }
     break;
 
@@ -5971,5 +5971,5 @@
 /* Line 1806 of yacc.c  */
 #line 858 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); delete (yyvsp[(2) - (3)].tok); }
+    { (yyval.sn) = new StatementNode( build_branch( *(yyvsp[(2) - (3)].tok), BranchStmt::Break ) ); delete (yyvsp[(2) - (3)].tok); }
     break;
 
@@ -5978,5 +5978,5 @@
 /* Line 1806 of yacc.c  */
 #line 860 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_return( (yyvsp[(2) - (3)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_return( (yyvsp[(2) - (3)].en) ) ); }
     break;
 
@@ -5985,5 +5985,5 @@
 /* Line 1806 of yacc.c  */
 #line 862 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_throw( (yyvsp[(2) - (3)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
     break;
 
@@ -5992,5 +5992,5 @@
 /* Line 1806 of yacc.c  */
 #line 864 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_throw( (yyvsp[(2) - (3)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (3)].en) ) ); }
     break;
 
@@ -5999,5 +5999,5 @@
 /* Line 1806 of yacc.c  */
 #line 866 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_throw( (yyvsp[(2) - (5)].en) ) ); }
+    { (yyval.sn) = new StatementNode( build_throw( (yyvsp[(2) - (5)].en) ) ); }
     break;
 
@@ -6006,5 +6006,5 @@
 /* Line 1806 of yacc.c  */
 #line 871 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); }
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), (yyvsp[(3) - (3)].sn), 0 ) ); }
     break;
 
@@ -6013,5 +6013,5 @@
 /* Line 1806 of yacc.c  */
 #line 873 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (3)].sn), 0, (yyvsp[(3) - (3)].sn) ) ); }
     break;
 
@@ -6020,5 +6020,5 @@
 /* Line 1806 of yacc.c  */
 #line 875 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_try( (yyvsp[(2) - (4)].sn), (yyvsp[(3) - (4)].sn), (yyvsp[(4) - (4)].sn) ) ); }
     break;
 
@@ -6027,5 +6027,5 @@
 /* Line 1806 of yacc.c  */
 #line 882 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
+    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
     break;
 
@@ -6034,5 +6034,5 @@
 /* Line 1806 of yacc.c  */
 #line 884 "parser.yy"
-    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode2( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
     break;
 
@@ -6041,5 +6041,5 @@
 /* Line 1806 of yacc.c  */
 #line 886 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
+    { (yyval.sn) = new StatementNode( build_catch( 0, (yyvsp[(5) - (5)].sn), true ) ); }
     break;
 
@@ -6048,5 +6048,5 @@
 /* Line 1806 of yacc.c  */
 #line 888 "parser.yy"
-    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode2( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (6)].sn)->set_last( new StatementNode( build_catch( 0, (yyvsp[(6) - (6)].sn), true ) ) ); }
     break;
 
@@ -6055,5 +6055,5 @@
 /* Line 1806 of yacc.c  */
 #line 893 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
     break;
 
@@ -6062,5 +6062,5 @@
 /* Line 1806 of yacc.c  */
 #line 895 "parser.yy"
-    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode2( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
     break;
 
@@ -6069,5 +6069,5 @@
 /* Line 1806 of yacc.c  */
 #line 897 "parser.yy"
-    { (yyval.sn) = new StatementNode2( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
+    { (yyval.sn) = new StatementNode( build_catch( (yyvsp[(5) - (9)].decl), (yyvsp[(8) - (9)].sn) ) ); }
     break;
 
@@ -6076,5 +6076,5 @@
 /* Line 1806 of yacc.c  */
 #line 899 "parser.yy"
-    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode2( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
+    { (yyval.sn) = (StatementNode *)(yyvsp[(1) - (10)].sn)->set_last( new StatementNode( build_catch( (yyvsp[(6) - (10)].decl), (yyvsp[(9) - (10)].sn) ) ) ); }
     break;
 
@@ -6084,5 +6084,5 @@
 #line 904 "parser.yy"
     {
-			(yyval.sn) = new StatementNode2( build_finally( (yyvsp[(2) - (2)].sn) ) );
+			(yyval.sn) = new StatementNode( build_finally( (yyvsp[(2) - (2)].sn) ) );
 		}
     break;
@@ -6119,5 +6119,5 @@
 /* Line 1806 of yacc.c  */
 #line 933 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ); }
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (6)].flag), (yyvsp[(4) - (6)].constant), 0 ) ); }
     break;
 
@@ -6126,5 +6126,5 @@
 /* Line 1806 of yacc.c  */
 #line 935 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ); }
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (8)].flag), (yyvsp[(4) - (8)].constant), (yyvsp[(6) - (8)].en) ) ); }
     break;
 
@@ -6133,5 +6133,5 @@
 /* Line 1806 of yacc.c  */
 #line 937 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ); }
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (10)].flag), (yyvsp[(4) - (10)].constant), (yyvsp[(6) - (10)].en), (yyvsp[(8) - (10)].en) ) ); }
     break;
 
@@ -6140,5 +6140,5 @@
 /* Line 1806 of yacc.c  */
 #line 939 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].en) ); }
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (12)].flag), (yyvsp[(4) - (12)].constant), (yyvsp[(6) - (12)].en), (yyvsp[(8) - (12)].en), (yyvsp[(10) - (12)].en) ) ); }
     break;
 
@@ -6147,5 +6147,5 @@
 /* Line 1806 of yacc.c  */
 #line 941 "parser.yy"
-    { (yyval.sn) = new AsmStmtNode( (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].en), (yyvsp[(12) - (14)].label) ); }
+    { (yyval.sn) = new StatementNode( build_asmstmt( (yyvsp[(2) - (14)].flag), (yyvsp[(5) - (14)].constant), 0, (yyvsp[(8) - (14)].en), (yyvsp[(10) - (14)].en), (yyvsp[(12) - (14)].label) ) ); }
     break;
 
@@ -6182,5 +6182,5 @@
 /* Line 1806 of yacc.c  */
 #line 965 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_asm( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); }
+    { (yyval.en) = new ExpressionNode( build_asmexpr( 0, (yyvsp[(1) - (4)].constant), (yyvsp[(3) - (4)].en) ) ); }
     break;
 
@@ -6189,5 +6189,5 @@
 /* Line 1806 of yacc.c  */
 #line 967 "parser.yy"
-    { (yyval.en) = new ExpressionNode( build_asm( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); }
+    { (yyval.en) = new ExpressionNode( build_asmexpr( (yyvsp[(2) - (7)].en), (yyvsp[(4) - (7)].constant), (yyvsp[(6) - (7)].en) ) ); }
     break;
 
@@ -6217,5 +6217,5 @@
 /* Line 1806 of yacc.c  */
 #line 981 "parser.yy"
-    { (yyval.label) = new LabelNode(); (yyval.label)->append_label( (yyvsp[(1) - (1)].tok) ); }
+    { (yyval.label) = new LabelNode(); (yyval.label)->labels.push_back( *(yyvsp[(1) - (1)].tok) ); }
     break;
 
@@ -6224,5 +6224,5 @@
 /* Line 1806 of yacc.c  */
 #line 983 "parser.yy"
-    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->append_label( (yyvsp[(3) - (3)].tok) ); }
+    { (yyval.label) = (yyvsp[(1) - (3)].label); (yyvsp[(1) - (3)].label)->labels.push_back( *(yyvsp[(3) - (3)].tok) ); }
     break;
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/parser.yy	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -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 ); }
 	;
 
Index: src/Parser/parseutility.cc
===================================================================
--- src/Parser/parseutility.cc	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/Parser/parseutility.cc	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:30:39 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat May 16 15:31:33 2015
-// Update Count     : 2
+// Last Modified On : Sun Aug 14 23:45:03 2016
+// Update Count     : 3
 // 
 
@@ -17,4 +17,9 @@
 #include "SynTree/Type.h"
 #include "SynTree/Expression.h"
+
+// rewrite
+//    if ( x ) ...
+// as
+//    if ( (int)(x != 0) ) ...
 
 Expression *notZeroExpr( Expression *orig ) {
Index: src/examples/asm.c
===================================================================
--- src/examples/asm.c	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ 	(revision )
@@ -1,29 +1,0 @@
-int fred() {
-    int src;
-    int dst;
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0" : : : );
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0"
-		   : "=" "r" (dst));
-
-    asm volatile ( "mov %1, %0\n\t"
-		   "add $1, %0"
-		   : "=r" (dst)
-		   : "r" (src));
-
-    asm ( "mov %1, %0\n\t"
-	  "add $1, %0"
-	  : "=r" (dst), "=r" (src)
-	  : [src] "r" (dst)
-	  : "r0");
-
-  L1: L2:
-    asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
-	       : /* No outputs. */
-	       : "r"(src), "r"(&dst)
-	       : "r5", "memory"
-	       : L1, L2 );
-}
Index: src/tests/.expect/64/gccExtensions.txt
===================================================================
--- src/tests/.expect/64/gccExtensions.txt	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/tests/.expect/64/gccExtensions.txt	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -17,4 +17,5 @@
     asm volatile ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ) : "r" ( __src__i_2 ) :  );
     asm ( "mov %1, %0\n\tadd $1, %0" : "=r" ( __dst__i_2 ), "=r" ( __src__i_2 ) : [ __src__i_2 ] "r" ( __dst__i_2 ) : "r0" );
+    L2: L1: asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5" :  : "r" ( __src__i_2 ), "r" ( (&__dst__i_2) ) : "r5", "memory" : L1, L2 );
     double _Complex __c1__Xd_2;
     double _Complex __c2__Xd_2;
Index: src/tests/Makefile.am
===================================================================
--- src/tests/Makefile.am	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/tests/Makefile.am	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -11,6 +11,6 @@
 ## Created On       : Sun May 31 09:08:15 2015
 ## Last Modified By : Peter A. Buhr
-## Last Modified On : Tue Aug  9 15:34:57 2016
-## Update Count     : 38
+## Last Modified On : Mon Aug 15 12:24:54 2016
+## Update Count     : 39
 ###############################################################################
 
@@ -27,5 +27,5 @@
 
 all-local :
-	@+python test.py vector_test avl_test operators numericConstants expression enum asmName array typeof cast dtor-early-exit init_once
+	@+python test.py vector_test avl_test operators numericConstants expression enum array typeof cast dtor-early-exit init_once
 
 all-tests :
Index: src/tests/Makefile.in
===================================================================
--- src/tests/Makefile.in	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/tests/Makefile.in	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -635,5 +635,5 @@
 
 all-local :
-	@+python test.py vector_test avl_test operators numericConstants expression enum asmName array typeof cast dtor-early-exit init_once
+	@+python test.py vector_test avl_test operators numericConstants expression enum array typeof cast dtor-early-exit init_once
 
 all-tests :
Index: src/tests/asmName.c
===================================================================
--- src/tests/asmName.c	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ 	(revision )
@@ -1,16 +1,0 @@
-//Testing assembly declaration
-extern int x asm( "xx" );
-
-int fred( int x ) {
-    static int y asm( "yy" );
-
-// Cforall extensions
-
-    static * int z asm( "zz" );
-}
-
-//Dummy main
-int main(int argc, char const *argv[])
-{
-	return 0;
-}
Index: src/tests/gccExtensions.c
===================================================================
--- src/tests/gccExtensions.c	(revision 797347f1f46024c8a82575bca9bbc8ffb62f45b5)
+++ src/tests/gccExtensions.c	(revision e82aa9df9f1dc1335a759e00a2d82ca558fe6b0e)
@@ -10,6 +10,6 @@
 // Created On       : Sun Aug 14 17:28:17 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Aug 14 17:36:28 2016
-// Update Count     : 3
+// Last Modified On : Mon Aug 15 12:44:35 2016
+// Update Count     : 5
 // 
 
@@ -44,5 +44,5 @@
 		  : [src] "r" (dst)
 		  : "r0");
-#if 0
+
   L1: L2:
 	asm goto ( "frob %%r5, %1; jc %l[L1]; mov (%2), %%r5"
@@ -51,5 +51,5 @@
 			   : "r5", "memory"
 			   : L1, L2 );
-#endif
+
 	__complex__ c1;
 	_Complex c2;
