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

📄 basic1.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "os.h"
#include "ptype.h"
/***basic func***/
FAR char *GetAllocBuf();
FAR void serror(Int8 error);
/***basic1 func***/
FAR int atoi(char *x);
FAR void itoa(int i, char *result, char flag);
FAR double atof(char *x);
FAR int gcvt(double i, char flag, char *result);
FAR char get_result_type(char o, char *r, char *h);
FAR void add_type(char *result, int data_type);
FAR void get_exp(char *result);
/***basic4 func***/
FAR void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_eof(char *v, char *result);
FAR UInt8 IsInteger(char *value_ptr);
/***basic2 func***/
FAR char *get_variables(char *s);
FAR void putback();
FAR char get_token(char tflag);
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR char get_priority(char *s);
FAR Boolean GetValidNumber(char *p, int n);

extern Do_List 	        *dl;
extern char 		*prog;
extern char 		*token, *pBasicFileName;;
extern char 		token_type, tok;
extern char 		op_b[4];
char                    *cod_trace;
extern double           PreRndNum;
extern UInt16           seed;

FAR int atoi(char *x)
{	
	int i, j, b, sign;
	char *len;
	
/*	sscanf(x,_Far("%d"),&i);
	return i; 
*/	
        GetValidNumber(x, 16);
	if (*x=='-' )
	{
		sign = -1; 
		x++;
	} else
	        sign = 1;
        if (len = Strchr(x,'.')) *len = 0;
	i = 0; 
	b = 1;
	for ( j = Strlen(x); j > 0 ; j--) 
	{		
        	i += b * ( *(x + j -1) - 0x30);
        	b *= 10;
        } 	
	return i*sign ; 
}

FAR double atof(char *x)
{        
	double i,sign, b;
	int k, j;
	char *p;
/*
	sscanf(x,_Far("%f"),&i);
	return i;*/
        GetValidNumber(x, 16);
	b = 1;
	j = 0;
	sign = 1;
	if (*x=='-') { 
		sign = 0;
		x++;
	}
	p = x; 
	while ( *p != '.' && *p != 0 ) {
		p++; 
		j++;
	}	
        for (k=1; k<j; k++) 
	        b *= 10;   
        p = x;
        i = 0;
        while (*p!=0) {
        	if (*p!='.') {        		 
        	       i += (*p - 0x30) * b;
        	       b /= 10;
        	}
        	p++;
        }
        if (i==0) return (double)0;
        else if (sign) return i;        
        else return -i;  
}

FAR void itoa(int i, char *result, char flag)
{	
	sprintf(result,_Far("%d"), i);
}

FAR char get_result_type(char o, char *r, char *h)
{	       
               if (o<OP_BIG) 
               {
               	    if (o!=OP_ADD&&(*r==STRING_TYPE||*h==STRING_TYPE)) 
               	    {
               	    	   MemFree(r);
               	    	   MemFree(h);
               	    	   serror(22);
               	    }
	            if (*r==*h) return *r;
	            if (*r-*h>1||*h-*r>1) 
	            { 
	            	   MemFree(r);
	            	   MemFree(h);
		           serror(22);	        /***运算过程中,操作数的类型发生错误***/
		    }		    
	            return REAL_TYPE;
               } 
               else 
               {
	            if (o>OP_UNE&&(*r==STRING_TYPE||*h==STRING_TYPE)) 
	            {
	            	   MemFree(r);
	            	   MemFree(h);
	                   serror(22);         /***运算过程中,操作数的类型发生错误***/
	            }
	            if (o>OP_POW&&o<OP_AND&&(*r-*h>1||*h-*r>1||*r==BOOL_TYPE||*h==BOOL_TYPE)) 
	            {
	            	   MemFree(r);
	            	   MemFree(h);
	            	   serror(22);         /***运算过程中,操作数的类型发生错误***/
	            }
	            return BOOL_TYPE;
               }
}

FAR void add_type(char *result, int data_type)
{
               int i;
               i = Strlen(result);
               *(result + i + 1) = 0;
               for (; i > 0; i--)
	            *(result + i) = *(result + i - 1);
               *result = data_type;
}

void arith(char o, char *r, char *h, char *result)
{
     int t, ex, i1, result_type;      
     double r1, rex;
          
     result_type = get_result_type(o, r, h);
     switch (result_type) 
     {
       case INTEGER_TYPE:
	  switch(o) 
	  {
	      case OP_SUB : i1 = atoi(r+1) - atoi(h+1);
	                    itoa(i1,result + 1,10);
	                    *result = result_type;
			    break;
	      case OP_ADD : i1 = atoi(r+1) + atoi(h+1); 
	                    itoa( i1,result+1,10);
	                    *result = result_type;
			    break;
	      case OP_MUL : i1 = atoi(r+1) * atoi(h+1); 
	                    itoa(i1,result+1,10);
	                    *result = result_type;
			    break;
	      case OP_DIV : if (atof(h+1)==0)
	                    {
	      	                  MemFree(r);
	      	                  MemFree(h);
	      	                  serror(23);              /***运算出错,出现除数为零***/
	      	            }	      	            
			    r1 = atof(r+1)/atof(h+1);			    
			    if (!gcvt(r1,16,result+1))
			    {
			    	MemFree(r);MemFree(h);
			    	serror(1);
			    }
			    *result = REAL_TYPE;
			    break;
	      case OP_POW : if (*(h+1)=='0') { Strcpy(result,"11"); break; }
			    if ((t=atoi(h+1))>0) 
			    {
				i1 = atoi(r+1);
				ex = i1;
				for (--t;t>0;--t) i1 *= ex;
				itoa(i1,result+1,10);				
				*result = result_type;
			    }
			    else 
			    {
				r1 = 1/atof(r+1); 
				rex = r1;
				while (++t) r1 *= rex;				
				if(!gcvt(r1,16,result+1))
				{
					MemFree(r); MemFree(h);
					serror(1);
				}
				*result = REAL_TYPE;
			    }
			    break;
	  }
	  break;
       case REAL_TYPE:
	  switch(o) {
	      case OP_SUB : r1 = atof(r+1) - atof(h+1); 	                    	                    
	                    if(!gcvt(r1,16,result+1))
	                    {
	                    	MemFree(r); MemFree(h);
	                    	serror(1);
	                    }
			    *result = result_type;
			    break;
	      case OP_ADD : r1 = atof(r+1) + atof(h+1); 	
	                    if (!gcvt(r1,16,result+1))
	                    {
	                    	MemFree(r); MemFree(h);
	                    	serror(1);
	                    }
			    *result = result_type;
			    break;
	      case OP_MUL : r1 = atof(r+1) * atof(h+1); 
	                    if(!gcvt(r1,16,result+1))
	                    {
	                    	MemFree(r); MemFree(h);
	                    	serror(1);
	                    }
			    *result = result_type;
			    break;
	      case OP_DIV : if (atof(h+1)==0) 
	                    {
	      	                   MemFree(r); 
	      	                   MemFree(h);
	      	                   serror(23);       /***运算出错,出现除数为零***/
	      	            }	      	            
			    r1 = atof(r+1)/atof(h+1); 
			    if (!gcvt(r1,16,result+1))
			    {
			    	MemFree(r); MemFree(h);
			    	serror(1);
			    }
			    *result = result_type;
			    break;
	      case OP_POW : 
	                    if (atof(r+1)==0&&atof(h+1)<0) 
	                    {
	                    	 MemFree(r); 
	                    	 MemFree(h); 
	                    	 serror(28);
	                    }
	                    r1 = xthy(atof(r+1),atof(h+1));
	                    if (r1 == 1E17 || !gcvt(r1,16,result+1))
	                    {
	                    	MemFree(r); MemFree(h);
	                    	serror(1);
	                    }	                    
	                    *result = result_type;
			    break;
	  }
	  break;
       case BOOL_TYPE :
	  switch (o) 
	  {
	      case OP_BIG : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)>0) 
				Strcpy(result,"91");
			    else if (atof(r+1)>atof(h+1)) 
				Strcpy(result,"91");
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_SMA : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)<0) 
				Strcpy(result,"91");
			    else if (atof(r+1)<atof(h+1)) 
				Strcpy(result,"91"); 
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_BaE : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)>=0) 
				Strcpy(result,"91");
			    else if (atof(r+1)>=atof(h+1)) 
			    	Strcpy(result,"91"); 
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_SaE : if (*r==STRING_TYPE&&Strcmp(r+1,h+1)<=0) 
				Strcpy(result,"91"); 
			    else if (atof(r+1)<=atof(h+1)) 
				Strcpy(result,"91");
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_UNE : if (*r==STRING_TYPE) 
	                    {
				if (Strcmp(r+1,h+1)!=0) 
				    Strcpy(result,"91"); 				    
				else 
				    Strcpy(result,"90"); 				    				
			    } 
			    else if (atof(r+1)!=atof(h+1)) 
				Strcpy(result,"91"); 				
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_EQU : if (*r==STRING_TYPE) 
	                    {
				if (!Strcmp(r+1,h+1)) 
				    Strcpy(result,"91"); 
				else 
				    Strcpy(result,"90"); 				
			    } 
			    else if (atof(r+1)==atof(h+1)) 
				Strcpy(result,"91"); 
			    else 
			        Strcpy(result,"90");
			    break;
	      case OP_AND : if (*r==BOOL_TYPE) 
	                    {
				if (*(r+1)=='1') *r=1;
				else *r=0;
			    } 
			    else 
			    {
				if (atof(r+1)!=0) *r=1;
				else *r=0;
			    }
			    if (*h==BOOL_TYPE) 
			    {
				if (*(h+1)=='1') *h=1;
				else *h=0;
			    } 
			    else 
			    {
				if (atof(h+1)!=0) *h=1;
				else *h=0;
			    }
			    if (*r&&*h) Strcpy(result,"91");
			    else Strcpy(result,"90");
			    break;
	      case OP_OR  : if (*r==BOOL_TYPE) 
	                    {
				if (*(r+1)=='1') *r=1;
				else *r=0;
			    } 
			    else 
			    {
				if (atof(r+1)!=0) *r=1;
				else *r=0;
			    }
			    if (*h==BOOL_TYPE) 
			    {
				if (*(h+1)=='1') *h=1;
				else *h=0;
			    } 
			    else 
			    {
				if (atof(h+1)!=0) *h=1;
				else *h=0;
			    }
			    if (*r||*h) Strcpy(result,"91");
			    else Strcpy(result,"90");
			    break;
	  }
	  break;
       default :
	  switch (o) 
	  {
	      case OP_ADD : 

⌨️ 快捷键说明

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