@@ -16,13 +16,14 @@ internal class AnnotatedParserFinder<TInput> : ParserVisitor<TInput, int, int>
1616 {
1717 private Source < TInput > _source ;
1818 private readonly int _findOffset ;
19- private readonly List < Parser < TInput > > _path ;
19+ private readonly List < ParserAndIndex < TInput > > _path ;
2020 private readonly List < Parser < TInput > > _results ;
2121 private readonly List < ParserPath < TInput > > _pathResults ;
2222 private bool _prevWasMissing ;
2323 private int _missingCount ;
2424 private int _listMissingCount ;
2525
26+
2627 private AnnotatedParserFinder (
2728 Source < TInput > source ,
2829 int findOffset ,
@@ -31,7 +32,7 @@ private AnnotatedParserFinder(
3132 _source = source ;
3233 _findOffset = findOffset ;
3334 _prevWasMissing = false ;
34- _path = new List < Parser < TInput > > ( ) ;
35+ _path = new List < ParserAndIndex < TInput > > ( ) ;
3536 _results = new List < Parser < TInput > > ( ) ;
3637 _pathResults = paths ;
3738 }
@@ -42,7 +43,7 @@ private AnnotatedParserFinder(
4243 public static IReadOnlyList < Parser < TInput > > FindParsers ( Source < TInput > source , int findOffset , Parser < TInput > root , int start )
4344 {
4445 var finder = new AnnotatedParserFinder < TInput > ( source , findOffset , null ) ;
45- finder . Find ( root , start ) ;
46+ finder . Find ( root , 0 , start ) ;
4647 return finder . _results ;
4748 }
4849
@@ -53,14 +54,14 @@ public static IReadOnlyList<ParserPath<TInput>> FindPaths(Source<TInput> source,
5354 {
5455 var paths = new List < ParserPath < TInput > > ( ) ;
5556 var finder = new AnnotatedParserFinder < TInput > ( source , findOffset , paths ) ;
56- finder . Find ( root , start ) ;
57+ finder . Find ( root , 0 , start ) ;
5758 return paths ;
5859 }
5960
6061 private const int MaxDepth = 400 ;
6162 private int _depth ;
6263
63- private int Find ( Parser < TInput > parser , int start )
64+ private int Find ( Parser < TInput > parser , int indexInParent , int start )
6465 {
6566 if ( _depth >= MaxDepth )
6667 {
@@ -74,7 +75,7 @@ private int Find(Parser<TInput> parser, int start)
7475 int len ;
7576
7677 // add parser to path
77- _path . Add ( parser ) ;
78+ _path . Add ( new ParserAndIndex < TInput > ( parser , indexInParent ) ) ;
7879
7980 if ( parser . IsHidden )
8081 {
@@ -117,15 +118,15 @@ private int Find(Parser<TInput> parser, int start)
117118
118119 public override int VisitApply < TLeft , TOutput > ( ApplyParser < TInput , TLeft , TOutput > parser , int start )
119120 {
120- var leftLen = Find ( parser . LeftParser , start ) ;
121+ var leftLen = Find ( parser . LeftParser , 0 , start ) ;
121122 if ( leftLen < 0 )
122123 {
123124 return leftLen ;
124125 }
125126
126127 while ( true )
127128 {
128- var rightLen = Find ( parser . RightParser , start + leftLen ) ;
129+ var rightLen = Find ( parser . RightParser , 1 , start + leftLen ) ;
129130 if ( rightLen < 0 )
130131 {
131132 if ( parser . ApplyKind == ApplyKind . One )
@@ -177,7 +178,7 @@ private int VisitFirstOrBest(IReadOnlyList<Parser<TInput>> parsers, int start, b
177178 _prevWasMissing = oldPrevWasMissing ;
178179 _missingCount = oldMissingCount ;
179180
180- n = Find ( p , start ) ;
181+ n = Find ( p , i , start ) ;
181182
182183 if ( i == 0 )
183184 {
@@ -207,7 +208,7 @@ private int VisitFirstOrBest(IReadOnlyList<Parser<TInput>> parsers, int start, b
207208
208209 public override int VisitConvert < TOutput > ( ConvertParser < TInput , TOutput > parser , int start )
209210 {
210- return Find ( parser . Pattern , start ) ;
211+ return Find ( parser . Pattern , 0 , start ) ;
211212 }
212213
213214 public override int VisitFails ( FailsParser < TInput > parser , int start )
@@ -229,7 +230,7 @@ public override int VisitFirst(FirstParser<TInput> parser, int start)
229230
230231 public override int VisitForward < TOutput > ( ForwardParser < TInput , TOutput > parser , int start )
231232 {
232- return Find ( parser . DeferredParser ( ) , start ) ;
233+ return Find ( parser . DeferredParser ( ) , 0 , start ) ;
233234 }
234235
235236 public override int VisitIf < TOutput > ( IfParser < TInput , TOutput > parser , int start )
@@ -240,12 +241,12 @@ public override int VisitIf<TOutput>(IfParser<TInput, TOutput> parser, int start
240241 var length = parser . Test . Scan ( _source , start ) ;
241242 if ( length >= 0 )
242243 {
243- Find ( parser . Test , start ) ; // find annotations inside test too
244- length = Find ( parser . Parser , start ) ;
244+ Find ( parser . Test , 0 , start ) ; // find annotations inside test too
245+ length = Find ( parser . Parser , 1 , start ) ;
245246 }
246247 else
247248 {
248- length = Find ( parser . Test , start ) ;
249+ length = Find ( parser . Test , 0 , start ) ;
249250 }
250251
251252 if ( length < 0 )
@@ -265,11 +266,12 @@ public override int VisitIf(IfParser<TInput> parser, int start)
265266 var length = parser . Test . Scan ( _source , start ) ;
266267 if ( length >= 0 )
267268 {
268- length = Find ( parser . Parser , start ) ;
269+ Find ( parser . Test , 0 , start ) ; // find annotations inside test too
270+ length = Find ( parser . Parser , 1 , start ) ;
269271 }
270272 else
271273 {
272- length = Find ( parser . Test , start ) ;
274+ length = Find ( parser . Test , 0 , start ) ;
273275 }
274276
275277 if ( length < 0 )
@@ -288,7 +290,7 @@ public override int VisitLimit<TOutput>(LimitParser<TInput, TOutput> parser, int
288290 {
289291 var oldSource = _source ;
290292 _source = new LimitSource < TInput > ( _source , start + len ) ;
291- var result = Find ( parser . Limited , start ) ;
293+ var result = Find ( parser . Limited , 0 , start ) ;
292294 _source = oldSource ;
293295 return result ;
294296 }
@@ -347,15 +349,15 @@ public override int VisitNot(NotParser<TInput> parser, int start)
347349
348350 public override int VisitOneOrMore ( OneOrMoreParser < TInput > parser , int start )
349351 {
350- int len = Find ( parser . Parser , start ) ;
352+ int len = Find ( parser . Parser , 0 , start ) ;
351353 if ( len < 0 )
352354 return len ;
353355
354356 var totalLen = 0 ;
355357 while ( len > 0 )
356358 {
357359 totalLen += len ;
358- len = Find ( parser . Parser , start + totalLen ) ;
360+ len = Find ( parser . Parser , 0 , start + totalLen ) ;
359361 }
360362
361363 return totalLen ;
@@ -365,7 +367,7 @@ public override int VisitOptional<TOutput>(OptionalParser<TInput, TOutput> parse
365367 {
366368 var oldPrevWasMissing = _prevWasMissing ;
367369
368- var len = Find ( parser . Parser , start ) ;
370+ var len = Find ( parser . Parser , 0 , start ) ;
369371 if ( len < 0 )
370372 {
371373 _prevWasMissing = oldPrevWasMissing ;
@@ -377,12 +379,12 @@ public override int VisitOptional<TOutput>(OptionalParser<TInput, TOutput> parse
377379
378380 public override int VisitProduce < TOutput > ( ProduceParser < TInput , TOutput > parser , int start )
379381 {
380- return Find ( parser . Parser , start ) ;
382+ return Find ( parser . Parser , 0 , start ) ;
381383 }
382384
383385 public override int VisitRequired < TOutput > ( RequiredParser < TInput , TOutput > parser , int start )
384386 {
385- var len = Find ( parser . Parser , start ) ;
387+ var len = Find ( parser . Parser , 0 , start ) ;
386388 if ( len < 0 )
387389 {
388390 _prevWasMissing = true ;
@@ -409,7 +411,7 @@ private int VisitSequence(IReadOnlyList<Parser<TInput>> parsers, int start)
409411
410412 for ( int i = 0 ; i < parsers . Count ; i ++ )
411413 {
412- var len = Find ( parsers [ i ] , start + totalLen ) ;
414+ var len = Find ( parsers [ i ] , i , start + totalLen ) ;
413415 if ( len < 0 )
414416 {
415417 return len - totalLen ;
@@ -427,22 +429,22 @@ public override int VisitZeroOrMore(ZeroOrMoreParser<TInput> parser, int start)
427429
428430 if ( parser . ZeroOrOne )
429431 {
430- var len = Find ( parser . Parser , start ) ;
432+ var len = Find ( parser . Parser , 0 , start ) ;
431433 if ( len > 0 )
432434 {
433435 totalLen += len ;
434- len = Find ( parser . Parser , start + len ) ;
436+ len = Find ( parser . Parser , 0 , start + len ) ;
435437 if ( len > 0 )
436438 totalLen += len ;
437439 }
438440 }
439441 else
440442 {
441- var len = Find ( parser . Parser , start ) ;
443+ var len = Find ( parser . Parser , 0 , start ) ;
442444 while ( len > 0 )
443445 {
444446 totalLen += len ;
445- len = Find ( parser . Parser , start + totalLen ) ;
447+ len = Find ( parser . Parser , 0 , start + totalLen ) ;
446448 }
447449 }
448450
0 commit comments