PPSequenceParser.st
changeset 4 90de244a7fa2
parent 0 739fe9b7253e
child 12 ace2bacc5f6a
equal deleted inserted replaced
3:e1b11f74e142 4:90de244a7fa2
     1 "{ Package: 'squeak:petitparser' }"
     1 "{ Package: 'stx:goodies/petitparser' }"
     2 
     2 
     3 PPListParser subclass:#PPSequenceParser
     3 PPListParser subclass:#PPSequenceParser
     4 	instanceVariableNames:''
     4 	instanceVariableNames:''
     5 	classVariableNames:''
     5 	classVariableNames:''
     6 	poolDictionaries:''
     6 	poolDictionaries:''
    21 	^ self ==> [ :nodes | aBlock valueWithArguments: nodes ]
    21 	^ self ==> [ :nodes | aBlock valueWithArguments: nodes ]
    22 !
    22 !
    23 
    23 
    24 permutation: anArrayOfIntegers
    24 permutation: anArrayOfIntegers
    25 	"Answer a permutation of the receivers sequence."
    25 	"Answer a permutation of the receivers sequence."
    26 	
    26 
    27 	anArrayOfIntegers do: [ :index |
    27 	anArrayOfIntegers do: [ :index |
    28 		(index isInteger and: [ index between: 1 and: parsers size ])
    28 		(index isInteger and: [ index between: 1 and: parsers size ])
    29 			ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ].
    29 			ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ].
    30 	^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
    30 	^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
    31 ! !
    31 ! !
    32 
    32 
    33 !PPSequenceParser methodsFor:'parsing'!
    33 !PPSequenceParser methodsFor:'parsing'!
    34 
    34 
    35 parseOn: aStream
    35 parseOn: aStream
    36 	"This is optimized code that avoids unnecessary block activations, do not change."
    36 	"This is optimized code that avoids unnecessary block activations, do not change."
    37 	
    37 
    38 	| start elements element |
    38 	| start elements element |
    39 	start := aStream position.
    39 	start := aStream position.
    40 	elements := Array new: parsers size.
    40 	elements := Array new: parsers size.
    41 	1 to: parsers size do: [ :index |
    41 	1 to: parsers size do: [ :index |
    42 		element := (parsers at: index) 
    42 		element := (parsers at: index)
    43 			parseOn: aStream.
    43 			parseOn: aStream.
    44 		element isPetitFailure ifTrue: [
    44 		element isPetitFailure ifTrue: [
    45 			aStream position: start.
    45 			aStream position: start.
    46 			^ element ].
    46 			^ element ].
    47 		elements at: index put: element ].
    47 		elements at: index put: element ].
    49 ! !
    49 ! !
    50 
    50 
    51 !PPSequenceParser class methodsFor:'documentation'!
    51 !PPSequenceParser class methodsFor:'documentation'!
    52 
    52 
    53 version_SVN
    53 version_SVN
    54     ^ '$Id: PPSequenceParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
    54     ^ '$Id: PPSequenceParser.st,v 1.2 2012-01-13 11:22:50 cg Exp $'
    55 ! !
    55 ! !