if(n>=keywordSum)
fprintf(fout,"%s\t%s\n","ID",token);
else
fprintf(fout,"%s\t%s\n",token,token);
}elseif(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);
}elseif(strchr(singleword,ch)>0)
{
token[0]=ch;token[1]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
}elseif(strchr(doubleword,ch)>0)
{
token[0]=ch;
ch=getc(fin);
if(token[0]=='!
')
{if(ch=='=')
{
token[1]=ch;token[2]='\0';
ch=getc(fin);
fprintf(fout,"%s\t%s\n",token,token);
}
else
{
token[1]='\0';
es=1;
fprintf(fout,"%s\t%s\n","ERROR",token);
}
}
else{
if(ch=='=')
{
token[1]=ch;token[2]='\0';
ch=getc(fin);
}else
token[1]='\0';
fprintf(fout,"%s\t%s\n",token,token);
}
}elseif(ch=='/')
{
ch=getc(fin);
if(ch=='*')
{
charch1;
ch1=getc(fin);
do
{
ch=ch1;ch1=getc(fin);
}while((ch!
='*'||ch1!
='/')&&ch1!
=EOF);
ch=getc(fin);
}elseif(ch=='/'){
do{
ch=getc(fin);
}while(ch!
='\n'&&ch!
=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);
}
3.语法分析:
#include
#include
#include
#include
intTESTparse();
intprogram();
intcompound_Stat();
intstatement();
//intexpression_Stat();
intexpression_stat();
intexpression();
intbool_expr();
intadditive_expr();
intterm();
intfactor();
intif_stat();
intwhile_stat();
intfor_stat();
intwrite_stat();
intread_stat();
intdeclaration_stat();
intdeclaration_list();
intstatement_list();
intcompound_stat();
chartoken[20],token1[40];///token保存单词符号,token1保存单词值
externcharScanout[300];///保存词法分析输出文件名
FILE*fp;///用于指向输入文件的指针
#definekeywordSum8
char*keyword[keywordSum]={"if","else","for","while","do","int","read","write"};
charsingleword[50]="+-*(){};,:
";
chardoubleword[10]="><=!
";
externcharScanin[300],Scanout[300];
externFILE*fin,*fout;
///语法分析程序
intTESTparse()
{
intes=0;
if((fp=fopen(Scanout,"r"))==NULL)
{
printf("\n打开%s错误!
\n",Scanout);
es=0;
}
if(es==0)es=program();
printf("=====语法分析结果!
======\n");
switch(es)
{
case0:
printf("语法分析成功!
\n");break;
case10:
printf("打开文件%s失败!
\n");break;
case1:
printf("缺少{!
\n");break;
case2:
printf("缺少}!
\n");break;
case3:
printf("缺少标识符!
\n");break;
case4:
printf("少分号!
\n");break;
case5:
printf("缺少(!
\n");break;
case6:
printf("缺少)!
\n");break;
case7:
printf("缺少操作数!
\n");break;
}
fclose(fp);
return(es);
}
///<程序>:
:
={<声明序列><语句序列>}
intprogram()
{
intes=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(strcmp(token,"}"))///判断是否为'}'
{
es=2;
return(es);
}
return(es);
}
///<声明序列>:
:
=<声明序列><声明语句>|空
intdeclaration_list()
{
intes=0;
while(strcmp(token,"int")==0)
{
es=declaration_stat();
if(es>0)return(es);
}
return(es);
}
///<声明语句>:
:
=int<变量>;
intdeclaration_stat()
{
intes=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);
}
///<语句序列>:
:
=<语句序列><语句>|空
intstatement_list()
{
intes=0;
while(strcmp(token,"}"))
{
es=statement();
if(es>0)return(es);
}
return(es);
}
///<语句>:
:
=||||
///|<复合语句>|<表达式语句>
intstatement()
{
intes=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();///
///可在此处添加do语句调用
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);
}
///:
:
=if(<表达式>)<语句>|[else<语句>]
intif_stat()
{
intes=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=statement();
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);
}
///:
:
=while(<表达式>)<语句>
intwhile_stat()
{
intes=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);
}
///:
:
=for(<表达式>;<表达式>;<表达式>)<语句>
intfor_stat()
{
intes=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=expression();
return(es);
}
///:
:
=write<表达式>;
intwrite_stat()
{
intes=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);
}
///:
:
=read<变量>;
intread_stat()
{
intes=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);
}
///<复合语句>:
:
={<语句序列>}
intcompound_stat()///复合语句函数
{
intes=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement_list();
return(es);
}
///<表达式语句>:
:
=<表达式>;|;
intexpression_stat()
{
intes=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);///少分号
}
}
///<表达式>:
:
=<标识符>=<布尔表达式>|<布尔表达式>
intexpression()
{
intes=0,fileadd;
chartoken2[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);
}
}elsees=bool_expr();
return(es);
}
///<布尔表达式>:
:
=<算数表达式>|<算术表达式>(>|<|>=|<=|==|!
=)
///<算术表达式>
intbool_expr()
{
intes=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);
}
///<算术表达式>:
:
=<项>{(+|-)<项>}
intadditive_expr()
{
intes=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);
}
///<项>:
:
=<因子>{(*|/)<因子>}
intterm()
{
intes=0