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

📄 basic3.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 3 页
字号:
#include "os.h"
#include "ptype.h"
/***self Func declare***/
FAR void SaveInputData();
FAR void exec_GraphModeInput();
FAR void exec_if();
FAR void exec_else();
FAR void dim();
FAR void exec_for();
FAR void next();
FAR void exec_read();
FAR void exec_input();
FAR void InitialVariable();
FAR void FreeAllocMem();
FAR Int8 inkey();
FAR void exec_circle();
FAR void exec_ellipse();
FAR void exec_line();
FAR void exec_box();
FAR void exec_draw();
FAR void exec_goto();
FAR void adjust_poutbuf(char *ad_ptr);

/***basic1.c Func declare***/
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 void exec_mid();
FAR void exec_right();
FAR void exec_left();
FAR void exec_fn();
FAR void exec_inkey();
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);
FAR char *GetAllocBuf();

/***basic2.c Func declare***/
FAR void skip_white();
FAR bitnode *search_vartree(char *s);
FAR void doingassign(char *var, char *value);
FAR void IsArray();
FAR void assign_buf();
FAR char *get_type(char *s);
FAR char *find_label(char *s);
FAR void label_init();
FAR void get_next();
FAR char *gpop();
FAR void gpush(char *s);
FAR void fpush(for_stack_str *i);
FAR void fpop(for_stack_str *i);
FAR void find_eol();
FAR void wpop(while_stack_str *i);
FAR char *get_variables(char *s);
FAR void putback();
FAR char get_token(char tflag);
FAR void serror(Int8 error);
FAR void ckvar(char *s);
FAR char *get_token_last();
FAR int isalpha(char c);
FAR int isdigit(char c);
FAR char tolower(char c);
FAR int isdelim(char c);
FAR int iswhite(char c);
FAR char look_up(char *s);
FAR UInt8 IsInteger(char *value_ptr);
FAR UInt8 agree_v(char *var, char *value);
FAR void exec_put();
FAR void exec_gvbasicif();

extern jmp_buf         e_buf;
UInt8                    GVBasicIf_flag;
extern UInt8 		 *hDesktop;
extern bitnode 		 *Variables;
extern pfnode 		 *pf;     
extern Int8              *pInBuf, *pOutBuf, *TmpOut, *TmpBuf;
extern Int8              pCurBuf;
extern UInt8             *hBasicWnd;
extern data_str 	 *data_buf, *cur_buf;
extern for_stack_str 	 fstack[FOR_NEST];
extern while_stack_str 	 wstack[WHILE_WEND];
extern label_str 	 *label_table;
extern fsnode            *fl;
extern char    		 *prog;
extern char 		 *token;
extern char 		 token_type, tok;
extern char 		 notdoelse;
extern char 		 *gstack[SUB_NEST];
extern int 		 ftos,wtos,gtos;
extern char 		 op_b[4];
extern UInt8             GTflag;
extern UInt8             nBasicRet;
extern Int8              InputFlag, InputError;
extern Tmp_List          *TmpList;
extern Int8              sl_flag, *pBasicFileName;
extern UInt16            limit_pos;
/*
FAR int gcvt(double i, char flag, char *result)
{
	double c, r;
	int num, total;
	char *temp_buf;	
		
	temp_buf = pBasicFileName + 14;
	r = i;
	if (r < 0) r = -r;
	c = 1; num = 0;	
	while ( c<= r)
	{
		c *= 10;
		num++;
	}
	if (num >= 16 && flag == 16) return 0;
	if (num >= 15 && flag == 15) return 0;
	Strcpy(temp_buf,"%.");	
	sprintf(temp_buf+2,_Far("%d"), (UInt16)flag - num - 1);
	Strcat(temp_buf,"f");
	sprintf(result,(FarPtr)temp_buf,i);	
	return 1;
}
*/
FAR void exec_if()                                /*执行IF语句*/
{
	char *x, *saveprog, ifn, endifn, elsen, *pre_pos;	
		
	x = prog;
	GVBasicIf_flag = 0;
	for(;;)
	{
		if (*x==0x0d||*x==':'||*x==0) break;
		if (*x=='e'||*x=='E')
		{
			if (Strstr(x-1," else ")==x-1||Strstr(x-1," ELSE ")==x-1)
			{
				GVBasicIf_flag = 1;
				exec_gvbasicif();
				return;
			} 
		}
		x++;
	}		
	ifn = 1;
	endifn = 0;
	elsen = 0;	
	x = GetAllocBuf();
	get_exp(x);
	get_token(0);
	if (tok!=THEN) serror(35);  /***if语句出现语法错误***/
	sl_flag = 1;
	if (*x == BOOL_TYPE && *(x+1) == '1' || *x!=BOOL_TYPE && *(x+1) != '0' && *(x+1) != 0  )
	{
	    saveprog = prog;
	    get_token(0);
	    if (tok==EOL)
	    {
		notdoelse++;
		for (;;)
		{		   
		   while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE&&tok!=REM) get_token(2);
		   switch (tok)
		   {
		       case REM   : while (*prog!=0x0D&&*prog!=':') prog++;
		                    break;
		       case ENDIF : endifn++; break;
		       case IF    : do {		                    
		       	               get_token(0);
		       	            }while(tok!=THEN&&tok!=FINISHED);
				    if (tok!=THEN) serror(35);
				    get_token(0);
				    if (tok==EOL) ifn++;
				    break;
		       case ELSE  : elsen++;
		       default    : break;
		   }
		   if (endifn==ifn)
		   { 
		          if (elsen!=ifn) notdoelse--;
		   	  break;
		   }
		   if (tok==END&&endifn!=ifn) serror(35);
		   get_token(0);
		}
	    } 
	    prog = saveprog;
	    if (token_type == NUMBER) exec_goto();
	}
	else 
	{
	     get_token(0);
	     if (tok==EOL) 
	     {
		for(;;)
		{		    
		    while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE&&tok!=REM) get_token(2);		    
		    switch (tok) 
		    {
		       case REM    : while (*prog!=0x0D&&*prog!=':') prog++;
		                     break; 
		       case ENDIF  : endifn++; break;
		       case IF     : do { 
		       	                   get_token(0); 
		                     } while(tok!=THEN&&tok!=FINISHED);
				     if (tok!=THEN) serror(35);
				     get_token(0);
				     if (tok==EOL) ifn++;
				     break;
		       case ELSE   : elsen++; break;
		       default     : break;
		    }
		    if (endifn==ifn||elsen==ifn) break;
		    if (tok==END&&endifn!=ifn) serror(35);
		    get_token(0);
		}
	     } 
	     else 
	     {
		while (tok!=EOL&&tok!=FINISHED)
		{
		     while (*prog==32) prog++;
		     if (*prog==':') prog++;
		     get_token(0);
		}
	     }
	}
	sl_flag = 0;
}

FAR void exec_else()
{
        char  endifn, ifn, elsen;
       
       
        if (GVBasicIf_flag) 
        {
        	while (*prog!=0x0d&&*prog!=0) prog++;
        	GVBasicIf_flag = 0;
        	return;
        }
        endifn=0; 
        ifn=0; 
        elsen=0;         
        if (notdoelse) 
        {
       	     notdoelse--;
	     get_token(0);
	     if (tok==EOL) 
	     {
		while (1) 
		{
		    while (tok!=ENDIF&&tok!=END&&tok!=IF&&tok!=ELSE) get_token(2);
		    switch (tok) 
		    {
		       case ENDIF  : endifn++; break;
		       case IF     : do { 
		       	                  get_token(0); 
		       	             } while(tok!=THEN&&tok!=FINISHED);
				     if (tok!=THEN) serror(32);
				     get_token(0);
				     if (tok==EOL) ifn++;
				     break;
		       case ELSE   : elsen++; break;
		       default     : break;
		    }
		    if (endifn-ifn==1) break;
		    if (tok==END) serror(0);
		    get_token(0);
		}
	     }
	     else 
	     {
		    while (tok!=ENDIF) get_token(0);
	     }
        }  
}

FAR void dim()
{
        char *l, *var, *ibuf, *value, tag, *saveprog, *expbuf, *savetoken, savetok, *var_tmp, *value_tmp;
        int i, j, total;
        bitnode *p;
        p=(bitnode *)Null;
        i=0;
        for (;;) 
        {
	            *token = 0;
	            var = token;
	            while (*prog == 0x20 || *prog == 0x09) prog++;
	            if (*prog == 0x0D||*prog == ':') break;
	            if (*prog==',') prog++;
	            while (*prog == 0x20 || *prog == 0x09) prog++;
	            while (*prog!=')'&&*prog!=0x0D&&*prog!=':') *var++ = *prog++;
	            if (*prog!=')') serror(36);      /***数组定义非法***/
	            *var++ = *prog++;
	            *var = 0;
	            
	            l = token;
	            if ((l = Strchr(token,'(')) == (char *)Null) serror(36);
	            var_tmp = GetAllocBuf();
	            value_tmp = var_tmp + 25 ; 

	            if (*(l-1)=='$') tag = STRING_TYPE;
	            else if (*(l-1)=='%') tag = INTEGER_TYPE;
	            else tag = VAR_TYPE;
	            
	            j = l-token;
	            if (j > 118) serror(1);
	            Strncpy(var_tmp,token,j);
	            Strcat(var_tmp,"()");
	            if ((p=search_vartree(var_tmp))!=(bitnode*)Null) serror(37); /***数组名重复定义***/	            	     
	            ckvar(var_tmp);     /***检查数组变量名是否合法***/
	            l++;
	            *value_tmp = ARRAY_INFO; 
	            *(value_tmp + 1) = '(';
	            *(value_tmp + 2) = 0;
                    
                    ibuf = GetAllocBuf();

	            expbuf = ibuf + 20;          
	            savetoken = GetAllocBuf();	            
	            Strcpy(savetoken,token); 
	            savetok = tok;
	            i = 0; 
	            total = 1;
	            while (*l!=')'&&*l!=0x0D&&*l!=0)
	    	          *(expbuf + i++) = *l++;
                    *(expbuf+i) = 0;
                    saveprog = prog; 
                    prog = expbuf;
	            while (*prog!=0) 
	            {
	    	          get_exp(ibuf);
	    	          if (!IsInteger(ibuf)||Strchr(ibuf,'-')) serror(36);
	    	          Strcat(value_tmp,ibuf+1);
	                  if (*prog==',')
	                  { 
	                  	  i = 1;
	                  	  while (*(prog + i++)==0x20);
	                  	  if (*(prog + i - 1)==0) serror(36);
	          	          Strcat(value_tmp,",");
	          	          *prog++;
	                  }
	            }
	            Strcat(value_tmp,")");
	            if ((var = (char *)MemAlloc(Strlen(var_tmp)+1))==(char*)Null) serror(1);	            
	            else {
	            	  Strcpy(var,var_tmp);
	            	  *(var+Strlen(var_tmp)) = 0;
	            }
	            if ((value = (char *)MemAlloc(Strlen(value_tmp)+1))==(char*)Null) {	            
	            	  MemFree(var);
	            	  serror(1);
	            } else {
	            	  Strcpy(value,value_tmp);
	            	  *(value+Strlen(value_tmp))=0;
	            }	            
	            doingassign(var,value);	    
	            Strcpy(token,savetoken); 
	            prog=saveprog; 
	            tok=savetok;
        }
}

FAR void exec_for()
{
	for_stack_str i;
	char *value, *temp, *var_tmp;
	double value1;
	int value2;
	bitnode *p;
	
	p = (bitnode *)Null;
	get_token(0);
	if(!isalpha(*token)) serror(38);
	for (value2 = 0; value2 < ftos; value2++) 
	{
	        if (!Stricmp(token,fstack[value2].var)) serror(38);
	}
	var_tmp = GetAllocBuf();
	Strcpy(var_tmp, token);

⌨️ 快捷键说明

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