islands/PPWater.st
changeset 387 e2b2ccaa4de6
child 389 009c2e13973c
--- /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
+! !
+