Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 8135d4c79504a6c3047246007261186efa5ba4c9)
+++ src/Parser/ExpressionNode.cc	(revision 76c62b2f38518c820649b67ff26b4bbaea3060da)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:17:07 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug  2 11:12:00 2017
-// Update Count     : 568
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug 31 21:05:04 2017
+// Update Count     : 605
 //
 
@@ -58,9 +58,21 @@
 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
 
-Expression * build_constantInteger( const std::string & str ) {
+static void sepNumeric( string & str, string & units ) {
+	string::size_type posn = str.find_first_of( "`" );
+	if ( posn != string::npos ) {
+		units = str.substr( posn );						// extract units
+		str.erase( posn );								// remove units
+	} // if
+} // sepNumeric
+
+Expression * build_constantInteger( std::string & str ) {
 	static const BasicType::Kind kind[2][3] = {
 		{ BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
 		{ BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt },
 	};
+
+	string units;										// units
+	sepNumeric( str, units );							// separate constant from units
+
 	bool dec = true, Unsigned = false;					// decimal, unsigned constant
 	int size;											// 0 => int, 1 => long, 2 => long long
@@ -69,4 +81,5 @@
 	Expression * ret;
 
+	// ROB: what do we do with units on 0 and 1?
 	// special constants
 	if ( str == "0" ) {
@@ -132,5 +145,10 @@
 	} // if
 
-	ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
+//	if ( units.length() == 0 ) {
+		ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
+//	} else {
+//		// ROB: generate call to units routine
+//		ret = nullptr;
+//	} // if
   CLEANUP:
 	delete &str;										// created by lex
@@ -138,9 +156,12 @@
 } // build_constantInteger
 
-Expression * build_constantFloat( const std::string & str ) {
+Expression * build_constantFloat( std::string & str ) {
 	static const BasicType::Kind kind[2][3] = {
 		{ BasicType::Float, BasicType::Double, BasicType::LongDouble },
 		{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
 	};
+
+	string units;										// units
+	sepNumeric( str, units );							// separate constant from units
 
 	bool complx = false;								// real, complex
@@ -168,21 +189,56 @@
 	} // if
 
-	Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
+	Expression * ret;
+//	if ( units.length() == 0 ) {
+		ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
+//	} else {
+//		ret = nullptr;
+//		// ROB: generate call to units routine
+//	} // if
+
 	delete &str;										// created by lex
 	return ret;
 } // build_constantFloat
 
-Expression * build_constantChar( const std::string & str ) {
-	Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
+static void sepString( string & str, string & units, char delimit ) {
+	string::size_type posn = str.find_last_of( delimit ) + 1;
+	if ( posn != str.length() ) {
+		units = str.substr( posn );						// extract units
+		str.erase( posn );								// remove units
+	} // if
+} // sepString
+
+Expression * build_constantChar( std::string & str ) {
+	string units;										// units
+	sepString( str, units, '\'' );						// separate constant from units
+
+	Expression * ret;
+//	if ( units.length() == 0 ) {
+		ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
+//	} else {
+//		ret = nullptr;
+//		// ROB: generate call to units routine
+//	} // if
+
 	delete &str;										// created by lex
 	return ret;
 } // build_constantChar
 
-ConstantExpr * build_constantStr( const std::string & str ) {
-	// string should probably be a primitive type
-	ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
-								   new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
-								   false, false );
-	ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
+ConstantExpr * build_constantStr( std::string & str ) {
+	string units;										// units
+	sepString( str, units, '"' );						// separate constant from units
+
+	ConstantExpr * ret;
+//	if ( units.length() == 0 ) {
+		// string should probably be a primitive type
+		ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
+										new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
+										false, false );
+		ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
+//	} else {
+//		ret = nullptr;
+//		// ROB: generate call to units routine
+//	} // if
+		
 	delete &str;										// created by lex
 	return ret;
