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