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

📄 basic2.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
	if(*prog =='"')
	{
		if (token!=temp) serror(0);
		prog++;
		while(*prog!='"'&&*prog!=0&&(*prog!=0x0D||*(prog+1)!='"'))
		{
			*temp++ = *prog++;
			if ((UInt16)(temp - token) > 100) serror(1);        /***限定字符串长不可超过100***/
		} 
		if (*prog==0) serror(31);
		prog++;
		*temp = 0;
		return(token_type = QUOTE);
	}
	if (*prog>47&&*prog<58)  /***是否数字***/
	{
		while(*prog == '0'&&*(prog + 1) == '0') prog++;
		if (*prog == '0'&& isdigit(*(prog + 1))) prog++;
		buf_count = 0; 
		dot_count = 0;
		while(!isdelim(*prog))
		{
	             if (*prog == '.' && (++dot_count)>1) serror(0);
		     if (!isdigit(*prog)&&*prog!='.') serror(0);
		     *temp++ = *prog++;
		     if (++buf_count>160) serror(1);
		     if (*(prog-1)==')') 
		     {
		     	    prog--; 
		     	    temp--; 
		     	    break; 
		     }
		}
		if (*(temp-1)=='.') *(temp - 1) = 0;
		else *temp = 0;
		return(token_type = NUMBER);
	}
	if(isalpha(*prog))
	{
		buf_count = 0;
		while(!isdelim(*prog)) {
			*temp++ = *prog++;
		        if (++buf_count>160) serror(1);
		}
		token_type=STRING;
	}
	*temp = 0;
	if(token_type==STRING)
	{
		tag = look_up(token);
		if(tag==0)
		{
		    if (!sl_flag) IsArray();
		    token_type = VARIABLE;
		} 
		else 
		{
		    temp = prog;
		    while (*temp==0x20||*temp==0x09) temp++;
		    if (*temp == '=' && (tflag == 0 || tag != INKEY && tag != KBHIT && tag != GETKEY )) 
		            serror(42);     /*判定命令字是否用成了变量名*/
		    if (tag > 20 && tag < 36) token_type = OPERATION2;			
		    else if (tag>35&&tag<60) token_type = OPERATION1;
		    else {
			token_type = COMMAND;
			if (*token == '+') signflag = 0x2B;
			else if (*token == '-') signflag = 0x2D;
			else signflag = 0;
			if (tflag==2) /*if 语句 向后查找时,不需要执行下面语句*/
		        {
				tok = tag ;
				return token_type;
			}
			switch (tag) 
			{
			    case FN : if (tflag)
			              { 
			    	               exec_fn();
			    	               token_type = NUMBER;
			    	      } 
			    	      break;
			    case INKEY :			              
			              if (tflag)
			              {			              	        
			              	        exec_inkey();
			              	        token_type = QUOTE;
			              }
			              break;
			    case KBHIT :
			              if (tflag)
			              {
			              	        exec_kbhit();
			              	        token_type = BOOL_TYPE;
			              }
			              break;
			    case GETKEY:
			              if (tflag)
			              {
			              	        exec_getkey();
			              	        token_type = NUMBER;
			              }
			              break;
			    case LEFT : 
			              exec_left(); 
			              token_type = QUOTE;			              
			              break;
			    case RIGHT: 
			              exec_right(); 
			              token_type = QUOTE; 			              
			              break;
			    case MID : 
			              exec_mid(); 
			              token_type = QUOTE; 			              
			              break;
			    default : 
			              break;
			}
			if ( (token_type == QUOTE ||token_type == BOOL_TYPE) && signflag ) serror(0);
			else if (signflag) add_type(token,signflag);			
		    }
		}
		tok = tag;
		return token_type;	/*取字符串时,可能取出来是零,去掉此句,则下面语句将会出现错误判断,如mid(s,l,l)*/
	} 
	if (*token==0) serror(0);       /*为避免在取值时,如果什么都没取出来,则会出现死循环,如If语句中的get_token(2), 遇到 a% = a% + %i */
	return token_type;
}

FAR void brealloc(char *s, char *p)
{
	if ((s = (char *)MemAlloc(Strlen(p)+1))==(char *)Null) serror(1); 
	else 
	{
		Strcpy(s,p);
		*(s+Strlen(p)) = 0; 
	}			
}

FAR char *get_token_last()
{
	int l;
	l = Strlen(token);
	if ((*(token+l-1)!='$')&&(*(token+l-1)!='%')) return (char *)Null;
	else return token+l-1;
}

FAR int isalpha(char c)
{
	if (c>64&&c<91||c>96&&c<123) return 1;
	else return 0;
}

FAR int isdigit(char c)
{
	if (c>47&&c<58) return 1;
	else return 0;
}

FAR char tolower(char c)
{
	if (c>64&&c<91) return c+32;
	else return c;
}

FAR void ckvar(char *s)
{
        if (!isalpha(*s)) 
        { 
              if (InputFlag) InputError = 1;
              serror(42);            /***变量名定义错误***/
        }
        while (*(++s)!=0) 
        {
	      if (isalpha(*s)||isdigit(*s)||(*s=='_')) continue;
	      if (*s=='('&&Strchr(s,')')) return;
	      if (Strchr("%$",*s)) {
	      	    if (*(s+1)=='('||*(s+1)==0) return;
	      	    else 
	      	    {
	      	    	if (InputFlag) InputError = 1;
	      	    	serror(42);
	      	    }
	      }
	      if (InputFlag) InputError = 1;
	      serror(42);
        }
}

FAR int isdelim(char c)
{
	if(Strchr(";,+-<> */^=():",c)|| c==9 || c==0x0D || c==0||c==' ') return 1;
	return 0;
}

FAR void skip_white()
{
	while (*prog==' '||*prog=='\t') prog++;
}

FAR int iswhite(char c)
{
	if(c==' '||c=='\t') return 1;
	else return 0;
}

FAR char look_up(char *s)
{
	int f, e, m, c, tag;
	char *p;
	
	tag = 0;
	f = Strlen(s);
	if (*(s + f - 1)=='$') 
	{
		*(s + f - 1) = 0;
		tag = 1;
	}
	if (*s == '-'||*s == '+') p = s + 1;
	else p = s;
        f = 0; 
        e = COMMANDNUMBER;
        while (f<=e)
        {
        	m = (f + e)/2;
        	if ((c = Stricmp(table[m],p)) == 0) return comtok[m];
        	if (c > 0) e = m - 1;
        	else f = m + 1;
        }
        if (tag) *(s + Strlen(s)) = '$';
	return 0;
}

FAR void exec_put()
{
       char *p, *value; 
       int filenum, i;
       fsnode *q;
/*     char *flag; */
     
       q = fl;
       get_next();
       if (*token!='#') serror(47);
       p = token+1;
       while (*p != 0) 
       {
	   if (!isdigit(*p)) serror(47);
	   p++;
       }
       filenum = atoi(token+1);
       while (q) {
	  if (q->filenum != filenum) q = q->next;	      
	  else break;	      
       }
       if (q == (fsnode*)Null||*(prog-1)!=',') serror(47);
       do  {
	    value = GetAllocBuf();
	    get_exp(value);
	    FileSeek(q->handle,0,FILESEEK_END);
	    switch (*value) {
	   	case STRING_TYPE : 		                   		                   
		                   if (FileWrite(q->handle,_Far(value+1),Strlen(value+1)+1) != Strlen(value+1)+1)
		                   {
		                   	PrjShowFileOperateError();
		                   	serror(52);
		                   }
				   break;
                case REAL_TYPE:				   
		case INTEGER_TYPE: 
		                   i=atoi(value+1);		                   
		                   if (FileWrite(q->handle,_Far(&i),2) != 2)
		                   {
		                   	PrjShowFileOperateError();
		                   	serror(52);
		                   }
				   break;
/*************************************				   
    	        case REAL_TYPE   : double j=atof(value+1);
	       		           fwrite(&j,8,1,q->handle); break;       
	       		           ******************************************/
		default : serror(47);
	    }
	    MemFree(value);
	    get_token(0);
	    if (*token==',') continue;
	    else if (tok!=EOL) serror(47);
       } while (tok!=EOL);
}

FAR void exec_get()
{
       bitnode *varptr;
       char *p, *value, *flag, *value_tmp;
       int filenum, readout1;
  /*   double readout2;*/
       fsnode *q;
     
       varptr = (bitnode*)Null;          
       q = fl;
       get_next();
       if (*token!='#') serror(48);
       p = token + 1;
       while (*p!=0) 
       {
	   if (!isdigit(*p)) serror(48);
	   p++;
       }
       filenum = atoi(token + 1);
       while (q)
       {
	  if (q->filenum!=filenum) q = q->next;
	  else break;	     
       }
       if (q == (fsnode*)Null||*(prog-1)!=',') serror(48);

       do { 
     	   value_tmp = GetAllocBuf();	 
	   get_token(0);
	   flag = get_token_last();
/*	   if (flag!=(char *)Null) *flag = 0; */
	   varptr = (bitnode *)search_vartree(token);	   
	   if (varptr == (bitnode *)Null) serror(48);
	   switch (*varptr->value_addr) 
	   {
	   	 case REAL_TYPE:
	         case INTEGER_TYPE : 
	                           FileRead(q->handle, _Far(&readout1), 2);
				   itoa(readout1, value_tmp, 10);
				   add_type(value_tmp, INTEGER_TYPE);
				   if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) serror(1);
				   else 
				   {
				   	Strcpy(value,value_tmp);
				   	*(value + Strlen(value)) = 0;
				   }
				   MemFree(varptr->value_addr);
				   varptr->value_addr = value;
				   break;
/**********************************				   
	       case REAL_TYPE:     fread(&readout2,8,1,q->handle);
	         	           gcvt(readout2,10,value);
				   add_type(value,REAL_TYPE);
				   free(varptr->value_addr);
				   varptr->value_addr=value;
				   break;                              
***********************************/
	         case STRING_TYPE:   
	                           *value_tmp = STRING_TYPE;
	                           p = value_tmp + 1;
	                           FileRead(q->handle,_Far(p),1);				    
				   while (*p!=-1&&*p!=0) 
				   {
					  p++;
					  FileRead(q->handle,_Far(p),1);
				   }
				   *p = 0; 
				   if ((value = (char *)MemAlloc(Strlen(value_tmp)+1)) == (char*)Null) serror(1);
				   else {
				   	Strcpy(value,value_tmp);
				   	*(value + Strlen(value)) = 0;
				   }
				   MemFree(varptr->value_addr);				   
				   varptr->value_addr=value;
				   break;
	         default :
	                           serror(48);
	   }
	   get_token(0);
	   if (*token == ',') continue;
	   else {
	      if (tok != EOL) serror(48);
	   }
        } while (tok != EOL);
}

FAR void exec_swap()
{	
        bitnode  *p1,*p2; 
        char *p;
     
        *token = 0;
        p1 = (bitnode *)Null;
        p2 = (bitnode *)Null;
        while (*prog==32) prog++;
        if (*prog=='(') prog++;        
        get_token(0);
        if (token_type!=VARIABLE) serror(11);       /***表达式不可以参与swap操作***/
        p1 = search_vartree(token);
        if (p1==(bitnode *)Null) serror(10);       /***变量没有定义或初使化***/
        while (*prog==0x20) prog++;        
        if (*prog++ != ',') serror(11);          /***swap语句出现语法错误***/
        while (*prog==0x20) prog++;
        get_token(0);
        if (token_type!=VARIABLE) serror(11);         /***表达式不可以参与swap操作***/
        while (*prog!=0x0D&&*prog!=':') {
        	if (*prog++!=0x20) serror(11);
        }
        p2 = search_vartree(token);
        if (p2==(bitnode *)Null) serror(10);        /***变量没有定义或初使化***/        
        if (*p1->value_addr-*p2->value_addr>1||*p2->value_addr-*p1->value_addr>1) serror(12);     /***swap语句交换的二变量的数据类型不一致***/
        p = p1->value_addr;
        p1->value_addr = p2->value_addr;
        p2->value_addr = p;
        find_eol();
}

FAR void exec_def()
{	
         char *varbuf, *expbuf, *tbuf, *varbuf_tmp, *key_tmp, *expbuf_tmp;
         pfnode *p, *q;
              
         while (*prog==32) prog++;
         if (*prog!='f'&&*prog!='F'||*(prog+1)!='n'&&*(prog+1)!='N') serror(9);    /***自定义函数定义过程中出现语法错误***/
         prog += 2;
         if (*prog!=32) serror(9);
         while (*prog==32) prog++;
         varbuf_tmp = GetAllocBuf();       /***varbuf_tmp存自定义函数的函数名***/
         tbuf = varbuf_tmp;
         while (*prog!='('&&*prog!=0x0d&&*prog!=0) *tbuf++ = *prog++; 
         if (*prog!='(') serror(9);
         *tbuf = 0;
         key_tmp = GetAllocBuf();          /***key_tmp存自定义函数的变量名***/
         tbuf = key_tmp;
         prog++;
         while (*prog!=')'&&*prog!=0x0D) *tbuf++ = *prog++;
         if (*prog++ != ')') serror(49);          
         *tbuf++ = 0;
         if (Strchr(key_tmp,',')) serror(49);
         ckvar(key_tmp);
         while (*prog!='=') {                         /***自定义函数非法定义判定***/
         	if (*prog!=0x20) serror(49);
         	prog++;
         }
         expbuf_tmp = GetAllocBuf();     /***expbuf_tmp存自定义函数的具体内容***/        
         tbuf = expbuf_tmp;
         prog++; 
         while (*prog!=0x0D&&*prog!=':') {
              if ((*prog=='f'||*prog=='F')&&(*(prog+1)=='n'||*(prog+1)=='N')&&*(prog+2)==0x20&&
                  Strncmp(prog+3,varbuf_tmp,Strlen(varbuf_tmp))==0&&*(prog+3+Strlen(varbuf_tmp))=='(')
                       serror(49);
	      else if (*prog!=*key_tmp) *tbuf++ = *prog++;
	      else if (Strncmp(prog, key_tmp, Strlen(key_tmp))!=0) *tbuf++ = *prog++;
	      else if (isdigit(*(prog+Strlen(key_tmp)))||isalpha(*(prog+Strlen(key_tmp)))) *tbuf++ = *prog++;
	      else {
		   *tbuf++ = ',';
		   prog += Strlen(key_tmp);
	      }
        }
        *tbuf = 0;
        if ((p=(pfnode *)MemAlloc(sizeof(pfnode)))==(pfnode *)Null) serror(1); /***内存溢出***/
        if ((varbuf = (Int8*)MemAlloc(Strlen(varbuf_tmp)+1))==(Int8*)Null) {   /***内存溢出***/    
        	MemFree((Int8*)p);
                serror(1);                        /***内存溢出***/
        }                     
        if ((expbuf = (Int8*)MemAlloc(Strlen(expbuf_tmp)+1))==(Int8*)Null) {
        	MemFree((Int8*)p);
        	MemFree(varbuf);
        	serror(1);                        /***内存溢出***/
        	   
        }        
        Strcpy(varbuf,varbuf_tmp);
        *(varbuf+Strlen(varbuf_tmp)) = 0;
        Strcpy(expbuf,expbuf_tmp);
        *(expbuf+Strlen(expbuf_tmp)) = 0;
              
        p->var = varbuf; 
        p->exp = expbuf; 
        p->next = (pfnode *)Null;
        if (pf==(pfnode *)Null) pf = p;
        else {
	     q = pf;
	     if (Stricmp(q->var,p->var)==0) {
	     	 	MemFree(p->var);
	     	 	MemFree(p->exp);	     	 	
	     	 	MemFree((Int8*)p);
	     	 	serror(50);
	     }    
	     while (q->next!=(pfnode *)Null) {
	     	 if (Stricmp(q->var,p->var)==0) {
	     	 	MemFree(p->var);
	     	 	MemFree(p->exp);	     	 	
	     	 	MemFree((Int8*)p);
	     	 	serror(50);
	     	 }
	     	 q = q->next;
	     }
	     q->next = p;
        }       
}

FAR char get_priority(char *s)
{
        int c, f, e, m;
        
        f = 0;
        e = 37;            
        while (f<=e)
        {
        	m = (f + e)/2;
        	if ((c = Stricmp(opsign[m],s))==0)
        	{
        		*s = opcod[m];
        		return opprior[m];
        	}
        	if (c > 0) e = m - 1;
        	else f = m + 1;
        }
        serror(43);
        return 0;                            
}

⌨️ 快捷键说明

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