编译原理实验报告文档格式.docx
- 文档编号:21719896
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:17.81KB
编译原理实验报告文档格式.docx
《编译原理实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
printf("
请输入源程序文件名(包括路径):
);
scanf("
%s"
Scanin);
请输入词法分析输出文件名(包括路径):
Scanout);
if((fin=fopen(Scanin,"
r"
))==NULL)
{printf("
\n打开词法分析输入文件出错!
\n"
return
(1);
}
if((fout=fopen(Scanout,"
w"
\n创建词法分析输出文件出错!
return
(2);
}
ch=getc(fin);
while(ch!
=EOF)
{while(ch=='
'
||ch=='
\n'
\t'
)ch=getc(fin);
if(isalpha(ch))
{token[0]=ch;
j=1;
while(isalnum(ch))
{token[j++]=ch;
token[j]='
\0'
n=0;
while((n<
keywordSum)&
&
strcmp(token,keyword[n]))n++;
if(n>
=keywordSum)
fprintf(fout,"
%s\t%s\n"
ID"
token);
else
token,token);
}elseif(isdigit(ch))
{
token[0]=ch;
while(isdigit(ch))
{token[j++]=ch;
NUM"
}elseif(strchr(singleword,ch)>
0)
token[1]='
}elseif(strchr(doubleword,ch)>
if(token[0]=='
!
'
)
{if(ch=='
='
token[1]=ch;
token[2]='
ch=getc(fin);
token[1]='
es=1;
ERROR"
else{
if(ch=='
}else
}elseif(ch=='
/'
if(ch=='
*'
charch1;
ch1=getc(fin);
do
ch=ch1;
}while((ch!
||ch1!
)&
ch1!
=EOF);
}elseif(ch=='
){
do{
ch=getc(fin);
}while(ch!
&
ch!
ch=getc(fin);
}else
token[0]='
es=3;
fclose(fin);
fclose(fout);
return(es);
3.语法分析:
conio.h>
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;
///用于指向输入文件的指针
///语法分析程序
intTESTparse()
{
intes=0;
if((fp=fopen(Scanout,"
\n打开%s错误!
es=0;
if(es==0)es=program();
=====语法分析结果!
======\n"
switch(es)
case0:
语法分析成功!
break;
case10:
打开文件%s失败!
case1:
缺少{!
case2:
缺少}!
case3:
缺少标识符!
case4:
少分号!
case5:
缺少(!
case6:
缺少)!
case7:
缺少操作数!
fclose(fp);
return(es);
///<
程序>
:
={<
声明序列>
语句序列>
intprogram()
fscanf(fp,"
%s%s\n"
token,token1);
if(strcmp(token,"
{"
))///判断是否为'
{'
es=1;
fscanf(fp,"
&
token,&
token1);
es=declaration_list();
if(es>
0)return(es);
es=statement_list();
if(strcmp(token,"
}"
}'
es=2;
=<
声明语句>
|空
intdeclaration_list()
intes=0;
while(strcmp(token,"
)==0)
es=declaration_stat();
=int<
变量>
;
intdeclaration_stat()
))return(es=3);
///不是标识符
))return(es=4);
语句>
intstatement_list()
))
es=statement();
if语句>
|<
while语句>
for语句>
read语句>
///<
write语句>
复合语句>
表达式语句>
intstatement()
if(es==0&
strcmp(token,"
)==0)es=if_stat();
///<
)==0)es=while_stat();
///<
)==0)es=for_stat();
///可在此处添加do语句调用
)==0)es=read_stat();
)==0)es=write_stat();
)==0)es=compound_stat();
)==0||strcmp(token,"
)==0)
es=expression_stat();
///表达式语句>
=if(<
表达式>
)<
|[else<
]
intif_stat()
("
))return(es=5);
0)return(es);
)"
))return(es=6);
)==0)
=while(<
intwhile_stat()
es=expression();
))return(es==6);
es=statement();
=for(<
intfor_stat()
))return(es=6);
write_语句>
=write<
intwrite_stat()
raed_语句>
=read<
intread_stat()
intcompound_stat()///复合语句函数
es=statement_list();
|;
intexpression_stat()
es=4;
///少分号
标识符>
布尔表达式>
intexpression()
intes=0,fileadd;
chartoken2[20],token3[40];
fileadd=ftell(fp);
///记住问件当前位置
token2,&
token3);
token2,token3);
es=bool_expr();
if(strcmp(token2,"
="
)==0)///'
fseek(fp,fileadd,0);
///若非‘=’则文件指针回到'
前边的标识符
}elsees=bool_expr();
算数表达式>
算术表达式>
(>
|>
=|<
=|==|!
=)
///<
intbool_expr()
es=additive_expr();
)==0
||strcmp(token,"
=="
项>
{(+|-)<
intadditive_expr()
es=term();
+"
-"
因子>
{(*|/)<
intterm()
intes=0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告