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