--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/islands/PPWater.st Wed Oct 08 00:33:44 2014 +0100
@@ -0,0 +1,83 @@
+"{ 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
+! !
+