1、编译原理实验报告程序清单1. 分工:2. 词法分析:#include#include#include#define keywordSum 8char *keywordkeywordSum=if,else,for,while,do,int,read,write;char singleword50=+ - * ( ) ; , :;char doubleword10=!;extern char Scanin300,Scanout300;extern FILE *fin,*fout;int TESTscan() char ch,token40; int es=0,j,n; printf(请输入源程序文
2、件名(包括路径):); 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) token0=ch;
3、j=1; ch=getc(fin); while(isalnum(ch) tokenj+=ch; ch=getc(fin); tokenj=0; n=0; while (n=keywordSum) fprintf(fout,%st%sn,ID,token); else fprintf(fout,%st%sn,token,token); else if (isdigit(ch) token0=ch;j=1; ch=getc(fin); while(isdigit(ch) tokenj+=ch; ch=getc(fin); tokenj=0; fprintf(fout,%st%sn,NUM,tok
4、en); else if(strchr(singleword,ch)0) token0=ch;token1=0; ch=getc(fin); fprintf(fout,%st%sn,token,token); else if (strchr(doubleword,ch)0) token0=ch; ch=getc(fin); if(token0=!) if (ch = =) token1=ch; token2=0; ch = getc(fin); fprintf(fout,%st%sn,token,token); else token1=0; es=1; fprintf(fout,%st%sn,
5、ERROR,token); else if (ch = =) token1=ch; token2=0; ch = getc(fin); else token1=0; fprintf(fout,%st%sn,token,token); else if (ch=/) ch = getc(fin); if(ch =*) char ch1; ch1=getc(fin); do ch=ch1; ch1=getc(fin); while(ch!=* | ch1!=/) & ch1!=EOF); ch = getc(fin); else if(ch=/) do ch=getc(fin); while(ch!
6、=n & ch!=EOF); ch=getc(fin); else token0=/; token1=0; fprintf(fout,%st%sn,token,token); else token0=ch; token1=0; ch=getc(fin); es = 3; fprintf(fout,%st%sn,ERROR,token); fclose(fin); fclose(fout); return (es);3. 语法分析:#include#include#include#includeint TESTparse();int program();int compound_Stat();i
7、nt statement();/int expression_Stat();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
8、();char token20, token140; /token保存单词符号,token1保存单词值extern char Scanout300; /保存词法分析输出文件名FILE * fp; /用于指向输入文件的指针#define keywordSum 8char *keywordkeywordSum=if,else,for,while,do,int,read,write;char singleword50=+ - * ( ) ; , :;char doubleword10=!;extern char Scanin300,Scanout300;extern FILE *fin,*fout;
9、/语法分析程序int TESTparse() int es = 0; if (fp=fopen(Scanout,r)=NULL) printf(n打开%s错误!n,Scanout); es = 0; if (es=0) es=program(); printf(=语法分析结果!=n); switch(es) case 0: printf(语法分析成功!n); break; case 10: printf(打开文件%s失败!n); break; case 1: printf(缺少!n); break; case 2: printf(缺少!n); break; case 3: printf(缺少标
10、识符!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%sn,token,token1); printf(%s%sn,token,token1); if(strcmp(token,) /判断是否为 es = 1; return (es); fscanf
11、(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es = declaration_list(); if(es0) return (es); es = statement_list(); if(strcmp(token, ) /判断是否为 es = 2; return (es); return(es);/:=|空int declaration_list() int es=0; while(strcmp(token,int)=0) es=declaration_stat(); if(es0) return (es); return (e
12、s);/:=int ;int declaration_stat() int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,ID) return (es=3); /不是标识符 fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,;) return (es=4); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1
13、); return (es);/:=|空int statement_list() int es=0; while(strcmp(token,) es=statement(); if(es0) 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(); /
14、/可在此处添加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()|elseint if_stat() int es=0; fscan
15、f(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,() return (es=5); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=statement(); if(es0) return(es); if(strcmp(token,) return(es=6); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=statement(); if(e
16、s0) return(es); if(strcmp(token,else)=0) fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=statement(); if(es0) return(es); return(es);/:=while()int while_stat() int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,() return (es=5); fscanf(fp,%s%sn,&to
17、ken,&token1); printf(%s%sn,token,token1); es=expression(); if(es0) return(es); if(strcmp(token,) return(es=6); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es = statement(); return(es);/:=for(;)int for_stat() int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(s
18、trcmp(token,() return (es=5); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=expression(); if(es0) return(es); if(strcmp(token,;) return (es=4); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=expression(); if(es0) return(es); if(strcmp(token,;) return (es=4); fscanf
19、(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=expression(); if(es0) return(es); if(strcmp(token,) return (es=6); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=expression(); return (es);/:=write;int write_stat() int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,tok
20、en,token1); es=expression(); if(es0) return(es); if(strcmp(token,;) return (es=4); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); return(es);/:=read;int read_stat() int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,ID) return (es=3); fscanf(fp,%s%sn
21、,&token,&token1); printf(%s%sn,token,token1); if(strcmp(token,;) return (es=4); fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); return(es);/:=int compound_stat() /复合语句函数 int es=0; fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=statement_list(); return (es);/:=;|;int exp
22、ression_stat() int es=0; if(strcmp(token,;)=0) fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); return (es); es=expression(); if(es0) return(es); if(es=0 & strcmp(token,;)=0) fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); return (es); else es=4; return (es); /少分号 /:=|int ex
23、pression() int es=0, fileadd; char token220, token340; if(strcmp(token,ID)=0) fileadd=ftell(fp); /记住问件当前位置 fscanf(fp,%s%sn,&token2,&token3); printf(%s%sn,token2,token3); es=bool_expr(); if(es0) return(es); if(strcmp(token2,=)=0) /= fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); else fs
24、eek(fp,fileadd,0); /若非=则文件指针回到=前边的标识符 printf(%s%sn,token,token1); es=bool_expr(); if(es0) return(es); else es=bool_expr(); return (es);/:=|(|=|=|=|!=) /int bool_expr() int es=0; es=additive_expr(); if(es0) return(es); if(strcmp(token,)=0 | strcmp(token,=)=0 | strcmp(token,)=0 | strcmp(token,0) return(es); return (es);/:=(+|-)int additive_expr() int es=0; es=term(); if(es0) return(es); while(strcmp(token,+)=0 | strcmp(token,-)=0) fscanf(fp,%s%sn,&token,&token1); printf(%s%sn,token,token1); es=term(); if(es0) return(es); return (es);/:=(*|/)int term() int es=0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1