Updated to PetitCompiler-JanKurs.160, PetitCompiler-Tests-JanKurs.112, PetitCompiler-Extras-Tests-JanKurs.25, PetitCompiler-Benchmarks-JanKurs.17
Name: PetitCompiler-JanKurs.160
Author: JanKurs
Time: 17-08-2015, 09:52:26.291 AM
UUID: 3b4bfc98-8098-4951-af83-a59e2585b121
Name: PetitCompiler-Tests-JanKurs.112
Author: JanKurs
Time: 16-08-2015, 05:00:32.936 PM
UUID: 85613d47-08f3-406f-9823-9cdab451e805
Name: PetitCompiler-Extras-Tests-JanKurs.25
Author: JanKurs
Time: 16-08-2015, 05:00:10.328 PM
UUID: 09731810-51a1-4151-8d3a-56b636fbd1f7
Name: PetitCompiler-Benchmarks-JanKurs.17
Author: JanKurs
Time: 05-08-2015, 05:29:32.407 PM
UUID: e544b5f1-bcf8-470b-93a6-d2363e4dfc8a
"{ 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!