--- a/PPMemoizedParser.st Fri Oct 03 01:59:10 2014 +0100
+++ b/PPMemoizedParser.st Fri Oct 03 02:33:08 2014 +0100
@@ -1,7 +1,7 @@
"{ Package: 'stx:goodies/petitparser' }"
PPDelegateParser subclass:#PPMemoizedParser
- instanceVariableNames:'stream buffer'
+ instanceVariableNames:'buffer context hash'
classVariableNames:''
poolDictionaries:''
category:'PetitParser-Parsers'
@@ -18,27 +18,30 @@
!PPMemoizedParser methodsFor:'parsing'!
-parseOn: aStream
- | memento |
- stream == aStream
- ifFalse: [ self reset: aStream ].
- memento := (buffer at: stream position + 1)
- ifNil: [ buffer at: stream position + 1 put: PPMemento new ].
- memento position isNil
+parseOn: aPPContext
+ | memento contextMemento aStream |
+ "TODO: JK memoizing needs review!!"
+
+ contextMemento := aPPContext remember.
+ (hash == aPPContext hash)
+ ifFalse: [ self reset: aPPContext ].
+ memento := (buffer at: contextMemento ifAbsentPut: [ PPMemento new ]).
+
+ memento contextMemento isNil
ifTrue: [
- memento result: (stream size - stream position + 2 < memento count
- ifTrue: [ PPFailure message: 'overflow' at: stream position ]
- ifFalse: [ memento increment. parser parseOn: stream ]).
- memento position: stream position ]
- ifFalse: [ stream position: memento position ].
- ^ memento result
-! !
+ aStream := aPPContext stream.
+ memento result: (aStream size - aStream position + 2 < memento count
+ ifTrue: [ PPFailure message: 'overflow' context: aPPContext ]
+ ifFalse: [ memento increment. parser parseOn: aPPContext ]).
+ memento contextMemento: aPPContext remember ]
+ ifFalse: [ context restore: memento contextMemento ].
+ ^ memento result.
+!
-!PPMemoizedParser methodsFor:'private'!
-
-reset: aStream
- stream := aStream.
- buffer := Array new: aStream size + 1
+reset: aPPContext
+ hash := aPPContext hash.
+ context := aPPContext.
+ buffer := Dictionary new.
! !
!PPMemoizedParser class methodsFor:'documentation'!
@@ -54,3 +57,4 @@
version_SVN
^ '§Id: PPMemoizedParser.st 2 2010-12-17 18:44:23Z vranyj1 §'
! !
+