PPRepeatingParser.st
changeset 0 739fe9b7253e
child 4 90de244a7fa2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PPRepeatingParser.st	Thu Aug 18 20:56:17 2011 +0200
@@ -0,0 +1,86 @@
+"{ Package: 'squeak:petitparser' }"
+
+PPDelegateParser subclass:#PPRepeatingParser
+	instanceVariableNames:'min max'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitParser-Parsers'
+!
+
+PPRepeatingParser comment:'A parser that eagerly parses min to max instances of my delegate. The default instance parses eagerly an infinite number of elements, as min is set to 0 and max to infinity (SmallInteger maxVal).
+Instance Variables:
+	min	<Integer>	The minimum number of repetitions.
+	max	<Integer>	The maximum number of repetitions.'
+!
+
+
+!PPRepeatingParser class methodsFor:'instance creation'!
+
+on: aParser
+	^ (super on: aParser) setMin: 0 max: SmallInteger maxVal
+!
+
+on: aParser max: aMaxInteger
+	^ (self on: aParser) setMin: 0 max: aMaxInteger
+!
+
+on: aParser min: aMinInteger
+	^ (self on: aParser) setMin: aMinInteger max: SmallInteger maxVal 
+!
+
+on: aParser min: aMinInteger max: aMaxInteger
+	^ (self on: aParser) setMin: aMinInteger max: aMaxInteger
+! !
+
+!PPRepeatingParser methodsFor:'accessing'!
+
+max
+	"Answer the maximum number of repetitions."
+
+	^ max
+!
+
+min
+	"Answer the minimum number of repetitions."
+	
+	^ min
+! !
+
+!PPRepeatingParser methodsFor:'initialization'!
+
+setMin: aMinInteger max: aMaxInteger
+	min := aMinInteger.
+	max := aMaxInteger
+! !
+
+!PPRepeatingParser methodsFor:'parsing'!
+
+parseOn: aStream
+	| start element elements |
+	start := aStream position.
+	elements := OrderedCollection new.
+	[ elements size < min ] whileTrue: [
+		(element := parser parseOn: aStream) isPetitFailure ifTrue: [
+			aStream position: start.
+			^ element ].
+		elements addLast: element ].
+	[ elements size < max ] whileTrue: [
+	 	(element := parser parseOn: aStream) isPetitFailure
+			ifTrue: [ ^ elements asArray ].
+		elements addLast: element ].
+	^ elements asArray
+! !
+
+!PPRepeatingParser methodsFor:'printing'!
+
+printOn: aStream
+	super printOn: aStream.
+	aStream nextPutAll: ' ['; print: min; nextPutAll: ', '; nextPutAll: (max = SmallInteger maxVal
+		ifTrue: [ '*' ] ifFalse: [ max printString ]); nextPut: $]
+! !
+
+!PPRepeatingParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id: PPRepeatingParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
+! !