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 |