c语言语法分析.docx
- 文档编号:10639897
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:21
- 大小:18.28KB
c语言语法分析.docx
《c语言语法分析.docx》由会员分享,可在线阅读,更多相关《c语言语法分析.docx(21页珍藏版)》请在冰豆网上搜索。
c语言语法分析
/*主程序*/
#include
#include
externintTESTscan();
externintTESTparse();
charScanin[300],Scanout[300];/*用于接收输入输出文件名*/
FILE*fin,*fout;/*用于指向输入输出文件的指针*/
voidmain(){
intes=0;
es=TESTscan();/*调词法分析*/
if(es>0)printf("词法分析有错,编译停止!
");
elseprintf("词法分析成功!
\n");
if(es==0)
{
es=TESTparse();/*调语法分析*/
if(es==0)printf("语法分析成功!
\n");
elseprintf("语法分析错误!
\n");
}
}
#include
#include
//下面定义保留,为简化程序,使用字符指针数组保存所有保留字。
//如果想增加保留字,可继续添加,并修改保留字数目
#definekeywordSum8
char*keyword[keywordSum]={"if","else","for","while","do","int","read","write"};
//下面定义纯单分界符,如需要可添加
charsingleword[50]="+-*(){};,:
";
//下面定义双分界符的首字符
chardoubleword[10]="><=!
";
externcharScanin[300],Scanout[300];//用于接收输入输出文件名,在TEST_main.c中定义
externFILE*fin,*fout;//用于指向输入输出文件的指针,在TEST_main.c中定义
intTESTscan()//词法分析函数
{
charch,token[40];//ch为每次读入的字符,token用于保存识别出的单词
intes=0,j,n;//es错误代码,0表示没有错误。
j,n为临时变量,控制组合单词时的下标等
printf("请输入源程序文件名(包括路径):
");
scanf("%s",Scanin);
printf("请输入词法分析输出文件名(包括路径):
");
scanf("%s",Scanout);
if((fin=fopen(Scanin,"r"))==NULL)//判断输入文件名是否正确
{
printf("\n打开词法分析输入文件出错!
\n");
return
(1);//输入文件出错返回错误代码1
}
if((fout=fopen(Scanout,"w"))==NULL)//判断输出文件名是否正确
{
printf("\n创建词法分析输出文件出错!
\n");
return
(2);//输出文件出错返回错误代码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;//组合的标识符保存在token中
ch=getc(fin);//读下一个字符
}
token[j]='\0';//标识符组合结束
//查保留字
n=0;
while((n 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;//组合整数保存在token中 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(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);//读下一个符号以便识别下一个单词 }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);//返回主程序 } #include #include #include intTESTparse(); intprogram(); intcompound_Stat(); intstatement(); 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;/*用于指向输入输出文件的指针*/ /*语法分析程序*/ intTESTparse() { intes=0; if((fp=fopen(Scanout,"r"))==NULL) { printf("\n打开%s错误! \n",Scanout); es=10; } if(es==0)es=program(); printf("=====语法分析结果! ======\n"); switch(es) { case0: printf("语法分析成功! \n");break; case10: printf("打开文件%s失败! \n",Scanout);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); } /*<程序>: : ={<声明序列><语句序列>} //program: : ={ 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(es>0)return(es); 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<变量>; // : =intID;*/ 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||strcmp(token,"(")==0))es=expression_stat();/*<表达式语句>*/ return(es); } /* : =if(<表达式>)<语句>[else<语句>] // : =if( intif_stat(){ intes=0;/*if*/ 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)/*else部分处理*/ { fscanf(fp,"%s%s\n",&token,&token1); printf("%s%s\n",token,token1); es=statement(); if(es>0)return(es); } return(es); } /* : =while(<表达式>)<语句> // : =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(<表达式>;<表达式>;<表达式>)<语句> // : =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=statement(); return(es); } /* : =write<表达式>; // : =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<变量>; // : =readID;*/ 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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 语法分析
![提示](https://static.bdocx.com/images/bang_tan.gif)