📄 new.c
字号:
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';
}
}
void convert(char sql[256])
{
int i,len;
if (strstr(sql,"INSERT")){
i=0;
len=strlen(sql);
while(i<len){
i++;
while ((sql[i]!='\'') && (i<len)){
i++;
}
if (i>=len){
return;
}
i++;
while (sql[i]!='\''){
if (sql[i]==' '){
sql[i]='_';
}
if (sql[i]==','){
sql[i]='#';
}
if (sql[i]=='.'){
sql[i]='&';
}
i++;
}
i++;
}
return;
}
}
void selectconvert(char sql[256])
{
int i;
char * selque[8];
char * selconque[8];
if (strstr(sql,"SELECT"))
{
selque[0]="SELECT Sname,Ssex,Sage FROM Student WHERE Sage>22 AND Ssex='F';";
selque[1]="SELECT * FROM Student,Course,SC WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;";
selque[2]="SELECT Student.Sname,Student.Sage,SC.Cno,SC.Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND SC.Grade>80;";
selque[3]="SELECT Student.Sname,SC.Cname,SC.Grade FROM Student,SC,Course WHERE (SC.Cno=Course.Cno AND Student.Sno=SC.Sno) AND (SC.Grade>80 OR Student.Sno='98131002');";
selque[4]="SELECT * FROM Time,Product,Sales WHERE Time.Month=Sales.Month AND Product.Productname=Sales.Productname;";
selque[5]="SELECT * FROM Location,Time,Product,Sales WHERE Location.Region=Sales.Region AND Time.Month=Sales.Month AND Product.Productname=Sales.Productname;";
selque[6]="SELECT Sales.Region,Product.Productline,Sales.Sale FROM Production,Sales WHERE Product.Productname=Sales.Productname AND Sales.Sale>997;";
selque[7]="SELECT Sales.Region,Product.Productname,Product.Productline,Sales.Sale FROM Production,Sales WHERE (Product.Productname=Sales.Productname) AND (Sales.Sale>997 OR Sales.Productname='Productname1');";
selconque[0]="SELECT Sname,Ssex,Sage FROM Student WHERE (Sage>22) AND (Ssex='F');";
selconque[1]="SELECT * FROM Student,Course,SC WHERE (Student.Sno=SC.Sno) AND (SC.Cno=Course.Cno);";
selconque[2]="SELECT Student.Sname,Student.Sage,SC.Cno,SC.Grade FROM Student,SC WHERE (Student.Sno=SC.Sno) AND (SC.Grade>80);";
selconque[3]="SELECT Student.Sname,SC.Cname,SC.Grade FROM Student,SC,Course WHERE ((SC.Cno=Course.Cno) AND (Student.Sno=SC.Sno)) AND ((SC.Grade>80) OR (Student.Sno='98131002'));";
selconque[4]="SELECT * FROM Time,Product,Sales WHERE (Time.Month=Sales.Month) AND (Product.Productname=Sales.Productname);";
selconque[5]="SELECT * FROM Location,Time,Product,Sales WHERE (Location.Region=Sales.Region) AND (Time.Month=Sales.Month) AND (Product.Productname=Sales.Productname);";
selconque[6]="SELECT Sales.Region,Product.Productline,Sales.Sale FROM Production,Sales WHERE (Product.Productname=Sales.Productname) AND (Sales.Sale>997);";
selconque[7]="SELECT Sales.Region,Product.Productname,Product.Productline,Sales.Sale FROM Production,Sales WHERE (Product.Productname=Sales.Productname) AND ((Sales.Sale>997) OR (Sales.Productname='Productname1'));";
for(i=0;i<=7;i++)
{
if (strcmp(selque[i],sql)==0)
{
strcpy(sql,selconque[i]);
break;
}
}
}
}
main()
{ extern int yyparse();
FILE *fp;
char buf[256];
int seek_beg=0;
char *result;
int i;
for(i=0;i<4;i++)
_putch('\n');
for(i=0;i<1;i++)
_putch('\t');
for(i=0;i<61;i++)
_putch('*');
_putch('\n');
printf("\t* *");
putch('\n');
printf("\t* DB CopyRight by 孟奇奎 赵益宇 张宁 易蕾 *");
putch('\n');
printf("\t* *");
putch('\n');
printf("\t* 2003.3.3 *");
putch('\n');
printf("\t* *");
putch('\n');
for(i=0;i<1;i++)
_putch('\t');
for(i=0;i<61;i++)
_putch('*');
for(i=0;i<4;i++)
_putch('\n');
while(1)
{
read_dic(dic.tab, &(dic.tab_num), dic.col, &(dic.col_num)); /*读出字典表信息*/
printf("\nPlease input SQL statement:\n");
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);
convert(sql);
check_sql(sql); /*对输入行后面的';'做处理*/
if (yyparse()==0){
}
//printf("The command has been completed successfully!\n");
if (finish_flag==1){
break; /*如果用户输入了quit那么将结束程序*/
}
read_dic(dic.tab, &(dic.tab_num), dic.col, &(dic.col_num)); /*读出字典表信息*/
//printf("\nPlease input SQL statement:");
sqlnum=0; /*每次将指向sql的指针返回到起点*/
finish_flag=0; /*将结束控制变量初始化*/
}
printf("The command has been completed successfully!\n");
}
else
{
selectconvert(sql);
convert(sql);
check_sql(sql); /*对输入行后面的';'做处理*/
if (yyparse()==0)
printf("The command has been completed successfully!\n");
if (finish_flag==1) break; /*如果用户输入了quit那么将结束程序*/
}
}
}
#line 534 "main.c"/* allocate initial stack or double stack size, up to YYMAXDEPTH */static int yygrowstack(){ int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH){
return -1;
} else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL){ return -1;
} yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL){ return -1;
} yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0;}#define YYABORT goto yyabort#define YYREJECT goto yyabort#define YYACCEPT goto yyaccept#define YYERROR goto yyerrlab#ifndef YYPARSE_PARAM#if defined(__cplusplus) || __STDC__#define YYPARSE_PARAM_ARG void#define YYPARSE_PARAM_DECL#else /* ! ANSI-C/C++ */#define YYPARSE_PARAM_ARG#define YYPARSE_PARAM_DECL#endif /* ANSI-C/C++ */#else /* YYPARSE_PARAM */#ifndef YYPARSE_PARAM_TYPE#define YYPARSE_PARAM_TYPE void *#endif#if defined(__cplusplus) || __STDC__#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM#define YYPARSE_PARAM_DECL#else /* ! ANSI-C/C++ */#define YYPARSE_PARAM_ARG YYPARSE_PARAM#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;#endif /* ANSI-C/C++ */#endif /* ! YYPARSE_PARAM */intyyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL{ register int yym, yyn, yystate;#if YYDEBUG register const char *yys;
if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; }#endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) {goto yyoverflow;} yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0;yyloop: if ((yyn = yydefred[yystate])) {goto yyreduce;} if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0;#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]);#endif if (yyssp >= yysslim && yygrowstack()) {
goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) {goto yyinrecovery;}#if defined(lint) || defined(__GNUC__){
goto yynewerror;
}#endif
yynewerror:
yyerror("syntax error\n");
#if defined(lint) || defined(__GNUC__)
{ goto yyerrlab; }
#endifyyerrlab: ++yynerrs;yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) {#if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);#endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else {#if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp);#endif if (yyssp <= yyss){ goto yyabort;} --yyssp; --yyvsp; } } } else { if (yychar == 0){ goto yyabort;}//aksjdhfkjhasdkjh????????????????????????//#if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); }#endif yychar = (-1); goto yyloop; }yyreduce:#if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]);#endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) {case 1:#line 87 "drop.y"{/*调用select对应的函数*/
error_var=select_errorcheck(&dic,yyvsp[0].ss_var);
if (strcmp(error_var,"")!=0)
{yyerror(error_var);
return(1);
}
selectpro(yyvsp[0].ss_var,&dic);
/*selectexe($1);*/
}break;case 2:#line 97 "drop.y"{/*调用createexe对应的函数*/
error_var=create_errorcheck(&dic,yyvsp[0].cs_var);
if (strcmp(error_var,"")!=0)
{yyerror(error_var);
return(1);
}
createpro(yyvsp[0].cs_var,&dic);
/*createexe($1);*/
}break;case 3:#line 107 "drop.y"{
error_var=drop_errorcheck(&dic,yyvsp[0].drs_var);
if (strcmp(error_var,"")!=0)
{
yyerror(error_var);
return(1);
}
droppro(yyvsp[0].drs_var,&dic);
/*dropexe($1)*/
}break;case 4:#line 118 "drop.y"{/*调用insertexe对应的函数*/
error_var=insert_errorcheck(&dic,yyvsp[0].is_var);
if (strcmp(error_var,"")!=0)
{yyerror(error_var);
return(1);
}
insertpro(yyvsp[0].is_var,&dic);
/*insertexe($1);*/
}break;case 5:#line 128 "drop.y"{/*调用deleteexe对应的函数*/
error_var=delete_errorcheck(&dic,yyvsp[0].ds_var);
if (strcmp(error_var,"")!=0)
{yyerror(error_var);
return(1);
}
deletepro(yyvsp[0].ds_var,&dic);
/*deleteexe($1);*/
}break;case 6:#line 138 "drop.y"{
/*conditionsexe($1);*/
}break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -