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

📄 myanylise.cpp

📁 数据库模拟程序 实现控制台命令词法分析
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MyAnylise.cpp: implementation of the CMyAnylise class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "dataBase.h"
#include "MyAnylise.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//struct item unit[MAXSIZE];
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMyAnylise::CMyAnylise()
{
	CheckCMDType = 0;
	m_str.Empty();
	index = 0;
	count_success = count_false =0;
	
	loc=count=error=0;
	memset(ch,0,MAXSIZE);
	
	//init stack input
	SETNULL(&stack);
	SETNULL(&input);
	
	//init word
	int i=0;
	for(i = 0;i < 100;i++)
	{
		word[i].kind = -1;
		memset(word[i].name,0,10);
		word[i].pointer = -1;
		memset(word[i].mark,0,20);
	}
	
	//	Symbol symbol[100];
	for(i=0;i<100;i++)
	{
		memset(symbol[i].name,0,100);
	}
	
	//	Constant constant[100];
	for(i=0;i<100;i++)
	{
		constant[i].value=-1;
	}
	line=tokenval=0;
	word_count=symbol_count=constant_count=name_count=key_count=0;
	tokenfloat=0;
	memset(name,0,10);
	
	//key
	strcpy(key[0],"CREATE");
	strcpy(key[1],"TABLE");
	strcpy(key[2],"VARCHAR");
	strcpy(key[3],"CHAR");
	strcpy(key[4],"INTEGER");
	strcpy(key[5],"ALTER");
	strcpy(key[6],"ADD");
	strcpy(key[7],"DROP");
	strcpy(key[8],"INDEX");
	strcpy(key[9],"VIEW");
	strcpy(key[10],"SELECT");
	strcpy(key[11],"FROM");
	strcpy(key[12],"AND");
	strcpy(key[13],"OR");
	strcpy(key[14],"WHERE");
	strcpy(key[15],"INSERT");
	strcpy(key[16],"INTO");
	strcpy(key[17],"VALUES");
	strcpy(key[18],"UPDATE");
	strcpy(key[19],"SET");
	strcpy(key[20],"DELETE");
	strcpy(key[21],"GRANT");
	strcpy(key[22],"REVOKE");
	strcpy(key[23],"ON");
	strcpy(key[24],"TO");
	strcpy(key[25],"AS");
	strcpy(key[26],"typedef");
	strcpy(key[27],"union");
	strcpy(key[28],"unsigned");
	strcpy(key[29],"void");
	strcpy(key[30],"volatile");
	strcpy(key[31],"while");
	
	//	char yunsuanfu[20];
	yunsuanfu[0]='=';
	yunsuanfu[1]='<';
	yunsuanfu[2]='>';
	yunsuanfu[3]='+';
	yunsuanfu[4]='-';
	yunsuanfu[5]='*';
	yunsuanfu[6]='/';
	yunsuanfu[7]='&';
	yunsuanfu[8]='%';
	yunsuanfu[9]='!';
	yunsuanfu[10]='|';
	yunsuanfu[11]='~';
	yunsuanfu[12]='\0';
	yunsuanfu[13]='\0';
	yunsuanfu[14]='\0';
	yunsuanfu[15]='\0';
	yunsuanfu[16]='\0';
	yunsuanfu[17]='\0';
	yunsuanfu[18]='\0';
	yunsuanfu[19]='\0';
	
	//char fengefu[20]="";
	fengefu[0]=';';
	fengefu[1]='.';
	fengefu[2]=',';
	fengefu[3]='(';
	fengefu[4]=')';
	fengefu[5]='\'';
	fengefu[6]='[';
	fengefu[7]=']';
	fengefu[8]='{';
	fengefu[9]='}';
	fengefu[10]='?';
	fengefu[11]='\"';
	fengefu[12]='\0';
	fengefu[13]='\0';
	fengefu[14]='\0';
	fengefu[15]='\0';
	fengefu[16]='\0';
	fengefu[17]='\0';
	fengefu[18]='\0';
	fengefu[19]='\0';
}

CMyAnylise::~CMyAnylise()
{
	
}

CMyAnylise::CMyAnylise(CString str)
{
//	str.MakeUpper();
	CheckCMDType = 0;
	m_str = str;
	index = 0;
	count_success = count_false =0;
	
	loc = count = error = 0;
	memset(ch,0,MAXSIZE);
	
	//init stack input
	SETNULL(&stack);
	SETNULL(&input);
	
	//init word
	int i=0;
	for(i = 0;i < 100;i++)
	{
		word[i].kind = -1;
		memset(word[i].name,0,10);
		word[i].pointer = -1;
		memset(word[i].mark,0,20);
	}
	
	//	Symbol symbol[100];
	for(i=0;i<100;i++)
	{
		memset(symbol[i].name,0,100);
	}
	
	//	Constant constant[100];
	for(i=0;i<100;i++)
	{
		constant[i].value=-1;
	}
	line=tokenval=0;
	word_count=symbol_count=constant_count=name_count=key_count=0;
	tokenfloat=0;
	memset(name,0,10);
	
	
	//key
	strcpy(key[0],"CREATE");
	strcpy(key[1],"TABLE");
	strcpy(key[2],"VARCHAR");
	strcpy(key[3],"CHAR");
	strcpy(key[4],"INTEGER");
	strcpy(key[5],"ALTER");
	strcpy(key[6],"ADD");
	strcpy(key[7],"DROP");
	strcpy(key[8],"INDEX");
	strcpy(key[9],"VIEW");
	strcpy(key[10],"SELECT");
	strcpy(key[11],"FROM");
	strcpy(key[12],"AND");
	strcpy(key[13],"OR");
	strcpy(key[14],"WHERE");
	strcpy(key[15],"INSERT");
	strcpy(key[16],"INTO");
	strcpy(key[17],"VALUES");
	strcpy(key[18],"UPDATE");
	strcpy(key[19],"SET");
	strcpy(key[20],"DELETE");
	strcpy(key[21],"GRANT");
	strcpy(key[22],"REVOKE");
	strcpy(key[23],"ON");
	strcpy(key[24],"TO");
	strcpy(key[25],"AS");
	strcpy(key[26],"typedef");
	strcpy(key[27],"union");
	strcpy(key[28],"unsigned");
	strcpy(key[29],"void");
	strcpy(key[30],"volatile");
	strcpy(key[31],"while");
	
	//	char yunsuanfu[20];
	yunsuanfu[0]='=';
	yunsuanfu[1]='<';
	yunsuanfu[2]='>';
	yunsuanfu[3]='+';
	yunsuanfu[4]='-';
	yunsuanfu[5]='*';
	yunsuanfu[6]='/';
	yunsuanfu[7]='&';
	yunsuanfu[8]='%';
	yunsuanfu[9]='!';
	yunsuanfu[10]='|';
	yunsuanfu[11]='~';
	yunsuanfu[12]='\0';
	yunsuanfu[13]='\0';
	yunsuanfu[14]='\0';
	yunsuanfu[15]='\0';
	yunsuanfu[16]='\0';
	yunsuanfu[17]='\0';
	yunsuanfu[18]='\0';
	yunsuanfu[19]='\0';
	//char fengefu[20]="";
	fengefu[0]=';';
	fengefu[1]='.';
	fengefu[2]=',';
	fengefu[3]='(';
	fengefu[4]=')';
	fengefu[5]='\'';
	fengefu[6]='[';
	fengefu[7]=']';
	fengefu[8]='{';
	fengefu[9]='}';
	fengefu[10]='?';
	fengefu[11]='\"';
	fengefu[12]='\0';
	fengefu[13]='\0';
	fengefu[14]='\0';
	fengefu[15]='\0';
	fengefu[16]='\0';
	fengefu[17]='\0';
	fengefu[18]='\0';
	fengefu[19]='\0';
}

void CMyAnylise::SetIndex(int index)
{
	this->index = index;
}

void CMyAnylise::SetString(CString str)
{
//	str.MakeUpper();
	m_str = str;
	index = 0;
}

char CMyAnylise::PopChar()
{
	return (index<m_str.GetLength())?m_str.GetAt(index++):NULL;
}


int CMyAnylise::isYunsuan(char a)
{
	for(int i=0;i<20;i++)
	{
        if(a==yunsuanfu[i])
		{
			i=-1;
			break;
		}
	}
	return (i==20)?FALSE:TRUE;
}
int CMyAnylise::isFenge(char a)
{
	for(int i=0;i<20;i++)
	{
        if(a==fengefu[i])
		{	 
			i=-1;
			break;
		}
	}
	return (i==20)?FALSE:TRUE;
}

void CMyAnylise::number(char w)
{		
	word[word_count].name[name_count]=w;name_count++;
	tokenval=w-'0';   
	w=PopChar();
	while(isdigit(w))/*整型数字处理*/
	{  
		word[word_count].name[name_count]=w;name_count++;	
		tokenval=tokenval*10+w-'0';
		w=PopChar();
	}
	//	word[word_count].mark[0]='n';///做记号;
	if(w=='.')/*浮点型数字处理*/
	{    
		word[word_count].name[name_count]=w;name_count++;	
		w=PopChar();
		int i=0;
		while(isdigit(w))/*在数字范围内*/
		{ 
			word[word_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;		
			}
			
			word[word_count].kind=2;
			word[word_count].pointer=constant_count;
			strcpy(word[word_count].mark,"num");
			if(w=='f'||w=='F')
			{
				word[word_count].name[name_count]=w;	
			}
			constant[constant_count].value=tokenfloat;
			name_count=0;
			word_count++;				
			constant_count++;
			if(w!='f'&&w!='F')
			{
				//ungetc(w,stdin);
				index--;
			}
		}
		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++;
			}
			if(isYunsuan(w)||isFenge(w))
			{
				//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,"错误!",MB_OK);
			
			////cout<<"Error at line "<<line<<" : "<<word[word_count].name<<" is wrong!"<<endl;
			word[word_count].kind=-1;
			word_count++;				
		}  
			 }
	else if(w=='e'||w=='E')
	{						    
		word[word_count].name[name_count]=w;name_count++;	
		w=PopChar();
		int token=0;
		while(isdigit(w))/*在数字范围内*/
		{ 
			word[word_count].name[name_count]=w;name_count++;
			token=token*10+w-'0';
			w=PopChar();
		}
		if(w==' '||w=='\t'||w=='\n'||isYunsuan(w)||isFenge(w))
		{
			if(w=='\n')
			{
				line++;
			}
			else
				//ungetc(w,stdin);
				index--;
			tokenfloat=(float)tokenval;
			for(int j=0;j<token;j++)
			{
				tokenfloat=tokenfloat*10;
			}
			word[word_count].kind=2;
			word[word_count].pointer=constant_count;
			strcpy(word[word_count].mark,"n");
			constant[constant_count].value=tokenfloat;
			name_count=0;
			word_count++;				
			constant_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')

⌨️ 快捷键说明

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