📄 myanylise.cpp
字号:
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 + -