islands/PPWater.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 14 Oct 2014 23:16:37 +0100
changeset 389 009c2e13973c
parent 387 e2b2ccaa4de6
child 454 a9cd5ea7cc36
child 459 4751c407bb40
permissions -rw-r--r--
Updated smalltalk parser to PetitSmalltalk-JanKurs.75 Name: PetitSmalltalk-JanKurs.75 Author: JanKurs Time: 13-10-2014, 05:00:14 AM UUID: 6254f8f7-aa47-4ddd-a373-167bccb0d4e5

"{ Package: 'stx:goodies/petitparser/islands' }"

PPDelegateParser subclass:#PPWater
	instanceVariableNames:'waterToken context'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitIslands-Parsers'
!

!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
! !