PPRepeatingParser.st
author Claus Gittinger <cg@exept.de>
Mon, 12 Sep 2011 19:47:59 +0200
changeset 2 acb3822c73db
parent 0 739fe9b7253e
child 4 90de244a7fa2
permissions -rw-r--r--
initial checkin

"{ 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 $'
! !