--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PPSequenceParser.st Thu Aug 18 20:56:17 2011 +0200
@@ -0,0 +1,55 @@
+"{ Package: 'squeak:petitparser' }"
+
+PPListParser subclass:#PPSequenceParser
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'PetitParser-Parsers'
+!
+
+PPSequenceParser comment:'A parser that parses a sequence of parsers.'
+!
+
+
+!PPSequenceParser methodsFor:'operations'!
+
+, aRule
+ ^ self copyWith: aRule
+!
+
+map: aBlock
+ ^ self ==> [ :nodes | aBlock valueWithArguments: nodes ]
+!
+
+permutation: anArrayOfIntegers
+ "Answer a permutation of the receivers sequence."
+
+ anArrayOfIntegers do: [ :index |
+ (index isInteger and: [ index between: 1 and: parsers size ])
+ ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ].
+ ^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
+! !
+
+!PPSequenceParser methodsFor:'parsing'!
+
+parseOn: aStream
+ "This is optimized code that avoids unnecessary block activations, do not change."
+
+ | start elements element |
+ start := aStream position.
+ elements := Array new: parsers size.
+ 1 to: parsers size do: [ :index |
+ element := (parsers at: index)
+ parseOn: aStream.
+ element isPetitFailure ifTrue: [
+ aStream position: start.
+ ^ element ].
+ elements at: index put: element ].
+ ^ elements
+! !
+
+!PPSequenceParser class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id: PPSequenceParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
+! !