private static Token ParseString(Reader reader, char quote) { Debug.Assert(reader != null); // // TODO Support full string syntax! // // string {string1}|{string2} // string1 \"([^\n\r\f\\"]|\\{nl}|{nonascii}|{escape})*\" // string2 \'([^\n\r\f\\']|\\{nl}|{nonascii}|{escape})*\' // nonascii [^\0-\177] // escape {unicode}|\\[^\n\r\f0-9a-f] // unicode \\[0-9a-f]{1,6}(\r\n|[ \n\r\t\f])? // var strpos = reader.Position; reader.MarkFromNext(); // skipping quote char? ch; StringBuilder sb = null; while ((ch = reader.Read()) != quote) { if (ch == null) throw new FormatException(string.Format("Unterminated string at position {0}.", strpos)); if (ch == '\\') { ch = reader.Read(); // // NOTE: Only escaping of quote and backslash supported! // if (ch != quote && ch != '\\') throw new FormatException(string.Format("Invalid escape sequence at position {0} in a string at position {1}.", reader.Position, strpos)); if (sb == null) sb = new StringBuilder(); sb.Append(reader.MarkedExceptLast()); reader.Mark(); } } var text = reader.Marked(); if (sb != null) text = sb.Append(text).ToString(); return Token.String(text); }