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); }
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 _); }
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); }
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); }