PPRepeatingParser.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 05 May 2012 00:00:17 +0200
changeset 17 8d881a6c0ea3
parent 4 90de244a7fa2
child 52 9ddc30d7e0ca
permissions -rw-r--r--
Checkin from browser

"{ Package: 'stx:goodies/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.2 2012-01-13 11:22:50 cg Exp $'
! !