示例#1
0
        /// <summary>
        /// Incrementally lexes and parses the specified string.
        /// </summary>
        private IncrementalResult ParseIncremental <TSource>(TSource input, Int32 start, Int32 count, TextParserTokenStream output, TextParserOptions options = TextParserOptions.None)
            where TSource : ISegmentableStringSource
        {
            var inputLengthOld  = output.SourceText.Length;
            var inputLengthNew  = input.Length;
            var inputLengthDiff = inputLengthNew - inputLengthOld;

            Int32 ix1, ix2;

            FindTokensInfluencedBySubstring(output, start, count - inputLengthDiff, out ix1, out ix2);

            var token1 = output[ix1];
            var token2 = output[ix2];

            var invalidatedTokenCount = 1 + (ix2 - ix1);

            output.RemoveRange(ix1, invalidatedTokenCount);

            var lexStart     = token1.SourceOffset;
            var lexCount     = inputLengthDiff + (token2.SourceOffset + token2.SourceLength) - lexStart;
            var parserBuffer = incrementalParserBuffer.Value;

            Parse(input, parserBuffer, lexStart, lexCount);

            output.SourceText = input.CreateStringSegment();
            output.InsertRange(ix1, parserBuffer);

            var affectedOffset = ix1;
            var affectedCount  = parserBuffer.Count;

            parserBuffer.Clear();

            return(new IncrementalResult(affectedOffset, affectedCount));
        }