Skip to content

Commit a1a8f42

Browse files
author
黄成家
committed
pysim.py兼容python3
1 parent a0e53de commit a1a8f42

File tree

5 files changed

+180
-80
lines changed

5 files changed

+180
-80
lines changed

ch14/p0.1/pysim.py

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import os, sys
22

3+
PY3 = sys.version_info[0] == 3
4+
35
comment_mark = ";%"
46
code = []
57
stack = []
@@ -22,8 +24,8 @@ def is_valid_identifier(ident):
2224

2325
def assemb_error(line, msg):
2426
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)
2729
exit(-1)
2830

2931
def run_error(msg="Wrong instruction format"):
@@ -32,13 +34,31 @@ def run_error(msg="Wrong instruction format"):
3234
display(pause=False)
3335
exit(-1)
3436

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+
3555
def assemb(asmfilename):
3656
if len(sys.argv) > 2 and (sys.argv[2] == '-a' or sys.argv[2] == '-da'):
3757
code.append(('', '$main', ''))
3858
code.append(('', 'exit', '~'))
3959

4060
label = ""
41-
for line in file(asmfilename):
61+
for line in read_file(asmfilename):
4262
line = line.strip()
4363
if line == "" or line[0] in comment_mark:
4464
continue
@@ -78,15 +98,15 @@ def check_label(label):
7898
if sep:
7999
if func.strip() != 'FUNC' \
80100
or not is_valid_identifier(funcName) \
81-
or func_table.has_key(funcName):
101+
or table_has_key(func_table, funcName):
82102
return False
83103
else:
84104
func_table[funcName] = len(code)
85105
return True
86106
else:
87107
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):
90110
return False
91111
else:
92112
label_table[label] = len(code)
@@ -98,7 +118,7 @@ def trim(s, size):
98118
def display(pause=True):
99119
num_code_lines, num_terminal_lines = 24, 8
100120
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"))
102122
j = 0
103123
for i in range( \
104124
max(eip+1-num_code_lines, 0), max(eip+1, num_code_lines) ):
@@ -116,22 +136,22 @@ def display(pause=True):
116136
stvar = var_table.get(j, "")
117137
if j == len(stack) - 1: stvar += "<-"
118138

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))
121141

122142
j += 1
123143

124-
print "***Terminal***"
144+
print("***Terminal***")
125145
n = len(printout)
126146
for i in range( \
127147
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 "")
129149
if i == n and not pause:
130150
break
131151

132152
if pause:
133153
global debug
134-
if raw_input("\npress enter to step, -r to run.") == "-r":
154+
if get_input("\npress enter to step, -r to run.") == "-r":
135155
debug = False
136156

137157
def run():
@@ -160,7 +180,7 @@ def do_var(arg):
160180
if arg == "": return
161181
for var in arg.split(','):
162182
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):
164184
run_error("Wrong var name")
165185
var_table[var] = len(stack)
166186
var_table[len(stack)] = var
@@ -235,7 +255,7 @@ def do_print(fmt):
235255
run_error("Format string error")
236256
argc = fmt.count("%d")
237257
out = fmt[1:-1] % tuple(stack[len(stack)-argc:])
238-
print out
258+
print(out)
239259
printout.append(out)
240260
del stack[len(stack)-argc:]
241261

@@ -244,7 +264,7 @@ def do_readint(msg):
244264
run_error("Message string error")
245265
msg = msg.strip('"').strip("'")
246266
if debug: display(pause=False)
247-
string = raw_input(msg)
267+
string = get_input(msg)
248268
try:
249269
value = int(string)
250270
except ValueError:
@@ -288,7 +308,7 @@ def call(funcName):
288308
new_var_table = {}
289309
for addr, arg in enumerate(arg_list, len(stack)-len(arg_list)):
290310
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):
292312
run_error("Wrong arg name")
293313

294314
new_var_table[arg] = addr

ch14/p0.5/pysim.py

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import os, sys
22

3+
PY3 = sys.version_info[0] == 3
4+
35
comment_mark = ";%"
46
code = []
57
stack = []
@@ -22,8 +24,8 @@ def is_valid_identifier(ident):
2224

2325
def assemb_error(line, msg):
2426
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)
2729
exit(-1)
2830

2931
def run_error(msg="Wrong instruction format"):
@@ -32,13 +34,31 @@ def run_error(msg="Wrong instruction format"):
3234
display(pause=False)
3335
exit(-1)
3436

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+
3555
def assemb(asmfilename):
3656
if len(sys.argv) > 2 and (sys.argv[2] == '-a' or sys.argv[2] == '-da'):
3757
code.append(('', '$main', ''))
3858
code.append(('', 'exit', '~'))
3959

4060
label = ""
41-
for line in file(asmfilename):
61+
for line in read_file(asmfilename):
4262
line = line.strip()
4363
if line == "" or line[0] in comment_mark:
4464
continue
@@ -78,15 +98,15 @@ def check_label(label):
7898
if sep:
7999
if func.strip() != 'FUNC' \
80100
or not is_valid_identifier(funcName) \
81-
or func_table.has_key(funcName):
101+
or table_has_key(func_table, funcName):
82102
return False
83103
else:
84104
func_table[funcName] = len(code)
85105
return True
86106
else:
87107
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):
90110
return False
91111
else:
92112
label_table[label] = len(code)
@@ -98,7 +118,7 @@ def trim(s, size):
98118
def display(pause=True):
99119
num_code_lines, num_terminal_lines = 24, 8
100120
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"))
102122
j = 0
103123
for i in range( \
104124
max(eip+1-num_code_lines, 0), max(eip+1, num_code_lines) ):
@@ -116,22 +136,22 @@ def display(pause=True):
116136
stvar = var_table.get(j, "")
117137
if j == len(stack) - 1: stvar += "<-"
118138

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))
121141

122142
j += 1
123143

124-
print "***Terminal***"
144+
print("***Terminal***")
125145
n = len(printout)
126146
for i in range( \
127147
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 "")
129149
if i == n and not pause:
130150
break
131151

132152
if pause:
133153
global debug
134-
if raw_input("\npress enter to step, -r to run.") == "-r":
154+
if get_input("\npress enter to step, -r to run.") == "-r":
135155
debug = False
136156

137157
def run():
@@ -160,7 +180,7 @@ def do_var(arg):
160180
if arg == "": return
161181
for var in arg.split(','):
162182
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):
164184
run_error("Wrong var name")
165185
var_table[var] = len(stack)
166186
var_table[len(stack)] = var
@@ -235,7 +255,7 @@ def do_print(fmt):
235255
run_error("Format string error")
236256
argc = fmt.count("%d")
237257
out = fmt[1:-1] % tuple(stack[len(stack)-argc:])
238-
print out
258+
print(out)
239259
printout.append(out)
240260
del stack[len(stack)-argc:]
241261

@@ -244,7 +264,7 @@ def do_readint(msg):
244264
run_error("Message string error")
245265
msg = msg.strip('"').strip("'")
246266
if debug: display(pause=False)
247-
string = raw_input(msg)
267+
string = get_input(msg)
248268
try:
249269
value = int(string)
250270
except ValueError:
@@ -288,7 +308,7 @@ def call(funcName):
288308
new_var_table = {}
289309
for addr, arg in enumerate(arg_list, len(stack)-len(arg_list)):
290310
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):
292312
run_error("Wrong arg name")
293313

294314
new_var_table[arg] = addr

0 commit comments

Comments
 (0)