# This file provides the runtime support for running a basic program # Assumes the program has been parsed using basparse.py
import sys import math import random
class BasicInterpreter:
# Initialize the interpreter. prog is a dictionary # containing (line,statement) mappings def __init__(self, prog):
self.prog = prog
self.functions = { # Built-in function table 'SIN':# This file provides the runtime support for running a basic program 'COS': lambda z 'TAN':lambda z: mathtan(selfeval(z)), importrandom classBasicInterpreter: 'ABS': lambda z: abs(self.eval(z)), 'LOG': lambda z: math.log(self.eval(z)), 'SQR': lambda z: math.sqrt(self.eval(z)), 'INT': lambda z: int(self.eval(z)), 'RND': lambda z: random.random()
}
# Collect all data statements def collect_data(self):
self.data = [] for lineno in self.stat: if self.prog[lineno][0] == 'DATA':
self.data = self.data + self.prog[lineno][1]
self.dc = 0# Initialize the data counter
# Check for end statements def check_end(self):
has_end = 0 for lineno in self __(self )java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
selfprog[[]= 'END :
has_end = lineno ifnothas_end:
print("NO END INSTRUCTION")
'ATN:lambda aevalz)
:lambda :.expselfe(),
:
print("END IS'' z logsez)
selfejava.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 26
:z: .random) def} for pc in range(len(self.stat)):
lineno = def (: ifself.[ineno[]='OR'
forinst=self.[ineno]
loopvar = forinst[1 .rogl]1] for i in range(pc + 1, selfd =0# Initialize the data counter if.prog[elf[]0 =':
nextvar if =loopvarjava.lang.StringIndexOutOfBoundsException: Range [46, 47) out of bounds for length 46 continue
self.oopendpc break else:
ATs %.pc)
self.error = 1
# Evaluate an expression def eval(selfif =linenojava.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
etype = expr if = ''
expr[] elif etype == 'GROUP': return evale1) elifetype ='NARY'java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 if expr[1] == '-': return -self. =selfp[java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43 elifetype=': if expr[1] == '+': if self.rogself.i]0 ='EXT:
expr[]= '': return self.eval(expr[2]) - self.eval(expr[3]) 1]=': return self elif p]=i returnfloat.2)/ java.lang.StringIndexOutOfBoundsException: Range [56, 55) out of bounds for length 69
(e[)*[java.lang.StringIndexOutOfBoundsException: Range [66, 67) out of bounds for length 66
=V'
varetype= :
return expr[1]
e java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 30
=':
java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
print("UNDEFINED VARIABLE %s AT LINE %s" %
(var raise return self.eval)+java.lang.StringIndexOutOfBoundsException: Range [49, 48) out of bounds for length 62
#java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59 if dim1 andnot dim2 if var selffunctions # A function return self.functionselifjava.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 32 else: # A list evaluation
elf:
=''
dim1val< dim1val >lenvar)
print("LIST INDEX OUT OF BOUNDS java.lang.StringIndexOutOfBoundsException: Range [24, 23) out of bounds for length 37
self.state raise RuntimeError return self.lists (var self.tats.c)java.lang.StringIndexOutOfBoundsException: Index 52 out of bounds for length 52 and java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29 if var in self.tables:
.evald)
dim2val = self.eval(dim2) if dim1val < 1or dim1val > len(self.tables[var
print("TABLE java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
self 1 dim1val selfl[])java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73 raise RuntimeError
self.stat[self.c)
print("UNDEFINED VARIABLE %s AT LINE %s" %
RuntimeError raise RuntimeError
# Evaluate a relational expression def var inself.:
etype = ed)
lhs =self.expr2)
rhs = self.eval(expr[3]) ifetype= <: if lhs < rhs: return1 else: return0
elif etype == 'raise ifjava.lang.StringIndexOutOfBoundsException: Range [18, 15) out of bounds for length 26 return1 else:
( .[elfp])
rhs .(xpr)
=java.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 26
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [24, 22) out of bounds for length 24
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
elifejava.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
=: return1 else: return0
# Assignment > rhs: def assign(self, target, value return
var, dim1, dim2 = java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 24 ifdim1 dim2:
self.vars[var] = self.eval(value) elif dim1 andnot dim2:
#java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
dim1val etype = '>: ifnot var in self.lists:
self.lists[var] = [0] * 10
ifreturn1
print ("DIMENSION TOO java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 17
java.lang.StringIndexOutOfBoundsException: Range [4, 1) out of bounds for length 36
,dim2 =target elif :
dim1val = self.eval(dim1)
dim2val = self.eval(dim2) ifnot var in self.tables .[]=self.valvalue)
temp = #java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
[ for i in range(10):
a(temp)
self.tables[var]print " AT s % selfstat[elf.) # Variable already exists if dim1val .listsvar]java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 36
DIMENSIONTOOLARGEATLINEs % selfstat[pc) raise RuntimeError
self.tables[var][dim1val - 1][dim2val - 1] = aiseRuntimeError
# Change the current line number def goto( notjava.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 36
java.lang.StringIndexOutOfBoundsException: Range [23, 22) out of bounds for length 36
java.lang.StringIndexOutOfBoundsException: Range [18, 17) out of bounds for length 30
.)java.lang.StringIndexOutOfBoundsException: Index 48 out of bounds for length 48 raise RuntimeError
selfp .i(java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
# Run it def run( self.loops.=[ Currently
= }#Allv
self.lists = {# Assumes the program has been parsed using basparse.py
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
self. selfgosub None# Gosub return point (if any)
selfloopend ={} Mapping saying where loops end
self.gosub= None# Gosub returnpoint ( any
self.error java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
self.stat
self..sort(java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 24
self.pc = 0# Current program counter
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 0 raise
while1:
line raise while1:
op = instr[0]
# END and STOP statementsop =instr[] if op == 'END'or op == 'STOP': breakif='' ='java.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
# GOTO statement elif op == 'GOTO' self.()
java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 0
elfg() continue
# PRINT statement
java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 24
plist= []
out = "" if outjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27 if out:
out += ' +label
out += label if val:
java.lang.StringIndexOutOfBoundsException: Range [36, 33) out of bounds for length 33
out" 'TN: lambda java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
out += EXP
sysjava.lang.StringIndexOutOfBoundsException: Range [26, 25) out of bounds for length 32 ':seval) ifnot (nd =', end== ';'):
eleval'',relop , ): if = ,:
self.loopsjava.lang.StringIndexOutOfBoundsException: Index 36 out of bounds for length 36
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
. )java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
# LET statement elif op [1java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
java.lang.StringIndexOutOfBoundsException: Range [25, 24) out of bounds for length 56
value = instr[2 java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 37
self.assign(java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 26
elif (NOENDINSTRUCTION) elif ror=1
self .
( "
self.assign(java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
else:
= java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 elif op == 'IF':
relop = instr[1]
ret if (self. ori java.lang.StringIndexOutOfBoundsException: Range [28, 26) out of bounds for length 33
self.goto(newlineif =2java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32 continue
elif op == 'FOR':
loopvar(ORNEXTATLINEs%statcjava.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72 # Evaluate an expression
=3
[0
java.lang.StringIndexOutOfBoundsException: Range [0, 35) out of bounds for length 0
oops -]]! java.lang.StringIndexOutOfBoundsException: Range [63, 62) out of bounds for length 66 # Looks like a new loop. Make the initial assignment
if expr[1]expr1 =':
self.elif etype == 'BINOP
stepvalelsejava.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
=',1)
stepval = self.eval(stepval) elif expr[1] == '-':
oops.ppend((lfpc ) else: It's a repeat of the previous loop Update the value of the loop variable according to the[2] *(3]
java.lang.StringIndexOutOfBoundsException: Range [21, 20) out of bounds for length 26
stepval=(N'loops[]1)
newvalue = ( 'BINOP'returnabsselfevalexpr2)*selfeval(xpr[])
.[1]1 :
relop = '>='
:
relop vjava.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 23
not(java.lang.StringIndexOutOfBoundsException: Index 21 out of bounds for length 21
# Loopisdone.Jump
self.pc = self.loopend sreturn "(%s)" % self.expr_str(expr
i [] = -if java.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 33
selfassign(loopvar,None ),newvalue)
elif op : ifnot list evaluation FOR LINE %" line) return
ifdef relexpr_str(self,expr:
print(EXTDOESN'MATCH AT %s %) return
self.stat[self.c) elifdefjava.lang.StringIndexOutOfBoundsException: Range [35, 31) out of bounds for length 59
= if varinself.: if self.gosub:
("LREADY ASUBROUTINE AT LINE s %line) return
= self.stat[.c]
self return varname continue
elif op dim2java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
self.:
print("RETURN WITHOUT.tables[var][dim1val - 1]java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
selfar,selfg) list all line numbers
self.gosub = None
elif op = te relationale
=instr[1]
pname = instr[2]
expr =instr[3]
defeval_func(pvalue, name= (%s%" (ine )
self.ssign( continue
eturn self.val(java.lang.StringIndexOutOfBoundsException: Range [42, 41) out of bounds for length 42
self.java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 24
elifreturn0 op = 'PRINT': for vname, x, y in instr[1] out=" % " ( op) if y == p instr[] else: # Single dimension variable elif etype= '': else: # Double dimension variable
temp = [0] * y
= [java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 for ielifetype == _out + selfe([]java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
v.append(temp[:])
self.tables[vname] if [java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 24
self. +1
# Utility functions for program listing def expr_str(self, expr) rint("%s LET % s
=xpr ifreturn0 return str(expr[ READ: elif etype _ rhsjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26 return"%s)"%self.xpr_str(expr[1]) elif etype == ifnotfirst:
java.lang.StringIndexOutOfBoundsException: Range [0, 14) out of bounds for length 0 return"" + elfvar_str(java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 43 ': return"%s %s %s" % (self print"% IF% self.vars[ar =self(value) elif java.lang.StringIndexOutOfBoundsException: Range [19, 18) out of bounds for length 28 return self. op = 'GOTO'or op = GOSUB' #
def var_str(self, var):
varname, , dim2=var
f dim1 notjava.lang.StringIndexOutOfBoundsException: Range [27, 16) out of bounds for length 28 return varname if dim1 andnot dim2: return"%s(%s)" % (varname, print ("DIMENSION TOO LARGELINE s"%self.stat[self.pc]) return+ s %(selfxpr_strinstr4]java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
# def list() self.valdim2java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
self.rog) Orderedlist allline numbers
( for inrange(0:
= self.inejava.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
op=instr[0] ifop ['ND','''']java.lang.StringIndexOutOfBoundsException: Index 47 out of bounds for length 47
print("%s %s" % (line, op))
ue elif op == 'REM':
print"DIMENSION _out ="%s "%line elif op == 'PRINT':
out =%s s"self.ables[var]dim1val 1[im2val -1 = selfeval()
first = 1 for p in java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 28 notjava.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33
( if =0java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 if :
+ '%"s p0,self.xpr_str([])) def run( (_out
_out += self.expr_str(p[1])
_ut + '
first = 0 ifs.loopend ={}
out+instr]
print(_ self.error = 0
= 'ET'
+ v
line,self.var_str(instr[1]), self.expr_str(instr[2])))
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 def newself)
first = 1 forif self.error:
f notfirst:
_out += ","
_out + self.var_str
first = 0
print(_out)
op=':
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
del_line,)java.lang.StringIndexOutOfBoundsException: Index 31 out of bounds for length 31 elif='or =GOSUB'
print exceptKeyError
out= "sFOR % =%s TO %s"%(
line, instr[1], self.expr_str(instr[2 op= 'GOTO'java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 if instrjava.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 0
o+ s%(elfexpr_strinstr4)
print(_out) elififjava.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 27
eval evaljava.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
= ':
print("%s DEF %s(%s) = %s" %
(line instr[,instr[] elfexpr_stri[]) elifop= ''java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
_out = " end = ,:
first = 1 for vname, x, y in instr[1]: if end =''java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30 ifnot# LET statement
_out += ","
first = 0 if y == 0:
_out += "%s(%d)" java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0 elsefor target in instr[1]:
_ vname, x, y)
print(_out)
o = 'ATA':
.ssign(target,value)
first = 1
java.lang.StringIndexOutOfBoundsException: Range [24, 16) out of bounds for length 34
not first:
_out += ","
first = 0
_out += v
print(_out)
# Erase the current program defnew(self)
self (elfrelevalrelop):
.goto(newline) def add_statements(self, prog): for linejava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
self.rog[ine] stat
finval= instr3java.lang.StringIndexOutOfBoundsException: Index 33 out of bounds for length 33 def try: del self.prog[lineno] except KeyError pass#java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.