--- 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 $'
! !
+