|
1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
|
2 |
|
3 "{ NameSpace: Smalltalk }" |
|
4 |
|
5 PPCCodeGenerator subclass:#PPCUniversalCodeGenerator |
|
6 instanceVariableNames:'' |
|
7 classVariableNames:'' |
|
8 poolDictionaries:'' |
|
9 category:'PetitCompiler-Visitors-CodeGenerators' |
|
10 ! |
|
11 |
|
12 !PPCUniversalCodeGenerator methodsFor:'guards'! |
|
13 |
|
14 addGuard: node ifTrue: trueBlock ifFalse: falseBlock |
|
15 | guard id | |
|
16 (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false]. |
|
17 id := codeGen idFor: node. |
|
18 |
|
19 " falseBlock isNil ifFalse: [ |
|
20 compiler add: 'context atEnd'. |
|
21 compiler addOnLine: ' ifTrue: ['. |
|
22 compiler indent. |
|
23 falseBlock value. |
|
24 compiler dedent. |
|
25 compiler addOnLine: '].'. |
|
26 ]." |
|
27 |
|
28 guard id: (codeGen idFor: guard defaultName: #guard). |
|
29 guard compileGuard: codeGen. |
|
30 |
|
31 trueBlock isNil ifFalse: [ |
|
32 codeGen codeOnLine: ' ifTrue: ['. |
|
33 codeGen indent. |
|
34 trueBlock value. |
|
35 codeGen dedent. |
|
36 falseBlock isNil ifTrue: [ codeGen codeOnLine: '].' ] |
|
37 ifFalse: [ codeGen code: ']'. ] |
|
38 ]. |
|
39 falseBlock isNil ifFalse: [ |
|
40 codeGen codeOnLine: ' ifFalse: ['. |
|
41 codeGen indent. |
|
42 falseBlock value. |
|
43 codeGen dedent. |
|
44 codeGen codeOnLine: '].'. |
|
45 ]. |
|
46 ^ true |
|
47 ! |
|
48 |
|
49 addGuardTrimming: node |
|
50 | guard firsts id | |
|
51 (self guards not or: [(guard := PPCGuard on: node) makesSense not]) ifTrue: [ ^ false]. |
|
52 |
|
53 id := codeGen idFor: node. |
|
54 firsts := node firstSetWithTokens. |
|
55 |
|
56 |
|
57 (firsts allSatisfy: [ :e | e isTrimmingTokenNode ]) ifTrue: [ |
|
58 "If we start with trimming, we should invoke the whitespace parser" |
|
59 self compileTokenWhitespace: firsts anyOne. |
|
60 ^ true |
|
61 ]. |
|
62 ^ false |
|
63 ! ! |
|
64 |
|
65 !PPCUniversalCodeGenerator methodsFor:'initialization'! |
|
66 |
|
67 initialize |
|
68 super initialize. |
|
69 |
|
70 codeGen := PPCUniversalCodeGen new |
|
71 ! ! |
|
72 |
|
73 !PPCUniversalCodeGenerator methodsFor:'visiting'! |
|
74 |
|
75 visitStarNode: node |
|
76 self addGuard: node child ifTrue: nil ifFalse: [ codeGen codeReturn: '#()' ]. |
|
77 |
|
78 super visitStarNode: node |
|
79 ! ! |
|
80 |