PPMemoizedParser.st
changeset 377 6112a403a52d
parent 10 cbaaa689fab2
child 642 77d5fddb6462
--- 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 §'
 ! !
+