14479Sbinkertn@umich.edu# An implementation of Dartmouth BASIC (1964)
24479Sbinkertn@umich.edu#
34479Sbinkertn@umich.edu
44479Sbinkertn@umich.eduimport sys
54479Sbinkertn@umich.edusys.path.insert(0,"../..")
64479Sbinkertn@umich.edu
76498Snate@binkert.orgif sys.version_info[0] >= 3:
86498Snate@binkert.org    raw_input = input
96498Snate@binkert.org
104479Sbinkertn@umich.eduimport basiclex
114479Sbinkertn@umich.eduimport basparse
124479Sbinkertn@umich.eduimport basinterp
134479Sbinkertn@umich.edu
144479Sbinkertn@umich.edu# If a filename has been specified, we try to run it.
154479Sbinkertn@umich.edu# If a runtime error occurs, we bail out and enter
164479Sbinkertn@umich.edu# interactive mode below
174479Sbinkertn@umich.eduif len(sys.argv) == 2:
184479Sbinkertn@umich.edu    data = open(sys.argv[1]).read()
194479Sbinkertn@umich.edu    prog = basparse.parse(data)
204479Sbinkertn@umich.edu    if not prog: raise SystemExit
214479Sbinkertn@umich.edu    b = basinterp.BasicInterpreter(prog)
224479Sbinkertn@umich.edu    try:
234479Sbinkertn@umich.edu        b.run()
244479Sbinkertn@umich.edu        raise SystemExit
254479Sbinkertn@umich.edu    except RuntimeError:
264479Sbinkertn@umich.edu        pass
274479Sbinkertn@umich.edu
284479Sbinkertn@umich.eduelse:
294479Sbinkertn@umich.edu    b = basinterp.BasicInterpreter({})
304479Sbinkertn@umich.edu
314479Sbinkertn@umich.edu# Interactive mode.  This incrementally adds/deletes statements
324479Sbinkertn@umich.edu# from the program stored in the BasicInterpreter object.  In
334479Sbinkertn@umich.edu# addition, special commands 'NEW','LIST',and 'RUN' are added.
344479Sbinkertn@umich.edu# Specifying a line number with no code deletes that line from
354479Sbinkertn@umich.edu# the program.
364479Sbinkertn@umich.edu
374479Sbinkertn@umich.eduwhile 1:
384479Sbinkertn@umich.edu    try:
394479Sbinkertn@umich.edu        line = raw_input("[BASIC] ")
404479Sbinkertn@umich.edu    except EOFError:
414479Sbinkertn@umich.edu        raise SystemExit
424479Sbinkertn@umich.edu    if not line: continue
434479Sbinkertn@umich.edu    line += "\n"
444479Sbinkertn@umich.edu    prog = basparse.parse(line)
454479Sbinkertn@umich.edu    if not prog: continue
464479Sbinkertn@umich.edu
476498Snate@binkert.org    keys = list(prog)
484479Sbinkertn@umich.edu    if keys[0] > 0:
494479Sbinkertn@umich.edu         b.add_statements(prog)
504479Sbinkertn@umich.edu    else:
514479Sbinkertn@umich.edu         stat = prog[keys[0]]
524479Sbinkertn@umich.edu         if stat[0] == 'RUN':
534479Sbinkertn@umich.edu             try:
544479Sbinkertn@umich.edu                 b.run()
554479Sbinkertn@umich.edu             except RuntimeError:
564479Sbinkertn@umich.edu                 pass
574479Sbinkertn@umich.edu         elif stat[0] == 'LIST':
584479Sbinkertn@umich.edu             b.list()
594479Sbinkertn@umich.edu         elif stat[0] == 'BLANK':
604479Sbinkertn@umich.edu             b.del_line(stat[1])
614479Sbinkertn@umich.edu         elif stat[0] == 'NEW':
624479Sbinkertn@umich.edu             b.new()
634479Sbinkertn@umich.edu
646498Snate@binkert.org
656498Snate@binkert.org
664479Sbinkertn@umich.edu
674479Sbinkertn@umich.edu
684479Sbinkertn@umich.edu
694479Sbinkertn@umich.edu
704479Sbinkertn@umich.edu
714479Sbinkertn@umich.edu
72