| # An implementation of Dartmouth BASIC (1964) |
| # |
| |
| import sys |
| sys.path.insert(0, "../..") |
| |
| if sys.version_info[0] >= 3: |
| raw_input = input |
| |
| import basiclex |
| import basparse |
| import basinterp |
| |
| # If a filename has been specified, we try to run it. |
| # If a runtime error occurs, we bail out and enter |
| # interactive mode below |
| if len(sys.argv) == 2: |
| data = open(sys.argv[1]).read() |
| prog = basparse.parse(data) |
| if not prog: |
| raise SystemExit |
| b = basinterp.BasicInterpreter(prog) |
| try: |
| b.run() |
| raise SystemExit |
| except RuntimeError: |
| pass |
| |
| else: |
| b = basinterp.BasicInterpreter({}) |
| |
| # Interactive mode. This incrementally adds/deletes statements |
| # from the program stored in the BasicInterpreter object. In |
| # addition, special commands 'NEW','LIST',and 'RUN' are added. |
| # Specifying a line number with no code deletes that line from |
| # the program. |
| |
| while 1: |
| try: |
| line = raw_input("[BASIC] ") |
| except EOFError: |
| raise SystemExit |
| if not line: |
| continue |
| line += "\n" |
| prog = basparse.parse(line) |
| if not prog: |
| continue |
| |
| keys = list(prog) |
| if keys[0] > 0: |
| b.add_statements(prog) |
| else: |
| stat = prog[keys[0]] |
| if stat[0] == 'RUN': |
| try: |
| b.run() |
| except RuntimeError: |
| pass |
| elif stat[0] == 'LIST': |
| b.list() |
| elif stat[0] == 'BLANK': |
| b.del_line(stat[1]) |
| elif stat[0] == 'NEW': |
| b.new() |