public static System.Collections.Generic.IEnumerable ReadWord( System.String input ) { input ??= System.String.Empty; var inlen = input.Length; System.Int32 start = 0; System.Int32 stop; System.Func substr = null; do { while ( ( start < inlen ) && System.Char.IsWhiteSpace( input[ start ] ) ) { start++; } if ( start == inlen ) { yield break; } else if ( '(' == input[ start ] ) { stop = ReadString( input, start ); substr = ( a, b, c ) => UnescapeString( a.Substring( b, c - b ) ); } else { stop = ReadWord( input, start ); substr = ( a, b, c ) => a.Substring( b, c - b ); } if ( start == stop ) { yield break; } else { yield return substr( input, start, stop - start ); } start = stop; } while ( start < inlen ); yield break; } private static System.String UnescapeString( System.String input ) { var sb = new System.Text.StringBuilder( input.Length ); System.Int32 i = -1; System.Char c; while ( ++i < input.Length ) { c = input[ i ]; if ( '\\' == c ) { switch ( input[ ++i ] ) { case '0': c = '\0'; break; case 'a': c = '\a'; break; case 'b': c = '\b'; break; case 'f': c = '\f'; break; case 'r': c = '\r'; break; case 'n': c = '\n'; break; case 't': c = '\t'; break; case 'v': c = '\v'; break; default: c = input[ i ]; break; } } sb = sb.Append( c ); } return sb.ToString(); } private static System.Int32 ReadWord( System.String input, System.Int32 pos ) { var inlen = input.Length; while ( ( pos < inlen ) && !System.Char.IsWhiteSpace( input[ pos ] ) ) { pos++; } return pos; } private static System.Int32 ReadString( System.String input, System.Int32 pos ) { var inlen = input.Length; while ( ( pos < inlen ) && ( ')' != input[ pos ] ) ) { if ( '\\' == input[ pos ] ) { pos++; } pos++; } pos++; if ( inlen < pos ) { throw new System.InvalidOperationException( "Unterminated string" ); } return pos; }