質問編集履歴
5
誤字
test
CHANGED
File without changes
|
test
CHANGED
@@ -324,4 +324,4 @@
|
|
324
324
|
|
325
325
|
```
|
326
326
|
|
327
|
-
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値を
|
327
|
+
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値をarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
4
修正加筆
test
CHANGED
File without changes
|
test
CHANGED
@@ -298,6 +298,18 @@
|
|
298
298
|
|
299
299
|
```
|
300
300
|
|
301
|
+
Traceback (most recent call last):
|
302
|
+
|
303
|
+
File "<stdin>", line 1, in <module>
|
304
|
+
|
305
|
+
File "~~~~\vm_translator.py", line 26, in Translate
|
306
|
+
|
307
|
+
self.codeWriter.writePush(arg1, arg2)
|
308
|
+
|
309
|
+
File "~~~~\code_writer.py", line 53, in writePush
|
310
|
+
|
311
|
+
command = '\n'.join(address + process)
|
312
|
+
|
301
313
|
UnboundLocalError: local variable 'address' referenced before assignment
|
302
314
|
|
303
315
|
```
|
@@ -312,4 +324,4 @@
|
|
312
324
|
|
313
325
|
```
|
314
326
|
|
315
|
-
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。get_argメソッドの戻り値をstringにしてarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
327
|
+
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値をstringにしてarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
3
誤字
test
CHANGED
File without changes
|
test
CHANGED
@@ -282,7 +282,7 @@
|
|
282
282
|
|
283
283
|
else:
|
284
284
|
|
285
|
-
print('Finish VM trans
|
285
|
+
print('Finish VM translation.')
|
286
286
|
|
287
287
|
|
288
288
|
|
2
関数の呼び出しについて追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,6 +8,8 @@
|
|
8
8
|
|
9
9
|
```python
|
10
10
|
|
11
|
+
## f_parser.py
|
12
|
+
|
11
13
|
import re
|
12
14
|
|
13
15
|
|
@@ -144,10 +146,14 @@
|
|
144
146
|
|
145
147
|
実現したいことは、push constant 2 のようなVMコードをパースして以下のような関数に投げて処理がしたいです。
|
146
148
|
|
147
|
-
|
148
|
-
|
149
149
|
```python
|
150
150
|
|
151
|
+
|
152
|
+
|
153
|
+
## code_writer.py
|
154
|
+
|
155
|
+
|
156
|
+
|
151
157
|
def writePush(self, arg1, arg2):
|
152
158
|
|
153
159
|
if arg1 == 'static':
|
@@ -192,6 +198,100 @@
|
|
192
198
|
|
193
199
|
|
194
200
|
|
201
|
+
|
202
|
+
|
203
|
+
get_arg1,get_arg2はf_parser.pyに記述されています。やりたい処理は同じディレクトリ内のcode_writer.pyに書いてあります。実際にはWritePush()は、vm_translator.pyというファイル(これも同じディレクトリ内)でVM_Translatorクラスのメソッド内の処理として呼び出されています。
|
204
|
+
|
205
|
+
```python
|
206
|
+
|
207
|
+
# vm_translator.py
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
import f_parser
|
212
|
+
|
213
|
+
import code_writer
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
class VM_Translator():
|
220
|
+
|
221
|
+
def __init__(self, dir, filename):
|
222
|
+
|
223
|
+
self.dir = dir
|
224
|
+
|
225
|
+
self.filename = filename
|
226
|
+
|
227
|
+
self.i_stream = open(dir+'/'+filename + '.vm', 'r')
|
228
|
+
|
229
|
+
self.parser = f_parser.Parser(self.i_stream)
|
230
|
+
|
231
|
+
self.codeWriter = code_writer.codeWriter(self.dir, self.filename, self.parser)
|
232
|
+
|
233
|
+
|
234
|
+
|
235
|
+
def Translate(self):
|
236
|
+
|
237
|
+
while self.parser.hasMoreCommands():
|
238
|
+
|
239
|
+
self.parser.advance()
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
line_now = self.parser.line_now
|
244
|
+
|
245
|
+
command_type = self.parser.commandType()
|
246
|
+
|
247
|
+
|
248
|
+
|
249
|
+
if command_type == None:
|
250
|
+
|
251
|
+
continue
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
if command_type == 'C_PUSH':
|
256
|
+
|
257
|
+
arg1 = self.parser.get_arg1
|
258
|
+
|
259
|
+
arg2 = self.parser.get_arg2
|
260
|
+
|
261
|
+
self.codeWriter.writePush(arg1, arg2)
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
if command_type == 'C_POP':
|
266
|
+
|
267
|
+
arg1 = self.parser.get_arg1
|
268
|
+
|
269
|
+
arg2 = self.parser.get_arg2
|
270
|
+
|
271
|
+
self.codeWriter.writePop(arg1, arg2)
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
if command_type == 'C_ARITHMETRIC':
|
276
|
+
|
277
|
+
command = self.parser.get_arg1()
|
278
|
+
|
279
|
+
self.codeWriter.writeArithmetric(command)
|
280
|
+
|
281
|
+
|
282
|
+
|
283
|
+
else:
|
284
|
+
|
285
|
+
print('Finish VM transration.')
|
286
|
+
|
287
|
+
|
288
|
+
|
289
|
+
|
290
|
+
|
291
|
+
```
|
292
|
+
|
293
|
+
|
294
|
+
|
195
295
|
### 起きていること
|
196
296
|
|
197
297
|
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理しようとしましたが、以下のエラーが返ってきました。
|
1
誤字
test
CHANGED
File without changes
|
test
CHANGED
@@ -194,7 +194,7 @@
|
|
194
194
|
|
195
195
|
### 起きていること
|
196
196
|
|
197
|
-
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理し
|
197
|
+
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理しようとしましたが、以下のエラーが返ってきました。
|
198
198
|
|
199
199
|
```
|
200
200
|
|