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

📄 data.h

📁 数据库模拟程序 实现控制台命令词法分析
💻 H
📖 第 1 页 / 共 2 页
字号:
//#include<iostream.h>
//#include<ctype.h>
//#include<fstream.h>
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string>
//#include<string.h>
#include<iomanip>
#include "MyAnylise.h"

using namespace std;


//*******************************************************************************
int CMyAnylise::judgeYunsuan(char a)
{
   for(int i=0;i<20;i++)
   {
        if(a==yunsuanfu[i])
		{
		      i=100;
		}
   }
   if(i==20)
   {
		return 0;
   }
   else
	   return 1;
}
int CMyAnylise::isFenge(char a)
{
   for(int i=0;i<20;i++)
   {
        if(a==fengefu[i])
		{	 
			i=100;
		}
   }
   if(i==20)
   {
		return 0;
   }
   else
	   return 1;
}

void CMyAnylise::number(char w)
{		
	       wordlist[wordlist_count].name[name_count]=w;name_count++;
           tokenval=w-'0';   
	       w=PopChar();
	       while(isdigit(w))/*整型数字处理*/
		   {  
			  wordlist[wordlist_count].name[name_count]=w;name_count++;	
              tokenval=tokenval*10+w-'0';
	          w=PopChar();
	       }
		//	wordlist[wordlist_count].mark[0]='n';///做记号;
	       if(w=='.')/*浮点型数字处理*/
	          {    
			       wordlist[wordlist_count].name[name_count]=w;name_count++;	
				   w=PopChar();
				   int i=0;
		           while(isdigit(w))/*在数字范围内*/
 	               { 
					  wordlist[wordlist_count].name[name_count]=w;name_count++;
					  tokenval=tokenval*10+w-'0';
					  i++;
	                  w=PopChar();
	               }
	               if(w==' '||w=='\n'||w=='\t'||w=='F'||w=='f'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w=='/')
	               {	if(w=='\n')
						{
							line++;
						}
						tokenfloat=(float)tokenval;	
						for(int j=1;j<=i;j++)
						{
						   tokenfloat=tokenfloat/10;		
						}

						wordlist[wordlist_count].kind=2;
						wordlist[wordlist_count].pointer=constant_count;
						strcpy(wordlist[wordlist_count].mark,"num");
						if(w=='f'||w=='F')
						{
							 wordlist[wordlist_count].name[name_count]=w;	
						}
						constant[constant_count].value=tokenfloat;
						name_count=0;
						wordlist_count++;				
						constant_count++;
						if(w!='f'&&w!='F')
						{
					       ungetc(w,stdin);
						}
						//cout<<"Report :  "<< tokenfloat<<" 是合法浮点数字!"<<endl;	
	               }
	               else
				   {    	
						while(w!=' '&&w!='\n'&&w!='\t'&&!isYunsuan(w)&&!isFenge(w))
						{
							wordlist[wordlist_count].name[name_count]=w;
							name_count++;
							w=PopChar();
						}
						if(w=='\n')
						{
							line++;
						}
						if(judgeYunsuan(w)||isFenge(w))
						{
						   ungetc(w,stdin);	
						}
						name_count=0;
						cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
						wordlist[wordlist_count].kind=-1;
						wordlist_count++;				
                   }  
			 }
		  else if(w=='e'||w=='E')
		   {						    
			       wordlist[wordlist_count].name[name_count]=w;name_count++;	
				   w=PopChar();
				   int token=0;
		           while(isdigit(w))/*在数字范围内*/
 	               { 
					  wordlist[wordlist_count].name[name_count]=w;name_count++;
					  token=token*10+w-'0';
	                  w=PopChar();
	               }
				   if(w==' '||w=='\t'||w=='\n'||judgeYunsuan(w)||isFenge(w))
				   {
						if(w=='\n')
						{
							line++;
						}
						else
						ungetc(w,stdin);
						tokenfloat=(float)tokenval;
						for(int j=0;j<token;j++)
						{
						 tokenfloat=tokenfloat*10;
						}
						wordlist[wordlist_count].kind=2;
						wordlist[wordlist_count].pointer=constant_count;
						strcpy(wordlist[wordlist_count].mark,"n");
						constant[constant_count].value=tokenfloat;
						name_count=0;
						wordlist_count++;				
						constant_count++;
				   }
				   else
				   {
					   while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&!isFenge(w))
						{
							wordlist[wordlist_count].name[name_count]=w;
							name_count++;
							w=PopChar();
						}
						if(w=='\n')
						{
							line++;
						}
						else if(judgeYunsuan(w)||isFenge(w))
						{
						   ungetc(w,stdin);	
						}
						name_count=0;
						cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
						wordlist[wordlist_count].kind=-1;
						wordlist_count++;	
				   }
		   }
	      else if(w==' '||w=='\n'||w=='\t'||w==','||w==';'||w=='+'||w=='-'||w=='*'||w==')'||w=='/'||w=='%')/*正确的整型数字*/
		  {			
					if(w=='\n')
					{
						line++;
					}
					else
					{
					    ungetc(w,stdin);	
					}
				    wordlist[wordlist_count].name[name_count]='\0';
					name_count=0;
					wordlist[wordlist_count].kind=2;
					wordlist[wordlist_count].pointer=constant_count;
					strcpy(wordlist[wordlist_count].mark,"n");
					constant[constant_count].value=(float)tokenval;
					wordlist_count++;				
					constant_count++;
					//cout<<"Report :  "<<tokenval<< " 是合法整型数字!"<<endl;	
		
		  }
		  else
		  {
						while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&!isFenge(w))
						{
							wordlist[wordlist_count].name[name_count]=w;
							name_count++;
							w=PopChar();
						}
						if(w=='\n')
						{
							line++;
						}
					    else
						{
					     ungetc(w,stdin);	
						}
						name_count=0;
				        cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
						wordlist[wordlist_count].kind=-1;
						wordlist_count++;
		  }
}
//*******************************************************************************************
void CMyAnylise::symbolJudge(char w)
{	
		   int i=0;
		   wordlist[wordlist_count].name[name_count]=w;
		   name_count++;
	       w=PopChar();
	       while((isdigit(w))||(w>=65&&w<=90)||(w>=97&&w<=122)||(w=='_'))
		   {  
			  wordlist[wordlist_count].name[name_count]=w;
			  name_count++;	
	          w=PopChar();
	       }
		   if(w==' '||w=='\n'||w=='\t'||judgeYunsuan(w)||isFenge(w))
		   {
			    if(w=='\n')
				{
					line++;
				}
				else
				    ungetc(w,stdin);//回退一个字符。
				for(i=0;i<32;i++)
				{
					if(strcmp(wordlist[wordlist_count].name,key[i])==0)
					{
						name_count=0;
						wordlist[wordlist_count].kind=3;
						wordlist[wordlist_count].pointer=key_count;
						if(strcmp(wordlist[wordlist_count].name,"CREATE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"c");
						}
						if(strcmp(wordlist[wordlist_count].name,"TABLE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"t");
						}
						if(strcmp(wordlist[wordlist_count].name,"INTEGER")==0||strcmp(wordlist[wordlist_count].name,"INT")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"i");
						}
					    if(strcmp(wordlist[wordlist_count].name,"CHAR")==0||strcmp(wordlist[wordlist_count].name,"VARCHAR")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"a");
						}
						if(strcmp(wordlist[wordlist_count].name,"ALTER")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"l");
						}
						 if(strcmp(wordlist[wordlist_count].name,"ADD")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"d");
						}
						 if(strcmp(wordlist[wordlist_count].name,"DROP")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"r");
						}
                        if(strcmp(wordlist[wordlist_count].name,"INDEX")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"x");
						}
						 if(strcmp(wordlist[wordlist_count].name,"VIEW")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"v");
						}	
						 if(strcmp(wordlist[wordlist_count].name,"SELECT")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"s");
						}
                        if(strcmp(wordlist[wordlist_count].name,"FROM")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"f");
						}
						 if(strcmp(wordlist[wordlist_count].name,"WHERE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"w");
						}
                        if(strcmp(wordlist[wordlist_count].name,"AND")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"a");
						}
						 if(strcmp(wordlist[wordlist_count].name,"OR")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"o");
						}
						if(strcmp(wordlist[wordlist_count].name,"INSERT")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"i");
						}
                        if(strcmp(wordlist[wordlist_count].name,"INTO")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"t");
						}
						 if(strcmp(wordlist[wordlist_count].name,"VALUES")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"v");
						}
						if(strcmp(wordlist[wordlist_count].name,"UPDATE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"u");
						}
						 if(strcmp(wordlist[wordlist_count].name,"SET")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"s");
						}
						 if(strcmp(wordlist[wordlist_count].name,"DELETE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"d");
						} 
						 if(strcmp(wordlist[wordlist_count].name,"GRANT")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"a");
						}
						if(strcmp(wordlist[wordlist_count].name,"REVOKE")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"r");
						}
						 if(strcmp(wordlist[wordlist_count].name,"ON")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"o");
						}
						 if(strcmp(wordlist[wordlist_count].name,"TO")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"t");
						}						
						 if(strcmp(wordlist[wordlist_count].name,"AS")==0)
						{
							strcpy(wordlist[wordlist_count].mark,"a");
						}
						constant[constant_count].value=tokenfloat;
						wordlist_count++;				
						key_count++;
						i=100;
					}
					
				}
				if(i==32)
				{   
					name_count=0;
					wordlist[wordlist_count].kind=1;
					wordlist[wordlist_count].pointer=symbol_count;
					strcpy(wordlist[wordlist_count].mark,"g");
					strcpy(symbol[symbol_count].name,wordlist[wordlist_count].name);
					wordlist_count++;				
					symbol_count++;
				}
		   }
		   else
		   {		
					while(w!=' '&&w!='\n'&&w!='\t'&&!judgeYunsuan(w)&&isFenge(w))
						{
							wordlist[wordlist_count].name[name_count]=w;
							name_count++;
							w=PopChar();
						}
						if(w=='\n')
						{
							line++;
						}
						else
							ungetc(w,stdin);
						name_count=0;
				        cout<<"Error at line "<<line<<" : "<<wordlist[wordlist_count].name<<" is wrong!"<<endl;
						wordlist[wordlist_count].kind=-1;
						wordlist_count++;
		   }
}
//**********************************************************************************
void CMyAnylise::elseSymbol(char w)
{
	int i=0,j;
	wordlist[wordlist_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)
					  {
					    wordlist[wordlist_count].kind=5;
						wordlist[wordlist_count].name[name_count]=w;name_count++;
				    	strcpy(wordlist[wordlist_count].mark,"r");
				    	wordlist_count++;				
			            name_count=0;
						i=100;
					  }
					  if((ch=='!')&&(w=='='))
					  {
					    wordlist[wordlist_count].kind=5;
						wordlist[wordlist_count].name[name_count]=w;name_count++;
				    	strcpy(wordlist[wordlist_count].mark,"r");
				    	wordlist_count++;				
			            name_count=0;
						i=100;
					  }	
				}
			    else if(w==' '||w=='\n'||w=='\t')
				{
					if(w=='\n')
					{
						line++;
					}
			        name_count=0;
					wordlist[wordlist_count].kind=5;                   
					strcpy(wordlist[wordlist_count].mark,"r");
					wordlist_count++;				
			    	i=100;
				}
				else if(w=='<'||w=='>'||w=='*'||w=='/'||w=='%'||w=='!'||w=='~')//判断非法连续运算符错误;
				{
						wordlist[wordlist_count].name[name_count]=w;
				    	wordlist[wordlist_count].kind=-1;

⌨️ 快捷键说明

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