islands/PPWater.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 12 May 2015 01:33:33 +0100
changeset 460 87a3d30ab570
parent 454 a9cd5ea7cc36
parent 459 4751c407bb40
permissions -rw-r--r--
Merge

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

"{ NameSpace: Smalltalk }"

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

!PPWater class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !