📄 drop.y
字号:
{
$$=(_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 + -