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

📄 calc.cpp

📁 一个basic语言的编译工具。
💻 CPP
字号:
#include"xms.cpp"
#include"type.cpp"
#include"var.cpp"
#include"sbasdat.cpp"
/*--Designed by LiYi in 2000--*/


/*-----------CLASS---------------*/
					  /*---------------------*/
					  /*                     */
/*------------CODE---------------*/       /*                     */
					  /* + -     1 2      10 */
void SCAN(uchar a[])                      /* * /     3 4      20 */
{uchar n,i2=0,ti,i;uint l,j;                 /* ^        5       30 */

 l=strlen(a);                             /* %        8       15 */
 setmem(unit,120,0);
/* for(i=0;i<30;i++) */                       /* f( f) 80+x  79   40 */
/*  unit[i]=0;   */                           /* \        9       15 */
 for(i=0,n=0;i<l;i++,n++)                 /* != == = 10        5 */
 {                                        /* !       12       30 */
  if(a[i]==0||a[i]=='\n')
  {if(CFI)ERR(1);
   return;
  }
  if(isdigit(a[i])||a[i]=='.')            /* < >    13           */
  {while(isdigit(a[i])||a[i]=='.')        /* <= >=               */
    fn[i2++]=a[i++];                      /*---------------------*/
   fn[i2]=0;i--;unit[n]=(float)atof(fn);
   i2=0;continue;
  }
  if(isalpha(a[i]))
  {while(isalpha(a[i]))
    fn[i2++]=a[i++];
   fn[i2]=0;i2=0;
   strupr(fn);
   if(a[i]=='(')
   {
    for(j=0;j<FUNMAX;j++)
     if(strcmp(fname[j],fn)==0)
      {set(80+j,n);break;}
    if(j==FUNMAX)
    {
     ti=strlen(fn);
     unit[n]=getarray(a+i-ti,&ti);
     i=ti+i-1;
     continue;
    }

    CF[CFI++]=2;continue;
   }
   switch(a[i])
   {
    case '%':unit[n]=var.GETIVAR(fn);i++;break;
    case '!':unit[n]=var.GETFVAR(fn);i++;break;
    default: unit[n]=var.GETFVAR(fn);
   }
   i--;
   continue;
  }

  switch(a[i])
  {
   case '+':set(1,n);break;
   case '-':set(2,n);break;
   case '*':set(3,n);break;
   case '/':set(4,n);break;
   case '\\':set(9,n);break;
   case '^':set(5,n);break;
   case '(':CF[CFI++]=1;set(6,n);break;
   case ')':if(CFI)
	    {
	     switch(CF[--CFI])
	     {case 0:ERR(1);return;
	      case 1:set(7,n);break;
	      case 2:set(79,n);break;
	     }
	     break;
	    }
	    ERR(4);return;

   case '=':if(a[i+1]=='=')i++;
	    set(11,n);break;
   case '>':if(a[i+1]=='='){i++;set(16,n);}
		  else     set(14,n);
	    break;
   case '<':if(a[i+1]=='>'){i++;set(10,n);break;}
	    if(a[i+1]=='='){i++;set(15,n);}
		  else     set(13,n);
	    break;
  }
 }
 if(CFI)ERR(5);
}

uchar GETV()
{
 if(P1<P2){P1--;return 200;}
 return getverbl(verb[P1--]);
}

void set(uchar t,uchar n)
{
 verb[vn]=t;verbp[vn++]=n;
}

float VAL(char p1,char p2)
{uchar a,b,c,t1,t2,i2;float x,y,z;char i3;
 uchar vbh=255,vbp=255,CC;
 t1=P1;t2=P2;P2=p1;P1=p2;
 if(vn==0){P1=t1;P2=t2;return unit[0];}

 if(p1==p2+1)
  if(p2==-1)
   if(verbp[p1]==0)return 0;
   else return unit[verbp[p1]-1];
  else return unit[verbp[p2]+1];


 for(i2=p1;i2<=p2;i2++)
 {if(verb[i2]==6)
  {CC=1;i2++;
   for(;i2<=p2;i2++)
   {
    if(verb[i2]==6){CC++;continue;}
    if(verb[i2]==7)
     if(--CC==0)goto s;
   }
   ERR(1);
  }

  if(verb[i2]>=80)
  {CC=1;i2++;
   for(;i2<=p2;i2++)
   {
    if(verb[i2]>=80){CC++;continue;}
    if(verb[i2]==79)
     if(--CC==0)goto s;
   }
  }
  if(vbh>=getverbl(verb[i2]))vbh=getverbl(verb[i2]),vbp=i2;
  s:;
 }

 if(vbh==255)
 {if(verb[p1]==6)z=VAL(p1+1,p2-1);
  if(verb[p1]>=80)
  {
   z=VAL(p1+1,p2-1);
   z=(float)(*fun[verb[p1]-80])(z);
   if(CALCERR)return 0;
  }
  goto e;
 }

 x=VAL(p1,vbp-1);y=VAL(vbp+1,p2);
 if(CALCERR)return 0;
 switch(verb[vbp])
 {
  case 1:z=x+y;break;
  case 2:z=x-y;break;
  case 3:z=x*y;break;
  case 4:if(y==0){z=99999;ERR(2);break;}
	 z=x/y;break;
  case 5:z=POW(x,y);break;
  case 9:z=(float)(long)(x/y);break;
  case 10:z=((float)x!=(float)y);break;
  case 11:z=((float)x==(float)y);break;
  case 13:z=(x<y);break;
  case 14:z=(x>y);break;
  case 15:z=((float)x<=(float)y);break;
  case 16:z=((float)x>=(float)y);break;
 }
 e:P1=t1,P2=t2;return z;
}

float CALC(uchar*a)
{
 float tunit[30];uchar tun,temp;
 uchar tverb[20],tverbp[20];double z;

 movmem(unit,tunit,120);
 movmem(verb,tverb,20);
 movmem(verbp,tverbp,20);
 temp=vn;tun=un;un=0;
 vn=0;CFI=0;                              /* ( )     6 7      40 */
 CALCERR=0;

 SCAN(a);
 if(CALCERR)return 0;
 z=VAL(0,vn-1);

 movmem(tunit,unit,120);
 movmem(tverb,verb,20);
 movmem(tverbp,verbp,20);
 vn=temp;un=tun;
 return z;
}

double cot(double n)
{if(n==0){ERR(3);return 99999;}
 return 1.0/tan(n);
}

double SQR(double n)
{
 if(n<0){ERR(3);return -30000;}
 else return sqrt(n);
}

double LOG(double n)
{
 if(n<=0){ERR(3);return -30000;}
 else return log(n);
}

double INT(double n)
{return (double)(long)n;
}

void ERR(uchar a)
{
 CALCERR=a;
}

uchar getverbl(uchar i)
{
 if(i==79)return 40;
 if(i>=80)return 40;
 else return verbl[i];
}

double POW(double a,double b)
{
 if(a<0&&(b!=long(b)))ERR(3);
 else return pow(a,b);
}

⌨️ 快捷键说明

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