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

📄 drop.y

📁 一个c语言开发的小型的dbms系统
💻 Y
📖 第 1 页 / 共 2 页
字号:
		{
		$$=(_insertvalues_type *)malloc(sizeof(_insertvalues_type));
		$$->value=$1;
		$$->type='0';
		$$->next_iv=NULL;
		}
;

	/*------------------------------------------------------下面是delete语句的定义--------*/
deletesql:	DELETE FROM table WHERE conditions ';'
		{
		$$=(_deletestruct_type *)malloc(sizeof(_deletestruct_type));
		$$->table=$3;
		$$->cons=$5;
		}
	|DELETE FROM table ';'
		{
		$$=(_deletestruct_type *)malloc(sizeof(_deletestruct_type));
		$$->table=$3;
		$$->cons=NULL;
		}
	;
	/*------------------------------------------------------下面是conditions语句的定义--------*/

conditions:	condition
		{
		$$=$1;
		}
	|'(' conditions ')' AND '(' conditions ')'
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=$2;
		$$->right=$6;
		$$->comp_op='a';
		}
	|'(' conditions ')' OR '(' conditions ')'
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=$2;
		$$->right=$6;
		$$->comp_op='o';
		}
	;
condition:	comp_left comp_op comp_right
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=$1;
		$$->comp_op=$2;
		$$->right=$3;
		}
	;
comp_left:	table_field_
		{$$=$1;
		$$->comp_op='\0';
		$$->type='2';	
		$$->left=NULL;
		$$->right=NULL;
		} 
	;
comp_right:	table_field_
		{
		$$=$1;
		$$->comp_op='\0';
		$$->type='2';	
		$$->left=NULL;
		$$->right=NULL;
		}
	|'\'' IDENTIFIER '\''
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=NULL;
		$$->right=NULL;
		$$->comp_op='\0';
		$$->type='1';
		$$->value=$2;
		}
	|'\'' NUMBER '\''
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=NULL;
		$$->right=NULL;
		$$->comp_op='\0';
		$$->type='1';
		$$->value=$2;
		}
	|NUMBER
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->left=NULL;
		$$->right=NULL;
		$$->type='0';
		$$->value=$1;
		$$->intval=atoi($1);
		}
	;
table_field_:	field
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->table=(char *)malloc(sizeof(10));	/*为以后填上表名预留空间*/
		$$->table[0]='\0';
		$$->value=$1;
		}
	|table '.' field
		{
		$$=(_conditions_type *)malloc(sizeof(_conditions_type));
		$$->table=$1;
		$$->value=$3;
		}
	;

comp_op:		'<'
		{$$='<';
		}
	|'>'
		{$$='>';
		}
	|'='
		{$$='=';
		}
	;

show:	SHOW TABLES
		{
		show_tables(dic.tab,dic.tab_num);		/*显示已经有的表名*/
		}
	|SHOW TABLE_DIC
		{
		show_tab_dic(dic.tab,dic.tab_num);		/*显示表数据字典*/
		}
	|SHOW COLS OF table
		{
		show_col_dic(dic.tab,dic.tab_num,dic.col,dic.col_num,$4);	/*显示相应表的列信息*/
		}
	;

%%

typedef	struct	tokentype{
	char 	*name; 
	int 	value; 
	}tokentype;

tokentype tokens[] =	/*这里只列出了没有定义类型的终结符*/
{	"SELECT",		SELECT,
	"FROM",		FROM,
	"WHERE",		WHERE,
	"CREATE",		CREATE,
	"DROP",		DROP,
	"TABLE",		TABLE,
	"CHAR",		CHAR,
	"INT",		INT,
	"DATE",		DATE,
	"INSERT",		INSERT,
	"INTO",		INTO,
	"VALUES",		VALUES,
	"DELETE",		DELETE,
	"AND",		AND,
	"OR",		OR,
	"QUIT",		QUIT,
	"SHOW",		SHOW,
	"TABLES",		TABLES,
	"TABLE_DIC",	TABLE_DIC,
	"COLS",		COLS,
	"OF",		OF,
	"\0",		'\0'	
};

int is_number(char *s)	/*用来判断一个字符串是不是数字*/
{
	char *ss;
	ss=s;
	while (*ss!='\0')
	{	if (*ss<'0' || *ss>'9')  
			return(0);
		ss++;
	}
	return(1);
}

void low_to_up(char *s)	/*把一个字符串变为大写的*/
{	unsigned	int i;
	for(i=0;i<strlen(s);i++)
	{	s[i]=toupper(s[i]);
	}
}
int is_token(char *s)	/*用来判断一个字符串是不是一个无类型定义的token*/
{
	char *str;
	int	i=0;
	str=strdup(s);
	low_to_up(str);
	while(1)
	{
		if (strlen(tokens[i].name)==0)	break;	
		if (strcmp(tokens[i].name,str)==0)
		{	free(str);
			return(tokens[i].value);	/*是token,返回对应的值*/
		}
		i++;
	}
	free(str);
	return(0);		/*不是,则返回0*/
}

int is_legal(char s)	/*用来判断一个字符是不是字符串中的合法字符*/
{	int flag=0;
	if(s>='a' && s<='z')	flag=1;
	if(s>='A' && s<='Z')  	flag=1;
	if(s=='_') 	    	flag=1;
	if(s>='0' && s<='9')  	flag=1;
	if(flag==0)  return(0);	/*不是*/
	return(1);		/*是*/
}
		
int is_identifier(char *s)	/*用来判断一个字符串是不是合格的标识符*/
{
	char *ss;
	ss=s;
	while(*ss!='\0')
	{	if(is_legal(*ss)==0)  return(0);
		ss++;
	}
	return(1);
}

void readaword(char *aword)	/*将下一个词读入aword中*/
{
	char ss;
	int  awordnum=0;
	ss=sql[sqlnum];
	while( is_legal(ss))
	{	aword[awordnum]=ss;
		awordnum++;
		sqlnum++;
		ss=sql[sqlnum];
	}
	aword[awordnum]='\0';
}



yylex()
{
	char	ss;
	int	is_a_token;
	char	theword[256];	/*用于分解出输入行的一个单词*/
	while (sql[sqlnum]==' ')
		sqlnum++;
	ss=sql[sqlnum];
	if (ss=='\0') return(0);
	if (is_legal(ss)==0)	
	{	/*主要识别标点和运算符*/		
		sqlnum++;
		return(ss);
	}
	else	
	{	readaword(theword);
		 	/*主要识别保留字*/
		if (is_a_token=is_token(theword))	return(is_a_token);
			/*识别数字和标识符*/
		yylval.yych=(char *)malloc(strlen(theword)+1); 
		strcpy(yylval.yych,theword); 		
		if (is_number(theword)) 		return(NUMBER);
		if (is_identifier(theword))  	return(IDENTIFIER);
	}/*else*/	
	return(0);
}

void yyerror(char *s)
{
	printf("%s\n",s);
}

void check_sql()
{	
	int length=strlen(sql);
	if  (sql[length-1]!=';') 	/*如果用户没有在最后以';'结束,就给他们加上一个';'*/
		{		/*这样才可以把QUIT也加入词法分析中*/
		sql[length]=';';	/*这样可以使用户不用在QUIT后面也加入';'就能被接受。*/
		sql[length+1]='\0';
		}
}


main()

{	extern	int yyparse();
	FILE	*fp;
	char    buf[256];
	int		seek_beg=0;
	char	*result;

	int temp=0;
	while(1)

	{

		read_dic(dic.tab, &(dic.tab_num), dic.col, &(dic.col_num));	/*读出字典表信息*/

		printf("\nSQL>");

		sqlnum=0;		/*每次将指向sql的指针返回到起点*/

		finish_flag=0;	/*将结束控制变量初始化*/

		gets(sql);	/*获取输入行*/

		if(sql[0]=='@')
		{
			strncpy(buf,sql+1,strlen(sql)-1);
			buf[strlen(sql)-1]='\0';
			fp=fopen(buf,"rb");
			if(fp==NULL)
			{
				printf("Can't open file %s\n",buf);
				continue;
			}
			while(!feof(fp))
			{
//				result=fseek(fp,';',seek_beg);
//				seek_beg=result;
				fgets(sql,1024,fp);
				
				result=strchr(sql,';');
				strncpy(buf,sql,result-sql);
				buf[result-sql]='\0';
				strcpy(sql,buf);
				printf("%s\n",sql);
				check_sql(sql);	/*对输入行后面的';'做处理*/
				if (yyparse()==0)
					printf("Your command has been done successfully.\n");
				if (finish_flag==1)	break;		/*如果用户输入了quit那么将结束程序*/
						read_dic(dic.tab, &(dic.tab_num), dic.col, &(dic.col_num));	/*读出字典表信息*/
				printf("\nSQL>");
				sqlnum=0;		/*每次将指向sql的指针返回到起点*/
				finish_flag=0;	/*将结束控制变量初始化*/
			}

		}
		else
		{
			check_sql(sql);	/*对输入行后面的';'做处理*/
			temp=yyparse();//????????????????????
			if(temp==0)
			//if (yyparse()==0)
				printf("Your command has been done successfully.\n");
			if (finish_flag==1)	break;		/*如果用户输入了quit那么将结束程序*/
		}
	}			
}

⌨️ 快捷键说明

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