Exemplo n.º 1
0
            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);
        }
Exemplo n.º 3
0
            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()));
            }
Exemplo n.º 4
0
            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("");
     }
 }
Exemplo n.º 6
0
            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);
                }
            }