Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision cccc5343be3778f0211640c87d33b28512f4fcce)
+++ src/Parser/ExpressionNode.cc	(revision 51c63533f5e27f31fa1953e7742617d789a57ed5)
@@ -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;
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision cccc5343be3778f0211640c87d33b28512f4fcce)
+++ src/Parser/ParseNode.h	(revision 51c63533f5e27f31fa1953e7742617d789a57ed5)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Andrew Beach
-// Last Modified On : Thr Aug 17 13:46:00 2017
-// Update Count     : 795
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Thu Aug 31 17:42:49 2017
+// Update Count     : 797
 //
 
@@ -162,8 +162,8 @@
 };
 
-Expression * build_constantInteger( const std::string &str );
-Expression * build_constantFloat( const std::string &str );
-Expression * build_constantChar( const std::string &str );
-ConstantExpr * build_constantStr( const std::string &str );
+Expression * build_constantInteger( std::string &str );
+Expression * build_constantFloat( std::string &str );
+Expression * build_constantChar( std::string &str );
+ConstantExpr * build_constantStr( std::string &str );
 Expression * build_field_name_FLOATINGconstant( const std::string & str );
 Expression * build_field_name_fraction_constants( Expression * fieldName, ExpressionNode * fracts );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision cccc5343be3778f0211640c87d33b28512f4fcce)
+++ src/Parser/lex.ll	(revision 51c63533f5e27f31fa1953e7742617d789a57ed5)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Wed Aug 30 17:35:21 2017
- * Update Count     : 584
+ * Last Modified On : Thu Aug 31 21:30:10 2017
+ * Update Count     : 598
  */
 
@@ -57,4 +57,12 @@
 	yyleng = 0;
 	for ( int i = 0; yytext[i] != '\0'; i += 1 ) {
+		if ( yytext[i] == '`' ) {
+			// copy user suffix
+			for ( ; yytext[i] != '\0'; i += 1 ) {
+				yytext[yyleng] = yytext[i];
+				yyleng += 1;
+			} // for
+			break;
+		} // if
 		if ( yytext[i] != '_' ) {
 			yytext[yyleng] = yytext[i];
@@ -81,31 +89,33 @@
 attr_identifier "@"{identifier}
 
+user_suffix_opt ("`"{identifier})?
+
 				// numeric constants, CFA: '_' in constant
 hex_quad {hex}("_"?{hex}){3}
-integer_suffix "_"?(([uU](("ll"|"LL"|[lL])[iI]|[iI]?("ll"|"LL"|[lL])?))|([iI](("ll"|"LL"|[lL])[uU]|[uU]?("ll"|"LL"|[lL])?))|(("ll"|"LL"|[lL])([iI][uU]|[uU]?[iI]?)))
+integer_suffix_opt ("_"?(([uU](("ll"|"LL"|[lL])[iI]|[iI]?("ll"|"LL"|[lL])?))|([iI](("ll"|"LL"|[lL])[uU]|[uU]?("ll"|"LL"|[lL])?))|(("ll"|"LL"|[lL])([iI][uU]|[uU]?[iI]?))))?
 
 octal_digits ({octal})|({octal}({octal}|"_")*{octal})
 octal_prefix "0""_"?
-octal_constant (("0")|({octal_prefix}{octal_digits})){integer_suffix}?
+octal_constant (("0")|({octal_prefix}{octal_digits})){integer_suffix_opt}{user_suffix_opt}
 
 nonzero_digits ({nonzero})|({nonzero}({decimal}|"_")*{decimal})
-decimal_constant {nonzero_digits}{integer_suffix}?
+decimal_constant {nonzero_digits}{integer_suffix_opt}{user_suffix_opt}
 
 hex_digits ({hex})|({hex}({hex}|"_")*{hex})
 hex_prefix "0"[xX]"_"?
-hex_constant {hex_prefix}{hex_digits}{integer_suffix}?
-
+hex_constant {hex_prefix}{hex_digits}{integer_suffix_opt}{user_suffix_opt}
+
+				// GCC: D (double) and iI (imaginary) suffixes, and DL (long double)
+floating_suffix_opt ("_"?([fFdDlL][iI]?|[iI][lLfFdD]?|"DL"))?
 decimal_digits ({decimal})|({decimal}({decimal}|"_")*{decimal})
-real_decimal {decimal_digits}"."{exponent}?{floating_suffix}?
-real_fraction "."{decimal_digits}{exponent}?{floating_suffix}?
+real_decimal {decimal_digits}"."{exponent}?{floating_suffix_opt}{user_suffix_opt}
+real_fraction "."{decimal_digits}{exponent}?{floating_suffix_opt}{user_suffix_opt}
 real_constant {decimal_digits}{real_fraction}
 exponent "_"?[eE]"_"?[+-]?{decimal_digits}
-				// GCC: D (double) and iI (imaginary) suffixes, and DL (long double)
-floating_suffix "_"?([fFdDlL][iI]?|[iI][lLfFdD]?|"DL")
-floating_constant (({real_constant}{exponent}?)|({decimal_digits}{exponent})){floating_suffix}?
+floating_constant (({real_constant}{exponent}?)|({decimal_digits}{exponent})){floating_suffix_opt}{user_suffix_opt}
 
 binary_exponent "_"?[pP]"_"?[+-]?{decimal_digits}
 hex_fractional_constant ({hex_digits}?"."{hex_digits})|({hex_digits}".")
-hex_floating_constant {hex_prefix}(({hex_fractional_constant}{binary_exponent})|({hex_digits}{binary_exponent})){floating_suffix}?
+hex_floating_constant {hex_prefix}(({hex_fractional_constant}{binary_exponent})|({hex_digits}{binary_exponent})){floating_suffix_opt}
 
 				// character escape sequence, GCC: \e => esc character
@@ -308,5 +318,5 @@
 ({cwide_prefix}[_]?)?['] { BEGIN QUOTE; rm_underscore(); strtext = new string( yytext, yyleng ); }
 <QUOTE>[^'\\\n]* { strtext->append( yytext, yyleng ); }
-<QUOTE>['\n]	{ BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(CHARACTERconstant); }
+<QUOTE>['\n]{user_suffix_opt}	{ BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(CHARACTERconstant); }
 				/* ' stop highlighting */
 
@@ -314,5 +324,5 @@
 ({swide_prefix}[_]?)?["] { BEGIN STRING; rm_underscore(); strtext = new string( yytext, yyleng ); }
 <STRING>[^"\\\n]* { strtext->append( yytext, yyleng ); }
-<STRING>["\n]	{ BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(STRINGliteral); }
+<STRING>["\n]{user_suffix_opt}	{ BEGIN 0; strtext->append( yytext, yyleng ); RETURN_STR(STRINGliteral); }
 				/* " stop highlighting */
 
@@ -387,5 +397,6 @@
 {op_unary}"?"	{ IDENTIFIER_RETURN(); }				// unary
 "?"({op_unary_pre_post}|"()"|"[?]"|"{}") { IDENTIFIER_RETURN(); }
-"^?{}" { IDENTIFIER_RETURN(); }
+"^?{}"			{ IDENTIFIER_RETURN(); }
+"?`"{identifier} { IDENTIFIER_RETURN(); }				// unit operator
 "?"{op_binary_over}"?"	{ IDENTIFIER_RETURN(); }		// binary
 	/*
