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

📄 sym.h

📁 使用C++编写的数据库管理系统; 拥有自定义数据文件格式
💻 H
字号:
#include <iostream.h>
#include <iomanip.h>
#include <string.h>
#include <ctype.h>  //for function tolower

const int RESERVE =37;
const int LINEMAX = 512;
const int BUFFER_SIZE = 4096;



typedef enum { 
	OPEN,NEW,QUIT,CONNECT,CREATE,ALTER,       //6 for each line
	SELECT,INSERT,DELETE,WHERE,UPDATE,TABLE,
	USER,INTO,LIKE,ORDER,BY,NUM,
	CHAR,TEXT,WRONG,IDENT,PLUS,MINUS,
	TIMES,SLASH,MOD,EQL,NEQ,LSS,
	LEQ,GTR,GEQ,LPAREN,	RPAREN,COMMA,
	QUESTION,AND,OR,NOT,DESCRIBE,INT,
	LONG,FLOAT,DATE,BYTE,DATABASE,PRIMARY,
	KEY,NL,ADD,DROP,END,VALUES,FROM,SET
}SYMBOL;
char RSYMS[RESERVE][10]={
	"OPEN","NEW","QUIT","CONNECT","CREATE",
	"ALTER","SELECT","INSERT","DELETE","WHERE",
	"UPDATE","TABLE","USER","INTO","LIKE",
	"ORDER","BY","MOD","AND","OR",
	"NOT","DESCRIBE","CHAR","INT","LONG",
	"FLOAT","DATE","BYTE","DATABASE","PRIMARY",
	"KEY","NULL","ADD","DROP","VALUES",
	"FROM","SET"
};
char lowerRSYMS[RESERVE][10];
SYMBOL RSYM[RESERVE]={
	OPEN,NEW,QUIT,CONNECT,CREATE,
	ALTER,SELECT,INSERT,DELETE,WHERE,
	UPDATE,TABLE,USER,INTO,LIKE,
	ORDER,BY,MOD,AND,OR,
	NOT,DESCRIBE,CHAR,INT,LONG,
	FLOAT,DATE,BYTE,DATABASE,PRIMARY,
	KEY,NL,ADD,DROP,VALUES,
	FROM,SET
	
};

typedef struct{
	int valid;
	int length;
	SYMBOL type;
	int	nl;
	int key;
	int indexBlock;
	char * name;
}FIELD;

typedef struct{
	char * value;
	SYMBOL type;
}FIELDREC;

typedef struct fieldNode{
	FIELD f;
	fieldNode * next;
}FIELDNODE;

void lowerString(char * source,char * result)
{
	int i=0;
	while(source[i]!='\0')
	{
		result[i] =tolower(source[i]);
		i++;
	}
	result[i]='\0';
}

SYMBOL getSym(char * input,int & pointer,char * getText)
{	
	char buffer[1024];
	SYMBOL type;
	int bufferP=0;
	
	while(input[pointer]==' '||input[pointer]=='\t')
		pointer++;
	
	if((input[pointer]>='a'&&input[pointer]<='z')||
		(input[pointer]>='A'&&input[pointer]<='Z'))  //must be a reserve word or user identifier
	{
		int cp1=0,cp2=1;

		while((input[pointer]>='a'&&input[pointer]<='z')||
			(input[pointer]>='A'&&input[pointer]<='Z')||
			(input[pointer]>='0'&&input[pointer]<='9')){
			buffer[bufferP]=input[pointer];
			pointer++;
			bufferP++;
		}
		type = IDENT;
		buffer[bufferP]='\0';		
		for(int i=0;i<RESERVE;i++)
		{
			cp1=strcmp(buffer,RSYMS[i]);
			cp2=strcmp(buffer,lowerRSYMS[i]);
			if(cp1==0||cp2==0)
			{
				type = RSYM[i];
				break;
			}
		}
		
		
	}
	else
		if(input[pointer]>='0'&&input[pointer]<='9'){ //must be a num
			while((input[pointer]>='0'&&input[pointer]<='9')||input[pointer]=='.'){
				buffer[bufferP]=input[pointer];
				pointer++;
				bufferP++;
			};
			buffer[bufferP]='\0';			
			type = NUM;
		}
		else
			switch(input[pointer++])
		{
			case '\'' : //bust be a text						
						while(input[pointer]!='\''&&input[pointer]!='\0'){
							buffer[bufferP]=input[pointer];
							pointer++;
							bufferP++;
						}
						buffer[bufferP]='\0';
						if(input[pointer]=='\0')
						{
							cout<<"\n\" expected."<<endl;
							type =  WRONG;
						}
						else{
							pointer++;						
							type = TEXT;
						}
						break;			
			case '(':
						buffer[0]='(';
						buffer[1]='\0';
						type = LPAREN;
						break;
			case ')':
						buffer[0]=')';
						buffer[1]='\0';
						type = RPAREN;
						break;
			case '+':
						buffer[0]='+';
						buffer[1]='\0';
						type = PLUS;
						break;
			case '-':
						buffer[0]='-';
						buffer[1]='\0';
						type = MINUS;
						break;
			case '*':
						buffer[0]='*';
						buffer[1]='\0';
						type = TIMES;
						break;
			case '/':
						buffer[0]='/';
						buffer[1]='\0';
						type = SLASH;
						break;
			case '=':
						buffer[0]='=';
						buffer[1]='\0';
						type = EQL;
						break;
			case '>':
						buffer[0]='>';		
						if(input[pointer]=='=')  // >= find
						{
							pointer++;
							type = GEQ;
							buffer[1]='=';
							buffer[2]='\0';
						}
						else{							
							buffer[1]='\0';
							type = GTR;
						}						
						break;
			case '<':
						buffer[0]='<';		
						if(input[pointer]=='=')  // <= find
						{
							pointer++;
							type = LEQ;
							buffer[1]='=';
							buffer[2]='\0';
						}
						else{						
							buffer[1]='\0';
							type = LSS;
						}						
						break;
			case '!':
						buffer[0]='!';
						if(input[pointer]=='=')
						{
							pointer++;
							type = NEQ;
							buffer[1]='=';
							buffer[2]='\0';							
						}
						else{
							buffer[1]='\0';
							type = NOT;
						}
						break;
			case ',':
						buffer[0]=',';
						buffer[1]='\0';
						type = COMMA;
						break;
			case '?':
						buffer[0]='?';
						buffer[1]='\0';
						type = QUESTION;
						break;
			case ';':
						buffer[0]=';';
						buffer[1]='\0';
						type = END;
						break;
			default:
						cout<<"\nUnexpected symbol."<<endl;
						type=WRONG;
						buffer[0]=input[pointer-1];
						buffer[1]='\0';	
		}
		strcpy(getText,buffer);
		return type;
}



void getinput(char * buffer)
{
	char line[LINEMAX];
	cin.getline(line,LINEMAX,'\n');
	while(line[strlen(line)-1]!=';')
	{
		
		cout<<"    ";
		strcat(buffer,line);
		strcat(buffer," ");
		cin.getline(line,LINEMAX,'\n');
	}	
	strcat(buffer,line);
}

void outType(SYMBOL t)
{
	for(int i=0;i<RESERVE;i++)
		if(t==RSYM[i])
			break;
	cout<<RSYMS[i];
}

⌨️ 快捷键说明

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