63 "A highly recrusive grammar." |
61 "A highly recrusive grammar." |
64 |
62 |
65 | grammar | |
63 | grammar | |
66 grammar := PPUnresolvedParser new. |
64 grammar := PPUnresolvedParser new. |
67 grammar def: (grammar , $+ asParser , grammar) / $1 asParser. |
65 grammar def: (grammar , $+ asParser , grammar) / $1 asParser. |
|
66 ^grammar |
|
67 ! |
|
68 |
|
69 grammarD |
|
70 "A highly ambiguous grammar from: Saichaitanya Jampana. Exploring the problem of ambiguity in context-free grammars. Master's thesis, Oklahoma State University, July 2005." |
|
71 |
|
72 | grammar | |
|
73 grammar := Dictionary new. |
|
74 #(S A a B b) do: [ :each | grammar at: each put: (PPUnresolvedParser named: each) ]. |
|
75 |
|
76 (grammar at: #a) def: $a asParser. |
|
77 (grammar at: #b) def: $b asParser. |
|
78 |
|
79 (grammar at: #S) def: (grammar at: #A) , (grammar at: #B) / (grammar at: #a). |
|
80 (grammar at: #A) def: (grammar at: #S) , (grammar at: #B) / (grammar at: #b). |
|
81 (grammar at: #B) def: (grammar at: #B) , (grammar at: #A) / (grammar at: #a). |
|
82 |
68 ^ grammar |
83 ^ grammar |
69 ! |
|
70 |
|
71 grammarD |
|
72 "A highly ambiguous grammar from: Saichaitanya Jampana. Exploring the problem of ambiguity in context-free grammars. Master’s thesis, Oklahoma State University, July 2005." |
|
73 |
|
74 | grammar | |
|
75 grammar := Dictionary new. |
|
76 #(S A a B b) do: [ :each | grammar at: each put: (PPUnresolvedParser named: each) ]. |
|
77 |
|
78 (grammar at: #a) def: $a asParser. |
|
79 (grammar at: #b) def: $b asParser. |
|
80 |
|
81 (grammar at: #S) def: (grammar at: #A) , (grammar at: #B) / (grammar at: #a). |
|
82 (grammar at: #A) def: (grammar at: #S) , (grammar at: #B) / (grammar at: #b). |
|
83 (grammar at: #B) def: (grammar at: #B) , (grammar at: #A) / (grammar at: #a). |
|
84 |
|
85 ^ grammar |
|
86 ! |
84 ! |
87 |
85 |
88 grammarE |
86 grammarE |
89 "The most stupid parser, it just references itself and never consumes anything. All algorithms should survive such an attack." |
87 "The most stupid parser, it just references itself and never consumes anything. All algorithms should survive such an attack." |
90 |
88 |
96 |
94 |
97 !PPAnalyzerTest methodsFor:'testing'! |
95 !PPAnalyzerTest methodsFor:'testing'! |
98 |
96 |
99 testAllNamedParsers |
97 testAllNamedParsers |
100 | p1 p2 p3 | |
98 | p1 p2 p3 | |
101 p1 := (#digit asParser name: 'a'). |
99 p1 := #digit asParser name: 'a'. |
102 p2 := (#digit asParser name: 'b') star. |
100 p2 := (#digit asParser name: 'b') star. |
103 p3 := (#digit asParser name: 'c') token end. |
101 p3 := (#digit asParser name: 'c') token end. |
104 self assert: p1 allNamedParsers size = 1. |
102 self assert: p1 allNamedParsers size equals: 1. |
105 self assert: p1 allNamedParsers first name = 'a'. |
103 self assert: p1 allNamedParsers first name equals: 'a'. |
106 self assert: p2 allNamedParsers size = 1. |
104 self assert: p2 allNamedParsers size equals: 1. |
107 self assert: p2 allNamedParsers first name = 'b'. |
105 self assert: p2 allNamedParsers first name equals: 'b'. |
108 self assert: p3 allNamedParsers size = 1. |
106 self assert: p3 allNamedParsers size equals: 1. |
109 self assert: p3 allNamedParsers first name = 'c' |
107 self assert: p3 allNamedParsers first name equals: 'c' |
110 ! |
108 ! |
111 |
109 |
112 testAllParsers |
110 testAllParsers |
113 | p1 p2 p3 | |
111 | p1 p2 p3 | |
114 p1 := #lowercase asParser. |
112 p1 := #lowercase asParser. |
115 p2 := p1 ==> #asUppercase. |
113 p2 := p1 ==> #asUppercase. |
116 p3 := PPUnresolvedParser new. |
114 p3 := PPUnresolvedParser new. |
117 p3 def: p2 / p3. |
115 p3 def: p2 / p3. |
118 self assert: p1 allParsers size = 1. |
116 self assert: p1 allParsers size equals: 1. |
119 self assert: p2 allParsers size = 2. |
117 self assert: p2 allParsers size equals: 2. |
120 self assert: p3 allParsers size = 3 |
118 self assert: p3 allParsers size equals: 3 |
121 ! |
119 ! |
122 |
120 |
123 testInnerChildren |
121 testInnerChildren |
124 | p1 p2 p3 | |
122 | p1 p2 p3 | |
125 p1 := (#digit asParser name: 'a'). |
123 p1 := #digit asParser name: 'a'. |
126 p2 := (#digit asParser star name: 'b'). |
124 p2 := #digit asParser star name: 'b'. |
127 p3 := (#digit asParser name: 'c') token star end. |
125 p3 := (#digit asParser name: 'c') token star end. |
128 self assert: p1 innerChildren isEmpty. |
126 self assert: p1 innerChildren isEmpty. |
129 self assert: p2 innerChildren size = 1. |
127 self assert: p2 innerChildren size equals: 1. |
130 self assert: (p2 innerChildren allSatisfy: [ :each | each name isNil ]). |
128 self assert: (p2 innerChildren allSatisfy: [ :each | each name isNil ]). |
131 self assert: p3 innerChildren size = 2. |
129 self assert: p3 innerChildren size equals: 2. |
132 self assert: (p3 innerChildren allSatisfy: [ :each | each name isNil ]) |
130 self assert: (p3 innerChildren allSatisfy: [ :each | each name isNil ]) |
133 ! |
131 ! |
134 |
132 |
135 testIsNullable |
133 testIsNullable |
136 self assert: $a asParser star isNullable. |
134 self assert: $a asParser star isNullable. |
161 self deny: ($a asParser not) isTerminal |
159 self deny: ($a asParser not) isTerminal |
162 ! |
160 ! |
163 |
161 |
164 testNamedChildren |
162 testNamedChildren |
165 | p1 p2 p3 p4 | |
163 | p1 p2 p3 p4 | |
166 p1 := (#digit asParser name: 'a'). |
164 p1 := #digit asParser name: 'a'. |
167 p2 := (#digit asParser name: 'b') star. |
165 p2 := (#digit asParser name: 'b') star. |
168 p3 := (#digit asParser name: 'c') token end. |
166 p3 := (#digit asParser name: 'c') token end. |
169 p4 := ((#digit asParser name: 'c') token name: 'd') end. |
167 p4 := ((#digit asParser name: 'c') token name: 'd') end. |
170 self assert: p1 namedChildren isEmpty. |
168 self assert: p1 namedChildren isEmpty. |
171 self assert: p2 namedChildren size = 1. |
169 self assert: p2 namedChildren size equals: 1. |
172 self assert: p2 namedChildren first name = 'b'. |
170 self assert: p2 namedChildren first name equals: 'b'. |
173 self assert: p3 namedChildren size = 1. |
171 self assert: p3 namedChildren size equals: 1. |
174 self assert: p3 namedChildren first name = 'c'. |
172 self assert: p3 namedChildren first name equals: 'c'. |
175 self assert: p4 namedChildren size = 1. |
173 self assert: p4 namedChildren size equals: 1. |
176 self assert: p4 namedChildren first name = 'd' |
174 self assert: p4 namedChildren first name equals: 'd' |
177 ! ! |
175 ! ! |
178 |
176 |
179 !PPAnalyzerTest methodsFor:'testing-cycleset'! |
177 !PPAnalyzerTest methodsFor:'testing-cycleset'! |
180 |
178 |
181 testCycleSetGrammarA |
179 testCycleSetGrammarA |
188 |
186 |
189 testCycleSetGrammarC |
187 testCycleSetGrammarC |
190 | grammar cycleSet | |
188 | grammar cycleSet | |
191 grammar := self grammarC. |
189 grammar := self grammarC. |
192 cycleSet := grammar cycleSet. |
190 cycleSet := grammar cycleSet. |
193 self assert: (cycleSet size = 2). |
191 self assert: cycleSet size equals: 2. |
194 self assert: (cycleSet includes: grammar) |
192 self assert: (cycleSet includes: grammar) |
195 ! |
193 ! |
196 |
194 |
197 testCycleSetGrammarD |
195 testCycleSetGrammarD |
198 | grammar cycleSet | |
196 | grammar cycleSet | |
199 grammar := self grammarD. |
197 grammar := self grammarD. |
200 |
|
201 cycleSet := (grammar at: #S) cycleSet. |
198 cycleSet := (grammar at: #S) cycleSet. |
202 self assert: (cycleSet size = 4). |
199 self assert: cycleSet size equals: 4. |
203 self assert: (cycleSet includes: (grammar at: #A)). |
200 self assert: (cycleSet includes: (grammar at: #A)). |
204 self assert: (cycleSet includes: (grammar at: #S)). |
201 self assert: (cycleSet includes: (grammar at: #S)). |
205 |
|
206 cycleSet := (grammar at: #A) cycleSet. |
202 cycleSet := (grammar at: #A) cycleSet. |
207 self assert: (cycleSet size = 4). |
203 self assert: cycleSet size equals: 4. |
208 self assert: (cycleSet includes: (grammar at: #A)). |
204 self assert: (cycleSet includes: (grammar at: #A)). |
209 self assert: (cycleSet includes: (grammar at: #S)). |
205 self assert: (cycleSet includes: (grammar at: #S)). |
210 |
|
211 cycleSet := (grammar at: #B) cycleSet. |
206 cycleSet := (grammar at: #B) cycleSet. |
212 self assert: (cycleSet size = 2). |
207 self assert: cycleSet size equals: 2. |
213 self assert: (cycleSet includes: (grammar at: #B)) |
208 self assert: (cycleSet includes: (grammar at: #B)) |
214 ! |
209 ! |
215 |
210 |
216 testCycleSetGrammarE |
211 testCycleSetGrammarE |
217 | grammar cycleSet | |
212 | grammar cycleSet | |
218 grammar := self grammarE. |
213 grammar := self grammarE. |
219 cycleSet := grammar cycleSet. |
214 cycleSet := grammar cycleSet. |
220 self assert: (cycleSet size = 1). |
215 self assert: cycleSet size equals: 1. |
221 self assert: (cycleSet includes: grammar) |
216 self assert: (cycleSet includes: grammar) |
222 ! |
217 ! |
223 |
218 |
224 testCycleSetInChoice |
219 testCycleSetInChoice |
225 | parser cycleSet | |
220 | parser cycleSet | |
226 parser := PPUnresolvedParser new. |
221 parser := PPUnresolvedParser new. |
227 parser def: parser / $a asParser. |
222 parser def: parser / $a asParser. |
228 cycleSet := parser cycleSet. |
223 cycleSet := parser cycleSet. |
229 self assert: (cycleSet size = 1). |
224 self assert: cycleSet size equals: 1. |
230 self assert: (cycleSet includes: parser). |
225 self assert: (cycleSet includes: parser). |
231 |
|
232 parser := PPUnresolvedParser new. |
226 parser := PPUnresolvedParser new. |
233 parser def: $a asParser / parser. |
227 parser def: $a asParser / parser. |
234 cycleSet := parser cycleSet. |
228 cycleSet := parser cycleSet. |
235 self assert: (cycleSet size = 1). |
229 self assert: cycleSet size equals: 1. |
236 self assert: (cycleSet includes: parser). |
230 self assert: (cycleSet includes: parser) |
237 ! |
231 ! |
238 |
232 |
239 testCycleSetInSequence |
233 testCycleSetInSequence |
240 | parser cycleSet | |
234 | parser cycleSet | |
241 parser := PPUnresolvedParser new. |
235 parser := PPUnresolvedParser new. |
242 parser def: parser , $a asParser. |
236 parser def: parser , $a asParser. |
243 cycleSet := parser cycleSet. |
237 cycleSet := parser cycleSet. |
244 self assert: (cycleSet size = 1). |
238 self assert: cycleSet size equals: 1. |
245 self assert: (cycleSet includes: parser). |
239 self assert: (cycleSet includes: parser). |
246 |
|
247 parser := PPUnresolvedParser new. |
240 parser := PPUnresolvedParser new. |
248 parser def: nil asParser , parser. |
241 parser def: nil asParser , parser. |
249 cycleSet := parser cycleSet. |
242 cycleSet := parser cycleSet. |
250 self assert: (cycleSet size = 1). |
243 self assert: cycleSet size equals: 1. |
251 self assert: (cycleSet includes: parser). |
244 self assert: (cycleSet includes: parser). |
252 |
|
253 parser := PPUnresolvedParser new. |
245 parser := PPUnresolvedParser new. |
254 parser def: $a asParser , parser. |
246 parser def: $a asParser , parser. |
255 cycleSet := parser cycleSet. |
247 cycleSet := parser cycleSet. |
256 self assert: cycleSet isEmpty |
248 self assert: cycleSet isEmpty |
257 ! ! |
249 ! ! |