PPMemoizedParser.st
changeset 0 739fe9b7253e
child 4 90de244a7fa2
equal deleted inserted replaced
-1:000000000000 0:739fe9b7253e
       
     1 "{ Package: 'squeak:petitparser' }"
       
     2 
       
     3 PPDelegateParser subclass:#PPMemoizedParser
       
     4 	instanceVariableNames:'stream buffer'
       
     5 	classVariableNames:''
       
     6 	poolDictionaries:''
       
     7 	category:'PetitParser-Parsers'
       
     8 !
       
     9 
       
    10 PPMemoizedParser comment:'A memoized parser, for refraining redundant computations.
       
    11 Instance Variables:
       
    12 	stream	<PositionableStream>	The stream of the associated memento objects.
       
    13 	buffer	<Array of: PPMemento>	The buffer of memento objects.
       
    14 '
       
    15 !
       
    16 
       
    17 
       
    18 !PPMemoizedParser methodsFor:'operations'!
       
    19 
       
    20 memoized
       
    21 	"Ther is no point in memoizing more than once."
       
    22 
       
    23 	^ self
       
    24 ! !
       
    25 
       
    26 !PPMemoizedParser methodsFor:'parsing'!
       
    27 
       
    28 parseOn: aStream
       
    29 	| memento |
       
    30 	stream == aStream
       
    31 		ifFalse: [ self reset: aStream ].
       
    32 	memento := (buffer at: stream position + 1)
       
    33 		ifNil: [ buffer at: stream position + 1 put: PPMemento new ].
       
    34 	memento position isNil
       
    35 		ifTrue: [
       
    36 			memento result: (stream size - stream position + 2 < memento count
       
    37 				ifTrue: [ PPFailure message: 'overflow' at: stream position ]
       
    38 				ifFalse: [ memento increment. parser parseOn: stream ]).
       
    39 			memento position: stream position ]
       
    40 		ifFalse: [ stream position: memento position ].
       
    41 	^ memento result
       
    42 ! !
       
    43 
       
    44 !PPMemoizedParser methodsFor:'private'!
       
    45 
       
    46 reset: aStream
       
    47 	stream := aStream.
       
    48 	buffer := Array new: aStream size + 1
       
    49 ! !
       
    50 
       
    51 !PPMemoizedParser class methodsFor:'documentation'!
       
    52 
       
    53 version_SVN
       
    54     ^ '$Id: PPMemoizedParser.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
       
    55 ! !