protected internal bool Balance(BalancingModes mode)
        {
            TSymbolType    left  = CurrentSymbol.Type;
            TSymbolType    right = Language.FlipBracket(left);
            SourceLocation start = CurrentLocation;

            AcceptAndMoveNext();
            if (EndOfFile && !mode.HasFlag(BalancingModes.NoErrorOnFailure))
            {
                Context.OnError(start,
                                RazorResources.ParseError_Expected_CloseBracket_Before_EOF,
                                Language.GetSample(left),
                                Language.GetSample(right));
            }

            return(Balance(mode, left, right, start));
        }
예제 #2
0
        protected internal bool Balance(BalancingModes mode)
        {
            var left  = CurrentSymbol.Type;
            var right = Language.FlipBracket(left);
            var start = CurrentLocation;

            AcceptAndMoveNext();
            if (EndOfFile && ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure))
            {
                Context.OnError(start,
                                RazorResources.FormatParseError_Expected_CloseBracket_Before_EOF(
                                    Language.GetSample(left),
                                    Language.GetSample(right)));
            }

            return(Balance(mode, left, right, start));
        }
        protected internal bool Balance(BalancingModes mode)
        {
            var left  = CurrentToken.Type;
            var right = Language.FlipBracket(left);
            var start = CurrentStart;

            AcceptAndMoveNext();
            if (EndOfFile && ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure))
            {
                Context.ErrorSink.OnError(
                    RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
                        new SourceSpan(start, contentLength: 1 /* { OR } */),
                        Language.GetSample(left),
                        Language.GetSample(right)));
            }

            return(Balance(mode, left, right, start));
        }
        protected internal bool Balance(BalancingModes mode, TTokenType left, TTokenType right, SourceLocation start)
        {
            var startPosition = CurrentStart.AbsoluteIndex;
            var nesting       = 1;

            if (!EndOfFile)
            {
                var syms = new List <TToken>();
                do
                {
                    if (IsAtEmbeddedTransition(
                            (mode & BalancingModes.AllowCommentsAndTemplates) == BalancingModes.AllowCommentsAndTemplates,
                            (mode & BalancingModes.AllowEmbeddedTransitions) == BalancingModes.AllowEmbeddedTransitions))
                    {
                        Accept(syms);
                        syms.Clear();
                        HandleEmbeddedTransition();

                        // Reset backtracking since we've already outputted some spans.
                        startPosition = CurrentStart.AbsoluteIndex;
                    }
                    if (At(left))
                    {
                        nesting++;
                    }
                    else if (At(right))
                    {
                        nesting--;
                    }
                    if (nesting > 0)
                    {
                        syms.Add(CurrentToken);
                    }
                }while (nesting > 0 && NextToken());

                if (nesting > 0)
                {
                    if ((mode & BalancingModes.NoErrorOnFailure) != BalancingModes.NoErrorOnFailure)
                    {
                        Context.ErrorSink.OnError(
                            RazorDiagnosticFactory.CreateParsing_ExpectedCloseBracketBeforeEOF(
                                new SourceSpan(start, contentLength: 1 /* { OR } */),
                                Language.GetSample(left),
                                Language.GetSample(right)));
                    }
                    if ((mode & BalancingModes.BacktrackOnFailure) == BalancingModes.BacktrackOnFailure)
                    {
                        Context.Source.Position = startPosition;
                        NextToken();
                    }
                    else
                    {
                        Accept(syms);
                    }
                }
                else
                {
                    // Accept all the tokens we saw
                    Accept(syms);
                }
            }
            return(nesting == 0);
        }
        protected internal bool Balance(
            BalancingModes mode,
            TSymbolType left,
            TSymbolType right,
            SourceLocation start
            )
        {
            int startPosition = CurrentLocation.AbsoluteIndex;
            int nesting       = 1;

            if (!EndOfFile)
            {
                IList <TSymbol> syms = new List <TSymbol>();
                do
                {
                    if (
                        IsAtEmbeddedTransition(
                            mode.HasFlag(BalancingModes.AllowCommentsAndTemplates),
                            mode.HasFlag(BalancingModes.AllowEmbeddedTransitions)
                            )
                        )
                    {
                        Accept(syms);
                        syms.Clear();
                        HandleEmbeddedTransition();

                        // Reset backtracking since we've already outputted some spans.
                        startPosition = CurrentLocation.AbsoluteIndex;
                    }
                    if (At(left))
                    {
                        nesting++;
                    }
                    else if (At(right))
                    {
                        nesting--;
                    }
                    if (nesting > 0)
                    {
                        syms.Add(CurrentSymbol);
                    }
                } while (nesting > 0 && NextToken());

                if (nesting > 0)
                {
                    if (!mode.HasFlag(BalancingModes.NoErrorOnFailure))
                    {
                        Context.OnError(
                            start,
                            RazorResources.ParseError_Expected_CloseBracket_Before_EOF,
                            Language.GetSample(left),
                            Language.GetSample(right)
                            );
                    }
                    if (mode.HasFlag(BalancingModes.BacktrackOnFailure))
                    {
                        Context.Source.Position = startPosition;
                        NextToken();
                    }
                    else
                    {
                        Accept(syms);
                    }
                }
                else
                {
                    // Accept all the symbols we saw
                    Accept(syms);
                }
            }
            return(nesting == 0);
        }