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

📄 myanylise.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		unit[3].n='H'; unit[3].t='i'; strcpy(unit[3].gen,"i");
		unit[4].n='W'; unit[4].t='d'; strcpy(unit[4].gen,"dF");
		unit[5].n='W'; unit[5].t='r'; strcpy(unit[5].gen,"rF");

	}
	else if(strcmp(word[0].name,"DROP")==0)
	{
		count=4;
		unit[0].n='E'; unit[0].t='r'; strcpy(unit[0].gen,"rW");
		unit[1].n='W'; unit[1].t='t'; strcpy(unit[1].gen,"tg");
		unit[2].n='W'; unit[2].t='x'; strcpy(unit[2].gen,"xg");
		unit[3].n='W'; unit[3].t='v'; strcpy(unit[3].gen,"vg");

	}
	else if(strcmp(word[0].name,"SELECT")==0)
	{
		count=30;
		unit[0].n='E'; 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");//后补的;

	}
    else if(strcmp(word[0].name,"INSERT")==0)
	{
		count=16;
		unit[0].n='E'; unit[0].t='i'; strcpy(unit[0].gen,"itgW");
		unit[1].n='W'; unit[1].t='v'; strcpy(unit[1].gen,"K");
		unit[2].n='W'; unit[2].t='('; strcpy(unit[2].gen,"(G)K");
		unit[3].n='G'; unit[3].t='g'; strcpy(unit[3].gen,"gM");
        unit[4].n='M'; unit[4].t=','; strcpy(unit[4].gen,",G");
		unit[5].n='M'; unit[5].t='$'; strcpy(unit[5].gen,"0");
		unit[6].n='M'; unit[6].t=')'; strcpy(unit[6].gen,"0");
		unit[7].n='F'; unit[7].t='\''; strcpy(unit[7].gen,"'g'H");
		unit[8].n='F'; unit[8].t='n'; strcpy(unit[8].gen,"nQ");
		unit[9].n='H'; unit[9].t='$'; strcpy(unit[9].gen,"0");
		unit[10].n='H'; unit[10].t=')'; strcpy(unit[10].gen,"0");
		unit[11].n='H'; unit[11].t=','; strcpy(unit[11].gen,",F");
		unit[12].n='Q'; unit[12].t=','; strcpy(unit[12].gen,",F");
		unit[13].n='Q'; unit[13].t='$'; strcpy(unit[13].gen,"0");
        unit[14].n='Q'; unit[14].t=')'; strcpy(unit[14].gen,"0");
		unit[15].n='K'; unit[15].t='v'; strcpy(unit[15].gen,"v(F)");

	}   
	else if(strcmp(word[0].name,"UPDATE")==0)
	{
		count=15;
		unit[0].n='E'; unit[0].t='u'; strcpy(unit[0].gen,"ugsFwW");
		unit[1].n='F'; unit[1].t='g'; strcpy(unit[1].gen,"grH");
		unit[2].n='H'; unit[2].t='\''; strcpy(unit[2].gen,"'g'T");
		unit[3].n='H'; unit[3].t='n'; strcpy(unit[3].gen,"nT");
        unit[4].n='T'; unit[4].t='$'; strcpy(unit[4].gen,"0");
		unit[5].n='T'; unit[5].t=','; strcpy(unit[5].gen,",F");
		unit[6].n='W'; unit[6].t='('; strcpy(unit[6].gen,"(W)Z");
		unit[7].n='W'; unit[7].t='g'; strcpy(unit[7].gen,"grK");
		unit[8].n='K'; unit[8].t='\''; strcpy(unit[8].gen,"'g'Z");
		unit[9].n='K'; unit[9].t='n'; strcpy(unit[9].gen,"nZ");
		unit[10].n='Z'; unit[10].t='a'; strcpy(unit[10].gen,"aW");
		unit[11].n='Z'; unit[11].t='o'; strcpy(unit[11].gen,"oW");
		unit[12].n='Z'; unit[12].t=')'; strcpy(unit[12].gen,"0");
		unit[13].n='Z'; unit[13].t='$'; strcpy(unit[13].gen,"0");
		unit[14].n='T'; unit[14].t='w'; strcpy(unit[14].gen,"0");

	}
	else if(strcmp(word[0].name,"DELETE")==0)
	{
		count=9;
		unit[0].n='E'; unit[0].t='d'; strcpy(unit[0].gen,"dfgwW");
		unit[1].n='W'; unit[1].t='('; strcpy(unit[1].gen,"(W)Z");
		unit[2].n='W'; unit[2].t='g'; strcpy(unit[2].gen,"grK");
		unit[3].n='K'; unit[3].t='\''; strcpy(unit[3].gen,"'g'Z");
		unit[4].n='K'; unit[4].t='n'; strcpy(unit[4].gen,"nZ");
		unit[5].n='Z'; unit[5].t='a'; strcpy(unit[5].gen,"aW");
		unit[6].n='Z'; unit[6].t='o'; strcpy(unit[6].gen,"oW");
		unit[7].n='Z'; unit[7].t=')'; strcpy(unit[7].gen,"0");
		unit[8].n='Z'; unit[8].t='$'; strcpy(unit[8].gen,"0");

	}
	else if(strcmp(word[0].name,"GRANT")==0||strcmp(word[0].name,"REVOKE")==0)
	{
		
		unit[0].n='E'; unit[0].t='a'; strcpy(unit[0].gen,"aAogtU");
		unit[1].n='E'; unit[1].t='r'; strcpy(unit[1].gen,"rAogfU");
		unit[2].n='A'; unit[2].t='g'; strcpy(unit[2].gen,"gP");
		unit[3].n='P'; unit[3].t='$'; strcpy(unit[3].gen,"0");
		unit[4].n='P'; unit[4].t='o'; strcpy(unit[4].gen,"0");
		unit[5].n='P'; unit[5].t=','; strcpy(unit[5].gen,",A");
		unit[6].n='U'; unit[6].t='g'; strcpy(unit[6].gen,"gQ");
		unit[7].n='Q'; unit[7].t=','; strcpy(unit[7].gen,",U");
		unit[8].n='Q'; unit[8].t='$'; strcpy(unit[8].gen,"0");
		count=9;
	}	
}
//******************************************

//********************************************
void CMyAnylise::SETNULL(seqstack *s1)    //置空
{
	s1->top=-1;
}
//*********************************************
int CMyAnylise::EMPTY(seqstack *s1)//判断栈是否为空
{
	return (s1->top>=0)?FALSE:TRUE;
}
//***********************************************
void CMyAnylise::PUSH(seqstack *s1,char y)   //入栈
{
	if(s1->top==MAXSIZE-1)
    {
		AfxMessageBox("栈上溢出");
	}
	else
    {
		s1->top++;
		s1->data[s1->top]=y;
    }
}
//***************************************
void CMyAnylise::POP(seqstack *s1)//退栈
{
    if(EMPTY(s1))
	{
		printf("栈下溢出");
	}
    else
	{
		s1->top--;
	}
}
void CMyAnylise::find()///查找分析表;
{
	int i=0;
	for(i=0;i<count;i++)
	{
		if(stack.data[stack.top]==unit[i].n)
		{
			if(input.data[input.top]==unit[i].t)
			{
				loc=i;
				error=0;
				break;
			}
		}
	}
//	if(i == 0)
//		error = 2;
//	else 
		if(i == count)
	{
		error=1;
	}
}
//******************************************************************************
void CMyAnylise::reverseOut()//输出两个栈的元素。将第二个栈的元素倒置输出。
{
	char ch[70];
	int i=0;
	stack.data[stack.top+1]='\0';
	
	for(int j=input.top;j>=0;j--)
	{
		ch[i]=input.data[j];
		i++;
	}
	ch[i]='\0';
}
//******************************************************************************
void CMyAnylise::clean()///将各个表初始化为最初状态;
{
	word_count=0;
	symbol_count=0;
	constant_count=0;
	name_count=0;
	key_count=0;
	for(int i=0;i<MAXSIZE;i++)
	{
		unit[i].n='\0';
		unit[i].t='\0';
		for(int m=0;m<10;m++)
		{
			unit[i].gen[m]='\0';
		}
	}
	memset(ch,0,MAXSIZE);
	memset(name,0,10);
	
	for(int k=0;k<100;k++)
	{
		for(int w=0;w<10;w++)
		{
			word[k].name[w]='\0';
			symbol[k].name[w]='\0';
		}
	}
}
//****************************************************************************************
int CMyAnylise::grammer()
{
	init();
	int i=0;
	char save_stack;
	CString sign,save_input;
	SETNULL(&input);
    SETNULL(&stack);
	PUSH(&stack,'$');
	PUSH(&stack,'E');
	PUSH(&input,'$');
	for(int j=(word_count-1);j>=0;j--)
	{
		ch[i]=word[j].mark[0];////////////倒置过程
		i++;
	}
	ch[i]='\0';/////
	i=0;
	while(i<word_count)
	{
		PUSH(&input,ch[i]);
		i++;
	}
	save_stack=' ';///
	save_input="   ";///
	while(stack.data[stack.top]!='$'||input.data[input.top]!='$')
	{ 
		if(stack.data[stack.top]==input.data[input.top])
		{
			reverseOut();
			POP(&stack);
			POP(&input);
			save_stack=' ';
			save_input="   ";
		}
		else                                  //栈顶不相同的情况
		{	
			find();
			if(error==0)
			{
                reverseOut();
				save_stack=stack.data[stack.top];//为下一次输出准备;
				sign="->";
				save_input=unit[loc].gen;
				POP(&stack);//推出空 或是 非空都要出栈;
				if(strcmp(unit[loc].gen,"0")!=0)//推出非空时,将推出元素倒置入栈。
				{	
					i=-1;
					while(unit[loc].gen[i+1]!='\0')
					{
						i++;
					}
					for(int j=i;j>=0;j--)
					{
						PUSH(&stack,unit[loc].gen[j]);
					}
				}			
			}
			else//错误情况;
				break;
		}
	}
	////////特别处理select * from t.a=m.b;
	if(error == 1)
	{
		int mk,f;
		mk = 0;
		f = 0;

		while(strcmp(word[mk].name, ";") != 0)
		{
			if(strcmp(word[mk].name, "WHERE") ==0){
				f = 1;
			}
			if(f == 1 && strcmp(word[mk].name, ".") ==0)
			{
				if((strcmp(word[mk+2].name, "=") ==0) && (strcmp(word[mk+4].name, ".") ==0)){
							count_success++;
							CString m_Salert;
							m_Salert.Format("本次语法分析成功!!! - %d error(s), %d success(es)",count_false,count_success);
							OutputAnylistResult(m_Salert);
							ChekcCMD(word);
							makeCMDLine();
					return true;
				}
			}
			mk++;
		}
	}
	////////
	if(error==0)
	{
		//cout<<"$                                                                   $ "<<save_stack<<sign<<save_input<<endl;
		
		//MessageBox(AfxGetMainWnd()->m_hWnd,"本次语法分析成功!!!","正确!",MB_OK);
		count_success++;
		CString m_Salert;
		m_Salert.Format("本次语法分析成功!!! - %d error(s), %d success(es)",count_false,count_success);
		OutputAnylistResult(m_Salert);
		ChekcCMD(word);
		makeCMDLine();
		return true;
		//cout<<"语法分析成功!!!"<<endl<<"                      ^_^"<<endl<<"-------------------------------------------"<<endl;
	//	clean();
	}
	else
	{
		error=0;
		//		MessageBox(AfxGetMainWnd()->m_hWnd,"语法分析错误!!!","错误!",MB_OK);
		count_false++;
		CString m_Salert;
		m_Salert.Format("本次语法分析失败!!! - %d error(s), %d success(es)",count_false,count_success);
		OutputAnylistResult(m_Salert);
		return false;
		//cout<<"语法错误!!!"<<endl<<endl<<"-----------------------------------------------"<<endl;
      //  clean();
	}
}
//**********************************************************************************
void CMyAnylise::go()
{  
		analyze();
		if(grammer())// symbol:1   constant:2  key:3   界符:4  运算符:5   wrong:-1
		{
			ChekcCMD(word);//检查命令种类
			CDBControl control(m_str, word, len);//语义处理
			control.CheckCMD(CheckCMDType);//语义 核对命令种类
		}	
		
		clean();
//		Sleep(600);
}
//***********************************************************************************

void CMyAnylise::OutputAnylistResult(CString str)
{
	CClientDC dc(
		((CFrameWnd*)AfxGetMainWnd())->GetActiveView()
		);
	dc.SetTextColor(RGB(255,255,255));
	dc.TextOut(0,0,"AAA",100);
	dc.SetTextColor(RGB(0,0,0));
	dc.TextOut(0,0,str);
}

void CMyAnylise::ComplingOutPut(CPoint &pt, CString output_str)
{
	CClientDC dc(
		((CFrameWnd*)AfxGetMainWnd())->GetActiveView()
		);
	dc.TextOut(pt.x, pt.y, output_str);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	pt.y += tm.tmHeight;
}

void CMyAnylise::ChekcCMD(Word word1[])
{
	if(strcmp(word1[0].name, "CREATE") ==0)
	{
		if(strcmp(word1[1].name, "VIEW") ==0)
			CheckCMDType = CREATE_VIEW;
		else if(strcmp(word1[1].name, "TABLE") ==0)
			CheckCMDType = CREATE_TABLE;
		else if(strcmp(word1[1].name, "INDEX") ==0)
			CheckCMDType = CREATE_INDEX;
	}
	else if(strcmp(word1[0].name, "DROP") ==0)
	{
		if(strcmp(word1[1].name, "VIEW") ==0)
			CheckCMDType = DROP_VIEW;
		else if(strcmp(word1[1].name, "TABLE") ==0)
			CheckCMDType = DROP_TABLE;
		else if(strcmp(word1[1].name, "INDEX") ==0)
			CheckCMDType = DROP_INDEX;
	}
	else if(strcmp(word1[0].name, "SELECT") ==0)
		CheckCMDType = SELECT;
	else if(strcmp(word1[0].name, "GRANT") ==0)
		CheckCMDType = GRANT;
	else if(strcmp(word1[0].name, "REVOKE") ==0)
		CheckCMDType = REVOKE;
	else if(strcmp(word1[0].name, "INSERT") ==0)
		CheckCMDType = INSERT;
	else if(strcmp(word1[0].name, "UPDATE") ==0)
		CheckCMDType = UPDATE;
	else if(strcmp(word1[0].name, "DELETE") ==0)
		CheckCMDType = DELETE;
	else if(strcmp(word1[0].name, "ALTER") ==0)
		CheckCMDType = ALTER;
}

void CMyAnylise::makeCMDLine()
{
	int i = 0;
	m_str.Empty();
	while(word[i].name[0] != 0)
	{
		m_str += word[i].name;
		m_str += " ";
		i++;
	}
	len = i;
//	AfxMessageBox(m_str);
}

⌨️ 快捷键说明

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