PPMemoizedParser.st
changeset 377 6112a403a52d
parent 10 cbaaa689fab2
child 642 77d5fddb6462
equal deleted inserted replaced
376:a2656b27cace 377:6112a403a52d
     1 "{ Package: 'stx:goodies/petitparser' }"
     1 "{ Package: 'stx:goodies/petitparser' }"
     2 
     2 
     3 PPDelegateParser subclass:#PPMemoizedParser
     3 PPDelegateParser subclass:#PPMemoizedParser
     4 	instanceVariableNames:'stream buffer'
     4 	instanceVariableNames:'buffer context hash'
     5 	classVariableNames:''
     5 	classVariableNames:''
     6 	poolDictionaries:''
     6 	poolDictionaries:''
     7 	category:'PetitParser-Parsers'
     7 	category:'PetitParser-Parsers'
     8 !
     8 !
     9 
     9 
    16 	^ self
    16 	^ self
    17 ! !
    17 ! !
    18 
    18 
    19 !PPMemoizedParser methodsFor:'parsing'!
    19 !PPMemoizedParser methodsFor:'parsing'!
    20 
    20 
    21 parseOn: aStream
    21 parseOn: aPPContext
    22 	| memento |
    22 	| memento contextMemento  aStream |
    23 	stream == aStream
    23 	"TODO: JK memoizing needs review!!"
    24 		ifFalse: [ self reset: aStream ].
    24 	
    25 	memento := (buffer at: stream position + 1)
    25 	contextMemento := aPPContext remember.
    26 		ifNil: [ buffer at: stream position + 1 put: PPMemento new ].
    26 	(hash == aPPContext hash)
    27 	memento position isNil
    27 		ifFalse: [ self reset: aPPContext ].
       
    28 	memento := (buffer at: contextMemento ifAbsentPut: [ PPMemento new ]).
       
    29 	
       
    30 	memento contextMemento isNil
    28 		ifTrue: [
    31 		ifTrue: [
    29 			memento result: (stream size - stream position + 2 < memento count
    32 			aStream := aPPContext stream.
    30 				ifTrue: [ PPFailure message: 'overflow' at: stream position ]
    33 			memento result: (aStream size - aStream position + 2 < memento count
    31 				ifFalse: [ memento increment. parser parseOn: stream ]).
    34 				ifTrue: [ PPFailure message: 'overflow' context: aPPContext ]
    32 			memento position: stream position ]
    35 				ifFalse: [ memento increment. parser parseOn: aPPContext ]).
    33 		ifFalse: [ stream position: memento position ].
    36 			memento contextMemento: aPPContext remember ]
    34 	^ memento result
    37 		ifFalse: [ context restore: memento contextMemento ].
    35 ! !
    38 	^ memento result.
       
    39 !
    36 
    40 
    37 !PPMemoizedParser methodsFor:'private'!
    41 reset: aPPContext
    38 
    42 	hash := aPPContext hash.
    39 reset: aStream
    43 	context := aPPContext.
    40 	stream := aStream.
    44 	buffer := Dictionary new.
    41 	buffer := Array new: aStream size + 1
       
    42 ! !
    45 ! !
    43 
    46 
    44 !PPMemoizedParser class methodsFor:'documentation'!
    47 !PPMemoizedParser class methodsFor:'documentation'!
    45 
    48 
    46 version
    49 version
    52 !
    55 !
    53 
    56 
    54 version_SVN
    57 version_SVN
    55     ^ '§Id: PPMemoizedParser.st 2 2010-12-17 18:44:23Z vranyj1 §'
    58     ^ '§Id: PPMemoizedParser.st 2 2010-12-17 18:44:23Z vranyj1 §'
    56 ! !
    59 ! !
       
    60