private static void ReadString(LineReader reader, TokenCollector collector) { int stringStartLineNumber = reader.LineNumber; reader.Next(out char?character, out bool wasEscaped); while (character != null) { if (!wasEscaped && character == SpecialCharacters.stringChar) { return; } collector.AddToken(ETokenType.StringValue, character.Value, stringStartLineNumber); reader.Next(out character, out wasEscaped); } throw new InvalidDataException($"Quoted string opened on line {stringStartLineNumber} but was never closed!"); }
public static IEnumerable <ConfigNode> Tokenize(LineReader lineReader) { TokenCollector collector = new TokenCollector(); lineReader.Next(out char?character, out bool wasEscaped); while (character != null) { if (HandleCommonCharacters(lineReader, character, wasEscaped, collector)) { // already handled, do nothing } else if (character == '/') { lineReader.Next(out character, out wasEscaped); if (character == '/' && !wasEscaped) { ReadSingleLineComment(lineReader); } else if (character == '*' && !wasEscaped) { ReadRangedComment(lineReader); } else { collector.AddToken(ETokenType.StringValue, '/', lineReader.LineNumber); if (HandleCommonCharacters(lineReader, character, wasEscaped, collector)) { // already handled, do nothing } else { //Debug.Assert(character != null, nameof(character) + " != null"); collector.AddToken(ETokenType.StringValue, character.Value, lineReader.LineNumber); } } } else { collector.AddToken(ETokenType.StringValue, character.Value, lineReader.LineNumber); } lineReader.Next(out character, out wasEscaped); } return(collector.GetConfigNodes()); }
private static bool HandleCommonCharacters(LineReader reader, char?currentChar, bool wasEscaped, TokenCollector collector) { if (currentChar == null) { return(true); } if (wasEscaped) { collector.AddToken(ETokenType.StringValue, currentChar.Value, reader.LineNumber); return(true); } if (char.IsWhiteSpace(currentChar.Value)) { return(true); } if (currentChar == SpecialCharacters.stringChar) { ReadString(reader, collector); return(true); } if (currentChar == SpecialCharacters.objectDepth) { collector.AddToken(ETokenType.ObjectDepth, currentChar.Value, reader.LineNumber); return(true); } if (currentChar == SpecialCharacters.valueAssignment || currentChar == SpecialCharacters.objectAssignment) { collector.AddToken(ETokenType.Assignment, currentChar.Value, reader.LineNumber); return(true); } if (currentChar == SpecialCharacters.nullChar) { collector.AddNullToken(reader.LineNumber); return(true); } return(false); }