compiler/PPCStarCharSetPredicateNode.st
changeset 452 9f4558b3be66
parent 438 20598d7ce9fa
child 464 f6d77fee9811
--- a/compiler/PPCStarCharSetPredicateNode.st	Thu Apr 30 23:43:14 2015 +0200
+++ b/compiler/PPCStarCharSetPredicateNode.st	Sun May 10 06:28:36 2015 +0100
@@ -12,41 +12,59 @@
 !PPCStarCharSetPredicateNode methodsFor:'accessing'!
 
 extendClassification: classification
-	^ (classification asOrderedCollection addLast: false; yourself) asArray
+    ^ (classification asOrderedCollection addLast: false; yourself) asArray
 !
 
 firstCharSet
-	^ PPCharSetPredicate on: predicate 	
+    ^ PPCharSetPredicate on: predicate 	
 !
 
 predicate
-	
-	^ predicate
+    
+    ^ predicate
 !
 
 predicate: anObject
-	
-	predicate := anObject
+    
+    predicate := anObject
 !
 
 prefix
-	^ #starPredicate
+    ^ #starPredicate
 ! !
 
 !PPCStarCharSetPredicateNode methodsFor:'comparing'!
 
 = anotherNode
-	super = anotherNode ifFalse: [ ^ false ].
-	^ predicate = anotherNode predicate.
+    super = anotherNode ifFalse: [ ^ false ].
+    ^ predicate = anotherNode predicate.
 !
 
 hash
-	^ super hash bitXor: predicate hash
+    ^ super hash bitXor: predicate hash
+! !
+
+!PPCStarCharSetPredicateNode methodsFor:'first follow next'!
+
+firstSets: aFirstDictionary into: aSet suchThat: aBlock
+    "
+        First and follow should be performed on the non-specialized tree, i.e. on a tree
+        with star -> messageNode. Not on myself.
+        
+        The reason for that is, that:
+        - I am terminal
+        - I am nullable
+        
+        This means, I look like epsilon node for the first follow analysis. And epsilons 
+        are ignored in sequences, thus sequence of StarMessagePredicate, Literal
+        leads to { Literal } as firstSet and not expected { MessagePredicate, Literal }
+    "
+    ^ self error: 'Cannot perform first/follow analysis on myself, sorry for that :('
 ! !
 
 !PPCStarCharSetPredicateNode methodsFor:'visiting'!
 
 accept: visitor
-	^ visitor visitStarCharSetPredicateNode: self
+    ^ visitor visitStarCharSetPredicateNode: self
 ! !