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