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