16498Snate@binkert.org# An implementation of Dartmouth BASIC (1964)
26498Snate@binkert.org#
36498Snate@binkert.org
46498Snate@binkert.orgimport sys
56498Snate@binkert.orgsys.path.insert(0,"../..")
66498Snate@binkert.org
76498Snate@binkert.orgif sys.version_info[0] >= 3:
86498Snate@binkert.org    raw_input = input
96498Snate@binkert.org
106498Snate@binkert.orgimport logging
116498Snate@binkert.orglogging.basicConfig(
126498Snate@binkert.org    level = logging.INFO,
136498Snate@binkert.org    filename = "parselog.txt",
146498Snate@binkert.org    filemode = "w"
156498Snate@binkert.org)
166498Snate@binkert.orglog = logging.getLogger()
176498Snate@binkert.org
186498Snate@binkert.orgimport basiclex
196498Snate@binkert.orgimport basparse
206498Snate@binkert.orgimport basinterp
216498Snate@binkert.org
226498Snate@binkert.org# If a filename has been specified, we try to run it.
236498Snate@binkert.org# If a runtime error occurs, we bail out and enter
246498Snate@binkert.org# interactive mode below
256498Snate@binkert.orgif len(sys.argv) == 2:
266498Snate@binkert.org    data = open(sys.argv[1]).read()
276498Snate@binkert.org    prog = basparse.parse(data,debug=log)
286498Snate@binkert.org    if not prog: raise SystemExit
296498Snate@binkert.org    b = basinterp.BasicInterpreter(prog)
306498Snate@binkert.org    try:
316498Snate@binkert.org        b.run()
326498Snate@binkert.org        raise SystemExit
336498Snate@binkert.org    except RuntimeError:
346498Snate@binkert.org        pass
356498Snate@binkert.org
366498Snate@binkert.orgelse:
376498Snate@binkert.org    b = basinterp.BasicInterpreter({})
386498Snate@binkert.org
396498Snate@binkert.org# Interactive mode.  This incrementally adds/deletes statements
406498Snate@binkert.org# from the program stored in the BasicInterpreter object.  In
416498Snate@binkert.org# addition, special commands 'NEW','LIST',and 'RUN' are added.
426498Snate@binkert.org# Specifying a line number with no code deletes that line from
436498Snate@binkert.org# the program.
446498Snate@binkert.org
456498Snate@binkert.orgwhile 1:
466498Snate@binkert.org    try:
476498Snate@binkert.org        line = raw_input("[BASIC] ")
486498Snate@binkert.org    except EOFError:
496498Snate@binkert.org        raise SystemExit
506498Snate@binkert.org    if not line: continue
516498Snate@binkert.org    line += "\n"
526498Snate@binkert.org    prog = basparse.parse(line,debug=log)
536498Snate@binkert.org    if not prog: continue
546498Snate@binkert.org
556498Snate@binkert.org    keys = list(prog)
566498Snate@binkert.org    if keys[0] > 0:
576498Snate@binkert.org         b.add_statements(prog)
586498Snate@binkert.org    else:
596498Snate@binkert.org         stat = prog[keys[0]]
606498Snate@binkert.org         if stat[0] == 'RUN':
616498Snate@binkert.org             try:
626498Snate@binkert.org                 b.run()
636498Snate@binkert.org             except RuntimeError:
646498Snate@binkert.org                 pass
656498Snate@binkert.org         elif stat[0] == 'LIST':
666498Snate@binkert.org             b.list()
676498Snate@binkert.org         elif stat[0] == 'BLANK':
686498Snate@binkert.org             b.del_line(stat[1])
696498Snate@binkert.org         elif stat[0] == 'NEW':
706498Snate@binkert.org             b.new()
716498Snate@binkert.org
726498Snate@binkert.org
736498Snate@binkert.org
746498Snate@binkert.org
756498Snate@binkert.org
766498Snate@binkert.org
776498Snate@binkert.org
786498Snate@binkert.org
796498Snate@binkert.org
80