PPPredicateSequenceParser.st
changeset 0 739fe9b7253e
child 4 90de244a7fa2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PPPredicateSequenceParser.st	Thu Aug 18 20:56:17 2011 +0200
@@ -0,0 +1,71 @@
+"{ Package: 'squeak:petitparser' }"
+
+PPPredicateParser subclass:#PPPredicateSequenceParser
+	instanceVariableNames:'size'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitParser-Parsers'
+!
+
+PPPredicateSequenceParser comment:'A parser that accepts if a given predicate on an arbitrary number of elements of the input sequence holds.
+Instance Variables:
+	size	<Integer>	The number of elements to consume.'
+!
+
+
+!PPPredicateSequenceParser class methodsFor:'instance creation'!
+
+on: aBlock message: aString negated: aNegatedBlock message: aNegatedString size: anInteger 
+	^ self new initializeOn: aBlock message: aString negated: aNegatedBlock message: aNegatedString size: anInteger
+!
+
+on: aBlock message: aString size: anInteger
+	^ self on: aBlock message: aString negated: [ :each | (aBlock value: each) not ] message: 'no ' , aString size: anInteger 
+! !
+
+!PPPredicateSequenceParser methodsFor:'accessing'!
+
+size
+	"Answer the sequence size of the receiver."
+
+	^ size
+! !
+
+!PPPredicateSequenceParser methodsFor:'initialization'!
+
+initializeOn: aBlock message: aString negated: aNegatedBlock message: aNegatedString size: anInteger
+	predicate := aBlock.
+	predicateMessage := aString.
+	negated := aNegatedBlock.
+	negatedMessage := aNegatedString.
+	size := anInteger 
+! !
+
+!PPPredicateSequenceParser methodsFor:'operators'!
+
+negate
+	"Answer a parser that is the negation of the receiving predicate parser."
+	
+	^ self class 
+		on: negated message: negatedMessage
+		negated: predicate message: predicateMessage
+		size: size
+! !
+
+!PPPredicateSequenceParser methodsFor:'parsing'!
+
+parseOn: aStream
+	| position result |
+	position := aStream position.
+	result := aStream next: size.
+	(result size = size and: [ predicate value: result ])
+		ifTrue: [ ^ result ].
+	aStream position: position.
+	^ PPFailure message: predicateMessage at: aStream position
+! !
+
+!PPPredicateSequenceParser class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id: PPPredicateSequenceParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
+! !