equal
deleted
inserted
replaced
1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
2 |
2 |
3 "{ NameSpace: Smalltalk }" |
3 "{ NameSpace: Smalltalk }" |
4 |
4 |
5 PPCNodeVisitor subclass:#PPCCodeGenerator |
5 PPCPass subclass:#PPCCodeGenerator |
6 instanceVariableNames:'codeGen' |
6 instanceVariableNames:'codeGen' |
7 classVariableNames:'' |
7 classVariableNames:'' |
8 poolDictionaries:'' |
8 poolDictionaries:'' |
9 category:'PetitCompiler-Visitors-CodeGenerators' |
9 category:'PetitCompiler-Visitors-CodeGenerators' |
10 ! |
10 ! |
23 yourself |
23 yourself |
24 ! ! |
24 ! ! |
25 |
25 |
26 !PPCCodeGenerator methodsFor:'accessing'! |
26 !PPCCodeGenerator methodsFor:'accessing'! |
27 |
27 |
28 options: args |
|
29 super options: args. |
|
30 codeGen options: args. |
|
31 ! |
|
32 |
|
33 clazz: aPPCClass |
|
34 codeGen clazz: aPPCClass |
|
35 ! |
|
36 |
|
37 codeGen |
28 codeGen |
38 ^ codeGen |
29 ^ codeGen |
39 ! |
30 ! |
40 |
31 |
41 codeGen: anObject |
32 codeGen: anObject |
42 codeGen := anObject |
33 codeGen := anObject |
43 ! |
34 ! |
44 |
35 |
45 guards |
36 guards |
46 ^ options guards |
37 ^ context options guards |
|
38 |
|
39 "Modified: / 26-08-2015 / 22:17:54 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
47 ! ! |
40 ! ! |
48 |
41 |
49 !PPCCodeGenerator methodsFor:'code generation'! |
42 !PPCCodeGenerator methodsFor:'code generation'! |
50 |
43 |
51 generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex useGuards: useGuards storeResultInto: resultVar |
44 generateChoiceChildOf: choiceNode atIndex: choiceChildNodeIndex useGuards: useGuards storeResultInto: resultVar |
204 ] |
197 ] |
205 |
198 |
206 "Created: / 27-07-2015 / 14:50:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
199 "Created: / 27-07-2015 / 14:50:47 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
207 ! ! |
200 ! ! |
208 |
201 |
|
202 !PPCCodeGenerator methodsFor:'running'! |
|
203 |
|
204 run: ir |
|
205 "Actually run the pass on given IR (tree of PPCNode) and return |
|
206 (possibly transformed or completely new) another IR." |
|
207 |
|
208 | entry | |
|
209 |
|
210 context isNil ifTrue:[ |
|
211 PPCCompilationError new signal: 'oops, no context set, use #context: before running a pass!!'. |
|
212 ]. |
|
213 codeGen options: context options. |
|
214 codeGen clazz: context parserClass. |
|
215 entry := self visit: ir. |
|
216 context parserClass propertyAt:#rootMethod put:entry. |
|
217 ^ ir |
|
218 |
|
219 "Created: / 26-08-2015 / 22:38:58 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
|
220 ! ! |
|
221 |
209 !PPCCodeGenerator methodsFor:'support'! |
222 !PPCCodeGenerator methodsFor:'support'! |
210 |
223 |
211 compileTokenWhitespace: node |
224 compileTokenWhitespace: node |
212 codeGen codeIf: 'context atWs' then: nil else: [ |
225 codeGen codeIf: 'context atWs' then: nil else: [ |
213 codeGen |
226 codeGen |
949 id := codeGen idFor: node. |
962 id := codeGen idFor: node. |
950 codeGen profileTokenRead: id. |
963 codeGen profileTokenRead: id. |
951 |
964 |
952 self compileTokenWhitespace: node. |
965 self compileTokenWhitespace: node. |
953 |
966 |
954 (options guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
967 (context options guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
955 guard id: id, '_guard'. |
968 guard id: id, '_guard'. |
956 codeGen code: 'context atEnd ifTrue: [ self error ].'. |
969 codeGen code: 'context atEnd ifTrue: [ self error ].'. |
957 guard compileGuard: codeGen. |
970 guard compileGuard: codeGen. |
958 codeGen codeOnLine: 'ifFalse: [ self error ].'. |
971 codeGen codeOnLine: 'ifFalse: [ self error ].'. |
959 codeGen code: 'error ifFalse: ['. |
972 codeGen code: 'error ifFalse: ['. |
961 ]. |
974 ]. |
962 |
975 |
963 codeGen codeAssign: 'context position + 1.' to: startVar. |
976 codeGen codeAssign: 'context position + 1.' to: startVar. |
964 codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever. |
977 codeGen codeEvaluateAndAssign:[ self visit:node child ] to:#whatever. |
965 |
978 |
966 (options guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
979 (context options guards and: [(guard := PPCGuard on: node) makesSense]) ifTrue: [ |
967 codeGen dedent. |
980 codeGen dedent. |
968 codeGen code: '].'. |
981 codeGen code: '].'. |
969 ]. |
982 ]. |
970 |
983 |
971 codeGen codeIf: 'error' then: nil else: [ |
984 codeGen codeIf: 'error' then: nil else: [ |
972 codeGen codeAssign: 'context position.' to: endVar. |
985 codeGen codeAssign: 'context position.' to: endVar. |
973 " self compileSecondWhitespace: compiler." |
986 " self compileSecondWhitespace: compiler." |
974 self compileTokenWhitespace: node. |
987 self compileTokenWhitespace: node. |
975 |
988 |
976 codeGen codeReturn: node tokenClass asString, ' on: (context collection) |
989 codeGen codeReturn: node tokenClass asString, ' on: (context collection) |
977 start: ', startVar, ' |
990 start: ', startVar, ' |
978 stop: ', endVar, ' |
991 stop: ', endVar, ' |
979 value: nil'. |
992 value: nil'. |
980 ] |
993 ] |
|
994 |
|
995 "Modified: / 26-08-2015 / 22:18:28 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
981 ! |
996 ! |
982 |
997 |
983 visitUnknownNode: node |
998 visitUnknownNode: node |
984 | compiledChild compiledParser id | |
999 | compiledChild compiledParser id | |
985 |
1000 |