PPSequenceParser.st
changeset 180 48a6757d5f01
parent 12 ace2bacc5f6a
child 377 6112a403a52d
child 644 0bf7cd45f7eb
--- a/PPSequenceParser.st	Tue Mar 04 15:33:24 2014 +0100
+++ b/PPSequenceParser.st	Tue Mar 04 15:33:25 2014 +0100
@@ -8,16 +8,53 @@
 !
 
 
+!PPSequenceParser methodsFor:'*petitanalyzer-private'!
+
+cycleSet: aDictionary
+	| firstSet |
+	1 to: parsers size do: [ :index |
+		firstSet := aDictionary at: (parsers at: index).
+		(firstSet anySatisfy: [ :each | each isNullable ])
+			ifFalse: [ ^ parsers copyFrom: 1 to: index ] ].
+	^ parsers
+!
+
+firstSets: aFirstDictionary into: aSet
+	| nullable |
+	parsers do: [ :parser |
+		nullable := false.
+		(aFirstDictionary at: parser) do: [ :each |
+			each isNullable
+				ifTrue: [ nullable := true ]
+				ifFalse: [ aSet add: each ] ].
+		nullable
+			ifFalse: [ ^ self ] ].
+	aSet add: PPSentinel instance
+!
+
+followSets: aFollowDictionary firstSets: aFirstDictionary into: aSet
+	parsers keysAndValuesDo: [ :index :parser |
+		| followSet firstSet |
+		followSet := aFollowDictionary at: parser.
+		index = parsers size
+			ifTrue: [ followSet addAll: aSet ]
+			ifFalse: [
+				(self class withAll: (parsers 
+					copyFrom: index + 1 to: parsers size))
+						firstSets: aFirstDictionary
+						into: (firstSet := IdentitySet new).
+				(firstSet anySatisfy: [ :each | each isNullable ])
+					ifTrue: [ followSet addAll: aSet ].
+				followSet addAll: (firstSet 
+					reject: [ :each | each isNullable ]) ] ]
+! !
+
 !PPSequenceParser methodsFor:'operations'!
 
 , aRule
 	^ self copyWith: aRule
 !
 
-map: aBlock
-	^ self ==> [ :nodes | aBlock valueWithArguments: nodes ]
-!
-
 permutation: anArrayOfIntegers
 	"Answer a permutation of the receivers sequence."
 	
@@ -27,6 +64,14 @@
 	^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ]
 ! !
 
+!PPSequenceParser methodsFor:'operators-mapping'!
+
+map: aBlock
+	^ aBlock numArgs = self children size
+		ifTrue: [ self ==> [ :nodes | aBlock valueWithArguments: nodes ] ]
+		ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ]
+! !
+
 !PPSequenceParser methodsFor:'parsing'!
 
 parseOn: aStream
@@ -48,13 +93,14 @@
 !PPSequenceParser class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $'
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
 !
 
 version_SVN
-    ^ '§Id: PPSequenceParser.st 2 2010-12-17 18:44:23Z vranyj1 §'
+    ^ '$Id: PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $'
 ! !
+