PPMemoizedParser.st
changeset 0 739fe9b7253e
child 4 90de244a7fa2
--- /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 $'
+! !