//@IN:输出IN
//@STI↓d:输出指令代码STI d int read_stat()
{ int es=0,address;
fscanf(fp,\ printf(\
if (strcmp(token,\少标识符 es=lookup(token1,&address); if (es>0) return(es);
fprintf(fout,\输入指令
fprintf(fout,\指令 fscanf(fp,\ printf(\
if (strcmp(token,\少分号 fscanf(fp,\ printf(\ return(es); }
//
fscanf(fp,\ printf(\ es=statement_list(); return(es); }
//
if (strcmp(token,\
{ fscanf(fp,\ printf(\ return(es); }
es=expression();
if (es>0) return(es);
if (strcmp(token,\
{ fscanf(fp,\ printf(\ return(es); } else
{ es=4;
return(es);//少分号 }
16
}
//
{ int es=0,fileadd;
char token2[20],token3[40]; if (strcmp(token,\
{ fileadd=ftell(fp); //@ASSIGN记住当前文件位置 fscanf(fp,\ printf(\ if (strcmp(token2,\ { int address;
es=lookup(token1,&address); if (es>0) return(es);
fscanf(fp,\ printf(\ es=bool_expr();
if (es>0) return(es);
fprintf(fout,\ } else
{ fseek(fp,fileadd,0); //若非'='则文件指针回到'='前的标识符 printf(\ es=bool_expr();
if (es>0) return(es); } }
return(es); }
//
// |< additive_expr >(>|<|>=|<=|==|!=)< additive_expr >
|< additive_expr >>@GT |< additive_expr ><@LES |< additive_expr >>=@GE |< additive_expr ><=< additive_expr >@LE |< additive_expr >==< additive_expr >@EQ |< additive_expr >!=< additive_expr >@NOTEQ int bool_expr() { int es=0;
es=additive_expr(); if(es>0) return(es);
if ( strcmp(token,\ ||strcmp(token,\ ||strcmp(token,\
17
{
char token2[20];
strcpy(token2,token);//保存运算符 fscanf(fp,\ printf(\ es=additive_expr(); if(es>0) return(es);
if ( strcmp(token2,\ if ( strcmp(token2,\ if ( strcmp(token2,\ if ( strcmp(token2,\ if ( strcmp(token2,\ if ( strcmp(token2,\ }
return(es); }
//::=
//< additive_expr>::=
int additive_expr() { int es=0; es=term();
if(es>0) return(es);
while (strcmp(token,\ { char token2[20]; strcpy(token2,token);
fscanf(fp,\ printf(\ es=term();
if(es>0) return(es);
if ( strcmp(token2,\ if ( strcmp(token2,\ }
return(es); }
//< term >::=
//< term >::=
{ int es=0; es=factor();
if(es>0) return(es);
while (strcmp(token,\ { char token2[20]; strcpy(token2,token);
18
fscanf(fp,\ printf(\ es=factor();
if(es>0) return(es);
if ( strcmp(token2,\ if ( strcmp(token2,\ }
return(es); } //< factor >::=()| ID|NUM//< factor >::=(< expression >)| ID↑n@LOOK↓n↑d@LOAD↓d |NUM↑i@LOADI↓i int factor() { int es=0;
if (strcmp(token,\
{ fscanf(fp,\ printf(\ es=expression();
if (es>0) return(es);
if (strcmp(token,\少右括号 fscanf(fp,\ printf(\ } else
{ if (strcmp(token,\ { int address;
es=lookup(token1,&address);//查符号表,获取变量地址 if (es>0) return(es);//变量没声明
fprintf(fout,\ fscanf(fp,\ printf(\ return(es);
} if (strcmp(token,\
{ fprintf(fout,\ fscanf(fp,\ printf(\ return(es); }else
{ es=7;//缺少操作数 return(es);
} } return(es);} (3)运行结果分析: 输入:{int a; int sum;
for(a=0;a<=10;a=a+1) sum=sum+a;}
19
输出:词法与语法分析结果:
四 、课程设计小结
通过对编译器的设计实现,一方面再次熟悉了c语言的编程方法及思想,另一方面加深了而对所学编译知识的掌握和理解,也深刻的理解了编译器的思想和实现方法;从词法分析到语法分析,再到语义分析,整个独立而又紧密联系的环节,紧紧相扣,整体的实现理解的更加透彻。
五、参考资料
《程序设计语言编译原理》,陈火旺编著,国防工业出版社 《编译原理》,吕映芝、张素琴、蒋维杜编著,清华大学出版社 《编译原理》,Alfred V.Aho等,李建中译,机械工业出版社
20
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库简单编译器的设计与实现1(4)在线全文阅读。
相关推荐: