📄 main.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("\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);
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("\nSQL>");
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 */
int
yyparse (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;
}
#endif
yyerrlab:
++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 + -