编译原理及实现附录C语法分析程序代码包含词法分析代码.docx
- 文档编号:11957789
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:22
- 大小:18.62KB
编译原理及实现附录C语法分析程序代码包含词法分析代码.docx
《编译原理及实现附录C语法分析程序代码包含词法分析代码.docx》由会员分享,可在线阅读,更多相关《编译原理及实现附录C语法分析程序代码包含词法分析代码.docx(22页珍藏版)》请在冰豆网上搜索。
编译原理及实现附录C语法分析程序代码包含词法分析代码
TESTparse.cpp
#include
#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();
//token保存单词符号,token1保存单词值
chartoken[20],token1[40];
//保存词法分析输出文件名
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);
}
//<声明序列>:
:
=<声明序列><声明语句>1<声明语句>//
:
=
//
:
*{
intdeclaration_list()
{
intes=0;
while(strcmp(token,"int")==0)
{
es=declaration_stat();
if(es>0)return(es);
}
return(es);
}
//<声明语句>:
:
=ID<变量>;
//
:
=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);
}
//<语句序列>:
:
=<语句序列><语句>|e
//
:
=
:
8={
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();//
if(es==0&&strcmp(token,"resd")==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(<表达式>)<语句>4136<语句>]
//
:
=if{
intif_stat()
{
intes=0;//if
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"("))if(es>0)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,";"))if(es>0)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,")"))if(es>0)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,"("))if(es>0)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,")"))if(es>0)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,"("))if(es>0)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,")"))if(es>0)return(es=6);//少右括号
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s.%s\n",token,token1);
es=statement();
return(es);
if(strcmp(token,";"))if(es>0)return(es=4);//少分号
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0)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,";"))if(es>0)return(es=4);//少分号
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
//
^找日化变量>;
//
:
=resdID;
intread_stat()
{
intes=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID"))if(es>0)return(es=3);//例示识符
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";"))if(es>0)return(es=4);//少分号
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
//<复合语句>:
:
-(<语句序列>}
//
:
={
i>;-,:
;-^-1
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);//少分号
}
}
//<表达式>:
:
"<标识符>=<布尔表达式>|<布尔表达式>
//
:
=ID==
intexpression()
{
intes=0,filesdd;
chartoken2[20],token3[40];
if(strcmp(token,"ID")==0)
{
filesdd=ftell(fp);//记住当前文件位置
fscanf(fp,"%s%sVi",&token2,&token3);
printf("%s%s\n",token2,token3);
if(strcmp(token2,"=")==0)//'='
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0)return(es);
}
else
{
fseek(fp,filesdd,0);//若非^=’,则文件指针回到'==前的标识符
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0)return(es);
}
}
elsees=bool_expr();
return(es);
}
//<布尔表达式>:
—〈算术表达式>|<算术表达式>(>丨<彳>=丨<=|==f:
!
=)
//<算术表达式>^-m.c'.j
//
:
=
//|
*)
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);
}
//<项>:
:
48<因子>|(*|/)<因子>)>
//
:
*
intterm()
{
intes=0;
es=factor();
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=factor();
if(es>0)return(es);
}
return(es);
}
//<因子>:
:
(<表达式>>丨<标识符>|<无符号整数>
//
:
=(
intfactor()
{
intes=0;
if(strcmp(token,"(")==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=6);//少右括号
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}
else
{
if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
{
fscanf(fp,"%s%s\n",&token,&token1)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实现 附录 语法分析 程序代码 包含 词法 分析 代码