質問編集履歴
5
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -161,4 +161,4 @@
|
|
161
161
|
```
|
162
162
|
<bound method Parser.get_arg1 of <f_parser.Parser object at 0x0000023461595CD0>>
|
163
163
|
```
|
164
|
-
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値を
|
164
|
+
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値をarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
4
修正加筆
title
CHANGED
File without changes
|
body
CHANGED
@@ -148,6 +148,12 @@
|
|
148
148
|
### 起きていること
|
149
149
|
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理しようとしましたが、以下のエラーが返ってきました。
|
150
150
|
```
|
151
|
+
Traceback (most recent call last):
|
152
|
+
File "<stdin>", line 1, in <module>
|
153
|
+
File "~~~~\vm_translator.py", line 26, in Translate
|
154
|
+
self.codeWriter.writePush(arg1, arg2)
|
155
|
+
File "~~~~\code_writer.py", line 53, in writePush
|
156
|
+
command = '\n'.join(address + process)
|
151
157
|
UnboundLocalError: local variable 'address' referenced before assignment
|
152
158
|
```
|
153
159
|
|
@@ -155,4 +161,4 @@
|
|
155
161
|
```
|
156
162
|
<bound method Parser.get_arg1 of <f_parser.Parser object at 0x0000023461595CD0>>
|
157
163
|
```
|
158
|
-
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。get_argメソッドの戻り値をstringにしてarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
164
|
+
となっており、型としてstringを期待しているのにParserクラスのオブジェクトとして表示されています。エラー自体はget_argの戻り値がどのif文にも引っかからなかったことが原因です(さらにそのような場合のケアもしていない)。get_argメソッドの戻り値をstringにしてarg1 == 'static'のような条件分岐に引っ掛けるにはどうすればよいでしょうか?クラス定義と継承あたりの基本事項と思われますが、どうぞ宜しくお願いします。
|
3
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -140,7 +140,7 @@
|
|
140
140
|
self.codeWriter.writeArithmetric(command)
|
141
141
|
|
142
142
|
else:
|
143
|
-
print('Finish VM
|
143
|
+
print('Finish VM translation.')
|
144
144
|
|
145
145
|
|
146
146
|
```
|
2
関数の呼び出しについて追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
```python
|
6
|
+
## f_parser.py
|
6
7
|
import re
|
7
8
|
|
8
9
|
class Parser():
|
@@ -71,8 +72,10 @@
|
|
71
72
|
|
72
73
|
```
|
73
74
|
実現したいことは、push constant 2 のようなVMコードをパースして以下のような関数に投げて処理がしたいです。
|
75
|
+
```python
|
74
76
|
|
75
|
-
|
77
|
+
## code_writer.py
|
78
|
+
|
76
79
|
def writePush(self, arg1, arg2):
|
77
80
|
if arg1 == 'static':
|
78
81
|
address = ['@' + self.filename + '.' + arg2]
|
@@ -95,6 +98,53 @@
|
|
95
98
|
self.o_stream.write(command)
|
96
99
|
```
|
97
100
|
|
101
|
+
|
102
|
+
get_arg1,get_arg2はf_parser.pyに記述されています。やりたい処理は同じディレクトリ内のcode_writer.pyに書いてあります。実際にはWritePush()は、vm_translator.pyというファイル(これも同じディレクトリ内)でVM_Translatorクラスのメソッド内の処理として呼び出されています。
|
103
|
+
```python
|
104
|
+
# vm_translator.py
|
105
|
+
|
106
|
+
import f_parser
|
107
|
+
import code_writer
|
108
|
+
|
109
|
+
|
110
|
+
class VM_Translator():
|
111
|
+
def __init__(self, dir, filename):
|
112
|
+
self.dir = dir
|
113
|
+
self.filename = filename
|
114
|
+
self.i_stream = open(dir+'/'+filename + '.vm', 'r')
|
115
|
+
self.parser = f_parser.Parser(self.i_stream)
|
116
|
+
self.codeWriter = code_writer.codeWriter(self.dir, self.filename, self.parser)
|
117
|
+
|
118
|
+
def Translate(self):
|
119
|
+
while self.parser.hasMoreCommands():
|
120
|
+
self.parser.advance()
|
121
|
+
|
122
|
+
line_now = self.parser.line_now
|
123
|
+
command_type = self.parser.commandType()
|
124
|
+
|
125
|
+
if command_type == None:
|
126
|
+
continue
|
127
|
+
|
128
|
+
if command_type == 'C_PUSH':
|
129
|
+
arg1 = self.parser.get_arg1
|
130
|
+
arg2 = self.parser.get_arg2
|
131
|
+
self.codeWriter.writePush(arg1, arg2)
|
132
|
+
|
133
|
+
if command_type == 'C_POP':
|
134
|
+
arg1 = self.parser.get_arg1
|
135
|
+
arg2 = self.parser.get_arg2
|
136
|
+
self.codeWriter.writePop(arg1, arg2)
|
137
|
+
|
138
|
+
if command_type == 'C_ARITHMETRIC':
|
139
|
+
command = self.parser.get_arg1()
|
140
|
+
self.codeWriter.writeArithmetric(command)
|
141
|
+
|
142
|
+
else:
|
143
|
+
print('Finish VM transration.')
|
144
|
+
|
145
|
+
|
146
|
+
```
|
147
|
+
|
98
148
|
### 起きていること
|
99
149
|
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理しようとしましたが、以下のエラーが返ってきました。
|
100
150
|
```
|
1
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -96,7 +96,7 @@
|
|
96
96
|
```
|
97
97
|
|
98
98
|
### 起きていること
|
99
|
-
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理し
|
99
|
+
始めに示したクラスのget_arg1,get_arg2メソッドでarg1とarg2を取得して処理しようとしましたが、以下のエラーが返ってきました。
|
100
100
|
```
|
101
101
|
UnboundLocalError: local variable 'address' referenced before assignment
|
102
102
|
```
|