ccfd7b96711d82e3749873393fdd767ed52d50dd
[platform/framework/web/lwnode.git] /
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