basic.py revision 4479
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
74479Sbinkertn@umich.eduimport basiclex
84479Sbinkertn@umich.eduimport basparse
94479Sbinkertn@umich.eduimport basinterp
104479Sbinkertn@umich.edu
114479Sbinkertn@umich.edu# If a filename has been specified, we try to run it.
124479Sbinkertn@umich.edu# If a runtime error occurs, we bail out and enter
134479Sbinkertn@umich.edu# interactive mode below
144479Sbinkertn@umich.eduif len(sys.argv) == 2:
154479Sbinkertn@umich.edu    data = open(sys.argv[1]).read()
164479Sbinkertn@umich.edu    prog = basparse.parse(data)
174479Sbinkertn@umich.edu    if not prog: raise SystemExit
184479Sbinkertn@umich.edu    b = basinterp.BasicInterpreter(prog)
194479Sbinkertn@umich.edu    try:
204479Sbinkertn@umich.edu        b.run()
214479Sbinkertn@umich.edu        raise SystemExit
224479Sbinkertn@umich.edu    except RuntimeError:
234479Sbinkertn@umich.edu        pass
244479Sbinkertn@umich.edu
254479Sbinkertn@umich.eduelse:
264479Sbinkertn@umich.edu    b = basinterp.BasicInterpreter({})
274479Sbinkertn@umich.edu
284479Sbinkertn@umich.edu# Interactive mode.  This incrementally adds/deletes statements
294479Sbinkertn@umich.edu# from the program stored in the BasicInterpreter object.  In
304479Sbinkertn@umich.edu# addition, special commands 'NEW','LIST',and 'RUN' are added.
314479Sbinkertn@umich.edu# Specifying a line number with no code deletes that line from
324479Sbinkertn@umich.edu# the program.
334479Sbinkertn@umich.edu
344479Sbinkertn@umich.eduwhile 1:
354479Sbinkertn@umich.edu    try:
364479Sbinkertn@umich.edu        line = raw_input("[BASIC] ")
374479Sbinkertn@umich.edu    except EOFError:
384479Sbinkertn@umich.edu        raise SystemExit
394479Sbinkertn@umich.edu    if not line: continue
404479Sbinkertn@umich.edu    line += "\n"
414479Sbinkertn@umich.edu    prog = basparse.parse(line)
424479Sbinkertn@umich.edu    if not prog: continue
434479Sbinkertn@umich.edu
444479Sbinkertn@umich.edu    keys = prog.keys()
454479Sbinkertn@umich.edu    if keys[0] > 0:
464479Sbinkertn@umich.edu         b.add_statements(prog)
474479Sbinkertn@umich.edu    else:
484479Sbinkertn@umich.edu         stat = prog[keys[0]]
494479Sbinkertn@umich.edu         if stat[0] == 'RUN':
504479Sbinkertn@umich.edu             try:
514479Sbinkertn@umich.edu                 b.run()
524479Sbinkertn@umich.edu             except RuntimeError:
534479Sbinkertn@umich.edu                 pass
544479Sbinkertn@umich.edu         elif stat[0] == 'LIST':
554479Sbinkertn@umich.edu             b.list()
564479Sbinkertn@umich.edu         elif stat[0] == 'BLANK':
574479Sbinkertn@umich.edu             b.del_line(stat[1])
584479Sbinkertn@umich.edu         elif stat[0] == 'NEW':
594479Sbinkertn@umich.edu             b.new()
604479Sbinkertn@umich.edu
614479Sbinkertn@umich.edu
624479Sbinkertn@umich.edu
634479Sbinkertn@umich.edu
644479Sbinkertn@umich.edu
654479Sbinkertn@umich.edu
664479Sbinkertn@umich.edu
674479Sbinkertn@umich.edu
684479Sbinkertn@umich.edu
69