6 poolDictionaries:'' |
6 poolDictionaries:'' |
7 category:'PetitParser-Parsers' |
7 category:'PetitParser-Parsers' |
8 ! |
8 ! |
9 |
9 |
10 |
10 |
|
11 !PPSequenceParser methodsFor:'*petitanalyzer-private'! |
|
12 |
|
13 cycleSet: aDictionary |
|
14 | firstSet | |
|
15 1 to: parsers size do: [ :index | |
|
16 firstSet := aDictionary at: (parsers at: index). |
|
17 (firstSet anySatisfy: [ :each | each isNullable ]) |
|
18 ifFalse: [ ^ parsers copyFrom: 1 to: index ] ]. |
|
19 ^ parsers |
|
20 ! |
|
21 |
|
22 firstSets: aFirstDictionary into: aSet |
|
23 | nullable | |
|
24 parsers do: [ :parser | |
|
25 nullable := false. |
|
26 (aFirstDictionary at: parser) do: [ :each | |
|
27 each isNullable |
|
28 ifTrue: [ nullable := true ] |
|
29 ifFalse: [ aSet add: each ] ]. |
|
30 nullable |
|
31 ifFalse: [ ^ self ] ]. |
|
32 aSet add: PPSentinel instance |
|
33 ! |
|
34 |
|
35 followSets: aFollowDictionary firstSets: aFirstDictionary into: aSet |
|
36 parsers keysAndValuesDo: [ :index :parser | |
|
37 | followSet firstSet | |
|
38 followSet := aFollowDictionary at: parser. |
|
39 index = parsers size |
|
40 ifTrue: [ followSet addAll: aSet ] |
|
41 ifFalse: [ |
|
42 (self class withAll: (parsers |
|
43 copyFrom: index + 1 to: parsers size)) |
|
44 firstSets: aFirstDictionary |
|
45 into: (firstSet := IdentitySet new). |
|
46 (firstSet anySatisfy: [ :each | each isNullable ]) |
|
47 ifTrue: [ followSet addAll: aSet ]. |
|
48 followSet addAll: (firstSet |
|
49 reject: [ :each | each isNullable ]) ] ] |
|
50 ! ! |
|
51 |
11 !PPSequenceParser methodsFor:'operations'! |
52 !PPSequenceParser methodsFor:'operations'! |
12 |
53 |
13 , aRule |
54 , aRule |
14 ^ self copyWith: aRule |
55 ^ self copyWith: aRule |
15 ! |
|
16 |
|
17 map: aBlock |
|
18 ^ self ==> [ :nodes | aBlock valueWithArguments: nodes ] |
|
19 ! |
56 ! |
20 |
57 |
21 permutation: anArrayOfIntegers |
58 permutation: anArrayOfIntegers |
22 "Answer a permutation of the receivers sequence." |
59 "Answer a permutation of the receivers sequence." |
23 |
60 |
24 anArrayOfIntegers do: [ :index | |
61 anArrayOfIntegers do: [ :index | |
25 (index isInteger and: [ index between: 1 and: parsers size ]) |
62 (index isInteger and: [ index between: 1 and: parsers size ]) |
26 ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ]. |
63 ifFalse: [ self error: 'Invalid permutation index: ' , index printString ] ]. |
27 ^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ] |
64 ^ self ==> [ :nodes | anArrayOfIntegers collect: [ :index | nodes at: index ] ] |
|
65 ! ! |
|
66 |
|
67 !PPSequenceParser methodsFor:'operators-mapping'! |
|
68 |
|
69 map: aBlock |
|
70 ^ aBlock numArgs = self children size |
|
71 ifTrue: [ self ==> [ :nodes | aBlock valueWithArguments: nodes ] ] |
|
72 ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ] |
28 ! ! |
73 ! ! |
29 |
74 |
30 !PPSequenceParser methodsFor:'parsing'! |
75 !PPSequenceParser methodsFor:'parsing'! |
31 |
76 |
32 parseOn: aStream |
77 parseOn: aStream |
46 ! ! |
91 ! ! |
47 |
92 |
48 !PPSequenceParser class methodsFor:'documentation'! |
93 !PPSequenceParser class methodsFor:'documentation'! |
49 |
94 |
50 version |
95 version |
51 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $' |
96 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $' |
52 ! |
97 ! |
53 |
98 |
54 version_CVS |
99 version_CVS |
55 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.3 2012-05-04 21:59:14 vrany Exp $' |
100 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $' |
56 ! |
101 ! |
57 |
102 |
58 version_SVN |
103 version_SVN |
59 ^ '§Id: PPSequenceParser.st 2 2010-12-17 18:44:23Z vranyj1 §' |
104 ^ '$Id: PPSequenceParser.st,v 1.4 2014-03-04 14:33:25 cg Exp $' |
60 ! ! |
105 ! ! |
|
106 |