basic.py revision 6498
1# An implementation of Dartmouth BASIC (1964) 2# 3 4import sys 5sys.path.insert(0,"../..") 6 7if sys.version_info[0] >= 3: 8 raw_input = input 9 10import basiclex 11import basparse 12import basinterp 13 14# If a filename has been specified, we try to run it. 15# If a runtime error occurs, we bail out and enter 16# interactive mode below 17if len(sys.argv) == 2: 18 data = open(sys.argv[1]).read() 19 prog = basparse.parse(data) 20 if not prog: raise SystemExit 21 b = basinterp.BasicInterpreter(prog) 22 try: 23 b.run() 24 raise SystemExit 25 except RuntimeError: 26 pass 27 28else: 29 b = basinterp.BasicInterpreter({}) 30 31# Interactive mode. This incrementally adds/deletes statements 32# from the program stored in the BasicInterpreter object. In 33# addition, special commands 'NEW','LIST',and 'RUN' are added. 34# Specifying a line number with no code deletes that line from 35# the program. 36 37while 1: 38 try: 39 line = raw_input("[BASIC] ") 40 except EOFError: 41 raise SystemExit 42 if not line: continue 43 line += "\n" 44 prog = basparse.parse(line) 45 if not prog: continue 46 47 keys = list(prog) 48 if keys[0] > 0: 49 b.add_statements(prog) 50 else: 51 stat = prog[keys[0]] 52 if stat[0] == 'RUN': 53 try: 54 b.run() 55 except RuntimeError: 56 pass 57 elif stat[0] == 'LIST': 58 b.list() 59 elif stat[0] == 'BLANK': 60 b.del_line(stat[1]) 61 elif stat[0] == 'NEW': 62 b.new() 63 64 65 66 67 68 69 70 71 72