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 |
|
12 !PPCTokenizingCodeGenerator methodsFor:'accessing'! |
|
13 |
|
14 guards |
|
15 "When tokenizing, do not use guards" |
|
16 ^ false |
|
17 ! |
|
18 |
|
19 tokenGenerator |
|
20 tokenGenerator isNil ifTrue: [ |
|
21 tokenGenerator := PPCTokenCodeGenerator on: compiler. |
|
22 tokenGenerator arguments: arguments. |
|
23 ]. |
|
24 ^ tokenGenerator |
|
25 ! |
|
26 |
|
27 tokenGenerator: whatever |
|
28 tokenGenerator := whatever |
|
29 ! ! |
11 |
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 ]." |
82 |
101 |
83 visitTokenChoiceNode: node |
102 visitTokenChoiceNode: node |
84 | trimmingToken | |
103 | trimmingToken | |
85 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
104 self assert: (node children allSatisfy: [ :e | e isMarkedForInline not ]). |
86 |
105 |
|
106 node children do: [ :child | |
|
107 self tokenGenerator visit: child |
|
108 ] |
87 |
109 |
|
110 " |
88 trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ]. |
111 trimmingToken := node children detect: [ :e | e isTrimmingTokenNode ] ifNone: [ nil ]. |
89 trimmingToken isNil ifFalse: [ |
112 trimmingToken isNil ifFalse: [ |
90 compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever. |
113 compiler codeStoreValueOf: [ self visit: trimmingToken whitespace ] intoVariable: #whatever. |
91 ]. |
114 ]. |
92 super visitChoiceNode: node. |
115 super visitChoiceNode: node." |
93 ! |
116 ! |
94 |
117 |
95 visitTokenConsumeNode: node |
118 visitTokenConsumeNode: node |
96 compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.' |
119 compiler codeReturn: 'self consume: ', (compiler idFor: node child) storeString, '.' |
97 ! |
120 ! |
98 |
121 |
99 visitTokenNode: node |
122 visitTokenNode: node |
100 | id startVar endVar | |
123 self error: 'shoudl not happend!!' |
101 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
|
102 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
|
103 |
|
104 id := compiler idFor: node. |
|
105 compiler toTokenRememberStrategy. |
|
106 |
|
107 compiler codeAssign: 'context position + 1.' to: startVar. |
|
108 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever. |
|
109 compiler add: 'error ifFalse: [ '. |
|
110 compiler indent. |
|
111 compiler codeAssign: 'context position.' to: endVar. |
|
112 |
|
113 compiler codeTranscriptShow: 'current token type: ', id storeString. |
|
114 compiler codeAssign: id storeString, '.' to: 'currentTokenType'. |
|
115 compiler codeAssign: node tokenClass asString, ' on: (context collection) |
|
116 start: ', startVar, ' |
|
117 stop: ', endVar, ' |
|
118 value: nil.' |
|
119 to: 'currentTokenValue := ', self retvalVar. |
|
120 compiler codeReturn. |
|
121 compiler dedent. |
|
122 compiler add: '].'. |
|
123 compiler toNormalRememberStrategy. |
|
124 ! |
124 ! |
125 |
125 |
126 visitTokenizingParserNode: node |
126 visitTokenizingParserNode: node |
127 self visit: node tokenizer. |
127 self visit: node tokenizer. |
|
128 self visit: node whitespace. |
128 |
129 |
129 " compiler codeNextToken." |
130 " compiler codeNextToken." |
130 compiler codeHaltIfShiftPressed. |
131 compiler codeHaltIfShiftPressed. |
131 compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar. |
132 compiler codeStoreValueOf: [ self visit: node parser ] intoVariable: self retvalVar. |
132 compiler codeReturn. |
133 compiler codeReturn. |
133 ! |
134 ! |
134 |
135 |
135 visitTrimmingTokenNode: node |
136 visitTrimmingTokenNode: node |
136 | id startVar endVar | |
137 self error: 'shoudl not happend!!' |
137 |
|
138 startVar := compiler allocateTemporaryVariableNamed: 'start'. |
|
139 endVar := compiler allocateTemporaryVariableNamed: 'end'. |
|
140 |
|
141 id := compiler idFor: node. |
|
142 compiler toTokenRememberStrategy. |
|
143 |
|
144 |
|
145 compiler addComment: 'Consume Whitespace:'. |
|
146 compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever. |
|
147 compiler nl. |
|
148 |
|
149 compiler codeAssign: 'context position + 1.' to: startVar. |
|
150 compiler codeStoreValueOf: [ self visit: node child ] intoVariable: #whatever. |
|
151 |
|
152 compiler add: 'error ifFalse: [ '. |
|
153 compiler indent. |
|
154 compiler codeAssign: 'context position.' to: endVar. |
|
155 |
|
156 compiler addComment: 'Consume Whitespace:'. |
|
157 compiler codeStoreValueOf: [ self visit: node whitespace ] intoVariable: #whatever. |
|
158 compiler nl. |
|
159 |
|
160 |
|
161 compiler codeTranscriptShow: 'current token type: ', id storeString. |
|
162 compiler codeAssign: id storeString, '.' to: 'currentTokenType'. |
|
163 compiler codeAssign: node tokenClass asString, ' on: (context collection) |
|
164 start: ', startVar, ' |
|
165 stop: ', endVar, ' |
|
166 value: nil.' |
|
167 to: 'currentTokenValue := ', self retvalVar. |
|
168 compiler codeReturn. |
|
169 compiler dedent. |
|
170 compiler add: '].' . |
|
171 compiler toNormalRememberStrategy. |
|
172 ! ! |
138 ! ! |
173 |
139 |