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