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