public void PeekBeforeRead()
        {
            var enumerator           = "1234".GetEnumerator();
            PeekBuffer <char> buffer = new PeekBuffer <char>(enumerator);

            Assert.IsTrue(buffer.TryPeek(out var item));
            Assert.AreEqual('1', item);
            Assert.IsTrue(buffer.TryPeek(1, out item));
            Assert.AreEqual('2', item);

            Assert.IsTrue(buffer.TryRead(out item));
            Assert.AreEqual('1', item);
            Assert.IsTrue(buffer.TryRead(out item));
            Assert.AreEqual('2', item);

            Assert.IsTrue(buffer.TryPeek(out item));
            Assert.AreEqual('3', item);
            Assert.IsTrue(buffer.TryPeek(1, out item));
            Assert.AreEqual('4', item);

            Assert.IsTrue(buffer.TryRead(out item));
            Assert.AreEqual('3', item);
            Assert.IsTrue(buffer.TryRead(out item));
            Assert.AreEqual('4', item);
        }
        public void TryPeek_Sequential()
        {
            var enumerator           = "123".GetEnumerator();
            PeekBuffer <char> buffer = new PeekBuffer <char>(enumerator);

            Assert.IsTrue(buffer.TryPeek(0, out var peeked));
            Assert.AreEqual('1', peeked);
            Assert.IsTrue(buffer.TryPeek(1, out peeked));
            Assert.AreEqual('2', peeked);
            Assert.IsTrue(buffer.TryPeek(2, out peeked));
            Assert.AreEqual('3', peeked);
        }
        public void TryPeek_OutOfOrder()
        {
            var enumerator           = "ABC".GetEnumerator();
            PeekBuffer <char> buffer = new PeekBuffer <char>(enumerator);

            Assert.IsTrue(buffer.TryPeek(0, out var peeked));
            Assert.AreEqual('A', peeked);
            Assert.IsTrue(buffer.TryPeek(2, out peeked));
            Assert.AreEqual('C', peeked);
            Assert.IsTrue(buffer.TryPeek(1, out peeked));
            Assert.AreEqual('B', peeked);
        }
Beispiel #4
0
 public bool CheckToken(PeekBuffer <char> buffer)
 {
     return(buffer.TryPeek(out var first) &&
            buffer.TryPeek(1, out var second) &&
            first == second &&
            first == '/');
 }
        public void TryPeek_NegativeIndex()
        {
            var enumerator           = "1".GetEnumerator();
            PeekBuffer <char> buffer = new PeekBuffer <char>(enumerator);

            buffer.TryPeek(-1, out char _);
        }
Beispiel #6
0
        public ProductionInfo ReadProduction(PeekBuffer <TokenInfo> tokenStream)
        {
            StringBuilder data = new StringBuilder();

            tokenStream.TryRead(out var nameToken);
            tokenStream.TryRead(out _);
            data.Append(nameToken.Data.ToString());
            data.Append("(");

            while (tokenStream.TryPeek(out var next))
            {
                if (next.Type == TokenType.RightParen)
                {
                    tokenStream.TryRead(out _);
                    data.Append(")");
                    return(new ProductionInfo(data.ToString()));
                }

                // Read next token
                if (!ExpressionReader.FirstToken(next))
                {
                    return(null);
                }
                if (!ExpressionReader.IsProduction(tokenStream))
                {
                    return(null);
                }
                var expression = ExpressionReader.ReadProduction(tokenStream);

                if (expression == null)
                {
                    return(null);
                }
                data.Append(expression.Data);

                // The token after an expression should be comma or right-paren
                if (!tokenStream.TryPeek(out next))
                {
                    return(null);
                }
                if (next.Type == TokenType.RightParen)
                {
                    continue;
                }
                if (next.Type == TokenType.Comma)
                {
                    tokenStream.TryRead(out _);
                }
            }

            return(null);
        }
Beispiel #7
0
 public bool IsProduction(PeekBuffer <TokenInfo> tokenStream, int index = 0)
 {
     return(tokenStream.TryPeek(index++, out var first) && first.Type == TokenType.Name &&
            tokenStream.TryPeek(index, out var second) && second.Type == TokenType.LeftParen);
 }