Commited a island parser support (MC package PetitIslands)
Name: PetitIslands-JanKurs.10
Author: JanKurs
Time: 06-10-2014, 11:50:57 AM
UUID: 19560ad2-4899-43d5-8c69-cf7274ad4f04
Repository: http://smalltalkhub.com/mc/Moose/PetitParser/main
"{ Package: 'stx:goodies/petitparser/islands' }"
PPDelegateParser subclass:#PPWater
instanceVariableNames:'waterToken context'
classVariableNames:''
poolDictionaries:''
category:'PetitIslands-Parsers'
!
PPWater comment:''
!
!PPWater class methodsFor:'as yet unclassified'!
on: parser
^ self on: parser waterToken: #any asParser
!
on: parser waterToken: waterToken
^ (super on: parser)
waterToken: waterToken;
yourself
! !
!PPWater methodsFor:'as yet unclassified'!
checkContext: aPPContext
context == aPPContext ifFalse: [
self reset: aPPContext
]
!
children
^ Array with: waterToken
!
initialize
super initialize.
waterToken := nil asParser.
context := nil.
!
parseOn: aPPContext
| waterPosition result |
(aPPContext waterPosition == aPPContext position) ifFalse: [
waterPosition := aPPContext waterPosition.
aPPContext waterPosition: aPPContext position.
"TODO: probably can be rewritten with test in the end!!"
result := parser parseOn: aPPContext.
[result isPetitFailure] whileFalse: [
waterToken parseOn: aPPContext.
aPPContext waterPosition: aPPContext position.
result := parser parseOn: aPPContext.
].
aPPContext waterPosition: waterPosition.
].
^ #water
!
replace: child with: anotherChild
child == waterToken ifTrue: [
waterToken := anotherChild.
]
!
reset: aPPContext
| waterObjects |
context := aPPContext.
waterObjects := aPPContext globalAt: #waterObjects ifAbsent: [ OrderedCollection new ].
waterObjects add: #any asParser.
waterToken := PPChoiceParser withAll: waterObjects.
!
waterToken: aPPParser
^ waterToken := aPPParser
! !