31 |
31 |
32 guards |
32 guards |
33 ^ arguments guards |
33 ^ arguments guards |
34 ! ! |
34 ! ! |
35 |
35 |
|
36 !PPCCodeGenerator methodsFor:'guards'! |
|
37 |
|
38 addGuard: node ifTrue: trueBlock ifFalse: falseBlock |
|
39 | guard id | |
|
40 (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false]. |
|
41 id := compiler idFor: node. |
|
42 |
|
43 " falseBlock isNil ifFalse: [ |
|
44 compiler add: 'context atEnd'. |
|
45 compiler addOnLine: ' ifTrue: ['. |
|
46 compiler indent. |
|
47 falseBlock value. |
|
48 compiler dedent. |
|
49 compiler addOnLine: '].'. |
|
50 ]." |
|
51 |
|
52 guard id: (compiler idFor: guard prefixed: #guard). |
|
53 guard compileGuard: compiler. |
|
54 |
|
55 trueBlock isNil ifFalse: [ |
|
56 compiler addOnLine: ' ifTrue: ['. |
|
57 compiler indent. |
|
58 trueBlock value. |
|
59 compiler dedent. |
|
60 falseBlock isNil ifTrue: [ compiler addOnLine: '].' ] |
|
61 ifFalse: [ compiler add: ']'. ] |
|
62 ]. |
|
63 falseBlock isNil ifFalse: [ |
|
64 compiler addOnLine: ' ifFalse: ['. |
|
65 compiler indent. |
|
66 falseBlock value. |
|
67 compiler dedent. |
|
68 compiler addOnLine: '].'. |
|
69 ]. |
|
70 ^ true |
|
71 ! |
|
72 |
|
73 addGuardTrimming: node |
|
74 | guard firsts id | |
|
75 (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false]. |
|
76 |
|
77 id := compiler idFor: node. |
|
78 firsts := node firstSetWithTokens. |
|
79 |
|
80 |
|
81 (firsts allSatisfy: [ :e | e isTrimmingTokenNode ]) ifTrue: [ |
|
82 "If we start with trimming, we should invoke the whitespace parser" |
|
83 self compileTokenWhitespace: firsts anyOne. |
|
84 ^ true |
|
85 ]. |
|
86 ^ false |
|
87 ! ! |
|
88 |
36 !PPCCodeGenerator methodsFor:'hooks'! |
89 !PPCCodeGenerator methodsFor:'hooks'! |
37 |
90 |
38 afterAccept: node retval: retval |
91 afterAccept: node retval: retval |
39 "return the method from compiler" |
92 "return the method from compiler" |
40 ^ self stopMethodForNode: node. |
93 ^ self stopMethodForNode: node. |
54 ^ compiler checkCache: (compiler idFor: node) |
107 ^ compiler checkCache: (compiler idFor: node) |
55 ! ! |
108 ! ! |
56 |
109 |
57 !PPCCodeGenerator methodsFor:'support'! |
110 !PPCCodeGenerator methodsFor:'support'! |
58 |
111 |
59 addGuard: node |
|
60 | guard firsts id | |
|
61 (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ self]. |
|
62 |
|
63 id := compiler idFor: node. |
|
64 firsts := node firstSetWithTokens. |
|
65 |
|
66 |
|
67 (firsts allSatisfy: [ :e | e isKindOf: PPCTrimmingTokenNode ]) ifTrue: [ |
|
68 "If we start with trimming, we should invoke the whitespace parser" |
|
69 self compileTokenWhitespace: firsts anyOne. |
|
70 |
|
71 compiler add: 'context atEnd ifTrue: [ ^ self error ].'. |
|
72 guard id: id, '_guard'. |
|
73 guard compileGuard: compiler. |
|
74 compiler addOnLine: 'ifFalse: [ ^ self error ].' |
|
75 ]. |
|
76 |
|
77 (firsts allSatisfy: [ :e | e isTerminal ]) ifTrue: [ |
|
78 compiler add: 'context atEnd ifTrue: [ ^ self error ].'. |
|
79 guard id: id, '_guard'. |
|
80 guard compileGuard: compiler. |
|
81 compiler addOnLine: 'ifFalse: [ ^ self error ].' |
|
82 ]. |
|
83 ! |
|
84 |
|
85 compileTokenWhitespace: node |
112 compileTokenWhitespace: node |
86 compiler add: 'context atWs ifFalse: ['. |
113 compiler add: 'context atWs ifFalse: ['. |
87 compiler indent. |
114 compiler indent. |
88 compiler call: (self visit: node whitespace). |
115 compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever. |
89 compiler add: 'context setWs.'. |
116 compiler add: 'context setWs.'. |
90 compiler dedent. |
117 compiler dedent. |
91 compiler add: '].'. |
118 compiler add: '].'. |
92 ! |
119 ! |
93 |
120 |
257 |
290 |
258 ^ self visit: child. |
291 ^ self visit: child. |
259 ! |
292 ! |
260 |
293 |
261 visitChoiceNode: node |
294 visitChoiceNode: node |
262 | firsts guard whitespaceConsumed elementVar | |
295 | whitespaceConsumed elementVar | |
263 "The code is not ready for inlining" |
296 "The code is not ready for inlining" |
264 self assert: node isMarkedForInline not. |
297 self assert: node isMarkedForInline not. |
265 |
298 |
266 whitespaceConsumed := false. |
|
267 firsts := node firstSetWithTokens. |
|
268 |
|
269 |
299 |
270 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
300 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
271 " |
301 whitespaceConsumed := self addGuardTrimming: node. |
272 If we want to compile in guard and the choice starts with trimming token, |
302 |
273 we should invoke the whitespace parser |
|
274 " |
|
275 (self guards and: [ firsts allSatisfy: [ :e | e isTrimmingTokenNode ] ]) ifTrue: [ |
|
276 self compileTokenWhitespace: firsts anyOne. |
|
277 whitespaceConsumed := true. |
|
278 ]. |
|
279 |
|
280 1 to: node children size do: [ :idx | |child allowGuard | |
303 1 to: node children size do: [ :idx | |child allowGuard | |
281 child := node children at: idx. |
304 child := node children at: idx. |
282 allowGuard := whitespaceConsumed. |
305 allowGuard := whitespaceConsumed. |
283 |
306 |
284 (allowGuard and: [self guards and: [ (guard := PPCGuard on: child) makesSense ]]) ifTrue: [ |
307 allowGuard ifTrue: [ |
285 guard id: (compiler idFor: guard prefixed: #guard). |
308 self addGuard: child ifTrue: [ |
286 guard compileGuard: compiler. |
|
287 compiler add: ' ifTrue: [ '. |
|
288 compiler indent. |
|
289 compiler add: 'self clearError.'. |
309 compiler add: 'self clearError.'. |
290 compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar. |
310 compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar. |
291 compiler add: 'error ifFalse: [ ^ element ].'. |
311 compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'. |
292 compiler dedent. |
312 ] ifFalse: nil. |
293 compiler add: ' ].'. |
313 ] ifFalse: [ |
294 ] ifFalse: [ |
314 compiler add: 'self clearError.'. |
295 compiler add: 'self clearError.'. |
315 compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar. |
296 compiler codeStoreValueOf: [self visit: child] intoVariable: elementVar. |
316 compiler add: 'error ifFalse: [ ^ ', elementVar, ' ].'. |
297 compiler add: 'error ifFalse: [ ^ element ].'. |
|
298 ] |
317 ] |
299 ]. |
318 ]. |
300 compiler add: '^ self error: ''no choice suitable'''. |
319 compiler codeError: 'no choice suitable'. |
301 |
320 |
302 "Modified: / 23-04-2015 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
321 "Modified: / 23-04-2015 / 21:40:23 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
303 ! |
322 ! |
304 |
323 |
305 visitEndOfFileNode: node |
324 visitEndOfFileNode: node |
329 |
348 |
330 compiler codeAssign: 'context position.' to: positionVar. |
349 compiler codeAssign: 'context position.' to: positionVar. |
331 compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['. |
350 compiler add: '((context next: ', node literal size asString, ') = #''', encodedLiteral, ''') ifTrue: ['. |
332 compiler codeReturn: '#''', encodedLiteral, ''' '. |
351 compiler codeReturn: '#''', encodedLiteral, ''' '. |
333 compiler add: '] ifFalse: ['. |
352 compiler add: '] ifFalse: ['. |
334 compiler add: ' context position: ', positionVar, '.'. |
353 compiler indent. |
335 compiler add: ' self error: ''', encodedLiteral, ' expected'' at: position'. |
354 compiler add: 'context position: ', positionVar, '.'. |
|
355 compiler codeError: encodedLiteral, ' expected' at: positionVar. |
|
356 compiler dedent. |
336 compiler add: '].'. |
357 compiler add: '].'. |
337 ! |
358 ! |
338 |
359 |
339 visitMessagePredicateNode: node |
360 visitMessagePredicateNode: node |
340 compiler add: '(context peek ', node message, ') ifFalse: ['. |
361 compiler add: '(context peek ', node message, ') ifFalse: ['. |
341 compiler add: ' self error: ''predicate not found'''. |
362 compiler codeError: 'predicate not found'. |
342 compiler add: '] ifTrue: [ '. |
363 compiler add: '] ifTrue: [ '. |
343 compiler codeReturn: ' context next'. |
364 compiler codeReturn: ' context next'. |
344 compiler add: '].'. |
365 compiler add: '].'. |
345 |
366 |
346 "Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
367 "Modified: / 23-04-2015 / 18:39:03 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
357 classificationId := (compiler idFor: classification prefixed: #classification). |
378 classificationId := (compiler idFor: classification prefixed: #classification). |
358 compiler addConstant: classification as: classificationId. |
379 compiler addConstant: classification as: classificationId. |
359 |
380 |
360 compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'. |
381 compiler addOnLine: '(', classificationId, ' at: context peek asInteger)'. |
361 compiler indent. |
382 compiler indent. |
362 compiler add: ' ifTrue: [ self error: '' predicate not expected'' ]'. |
383 compiler add: ' ifTrue: ['. |
363 compiler add: ' ifFalse: ['. |
384 compiler codeError: 'predicate not expected'. |
|
385 compiler add: '] ifFalse: ['. |
364 compiler codeReturn: 'nil'. |
386 compiler codeReturn: 'nil'. |
|
387 compiler add: '].'. |
|
388 compiler dedent. |
|
389 ! |
|
390 |
|
391 visitNotCharacterNode: node |
|
392 | chid | |
|
393 node character ppcPrintable ifTrue: [ |
|
394 chid := node character storeString |
|
395 ] ifFalse: [ |
|
396 chid := compiler idFor: node character prefixed: #char. |
|
397 compiler addConstant: (Character value: node character asInteger) as: chid . |
|
398 ]. |
|
399 |
|
400 compiler add: '(context peek == ', chid, ')'. |
|
401 compiler indent. |
|
402 compiler add: 'ifTrue: ['. |
|
403 compiler indent. |
|
404 compiler codeError: node character asInteger asString, ' not expected'. |
|
405 compiler dedent. |
|
406 compiler add: '] ifFalse: [ '. |
|
407 compiler indent. |
|
408 compiler codeReturn: 'nil.'. |
|
409 compiler dedent. |
365 compiler add: '].'. |
410 compiler add: '].'. |
366 compiler dedent. |
411 compiler dedent. |
367 ! |
412 ! |
368 |
413 |
369 visitNotLiteralNode: node |
414 visitNotLiteralNode: node |
371 encodedLiteral := node encodeQuotes: node literal. |
416 encodedLiteral := node encodeQuotes: node literal. |
372 size := node literal size asString. |
417 size := node literal size asString. |
373 |
418 |
374 compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'. |
419 compiler add: '((context peek: ', size, ') =#''', encodedLiteral, ''')'. |
375 compiler indent. |
420 compiler indent. |
376 compiler add: 'ifTrue: [ self error: ''', encodedLiteral, ' not expected'' ]'. |
421 compiler add: 'ifTrue: ['. |
377 compiler add: 'ifFalse: [ '. |
422 compiler codeError: encodedLiteral, ' not expected'. |
|
423 compiler add: '] ifFalse: [ '. |
378 compiler codeReturn: 'nil' . |
424 compiler codeReturn: 'nil' . |
379 compiler add: '].'. |
425 compiler add: '].'. |
380 compiler dedent. |
426 compiler dedent. |
381 ! |
427 ! |
382 |
428 |
421 compiler addConstant: node block as: blockId. |
469 compiler addConstant: node block as: blockId. |
422 compiler codeReturn: blockId, ' value: context.'. |
470 compiler codeReturn: blockId, ' value: context.'. |
423 ! |
471 ! |
424 |
472 |
425 visitPlusNode: node |
473 visitPlusNode: node |
426 | elementVar | |
474 | elementVar | |
427 |
475 |
428 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
476 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
429 |
477 |
|
478 " self tokenGuards ifTrue: [ |
|
479 compiler codeTokenGuard: node ifFalse: [ compiler codeError: 'at least one occurence expected' ]. |
|
480 ]. |
|
481 " |
430 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
482 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
431 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
483 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
432 |
484 |
433 compiler add: 'error ifTrue: [ self error: ''at least one occurence expected'' ] ifFalse: ['. |
485 compiler add: 'error ifTrue: ['. |
|
486 compiler codeError: 'at least one occurence expected'. |
|
487 compiler add: '] ifFalse: ['. |
434 compiler indent. |
488 compiler indent. |
435 compiler add: self retvalVar , ' add: ',elementVar , '.'. |
489 compiler add: self retvalVar , ' add: ',elementVar , '.'. |
436 |
490 |
437 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
491 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
438 compiler add: '[ error ] whileFalse: ['. |
492 compiler add: '[ error ] whileFalse: ['. |
455 |
509 |
456 compiler addConstant: node predicate as: pid. |
510 compiler addConstant: node predicate as: pid. |
457 |
511 |
458 compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'. |
512 compiler add: '(context atEnd not and: [ ', pid , ' value: context uncheckedPeek])'. |
459 compiler indent. |
513 compiler indent. |
460 compiler add: 'ifFalse: [ self error: ''predicate not found'' ]'. |
514 compiler add: 'ifFalse: ['. |
461 compiler add: 'ifTrue: [ ', self retvalVar ,' := context next ].'. |
515 compiler codeError: 'predicate not found'. |
|
516 compiler add: '] ifTrue: [ ', self retvalVar ,' := context next ].'. |
462 compiler dedent. |
517 compiler dedent. |
463 compiler codeReturn. |
518 compiler codeReturn. |
464 |
519 |
465 "Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
520 "Modified: / 23-04-2015 / 21:48:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
466 ! |
521 ! |
467 |
522 |
468 visitRecognizingSequenceNode: node |
523 visitRecognizingSequenceNode: node |
469 | mementoVar | |
524 | mementoVar canBacktrack | |
470 |
525 |
471 mementoVar := compiler allocateTemporaryVariableNamed: 'memento'. |
526 canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not. |
472 compiler smartRemember: node to: mementoVar. |
527 |
473 |
528 canBacktrack ifTrue: [ |
474 " self addGuard: compiler." |
529 mementoVar := compiler allocateTemporaryVariableNamed: 'memento'. |
475 |
530 compiler smartRemember: node to: mementoVar. |
476 compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever. |
531 ]. |
|
532 |
|
533 compiler codeStoreValueOf: [ self visit: (node children at: 1) ] intoVariable: #whatever. |
477 compiler add: 'error ifTrue: [ ^ failure ].'. |
534 compiler add: 'error ifTrue: [ ^ failure ].'. |
478 |
535 |
479 2 to: (node children size) do: [ :idx | |child| |
536 2 to: (node children size) do: [ :idx | |child| |
480 child := node children at: idx. |
537 child := node children at: idx. |
481 compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever. |
538 compiler codeStoreValueOf: [ self visit: child ] intoVariable: #whatever. |
482 compiler add: 'error ifTrue: [ '. |
539 |
483 compiler indent. |
540 child acceptsEpsilon ifFalse: [ |
484 compiler smartRestore: node from: mementoVar. |
541 compiler add: 'error ifTrue: [ '. |
485 compiler add: ' ^ failure .'. |
542 compiler indent. |
486 compiler dedent. |
543 compiler smartRestore: node from: mementoVar. |
487 compiler add: '].'. |
544 compiler add: ' ^ failure .'. |
|
545 compiler dedent. |
|
546 compiler add: '].'. |
|
547 ]. |
488 ]. |
548 ]. |
489 ! |
549 ! |
490 |
550 |
491 visitSequenceNode: node |
551 visitSequenceNode: node |
492 |
552 |
493 | elementVar mementoVar | |
553 | elementVar mementoVar canBacktrack | |
494 |
554 |
495 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
555 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
496 mementoVar := compiler allocateTemporaryVariableNamed: 'memento'. |
556 canBacktrack := (node children allButFirst allSatisfy: [:e | e acceptsEpsilon ]) not. |
497 |
557 |
498 compiler smartRemember: node to: mementoVar. |
558 " self addGuardTrimming: node. |
|
559 self addGuard: node ifTrue: nil ifFalse: [ compiler addOnLine: ' ^ self error' ]. |
|
560 " |
|
561 canBacktrack ifTrue: [ |
|
562 mementoVar := compiler allocateTemporaryVariableNamed: 'memento'. |
|
563 compiler smartRemember: node to: mementoVar. |
|
564 ]. |
|
565 |
499 compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar. |
566 compiler codeAssign: 'Array new: ', node children size asString, '.' to: self retvalVar. |
500 self addGuard: node. |
567 |
501 |
568 compiler codeStoreValueOf: [ self visit: (node children at: 1)] intoVariable: elementVar. |
502 1 to: (node children size) do: [ :idx | |child| |
569 compiler add: 'error ifTrue: [ ^ failure ].'. |
|
570 compiler add: self retvalVar , ' at: 1 put: ', elementVar, '.'. |
|
571 |
|
572 2 to: (node children size) do: [ :idx | |child| |
503 child := node children at: idx. |
573 child := node children at: idx. |
504 compiler codeStoreValueOf: [ self visit: child ] intoVariable: elementVar. |
574 compiler codeStoreValueOf: [ self visit: child ] intoVariable: elementVar. |
505 |
575 |
506 compiler add: 'error ifTrue: [ '. |
576 child acceptsEpsilon ifFalse: [ |
507 compiler indent. |
577 compiler add: 'error ifTrue: [ '. |
508 compiler smartRestore: node from: mementoVar. |
578 compiler indent. |
509 compiler add: '^ failure.'. |
579 compiler smartRestore: node from: mementoVar. |
510 compiler dedent. |
580 compiler add: '^ failure.'. |
511 compiler add: '].'. |
581 compiler dedent. |
|
582 compiler add: '].'. |
|
583 ]. |
512 compiler add: self retvalVar , ' at: ', idx asString, ' put: ',elementVar,'.'. |
584 compiler add: self retvalVar , ' at: ', idx asString, ' put: ',elementVar,'.'. |
513 ]. |
585 ]. |
514 compiler codeReturn |
586 compiler codeReturn |
515 |
587 |
516 "Modified: / 23-04-2015 / 22:03:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
588 "Modified: / 23-04-2015 / 22:03:11 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
538 compiler addConstant: classification as: classificationId. |
610 compiler addConstant: classification as: classificationId. |
539 |
611 |
540 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
612 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
541 compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['. |
613 compiler add: '[ ', classificationId, ' at: context peek asInteger ] whileTrue: ['. |
542 compiler indent. |
614 compiler indent. |
543 compiler add: self retvalVar, ' add: context next.'. |
615 compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar. |
544 compiler dedent. |
616 compiler dedent. |
545 compiler add: '].'. |
617 compiler add: '].'. |
546 compiler codeReturn: 'retval asArray'. |
618 compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar. |
|
619 compiler codeReturn. |
547 ! |
620 ! |
548 |
621 |
549 visitStarMessagePredicateNode: node |
622 visitStarMessagePredicateNode: node |
550 |
623 |
551 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
624 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
552 compiler add: '[ context peek ', node message, ' ] whileTrue: ['. |
625 compiler add: '[ context peek ', node message, ' ] whileTrue: ['. |
553 compiler indent. |
626 compiler indent. |
554 compiler add: self retvalVar, ' add: context next.'. |
627 compiler codeEvaluate: 'add:' argument: 'context next.' on: self retvalVar. |
555 compiler dedent. |
628 compiler dedent. |
556 compiler add: '].'. |
629 compiler add: '].'. |
557 compiler codeReturn: 'retval asArray'. |
630 compiler codeAssign: self retvalVar, ' asArray.' to: self retvalVar. |
|
631 compiler codeReturn. |
558 ! |
632 ! |
559 |
633 |
560 visitStarNode: node |
634 visitStarNode: node |
561 | elementVar | |
635 | elementVar | |
562 |
636 |
563 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
637 elementVar := compiler allocateTemporaryVariableNamed: 'element'. |
|
638 |
|
639 self addGuard: node child ifTrue: nil ifFalse: [ compiler codeReturn: '#()' ]. |
564 |
640 |
565 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
641 compiler codeAssign: 'OrderedCollection new.' to: self retvalVar. |
566 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
642 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: elementVar. |
567 compiler add: '[ error ] whileFalse: ['. |
643 compiler add: '[ error ] whileFalse: ['. |
568 compiler indent. |
644 compiler indent. |
658 compiler codeReturn. |
736 compiler codeReturn. |
659 compiler dedent. |
737 compiler dedent. |
660 compiler add: '].'. |
738 compiler add: '].'. |
661 ! |
739 ! |
662 |
740 |
|
741 visitTrimmingTokenCharacterNode: node |
|
742 ^ self visitTrimmingTokenNode: node |
|
743 ! |
|
744 |
663 visitTrimmingTokenNode: node |
745 visitTrimmingTokenNode: node |
664 | id guard startVar endVar | |
746 | id guard startVar endVar | |
665 |
747 |
666 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
748 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
667 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
749 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
668 |
750 |
669 id := compiler idFor: node. |
751 id := compiler idFor: node. |
670 " (id beginsWith: 'kw') ifTrue: [ self halt. ]." |
752 compiler profileTokenRead: id. |
671 "self compileFirstWhitespace: compiler." |
753 |
672 self compileTokenWhitespace: node. |
754 self compileTokenWhitespace: node. |
673 |
755 |
674 (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
756 (arguments guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
675 guard id: id, '_guard'. |
757 guard id: id, '_guard'. |
676 compiler add: 'context atEnd ifTrue: [ self error ].'. |
758 compiler add: 'context atEnd ifTrue: [ self error ].'. |