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

📄 grammeranalyzeview.cpp

📁 这是一个司法分析程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					||(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 + -