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

📄 impubasicview.cpp

📁 visual c++做的小型basic编译器,是我们课程设计要求的!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	 int t;
	 for(t=0;t<NUM_LAB;++t)
		label_table[t].name[0]='\0';

}

int CIMPUBasicView::find_label(CString s)//查找标号位置
{
    int t;
	for(t=0;t<NUM_LAB;++t)
	{
		int i=s.CompareNoCase(CString(label_table[t].name));
		if(i==0)
		{
			return t;
		    break;
		}
	}
		return -1;
}

int CIMPUBasicView::get_next_label(char *s)//取得标号位置
{
	int t;
    for(t=0;t<NUM_LAB;++t)
	{
		if(label_table[t].name[0]==0)
			return t;
		if(!strcmp(label_table[t].name,s))
			return -2;
	}
	return -1;

}

void CIMPUBasicView::scan_labels()//建立标号表
{
int addr;
	char*temp;
	label_init();
	temp=prog;
	get_token();
	if(token_type==NUMBER){
		strcpy(label_table[0].name,token);
		label_table[0].p=prog;
	}
	find_eol();
	do{
		get_token();
		if(token_type==NUMBER){
			addr=get_next_label(token);
			if(addr==-1||addr==-2){
				(addr==-1)?Error(5):Error(6);
			}
			strcpy(label_table[addr].name,token);
			label_table[addr].p=prog;
		}
		if(tok!=EOL)find_eol();
	}while(tok!=FINISHED);
	prog=temp;
}
void CIMPUBasicView::gosub()//关键字gosub
{
    int i;
	get_token();
	i=find_label(CString(token));
	if(i<0)
	  Error(7);
      else 
	  {
		  gpush(prog);
		  prog=label_table[i].p;
	  }
}

void CIMPUBasicView::greturn()//关键字return
{
   prog=gpop();
}

void CIMPUBasicView::gpush(char *s)//转子入栈
{
    gstack1.AddTail(s);
}

char * CIMPUBasicView::gpop()//转子弹栈
{
	if(gstack1.IsEmpty())
	{
		Error(12);
		return "";
	}
	else
	{
	char *q=(char *)gstack1.RemoveTail();
	return q;
	}
  }

void CIMPUBasicView::input()//输入函数
{
      int i=0,var;
	  do
	  {
	  get_token();
	  if(token_type==QUOTE)
	  {
		val_Edit1 += CString(token);
		get_token();
		if(*token!=',')
			Error(1);
		   get_token();
	  }
	  else 
	  {
		  val_Edit1 += "数据输入:?";		  
	  }
	       val_Edit1 += CString(token);
		   val_Edit1 += "\t";
	       var=toupper(*token)-'A';     
	       CInputDlg dlg(val_Edit1);
	       if(dlg.DoModal()==IDOK)
			  i=dlg.GetData();			
		   variables[var]=i; 	
		   char m_buf[40];
		   int m=sprintf(m_buf,"%d",i);
     	   val_Edit1 += CString(m_buf);
        	val_Edit1 += "\r\n";
			get_token();
			  }while(*token==';'||*token==',');
	}

void CIMPUBasicView::exec_while()//关键字while
{

	char *p,*q;
	p=prog;
	putback();	
	q=prog;
	wpush(q);
	prog=p;
	int x,y,cond;
	get_exp(&x);
	get_token();
    CString str1,str2;
	str1=CString(token);
	get_exp(&y);
    cond=get_rel(x,str1,y);
	if(!cond)
	{
	find_wend();
		}
}

void CIMPUBasicView::wend()//关键字wend
{
	prog=wpop();
}

void CIMPUBasicView::find_wend()//查找关键字wend
{
 CString str,str1;
 str1 = "wend";
 int i=1;
 do
 {
	 get_token();
	 if(token_type==COMMAND)
	 {
	  if(tok==FINISHED)
	  {
		 Error(11);
		 break;
	  }
	   else
	   {
         str = CString(token);
         i=str.CompareNoCase(str1);
	   }
	 }
 }while(i!=0);
 wpop();  
}

void CIMPUBasicView::wpush(char *s)//while循环入栈
{
   	
     wstack1.AddTail(s);
}

char * CIMPUBasicView::wpop()//while出栈
{
    if(wstack1.IsEmpty())
	{
		Error(12);
		return "";}
	else
	{
	char *q=(char *)wstack1.RemoveTail();
	return q;
	}
}

void CIMPUBasicView::exec_else()//关键字else
{
	CString str1 = "TRUE";
	CString str2 = "MTRUE";
	CString str = ifgettop();
	int i=str.CompareNoCase(str1);
    int j=str.CompareNoCase(str2);
	if(i==0)
	  findendifelse();
	else if(j==0)
		findeolelse();
	
  }

void CIMPUBasicView::exec_endif()//关键字endif
{
	ifpop();
}

void CIMPUBasicView::findendifelse()//查找关键字else or endif
{
  CString str,str1,str2;
 str1 = "endif";
 str2 = "else";
 int i=1,j=1;
 do
 {
	 get_token();
	 if(token_type==COMMAND)
	 {
	  if(tok==FINISHED)
	  {
		 Error(15);
		 break;
	  }
	   else
	   {
         str = CString(token);
         i=str.CompareNoCase(str1);
		 j=str.CollateNoCase(str2);
	   }
	 }
 }while((i!=0)&&(j!=0));
 putback();
}

void CIMPUBasicView::ifpush(CString s)//if入栈
{
  ifstack1.AddTail(s);
}

void CIMPUBasicView::ifpop()//if出栈
{
  if(ifstack1.IsEmpty())
	{
		Error(14);
	}
	else
	{
	CString str = (CString)ifstack1.RemoveTail();
	}
}

CString CIMPUBasicView::ifgettop()//取if栈顶元素
{
  if(ifstack1.IsEmpty())
	{
		Error(13);
		return "FALSE";
	}
	else
	{
	CString str = (CString)ifstack1.GetTail();
	return str;
	}
}
void CIMPUBasicView::rem()//注释函数
{
  find_eol();
}

void CIMPUBasicView::exec_do()//关键字do
{
    char *p,*q;
	p=prog;
	putback();	
	q=prog;
	dpush(q);
	prog=p;
	get_token();
	if(token_type==COMMAND)
	{
	 CString str1 = "while";
	 CString str2 = "until";
	 CString str = CString(token);
	 int i=str.CompareNoCase(str1);
	 int j=str.CompareNoCase(str2);
	 if(i==0)//dowhile-loop
	 {
        int x,y,cond;
	    get_exp(&x);
	    get_token();
        CString str1,str2;
	    str1=CString(token);
	    get_exp(&y);
        cond=get_rel(x,str1,y);
    	if(!cond)
		{
	     exitdo();
		}
	 }
	 if(j==0)//dountil-loop
	 {
		 int x,y,cond;
	    get_exp(&x);
	    get_token();
        CString str1,str2;
	    str1=CString(token);
	    get_exp(&y);
        cond=get_rel(x,str1,y);
    	if(cond)
		{
	     exitdo();
		}
	 }
	}
      else 
		 putback();
}

void CIMPUBasicView::exec_loop()//关键字loop
{
	get_token();
    if(token_type==COMMAND)
	{
	 CString str1 = "while";
	 CString str2 = "until";
	 CString str = CString(token);
	 int i=str.CompareNoCase(str1);
	 int j=str.CompareNoCase(str2);
	 if(i==0)//do-loopwhile
	 {
        int x,y,cond;
	    get_exp(&x);
	    get_token();
        CString str1,str2;
	    str1=CString(token);
	    get_exp(&y);
        cond=get_rel(x,str1,y);
    	if(!cond)
		{
		 dpop();
		 find_eol();
		}
		else
			prog=dpop();
	 }
	 if(j==0)//do-loopuntil
	 {
		 int x,y,cond;
	    get_exp(&x);
	    get_token();
        CString str1,str2;
	    str1=CString(token);
	    get_exp(&y);
		cond=get_rel(x,str1,y);
    	if(cond)
		{
	     dpop();
		 find_eol();
		}
		else 
			prog=dpop();
	 }
	}
      else 
	  {
		  putback();
          prog=dpop();
	  }
}

void CIMPUBasicView::exitdo()//关键字exitdo
{
    findloop();
	find_eol();
}

void CIMPUBasicView::dpush(char *s)//do入栈
{
 dstack1.AddTail(s);
}

char * CIMPUBasicView::dpop()//do出栈
{
  if(dstack1.IsEmpty())
	{
		Error(16);
		return "";}
	else
	{
	char *q=(char *)dstack1.RemoveTail();
	return q;
	}
}

void CIMPUBasicView::findloop()//查找loop
{
   CString str,str1;
   str1 = "loop";
   int i=1;
   do
   {
	 get_token();
	 if(token_type==COMMAND)
	 {
	  if(tok==FINISHED)
	  {
		 Error(17);
		 break;
	  }
	   else
	   {
         str = CString(token);
         i=str.CompareNoCase(str1);
	   }
	 }
   }while(i!=0);
  dpop();  
}
void CIMPUBasicView::exec_select()//关键字select
{
	get_token();
	CString str1 = "case",str2 = "endselect",str3 = "TRUE";
	CString str = CString(token);
	int i = str.CompareNoCase(str1);
	if(i!=0) 
	{
		Error(0);
		return;
	}
	get_token();
	if(token_type!=VARIABLE)
	{
		Error(0);
		return;
	}
	else
	{
		putback();
		int x;
		get_exp(&x);
		casenode *p = new casenode;
		p->n=x;
		spush(p);
	    cpush(str3);
		gonextcase();
	}
}

void CIMPUBasicView::exec_case()//关键字case
{
	int p,cond;
	CString str = getctop();
	CString str1 = "TRUE";
	int i=str.CompareNoCase(str1);
	if(i==0)
	{
	  int x;
	  get_token();
	  if(token_type==COMMAND)
	  {
		  int j=CString(token).CompareNoCase("else");
		  int m=CString(token).CompareNoCase("is");
		  if(m==0)
		  {
			  get_token();
			  CString str3 = CString(token);
			  get_exp(&x);
			  cond=get_rel(getstop(),str3,x);
			  if(cond==1)
			  {
				  cpop();
		          CString str2 = "FALSE";
		         cpush(str2);
			  }
				  else
				  gonextcase();
		  }
		  else 
		  {
		     if(j!=0)
			    Error(0);
		          else 
			      return;
		  }
	  }
	  else
	  {
		putback();
	    get_exp(&x);
		get_token();
		if(tok==TO)
		{
			int z;
			get_exp(&z);
			if((getstop()>=x)&&(getstop()<=z))
			{
              cpop();
		      CString str2 = "FALSE";
		     cpush(str2);
			}
			else
                gonextcase();
		}
			else
			{
				putback();
		        p=getstop();		
		        if(x!=p)
		          gonextcase();
         	        else
					{
	                  cpop();
		              CString str2 = "FALSE";
		              cpush(str2);
					}
			}
		}
	  }
	    else
         gonextcase();
  }

void CIMPUBasicView::gonextcase()//寻找下一个case or endselect
{
	int i=1,j=1;
	CString str1 = "case",str2 = "endselect";
    do
    {
     get_token();
     CString str = CString(token);
     i = str.CompareNoCase(str1);
	 j = str.CompareNoCase(str2);
    }while(i!=0&&j!=0);
	putback();

}

void CIMPUBasicView::endselect()//关键字caseselect
{
  spop();
  cpop();
}


void CIMPUBasicView::spush(casenode *s)//select入栈
{
    	slestack1.AddTail(s);
		
}

void CIMPUBasicView::spop()//select出栈
{
  if(slestack1.IsEmpty())
	{
		Error(18);
	}
	else
	{
	casenode *str = (casenode *)slestack1.RemoveTail();
		}
}

int CIMPUBasicView::getstop()//取select栈顶元素
{
 if(slestack1.IsEmpty())
	{
		Error(18);
		return 0;
	}
	else
	{
	casenode *str = (casenode *)slestack1.GetTail();
        
	return str->n;
	}
}

void CIMPUBasicView::cpush(CString s)//case入栈
{
  casestack1.AddTail(s);
}

void CIMPUBasicView::cpop()//case出栈
{
  if(casestack1.IsEmpty())
	{
		Error(18);
	}
	else
	{
	CString str = (CString)casestack1.RemoveTail();
	}
}

CString CIMPUBasicView::getctop()//取case栈顶元素
{
 if(casestack1.IsEmpty())
	{
		Error(18);
		return "FALSE";
	}
	else
	{
	CString str = (CString)casestack1.GetTail();
	return str;
	}
}

void CIMPUBasicView::findeolelse()//寻找小if的else或结尾
{
	 CString str,str1;
     str1 = "else";
     int i=1,j=1;
     do
	 {
	 get_token();
	 if(tok==FINISHED)
	  {
		 Error(15);
		 break;
	  }
	   else
	   {
		   if(token_type==COMMAND)
		   {
            str = CString(token);
            i=str.CompareNoCase(str1);
		   }
	   }
	 }while((i!=0)&&*token!='\r');
 putback();
}

int CIMPUBasicView::get_rel(int x, CString op, int y)//关系运算
{
	int cond=0,oper=0; 
	int i1=op.CompareNoCase("<");
	int i2=op.CompareNoCase(">");
	int i3=op.CompareNoCase("=");
	int i4=op.CompareNoCase(">=");
	int i5=op.CompareNoCase("<=");
	int i6=op.CompareNoCase("<>");
	if(i1==0)
		oper=1;
	 else if(i2==0)
		     oper=2;
	        else if(i3==0)
	            	oper=3;
                	else if(i4==0)
		                    oper=4;
	                        else if(i5==0)
	                               	oper=5;
	                             else if(i6==0)
		                                 oper=6;
								       else 
									   {
										   oper=0;
										   Error(0);
									   }
   switch(oper)
   {
	case 1:
		if(x<y)cond=1;	break;
	case 2:
		if(x>y)cond=1;	break;
	case 3:
		if(x==y)cond=1;	break;
	case 4:
		if(x>=y)cond=1;	break;
	case 5:
		if(x<=y)cond=1;	break;
	case 6:
		if(x!=y)cond=1;	break;
	default: cond=0;
	} 
   return cond;
}

void CIMPUBasicView::exec_stop()//关键字stop
{
  CStopDlg dlg(val_Edit1);
  dlg.DoModal();
}

void CIMPUBasicView::exec_on()//关键字on-goto/gosub
{
   int x,i,j,p,m=1;
  CString str = "goto";
  CString str1 = "gosub";
  get_exp(&x);
  if(x<1)
	  find_eol();
  else
  {
  get_token();
  j=CString(token).CompareNoCase(str);
  p=CString(token).CompareNoCase(str1);
  if(j==0)//on-goto
  {
    for(i=0;(i<2*x-1);i++)
	{
	  get_token();
	   if(tok==FINISHED||*token=='\r')
	  {
		 m=0;
		 break;
	  }
	}
   if(m!=0)
   {
	  putback();
	  exec_goto();
   }
  }
  else if(p==0)//on-gosub
	  {
       for(i=0;(i<2*x-1);i++)
	   {
	     get_token();
	     if(tok==FINISHED||*token=='\r')
		 {
		   m=0;
		   break;
		 }
	   }
       if(m!=0)
	   {
	     putback();
	     gosub();
	   }
    }
    else        
	  return;
  }
}

int CIMPUBasicView::get_logic(int x, CString op, int y)
{
	int cond=0,oper=0; 
	int i1=op.CompareNoCase("and");
	int i2=op.CompareNoCase("or");
	int i3=op.CompareNoCase("not");
	if(i1==0)
		oper=1;
	 else if(i2==0)
		     oper=2;
	        else if(i3==0)
	            	oper=3;
                      else 
						 {
						 oper=0;
						 Error(0);
						}
   switch(oper)
   {
	case 1:
		if((x!=0)&&(y!=0))cond=1;	break;
	case 2:
		if((x!=0)||(y!=0))cond=1;	break;
	case 3:
		if(y==0)cond=1;	break;
	default: cond=0;
	} 
   return cond;
}

int CIMPUBasicView::get_logic1(CString op, int y)
{
	int cond=0,oper=0; 
	int i=op.CompareNoCase("not");
	if(i==0)
		if(y==0)
			cond=1;
		return cond;
}


void CIMPUBasicView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int i=80;
	CMainFrame *pm=(CMainFrame *)AfxGetMainWnd();
	CStatusBar *psb = &pm->m_wndStatusBar;
	CString str,str1;
	if(psb)
	{
		str.Format("行:%d",point.y/20+1);
		str += "\t";
        str1.Format("列:%d",point.x/6+1);
		str += str1;
		psb->SetPaneText(psb->CommandToIndex(ID_INDICSTOR_ROW),str);
	}
	CEditView::OnMouseMove(nFlags, point);
}

⌨️ 快捷键说明

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