diff -r 000000000000 -r 739fe9b7253e PPMemoizedParser.st --- /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 The stream of the associated memento objects. + buffer 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 $' +! !