compiler/PPCTrimmingTokenNode.st
changeset 391 553a5456963b
child 392 9b297f0d949c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/PPCTrimmingTokenNode.st	Sun Oct 26 01:03:31 2014 +0000
@@ -0,0 +1,132 @@
+"{ Package: 'stx:goodies/petitparser/compiler' }"
+
+PPCListNode subclass:#PPCTrimmingTokenNode
+	instanceVariableNames:'tokenClass'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitCompiler-Nodes'
+!
+
+PPCTrimmingTokenNode comment:''
+!
+
+!PPCTrimmingTokenNode methodsFor:'accessing'!
+
+child
+	
+	^ children at: 2
+!
+
+child: anObject
+	
+	children at: 2 put: anObject
+!
+
+compileWhitespace: compiler
+	compiler add: 'context atWs ifFalse: ['.
+	compiler indent.
+		compiler call: (self whitespace compileWith: compiler).
+		compiler add: 'context setWs.'.
+	compiler dedent.
+	compiler add: '].'.
+!
+
+initialize
+	super initialize.
+	children := Array new: 2
+!
+
+rewrite: changeStatus
+	|  |
+	super rewrite: changeStatus.
+	
+	(self allNodes anySatisfy: [ :node | node asFast ~= node ]) ifTrue: [  
+		changeStatus change.
+		self replace: self whitespace with: (self whitespace transform: [ :node | node asFast ]).
+		self replace: self child with: (self child transform: [:node | node asFast]).
+	]
+!
+
+tokenClass
+	
+	^ tokenClass
+!
+
+tokenClass: anObject
+	
+	tokenClass := anObject
+!
+
+whitespace
+	
+	^ children at: 1
+!
+
+whitespace: anObject
+	(anObject name isNil and: [ self child name isNotNil ]) ifTrue: [ 
+		anObject name: self child name, '_water'.
+	].
+	children at: 1 put: anObject
+! !
+
+!PPCTrimmingTokenNode methodsFor:'analyzing'!
+
+acceptsEpsilon
+	^ self child acceptsEpsilonOpenSet: (IdentitySet with: self).
+!
+
+acceptsEpsilonOpenSet: set
+	(set includes: self child) ifFalse: [ 
+		set add: self child.
+		^ self child acceptsEpsilonOpenSet: set 
+	].
+	^ false
+!
+
+firstSetSuchThat: block into: aCollection openSet: aSet
+	(aSet includes: self) ifTrue: [ ^ aCollection ].
+	aSet add: self.
+	
+	(block value: self) ifTrue: [ aCollection add: self. ^ aCollection ].
+	
+	^ self child firstSetSuchThat: block into: aCollection openSet: aSet.
+! !
+
+!PPCTrimmingTokenNode methodsFor:'as yet unclassified'!
+
+compileWith: compiler effect: effect id: id
+	|  guardSetId guardSet |
+
+	compiler startMethod: id.
+	compiler startTokenMode.
+	compiler addVariable: 'start'.
+	compiler addVariable: 'end'.
+	
+	self compileWhitespace: compiler.
+
+	(compiler guards and: [ (guardSet := compiler guardCharSet: self) isNil not ]) ifTrue: [ 	
+		guardSetId := id, '_guard'.
+		compiler addConstant: guardSet as: guardSetId.
+		compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
+		compiler add: '(', guardSetId, ' value: context peek) ifFalse: [ ^ self error ].'.
+	].
+
+	compiler add: 'start := context position + 1.'.
+	compiler call: (self child compileWith: compiler).
+	compiler add: 'error ifTrue: [ ^ self ].'.	
+	compiler add: 'end := context position.'.
+	
+	self compileWhitespace: compiler.
+
+	compiler add: '^ ', tokenClass asString, ' on: (context collection) 
+																start: start  
+																stop: end
+																value: nil'.
+	compiler stopTokenMode.
+ ^ compiler stopMethod.	
+!
+
+prefix
+	^ #token
+! !
+