Ejemplo n.º 1
0
        public void ArrayPeekEnumerator_ShouldWorkForTwoElements()
        {
            var data       = new int[] { 1, 2 };
            var enumerator = new ArrayPeekEnumerator <int>(data);

            Assert.IsTrue(enumerator.TryPeek(out var first));
            Assert.AreEqual(1, first);

            Assert.IsTrue(enumerator.TryPeek2(out first, out var second));
            Assert.AreEqual(1, first);
            Assert.AreEqual(2, second);

            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(1, enumerator.Current);

            Assert.IsTrue(enumerator.TryPeek(out second));
            Assert.IsFalse(enumerator.TryPeek2(out _, out _));
            Assert.AreEqual(2, second);

            Assert.IsTrue(enumerator.MoveNext());
            Assert.AreEqual(2, enumerator.Current);

            Assert.IsFalse(enumerator.TryPeek(out _));
            Assert.IsFalse(enumerator.MoveNext());
        }
Ejemplo n.º 2
0
        public void ArrayPeekEnumerator_ShouldWorkForEmptyEnumerator()
        {
            var data       = new int[0];
            var enumerator = new ArrayPeekEnumerator <int>(data);

            Assert.IsFalse(enumerator.TryPeek(out _));
            Assert.IsFalse(enumerator.TryPeek2(out _, out _));
            Assert.IsFalse(enumerator.MoveNext());
            Assert.IsFalse(enumerator.TryPeek(out _));
            Assert.IsFalse(enumerator.TryPeek2(out _, out _));
        }
Ejemplo n.º 3
0
        protected void Recover(Action code, TokenKind syncTokenKind, string syncTokenText = null)
        {
            recoveryScopes_.Push(new ErrorRecoveryScope(syncTokenKind, syncTokenText));

            try
            {
                code();
            }
            catch (ErrorRecoveryException e) when(e.Scope == recoveryScopes_.Peek())
            {
            }
            catch (NotImplementedException e)
            {
                EmitError(string.Format(Errors.NotImplemented, e.Message));

                while (enumerator_.TryPeek(out var token))
                {
                    if (CanRecoverInParentScope(token.Kind, token.Text, out var scope))
                    {
                        if (scope == recoveryScopes_.Peek())
                        {
                            return;
                        }
                        else
                        {
                            throw new ErrorRecoveryException(scope);
                        }
                    }

                    enumerator_.MoveNext();
                }

                throw new ParsingException(Errors.UnexpectedEndOfFile, Span.Empty);
            }
            finally
            {
                recoveryScopes_.Pop();
            }
        }