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

📄 basic2.c

📁 用C语言写的YABasic解释器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "os.h"
#include "ptype.h"
/***self Func***/
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 void get_data();
FAR void exec_swap();
FAR void exec_def();
FAR char *find_label(char *s);
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 FreeOpMem();
FAR void putback();
FAR char get_token(char tflag);
FAR void brealloc(char *s, char *p);
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 char get_priority(char *s);
FAR void exec_open();
FAR void exec_close();
FAR void exec_put();
FAR void exec_get();
/***basic1.c Func***/
FAR int atoi(char *x);
FAR void itoa(int i, char *result, char flag);
FAR double atof(char *x);
FAR void gcvt(float 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 void exec_kbhit();
FAR void exec_getkey();
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();
FAR UInt8 IsInteger(char *value_ptr);
FAR UInt8 agree_v(char *var, char *value);

extern bitnode 		        *Variables;
extern pfnode 			*pf;     
extern fsnode                   *fl;
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 UInt8            GTflag;
extern Int8             InputFlag, InputError;
extern UInt8            *hBasicWnd;
extern char 		*prog, *pInBuf;
extern char 		*token;
extern char 		token_type;
extern char             tok;
extern char 		notdoelse;
extern char 		*gstack[SUB_NEST];
extern int 		ftos;
extern int              wtos;
extern int              gtos;
extern char 		op_b[4];
extern Int8             sl_flag;

const char table[][10] = { {"("},    {")"},    {"*"},     {"+"},     {"-"},     {"/"},     {"<"},      {"<="},
                           {"<>"},   {"="},    {">"},     {">="},    {"^"},     {"abs"},   {"and"},    {"asc"},
                           {"atn"},  {"beep"}, {"box"},   {"chr"},   {"circle"},{"close"}, {"cls"},    {"copy"},
                           {"cos"},  {"cvi$"}, {"cvs$"},  {"data"},  {"def"},   {"dim"},   {"draw"},   {"ellipse"},
                           {"else"}, {"end"},  {"endif"}, {"eof"},   {"exp"},   {"fn"},    {"for"},    {"get"}, {"getkey"},
                           {"gosub"},{"gotext"},{"goto"}, {"graph"}, {"if"},    {"inkey"}, {"input"},  {"int"}, {"kbhit"},
                           {"left"}, {"len"},  {"let"},   {"line"},  {"locate"},{"log"},   {"lset"},   {"mid"},
                           {"mki$"}, {"mks$"}, {"next"},  {"not"},   {"on"},    {"open"},  {"or"},     {"play"},
                           {"pos"},  {"print"},{"put"},   {"read"},  {"rem"},   {"restore"},{"return"},{"right"},
                           {"rnd"},  {"rset"}, {"sgn"},   {"sin"},   {"spc"},   {"sqr"},   {"step"},   {"str"},
                           {"swap"}, {"tan"},  {"then"},  {"to"},    {"val"},   {"wend"},  {"while"}};  

const char comtok[] = { 
	                   34,35,23,21,22,24,27,29,31,30,26,28,25,37,32,48,38,103,96,49,101,82,110,87,	                   	                   
	                   39,55,56,18,90,80,95,108,14,13,100,58,41,91,5,85,114,11,106,8,92,3,94,2,47,113,	                   	                   
	                   97,50,112,93,109,42,88,99,57,51,6,36,107,81,33,102,54,1,84,19,105,20,12,98,	                   	                   
	                   46,89,43,40,111,44,15,52,104,45,4,7,53,17,16};
	                   

const char opsign[][8] = { {"("},{")"},{"*"},{"+"},{"-"},{"/"},{"<"},{"<="},{"<>"},{"="},
                           {">"},{">="},{"^"},{"abs"},{"and"},{"asc"},{"atn"},{"chr"},{"cos"},{"cvi$"},
                           {"cvs$"},{"eof"},{"exp"},{"int"},{"len"},{"log"},{"mki$"},{"mks$"},{"not"},{"or"},
                           {"pos"},{"rnd"},{"sgn"},{"sin"},{"sqr"},{"str"},{"tan"},{"val"}};
const char opprior[] ={ 
	                15, 3, 12, 11, 11, 12, 10, 10, 9, 9, 10, 10, 13, 14, 5, 14, 14, 14, 14, 14, 14, 
                        14, 14, 14, 14, 14, 14, 14, 14, 4, 14, 14, 14, 14, 14, 14, 14, 14 };                      

const char opcod[] = { 
	               34,35,23,21,22,24,27,29,31,30,
                       26,28,25,37,32,48,38,49,39,55,
                       56,58,41,47,50,42,57,51,36,33,
                       54,46,43,40,44,52,45,53};

void Ins_Node(bitnode *s)
{	
         bitnode *p,*q;
         if (Variables==(bitnode *)Null) Variables=s;
         else 
         {
	        p = Variables;
	        while (p!=(bitnode *)Null) 
	        {
	               q = p;
	               if (p==(bitnode *)Null) break;
	               if (Stricmp(p->var_addr,s->var_addr)>0) p = p->lch;
	               else if (Stricmp(p->var_addr,s->var_addr)<0) p = p->rch;
		       else { p->value_addr = s->var_addr; return; }
	        }
	        if (Stricmp(q->var_addr,s->var_addr)>0) q->lch = s;
	        else q->rch = s;
         }
}

FAR void doingassign(char *var, char *value)
{
        bitnode *s;
        if ((s =(bitnode *)MemAlloc(sizeof(bitnode)))==(bitnode *)Null) 
        {
        	MemFree(var); 
        	MemFree(value);
        	serror(1);       /**************内存溢出**************/
        }
        s->var_addr = var; 
        s->value_addr = value;
        s->lch = (bitnode *)Null; 
        s->rch = (bitnode *)Null;
        Ins_Node(s);
}

void check_array(char *a_n, char *a_t, int *result)
{
	bitnode *p;
	char *s, *n_buf1, *n_buf2;
	int l1, l2;
	
	n_buf1 = GetAllocBuf();
	n_buf2 = n_buf1 + 50;
	
	*result = 0;
	p = (bitnode *)Null;
        l1 = 0;        
	p = search_vartree(a_n);
	if (p == (bitnode *)Null) 
	{
		a_t++;
		while (*a_t!=')') 
		{
			l2 = 0;
			while (*a_t==0x20||*a_t==0x09) a_t++;
			while (isdigit(*a_t)) *(n_buf2 + l2++) = *a_t++;
			*(n_buf2 + l2) = 0;
			while (*a_t==0x20||*a_t==0x09) a_t++;
			if (l2==0||*a_t!=','&&*a_t!=')')
			        serror(29);       /***出现非法数组或与所定义的数组不一致***/
			else
			{
				if (*a_t==',')  a_t++;
			}
			if (atoi(n_buf2)>10) serror(30);       /***未初始化的数组,下标不可以大于10***/
		}
		return;
	}
	s = p->value_addr + 1;
	for (;;)
	{
	    if (*s!=')') s++;
	    if (*a_t!=')') a_t++;
	    l1 = 0;
	    while (isdigit(*s)) *(n_buf1 + l1++) = *s++;
	    *(n_buf1 + l1) = 0;
	    l2 = 0;
	    while (isdigit(*a_t)) *(n_buf2 + l2++) = *a_t++;
	    *(n_buf2 + l2) = 0;
	    if (l1==0&&l2!=0||l1!=0&&l2==0) 
	             serror(29);  /***出现非法数组或与所定义的数组不一致***/
	    if (l1==0&&l2==0) 
	    {
		 if (*s==')'&&*a_t==')') break;
		 else 
		         serror(29);
	    }
	    if (atoi(n_buf1)< atoi(n_buf2)) serror(30);      /***数组下标越界***/
	}
}


FAR void IsArray()
{
	char *old_prog, *var, *exp_buf, *token_buf, *exp_value, *s;
	int i, result, Br_Num; 
	
	i = 0;
	result = 0;
	if (*prog != '(') return;
	var = GetAllocBuf();
	exp_buf = GetAllocBuf();
	exp_value = GetAllocBuf();
	token_buf = GetAllocBuf();
		
	Strcpy(token_buf,token);
	Strcat(token_buf,"()");
	Br_Num = 1;
	while (Br_Num) 
	{
	      i = Strlen(exp_value);
	      *(exp_value+i) = ',';
	      *(exp_value+i+1) = 0;
	      s = exp_buf;
	      i = 0;
	      prog++;
	      *(s + i++)='(';	      	      
	      while (*prog!=','||*prog==','&&Br_Num!=1)
	      {
	      	    if (*prog == '(') Br_Num++;
	      	    else if (*prog == ')'&&!(--Br_Num)) break;	      	    	      
	      	    else if (Strchr("!#@&|~':;.?<>=",*prog)||*prog==0x0D) 
	      	               serror(29);
		    *(s + i++) = *prog++;		    
	      }
	      *(s + i) = ')';
	      *(s + i + 1) = 0;
	      old_prog = prog; 
	      prog = s; 
	      get_exp(var);
	      IsInteger(var);
	      Strcat(exp_value,var + 1);
	      prog = old_prog;
	}
	prog++;	
	*exp_value = '(';
	i = Strlen(exp_value);
	*(exp_value+i) = ')';
	*(exp_value+i+1) = 0;
	if (*token_buf=='-')
	{		
	       check_array(token_buf+1,exp_value,&result);
	}
	else
	{
	       check_array(token_buf,exp_value,&result);
	}        	 
	Strcpy(token,token_buf);
	if (Strlen(token) + Strlen(exp_value) > 180) serror(1);
        Strcat(token,exp_value);
}

FAR void get_data()
{
        char *p; 
        
        p = token;         
        token_type = 0; 
        tok = 0;
        while (*prog==32) prog++;
        if (*prog=='"') 
        {
        	token_type = QUOTE;	       
        	prog++;
        }
        while (*prog!=','&&*prog!=':'&&*prog!=0x0D&&*prog!=0) *p++ = *prog++;	       
        if (*prog==',') prog++;
        else tok = EOL;
        while (*(p-1)==32) p--;
        if (token_type==QUOTE&&*(--p)!='"') serror(31);       /***字符串表示错误,请查看双引号是否配对***/	                
        *p = 0;
}

FAR void assign_buf() /*** alloc buffer for data area ***/
{
	char *value; data_str *p, *q; 
	
	q = data_buf;
	while (*prog==32) prog++;
	if (Strstr(prog,"DATA")==prog||Strstr(prog,"data")==prog) prog += 4;
	for (;;)
	{
	        get_data();
	        if (token_type==QUOTE) add_type(token,STRING_TYPE);
	        else 
	        {
		       if (!get_type(token)) serror(31); /***非法字符串表示***/
	        }
	        if ((value=(char *)MemAlloc(Strlen(token)+1))==(char *)Null) serror(1);         /***内存溢出***/
	        if ((p=(data_str *)MemAlloc(sizeof(data_str)))==(data_str *)Null) 
	        {
	    	       MemFree(value);
	    	       serror(1);              /***内存溢出***/
	        }
	        Strcpy(value,token); 
	        *(value+Strlen(token)) = 0;
	        p->value_addr = value; 
	        p->next = (data_str *)Null;
	        if (q==(data_str *)Null) data_buf = cur_buf = q = p;
	        else 
	        {
		       while (q->next) q = q->next;
		       q->next = p;
	        }
	        if (tok==EOL) break;
	}
}

FAR char *find_label(char *s)  /*查找标号*/
{
	int fnum;
	label_str *cur_lab;
	
	cur_lab = label_table;	
	fnum = atoi(s);
	while (cur_lab!=(label_str*)Null) 
	{
		if (cur_lab->label_num==fnum)
		              return cur_lab->p;
		else
		              cur_lab = cur_lab->next;
	}
	return (char*)Null;
}

FAR void wpop(while_stack_str *i)
{        
        if (--wtos<0) serror(17);       
        i->exploc=wstack[wtos].exploc;
        i->endloc=wstack[wtos].endloc;
}

FAR void find_eol()/*到达行尾 */
{
	while(*prog != 0x0D && *prog != 0 && *prog!= ':') prog++;		
	if(*prog) prog++;		
}

FAR void fpop(for_stack_str *i)
{	
	if(--ftos<0) serror(16);
	i->var = fstack[ftos].var;
	i->target = fstack[ftos].target;
	i->step = fstack[ftos].step;
	i->loc = fstack[ftos].loc;
}

FAR void fpush(for_stack_str *i)
{
	if(ftos>FOR_NEST) serror(32);     /***For-Next循环嵌套层数越界***/
	fstack[ftos].var = i->var;
	fstack[ftos].target = i->target;
	fstack[ftos].step = i->step;
	fstack[ftos].loc = i->loc;
	ftos++;
}

FAR void gpush(char *s)
{	
	if(++gtos == SUB_NEST) serror(33);		/***GoSub嵌套层数越界***/
	gstack[gtos] = s;
}

FAR char *gpop()
{
        if(gtos == 0) serror(34);			/***GoSub返回出错***/
	return(gstack[gtos--]);
}

FAR void get_next()
{
        char *temp;
        temp = token;
        while (*prog==32||*prog==']') prog++;
        if (*prog=='"') {
     	    while (*prog!='"'&&*prog!=':'&&*prog!=0x0D) prog++;
     	    if (*prog++!='"') serror(31);
        } else {
            while (*prog!=32&&*prog!=':'&&*prog!=0x0D&&*prog!='='&&*prog!=','&&*prog!=0) *temp++ = *prog++;
            prog++;
        }
        *temp = 0;
}

FAR char *get_type(char *s)
{
     int l, pointnum, signnum, i;
     char *temp, *p, *ptr;
     if (Strcmp(s,"+")==0||Strcmp(s,"-")==0) return (char *)Null;
     if (*s=='+'&&*(s+1)=='-'||*s=='-'&&*(s+1)=='+') return (char *)Null;     
     temp = GetAllocBuf();
     p = s;
     ptr = temp;
     if (*p=='+') p++;
     if (*p=='-') *ptr++ = *p++;
     if (*p=='.') return (char *)Null;
     while(*p == '0'&&*(p + 1) == '0') p++;
     if (*p == '0'&&isdigit(*(p + 1))) p++;
     pointnum = 0;
     while(*p!=0)
     {
	  if (*p == '.' && ++pointnum > 1) return (char*)Null;
	  if (!isdigit(*p)&&*p!='.') return (char*)Null;
	  *ptr++ = *p++;	  	  	  
     }
     if (*(ptr-1)=='.') *(ptr - 1) = 0;
     else *ptr = 0;
     Strcpy(s+1,temp);
     *s = REAL_TYPE;
     return s;    
}

FAR char *get_variables(char *s)
{
     struct btnode *p;
     
     p = Variables;
     while (p!=(struct btnode *)Null) 
     {
           if (Stricmp(p->var_addr,s)>0) p = p->lch;
           else if (Stricmp(p->var_addr,s)<0) p = p->rch;
	   else return p->value_addr;		             
     }
     if (Strchr(s,'(')&&Strchr(s,')')) serror(30);          /***数组内容没有初始化***/
     serror(10);
     return (char*)Null;                                           /***变量没有定义***/    
}

FAR void putback()
{
	char *t;
	t = token;
	for(;*t;t++) prog--;
}

FAR char get_token(char tflag)
{
	char *temp, tag, signflag, *p;
	int buf_count, dot_count;
	
	temp = token;
	*temp = tok;	
	tok = 0;
	if(*prog == 0 )
	{
		*token = 0;
		tok = FINISHED;               
		return(token_type = DELIMITER);
	}
	if (*prog==']')
	{
	       if (prog==pInBuf||*(prog-1)==0x0D)
	       {
	               while(*prog==']') prog++;
	       }
	       else
	               serror(0);
	}
	while(*prog==0x20||*prog==0x09) prog++;
	if (*(prog-1)=='='||*(prog-1)=='('||*temp==STEP||*temp==TO
	  ||*temp>25&&*temp<37&&*temp!=35||token_type==COMMAND)
	        *temp = 1;
	else
	        *temp = 0;	        
	token_type = 0;
	if ((*prog=='-'||*prog=='+')&&(*temp||!tflag))  *temp++ = *prog++;
	if(*prog==0x0D||*prog==':')
	{
		if (token!=temp) serror(0);
		prog++;
		tok = EOL;
		*token = 0x0D;
		token[1] = 0 ;		
		return(token_type = DELIMITER);
	}
	if (*prog=='.') serror(0);
	if(Strchr("+-*/^=()><",*prog)) 
	{
		*temp = *prog++;
		if (*temp=='>'&&*prog=='=') *(++temp) = *prog++;
		else if (*temp=='<'&&(*prog=='='||*prog=='>')) *(++temp) = *prog++;
		else if (*temp == '(')
		{
			p = prog;
			while (*p==0x20||*p==0x09) p++;
			if (*p==')') serror(0);
		}
		*(++temp) = 0;
		tok = look_up(token);
		return(token_type = OPERATION2);
	}	
	if(Strchr(";,#",*prog))
	{
		*temp++ = *prog++;
		*temp = 0;
		return(token_type = DELIMITER);

⌨️ 快捷键说明

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