Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision d58ebf38072a247f44f86f3f6b44d9a7d64205cc)
+++ src/Parser/ExpressionNode.cc	(revision e869d663f37f45b9b6e613f679b97e3433f2063e)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:17:07 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Aug 11 15:13:48 2015
-// Update Count     : 200
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Aug 12 13:51:11 2015
+// Update Count     : 254
 // 
 
@@ -32,5 +32,5 @@
 ExpressionNode::ExpressionNode() : ParseNode(), argName( 0 ) {}
 
-ExpressionNode::ExpressionNode( const string *name_ ) : ParseNode( name_ ), argName( 0 ) {}
+ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ), argName( 0 ) {}
 
 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ) {
@@ -290,4 +290,21 @@
 DesignatorNode::DesignatorNode( ExpressionNode *expr, bool isArrayIndex ) : isArrayIndex( isArrayIndex ) {
 	set_argName( expr );
+	assert( get_argName() );
+
+	if ( ! isArrayIndex ) {
+		if ( VarRefNode * var = dynamic_cast< VarRefNode * >( expr ) ) {
+
+			stringstream ss( var->get_name() );
+			double value;
+			if ( ss >> value ) {
+				// this is a floating point constant. It MUST be
+				// ".0" or ".1", otherwise the program is invalid
+				if ( ! (var->get_name() == ".0" || var->get_name() == ".1") ) {
+					throw SemanticError( "invalid designator name: " + var->get_name() );
+				} // if
+				var->set_name( var->get_name().substr(1) );
+			} // if
+		} // if
+	} // if
 }
 
@@ -295,10 +312,27 @@
 }
 
+class DesignatorFixer : public Mutator {
+public:
+	virtual Expression* mutate( NameExpr *nameExpr ) {
+		if ( nameExpr->get_name() == "0" || nameExpr->get_name() == "1" ) {
+			Constant val( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nameExpr->get_name() );
+			delete nameExpr;
+			return new ConstantExpr( val );
+		}
+		return nameExpr;
+	}
+};
+
 Expression *DesignatorNode::build() const {
+	Expression * ret = get_argName()->build();
+
 	if ( isArrayIndex ) {
-		return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) );
-	} else {
-		return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) );
-	} // if
+		// need to traverse entire structure and change any instances of 0 or 1 to 
+		// ConstantExpr
+		DesignatorFixer fixer;
+		ret = ret->acceptMutator( fixer );
+	} // if
+
+	return ret;
 }
 
Index: src/Parser/ParseNode.cc
===================================================================
--- src/Parser/ParseNode.cc	(revision d58ebf38072a247f44f86f3f6b44d9a7d64205cc)
+++ src/Parser/ParseNode.cc	(revision e869d663f37f45b9b6e613f679b97e3433f2063e)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:26:29 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 30 14:55:54 2015
-// Update Count     : 26
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Aug 12 13:26:00 2015
+// Update Count     : 36
 // 
 
@@ -20,9 +20,10 @@
 int ParseNode::indent_by = 4;
 
-ParseNode::ParseNode() : name( 0 ), next( 0 ) {};
-ParseNode::ParseNode( const string *name_ ) : name( name_ ), next( 0 ) {}
+ParseNode::ParseNode() : next( 0 ) {};
+ParseNode::ParseNode( const string *name ) : name( *name ), next( 0 ) { delete name; }
+ParseNode::ParseNode( const string &name ) : name( name ), next( 0 ) { }
 
 ParseNode::~ParseNode() {
-	delete next; delete name;
+	delete next;
 };
 
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision d58ebf38072a247f44f86f3f6b44d9a7d64205cc)
+++ src/Parser/ParseNode.h	(revision e869d663f37f45b9b6e613f679b97e3433f2063e)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Aug 11 15:11:29 2015
-// Update Count     : 145
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Aug 12 13:27:11 2015
+// Update Count     : 172
 //
 
@@ -40,4 +40,5 @@
 	ParseNode();
 	ParseNode( const std::string * );
+	ParseNode( const std::string & );  // for copy constructing subclasses
 	virtual ~ParseNode();
 
@@ -49,5 +50,7 @@
 	virtual ParseNode *clone() const { return 0; };
 
-	const std::string &get_name() const { return *name; }
+	const std::string &get_name() const { return name; }
+	void set_name( const std::string &newValue ) { name = newValue; }
+
 	virtual void print( std::ostream &, int indent = 0 ) const;
 	virtual void printList( std::ostream &, int indent = 0 ) const;
@@ -55,5 +58,5 @@
 	ParseNode &operator,( ParseNode &);
   protected:
-	const std::string *name;
+	std::string name;
 	ParseNode *next;
 	static int indent_by;
