Lines Matching refs:self

12     def __init__(self,prog):
13 self.prog = prog
15 self.functions = { # Built-in function table
16 'SIN' : lambda z: math.sin(self.eval(z)),
17 'COS' : lambda z: math.cos(self.eval(z)),
18 'TAN' : lambda z: math.tan(self.eval(z)),
19 'ATN' : lambda z: math.atan(self.eval(z)),
20 'EXP' : lambda z: math.exp(self.eval(z)),
21 'ABS' : lambda z: abs(self.eval(z)),
22 'LOG' : lambda z: math.log(self.eval(z)),
23 'SQR' : lambda z: math.sqrt(self.eval(z)),
24 'INT' : lambda z: int(self.eval(z)),
29 def collect_data(self):
30 self.data = []
31 for lineno in self.stat:
32 if self.prog[lineno][0] == 'DATA':
33 self.data = self.data + self.prog[lineno][1]
34 self.dc = 0 # Initialize the data counter
37 def check_end(self):
39 for lineno in self.stat:
40 if self.prog[lineno][0] == 'END' and not has_end:
44 self.error = 1
48 self.error = 1
51 def check_loops(self):
52 for pc in range(len(self.stat)):
53 lineno = self.stat[pc]
54 if self.prog[lineno][0] == 'FOR':
55 forinst = self.prog[lineno]
57 for i in range(pc+1,len(self.stat)):
58 if self.prog[self.stat[i]][0] == 'NEXT':
59 nextvar = self.prog[self.stat[i]][1]
61 self.loopend[pc] = i
64 print("FOR WITHOUT NEXT AT LINE %s" % self.stat[pc])
65 self.error = 1
68 def eval(self,expr):
71 elif etype == 'GROUP': return self.eval(expr[1])
73 if expr[1] == '-': return -self.eval(expr[2])
75 if expr[1] == '+': return self.eval(expr[2])+self.eval(expr[3])
76 elif expr[1] == '-': return self.eval(expr[2])-self.eval(expr[3])
77 elif expr[1] == '*': return self.eval(expr[2])*self.eval(expr[3])
78 elif expr[1] == '/': return float(self.eval(expr[2]))/self.eval(expr[3])
79 elif expr[1] == '^': return abs(self.eval(expr[2]))**self.eval(expr[3])
83 if var in self.vars:
84 return self.vars[var]
86 print("UNDEFINED VARIABLE %s AT LINE %s" % (var, self.stat[self.pc]))
90 if var in self.functions:
92 return self.functions[var](dim1)
95 if var in self.lists:
96 dim1val = self.eval(dim1)
97 if dim1val < 1 or dim1val > len(self.lists[var]):
98 print("LIST INDEX OUT OF BOUNDS AT LINE %s" % self.stat[self.pc])
100 return self.lists[var][dim1val-1]
102 if var in self.tables:
103 dim1val = self.eval(dim1)
104 dim2val = self.eval(dim2)
105 if dim1val < 1 or dim1val > len(self.tables[var]) or dim2val < 1 or dim2val > len(self.tables[var][0]):
106 print("TABLE INDEX OUT OUT BOUNDS AT LINE %s" % self.stat[self.pc])
108 return self.tables[var][dim1val-1][dim2val-1]
109 print("UNDEFINED VARIABLE %s AT LINE %s" % (var, self.stat[self.pc]))
113 def releval(self,expr):
115 lhs = self.eval(expr[2])
116 rhs = self.eval(expr[3])
142 def assign(self,target,value):
145 self.vars[var] = self.eval(value)
148 dim1val = self.eval(dim1)
149 if not var in self.lists:
150 self.lists[var] = [0]*10
152 if dim1val > len(self.lists[var]):
153 print ("DIMENSION TOO LARGE AT LINE %s" % self.stat[self.pc])
155 self.lists[var][dim1val-1] = self.eval(value)
157 dim1val = self.eval(dim1)
158 dim2val = self.eval(dim2)
159 if not var in self.tables:
163 self.tables[var] = v
165 if dim1val > len(self.tables[var]) or dim2val > len(self.tables[var][0]):
166 print("DIMENSION TOO LARGE AT LINE %s" % self.stat[self.pc])
168 self.tables[var][dim1val-1][dim2val-1] = self.eval(value)
171 def goto(self,linenum):
172 if not linenum in self.prog:
173 print("UNDEFINED LINE NUMBER %d AT LINE %d" % (linenum, self.stat[self.pc]))
175 self.pc = self.stat.index(linenum)
178 def run(self):
179 self.vars = { } # All variables
180 self.lists = { } # List variables
181 self.tables = { } # Tables
182 self.loops = [ ] # Currently active loops
183 self.loopend= { } # Mapping saying where loops end
184 self.gosub = None # Gosub return point (if any)
185 self.error = 0 # Indicates program error
187 self.stat = list(self.prog) # Ordered list of all line numbers
188 self.stat.sort()
189 self.pc = 0 # Current program counter
193 self.collect_data() # Collect all of the data statements
194 self.check_end()
195 self.check_loops()
197 if self.error: raise RuntimeError
200 line = self.stat[self.pc]
201 instr = self.prog[line]
212 self.goto(newline)
225 eval = self.eval(val)
238 self.assign(target,value)
243 if self.dc < len(self.data):
244 value = ('NUM',self.data[self.dc])
245 self.assign(target,value)
246 self.dc += 1
253 if (self.releval(relop)):
254 self.goto(newline)
264 if not self.loops or self.loops[-1][0] != self.pc:
267 self.assign((loopvar,None,None),initval)
269 stepval = self.eval(stepval) # Evaluate step here
270 self.loops.append((self.pc,stepval))
274 stepval = ('NUM',self.loops[-1][1])
277 if self.loops[-1][1] < 0: relop = '>='
279 if not self.releval(('RELOP',relop,newvalue,finval)):
281 self.pc = self.loopend[self.pc]
282 self.loops.pop()
284 self.assign((loopvar,None,None),newvalue)
287 if not self.loops:
292 self.pc = self.loops[-1][0]
293 loopinst = self.prog[self.stat[self.pc]]
301 if self.gosub:
304 self.gosub = self.stat[self.pc]
305 self.goto(newline)
309 if not self.gosub:
312 self.goto(self.gosub)
313 self.gosub = None
319 def eval_func(pvalue,name=pname,self=self,expr=expr):
320 self.assign((pname,None,None),pvalue)
321 return self.eval(expr)
322 self.functions[fname] = eval_func
328 self.lists[vname] = [0]*x
335 self.tables[vname] = v
337 self.pc += 1
340 def expr_str(self,expr):
343 elif etype == 'GROUP': return "(%s)" % self.expr_str(expr[1])
347 return "%s %s %s" % (self.expr_str(expr[2]),expr[1],self.expr_str(expr[3]))
349 return self.var_str(expr[1])
351 def relexpr_str(self,expr):
352 return "%s %s %s" % (self.expr_str(expr[2]),expr[1],self.expr_str(expr[3]))
354 def var_str(self,var):
357 if dim1 and not dim2: return "%s(%s)" % (varname, self.expr_str(dim1))
358 return "%s(%s,%s)" % (varname, self.expr_str(dim1),self.expr_str(dim2))
361 def list(self):
362 stat = list(self.prog) # Ordered list of all line numbers
365 instr = self.prog[line]
377 if p[0] and p[1]: _out += '"%s"%s' % (p[0],self.expr_str(p[1]))
378 elif p[1]: _out += self.expr_str(p[1])
384 print("%s LET %s = %s" % (line,self.var_str(instr[1]),self.expr_str(instr[2])))
390 _out += self.var_str(r)
394 print("%s IF %s THEN %d" % (line,self.relexpr_str(instr[1]),instr[2]))
398 _out = "%s FOR %s = %s TO %s" % (line,instr[1],self.expr_str(instr[2]),self.expr_str(instr[3]))
399 if instr[4]: _out += " STEP %s" % (self.expr_str(instr[4]))
404 print("%s DEF %s(%s) = %s" % (line,instr[1],instr[2],self.expr_str(instr[3])))
427 def new(self):
428 self.prog = {}
431 def add_statements(self,prog):
433 self.prog[line] = stat
436 def del_line(self,lineno):
438 del self.prog[lineno]