10 category:'PetitCompiler-Tests-Visitors' |
10 category:'PetitCompiler-Tests-Visitors' |
11 ! |
11 ! |
12 |
12 |
13 !PPCTokenizingCodeGeneratorTest methodsFor:'setup'! |
13 !PPCTokenizingCodeGeneratorTest methodsFor:'setup'! |
14 |
14 |
|
15 cleanClass |
|
16 | parserClass scannerClass | |
|
17 parserClass := (Smalltalk at: arguments parserName ifAbsent: [nil]). |
|
18 parserClass notNil ifTrue:[ |
|
19 parserClass removeFromSystem |
|
20 ]. |
|
21 |
|
22 scannerClass := (Smalltalk at: arguments scannerName ifAbsent: [nil]). |
|
23 scannerClass notNil ifTrue:[ |
|
24 scannerClass removeFromSystem |
|
25 ]. |
|
26 ! |
|
27 |
15 compileTokenizer: aNode |
28 compileTokenizer: aNode |
16 tokenizer := visitor visit: aNode |
29 tokenizer := visitor visit: aNode |
17 ! |
30 ! |
18 |
31 |
19 compileTree: root |
32 compileTree: root |
20 |
33 |
21 | configuration | |
34 | configuration | |
22 |
35 |
23 configuration := PPCPluggableConfiguration on: [ :_self | |
36 configuration := PPCPluggableConfiguration on: [ :_self | |
24 result := (visitor visit: _self ir). |
37 _self cacheFirstFollow. |
25 compiler compileParser startSymbol: result methodName. |
38 _self generateScanner. |
26 parser := compiler compileParser new. |
39 _self generate. |
27 _self ir: parser |
40 |
28 ]. |
41 ]. |
29 configuration arguments: arguments. |
42 configuration arguments: arguments. |
|
43 configuration base: PPCConfiguration tokenizing. |
30 parser := configuration compile: root. |
44 parser := configuration compile: root. |
31 |
45 |
32 ! |
46 ! |
33 |
47 |
34 compileWs: aNode |
48 compileWs: aNode |
41 |
55 |
42 setUp |
56 setUp |
43 arguments := PPCArguments default |
57 arguments := PPCArguments default |
44 profile: true; |
58 profile: true; |
45 yourself. |
59 yourself. |
46 |
60 |
47 compiler := PPCTokenizingCompiler new. |
61 self cleanClass. |
|
62 |
|
63 compiler := PPCTokenizingCodeGen new. |
48 compiler arguments: arguments. |
64 compiler arguments: arguments. |
49 |
65 |
50 visitor := PPCTokenizingCodeGenerator new. |
66 visitor := PPCTokenizingCodeGenerator new. |
51 visitor compiler: compiler. |
67 visitor compiler: compiler. |
52 visitor arguments: arguments. |
68 visitor arguments: arguments. |
53 ! |
69 ! |
54 |
70 |
55 tearDown |
71 tearDown |
56 | class | |
72 "nothing to do now" |
57 |
|
58 class := (Smalltalk at: #PPGeneratedParser ifAbsent: [nil]). |
|
59 class notNil ifTrue:[ |
|
60 class removeFromSystem |
|
61 ]. |
|
62 ! ! |
73 ! ! |
63 |
74 |
64 !PPCTokenizingCodeGeneratorTest methodsFor:'support'! |
75 !PPCTokenizingCodeGeneratorTest methodsFor:'support'! |
65 |
76 |
66 assert: whatever parse: input |
77 assert: whatever parse: input |
153 |
164 |
154 choiceNode := PPCDeterministicChoiceNode new |
165 choiceNode := PPCDeterministicChoiceNode new |
155 children: { token1Consume . token2Consume }; |
166 children: { token1Consume . token2Consume }; |
156 yourself. |
167 yourself. |
157 |
168 |
158 tokenizerNode := PPCTokenChoiceNode new |
169 tokenNode := PPCListNode new |
159 children: { token1 . token2 . eof }; |
170 children: { token1 . token2 . eof }; |
160 name: 'nextToken'; |
171 name: 'nextToken'; |
161 yourself. |
172 yourself. |
162 |
173 |
163 wsNode := PPCTokenStarSeparatorNode new |
174 wsNode := PPCTokenStarSeparatorNode new |
164 name: 'consumeWhitespace'; |
175 name: 'consumeWhitespace'; |
165 yourself. |
176 child: PPCNilNode new; |
166 |
177 yourself. |
167 self compileWs: wsNode. |
178 |
168 self compileTokenizer: tokenizerNode. |
179 node := PPCTokenizingParserNode new |
169 self compileTree: choiceNode. |
180 tokens: tokenNode; |
170 |
181 whitespace: wsNode; |
171 parser := compiler compiledParser new. |
182 parser: choiceNode; |
|
183 yourself. |
|
184 |
|
185 self compileTree: node. |
|
186 |
|
187 parser := parser class new. |
172 self assert: parser parse: 'foo'. |
188 self assert: parser parse: 'foo'. |
173 self assert: result inputValue = 'foo'. |
189 self assert: result inputValue = 'foo'. |
174 |
190 |
175 parser := compiler compiledParser new. |
191 parser := parser class new. |
176 self assert: parser parse: 'bar'. |
192 self assert: parser parse: 'bar'. |
177 self assert: result inputValue = 'bar'. |
193 self assert: result inputValue = 'bar'. |
178 |
194 |
179 parser := compiler compiledParser new. |
195 parser := parser class new. |
180 self assert: parser fail: 'baz'. |
196 self assert: parser fail: 'baz'. |
181 ! |
197 ! |
182 |
198 |
183 testTokenizingParserNode |
199 testTokenizingParserNode |
184 | tokenNode tokenizerNode consumeNode eof wsNode | |
200 | tokenNode tokenizerNode consumeNode eof wsNode | |
185 tokenNode := (self tokenNodeForLiteral: 'bar') yourself. |
201 tokenNode := (self tokenNodeForLiteral: 'bar') yourself. |
186 eof := (self tokenNodeForEOF) yourself. |
202 eof := (self tokenNodeForEOF) yourself. |
187 |
203 |
188 tokenizerNode := PPCTokenChoiceNode new |
204 tokenizerNode := PPCListNode new |
189 children: { tokenNode . eof }; |
205 children: { tokenNode . eof }; |
190 name: 'nextToken'; |
206 name: 'nextToken'; |
191 yourself. |
207 yourself. |
192 consumeNode := PPCTokenConsumeNode new |
208 consumeNode := PPCTokenConsumeNode new |
193 child: tokenNode; |
209 child: tokenNode; |
197 child: PPCSentinelNode instance; |
213 child: PPCSentinelNode instance; |
198 yourself. |
214 yourself. |
199 |
215 |
200 node := PPCTokenizingParserNode new |
216 node := PPCTokenizingParserNode new |
201 parser: consumeNode; |
217 parser: consumeNode; |
202 tokenizer: tokenizerNode; |
218 tokens: tokenizerNode; |
203 whitespace: wsNode; |
219 whitespace: wsNode; |
204 yourself. |
220 yourself. |
205 |
221 |
206 |
222 |
207 self compileTree: node. |
223 self compileTree: node. |
208 |
224 |
209 parser := compiler compiledParser new. |
225 parser := parser class new. |
210 self assert: parser parse: 'bar'. |
226 self assert: parser parse: 'bar'. |
211 self assert: result inputValue = 'bar'. |
227 self assert: result inputValue = 'bar'. |
212 |
228 |
213 parser := compiler compiledParser new. |
229 parser := parser class new. |
214 self assert: parser fail: 'foo'. |
230 self assert: parser fail: 'foo'. |
215 ! |
231 ! |
216 |
232 |
217 testTrimmingToken1 |
233 testTrimmingToken1 |
218 | token tokenConsume tokenizerNode eof wsNode | |
234 | token tokenConsume tokensNode eof wsNode | |
219 |
235 |
220 token := self trimmingTokenNode: (self literalNode: 'foo'). |
236 token := self trimmingTokenNode: (self literalNode: 'foo'). |
221 eof := (self tokenNodeForEOF) yourself. |
237 eof := (self tokenNodeForEOF) yourself. |
222 |
238 |
223 tokenConsume := PPCTokenConsumeNode new |
239 tokenConsume := PPCTokenConsumeNode new |
224 child: token; |
240 child: token; |
225 yourself. |
241 yourself. |
226 |
242 |
227 tokenizerNode := PPCTokenChoiceNode new |
243 tokensNode := PPCListNode new |
228 children: { token . eof }; |
244 children: { token . eof }; |
229 name: 'nextToken'; |
245 name: 'nextToken'; |
230 yourself. |
246 yourself. |
231 |
247 |
232 wsNode := PPCTokenStarSeparatorNode new |
248 wsNode := PPCTokenStarSeparatorNode new |
233 name: 'consumeWhitespace'; |
249 name: 'consumeWhitespace'; |
234 yourself. |
250 child: PPCNilNode new; |
235 |
251 yourself. |
236 self compileWs: wsNode. |
252 |
237 self compileTokenizer: tokenizerNode. |
253 node := PPCTokenizingParserNode new |
238 self compileTree: tokenConsume. |
254 tokens: tokensNode; |
239 |
255 whitespace: wsNode; |
240 |
256 parser: tokenConsume; |
241 parser := compiler compiledParser new. |
257 yourself. |
|
258 |
|
259 |
|
260 self compileTree: node. |
|
261 |
|
262 |
|
263 parser := parser class new. |
242 self assert: parser parse: ' foo'. |
264 self assert: parser parse: ' foo'. |
243 self assert: result inputValue = 'foo'. |
265 self assert: result inputValue = 'foo'. |
244 |
266 |
245 |
267 |
246 parser := compiler compiledParser new. |
268 parser := parser class new. |
247 self assert: parser parse: ' foo '. |
269 self assert: parser parse: ' foo '. |
248 self assert: result inputValue = 'foo'. |
270 self assert: result inputValue = 'foo'. |
249 |
271 |
250 |
272 |
251 parser := compiler compiledParser new. |
273 parser := parser class new. |
252 self assert: parser fail: 'baz'. |
274 self assert: parser fail: 'baz'. |
253 ! ! |
275 ! ! |
254 |
276 |