8 ! |
8 ! |
9 |
9 |
10 |
10 |
11 !PPLazyRepeatingParser methodsFor:'parsing'! |
11 !PPLazyRepeatingParser methodsFor:'parsing'! |
12 |
12 |
13 parseOn: aStream |
13 parseOn: aPPContext |
14 | start element elements | |
14 | memento element elements | |
15 start := aStream position. |
15 memento := aPPContext remember. |
16 elements := OrderedCollection new. |
16 elements := OrderedCollection new. |
17 [ elements size < min ] whileTrue: [ |
17 [ elements size < min ] whileTrue: [ |
18 (element := parser parseOn: aStream) isPetitFailure ifTrue: [ |
18 (element := parser parseOn: aPPContext) isPetitFailure ifTrue: [ |
19 aStream position: start. |
19 aPPContext restore: memento. |
20 ^ element ]. |
20 ^ element ]. |
21 elements addLast: element ]. |
21 elements addLast: element ]. |
22 [ self matchesLimitOn: aStream ] whileFalse: [ |
22 [ self matchesLimitOn: aPPContext ] whileFalse: [ |
23 elements size < max ifFalse: [ |
23 elements size < max ifFalse: [ |
24 aStream position: start. |
24 aPPContext restore: memento. |
25 ^ PPFailure message: 'overflow' at: start ]. |
25 ^ PPFailure message: 'overflow' context: aPPContext at: memento position ]. |
26 element := parser parseOn: aStream. |
26 element := parser parseOn: aPPContext. |
27 element isPetitFailure ifTrue: [ |
27 element isPetitFailure ifTrue: [ |
28 aStream position: start. |
28 aPPContext restore: memento. |
29 ^ element ]. |
29 ^ element ]. |
30 elements addLast: element ]. |
30 elements addLast: element ]. |
31 ^ elements asArray |
31 ^ elements asArray |
32 ! ! |
32 ! ! |
33 |
33 |