--- a/PPSequenceParser.st Fri Oct 03 01:59:10 2014 +0100
+++ b/PPSequenceParser.st Fri Oct 03 02:33:08 2014 +0100
@@ -8,46 +8,6 @@
!
-!PPSequenceParser methodsFor:'*petitanalyzer-private'!
-
-cycleSet: aDictionary
- | firstSet |
- 1 to: parsers size do: [ :index |
- firstSet := aDictionary at: (parsers at: index).
- (firstSet anySatisfy: [ :each | each isNullable ])
- ifFalse: [ ^ parsers copyFrom: 1 to: index ] ].
- ^ parsers
-!
-
-firstSets: aFirstDictionary into: aSet
- | nullable |
- parsers do: [ :parser |
- nullable := false.
- (aFirstDictionary at: parser) do: [ :each |
- each isNullable
- ifTrue: [ nullable := true ]
- ifFalse: [ aSet add: each ] ].
- nullable
- ifFalse: [ ^ self ] ].
- aSet add: PPSentinel instance
-!
-
-followSets: aFollowDictionary firstSets: aFirstDictionary into: aSet
- parsers keysAndValuesDo: [ :index :parser |
- | followSet firstSet |
- followSet := aFollowDictionary at: parser.
- index = parsers size
- ifTrue: [ followSet addAll: aSet ]
- ifFalse: [
- (self class withAll: (parsers
- copyFrom: index + 1 to: parsers size))
- firstSets: aFirstDictionary
- into: (firstSet := IdentitySet new).
- (firstSet anySatisfy: [ :each | each isNullable ])
- ifTrue: [ followSet addAll: aSet ].
- followSet addAll: (firstSet
- reject: [ :each | each isNullable ]) ] ]
-! !
!PPSequenceParser methodsFor:'operations'!
@@ -74,17 +34,17 @@
!PPSequenceParser methodsFor:'parsing'!
-parseOn: aStream
+parseOn: aPPContext
"This is optimized code that avoids unnecessary block activations, do not change."
- | start elements element |
- start := aStream position.
+ | memento elements element |
+ memento := aPPContext remember.
elements := Array new: parsers size.
1 to: parsers size do: [ :index |
element := (parsers at: index)
- parseOn: aStream.
+ parseOn: aPPContext.
element isPetitFailure ifTrue: [
- aStream position: start.
+ aPPContext restore: memento.
^ element ].
elements at: index put: element ].
^ elements