38 ^ result |
38 ^ result |
39 ! |
39 ! |
40 |
40 |
41 fsaFrom: aNode |
41 fsaFrom: aNode |
42 ^ (aNode accept: generator) |
42 ^ (aNode accept: generator) |
43 compact; |
43 determinize; |
|
44 minimize; |
44 yourself |
45 yourself |
45 ! |
46 ! |
46 |
47 |
47 setUp |
48 setUp |
48 super setUp. |
49 super setUp. |
49 generator := PEGFsaGenerator new. |
50 generator := PEGFsaGenerator new. |
50 interpreter := PEGFsaInterpret new. |
51 interpreter := PEGFsaInterpret new. |
51 ! |
52 ! ! |
52 |
53 |
53 testAAA_Aplusnot |
54 !PEGFsaGeneratorTest methodsFor:'basic'! |
|
55 |
|
56 testAnyNode |
|
57 node := PPCAnyNode new |
|
58 yourself. |
|
59 |
|
60 fsa := self fsaFrom: node. |
|
61 |
|
62 self assert: fsa parse: 'a'. |
|
63 self assert: fsa parse: 'b'. |
|
64 self assert: fsa parse: String cr. |
|
65 self assert: fsa parse: String tab. |
|
66 ! |
|
67 |
|
68 testCharSetPredicateNode |
|
69 node := PPCCharSetPredicateNode new |
|
70 predicate: (PPCharSetPredicate on: [ :e | e = $a ]); |
|
71 yourself. |
|
72 |
|
73 fsa := self fsaFrom: node. |
|
74 |
|
75 self assert: fsa parse: 'a' end: 1. |
|
76 self assert: fsa parse: 'ab' end: 1. |
|
77 self assert: fsa fail: 'b'. |
|
78 ! |
|
79 |
|
80 testCharSetPredicateNode2 |
|
81 node := PPCCharSetPredicateNode new |
|
82 predicate: (PPCharSetPredicate on: [ :e | e isDigit ]); |
|
83 yourself. |
|
84 |
|
85 fsa := self fsaFrom: node. |
|
86 |
|
87 self assert: fsa parse: '1' end: 1. |
|
88 self assert: fsa parse: '0' end: 1. |
|
89 self assert: fsa parse: '5' end: 1. |
|
90 self assert: fsa fail: 'a'. |
|
91 ! |
|
92 |
|
93 testCharacterNode |
|
94 node := PPCCharacterNode new |
|
95 character: $a; |
|
96 yourself. |
|
97 |
|
98 fsa := self fsaFrom: node. |
|
99 |
|
100 self assert: fsa parse: 'a' end: 1. |
|
101 self assert: fsa parse: 'ab' end: 1. |
|
102 self assert: fsa fail: 'b'. |
|
103 ! |
|
104 |
|
105 testChoiceNode |
|
106 | literal1 literal2 | |
|
107 literal1 := PPCLiteralNode new |
|
108 literal: 'foo'; |
|
109 yourself. |
|
110 literal2 := PPCLiteralNode new |
|
111 literal: 'bar'; |
|
112 yourself. |
|
113 |
|
114 node := PPCChoiceNode new |
|
115 children: { literal1 . literal2 }; |
|
116 yourself. |
|
117 |
|
118 fsa := self fsaFrom: node. |
|
119 |
|
120 self assert: fsa parse: 'foo'. |
|
121 self assert: fsa parse: 'bar'. |
|
122 self assert: fsa fail: 'fof'. |
|
123 ! |
|
124 |
|
125 testEndOfFileNode |
|
126 node := PPCEndOfFileNode new |
|
127 yourself. |
|
128 |
|
129 fsa := self fsaFrom: node. |
|
130 |
|
131 self assert: fsa parse: '' end: 1. |
|
132 self assert: fsa fail: 'a'. |
|
133 ! |
|
134 |
|
135 testLiteralNode |
|
136 node := PPCLiteralNode new |
|
137 literal: 'foo'; |
|
138 yourself. |
|
139 |
|
140 fsa := self fsaFrom: node. |
|
141 |
|
142 self assert: fsa parse: 'foo' end: 3. |
|
143 self assert: fsa parse: 'foobar' end: 3. |
|
144 self assert: fsa fail: 'fox'. |
|
145 self assert: fsa fail: 'bar'. |
|
146 ! |
|
147 |
|
148 testLiteralNode2 |
|
149 node := PPCLiteralNode new |
|
150 literal: ''; |
|
151 yourself. |
|
152 |
|
153 fsa := self fsaFrom: node. |
|
154 |
|
155 self assert: fsa parse: ''. |
|
156 ! |
|
157 |
|
158 testNotNode |
|
159 | literal | |
|
160 literal := PPCLiteralNode new |
|
161 literal: 'foo'; |
|
162 yourself. |
|
163 |
|
164 node := PPCNotNode new |
|
165 child: literal; |
|
166 yourself. |
|
167 |
|
168 fsa := self fsaFrom: node. |
|
169 |
|
170 self assert: fsa parse: 'fo' end: 0. |
|
171 self assert: fsa parse: 'z' end: 0. |
|
172 self assert: fsa parse: 'foO' end: 0. |
|
173 self assert: fsa parse: 'bar' end: 0. |
|
174 self assert: fsa parse: ''. |
|
175 self assert: fsa fail: 'foo'. |
|
176 ! |
|
177 |
|
178 testPlusNode |
|
179 | literal | |
|
180 literal := PPCLiteralNode new |
|
181 literal: 'foo'; |
|
182 yourself. |
|
183 |
|
184 node := PPCPlusNode new |
|
185 child: literal; |
|
186 yourself. |
|
187 |
|
188 fsa := self fsaFrom: node. |
|
189 |
|
190 self assert: fsa fail: ''. |
|
191 self assert: fsa parse: 'foo'. |
|
192 self assert: fsa parse: 'foofoofoo'. |
|
193 ! |
|
194 |
|
195 testSequenceNode |
|
196 | literal1 literal2 | |
|
197 literal1 := PPCLiteralNode new |
|
198 literal: 'foo'; |
|
199 yourself. |
|
200 literal2 := PPCLiteralNode new |
|
201 literal: 'bar'; |
|
202 yourself. |
|
203 |
|
204 node := PPCSequenceNode new |
|
205 children: { literal1 . literal2 }; |
|
206 yourself. |
|
207 |
|
208 fsa := self fsaFrom: node. |
|
209 |
|
210 self assert: fsa parse: 'foobar'. |
|
211 self assert: fsa fail: 'foo'. |
|
212 self assert: fsa fail: 'bar'. |
|
213 ! |
|
214 |
|
215 testSequenceNode2 |
|
216 | literal1 literal2 literal3 | |
|
217 literal1 := PPCLiteralNode new |
|
218 literal: 'b'; |
|
219 yourself. |
|
220 literal2 := PPCLiteralNode new |
|
221 literal: 'a'; |
|
222 yourself. |
|
223 literal3 := PPCLiteralNode new |
|
224 literal: 'z'; |
|
225 yourself. |
|
226 |
|
227 node := PPCSequenceNode new |
|
228 children: { literal1 . literal2 . literal3 }; |
|
229 yourself. |
|
230 |
|
231 fsa := self fsaFrom: node. |
|
232 |
|
233 self assert: fsa parse: 'baz'. |
|
234 self assert: fsa fail: 'bar'. |
|
235 self assert: fsa fail: 'faz'. |
|
236 self assert: fsa fail: 'boz'. |
|
237 ! |
|
238 |
|
239 testSequenceNode3 |
|
240 | literal1 literal2 literal3 choice | |
|
241 literal1 := PPCLiteralNode new |
|
242 literal: 'a'; |
|
243 yourself. |
|
244 literal2 := PPCLiteralNode new |
|
245 literal: 'b'; |
|
246 yourself. |
|
247 |
|
248 literal3 := PPCLiteralNode new |
|
249 literal: 'c'; |
|
250 yourself. |
|
251 |
|
252 |
|
253 choice := PPCChoiceNode new |
|
254 children: { literal1 . literal2 }; |
|
255 yourself. |
|
256 |
|
257 node := PPCSequenceNode new |
|
258 children: { choice . literal3 }; |
|
259 yourself. |
|
260 |
|
261 fsa := self fsaFrom: node. |
|
262 |
|
263 |
|
264 self assert: fsa parse: 'ac'. |
|
265 self assert: fsa parse: 'bc'. |
|
266 self assert: fsa fail: 'a'. |
|
267 self assert: fsa fail: 'b'. |
|
268 self assert: fsa fail: 'c'. |
|
269 ! |
|
270 |
|
271 testStarNode |
|
272 | literal | |
|
273 literal := PPCLiteralNode new |
|
274 literal: 'foo'; |
|
275 yourself. |
|
276 |
|
277 node := PPCStarNode new |
|
278 child: literal; |
|
279 yourself. |
|
280 |
|
281 fsa := self fsaFrom: node. |
|
282 |
|
283 self assert: fsa parse: ''. |
|
284 self assert: fsa parse: 'foo'. |
|
285 self assert: fsa parse: 'foofoofoo'. |
|
286 ! ! |
|
287 |
|
288 !PEGFsaGeneratorTest methodsFor:'complex'! |
|
289 |
|
290 testAAAAnot_Astar |
|
291 | parser | |
|
292 parser := 'aaaa' asParser not, ($a asParser star). |
|
293 node := parser asCompilerTree. |
|
294 |
|
295 fsa := self fsaFrom: node. |
|
296 |
|
297 self assert: fsa parse: ''. |
|
298 self assert: fsa parse: 'a'. |
|
299 self assert: fsa parse: 'aa'. |
|
300 self assert: fsa parse: 'aaa'. |
|
301 |
|
302 self assert: fsa fail: 'aaaa'. |
|
303 self assert: fsa fail: 'aaaaa'. |
|
304 self assert: fsa fail: 'aaaaaa'. |
|
305 self assert: fsa fail: 'aaaaaaa'. |
|
306 ! |
|
307 |
|
308 testAAAAorA_AA |
|
309 | parser | |
|
310 parser := ('aaaaa' asParser / 'a' asParser), 'aa' asParser. |
|
311 node := parser asCompilerTree. |
|
312 |
|
313 fsa := self fsaFrom: node. |
|
314 |
|
315 self assert: fsa parse: 'aaaaaaa'. |
|
316 self assert: fsa parse: 'aaa'. |
|
317 self assert: fsa parse: 'aaaa' end: 3. |
|
318 |
|
319 self assert: fsa fail: 'a'. |
|
320 self assert: fsa fail: 'aa'. |
|
321 self assert: fsa fail: 'aaaaa'. |
|
322 self assert: fsa fail: 'aaaaaa'. |
|
323 ! |
|
324 |
|
325 testAAAnot_Aplus |
54 | parser | |
326 | parser | |
55 parser := 'aaa' asParser not, $a asParser plus. |
327 parser := 'aaa' asParser not, $a asParser plus. |
56 node := parser asCompilerTree. |
328 node := parser asCompilerTree. |
57 |
329 |
58 fsa := self fsaFrom: node. |
330 fsa := self fsaFrom: node. |
63 self assert: fsa fail: 'aaa'. |
335 self assert: fsa fail: 'aaa'. |
64 self assert: fsa fail: 'aaaa'. |
336 self assert: fsa fail: 'aaaa'. |
65 self assert: fsa fail: 'aaaaa'. |
337 self assert: fsa fail: 'aaaaa'. |
66 ! |
338 ! |
67 |
339 |
|
340 testAAAorA_A |
|
341 | parser | |
|
342 parser := ('aaa' asParser / 'a' asParser), 'a' asParser. |
|
343 node := parser asCompilerTree. |
|
344 |
|
345 fsa := self fsaFrom: node. |
|
346 |
|
347 self assert: fsa parse: 'aaaa'. |
|
348 self assert: fsa parse: 'aa'. |
|
349 self assert: fsa fail: 'aaa'. |
|
350 self assert: fsa fail: 'a'. |
|
351 ! |
|
352 |
|
353 testAAAorA_AA |
|
354 | parser | |
|
355 parser := ('aaa' asParser / 'a' asParser), 'aa' asParser. |
|
356 node := parser asCompilerTree. |
|
357 |
|
358 fsa := self fsaFrom: node. |
|
359 |
|
360 self assert: fsa parse: 'aaaaa'. |
|
361 self assert: fsa parse: 'aaaaaa' end: 5. |
|
362 self assert: fsa parse: 'aaaaaaa' end: 5. |
|
363 |
|
364 self assert: fsa fail: 'a'. |
|
365 self assert: fsa fail: 'aa'. |
|
366 self assert: fsa fail: 'aaa'. |
|
367 self assert: fsa fail: 'aaaa'. |
|
368 ! |
|
369 |
|
370 testAAAorA_Astar |
|
371 | parser | |
|
372 parser := (('aaa' asParser / 'a' asParser), 'a' asParser) star. |
|
373 node := parser asCompilerTree. |
|
374 |
|
375 fsa := self fsaFrom: node. |
|
376 |
|
377 self assert: fsa parse: ''. |
|
378 self assert: fsa parse: 'aa'. |
|
379 self assert: fsa parse: 'aaaa'. |
|
380 self assert: fsa parse: 'aaaaaa'. |
|
381 self assert: fsa parse: 'aaaaaaaa'. |
|
382 |
|
383 "So far the FSA cannot handle loops with such as tokens as aaa/a, a" |
|
384 self flag: 'not working :('. |
|
385 self assert: fsa parse: 'aaaaaaa' end: 4. |
|
386 |
|
387 self assert: fsa fail: 'aaa'. |
|
388 self assert: fsa fail: 'a'. |
|
389 ! |
|
390 |
|
391 testAAAstar_AA |
|
392 | parser | |
|
393 parser := ('aaa' asParser) star, 'aa' asParser. |
|
394 node := parser asCompilerTree. |
|
395 |
|
396 fsa := self fsaFrom: node. |
|
397 |
|
398 self assert: fsa parse: 'aa'. |
|
399 self assert: fsa parse: 'aaaaa'. |
|
400 self assert: fsa parse: 'aaaaaaaa'. |
|
401 |
|
402 self assert: fsa fail: 'a'. |
|
403 self assert: fsa fail: 'aaa'. |
|
404 self assert: fsa fail: 'aaaa'. |
|
405 self assert: fsa fail: 'aaaaaaa'. |
|
406 ! |
|
407 |
|
408 testAAorA_A |
|
409 | parser | |
|
410 parser := ('aa' asParser / 'a' asParser), 'a' asParser. |
|
411 node := parser asCompilerTree. |
|
412 |
|
413 fsa := self fsaFrom: node. |
|
414 |
|
415 self assert: fsa parse: 'aaa'. |
|
416 self assert: fsa fail: 'aa'. |
|
417 self assert: fsa fail: 'a'. |
|
418 ! |
|
419 |
|
420 testAAorA_AAorA |
|
421 | parser | |
|
422 parser := ('aa' asParser / 'a' asParser), ('aa' asParser / 'a' asParser). |
|
423 node := parser asCompilerTree. |
|
424 |
|
425 fsa := self fsaFrom: node. |
|
426 |
|
427 self assert: fsa parse: 'aaaa'. |
|
428 self assert: fsa parse: 'aaa'. |
|
429 |
|
430 self assert: fsa fail: ''. |
|
431 self assert: fsa fail: 'a'. |
|
432 self assert: fsa fail: 'aa'. |
|
433 ! |
|
434 |
|
435 testAAorA_A_B |
|
436 | parser | |
|
437 parser := ('aa' asParser / 'a' asParser), 'a' asParser, 'b' asParser. |
|
438 node := parser asCompilerTree. |
|
439 |
|
440 fsa := self fsaFrom: node. |
|
441 |
|
442 self assert: fsa parse: 'aaab'. |
|
443 self assert: fsa fail: 'aab'. |
|
444 ! |
|
445 |
68 testAAplusA |
446 testAAplusA |
69 | parser | |
447 | parser | |
70 parser := 'aa' asParser plus, $a asParser. |
448 parser := 'aa' asParser plus, $a asParser. |
71 node := parser asCompilerTree. |
449 node := parser asCompilerTree. |
72 |
450 |
250 self assert: fsa fail: '_'. |
711 self assert: fsa fail: '_'. |
251 self assert: fsa fail: '()'. |
712 self assert: fsa fail: '()'. |
252 self assert: fsa fail: ''. |
713 self assert: fsa fail: ''. |
253 ! |
714 ! |
254 |
715 |
255 testCharSetPredicateNode |
716 testChoice |
256 node := PPCCharSetPredicateNode new |
|
257 predicate: (PPCharSetPredicate on: [ :e | e = $a ]); |
|
258 yourself. |
|
259 |
|
260 fsa := self fsaFrom: node. |
|
261 |
|
262 self assert: fsa parse: 'a' end: 1. |
|
263 self assert: fsa parse: 'ab' end: 1. |
|
264 self assert: fsa fail: 'b'. |
|
265 ! |
|
266 |
|
267 testCharSetPredicateNode2 |
|
268 node := PPCCharSetPredicateNode new |
|
269 predicate: (PPCharSetPredicate on: [ :e | e isDigit ]); |
|
270 yourself. |
|
271 |
|
272 fsa := self fsaFrom: node. |
|
273 |
|
274 self assert: fsa parse: '1' end: 1. |
|
275 self assert: fsa parse: '0' end: 1. |
|
276 self assert: fsa parse: '5' end: 1. |
|
277 self assert: fsa fail: 'a'. |
|
278 ! |
|
279 |
|
280 testCharacterNode |
|
281 node := PPCCharacterNode new |
|
282 character: $a; |
|
283 yourself. |
|
284 |
|
285 fsa := self fsaFrom: node. |
|
286 |
|
287 self assert: fsa parse: 'a' end: 1. |
|
288 self assert: fsa parse: 'ab' end: 1. |
|
289 self assert: fsa fail: 'b'. |
|
290 ! |
|
291 |
|
292 testChoiceNode |
|
293 | literal1 literal2 | |
|
294 literal1 := PPCLiteralNode new |
|
295 literal: 'foo'; |
|
296 yourself. |
|
297 literal2 := PPCLiteralNode new |
|
298 literal: 'bar'; |
|
299 yourself. |
|
300 |
|
301 node := PPCChoiceNode new |
|
302 children: { literal1 . literal2 }; |
|
303 yourself. |
|
304 |
|
305 fsa := self fsaFrom: node. |
|
306 |
|
307 self assert: fsa parse: 'foo'. |
|
308 self assert: fsa parse: 'bar'. |
|
309 self assert: fsa fail: 'fof'. |
|
310 ! |
|
311 |
|
312 testChoicePriorities |
|
313 | parser | |
717 | parser | |
314 parser := ($a asParser optional, $b asParser optional) / $a asParser. |
718 parser := ($a asParser optional, $b asParser optional) / $a asParser. |
315 node := parser asCompilerTree. |
719 node := parser asCompilerTree. |
316 |
720 |
317 fsa := self fsaFrom: node. |
721 fsa := self fsaFrom: node. |
318 |
722 |
319 self assert: fsa parse: 'ab'. |
723 self assert: fsa parse: 'ab'. |
320 self assert: fsa parse: 'a' end: 1. |
724 self assert: fsa parse: 'a' end: 1. |
321 self assert: fsa parse: 'b' end: 1. |
725 self assert: fsa parse: 'b' end: 1. |
322 self assert: fsa parse: ''. |
726 self assert: fsa parse: ''. |
323 self assert: fsa parse: 'c' end: 0. |
727 self assert: fsa parse: 'c' end: 0. |
324 ! |
728 ! |
325 |
729 |
326 testLiteralNode |
730 testChoice2 |
327 node := PPCLiteralNode new |
731 | parser | |
328 literal: 'foo'; |
732 parser := 'aaa' asParser / 'aa' asParser / 'a' asParser. |
329 yourself. |
733 node := parser asCompilerTree. |
330 |
734 |
331 fsa := self fsaFrom: node. |
735 fsa := self fsaFrom: node. |
332 |
736 |
333 self assert: fsa parse: 'foo' end: 3. |
737 self assert: fsa parse: 'aaa'. |
334 self assert: fsa parse: 'foobar' end: 3. |
738 self assert: fsa parse: 'aa'. |
335 self assert: fsa fail: 'fox'. |
739 self assert: fsa parse: 'a' |
336 self assert: fsa fail: 'bar'. |
740 ! |
337 ! |
741 |
338 |
742 testIdentity |
339 testLiteralNode2 |
743 | parser quot | |
340 node := PPCLiteralNode new |
744 quot := $" asParser. |
341 literal: ''; |
745 parser := quot, $a asParser star, quot. |
342 yourself. |
746 node := parser asCompilerTree. |
343 |
747 |
344 fsa := self fsaFrom: node. |
748 fsa := self fsaFrom: node. |
345 |
749 |
346 self assert: fsa parse: ''. |
750 self assert: fsa parse: '""'. |
|
751 self assert: fsa parse: '"a"'. |
|
752 self assert: fsa parse: '"aa"'. |
|
753 self assert: fsa parse: '"aaaaaaaa"'. |
|
754 ! |
|
755 |
|
756 testKwPlus |
|
757 | parser | |
|
758 parser := (#word asParser plus, $: asParser) plus. |
|
759 node := parser asCompilerTree. |
|
760 |
|
761 fsa := self fsaFrom: node. |
|
762 |
|
763 self assert: fsa parse: 'foo:bar:baz:'. |
|
764 self assert: fsa parse: 'foo:bar:baz' end: 8. |
|
765 |
|
766 self assert: fsa fail: ''. |
|
767 self assert: fsa fail: 'foo'. |
347 ! |
768 ! |
348 |
769 |
349 testNot |
770 testNot |
350 | parser | |
771 | parser | |
351 parser := 'aaa' asParser not, $a asParser plus. |
772 parser := 'aaa' asParser not, $a asParser plus. |
352 node := parser asCompilerTree. |
773 node := parser asCompilerTree. |
|
774 |
353 fsa := self fsaFrom: node. |
775 fsa := self fsaFrom: node. |
354 |
776 |
355 self assert: fsa parse: 'a'. |
777 self assert: fsa parse: 'a'. |
356 self assert: fsa parse: 'aa'. |
778 self assert: fsa parse: 'aa'. |
357 self assert: fsa fail: 'aaa'. |
779 self assert: fsa fail: 'aaa'. |
358 self assert: fsa fail: 'aaaa'. |
780 self assert: fsa fail: 'aaaa'. |
|
781 self assert: fsa fail: 'aaaaa'. |
359 self assert: fsa fail: ''. |
782 self assert: fsa fail: ''. |
360 ! |
783 ! |
361 |
784 |
362 testNotNode |
785 testOptional |
363 | literal | |
786 | parser | |
364 literal := PPCLiteralNode new |
787 parser := ($a asParser optional, $b asParser optional) / $a asParser. |
365 literal: 'foo'; |
788 node := parser asCompilerTree. |
366 yourself. |
789 |
367 |
790 fsa := self fsaFrom: node. |
368 node := PPCNotNode new |
791 |
369 child: literal; |
792 self assert: fsa parse: 'ab'. |
370 yourself. |
793 self assert: fsa parse: 'a' end: 1. |
371 |
794 self assert: fsa parse: 'b' end: 1. |
372 fsa := self fsaFrom: node. |
|
373 |
|
374 self assert: fsa parse: 'fo' end: 0. |
|
375 self assert: fsa parse: 'z' end: 0. |
|
376 self assert: fsa parse: 'foO' end: 0. |
|
377 self assert: fsa parse: 'bar' end: 0. |
|
378 self assert: fsa parse: ''. |
795 self assert: fsa parse: ''. |
379 self assert: fsa fail: 'foo'. |
796 self assert: fsa parse: 'c' end: 0. |
380 ! |
797 ! |
381 |
798 |
382 testPlusNode |
799 testOptional2 |
383 | literal | |
800 | parser | |
384 literal := PPCLiteralNode new |
801 parser := ($a asParser, $b asParser optional) / 'ac' asParser. |
385 literal: 'foo'; |
802 node := parser asCompilerTree. |
386 yourself. |
803 |
387 |
804 fsa := self fsaFrom: node. |
388 node := PPCPlusNode new |
805 |
389 child: literal; |
806 self assert: fsa parse: 'ab'. |
390 yourself. |
807 self assert: fsa parse: 'a'. |
391 |
808 self assert: fsa fail: 'b'. |
392 fsa := self fsaFrom: node. |
809 self assert: fsa parse: 'ac' end: 1. |
393 |
810 ! |
|
811 |
|
812 testPlus |
|
813 | parser | |
|
814 parser := ('aa' asParser) plus, ('a' asParser / 'aa' asParser). |
|
815 node := parser asCompilerTree. |
|
816 |
|
817 fsa := self fsaFrom: node. |
|
818 |
|
819 self assert: fsa parse: 'aaa'. |
|
820 self assert: fsa parse: 'aaaaa'. |
|
821 |
|
822 self assert: fsa fail: 'a'. |
|
823 self assert: fsa fail: 'aa'. |
|
824 self assert: fsa fail: 'aaaa'. |
|
825 ! |
|
826 |
|
827 testPlus2 |
|
828 | parser | |
|
829 parser := ('aaaaaa' asParser / 'a' asParser) plus. |
|
830 node := parser asCompilerTree. |
|
831 |
|
832 fsa := self fsaFrom: node. |
|
833 |
|
834 self assert: fsa parse: 'a'. |
|
835 self assert: fsa parse: 'aa'. |
|
836 self assert: fsa parse: 'aaa'. |
|
837 self assert: fsa parse: 'aaaa'. |
|
838 self assert: fsa parse: 'aaaaa'. |
|
839 self assert: fsa parse: 'aaaaaa'. |
|
840 self assert: fsa parse: 'aaaaaaa'. |
|
841 |
394 self assert: fsa fail: ''. |
842 self assert: fsa fail: ''. |
|
843 ! |
|
844 |
|
845 testPlus3 |
|
846 | parser | |
|
847 parser := ('aaaaaa' asParser / 'aa' asParser) plus. |
|
848 node := parser asCompilerTree. |
|
849 |
|
850 fsa := self fsaFrom: node. |
|
851 |
|
852 self assert: fsa parse: 'aa'. |
|
853 self assert: fsa parse: 'aaaa'. |
|
854 self assert: fsa parse: 'aaaaaa'. |
|
855 |
|
856 self assert: fsa fail: ''. |
|
857 self assert: fsa fail: 'a'. |
|
858 |
|
859 self assert: fsa parse: 'aaa' end: 2. |
|
860 self assert: fsa parse: 'aaaaa' end: 4. |
|
861 self assert: fsa parse: 'aaaaaaa' end: 6. |
|
862 |
|
863 ! |
|
864 |
|
865 testPlus4 |
|
866 | parser | |
|
867 parser := ('aaa' asParser / 'aa' asParser / 'a' asParser) plus. |
|
868 node := parser asCompilerTree. |
|
869 |
|
870 |
|
871 fsa := self fsaFrom: node. |
|
872 |
|
873 self assert: fsa parse: 'a'. |
|
874 self assert: fsa parse: 'aa'. |
|
875 self assert: fsa parse: 'aaa'. |
|
876 self assert: fsa parse: 'aaaa'. |
|
877 self assert: fsa parse: 'aaaaa'. |
|
878 self assert: fsa parse: 'aaaaaa'. |
|
879 ! |
|
880 |
|
881 testPlus5 |
|
882 | parser | |
|
883 parser := ('aaa' asParser / 'aa' asParser / 'b' asParser) plus. |
|
884 node := parser asCompilerTree. |
|
885 |
|
886 |
|
887 fsa := self fsaFrom: node. |
|
888 |
|
889 |
|
890 self assert: fsa parse: 'b'. |
|
891 self assert: fsa parse: 'bb'. |
|
892 self assert: fsa parse: 'bbaaa'. |
|
893 self assert: fsa parse: 'bbaaabbaa'. |
|
894 |
|
895 self assert: fsa parse: 'aa'. |
|
896 self assert: fsa parse: 'aaa'. |
|
897 self assert: fsa parse: 'aaaaa'. |
|
898 self assert: fsa parse: 'aaaaaa'. |
|
899 self assert: fsa parse: 'aaaaaab'. |
|
900 |
|
901 self assert: fsa parse: 'bba' end: 2. |
|
902 self assert: fsa parse: 'aaaa' end: 3. |
|
903 ! |
|
904 |
|
905 testSequence |
|
906 | parser | |
|
907 parser := ('aa' asParser plus), ('aa' asParser plus). |
|
908 node := parser asCompilerTree. |
|
909 |
|
910 fsa := self fsaFrom: node. |
|
911 |
|
912 self assert: fsa fail: 'a'. |
|
913 self assert: fsa fail: 'aa'. |
|
914 self assert: fsa fail: 'aaa'. |
|
915 self assert: fsa fail: 'aaaa'. |
|
916 self assert: fsa fail: 'aaaaa'. |
|
917 self assert: fsa fail: 'aaaaaa'. |
|
918 ! |
|
919 |
|
920 testSequence2 |
|
921 | parser | |
|
922 parser := ('aa' asParser star), ('bb' asParser star). |
|
923 node := parser asCompilerTree. |
|
924 |
|
925 fsa := self fsaFrom: node. |
|
926 |
|
927 self assert: fsa parse: 'aa'. |
|
928 self assert: fsa parse: 'aaaa'. |
|
929 self assert: fsa parse: 'aaaaaa'. |
|
930 self assert: fsa parse: 'aaaaaaaa'. |
|
931 |
|
932 self assert: fsa parse: 'a' end: 0. |
|
933 self assert: fsa parse: 'aaa' end: 2. |
|
934 self assert: fsa parse: 'aaaaa' end: 4. |
|
935 self assert: fsa parse: 'aaaaaaa' end: 6. |
|
936 self assert: fsa parse: 'aaaaaaaaa' end: 8. |
|
937 ! |
|
938 |
|
939 testSequence3 |
|
940 | parser | |
|
941 parser := 'a' asParser, 'b' asParser. |
|
942 node := parser asCompilerTree. |
|
943 |
|
944 fsa := self fsaFrom: node. |
|
945 |
|
946 self assert: (fsa states noneSatisfy: [ :s | s isFsaFailure ]). |
|
947 ! |
|
948 |
|
949 testSequence4 |
|
950 | parser | |
|
951 parser := 'a' asParser star, 'b' asParser. |
|
952 node := parser asCompilerTree. |
|
953 |
|
954 fsa := self fsaFrom: node. |
|
955 |
|
956 self assert: (fsa states noneSatisfy: [ :s | s isFsaFailure ]). |
|
957 ! |
|
958 |
|
959 testUnaryOrKw |
|
960 | parser unary kw | |
|
961 unary := #letter asParser plus, $: asParser not. |
|
962 kw := #letter asParser plus, $: asParser. |
|
963 parser := unary / kw. |
|
964 node := parser asCompilerTree. |
|
965 |
|
966 fsa := self fsaFrom: node. |
|
967 |
395 self assert: fsa parse: 'foo'. |
968 self assert: fsa parse: 'foo'. |
396 self assert: fsa parse: 'foofoofoo'. |
969 self assert: fsa parse: 'foo:'. |
397 ! |
970 |
398 |
971 self assert: fsa fail: '123'. |
399 testSequenceNode |
972 ! |
400 | literal1 literal2 | |
973 |
401 literal1 := PPCLiteralNode new |
974 testUnaryOrKwPlus |
402 literal: 'foo'; |
975 | parser unary kw | |
403 yourself. |
976 unary := #letter asParser plus, $: asParser not. |
404 literal2 := PPCLiteralNode new |
977 kw := #letter asParser plus, $: asParser. |
405 literal: 'bar'; |
978 parser := (unary / kw) plus. |
406 yourself. |
979 node := parser asCompilerTree. |
407 |
980 |
408 node := PPCSequenceNode new |
981 fsa := self fsaFrom: node. |
409 children: { literal1 . literal2 }; |
982 |
410 yourself. |
|
411 |
|
412 fsa := self fsaFrom: node. |
|
413 |
|
414 self assert: fsa parse: 'foobar'. |
|
415 self assert: fsa fail: 'foo'. |
|
416 self assert: fsa fail: 'bar'. |
|
417 ! |
|
418 |
|
419 testSequenceNode2 |
|
420 | literal1 literal2 literal3 | |
|
421 literal1 := PPCLiteralNode new |
|
422 literal: 'b'; |
|
423 yourself. |
|
424 literal2 := PPCLiteralNode new |
|
425 literal: 'a'; |
|
426 yourself. |
|
427 literal3 := PPCLiteralNode new |
|
428 literal: 'z'; |
|
429 yourself. |
|
430 |
|
431 node := PPCSequenceNode new |
|
432 children: { literal1 . literal2 . literal3 }; |
|
433 yourself. |
|
434 |
|
435 fsa := self fsaFrom: node. |
|
436 |
|
437 self assert: fsa parse: 'baz'. |
|
438 self assert: fsa fail: 'bar'. |
|
439 self assert: fsa fail: 'faz'. |
|
440 self assert: fsa fail: 'boz'. |
|
441 ! |
|
442 |
|
443 testStarNode |
|
444 | literal | |
|
445 literal := PPCLiteralNode new |
|
446 literal: 'foo'; |
|
447 yourself. |
|
448 |
|
449 node := PPCStarNode new |
|
450 child: literal; |
|
451 yourself. |
|
452 |
|
453 fsa := self fsaFrom: node. |
|
454 |
|
455 self assert: fsa parse: ''. |
|
456 self assert: fsa parse: 'foo'. |
983 self assert: fsa parse: 'foo'. |
457 self assert: fsa parse: 'foofoofoo'. |
984 self assert: fsa parse: 'foo:'. |
|
985 self assert: fsa parse: 'foo:bar:'. |
|
986 self assert: fsa fail: '123'. |
|
987 ! |
|
988 |
|
989 testUnaryOrMultiword |
|
990 | parser unary kw | |
|
991 unary := #letter asParser plus, $: asParser not. |
|
992 kw := #letter asParser plus, $: asParser. |
|
993 parser := unary / (kw plus). |
|
994 node := parser asCompilerTree. |
|
995 |
|
996 fsa := self fsaFrom: node. |
|
997 |
|
998 self assert: fsa parse: 'foo'. |
|
999 self assert: fsa parse: 'foo:'. |
|
1000 self assert: fsa parse: 'foo:bar:'. |
|
1001 self assert: fsa fail: '123'. |
|
1002 ! ! |
|
1003 |
|
1004 !PEGFsaGeneratorTest methodsFor:'recursive'! |
|
1005 |
|
1006 testRecursive |
|
1007 | parser | |
|
1008 parser := PPDelegateParser new. |
|
1009 |
|
1010 parser setParser: ($a asParser, parser) / $b asParser. |
|
1011 node := parser asCompilerTree. |
|
1012 |
|
1013 fsa := self fsaFrom: node. |
|
1014 |
|
1015 self assert: fsa parse: 'b'. |
|
1016 self assert: fsa parse: 'ab'. |
|
1017 self assert: fsa parse: 'aaab'. |
|
1018 self assert: fsa fail: 'aaa'. |
|
1019 self assert: fsa fail: ''. |
|
1020 self assert: fsa fail: 'aac'. |
|
1021 ! |
|
1022 |
|
1023 testRecursive2 |
|
1024 | parser | |
|
1025 parser := PPDelegateParser new. |
|
1026 |
|
1027 parser setParser: (($a asParser / $b asParser), parser) / $c asParser. |
|
1028 node := parser asCompilerTree. |
|
1029 |
|
1030 fsa := self fsaFrom: node. |
|
1031 |
|
1032 self assert: fsa parse: 'c'. |
|
1033 self assert: fsa parse: 'ac'. |
|
1034 self assert: fsa parse: 'bc'. |
|
1035 self assert: fsa parse: 'ababc'. |
|
1036 self assert: fsa fail: 'aaab'. |
|
1037 self assert: fsa fail: 'ab'. |
458 ! ! |
1038 ! ! |
459 |
1039 |
460 !PEGFsaGeneratorTest class methodsFor:'documentation'! |
1040 !PEGFsaGeneratorTest class methodsFor:'documentation'! |
461 |
1041 |
462 version_HG |
1042 version_HG |