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