|
1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }" |
|
2 |
|
3 "{ NameSpace: Smalltalk }" |
|
4 |
|
5 TestCase subclass:#PEGFsaDeterminizationTest |
|
6 instanceVariableNames:'fsa a b c result d interpreter e' |
|
7 classVariableNames:'' |
|
8 poolDictionaries:'' |
|
9 category:'PetitCompiler-Tests-FSA' |
|
10 ! |
|
11 |
|
12 !PEGFsaDeterminizationTest methodsFor:'as yet unclassified'! |
|
13 |
|
14 assert: anFsa fail: input |
|
15 | stream | |
|
16 stream := input asPetitStream. |
|
17 |
|
18 result := interpreter interpret: anFsa on: stream. |
|
19 |
|
20 self assert: result isEmpty. |
|
21 ^ result |
|
22 ! |
|
23 |
|
24 assert: anFsa parse: input retval: name |
|
25 ^ self assert: anFsa parse: input retval: name end: input size |
|
26 ! |
|
27 |
|
28 assert: anFsa parse: input retval: name end: end |
|
29 | stream | |
|
30 stream := input asPetitStream. |
|
31 |
|
32 result := interpreter interpret: anFsa on: stream. |
|
33 |
|
34 self assert: result isEmpty not. |
|
35 self assert: ((result at: name) = end) description: 'wrong position'. |
|
36 |
|
37 ^ result |
|
38 ! |
|
39 |
|
40 assertFail: name |
|
41 self assert: (result includesKey: name) not |
|
42 ! |
|
43 |
|
44 assertPass: name |
|
45 self assert: (result includesKey: name) |
|
46 ! |
|
47 |
|
48 setUp |
|
49 a := PEGFsaState new name: #a; retval: #a; yourself. |
|
50 b := PEGFsaState new name: #b; retval: #b; yourself. |
|
51 c := PEGFsaState new name: #c; retval: #c; yourself. |
|
52 d := PEGFsaState new name: #d; retval: #d; yourself. |
|
53 e := PEGFsaState new name: #e; retval: #e; yourself. |
|
54 |
|
55 fsa := PEGFsa new. |
|
56 |
|
57 interpreter := PEGFsaInterpret new |
|
58 yourself. |
|
59 ! |
|
60 |
|
61 testAAplusA |
|
62 fsa addState: a. |
|
63 fsa addState: b. |
|
64 fsa addState: c. |
|
65 fsa addState: d. |
|
66 fsa addState: e. |
|
67 fsa startState: a. |
|
68 fsa finalState: e. |
|
69 |
|
70 fsa addTransitionFrom: a to: b on: $a. |
|
71 fsa addTransitionFrom: b to: c on: $a. |
|
72 fsa addTransitionFrom: c to: a. |
|
73 fsa addTransitionFrom: c to: d priority: -1. |
|
74 fsa addTransitionFrom: d to: e on: $a. |
|
75 |
|
76 c priority: 0. |
|
77 |
|
78 fsa determinize. |
|
79 |
|
80 " self assert: fsa states size = 3." |
|
81 self assert: fsa isDeterministic. |
|
82 self assert: fsa isWithoutEpsilons. |
|
83 |
|
84 self assert: fsa fail: 'a'. |
|
85 self assert: fsa fail: 'aa'. |
|
86 self assert: fsa fail: 'aaaa'. |
|
87 |
|
88 self assert: fsa parse: 'aaa' retval: #e. |
|
89 self assert: fsa parse: 'aaaaa' retval: #e. |
|
90 self assert: fsa parse: 'aaaaaaa' retval: #e. |
|
91 ! |
|
92 |
|
93 testAB |
|
94 fsa addState: a. |
|
95 fsa addState: b. |
|
96 fsa addState: c. |
|
97 fsa addState: d. |
|
98 fsa startState: a. |
|
99 fsa finalState: d. |
|
100 |
|
101 fsa addTransitionFrom: a to: b on: $a. |
|
102 fsa addTransitionFrom: c to: d on: $b. |
|
103 fsa addTransitionFrom: b to: c priority: -1. |
|
104 |
|
105 fsa determinize. |
|
106 |
|
107 self assert: fsa states size = 3. |
|
108 self assert: fsa isDeterministic. |
|
109 self assert: fsa isWithoutEpsilons. |
|
110 |
|
111 self assert: fsa parse: 'ab' retval: #d. |
|
112 self assert: fsa parse: 'abc' retval: #d end: 2. |
|
113 |
|
114 self assert: fsa fail: 'ac'. |
|
115 ! |
|
116 |
|
117 testAPlusA |
|
118 fsa addState: a. |
|
119 fsa addState: b. |
|
120 fsa addState: c. |
|
121 fsa addState: d. |
|
122 fsa startState: a. |
|
123 fsa finalState: d. |
|
124 |
|
125 fsa addTransitionFrom: a to: b on: $a. |
|
126 fsa addTransitionFrom: b to: a. |
|
127 fsa addTransitionFrom: b to: c priority: -1. |
|
128 fsa addTransitionFrom: c to: d on: $a. |
|
129 |
|
130 b priority: 0. |
|
131 |
|
132 fsa determinize. |
|
133 |
|
134 " self assert: fsa states size = 2." |
|
135 self assert: fsa isDeterministic. |
|
136 self assert: fsa isWithoutEpsilons. |
|
137 |
|
138 self assert: fsa fail: 'a'. |
|
139 self assert: fsa fail: 'aa'. |
|
140 self assert: fsa fail: 'b'. |
|
141 ! |
|
142 |
|
143 testAPlusB |
|
144 fsa addState: a. |
|
145 fsa addState: b. |
|
146 fsa addState: c. |
|
147 fsa addState: d. |
|
148 fsa startState: a. |
|
149 fsa finalState: d. |
|
150 |
|
151 fsa addTransitionFrom: a to: b on: $a. |
|
152 fsa addTransitionFrom: b to: a. |
|
153 fsa addTransitionFrom: b to: c priority: -1. |
|
154 fsa addTransitionFrom: c to: d on: $b. |
|
155 |
|
156 fsa determinize. |
|
157 |
|
158 self assert: fsa states size = 3. |
|
159 self assert: fsa isDeterministic. |
|
160 self assert: fsa isWithoutEpsilons. |
|
161 |
|
162 self assert: fsa parse: 'ab' retval: #d. |
|
163 self assert: fsa parse: 'aaaab' retval: #d. |
|
164 self assert: fsa parse: 'aaaabc' retval: #d end: 5. |
|
165 |
|
166 self assert: fsa fail: 'b'. |
|
167 ! |
|
168 |
|
169 testAorA |
|
170 fsa addState: a. |
|
171 fsa addState: b. |
|
172 fsa addState: c. |
|
173 fsa addState: d. |
|
174 fsa addState: e. |
|
175 fsa startState: a. |
|
176 fsa finalState: c. |
|
177 fsa finalState: e. |
|
178 |
|
179 fsa addTransitionFrom: a to: b. |
|
180 fsa addTransitionFrom: a to: d. |
|
181 fsa addTransitionFrom: b to: c on: $a. |
|
182 fsa addTransitionFrom: d to: e on: $a. |
|
183 |
|
184 c priority: 0. |
|
185 e priority: 0. |
|
186 |
|
187 fsa determinize. |
|
188 |
|
189 self assert: fsa states size = 2. |
|
190 self assert: fsa isDeterministic. |
|
191 self assert: fsa isWithoutEpsilons. |
|
192 |
|
193 self assert: fsa parse: 'a' retval: #c. |
|
194 self assert: fsa parse: 'a' retval: #e. |
|
195 self assert: (a transitions allSatisfy: [:t | t priority = 0]). |
|
196 |
|
197 self assert: fsa fail: 'b'. |
|
198 ! |
|
199 |
|
200 testApriorityOrA |
|
201 fsa addState: a. |
|
202 fsa addState: b. |
|
203 fsa addState: c. |
|
204 fsa addState: d. |
|
205 fsa addState: e. |
|
206 fsa startState: a. |
|
207 fsa finalState: c. |
|
208 fsa finalState: e. |
|
209 |
|
210 c priority: 0. |
|
211 e priority: 0. |
|
212 |
|
213 fsa addTransitionFrom: a to: b priority: -1. |
|
214 fsa addTransitionFrom: a to: d. |
|
215 fsa addTransitionFrom: b to: c on: $a. |
|
216 fsa addTransitionFrom: d to: e on: $a. |
|
217 |
|
218 fsa determinize. |
|
219 |
|
220 self assert: fsa states size = 2. |
|
221 self assert: fsa isDeterministic. |
|
222 self assert: fsa isWithoutEpsilons. |
|
223 |
|
224 self assert: fsa parse: 'a' retval: #e. |
|
225 self assertFail: #c. |
|
226 |
|
227 self assert: fsa fail: 'b'. |
|
228 ! |
|
229 |
|
230 testApriorityOrA2 |
|
231 fsa addState: a. |
|
232 fsa addState: b. |
|
233 fsa addState: c. |
|
234 fsa addState: d. |
|
235 fsa addState: e. |
|
236 fsa startState: a. |
|
237 fsa finalState: c. |
|
238 fsa finalState: e. |
|
239 |
|
240 c priority: 0. |
|
241 e priority: 0. |
|
242 |
|
243 fsa addTransitionFrom: a to: b. |
|
244 fsa addTransitionFrom: a to: d priority: -1. |
|
245 fsa addTransitionFrom: b to: c on: $a. |
|
246 fsa addTransitionFrom: d to: e on: $a. |
|
247 |
|
248 fsa determinize. |
|
249 |
|
250 self assert: fsa states size = 2. |
|
251 self assert: fsa isDeterministic. |
|
252 self assert: fsa isWithoutEpsilons. |
|
253 |
|
254 self assert: fsa parse: 'a' retval: #c. |
|
255 self assertFail: #e. |
|
256 |
|
257 self assert: fsa fail: 'b'. |
|
258 ! ! |
|
259 |