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