79 lines
1.7 KiB
Python
79 lines
1.7 KiB
Python
# An implementation of Dartmouth BASIC (1964)
|
|
#
|
|
|
|
import sys
|
|
sys.path.insert(0,"../..")
|
|
|
|
if sys.version_info[0] >= 3:
|
|
raw_input = input
|
|
|
|
import logging
|
|
logging.basicConfig(
|
|
level = logging.INFO,
|
|
filename = "parselog.txt",
|
|
filemode = "w"
|
|
)
|
|
log = logging.getLogger()
|
|
|
|
import basiclex
|
|
import basparse
|
|
import basinterp
|
|
|
|
# If a filename has been specified, we try to run it.
|
|
# If a runtime error occurs, we bail out and enter
|
|
# interactive mode below
|
|
if len(sys.argv) == 2:
|
|
data = open(sys.argv[1]).read()
|
|
prog = basparse.parse(data,debug=log)
|
|
if not prog: raise SystemExit
|
|
b = basinterp.BasicInterpreter(prog)
|
|
try:
|
|
b.run()
|
|
raise SystemExit
|
|
except RuntimeError:
|
|
pass
|
|
|
|
else:
|
|
b = basinterp.BasicInterpreter({})
|
|
|
|
# Interactive mode. This incrementally adds/deletes statements
|
|
# from the program stored in the BasicInterpreter object. In
|
|
# addition, special commands 'NEW','LIST',and 'RUN' are added.
|
|
# Specifying a line number with no code deletes that line from
|
|
# the program.
|
|
|
|
while 1:
|
|
try:
|
|
line = raw_input("[BASIC] ")
|
|
except EOFError:
|
|
raise SystemExit
|
|
if not line: continue
|
|
line += "\n"
|
|
prog = basparse.parse(line,debug=log)
|
|
if not prog: continue
|
|
|
|
keys = list(prog)
|
|
if keys[0] > 0:
|
|
b.add_statements(prog)
|
|
else:
|
|
stat = prog[keys[0]]
|
|
if stat[0] == 'RUN':
|
|
try:
|
|
b.run()
|
|
except RuntimeError:
|
|
pass
|
|
elif stat[0] == 'LIST':
|
|
b.list()
|
|
elif stat[0] == 'BLANK':
|
|
b.del_line(stat[1])
|
|
elif stat[0] == 'NEW':
|
|
b.new()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|