Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision f4b77f2c2ec31137962516eadcbdd520492365d2)
+++ src/Parser/parser.yy	(revision 15697ff2cea5b95e24623fd3a88b522ada953853)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Sep 10 10:07:10 2017
-// Update Count     : 2752
+// Last Modified On : Mon Sep 11 08:22:25 2017
+// Update Count     : 2783
 //
 
@@ -43,4 +43,5 @@
 #define YYDEBUG_LEXER_TEXT (yylval)						// lexer loads this up each time
 #define YYDEBUG 1										// get the pretty debugging code to compile
+#define YYERROR_VERBOSE
 
 #undef __GNUC_MINOR__
@@ -62,7 +63,27 @@
 stack< LinkageSpec::Spec > linkageStack;
 
-void appendStr( string *to, string *from ) {
-	// "abc" "def" "ghi" => "abcdefghi", remove new text from quotes and insert before last quote in old string.
-	to->insert( to->length() - 1, from->substr( 1, from->length() - 2 ) );
+bool appendStr( string & to, string & from ) {
+	// 1. Multiple strings are concatenated into a single string but not combined internally. The reason is that
+	//    "\x12" "3" is treated as 2 characters versus 3 because "escape sequences are converted into single members of
+	//    the execution character set just prior to adjacent string literal concatenation" (C11, Section 6.4.5-8). It is
+	//    easier to let the C compiler handle this case.
+	//
+	// 2. String encodings are transformed into canonical form (one encoding at start) so the encoding can be found
+	//    without searching the string, e.g.: "abc" L"def" L"ghi" => L"abc" "def" "ghi". Multiple encodings must match,
+	//    i.e., u"a" U"b" L"c" is disallowed.
+
+	if ( from[0] != '"' ) {								// encoding ?
+		if ( to[0] != '"' ) {							// encoding ?
+			if ( to[0] != from[0] ) {					// different encodings ?
+				yyerror( "non-matching string encodings for string-literal concatenation" );
+				return false;							// parse error, must call YYERROR in action
+			} // if
+		} else {
+			to = from[0] + to;							// move encoding to start
+		} // if
+		from.erase( 0, 1 );								// remove 2nd encoding
+	} // if
+	to += " " + from;									// concatenated into single string
+	return true;
 } // appendStr
 
@@ -88,4 +109,6 @@
 bool forall = false;									// aggregate have one or more forall qualifiers ?
 %}
+
+%define parse.error verbose
 
 // Types declaration
@@ -391,5 +414,5 @@
 	| string_literal_list STRINGliteral
 		{
-			appendStr( $1, $2 );						// append 2nd juxtaposed string to 1st
+			if ( ! appendStr( *$1, *$2 ) ) YYERROR;		// append 2nd juxtaposed string to 1st
 			delete $2;									// allocated by lexer
 			$$ = $1;									// conversion from tok to str
