Merged with PetitCompiler-JanKurs.20150510144201, PetitCompiler-Tests-JanKurs.20150510144201, PetitCompiler-Extras-Tests-JanKurs.20150510144201, PetitCompiler-Benchmarks-JanKurs.20150510144201
Name: PetitCompiler-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:42:29.192 PM
UUID: 58a4786b-1182-4904-8b44-a13d3918f244
Name: PetitCompiler-Tests-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:32:12.870 PM
UUID: 2a8fd41a-331b-4dcf-a7a3-752a50ce86e7
Name: PetitCompiler-Extras-Tests-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 04:59:25.308 PM
UUID: ef43bd1a-be60-4e88-b749-8b635622c969
Name: PetitCompiler-Benchmarks-JanKurs.20150510144201
Author: JanKurs
Time: 10-05-2015, 05:04:54.561 PM
UUID: d8e764fd-016b-46e2-9fc1-17c38c18f0e5
"{ Package: 'stx:goodies/petitparser/islands' }"
"{ NameSpace: Smalltalk }"
PPIsland subclass:#PPMemoizingIsland
instanceVariableNames:'rootParser memoizationDictionaries'
classVariableNames:''
poolDictionaries:''
category:'PetitIslands-Parsers'
!
PPMemoizingIsland comment:'A PPMemoizingIsland is memoized version of PPIsland. Use this one, unless you don''t mind really bad performance. If the memoized version is not working flawlessly, its a bug!!
Please see help of the PPIsland for how to use...
Instance Variables
memoizationDictionaries: <Object>
rootParser: <Object>
memoizationDictionaries
- memoization cache
rootParser
- used for memoizing, once the root changes, flushes the caches
'
!
!PPMemoizingIsland class methodsFor:'as yet unclassified'!
initialize
super initialize
! !
!PPMemoizingIsland methodsFor:'accessing'!
island: anObject
island ifNil: [
super island: anObject.
] ifNotNil: [
self error: 'JK: I do not want to do this' .
]
! !
!PPMemoizingIsland methodsFor:'initialization'!
initialize
super initialize.
memoizationDictionaries := IdentityDictionary new.
! !
!PPMemoizingIsland methodsFor:'memoization'!
memoizationDictionaryForContext: aPPContext
^ memoizationDictionaries at: aPPContext ifAbsentPut: [IdentityDictionary new].
!
memoizeResult: result onContext: aPPContext position: pos
| memento |
memento := PPMemento new.
memento contextMemento: aPPContext remember.
memento result: result.
(self memoizationDictionaryForContext: aPPContext) at: pos put: memento.
!
memoizedResult: aPPContext
^ (self memoizationDictionaryForContext: aPPContext) at: (aPPContext position) ifAbsent: [ nil ].
! !
!PPMemoizingIsland methodsFor:'parsing'!
memoized
"We have our own implementation of memoization"
^ self
!
nonMemoized
^ PPIsland new
island: self island;
yourself
!
parseOn: aPPContext
| memoizedResult parsingPosition retval |
memoizedResult := self memoizedResult: aPPContext.
memoizedResult ifNotNil: [
aPPContext restore: memoizedResult contextMemento.
^ memoizedResult result
].
parsingPosition := aPPContext position.
retval := super parseOn: aPPContext.
(aPPContext waterPosition == aPPContext position) ifFalse: [
self memoizeResult: retval onContext: aPPContext position: parsingPosition.
].
^ retval.
! !
!PPMemoizingIsland class methodsFor:'documentation'!
version_HG
^ '$Changeset: <not expanded> $'
! !
PPMemoizingIsland initialize!