private static Token ContinueReadingComment(StringCodeReader charStream, bool forgive) { char ch; if ((ch = (char)charStream.Read()) != '/') { var e = new UnexpectedCharacterException(charStream.LineNo, charStream.Col - 1, "beginning of any token", ch); PardonOrDeath(e, forgive); return(FailureToken); } var sb = new StringBuilder(); while (true) { var chVal = charStream.Read(); if (chVal < 0) { var e = new UnexpectedCharacterException( charStream.LineNo, charStream.Col, "continuation of comment", (char)0); PardonOrDeath(e, forgive); return(FailureToken); } ch = (char)chVal; if (IsLineSeparator(ch)) { break; } sb.Append(ch); } return(new Token(TokenType.Comment, sb.ToString())); }
private static bool RunTestPair(string input, string expected) { var sb = new StringBuilder(); using (var reader = new StringCodeReader(input)) { int ch; while (true) { ch = reader.Read(); if (ch < 0) { break; } sb.Append((char)ch); } } string got = sb.ToString(); bool ok = String.Equals(expected, got); Trace.WriteLine(ok ? "Test passed:" : "Test failed:\n"); Console.WriteLine("Expecting"); Console.WriteLine(expected); Console.WriteLine("\nGot"); Console.WriteLine(got.Replace("\n", "[\\n]\n")); Console.WriteLine("\n\n"); return(ok); }
private static Token ContinueReadingNakedStringToken(StringCodeReader charStream, char firstChar, bool forgive) { var sb = new StringBuilder(); sb.Append(firstChar); char ch; while (true) { var chVal = charStream.Read(); if (chVal < 0) { var e = new UnexpectedCharacterException( charStream.LineNo, charStream.Col, "continuation of naked string (or decimal)", (char)0); PardonOrDeath(e, forgive); return(FailureToken); } ch = (char)chVal; if (char.IsWhiteSpace((ch))) { break; } sb.Append(ch); } return(new Token(TokenType.NakedString, sb.ToString())); }
private static Token ContinueReadingStringToken(StringCodeReader charStream, bool forgive) { var escaping = false; var openedQuote = false; var sb = new StringBuilder(); while (true) { var chVal = charStream.Read(); if (chVal < 0) { var e = new UnexpectedCharacterException( charStream.LineNo, charStream.Col, "continuation of string literal", (char)0); PardonOrDeath(e, forgive); return(FailureToken); } var ch = (char)chVal; if (escaping) { ReadEscapedChar(ch, sb); escaping = false; } else if (ch == '"') { if (openedQuote) { sb.Append('"'); openedQuote = false; } else { var chPeek = (char)charStream.Peek(); if (char.IsWhiteSpace(chPeek)) { return(new Token(TokenType.StringType, sb.ToString())); } else { openedQuote = true; sb.Append('"'); } } } else if (ch == '\\') { escaping = true; } else { sb.Append(ch); } } }
public void TestMethod5() { using (var reader = new StringCodeReader("123\n\n 456")) { while (true) { int ch = reader.Peek(); int chr = reader.Read(); Console.Write((ch == chr) ? "1" : String.Format("||{0}|{1}||", ch, chr)); Assert.IsTrue(ch == chr); if (ch < 0 || chr < 0) { break; } } // Getting output? // https://www.codeproject.com/Articles/501610/Getting-Console-Output-Within-A-Unit-Test // No, this. // https://stackoverflow.com/questions/4786884/how-to-write-output-from-a-unit-test#comment100863043_13532856 Console.WriteLine(""); } }
public static Token NextToken(StringCodeReader charStream, bool forgive) { // Assuming no emoji. // May need this later? // https://stackoverflow.com/questions/32895131/how-to-compare-and-convert-emoji-characters-in-c-sharp char ch; do { var chVal = charStream.Read(); if (chVal < 0) { return(EofToken); } ch = (char)chVal; } while (char.IsWhiteSpace(ch)); switch (ch) { case '{': return(LstBeginToken); case '}': return(LstEndToken); case '"': return(ContinueReadingStringToken(charStream, forgive)); case '/': return(ContinueReadingComment(charStream, forgive)); default: if (char.IsLetterOrDigit(ch)) { return(ContinueReadingNakedStringToken(charStream, ch, forgive)); } var e = new UnexpectedCharacterException( charStream.LineNo, charStream.Col, "beginning of any token", ch); PardonOrDeath(e, forgive); return(FailureToken); } }