islands/PPMemoizingIsland.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 08 Oct 2015 09:41:03 +0100
changeset 548 5536a6da50e4
parent 454 a9cd5ea7cc36
child 642 77d5fddb6462
permissions -rw-r--r--
Added README and LICENSE
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
387
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/petitparser/islands' }"
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     2
454
a9cd5ea7cc36 Portability: fixes for Smalltalk/X
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 420
diff changeset
     3
"{ NameSpace: Smalltalk }"
a9cd5ea7cc36 Portability: fixes for Smalltalk/X
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 420
diff changeset
     4
387
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     5
PPIsland subclass:#PPMemoizingIsland
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     6
	instanceVariableNames:'rootParser memoizationDictionaries'
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     7
	classVariableNames:''
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     8
	poolDictionaries:''
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     9
	category:'PetitIslands-Parsers'
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    10
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    11
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    12
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
'
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    13
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    14
420
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    15
387
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    16
!PPMemoizingIsland class methodsFor:'as yet unclassified'!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    17
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    18
initialize 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    19
	super initialize 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    20
! !
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    21
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    22
!PPMemoizingIsland methodsFor:'accessing'!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    23
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    24
island: anObject
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    25
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    26
	island ifNil: [
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    27
		super island: anObject.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    28
	] ifNotNil: [
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    29
		self error: 'JK: I do not want to do this' .
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    30
	] 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    31
! !
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    32
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    33
!PPMemoizingIsland methodsFor:'initialization'!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    34
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    35
initialize 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    36
	super initialize.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    37
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    38
	memoizationDictionaries := IdentityDictionary new.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    39
! !
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    40
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    41
!PPMemoizingIsland methodsFor:'memoization'!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    42
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    43
memoizationDictionaryForContext: aPPContext
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    44
	^ memoizationDictionaries at: aPPContext ifAbsentPut: [IdentityDictionary new].
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    45
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    46
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    47
memoizeResult: result onContext: aPPContext position: pos
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    48
	| memento |
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    49
	
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    50
	memento := PPMemento new.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    51
	memento contextMemento: aPPContext remember.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    52
	memento result: result.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    53
	
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    54
	(self memoizationDictionaryForContext: aPPContext) at: pos put: memento.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    55
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    56
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    57
memoizedResult: aPPContext
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    58
	^ (self memoizationDictionaryForContext: aPPContext) at: (aPPContext position) ifAbsent: [ nil ].
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    59
	
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    60
! !
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    61
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    62
!PPMemoizingIsland methodsFor:'parsing'!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    63
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    64
memoized
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    65
	"We have our own implementation of memoization"
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    66
	^ self
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    67
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    68
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    69
nonMemoized 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    70
	^ PPIsland new
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    71
		island: self island;
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    72
		yourself
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    73
!
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    74
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    75
parseOn: aPPContext 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    76
	|  memoizedResult parsingPosition retval |
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    77
	memoizedResult := self memoizedResult: aPPContext.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    78
	memoizedResult ifNotNil: [ 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    79
		aPPContext restore: memoizedResult contextMemento.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    80
		^ memoizedResult result 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    81
	].
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    82
	parsingPosition := aPPContext position.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    83
	
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    84
	retval := super parseOn: aPPContext.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    85
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    86
	(aPPContext waterPosition == aPPContext position) ifFalse: [ 
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    87
		self memoizeResult: retval onContext: aPPContext position: parsingPosition.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    88
	].
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    89
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    90
	^ retval.
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    91
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    92
! !
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
    93
420
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    94
!PPMemoizingIsland class methodsFor:'documentation'!
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    95
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    96
version_HG
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    97
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    98
    ^ '$Changeset: <not expanded> $'
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
    99
! !
b2f2f15cef26 Moved benchmarks to a separate package
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 387
diff changeset
   100
387
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   101
e2b2ccaa4de6 Commited a island parser support (MC package PetitIslands)
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
   102
PPMemoizingIsland initialize!