basinterp.py

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· Python 代码 · 共 441 行 · 第 1/2 页

PY
441
字号
                     if val:                          if label: out += " "                          eval = self.eval(val)                          out += str(eval)                 sys.stdout.write(out)                 end = instr[2]                 if not (end == ',' or end == ';'):                     sys.stdout.write("\n")                 if end == ',': sys.stdout.write(" "*(15-(len(out) % 15)))                 if end == ';': sys.stdout.write(" "*(3-(len(out) % 3)))            # LET statement            elif op == 'LET':                 target = instr[1]                 value  = instr[2]                 self.assign(target,value)            # READ statement            elif op == 'READ':                 for target in instr[1]:                      if self.dc < len(self.data):                          value = ('NUM',self.data[self.dc])                          self.assign(target,value)                          self.dc += 1                      else:                          # No more data.  Program ends                          return            elif op == 'IF':                 relop = instr[1]                 newline = instr[2]                 if (self.releval(relop)):                     self.goto(newline)                     continue            elif op == 'FOR':                 loopvar = instr[1]                 initval = instr[2]                 finval  = instr[3]                 stepval = instr[4]                 # Check to see if this is a new loop                 if not self.loops or self.loops[-1][0] != self.pc:                        # Looks like a new loop. Make the initial assignment                        newvalue = initval                        self.assign((loopvar,None,None),initval)                        if not stepval: stepval = ('NUM',1)                        stepval = self.eval(stepval)    # Evaluate step here                        self.loops.append((self.pc,stepval))                 else:                        # It's a repeat of the previous loop                        # Update the value of the loop variable according to the step                        stepval = ('NUM',self.loops[-1][1])                        newvalue = ('BINOP','+',('VAR',(loopvar,None,None)),stepval)                 if self.loops[-1][1] < 0: relop = '>='                 else: relop = '<='                 if not self.releval(('RELOP',relop,newvalue,finval)):                      # Loop is done. Jump to the NEXT                      self.pc = self.loopend[self.pc]                      self.loops.pop()                 else:                      self.assign((loopvar,None,None),newvalue)            elif op == 'NEXT':                 if not self.loops:                       print "NEXT WITHOUT FOR AT LINE",line                       return                 nextvar = instr[1]                 self.pc = self.loops[-1][0]                 loopinst = self.prog[self.stat[self.pc]]                 forvar = loopinst[1]                 if nextvar != forvar:                       print "NEXT DOESN'T MATCH FOR AT LINE", line                       return                 continue            elif op == 'GOSUB':                 newline = instr[1]                 if self.gosub:                       print "ALREADY IN A SUBROUTINE AT LINE", line                       return                 self.gosub = self.stat[self.pc]                 self.goto(newline)                 continue            elif op == 'RETURN':                 if not self.gosub:                      print "RETURN WITHOUT A GOSUB AT LINE",line                      return                 self.goto(self.gosub)                 self.gosub = None            elif op == 'FUNC':                 fname = instr[1]                 pname = instr[2]                 expr  = instr[3]                 def eval_func(pvalue,name=pname,self=self,expr=expr):                      self.assign((pname,None,None),pvalue)                      return self.eval(expr)                 self.functions[fname] = eval_func            elif op == 'DIM':                 for vname,x,y in instr[1]:                     if y == 0:                          # Single dimension variable                          self.lists[vname] = [0]*x                     else:                          # Double dimension variable                          temp = [0]*y                          v = []                          for i in range(x):                              v.append(temp[:])                          self.tables[vname] = v            self.pc += 1    # Utility functions for program listing    def expr_str(self,expr):        etype = expr[0]        if etype == 'NUM': return str(expr[1])        elif etype == 'GROUP': return "(%s)" % self.expr_str(expr[1])        elif etype == 'UNARY':             if expr[1] == '-': return "-"+str(expr[2])        elif etype == 'BINOP':             return "%s %s %s" % (self.expr_str(expr[2]),expr[1],self.expr_str(expr[3]))        elif etype == 'VAR':              return self.var_str(expr[1])    def relexpr_str(self,expr):         return "%s %s %s" % (self.expr_str(expr[2]),expr[1],self.expr_str(expr[3]))    def var_str(self,var):         varname,dim1,dim2 = var         if not dim1 and not dim2: return varname         if dim1 and not dim2: return "%s(%s)" % (varname, self.expr_str(dim1))         return "%s(%s,%s)" % (varname, self.expr_str(dim1),self.expr_str(dim2))    # Create a program listing    def list(self):         stat = self.prog.keys()      # Ordered list of all line numbers         stat.sort()         for line in stat:             instr = self.prog[line]             op = instr[0]             if op in ['END','STOP','RETURN']:                   print line, op                   continue             elif op == 'REM':                   print line, instr[1]             elif op == 'PRINT':                   print line, op,                   first = 1                   for p in instr[1]:                         if not first: print ",",                         if p[0] and p[1]: print '"%s"%s' % (p[0],self.expr_str(p[1])),                         elif p[1]: print self.expr_str(p[1]),                         else: print '"%s"' % (p[0],),                         first = 0                   if instr[2]: print instr[2]                   else: print             elif op == 'LET':                   print line,"LET",self.var_str(instr[1]),"=",self.expr_str(instr[2])             elif op == 'READ':                   print line,"READ",                   first = 1                   for r in instr[1]:                         if not first: print ",",                         print self.var_str(r),                         first = 0                   print ""             elif op == 'IF':                   print line,"IF %s THEN %d" % (self.relexpr_str(instr[1]),instr[2])             elif op == 'GOTO' or op == 'GOSUB':                   print line, op, instr[1]             elif op == 'FOR':                   print line,"FOR %s = %s TO %s" % (instr[1],self.expr_str(instr[2]),self.expr_str(instr[3])),                   if instr[4]: print "STEP %s" % (self.expr_str(instr[4])),                   print             elif op == 'NEXT':                   print line,"NEXT", instr[1]             elif op == 'FUNC':                   print line,"DEF %s(%s) = %s" % (instr[1],instr[2],self.expr_str(instr[3]))             elif op == 'DIM':                   print line,"DIM",                   first = 1                   for vname,x,y in instr[1]:                         if not first: print ",",                         first = 0                         if y == 0:                               print "%s(%d)" % (vname,x),                         else:                               print "%s(%d,%d)" % (vname,x,y),                   print             elif op == 'DATA':                   print line,"DATA",                   first = 1                   for v in instr[1]:                        if not first: print ",",                        first = 0                        print v,                   print    # Erase the current program    def new(self):         self.prog = {}    # Insert statements    def add_statements(self,prog):         for line,stat in prog.items():              self.prog[line] = stat    # Delete a statement    def del_line(self,lineno):         try:             del self.prog[lineno]         except KeyError:             pass

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?