80 lines
1.7 KiB
Python
80 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()
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|