1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
1 "{ Package: 'stx:goodies/petitparser/compiler' }" |
2 |
2 |
3 "{ NameSpace: Smalltalk }" |
3 "{ NameSpace: Smalltalk }" |
4 |
4 |
5 PPCCodeGenerator subclass:#PPCTokenizingCodeGenerator |
5 PPCCodeGenerator subclass:#PPCTokenizingCodeGenerator |
6 instanceVariableNames:'' |
6 instanceVariableNames:'tokenGenerator' |
7 classVariableNames:'' |
7 classVariableNames:'' |
8 poolDictionaries:'' |
8 poolDictionaries:'' |
9 category:'PetitCompiler-Visitors' |
9 category:'PetitCompiler-Visitors' |
10 ! |
10 ! |
11 |
11 |
|
12 !PPCTokenizingCodeGenerator methodsFor:'accessing'! |
|
13 |
|
14 guards |
|
15 "When tokenizing, do not use guards" |
|
16 ^ false |
|
17 ! |
|
18 |
|
19 tokenGenerator |
|
20 ^ tokenGenerator isNil |
|
21 ifTrue: [ tokenGenerator := (PPCTokenCodeGenerator on: compiler) |
|
22 arguments: arguments; |
|
23 yourself ] |
|
24 ifFalse: [ tokenGenerator ] |
|
25 ! |
|
26 |
|
27 tokenGenerator: whatever |
|
28 tokenGenerator := whatever |
|
29 ! ! |
|
30 |
12 !PPCTokenizingCodeGenerator methodsFor:'visiting'! |
31 !PPCTokenizingCodeGenerator methodsFor:'visiting'! |
13 |
32 |
14 visitChoiceNode: node |
33 visitChoiceNode: node |
15 " true ifTrue: [ ^ super visitChoiceNode: node ]." |
34 " true ifTrue: [ ^ super visitChoiceNode: node ]." |
16 "HACK alert: We are inside token..." |
35 "HACK alert: We are inside token..." |
17 node firstSetWithTokens detect: [ :e | e isTokenNode not ] ifFound: [ ^ super visitChoiceNode: node ]. |
36 |
|
37 (node firstSetWithTokens contains: [ :e | e isTokenNode not ]) ifTrue: [ ^ super visitChoiceNode: node ]. |
18 |
38 |
19 node children do: [ :child | |
39 node children do: [ :child | |
20 | tokenMethodName | |
40 | tokenMethodName | |
21 |
41 |
22 child firstSetWithTokens do: [ :first | |
42 child firstSetWithTokens do: [ :first | |
79 |
101 |
80 visitTokenChoiceNode: node |
102 visitTokenChoiceNode: node |
81 | trimmingToken | |
103 | trimmingToken | |
82 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
104 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
83 |
105 |
|
106 node children do: [ :child | |
|
107 self tokenGenerator visit: child |
|
108 ] |
84 |
109 |
|
110 " |
85 trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ]. |
111 trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ]. |
86 trimmingToken isNil ifFalse: [ |
112 trimmingToken isNil ifFalse: [ |
87 compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever. |
113 compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever. |
88 ]. |
114 ]. |
89 super visitChoiceNode: node. |
115 super visitChoiceNode: node." |
90 ! |
116 ! |
91 |
117 |
92 visitTokenConsumeNode: node |
118 visitTokenConsumeNode: node |
93 compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.' |
119 compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.' |
94 ! |
120 ! |
95 |
121 |
96 visitTokenNode: node |
122 visitTokenNode: node |
97 | id startVar endVar | |
123 self error: 'shoudl not happend!!' |
98 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
|
99 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
|
100 |
|
101 id := compiler idFor: node. |
|
102 compiler toTokenRememberStrategy. |
|
103 |
|
104 compiler codeAssign: 'context position + 1.' to: startVar. |
|
105 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever. |
|
106 compiler add: 'error ifFalse: [ '. |
|
107 compiler indent. |
|
108 compiler codeAssign: 'context position.' to: endVar. |
|
109 |
|
110 compiler codeTranscriptShow: 'current token type: ', id storeString. |
|
111 compiler codeAssign: id storeString, '.' to: 'currentTokenType'. |
|
112 compiler codeAssign: node tokenClass asString, ' on: (context collection) |
|
113 start: ', startVar, ' |
|
114 stop: ', endVar, ' |
|
115 value: nil.' |
|
116 to: 'currentTokenValue := ', self retvalVar. |
|
117 compiler codeReturn. |
|
118 compiler dedent. |
|
119 compiler add: '].'. |
|
120 compiler toNormalRememberStrategy. |
|
121 ! |
124 ! |
122 |
125 |
123 visitTokenizingParserNode: node |
126 visitTokenizingParserNode: node |
124 self visit: node tokenizer. |
127 self visit: node tokenizer. |
|
128 self visit: node whitespace. |
125 |
129 |
126 " compiler codeNextToken." |
130 " compiler codeNextToken." |
127 compiler codeHaltIfShiftPressed. |
131 compiler codeHaltIfShiftPressed. |
128 compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar. |
132 compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar. |
129 compiler codeReturn. |
133 compiler codeReturn. |
130 ! |
134 ! |
131 |
135 |
132 visitTrimmingTokenNode: node |
136 visitTrimmingTokenNode: node |
133 | id startVar endVar | |
137 self error: 'shoudl not happend!!' |
134 |
|
135 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
|
136 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
|
137 |
|
138 id := compiler idFor: node. |
|
139 compiler toTokenRememberStrategy. |
|
140 |
|
141 |
|
142 compiler addComment: 'Consume Whitespace:'. |
|
143 compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever. |
|
144 compiler nl. |
|
145 |
|
146 compiler codeAssign: 'context position + 1.' to: startVar. |
|
147 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever. |
|
148 |
|
149 compiler add: 'error ifFalse: [ '. |
|
150 compiler indent. |
|
151 compiler codeAssign: 'context position.' to: endVar. |
|
152 |
|
153 compiler addComment: 'Consume Whitespace:'. |
|
154 compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever. |
|
155 compiler nl. |
|
156 |
|
157 |
|
158 compiler codeTranscriptShow: 'current token type: ', id storeString. |
|
159 compiler codeAssign: id storeString, '.' to: 'currentTokenType'. |
|
160 compiler codeAssign: node tokenClass asString, ' on: (context collection) |
|
161 start: ', startVar, ' |
|
162 stop: ', endVar, ' |
|
163 value: nil.' |
|
164 to: 'currentTokenValue := ', self retvalVar. |
|
165 compiler codeReturn. |
|
166 compiler dedent. |
|
167 compiler add: '].' . |
|
168 compiler toNormalRememberStrategy. |
|
169 ! ! |
138 ! ! |
170 |
139 |