compiler/PPCSequenceNode.st
changeset 452 9f4558b3be66
parent 438 20598d7ce9fa
child 459 4751c407bb40
--- a/compiler/PPCSequenceNode.st	Thu Apr 30 23:43:14 2015 +0200
+++ b/compiler/PPCSequenceNode.st	Sun May 10 06:28:36 2015 +0100
@@ -12,98 +12,118 @@
 !PPCSequenceNode methodsFor:'accessing'!
 
 prefix
-	^ #seq
+    ^ #seq
 ! !
 
 !PPCSequenceNode methodsFor:'analysis'!
 
 acceptsEpsilon
-	^ self acceptsEpsilonOpenSet: IdentitySet new.
+    ^ self acceptsEpsilonOpenSet: IdentitySet new.
 !
 
 acceptsEpsilonOpenSet: set
-	set add: self.
-	^ self children allSatisfy: [:e | e acceptsEpsilonOpenSet: set ]
+    set add: self.
+    ^ self children allSatisfy: [:e | e acceptsEpsilonOpenSet: set ]
 !
 
 firstSetSuchThat: block into: aCollection openSet: aSet
-	(aSet includes: self) ifTrue: [ ^ aCollection ].
-	aSet add: self.
-	
-	(block value: self) ifTrue: [ aCollection add: self. ^ aCollection ].
-	
-	self children do: [ :child | 
-		child firstSetSuchThat: block into: aCollection openSet: aSet.
-		child acceptsEpsilon ifFalse: [ ^ aCollection ]
-	].
-	^ aCollection
+    (aSet includes: self) ifTrue: [ ^ aCollection ].
+    aSet add: self.
+    
+    (block value: self) ifTrue: [ aCollection add: self. ^ aCollection ].
+    
+    self children do: [ :child | 
+        child firstSetSuchThat: block into: aCollection openSet: aSet.
+        child acceptsEpsilon ifFalse: [ ^ aCollection ]
+    ].
+    ^ aCollection
 !
 
 firstSets: aFirstDictionary into: aSet suchThat: aBlock
-	| nullable |
-	
-	"TODO JK: aBlock is ignored by now"
-	children do: [ :node |
-		nullable := false.
-		(aFirstDictionary at: node) do: [ :each |
-			each isNullable
-				ifTrue: [ nullable := true ]
-				ifFalse: [ aSet add: each ] ].
-		nullable
-			ifFalse: [ ^ self ] ].
-	aSet add: PPCSentinelNode instance
+    | nullable |
+    
+    "TODO JK: aBlock is ignored by now"
+    children do: [ :node |
+        nullable := false.
+        (aFirstDictionary at: node) do: [ :each |
+            each isNullable
+                ifTrue: [ nullable := true ]
+                ifFalse: [ aSet add: each ] ].
+        nullable
+            ifFalse: [ ^ self ] ].
+    aSet add: PPCSentinelNode instance
+!
+
+recognizedSentencesPrim
+    | retval |
+    (self children anySatisfy: [ :child | child hasFiniteLanguage not ]) ifTrue: [ ^ #() ].
+    
+    retval := Set with: ''.
+    
+    self children do: [ : child |
+        | set |
+        set := Set new.
+
+        child recognizedSentences do: [ :suffix |
+            retval do: [ :prefix |
+                set add: prefix, suffix.
+         	]
+        ].
+        retval := set.
+    ].
+    ^ retval asArray
 ! !
 
 !PPCSequenceNode methodsFor:'compiling'!
 
 addGuard: compiler id: id
-	|  guard firsts |
-	(compiler guards not or: [(guard := PPCGuard on: self) makesSense not]) ifTrue: [ ^ self].
+    |  guard firsts |
+    (compiler guards not or: [(guard := PPCGuard on: self) makesSense not]) ifTrue: [ ^ self].
 
-	firsts := (self firstSetSuchThat: [ :e | (e isKindOf: PPCTrimmingTokenNode) or: [ e isTerminal ] ]).
+    firsts := (self firstSetSuchThat: [ :e | (e isKindOf: PPCTrimmingTokenNode) or: [ e isTerminal ] ]).
 
-	
-	(firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [  
-		"If we start with trimming, we should invoke the whitespace parser"
-		firsts anyOne compileWhitespace: compiler.
-		
-		compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
-		guard id: id, '_guard'.
-		guard compileGuard: compiler.
-		compiler addOnLine: 'ifFalse: [ ^ self error ].'
-	].
+    
+    (firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [  
+        "If we start with trimming, we should invoke the whitespace parser"
+        firsts anyOne compileWhitespace: compiler.
+        
+        compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
+        guard id: id, '_guard'.
+        guard compileGuard: compiler.
+        compiler addOnLine: 'ifFalse: [ ^ self error ].'
+    ].
 
-	(firsts allSatisfy: [ :e | e isTerminal ]) ifTrue: [  
-		compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
-		guard id: id, '_guard'.
-		guard compileGuard: compiler.
-		compiler addOnLine: 'ifFalse: [ ^ self error ].'
-	].
+    (firsts allSatisfy: [ :e | e isTerminal ]) ifTrue: [  
+        compiler add: 'context atEnd ifTrue: [ ^ self error ].'.
+        guard id: id, '_guard'.
+        guard compileGuard: compiler.
+        compiler addOnLine: 'ifFalse: [ ^ self error ].'
+    ].
 ! !
 
 !PPCSequenceNode methodsFor:'first follow next'!
 
 followSets: aFollowDictionary firstSets: aFirstDictionary into: aSet suchThat: aBlock
-	children keysAndValuesDo: [ :index :node |
-		| follow first |
-		follow := aFollowDictionary at: node.
-		index = children size
-			ifTrue: [ follow addAll: aSet ]
-			ifFalse: [
-				(self class withAll: (children 
-					copyFrom: index + 1 to: children size))
-						firstSets: aFirstDictionary
-						into: (first := IdentitySet new)
-						suchThat: aBlock.
-				(first anySatisfy: [ :each | each isNullable ])
-					ifTrue: [ follow addAll: aSet ].
-				follow addAll: (first 
-					reject: [ :each | each isNullable ]) ] ]
+    children keysAndValuesDo: [ :index :node |
+        | follow first |
+        follow := aFollowDictionary at: node.
+        index = children size
+            ifTrue: [ follow addAll: aSet ]
+            ifFalse: [
+                (self class withAll: (children 
+                    copyFrom: index + 1 to: children size))
+                        firstSets: aFirstDictionary
+                        into: (first := IdentitySet new)
+                        suchThat: aBlock.
+                (first anySatisfy: [ :each | each isNullable ])
+                    ifTrue: [ follow addAll: aSet ].
+                follow addAll: (first 
+                    reject: [ :each | each isNullable ]) ] ]
 ! !
 
 !PPCSequenceNode methodsFor:'visiting'!
 
 accept: visitor
-	^ visitor visitSequenceNode: self
+    ^ visitor visitSequenceNode: self
 ! !