# HG changeset patch # User Claus Gittinger # Date 1393943605 -3600 # Node ID 48a6757d5f01f76e9e5f25e5dea0bfd4e36f09d2 # Parent c7539657b514a1d42135f28acd5f15cbb16c11a9 update diff -r c7539657b514 -r 48a6757d5f01 PPSequenceParser.st --- 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 $' ! ! +