diff -r 000000000000 -r 739fe9b7253e PPSequenceParser.st --- /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 $' +! !