⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ripreter.cpp

📁 eC++编译器源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	
   case gtr: 
	      if ((e->operands)->s[(e->op)-1].ot != Long) 
		SoftwareError("RInterpret.Interpret:bad type on gtr");
	     
	      (e->operands)->s[(e->op)-1].ot = Bool;
	      (e->operands)->s[(e->op)-1].type.b  =
			    (((e->operands)->s[(e->op)-1]).type.l >= 1L);
              INC(e->ip);
	      break;
	
   case geq: 
	      if ((e->operands)->s[(e->op)-1].ot != Long)
		SoftwareError("RInterpret.Interpret:bad type on geq");

	      (e->operands)->s[(e->op)-1].ot = Bool;
	      (e->operands)->s[(e->op)-1].type.b  =
			       ((e->operands)->s[(e->op)-1].type.l >=0L);
              INC(e->ip);
	      break;
    
   case jpt: 
            ppu1 = ADR(e->code1) + LONG((e->ip)+1);
	    i = *ppu1;
	    INC((e->ip),3);
	    DEC(e->op);
            if (((e->operands)->s[e->op]).ot == Bool)   
	      {if (!((e->operands)->s[e->op].type.b))  INC((e->ip), i);}
	    else if ((e->operands)->s[e->op].ot == Long){ 
	       if (((e->operands)->s[e->op]).type.l  == 0L) INC((e->ip), i);}
            else
		  SoftwareError("RInterpret.Interpret:bad type on jpt");
	    break;
	
   case lss:
	    if ((e->operands)->s[(e->op)-1].ot != Long) 
		 SoftwareError("RInterpret.Interpret:bad type on lss");

            (e->operands)->s[(e->op)-1].ot = Bool;
	    (e->operands)->s[(e->op)-1].type.b  =
			       ((e->operands)->s[(e->op)-1].type.l < 0L);
            INC(e->ip);
	    break;
	
   case leq: 
	    if ((e->operands)->s[(e->op)-1].ot != Long) 
		SoftwareError("RInterpret.Interpret:bad type on leq");
	    (e->operands)->s[(e->op)-1].ot = Bool;
	    (e->operands)->s[(e->op)-1].type.b  =
			    ((e->operands)->s[(e->op)-1].type.l<=0L);
            INC(e->ip);
	    break;

   case cmp:
	    DEC(e->op);
	    if (((e->operands)->s[e->op]).ot != ((e->operands)->s[(e->op)-1]).ot) 
		       compare((e->operands), (e->op));                
	    else if (((e->operands)->s[e->op]).ot == Long){
		 if (((e->operands)->s[(e->op)-1]).type.l ==
                                          ((e->operands)->s[e->op]).type.l)
                    ((e->operands)->s[(e->op)-1]).type.l = 0L;
		 else if ((((e->operands)->s[(e->op)-1]).type.l) >
					  ((e->operands)->s[e->op]).type.l)
			   ((e->operands)->s[(e->op)-1]).type.l = 1L;
		      else 
			     ((e->operands)->s[(e->op)-1]).type.l = -1L;
		 ((e->operands)->s[(e->op)-1]).ot = Long;}
            else if (((e->operands)->s[e->op]).ot == Real) { 
		      if (((e->operands)->s[(e->op)-1]).type.r ==
					   ((e->operands)->s[e->op]).type.r)
			  ((e->operands)->s[(e->op)-1]).type.l = 0L;
		      else if (((e->operands)->s[(e->op)-1]).type.r >
					   ((e->operands)->s[e->op]).type.r)
			    ((e->operands)->s[(e->op)-1]).type.l = 1L;
			   else 
			    ((e->operands)->s[(e->op)-1]).type.l = -1L;
		      ((e->operands)->s[(e->op)-1]).ot = Long;}
	    else
		      compare((e->operands), (e->op));
            INC(e->ip);
            break;


   case stop: (e->operands)->top = e->op;  e->ip = 0;
	      e->op = 0;  e->dp = 1;
	      return (e->operands);
              INC(e->ip);
              break;

   case call: 
             if (((e->operands)->s[(e->op)-1]).ot != Long) 
		    SoftwareError("RInterpret.Interpret:bad call");
             ppu1 = ADR(e->code1) + LONG((e->ip)+1);
             i = *ppu1;
             INC((e->ip),3);
             (e->operands)->top = (e->op)-1;
             Invoke(i,(TRUNC(((e->operands)->s[(e->op)-1]).type.l)),
                      (e->operands));
             (e->op) = (e->operands)->top;
             break;

   case neg: 
            if ((e->operands)->s[(e->op)-1].ot == Long)
			((e->operands)->s[(e->op)-1]).type.l   =
			  -(((e->operands)->s[(e->op)-1]).type.l);
            else if (((e->operands)->s[(e->op)-1]).ot == Real)  
		      ((e->operands)->s[(e->op)-1]).type.r =
				 -(((e->operands)->s[(e->op)-1]).type.r);
            else{
		    (e->operands)->top = e->op;
		    Invoke((e->operands)->s[(e->op)-1].ot, ORD(neg),
							 (e->operands));
		    (e->op) = (e->operands)->top;}
            INC(e->ip);
            break;
 
   case add:
	     if ((e->operands)->s[(e->op)-1].ot == Long){
             INC((e->operands)->s[(e->op)-2].type.l, 
                                      (e->operands)->s[(e->op)-1].type.l);
	     DEC(e->op);}
	     else if ((e->operands)->s[(e->op)-1].ot == Real){  
		INC((e->operands)->s[(e->op)-2].type.r,
				    (e->operands)->s[(e->op)-1].type.r);
		  DEC(e->op);}
	     else{
		  (e->operands)->top = e->op;
		   Invoke((e->operands)->s[(e->op)-1].ot,
					       ORD(add), (e->operands));
		   e->op = (e->operands)->top;};
             INC(e->ip);
	     break;
	
   case sub:
	    if ((e->operands)->s[(e->op)-1].ot == Long){
            DEC((e->operands)->s[(e->op)-2].type.l,
                                      (e->operands)->s[(e->op)-1].type.l);
	    DEC(e->op);}
	    else if ((e->operands)->s[(e->op)-1].ot == Real){  
	       DEC((e->operands)->s[(e->op)-2].type.r,
				   (e->operands)->s[(e->op)-1].type.r);
	       DEC(e->op);}
	    else{
		  (e->operands)->top = e->op;
		  Invoke((e->operands)->s[(e->op)-1].ot,
					      ORD(sub),(e->operands));
		  e->op = (e->operands)->top;};
	  INC(e->ip);
          break;
	
   case mul: 
            if ((e->operands)->s[(e->op)-1].ot == Long){
               (e->operands)->s[(e->op)-2].type.l =
                     ((e->operands)->s[(e->op)-2].type.l)*
                     ((e->operands)->s[(e->op)-1]).type.l;
               DEC(e->op);}
            else if ((e->operands)->s[(e->op)-1].ot == Real){ 
                 ((e->operands)->s[(e->op)-2]).type.r =
                     (((e->operands)->s[(e->op)-2]).type.r)*
                     ((e->operands)->s[(e->op)-1]).type.r;
                 DEC(e->op);}
            else{
              (e->operands)->top = e->op;
              Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(mul), (e->operands));
              (e->op) = (e->operands)->top;};
            INC(e->ip);
	    break;

   case div: if ((e-> operands)->s[(e->op)-1].ot == Long) {
		(e->operands)->s[(e->op)-2].type.l =
                ((e->operands)->s[(e->op)-2].type.l) / 
                                     ((e->operands)->s[(e->op)-1]).type.l;
		DEC(e->op);}
		else if (((e->operands)->s[(e->op)-1]).ot == Real) {
		((e->operands)->s[(e->op)-2]).type.r =
		   (((e->operands)->s[(e->op)-2]).type.r) /
                                           ((e->operands)->s[(e->op)-1]).type.r;
		   DEC(e->op);}
		else{
		     (e->operands)->top = (e->op);
		     Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(div),
						       (e->operands));
		     e->op = (e->operands)->top;};
               INC(e->ip);
	       break;
	      
   case mod: if (((e->operands)->s[(e->op)-1]).ot == Long) {
		  ((e->operands)->s[(e->op)-2]).type.l =
		      (((e->operands)->s[(e->op)-2]).type.l) %
				 ((e->operands)->s[(e->op)-1]).type.l;
		    DEC(e->op);}
	      else {
		     (e->operands)->top = e->op;
		     Invoke(((e->operands)->s[(e->op)-1]).ot, ORD(mod),
							(e->operands));
		      e->op = (e->operands)->top;};
              INC(e->ip);
	      break;

   case prn: {DEC(e->op);
              INC(e->ip);	   
	       switch (((e->operands)->s[e->op]).ot) {
		 case Bool: if (((e->operands)->s[e->op]).type.b)  printf("T");
			       else printf("F");
			     i = 0;
			      break;         
		 case IChar:  i = (e->operands)->s[e->op].type.il;
			      j = (e->operands)->s[e->op].ioffset;
			      break;
		
		 case Long:   printf("%ld",((e->operands)->s[e->op]).type.l);
			      i = 0;
			      break;
		
		 case Real:   printf("%f",((e->operands)->s[e->op]).type.r);
			      i = 0;
              		      break;
                 }

	      for ( k = 1; k <= i; k++) {
		 Write((*((e->operands)->s[e->op].p))[j]); 
       	         INC(j);};
	      
		 printf("\n");
		 break;
	    };
    

   case lkf:  
	       ppu1 = ADR(e->code1) + LONG((e->ip)+1);
	       i = *ppu1;
	       ppu2 = ADR(e->code1) + LONG((e->ip)+3);
	       k = *ppu2; 
	       (e->operands)->top = e->op;
	       (e->attrProc)(i, k, (e->attrArg), (e->operands));
	       (e->op) = (e->operands)->top;
	       INC(e->op);
               INC((e->ip),5);
               break;

   default: 
	       printf("%d",(e->ip));
	       WriteString((e->code1));
               printf("\n");
	       printf("RInterpret.Interpret:bad opcode\n");
               INC(e->ip);
	       return(e->operands);
	   
       };/*end switch*/
     }; /* loop */
   }; /*RInterpret;*/

/******************************************************************************/

  void p(unsigned int r,unsigned int k, ADDRESS a, pStack o)
  {
    printf("RInterpret.Interpret:missing attribute proc");
  };



⌨️ 快捷键说明

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