📄 grammeranalyzeview.cpp
字号:
||(str[0]>=97&&str[0]<=122)||(str[0]>=48&&str[0]<=57)))
{
strcat(str,"非法定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
continue;
}
t1=keyWord(str);//判断是否为保留字
if(t1==0)
t2=Identifier(str);//判断是否为合法标识符
if(t2==-1)
t3=digit(str);//判断是否为合法数字
}
}//end else
}//end while
app->error_list.InsertItem(error,"Budilding is complete");
error++;
}
int CGrammerAnalyzeView::keyWord(char *str)
{
CGrammerAnalyzeApp*app=(CGrammerAnalyzeApp*)AfxGetApp();
if(str[0]=='#')//为#include
{
app->word_list.InsertItem(word,"#include");
app->word_list.SetItemText(word,1,"8");
app->word_list.SetItemText(word,2,"文件包含");
word++;
int i=1;
int j;
char filename[20];
while(str[i]!='e')
i++;
i=i+2;
j=i;
int k=j-1;
while(str[j])
{
j++;
k++;
}//找到文件名
str[k]='\0';
strcpy(filename,str+i);
app->word_list.InsertItem(word,filename);
app->word_list.SetItemText(word,1,"14");
app->word_list.SetItemText(word,2,"文件名");
word++;
flag=-1;
return 8;
}
else if(str[0]=='i')
{
if(strcmp(str,"int")==0)
{
flag=2;//标识是否正在定义
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"int")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"2");
app->word_list.SetItemText(word,2,"整形保留字");
word++;
}
return 2;
}
if(strcmp(str,"if")==0)
{
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"if")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"6");
app->word_list.SetItemText(word,2,"if判断");
word++;
}
flag=-1;
return 6;
}
}
else if(str[0]=='f')
{
if(strcmp(str,"float")==0)
{
flag=3;
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"float")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"3");
app->word_list.SetItemText(word,2,"浮点型保留字");
word++;
}
return 2;
}
}
else if(str[0]=='c')
{
if(strcmp(str,"char")==0)
{
flag=9;
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"char")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"9");
app->word_list.SetItemText(word,2,"字符型保留字");
word++;
}
return 9;
}
}
else if(str[0]=='v')
{
if(strcmp(str,"void")==0)
{
flag=4;
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"void")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"4");
app->word_list.SetItemText(word,2,"空类型保留字");
word++;
}
return 9;
}
}
else if(str[0]=='m')
{
if(strcmp(str,"main")==0)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"1");
app->word_list.SetItemText(word,2,"main函数名");
word++;
flag=-1;
return 1;
}
}
else if(str[0]=='r')
{
if(strcmp(str,"return")==0)
{
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"return")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"8");
app->word_list.SetItemText(word,2,"返回关键字");
word++;
}
flag=-1;
return 5;
}
}
else if(str[0]=='e')
{
if(strcmp(str,"else")==0)
{
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"else")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"7");
app->word_list.SetItemText(word,2,"else判断");
word++;
}
flag=-1;
return 5;
}
}
else if(str[0]=='"')//找到%d,%f
{
char mystr[20];
strcpy(mystr,str+1);
int j=1;
int k=j-1;
while(mystr[j])
{
j++;
k++;
}
mystr[k]='\0';
if(strcmp(mystr,"%d")==0)
{
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"%d")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,"%d");
app->word_list.SetItemText(word,1,"10");
app->word_list.SetItemText(word,2,"整形控制符");
word++;
}
flag=-1;
return 10;
}
if(strcmp(mystr,"%f")==0)
{
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,"%f")==0)
break;
}
if(i==word)
{
app->word_list.InsertItem(word,"%f");
app->word_list.SetItemText(word,1,"f");
app->word_list.SetItemText(word,2,"浮点型控制符");
word++;
}
flag=-1;
return 10;
}
}
return 0;//非关键字
}
int CGrammerAnalyzeView::Identifier(char *str)//识别标志符
{
CGrammerAnalyzeApp*app=(CGrammerAnalyzeApp*)AfxGetApp();
bool ischar=true;
if((str[0]>=48&&str[0]<=57))
return -1;//进行数字处理
if(str[0]=='_'||(str[0]>=60&&str[0]<=90)||(str[0]>=97&&str[0]<=122))//合法定义
{
int i=1;
while(str[i])
{
if(str[i]=='_'||(str[i]>=65&&str[i]<=90)||(str[i]>=97&&str[i]<=122)
||(str[i]>=48&&str[i]<=57))
{
i++;
}
else
{
strcat(str,"非法定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
flag=-1;
return 1;//不合法定义
}
}
}
else
{
flag=-1;
return 1;
}
bool exist=false;
for(int i=0;i<word;i++)
{
CString find=app->word_list.GetItemText(i,0);
if(strcmp(find,str)==0)
{
exist=true;
break;
}
}
if(exist&&flag!=-1)//重定义
{
strcat(str,"重定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
flag=-1;
return 1;
}
if(!exist&&flag==-1)//没定义
{
for(int j=0;j<word;j++)
{
CString find=app->word_list.GetItemText(j,0);
if(strcmp(find,"stdio.h")==0)
break;
}
if(j==word)
{
strcat(str,"没定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
flag=-1;
return 1;
}
else
{
if(strcmp(str,"printf")!=0&&strcmp(str,"scanf")!=0)
{
strcat(str,"没定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
flag=-1;
return 1;
}
}
}
for(int k=0;k<word;k++)//加入到表中
{
CString find=app->word_list.GetItemText(k,0);
if(strcmp(find,str)==0)
{
break;
}
}
if(k==word)
{
switch(flag)
{
case 2:
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"14");
app->word_list.SetItemText(word,2,"整型标志符");
word++;
break;
case 3:
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"14");
app->word_list.SetItemText(word,2,"浮点型标志符");
word++;
break;
case 4:
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"14");
app->word_list.SetItemText(word,2,"空型标志符");
word++;
break;
case 9:
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"14");
app->word_list.SetItemText(word,2,"字符型标志符");
word++;
break;
}
}
flag=-1;
return 1;//正确
}
int CGrammerAnalyzeView::digit(char *str)//判断是否为数字
{
CGrammerAnalyzeApp*app=(CGrammerAnalyzeApp*)AfxGetApp();
if(!(str[0]>=48&&str[0]<=57))
return -1;
int i=1;
while(str[i])
{
if(str[i]=='.'||(str[i]>=48&&str[i]<=57))
{
i++;
}
else
{
strcat(str,"非法定义");
for(int i=0;i<error;i++)
{
CString find=app->error_list.GetItemText(i,0);
if(strcmp(find,str)==0)
break;
}
if(i==error)
{
app->error_list.InsertItem(error,str);
error++;
}
flag=-1;
return -2;
}
}
for(int k=0;k<word;k++)//加入到表中
{
CString find=app->word_list.GetItemText(k,0);
if(strcmp(find,str)==0)
{
break;
}
}
if(k==word)
{
app->word_list.InsertItem(word,str);
app->word_list.SetItemText(word,1,"12");
app->word_list.SetItemText(word,2,"数字");
word++;
}
flag=-1;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -