PPSequenceParser.st
changeset 377 6112a403a52d
parent 180 48a6757d5f01
child 421 7e08b31e0dae
equal deleted inserted replaced
376:a2656b27cace 377:6112a403a52d
     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 
    52 !PPSequenceParser methodsFor:'operations'!
    12 !PPSequenceParser methodsFor:'operations'!
    53 
    13 
    54 , aRule
    14 , aRule
    55 	^ self copyWith: aRule
    15 	^ self copyWith: aRule
    72 		ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ]
    32 		ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ]
    73 ! !
    33 ! !
    74 
    34 
    75 !PPSequenceParser methodsFor:'parsing'!
    35 !PPSequenceParser methodsFor:'parsing'!
    76 
    36 
    77 parseOn: aStream
    37 parseOn: aPPContext
    78 	"This is optimized code that avoids unnecessary block activations, do not change."
    38 	"This is optimized code that avoids unnecessary block activations, do not change."
    79 	
    39 	
    80 	| start elements element |
    40 	| memento elements element |
    81 	start := aStream position.
    41 	memento := aPPContext remember.
    82 	elements := Array new: parsers size.
    42 	elements := Array new: parsers size.
    83 	1 to: parsers size do: [ :index |
    43 	1 to: parsers size do: [ :index |
    84 		element := (parsers at: index) 
    44 		element := (parsers at: index) 
    85 			parseOn: aStream.
    45 			parseOn: aPPContext.
    86 		element isPetitFailure ifTrue: [
    46 		element isPetitFailure ifTrue: [
    87 			aStream position: start.
    47 			aPPContext restore: memento.
    88 			^ element ].
    48 			^ element ].
    89 		elements at: index put: element ].
    49 		elements at: index put: element ].
    90 	^ elements
    50 	^ elements
    91 ! !
    51 ! !
    92 
    52