Merged in PetitCompiler-JanVrany.170, PetitCompiler-Tests-JanKurs.116, PetitCompiler-Extras-Tests-JanKurs.29, PetitCompiler-Benchmarks-JanKurs.19
Name: PetitCompiler-JanVrany.170
Author: JanVrany
Time: 24-08-2015, 03:19:51.340 PM
UUID: c20a744f-3b41-4aaa-bb8a-71ce74a2a952
Name: PetitCompiler-Tests-JanKurs.116
Author: JanKurs
Time: 24-08-2015, 11:37:54.332 AM
UUID: 549e0927-358a-4a1b-8270-050ccfcb4217
Name: PetitCompiler-Extras-Tests-JanKurs.29
Author: JanKurs
Time: 24-08-2015, 11:36:52.503 AM
UUID: ea1dbb67-f884-4237-8f34-adb0677c0954
Name: PetitCompiler-Benchmarks-JanKurs.19
Author: JanKurs
Time: 24-08-2015, 11:48:47.045 AM
UUID: 1c342fdb-8ddd-4104-9c47-a8f589c51694
"{ Package: 'stx:goodies/petitparser/compiler' }"
"{ NameSpace: Smalltalk }"
Object subclass:#PPCDistinctScanner
instanceVariableNames:'position match matchPosition currentChar context returnBlock'
classVariableNames:''
poolDictionaries:''
category:'PetitCompiler-Scanner'
!
!PPCDistinctScanner methodsFor:'accessing-private'!
getMatch
^ match
!
position
"returns the start position before the scan method..."
^ position
!
position: anObject
position := matchPosition := anObject
!
setMatch: value
match := value
!
stream
^ context
!
stream: anObject
context := anObject
! !
!PPCDistinctScanner methodsFor:'initialization'!
initialize
super initialize.
match := nil.
position := 0.
matchPosition := 0.
!
resetDistinct
! !
!PPCDistinctScanner methodsFor:'memoization'!
remember
^ position
!
restore: restorePosition
context position: (matchPosition := position := restorePosition).
match := nil
! !
!PPCDistinctScanner methodsFor:'results'!
polyResult
| dictionary |
dictionary := IdentityDictionary new.
match isNil ifFalse: [
dictionary at: match put: matchPosition.
].
^ dictionary
!
recordDistinctFailure
self flag: 'Potential bug? What if there is something after the failure? Might that happen for distinct parser?'.
match := nil.
matchPosition := position.
context position: position.
^ false
!
recordDistinctMatch: matchValue
match := matchValue.
matchPosition := context position.
^ true
!
recordDistinctMatch: matchValue offset: offset
match := matchValue.
currentChar isNil ifFalse: [
matchPosition := context position - offset.
] ifTrue: [
matchPosition := context position.
].
^ true
!
result
^ match
!
resultPosition
^ matchPosition
!
returnDistinct
"
match isNil ifTrue: [
self assert: matchPosition == position
].
"
context position: matchPosition.
^ match isNotNil
! !
!PPCDistinctScanner methodsFor:'scanning'!
back
currentChar isNil ifFalse: [
context skip: -1
]
!
peekBetween: start and: stop
(currentChar == nil) ifTrue: [ ^ false ].
^ (start <= currentChar codePoint) and: [ currentChar codePoint <= stop ]
!
step
currentChar := context next
! !