--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PPMemoizedParser.st Thu Aug 18 20:56:17 2011 +0200
@@ -0,0 +1,55 @@
+"{ Package: 'squeak:petitparser' }"
+
+PPDelegateParser subclass:#PPMemoizedParser
+ instanceVariableNames:'stream buffer'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'PetitParser-Parsers'
+!
+
+PPMemoizedParser comment:'A memoized parser, for refraining redundant computations.
+Instance Variables:
+ stream <PositionableStream> The stream of the associated memento objects.
+ buffer <Array of: PPMemento> The buffer of memento objects.
+'
+!
+
+
+!PPMemoizedParser methodsFor:'operations'!
+
+memoized
+ "Ther is no point in memoizing more than once."
+
+ ^ self
+! !
+
+!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
+ 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
+! !
+
+!PPMemoizedParser methodsFor:'private'!
+
+reset: aStream
+ stream := aStream.
+ buffer := Array new: aStream size + 1
+! !
+
+!PPMemoizedParser class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id: PPMemoizedParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
+! !