PPSequenceParser.st
changeset 180 48a6757d5f01
parent 12 ace2bacc5f6a
child 377 6112a403a52d
child 644 0bf7cd45f7eb
equal deleted inserted replaced
179:c7539657b514 180:48a6757d5f01
     6 	poolDictionaries:''
     6 	poolDictionaries:''
     7 	category:'PetitParser-Parsers'
     7 	category:'PetitParser-Parsers'
     8 !
     8 !
     9 
     9 
    10 
    10 
       
    11 !PPSequenceParser methodsFor:'*petitanalyzer-private'!
       
    12 
       
    13 cycleSet: aDictionary
       
    14 	| firstSet |
       
    15 	1 to: parsers size do: [ :index |
       
    16 		firstSet := aDictionary at: (parsers at: index).
       
    17 		(firstSet anySatisfy: [ :each | each isNullable ])
       
    18 			ifFalse: [ ^ parsers copyFrom: 1 to: index ] ].
       
    19 	^ parsers
       
    20 !
       
    21 
       
    22 firstSets: aFirstDictionary into: aSet
       
    23 	| nullable |
       
    24 	parsers do: [ :parser |
       
    25 		nullable := false.
       
    26 		(aFirstDictionary at: parser) do: [ :each |
       
    27 			each isNullable
       
    28 				ifTrue: [ nullable := true ]
       
    29 				ifFalse: [ aSet add: each ] ].
       
    30 		nullable
       
    31 			ifFalse: [ ^ self ] ].
       
    32 	aSet add: PPSentinel instance
       
    33 !
       
    34 
       
    35 followSets: aFollowDictionary firstSets: aFirstDictionary into: aSet
       
    36 	parsers keysAndValuesDo: [ :index :parser |
       
    37 		| followSet firstSet |
       
    38 		followSet := aFollowDictionary at: parser.
       
    39 		index = parsers size
       
    40 			ifTrue: [ followSet addAll: aSet ]
       
    41 			ifFalse: [
       
    42 				(self class withAll: (parsers 
       
    43 					copyFrom: index + 1 to: parsers size))
       
    44 						firstSets: aFirstDictionary
       
    45 						into: (firstSet := IdentitySet new).
       
    46 				(firstSet anySatisfy: [ :each | each isNullable ])
       
    47 					ifTrue: [ followSet addAll: aSet ].
       
    48 				followSet addAll: (firstSet 
       
    49 					reject: [ :each | each isNullable ]) ] ]
       
    50 ! !
       
    51 
    11 !PPSequenceParser methodsFor:'operations'!
    52 !PPSequenceParser methodsFor:'operations'!
    12 
    53 
    13 , aRule
    54 , aRule
    14 	^ self copyWith: aRule
    55 	^ self copyWith: aRule
    15 !
       
    16 
       
    17 map: aBlock
       
    18 	^ self ==> [ :nodes | aBlock valueWithArguments: nodes ]
       
    19 !
    56 !
    20 
    57 
    21 permutation: anArrayOfIntegers
    58 permutation: anArrayOfIntegers
    22 	"Answer a permutation of the receivers sequence."
    59 	"Answer a permutation of the receivers sequence."
    23 	
    60 	
    24 	anArrayOfIntegers do: [ :index |
    61 	anArrayOfIntegers do: [ :index |
    25 		(index isInteger and: [ index between: 1 and: parsers size ])
    62 		(index isInteger and: [ index between: 1 and: parsers size ])
    26 			ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ].
    63 			ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ].
    27 	^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
    64 	^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
       
    65 ! !
       
    66 
       
    67 !PPSequenceParser methodsFor:'operators-mapping'!
       
    68 
       
    69 map: aBlock
       
    70 	^ aBlock numArgs = self children size
       
    71 		ifTrue: [ self ==> [ :nodes | aBlock valueWithArguments: nodes ] ]
       
    72 		ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ]
    28 ! !
    73 ! !
    29 
    74 
    30 !PPSequenceParser methodsFor:'parsing'!
    75 !PPSequenceParser methodsFor:'parsing'!
    31 
    76 
    32 parseOn: aStream
    77 parseOn: aStream
    46 ! !
    91 ! !
    47 
    92 
    48 !PPSequenceParser class methodsFor:'documentation'!
    93 !PPSequenceParser class methodsFor:'documentation'!
    49 
    94 
    50 version
    95 version
    51     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $'
    96     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
    52 !
    97 !
    53 
    98 
    54 version_CVS
    99 version_CVS
    55     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $'
   100     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
    56 !
   101 !
    57 
   102 
    58 version_SVN
   103 version_SVN
    59     ^ '§Id: PPSequenceParser.st 2 2010-12-17 18:44:23Z vranyj1 §'
   104     ^ '$Id: PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
    60 ! !
   105 ! !
       
   106