Example #1
0
        private void CompareListToPeekableEnumerator(List <string> list, IPeekableEnumerator <string> enumerator)
        {
            Assert.AreEqual(list[0], enumerator.PeekNext);
            Assert.IsNull(enumerator.Current);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(list[0], enumerator.Current);
            Assert.AreEqual(list[0], ((IEnumerator)enumerator).Current);
            Assert.AreEqual(list[1], enumerator.PeekNext);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(list[2], enumerator.PeekNext);
            Assert.AreEqual(list[1], enumerator.Current);
            Assert.IsTrue(enumerator.MoveNext());
            Assert.IsNull(enumerator.PeekNext);
            Assert.AreEqual(list[2], enumerator.Current);
            Assert.IsFalse(enumerator.MoveNext());
            Assert.IsNull(enumerator.Current);
            Assert.IsNull(enumerator.PeekNext);

            try
            {
                enumerator.Reset();
                Assert.IsNull(enumerator.Current);
                Assert.AreEqual(list[0], enumerator.PeekNext);
                Assert.IsTrue(enumerator.MoveNext());
                Assert.AreEqual(list[0], enumerator.Current);
            }
            catch (System.NotSupportedException)
            {
                // ignore if enumerator.Reset() is unavailable
            }
        }
Example #2
0
        private IStatement ParseLetStatement(IPeekableEnumerator <Token> tokens)
        {
            if (ExpectTokenAndAdvance(tokens, Token.Tokens.Let) == null)
            {
                return(null);
            }

            var identifierToken = ExpectTokenAndAdvance(tokens, Token.Tokens.Ident);

            if (identifierToken == null)
            {
                return(null);
            }
            var identifier = new Identifier(identifierToken.Literal);

            if (ExpectTokenAndAdvance(tokens, Token.Tokens.Assign) == null)
            {
                return(null);
            }

            // TODO: parse expression
            while (tokens.MoveNext())
            {
                if (tokens.Current.Type == Token.Tokens.Semicolon)
                {
                    return(new LetStatement(identifier, null));
                }
            }

            return(null);
        }
Example #3
0
        private Token ExpectTokenAndAdvance(IPeekableEnumerator <Token> tokens, Token.Tokens ident)
        {
            var currentToken = tokens.Current;

            if (currentToken?.Type != ident)
            {
                AddError(string.Format("expected {0}, got {1} instead",
                                       ident,
                                       currentToken?.ToString() ?? "<EOF>"));
                return(null);
            }

            tokens.MoveNext();
            return(currentToken);
        }
Example #4
0
        private IStatement ParseExpressionStatement(IPeekableEnumerator <Token> tokens)
        {
            var expression = _expressionParser.ParseExpression(tokens, Precedence.Lowest);

            if (expression == null)
            {
                return(null);
            }

            var statement = new ExpressionStatement(expression);

            if (tokens.PeekNext?.Type == Token.Tokens.Semicolon)
            {
                tokens.MoveNext();
            }

            return(statement);
        }
Example #5
0
        private IStatement ParseReturnStatement(IPeekableEnumerator <Token> tokens)
        {
            if (ExpectTokenAndAdvance(tokens, Token.Tokens.Return) == null)
            {
                return(null);
            }

            // TODO: parse expression
            while (tokens.MoveNext())
            {
                if (tokens.Current.Type == Token.Tokens.Semicolon)
                {
                    return(new ReturnStatement(null));
                }
            }

            return(null);
        }
Example #6
0
 // IEnumerator
 public bool MoveNext() => _with.MoveNext();