PPLazyRepeatingParser.st
changeset 377 6112a403a52d
parent 167 f7d5e10c3fe8
equal deleted inserted replaced
376:a2656b27cace 377:6112a403a52d
     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