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

📄 myanylise.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			{
				line++;
			}
			else if(isYunsuan(w)||isFenge(w))
			{
				//ungetc(w,stdin);	
				index--;
			}
			name_count=0;
			
			CString str;
			str.Format("Error at line %d : %s is wrong!",line,word[word_count].name);
			MessageBox(AfxGetMainWnd()->m_hWnd,str,"错误!1",MB_OK);
			word[word_count].kind=-1;
			word_count++;	
		}
	}
	else if(w==' '||w=='\n'||w=='\t'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w==')'||w=='/'||w=='%')/*正确的整型数字*/
		  {			
		if(w=='\n')
		{
			line++;
		}
		else
		{
			//ungetc(w,stdin);	
			index--;
		}
				    word[word_count].name[name_count]='\0';
					name_count=0;
					word[word_count].kind=2;
					word[word_count].pointer=constant_count;
					strcpy(word[word_count].mark,"n");
					constant[constant_count].value=(float)tokenval;
					word_count++;				
					constant_count++;
					////cout<<"Report :  "<<tokenval<< " 是合法整型数字!"<<endl;	
					
		  }
		  else
		  {
			  while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&!isFenge(w))
			  {
				  word[word_count].name[name_count]=w;
				  name_count++;
				  w=PopChar();
			  }
			  if(w=='\n')
			  {
				  line++;
			  }
			  else
			  {
				  //ungetc(w,stdin);	
				  index--;
			  }
			  name_count=0;
			  ////cout<<"Error at line "<<line<<" : "<<word[word_count].name<<" is wrong!"<<endl;
			  word[word_count].kind=-1;
			  word_count++;
		  }
}
//*******************************************************************************************
void CMyAnylise::isSymbol(char w)
{	
	int i=0;

	//int aaaa = 0;//临时的识别空格数量的变量
	word[word_count].name[name_count]=w;
	name_count++;
	w=PopChar();
	while((isdigit(w))||(w>='a'&&w<='z')||(w>='A'&&w<='Z')||(w=='_'))
	{  
		word[word_count].name[name_count]=w;
		name_count++;	
		w=PopChar();
	}
	if(w==' '||w=='\n'||w=='\t'||isYunsuan(w)||isFenge(w))
	{
		if(w=='\n')
		{
			line++;
		}
		else
			//ungetc(w,stdin);//回退一个字符。
			index--;
		for(i=0;i<32;i++)
		{
			if(strcmp(word[word_count].name,key[i])==0)
			{
				name_count=0;
				word[word_count].kind=3;
				word[word_count].pointer=key_count;//关键字计数器
				if(strcmp(word[word_count].name,"CREATE")==0)
				{
					strcpy(word[word_count].mark,"c");
				}
				else if(strcmp(word[word_count].name,"TABLE")==0)
				{
					strcpy(word[word_count].mark,"t");
				}
				else if(strcmp(word[word_count].name,"INTEGER")==0||strcmp(word[word_count].name,"INT")==0)
				{
					strcpy(word[word_count].mark,"i");
				}
				else if(strcmp(word[word_count].name,"CHAR")==0||strcmp(word[word_count].name,"VARCHAR")==0)
				{
					strcpy(word[word_count].mark,"a");
				}
				else if(strcmp(word[word_count].name,"ALTER")==0)
				{
					strcpy(word[word_count].mark,"l");
				}
				else  if(strcmp(word[word_count].name,"ADD")==0)
				{
					strcpy(word[word_count].mark,"d");
				}
				else  if(strcmp(word[word_count].name,"DROP")==0)
				{
					strcpy(word[word_count].mark,"r");
				}
				else if(strcmp(word[word_count].name,"INDEX")==0)
				{
					strcpy(word[word_count].mark,"x");
				}
				else  if(strcmp(word[word_count].name,"VIEW")==0)
				{
					strcpy(word[word_count].mark,"v");
				}	
				else  if(strcmp(word[word_count].name,"SELECT")==0)
				{
					strcpy(word[word_count].mark,"s");
				}
				else if(strcmp(word[word_count].name,"FROM")==0)
				{
					strcpy(word[word_count].mark,"f");
				}
				else  if(strcmp(word[word_count].name,"WHERE")==0)
				{
					strcpy(word[word_count].mark,"w");
				}
				else if(strcmp(word[word_count].name,"AND")==0)
				{
					strcpy(word[word_count].mark,"a");
				}
				else  if(strcmp(word[word_count].name,"OR")==0)
				{
					strcpy(word[word_count].mark,"o");
				}
				else if(strcmp(word[word_count].name,"INSERT")==0)
				{
					strcpy(word[word_count].mark,"i");
				}
				else if(strcmp(word[word_count].name,"INTO")==0)
				{
					strcpy(word[word_count].mark,"t");
				}
				else  if(strcmp(word[word_count].name,"VALUES")==0)
				{
					strcpy(word[word_count].mark,"v");
				}
				else if(strcmp(word[word_count].name,"UPDATE")==0)
				{
					strcpy(word[word_count].mark,"u");
				}
				else  if(strcmp(word[word_count].name,"SET")==0)
				{
					strcpy(word[word_count].mark,"s");
				}
				else  if(strcmp(word[word_count].name,"DELETE")==0)
				{
					strcpy(word[word_count].mark,"d");
				} 
				else  if(strcmp(word[word_count].name,"GRANT")==0)
				{
					strcpy(word[word_count].mark,"a");
				}
				else if(strcmp(word[word_count].name,"REVOKE")==0)
				{
					strcpy(word[word_count].mark,"r");
				}
				else  if(strcmp(word[word_count].name,"ON")==0)
				{
					strcpy(word[word_count].mark,"o");
				}
				else  if(strcmp(word[word_count].name,"TO")==0)
				{
					strcpy(word[word_count].mark,"t");
				}						
				else if(strcmp(word[word_count].name,"AS")==0)
				{
					strcpy(word[word_count].mark,"a");
				}
				constant[constant_count].value=tokenfloat;
				word_count++;				
				key_count++;
				i=100;
				}
				}
				if(i==32)
				{   
					name_count=0;
					word[word_count].kind=1;
					word[word_count].pointer=symbol_count;
					strcpy(word[word_count].mark,"g");
					strcpy(symbol[symbol_count].name,word[word_count].name);
					word_count++;				
					symbol_count++;
				}
		   }
		   else
		   {		
			   while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&isFenge(w))
			   {
				   word[word_count].name[name_count]=w;
				   name_count++;
				   w=PopChar();
			   }
			   if(w=='\n')
			   {
				   line++;
			   }
			   else
				   //ungetc(w,stdin);
				   index--;
			   name_count=0;
			   
			   CString m_sAlert;
			   m_sAlert.Format("Error at line %d : %s is wrong!",line,word[word_count].name);
			   MessageBox(AfxGetMainWnd()->m_hWnd,m_sAlert,"错误!2",MB_OK);
			   
			   word[word_count].kind=-1;
			   word_count++;
		   }
}
//**********************************************************************************
void CMyAnylise::isOtherSymbol(char w)
{
	int i=0,j = 0;
	word[word_count].name[name_count]=w;name_count++; 
	for(i=0;i<20;i++)              //运算符识别.
	{
		if(w==yunsuanfu[i])
		{		
			char ch=w;
			w=PopChar();
			if((w=='&')||(w=='|')||(w=='=')||(w=='+')||(w=='-'))//对“==”“++”等分析;
			{
				if(ch==w)
				{
					word[word_count].kind=5;
					word[word_count].name[name_count]=w;name_count++;
					strcpy(word[word_count].mark,"r");
					word_count++;				
					name_count=0;
					i=-1;
					break;
				}
				if((ch=='!')&&(w=='='))
				{
					word[word_count].kind=5;
					word[word_count].name[name_count]=w;name_count++;
					strcpy(word[word_count].mark,"r");
					word_count++;				
					name_count=0;
					i=-1;
					break;
				}	
			}
			else if(w==' '||w=='\n'||w=='\t')
			{
				if(w=='\n')
				{
					line++;
				}
				name_count=0;
				word[word_count].kind=5;                   
				strcpy(word[word_count].mark,"r");
				word_count++;				
				i=-1;
				break;
			}
			else if(w=='<'||w=='>'||w=='*'||w=='/'||w=='%'||w=='!'||w=='~')//判断非法连续运算符错误;
			{
				word[word_count].name[name_count]=w;
				word[word_count].kind=-1;
				strcpy(word[word_count].mark,"r");
				name_count=0;
				i=-1;
				
				CString str;
				str.Format("Error at line %d : %s is wrong!",line,word[word_count].name);
				MessageBox(AfxGetMainWnd()->m_hWnd,str,"错误!3",MB_OK);
				break;
				//cout<<"Error at line "<<line<<" : "<<word[word_count].name<<" is wrong!"<<endl;	
			}
			else
			{
				//ungetc(w,stdin);
				index--;
				name_count=0;
				word[word_count].kind=5;
				strcpy(word[word_count].mark,"r");
				word_count++;//********前面没有++;				
				i=-1;//跳出循环;
				break;
			}
		}
	}
	if(i==20)//不是运算符再判断是否是界符;
	{
		for(j=0;j<20;j++)					//界符识别.
		{
			if(w==fengefu[j])					//		";,()'[]{}?";			
			{	
				name_count=0;
				word[word_count].kind=4;
				strcpy(word[word_count].mark,word[word_count].name);
				word_count++;//********前面没有++;				
				i=-1;
			}
		}
	}
	if((i==20)&&(j==20))
	{
		name_count=0;
		word[word_count].kind=-1;
		
		CString str;
		str.Format("Error at line %d : %s is wrong!",line,word[word_count].name);
		MessageBox(AfxGetMainWnd()->m_hWnd,str,"错误4!",MB_OK);
		
		word_count++;
	}
}
//*****************************************************************************************
void CMyAnylise::analyze()
{		  
	char input;
	
	input=PopChar();
	while(input!=';' && input!='\0')
	{
		if(input==' '||input=='\t')
			;
		else if(input=='\n')
			line=line+1;
		else if(isdigit(input))
			number(input);
		else if((input >= 'A' && input <= 'Z')||(input >= 'a'&&input <= 'z')||(input == '_'))//字符
			isSymbol(input);
		else  
			isOtherSymbol(input);
		input=PopChar();	
    }
}

void CMyAnylise::init()
{
	CheckCMDType = 0;//命令识别标志 复位

	CString str = "Compiling...........";
	CClientDC dc(
		((CFrameWnd*)AfxGetMainWnd())
		->GetActiveView()
		);
	
	CRect rect;
	GetClientRect(((CFrameWnd*)AfxGetMainWnd())->GetActiveView()->m_hWnd, &rect);
	dc.TextOut(0, rect.Height() - 20, "Compiling...........");

	if(strcmp(word[0].name,"CREATE")==0)
	{		
		if(strcmp(word[1].name,"VIEW")==0)
		{
			unit[0].n='G'; unit[0].t='s'; strcpy(unit[0].gen,"sAfNQ");
			unit[1].n='Q'; unit[1].t='w'; strcpy(unit[1].gen,"wW");
			unit[2].n='Q'; unit[2].t='$'; strcpy(unit[2].gen,"0");
			unit[3].n='A'; unit[3].t='r'; strcpy(unit[3].gen,"r");
			unit[4].n='A'; unit[4].t='g'; strcpy(unit[4].gen,"B");
			unit[5].n='B'; unit[5].t='g'; strcpy(unit[5].gen,"gM");
			unit[6].n='M'; unit[6].t=','; strcpy(unit[6].gen,",B");
			unit[7].n='M'; unit[7].t='.'; strcpy(unit[7].gen,".gD");
			unit[8].n='M'; unit[8].t='f'; strcpy(unit[8].gen,"0");
			unit[9].n='M'; unit[9].t='$'; strcpy(unit[9].gen,"0");
			unit[10].n='D'; unit[10].t=','; strcpy(unit[10].gen,",B");
			unit[11].n='D'; unit[11].t='f'; strcpy(unit[11].gen,"0");
			unit[12].n='D'; unit[12].t='$'; strcpy(unit[12].gen,"0");
			unit[13].n='F'; unit[13].t='w'; strcpy(unit[13].gen,"0");
			unit[14].n='F'; unit[14].t=','; strcpy(unit[14].gen,",N");
			unit[15].n='F'; unit[15].t='$'; strcpy(unit[15].gen,"0");
			unit[16].n='W'; unit[16].t='g'; strcpy(unit[16].gen,"gZ");
			unit[17].n='W'; unit[17].t='('; strcpy(unit[17].gen,"(W)K");
			unit[18].n='K'; unit[18].t='a'; strcpy(unit[18].gen,"aW");
			unit[19].n='K'; unit[19].t='o'; strcpy(unit[19].gen,"oW");
			unit[20].n='Z'; unit[20].t='.'; strcpy(unit[20].gen,".gU");
			unit[21].n='Z'; unit[21].t='r'; strcpy(unit[21].gen,"rY");
			unit[22].n='Y'; unit[22].t='\''; strcpy(unit[22].gen,"'g'K");
			unit[23].n='Y'; unit[23].t='n'; strcpy(unit[23].gen,"nK");
			unit[24].n='N'; unit[24].t='g'; strcpy(unit[24].gen,"gF");
			unit[25].n='U'; unit[25].t='r'; strcpy(unit[25].gen,"rR");
			unit[26].n='R'; unit[26].t='\''; strcpy(unit[26].gen,"'g'K");
			unit[27].n='R'; unit[27].t='n'; strcpy(unit[27].gen,"nK");
			unit[28].n='K'; unit[28].t='$'; strcpy(unit[28].gen,"0");
			unit[29].n='K'; unit[29].t=')'; strcpy(unit[29].gen,"0");
			unit[30].n='E'; unit[30].t='c'; strcpy(unit[30].gen,"cvgaG");
			count=31;

			return;
		}
		unit[0].n='E'; unit[0].t='c'; strcpy(unit[0].gen,"ctg(F)");
		unit[1].n='F'; unit[1].t='g'; strcpy(unit[1].gen,"gW");
		unit[2].n='W'; unit[2].t='a'; strcpy(unit[2].gen,"a(n)Q");
		unit[3].n='W'; unit[3].t='i'; strcpy(unit[3].gen,"iP");
		unit[4].n='Q'; unit[4].t=','; strcpy(unit[4].gen,",F");
		unit[5].n='Q'; unit[5].t='$'; strcpy(unit[5].gen,"0");
		unit[6].n='P'; unit[6].t=','; strcpy(unit[6].gen,",F");
		unit[7].n='P'; unit[7].t='$'; strcpy(unit[7].gen,"0");
		unit[8].n='Q'; unit[8].t=')'; strcpy(unit[8].gen,"0");
		unit[9].n='P'; unit[9].t=')'; strcpy(unit[9].gen,"0");
		count=10;

	}	
	else if(strcmp(word[0].name,"ALTER")==0)
	{
		count=6;
		unit[0].n='E'; unit[0].t='l'; strcpy(unit[0].gen,"ltgW");
		unit[1].n='F'; unit[1].t='g'; strcpy(unit[1].gen,"gH");
		unit[2].n='H'; unit[2].t='a'; strcpy(unit[2].gen,"a(n)");

⌨️ 快捷键说明

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