質問編集履歴

5

誤字

2020/04/13 12:18

投稿

退会済みユーザー
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メソッドの戻り値をstringにしてarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
327
+ となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値をarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。

4

修正加筆

2020/04/13 12:18

投稿

退会済みユーザー
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

誤字

2020/04/13 12:17

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -282,7 +282,7 @@
282
282
 
283
283
  else:
284
284
 
285
- print('Finish VM transration.')
285
+ print('Finish VM translation.')
286
286
 
287
287
 
288
288
 

2

関数の呼び出しについて追加

2020/04/13 12:13

投稿

退会済みユーザー
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

誤字

2020/04/13 12:12

投稿

退会済みユーザー
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