编译原理实验报告.docx

上传人:b****5 文档编号:8583683 上传时间:2023-01-31 格式:DOCX 页数:20 大小:17.81KB
下载 相关 举报
编译原理实验报告.docx_第1页
第1页 / 共20页
编译原理实验报告.docx_第2页
第2页 / 共20页
编译原理实验报告.docx_第3页
第3页 / 共20页
编译原理实验报告.docx_第4页
第4页 / 共20页
编译原理实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

编译原理实验报告.docx

《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

编译原理实验报告.docx

编译原理实验报告

程序清单

1.分工:

2.词法分析:

#include

#include

#include

#definekeywordSum8

char*keyword[keywordSum]={"if","else","for","while","do","int","read","write"};

charsingleword[50]="+-*(){};,:

";

chardoubleword[10]="><=!

";

externcharScanin[300],Scanout[300];

externFILE*fin,*fout;

intTESTscan()

{charch,token[40];

intes=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

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 工学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1