📄 3.c
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
#define keywordSum 12
char *keyword[keywordSum]={"if","else","return","min","void","main","for","while","do","int","read","write"};
char singleword[50]="+-*(){};,:";
char doubleword[10]="><=!";
int TESTscan();
char Scanin[300],Scanout[300];
int TESTparse();
int program();
int compoud_Stat();
int statement();
int expression_stat();
int expression();
int bool_expr();
int additive_expr();
int term();
int factor();
int if_stat();
int while_stat();
int for_stat();
int write_stat();
int read_stat();
int declaration_stat();
int declaration_list();
int statement_list();
int compound_stat();
char token[20],token1[40];
extern char Scanout[300];
FILE *fp;
FILE *fin,*fout;
//
int TESTscan()
{
char ch,token[40];
int es=0,j,n;
printf("请输入源程序的路径:");
scanf("%s",Scanin);
printf("请输入词法分析输出的路径:");
scanf("%s",Scanout);
if((fin=fopen(Scanin,"r"))==NULL)
{
printf("\n打开词法分析输入文件出错!!\n");
return(1);
}
if((fout=fopen(Scanout,"w"))==NULL)
{
printf("\n创建词法分析输出文件出错!!\n");
return(2);
}
ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='\n'||ch=='\t')ch=getc(fin);
if(isalpha(ch))
{
token[0]=ch;j=1;
ch=getc(fin);
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';
n=0;
while((n<keywordSum)&&strcmp(token,keyword[n]))n++;
if(n>=keywordSum)
fprintf(fout,"%s\t%s\n","ID",token);
else
fprintf(fout,"%s\t%s\n",token,token);
}else if(isdigit(ch))
{
token[0]=ch;j=1;
ch=getc(fin);
while(isdigit(ch))
{
token[j++]=ch;
ch=getc(fin);
}
token[j]='\0';
fprintf(fout,"%s\t%s\n","NUM",token);
}else if(strchr(singleword,ch)>0)
{
token[0]=ch;token[1]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
}else if(strchr(doubleword,ch)>0)
{
token[0]=ch;
ch=getc(fin);
if(ch=='=')
{
token[1]=ch;token[2]='\0';
ch=getc(fin);
}else
token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token);
}else if(ch=='/')
{
ch=getc(fin);
if(ch=='*')
{
char ch1;
ch1=getc(fin);
do
{
ch=ch1;ch1=getc(fin);
}
while((ch!='*'||ch!='/')&&ch1!=EOF);
ch=getc(fin);
}else
{
token[0]='/';token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token);
}
}else
{
token[0]=ch;token[1]='\0';
ch=getc(fin);
es=3;
fprintf(fout,"%s\t%s\n","ERROR",token);
}
}
fclose(fin);
fclose(fout);
return(es);
}
//
int TESTparse()
{
int es=0;
if((fp=fopen(Scanout,"r"))==NULL)
{
printf("\n打开%s错误!\n",Scanout);
es=10;
}
if(es==0)es=program();
printf("=====语法分析错误!=====\n");
switch(es)
{
case 0:printf("语法分析成功!\n");break;
case 10:printf("打开文件%s失败\n",Scanout);break;
case 1:printf("缺少{!\n");break;
case 2:printf("缺少}!\n");break;
case 3:printf("缺少标志符!\n");break;
case 4:printf("缺少分号!\n");break;
case 5:printf("缺少(!\n");break;
case 6:printf("缺少)!\n");break;
case 7:printf("缺少操作数!\n");break;
}
fclose(fp);
return(es);
}
//
int program()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"{"))
{
es=1;
return(es);
}
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=declaration_list();
if(es>0)return(es);
es=statement_list();
if(es>0)return(es);
if(strcmp(token,"}"))
{
es=2;
return(es);
}
return(es);
}
//
int declaration_list()
{
int es=0;
while(strcmp(token,"int")==0)
{
es=declaration_stat();
if(es>0)return(es);
}
return(es);
}
//
int declaration_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID"))return(es=3);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";"))return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
//
int statement_list()
{
int es=0;
while(strcmp(token,"}"))
{
es=statement();
if(es>0)return(es);
}
return(es);
}
//
int statement()
{
int es=0;
if(es==0&&strcmp(token,"if")==0)es=if_stat();
if(es==0&&strcmp(token,"while")==0)es=while_stat();
if(es==0&&strcmp(token,"for")==0)es=for_stat();
if(es==0&&strcmp(token,"read")==0)es=read_stat();
if(es==0&&strcmp(token,"write")==0)es=write_stat();
if(es==0&&strcmp(token,"{")==0)es=compound_stat();
if(es==0&&strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
es=expression_stat();
return(es);
}
//
int if_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"("))return(es=5);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,")"))return(es=6);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0)return(es);
if(strcmp(token,"else")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0)return(es);
}
return(es);
}
//
int while_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"("))return(es=5);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,")"))return(es=6);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
return(es);
}
//
int for_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"("))return(es=5);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,";"))return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,";"))return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,")"))return(es=6);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
return(es);
}
//
int write_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,";"))return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
//
int read_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID"))return(es=3);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";"))return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
//
int compound_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement_list();
return(es);
}
//
int expression_stat()
{
int es=0;
if(strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
es=expression();
if(es>0)return(es);
if(es==0&&strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}else
{
es=4;
return(es);
}
}
//
int expression()
{
int es=0,fileadd;
char token2[20],token3[40];
if(strcmp(token,"ID")==0)
{
fileadd=ftell(fp);
fscanf(fp,"%s%s\n",&token2,&token3);
printf("%s%s\n",token2,token3);
es=bool_expr();
if(es>0)return(es);
if(strcmp(token2,"=")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}else
{
fseek(fp,fileadd,0);
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0)return(es);
}
}
return(es);
}
//
int bool_expr()
{
int es=0;
es=additive_expr();
if(es>0)return(es);
if(strcmp(token,">")==0||strcmp(token,">=")==0
||strcmp(token,"<")==0||strcmp(token,"<=")==0
||strcmp(token,"==")==0||strcmp(token,"!=")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=additive_expr();
if(es>0)return(es);
}
return(es);
}
//
int additive_expr()
{
int es=0;
es=term();
if(es>0)return(es);
while(strcmp(token,"+")==0||strcmp(token,"-")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=term();
if(es>0)return(es);
}
return(es);
}
//
int term()
{
int es=0;
es=factor();
if(es>0)return(es);
while(strcmp(token,"*")==0||strcmp(token,"/")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=factor();
if(es>0)return(es);
}
return(es);
}
//
int factor()
{
int es=0;
if(strcmp(token,"(")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)return(es);
if(strcmp(token,")")==0)return(es=6);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}else
{
if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}else
{
es=7;
return(es);
}
}
return(es);
}
//
void main()
{
int es=0;
es=TESTscan();
if(es>0){ printf("词法分析错误,编译停止!");}
else {printf("词法分析成功!\n");}
if(es==0)
{
es=TESTparse();
if(es=0)printf("语法分析成功!\n");
else printf("语法分析错误!\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -