1
1
import os , sys
2
2
3
+ PY3 = sys .version_info [0 ] == 3
4
+
3
5
comment_mark = ";%"
4
6
code = []
5
7
stack = []
@@ -22,8 +24,8 @@ def is_valid_identifier(ident):
22
24
23
25
def assemb_error (line , msg ):
24
26
display (pause = False )
25
- print line
26
- print "^^^Error at last line: %s" % msg
27
+ print ( line )
28
+ print ( "^^^Error at last line: %s" % msg )
27
29
exit (- 1 )
28
30
29
31
def run_error (msg = "Wrong instruction format" ):
@@ -32,13 +34,31 @@ def run_error(msg="Wrong instruction format"):
32
34
display (pause = False )
33
35
exit (- 1 )
34
36
37
+ def read_file (filename ):
38
+ if PY3 :
39
+ return open (filename , 'r' ).readlines ()
40
+
41
+ return file (filename ).readlines ()
42
+
43
+ def get_input (msg ):
44
+ if PY3 :
45
+ return input (msg )
46
+
47
+ return raw_input (msg )
48
+
49
+ def table_has_key (table , key ):
50
+ if PY3 :
51
+ return key in table
52
+
53
+ return table .has_key (key )
54
+
35
55
def assemb (asmfilename ):
36
56
if len (sys .argv ) > 2 and (sys .argv [2 ] == '-a' or sys .argv [2 ] == '-da' ):
37
57
code .append (('' , '$main' , '' ))
38
58
code .append (('' , 'exit' , '~' ))
39
59
40
60
label = ""
41
- for line in file (asmfilename ):
61
+ for line in read_file (asmfilename ):
42
62
line = line .strip ()
43
63
if line == "" or line [0 ] in comment_mark :
44
64
continue
@@ -78,15 +98,15 @@ def check_label(label):
78
98
if sep :
79
99
if func .strip () != 'FUNC' \
80
100
or not is_valid_identifier (funcName ) \
81
- or func_table . has_key ( funcName ):
101
+ or table_has_key ( func_table , funcName ):
82
102
return False
83
103
else :
84
104
func_table [funcName ] = len (code )
85
105
return True
86
106
else :
87
107
if not is_valid_identifier (label ) \
88
- or func_table . has_key ( label ) \
89
- or label_table . has_key ( label ):
108
+ or table_has_key ( func_table , label ) \
109
+ or table_has_key ( label_table , label ):
90
110
return False
91
111
else :
92
112
label_table [label ] = len (code )
@@ -98,7 +118,7 @@ def trim(s, size):
98
118
def display (pause = True ):
99
119
num_code_lines , num_terminal_lines = 24 , 8
100
120
if os .system ("clear" ): os .system ('cls' )
101
- print "%32s%-40s| %-13s|Bind var" % ("" , "Code" , "Stack" )
121
+ print ( "%32s%-40s| %-13s|Bind var" % ("" , "Code" , "Stack" ) )
102
122
j = 0
103
123
for i in range ( \
104
124
max (eip + 1 - num_code_lines , 0 ), max (eip + 1 , num_code_lines ) ):
@@ -116,22 +136,22 @@ def display(pause=True):
116
136
stvar = var_table .get (j , "" )
117
137
if j == len (stack ) - 1 : stvar += "<-"
118
138
119
- print "%29s%3s%-40s| %-13s|%s" % \
120
- (label , point , line , st , stvar )
139
+ print ( "%29s%3s%-40s| %-13s|%s" % \
140
+ (label , point , line , st , stvar ))
121
141
122
142
j += 1
123
143
124
- print "***Terminal***"
144
+ print ( "***Terminal***" )
125
145
n = len (printout )
126
146
for i in range ( \
127
147
max (n - num_terminal_lines , 0 ), max (n , num_terminal_lines ) ):
128
- print printout [i ] if i < n else ""
148
+ print ( printout [i ] if i < n else "" )
129
149
if i == n and not pause :
130
150
break
131
151
132
152
if pause :
133
153
global debug
134
- if raw_input ("\n press enter to step, -r to run." ) == "-r" :
154
+ if get_input ("\n press enter to step, -r to run." ) == "-r" :
135
155
debug = False
136
156
137
157
def run ():
@@ -160,7 +180,7 @@ def do_var(arg):
160
180
if arg == "" : return
161
181
for var in arg .split (',' ):
162
182
var = var .strip ()
163
- if not is_valid_identifier (var ) or var_table . has_key ( var ):
183
+ if not is_valid_identifier (var ) or table_has_key ( var_table , var ):
164
184
run_error ("Wrong var name" )
165
185
var_table [var ] = len (stack )
166
186
var_table [len (stack )] = var
@@ -235,7 +255,7 @@ def do_print(fmt):
235
255
run_error ("Format string error" )
236
256
argc = fmt .count ("%d" )
237
257
out = fmt [1 :- 1 ] % tuple (stack [len (stack )- argc :])
238
- print out
258
+ print ( out )
239
259
printout .append (out )
240
260
del stack [len (stack )- argc :]
241
261
@@ -244,7 +264,7 @@ def do_readint(msg):
244
264
run_error ("Message string error" )
245
265
msg = msg .strip ('"' ).strip ("'" )
246
266
if debug : display (pause = False )
247
- string = raw_input (msg )
267
+ string = get_input (msg )
248
268
try :
249
269
value = int (string )
250
270
except ValueError :
@@ -288,7 +308,7 @@ def call(funcName):
288
308
new_var_table = {}
289
309
for addr , arg in enumerate (arg_list , len (stack )- len (arg_list )):
290
310
arg = arg .strip ()
291
- if not is_valid_identifier (arg ) or new_var_table . has_key ( arg ):
311
+ if not is_valid_identifier (arg ) or table_has_key ( new_var_table , arg ):
292
312
run_error ("Wrong arg name" )
293
313
294
314
new_var_table [arg ] = addr
0 commit comments