islands/PPWater.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 12 May 2015 01:24:03 +0100
changeset 459 4751c407bb40
parent 389 009c2e13973c
child 460 87a3d30ab570
permissions -rw-r--r--
Merged with PetitCompiler-JanKurs.20150510144201, PetitCompiler-Tests-JanKurs.20150510144201, PetitCompiler-Extras-Tests-JanKurs.20150510144201, PetitCompiler-Benchmarks-JanKurs.20150510144201 Name: PetitCompiler-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:42:29.192 PM UUID: 58a4786b-1182-4904-8b44-a13d3918f244 Name: PetitCompiler-Tests-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:32:12.870 PM UUID: 2a8fd41a-331b-4dcf-a7a3-752a50ce86e7 Name: PetitCompiler-Extras-Tests-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 04:59:25.308 PM UUID: ef43bd1a-be60-4e88-b749-8b635622c969 Name: PetitCompiler-Benchmarks-JanKurs.20150510144201 Author: JanKurs Time: 10-05-2015, 05:04:54.561 PM UUID: d8e764fd-016b-46e2-9fc1-17c38c18f0e5

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