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 |
52 !PPSequenceParser methodsFor:'operations'! |
12 !PPSequenceParser methodsFor:'operations'! |
53 |
13 |
54 , aRule |
14 , aRule |
55 ^ self copyWith: aRule |
15 ^ self copyWith: aRule |
72 ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ] |
32 ifFalse: [ self error: aBlock numArgs asString , ' arguments expected.' ] |
73 ! ! |
33 ! ! |
74 |
34 |
75 !PPSequenceParser methodsFor:'parsing'! |
35 !PPSequenceParser methodsFor:'parsing'! |
76 |
36 |
77 parseOn: aStream |
37 parseOn: aPPContext |
78 "This is optimized code that avoids unnecessary block activations, do not change." |
38 "This is optimized code that avoids unnecessary block activations, do not change." |
79 |
39 |
80 | start elements element | |
40 | memento elements element | |
81 start := aStream position. |
41 memento := aPPContext remember. |
82 elements := Array new: parsers size. |
42 elements := Array new: parsers size. |
83 1 to: parsers size do: [ :index | |
43 1 to: parsers size do: [ :index | |
84 element := (parsers at: index) |
44 element := (parsers at: index) |
85 parseOn: aStream. |
45 parseOn: aPPContext. |
86 element isPetitFailure ifTrue: [ |
46 element isPetitFailure ifTrue: [ |
87 aStream position: start. |
47 aPPContext restore: memento. |
88 ^ element ]. |
48 ^ element ]. |
89 elements at: index put: element ]. |
49 elements at: index put: element ]. |
90 ^ elements |
50 ^ elements |
91 ! ! |
51 ! ! |
92 |
52 |