islands/PPWater.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 08 Oct 2014 21:56:20 +0100
changeset 388 74c9c229033b
parent 387 e2b2ccaa4de6
child 389 009c2e13973c
permissions -rw-r--r--
Workaround to fix PPComposedTest>>testLeftRecursion - make PPStream>>size returning size of the input. For whatever reason, in Smalltalk/X ReadStream>>size returns size remaning data, not the size of a whole stream. This is a bug and should be fixed in Smalltalk/X libbasic. Meanwhile, override PPStream>>size to return proper value. In Pharo, the method is not needed as the inherited method is exactly the same.

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