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